Conversation
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 19, 2026 01:54 — with
GitHub Actions
Inactive
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This was referenced Aug 19, 2026
wlmyng
force-pushed
the
wlmyng/resolved-range-symbolic-resume
branch
from
August 19, 2026 05:19
5bc1b3a to
33f153a
Compare
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 19, 2026 05:19 — with
GitHub Actions
Inactive
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 19, 2026 05:19 — with
GitHub Actions
Inactive
wlmyng
force-pushed
the
wlmyng/resolved-range-symbolic-resume
branch
from
August 19, 2026 05:26
33f153a to
a04966e
Compare
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 19, 2026 05:26 — with
GitHub Actions
Inactive
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 19, 2026 05:26 — with
GitHub Actions
Inactive
wlmyng
force-pushed
the
wlmyng/resolved-range-symbolic-resume
branch
from
August 19, 2026 05:38
a04966e to
b009164
Compare
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 19, 2026 05:38 — with
GitHub Actions
Inactive
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 19, 2026 05:38 — with
GitHub Actions
Inactive
wlmyng
force-pushed
the
wlmyng/resolved-range-symbolic-resume
branch
from
August 19, 2026 05:46
b009164 to
5f0d585
Compare
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 19, 2026 05:46 — with
GitHub Actions
Inactive
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 19, 2026 05:46 — with
GitHub Actions
Inactive
wlmyng
force-pushed
the
wlmyng/resolved-range-symbolic-resume
branch
from
August 19, 2026 06:24
5f0d585 to
f5288c4
Compare
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 19, 2026 06:24 — with
GitHub Actions
Inactive
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 19, 2026 06:24 — with
GitHub Actions
Inactive
wlmyng
marked this pull request as ready for review
August 19, 2026 06:53
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 19, 2026 06:53 — with
GitHub Actions
Inactive
wlmyng
requested review from
a team,
amnn,
evan-wall-mysten,
nickvikeras and
tpham-mysten
August 19, 2026 06:53
Contributor
|
looks good to me. Thanks again for cleaning this up. Once you have handled the empty-range discrepancy we discussed over slack lmk and I'll take one last look. |
wlmyng
force-pushed
the
wlmyng/resolved-range-symbolic-resume
branch
from
August 20, 2026 23:01
f5288c4 to
6f4b4c8
Compare
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 20, 2026 23:01 — with
GitHub Actions
Inactive
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 20, 2026 23:01 — with
GitHub Actions
Inactive
Nothing constructs an Excluded lo in the dense lane yet — resume_lo canonicalizes Item cursors to their inclusive successor — but the symbolic-resume flip will. Pin the store-edge collapse first: an Excluded lo resumes at its successor and saturates at u64::MAX, where the range empties exactly (MAX is the unoccupiable exclusive sentinel).
…filtered scalar path (after = item n, before = item n + 1) serves nothing; pin that the frame is a CursorBound from the ascending stop side (the before cursor), an expectation the symbolic-resume flip must preserve.
An after-Item cursor admits Excluded(raw) in every lane; the dense lane's successor arithmetic lives only at the store edge (to_range), where u64::MAX saturates into an empty fetch. Checkpoints and transactions work like events. The fetch range is unchanged for every cursor and window — Item@n and Boundary@n+1 admit identically — so no request serves different items. The terminal frames of three corner cases change: - ascending after at the window's last item: the record no longer empties at resolution, the zero-row drain ends at the window's own frame — CheckpointBound with the window-end cursor instead of a CursorBound echo of the request cursor; - descending after one position below the window start: rejected instead of admitted-at-the-tie, so it no longer repins the terminal; - descending crossed-adjacent cursors: the frame is the descending stop side's admission stamp (the after cursor's raw position) instead of the collapse path's before-position, honoring the after-Item consumption claim. Descending window-edge and ascending crossed frames are unchanged: their producers move from the resolution-time collapse to the admission-time stamp drained through a zero-row scan, pinned by tx_after_item_at_window_edge_descending_keeps_stamped_terminal and test_list_transactions_crossed_adjacent_terminal_is_stable. Beyond-window cursors still empty at resolution; the MAX tests pass unchanged.
Symbolic resume made both lane impls identical and kind-only; the single caller inlines the two-arm match. The cursor seam is one method: coordinate().
wlmyng
force-pushed
the
wlmyng/resolved-range-symbolic-resume
branch
from
August 20, 2026 23:44
6f4b4c8 to
bf4a993
Compare
wlmyng
temporarily deployed
to
sui-typescript-aws-kms-test-env
August 20, 2026 23:44 — with
GitHub Actions
Inactive
8 tasks
nickvikeras
added a commit
that referenced
this pull request
Sep 2, 2026
## Description Unify cursor resumption across scalar and intra-transaction lanes by making after-Item cursors uniformly symbolic (`Excluded(coordinate)`) and deferring successor arithmetic to store-edge projection (`ScanBounds<u64>::to_range`). Also ensures the projected range emptiness is passed to `ScanTerminal` in fullnode scalar paths so empty-interval terminal frames do not claim unverified checkpoint coverage. Supersedes #27755. ## Test plan Covered by unit tests in `sui-rpc-api` and `sui-kv-rpc`, plus simtests in `sui-e2e-tests` (`list_ledger_history`). ## Release notes - [ ] Protocol: - [ ] Nodes (Validators and Full nodes): - [x] gRPC: Terminal metadata on queries that end on an empty natural interval (such as passing an `after` cursor pointing to the last item of a bounded window) now emits `QueryEndReason::CheckpointBound` with `watermark.checkpoint = None` instead of `CursorBound`. No client migration required. - [ ] JSON-RPC: - [ ] GraphQL: - [ ] CLI: - [ ] Rust SDK: - [ ] Indexing Framework:
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
While applying an after cursor, the intra-tx path converts an after-Item cursor into
Excluded(coordinate), while the scalar u64 path eagerly computesIncluded(coordinate + 1). This PR makes both uniformly symbolic, and pushes the+1/u64::MAXhandling toScanBounds<u64>::to_range. This shrinks theScanCursortrait tocoordinate().In practice, the fetch interval is invariant:
to_rangeprojectsExcluded(n)andIncluded(n + 1)to the sameRange<u64>. However, the bounds are also read by two frame decisions, which now see the raw coordinate instead of the successor:ScanBounds::is_emptychecks whether a cursor emptied the window and thus should setCursorBound.Included(n + 1)vsExcluded(n + 1)reads as empty, butExcluded(n)vsExcluded(n + 1)does not, so exactly-adjacent bounds no longer setCursorBoundeagerly at resolution — the zero-row drain produces the frame instead. This is the current event/intra-tx behavior.lower_bound_gteused to seeIncluded(n + 1), which ties a window bound at the same coordinate and admits the cursor;Excluded(n)ranks below the tie, so a cursor coinciding with the window's own bound is now rejected outright.Wire-visible changes outlined below, over window
[10, 20):Beyond-window cursors still empty at resolution, and
u64::MAXhandling is unchanged(the saturation now lives in
to_range).Test plan
to_range_collapses_excluded_lo_at_successorraw_after_item_echo_resumes_like_successor_boundarytx_after_item_at_window_edge_defers_to_draintx_after_item_at_window_edge_descending_keeps_stamped_terminaltx_after_item_below_window_start_descending_is_nooptest_list_transactions_after_before_adjacent_empty_results(pre-flip preservation pin)test_list_transactions_after_last_item_ends_at_window_bound(cargo simtest -p sui-e2e-tests list_ledger_history)Release notes