Conversation
…bleOverride, one hasActiveOverride Zero-semantic-change step 1 of DESIGN-CONSOLIDATION move 3b (one implementation per rule). read()'s slow tail called the full committed-vs-staged arm inline; it is now readerSeesCommitted(el, c, owner, noCommitted), documented as the rule it enforces, for the store's backing selection and the verdict arms to adopt. hasActiveOverride existed twice (lanes.ts, store.ts) and the composite 'hasActiveOverride && !unflushedOverride' was restated at five sites (latestRead, computePendingState ×2, the store's reader selection, plus the store's own visibleOverride) — one visibleOverride in core now. Gate: signals suite green; visibility oracles and the 738-line posture matrix report are byte-identical to next. Co-authored-by: Claude via Cursor <noreply@cursor.com>
…le 1, one implementation) Step 2 of DESIGN-CONSOLIDATION move 3b. nodeValue — the store's untracked node-read selection — restated core read()'s committed-vs-staged arm by hand (inOwnerContext, a stale-of-foreign 'foreignHold' twin, the HELD-truth mask). It now calls readerSeesCommitted with core's context selection (readerContext: a root reads as its parent computed) behind the two store-only tunnels, latest() (#3075) and authoritativeServe (truth authors). Not zero-change — the twin was missing a precondition of the rule it copied: a stale reader (render effect) whose untracked read is of a store key held by a foreign action was served committed (correct, A15/A26) but never recorded for replay at the commit (heldFromStale's _gatedSubs contract, which the signal path performs), so the effect stayed on the pre-action value after the action settled. Pinned as S4 in posture-store-parity (signal vs store, both now [0, 0, 1]). The backing twin (no node: pendingBackingVisible / heldFromReader) has the same gap and no node to record the reader on — pinned it.fails as the step-3 item. The lane arm (laneReadsCommitted) now also applies to untracked store node reads as it does to tracked ones; no matrix cell or test distinguishes. Gate: suite green (+2 pins, 1 expected fail); visibility oracles and the 621-cell posture matrix byte-identical to next; minified store −5 B, full bundle brotli −44 B vs step 1. Co-authored-by: Claude via Cursor <noreply@cursor.com>
🦋 Changeset detectedLatest commit: cfd4dc0 The changes in this PR will be included in the next version bump. This PR includes changesets to release 11 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
This was referenced Sep 17, 2026
ryansolid
force-pushed
the
refactor/shared-read-predicates
branch
from
September 17, 2026 17:54
6c86076 to
449ef6e
Compare
Member
Author
|
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.
Stacked on #3515. Step 2 of DESIGN-CONSOLIDATION move 3b.
What moved
nodeValue— the store's untracked node-read selection — restated coreread()'s committed-vs-staged arm by hand (inOwnerContext, a stale-of-foreignforeignHoldtwin, the HELD-truth mask). It now callsreaderSeesCommitted(from #3515) with core's context selection (readerContext(): a root reads as its parent computed,contextpersists under untrack) behind the two store-only tunnels that stay in the store:latest()reaching this path for store keys (#3075) andauthoritativeServe()(truth authors: the projection derive's draft, write-override).Tracked store reads already went through
readNode→ coreread()→readerSeesCommitted, so after this every store node read — tracked or untracked — selects by one Rule 1 implementation.Not zero-change: the twin was missing a precondition
A stale reader (render effect) whose untracked read is of a store key held by a foreign action was served committed (correct, A15 / A26) but never recorded for replay at the commit (
heldFromStale's_gatedSubscontract, which the signal path performs). The effect stayed on the pre-action value permanently after the action settled. Signal twin:[0, 0, 1]; store onnext:[0, 0].Pinned as S4 in
posture-store-parity.test.ts(signal and store now both[0, 0, 1]; the store pin fails onnext).This is exactly the pattern the consolidation is for — one rule, N sites, one site missing a precondition — and it was invisible to the suite, the oracles and the 621-cell matrix (no reader kind there is "untracked inside a stale reader"). Found only by handing the store the shared predicate and asking what changed.
Remaining gaps, pinned / noted
pendingBackingVisible/heldFromReader— same committed value, but there's no node to record the reader on, so no replay. Pinnedit.failsbeside S4. Rule 1's backing-level form is the next item.laneReadsCommitted(Existing and newly revealed latest readers display different values #3460) now also applies to untracked store node reads as it did to tracked ones. No matrix cell or test distinguishes; the matrix'sforeignLane × untrackedstore cells are identical.Gate
nextnext(signals-only, so expected)origin/nextMade with Cursor