Skip to content

fix(signals): store backing paths record the stale reader's replay (Rule 1, backing-level form) - #3517

Closed
ryansolid wants to merge 1 commit into
refactor/store-node-rule1from
fix/store-backing-stale-replay
Closed

ryansolid wants to merge 1 commit into
refactor/store-node-rule1from
fix/store-backing-stale-replay

Conversation

@ryansolid

Copy link
Copy Markdown
Member

Stacked on #3516 (← #3515). Step 3 of DESIGN-CONSOLIDATION move 3b — closes the it.fails pin #3516 left.

The gap

The stale-of-foreign clause has two halves: serve committed, and record the reader for replay at the hold's commit (A15 / A26, _gatedSubs). Core heldFromStale does both. The store's backing-level twins did only the first:

A render effect whose untracked read hit either was served the committed value (correct) and then stayed on the pre-action value after the action settled. Signal: [0, 0, 1]. Store on next: [0, 0].

The fix

One exported helper, recordStaleReplay(txn, c) (the two lines lifted out of heldFromStale), called by heldFromStale and by the store's two backing sites through staleReplay (reader in context, not children-forbidden — the same gate core applies before it reaches heldFromStale). A latest()-pull PLAIN_HOLD is not a transaction and records nothing.

Pins

posture-store-parity S4 grows to the four store shapes — fold hold × adoption hold × with/without a node — beside the signal. All four fail on next; the step-2 it.fails flips to a pass.

Gate

check result
signals suite 2751 pass, no expected fails left
visibility oracles + 621-cell posture matrix byte-identical to next
fuzzer seed 3289 × 1000 994 / 0 / 6 — same as next
solid-js / web 623 pass / same 12 pre-existing server-diagnostics failures as origin/next
size +31 B minified core (the helper), +123 B minified store (the fix); three brotli caps ratcheted (+30 / +2 / +34 B) with notes

Where move 3b stands after this stack

Rule 1 (committed vs staged) now has one implementation for every node read, signal or store (readerSeesCommitted), and one replay registration for every stale-of-foreign serve, node or backing (recordStaleReplay). Still store-shaped and not yet folded: the backing-level selection itself (pendingBackingVisible's arms — draft, write-override, the projection authoritative-elect arm) and the two store tunnels (latest() for store keys, authoritativeServe). Those are the candidates for a serve(el, reader) in the design doc, and each will need the same "hand it the shared predicate and see what changes" treatment.

Made with Cursor

…ule 1, backing-level form)

Step 3 of DESIGN-CONSOLIDATION move 3b. The stale-of-foreign clause has two
halves — serve committed, and record the reader for replay at the hold's
commit (A15 / A26, _gatedSubs). Core heldFromStale does both; the store's
backing-level twins (heldFromReader for a key with no node, readSource's
adoption-hold view for a reconcile inside an action) did only the first. A
render effect whose untracked read hit either stayed on the pre-action value
after the action settled.

The registration is now one exported helper, recordStaleReplay(txn, c),
called by heldFromStale and by the store's two backing sites (staleReplay:
reader in context, not children-forbidden — the same gate core applies
before it reaches heldFromStale).

Pins: posture-store-parity S4 grows to the four store shapes (fold hold ×
adoption hold × with/without a node) beside the signal; all four fail on
next, the it.fails from step 2 flips to a pass.

Gate: suite green; oracles and the 621-cell posture matrix byte-identical
to next; +31 B minified core (the helper), +123 B minified store (the fix);
three brotli caps ratcheted with notes.

Co-authored-by: Claude via Cursor <noreply@cursor.com>
@changeset-bot

changeset-bot Bot commented Sep 17, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: a3d1828

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 11 packages
Name Type
@solidjs/signals Patch
test-integration Patch
@solidjs/web Patch
@solidjs/babel-plugin Patch
@solidjs/compiler Patch
@solidjs/diagnostics Patch
@solidjs/element Patch
@solidjs/h Patch
@solidjs/html Patch
solid-js Patch
@solidjs/universal Patch

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

@ryansolid

Copy link
Copy Markdown
Member Author

Superseded by #3523, which now targets next directly and carries this PR's commit (rebased) along with the rest of the stack. Closing so the move-3b work is one review rather than five.

Claude via Cursor

@ryansolid ryansolid closed this Sep 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant