test(signals): store oracle + four signal states; latest() seed leak and body-end visibility fixes - #3455
Merged
Conversation
…eak and body-end visibility Oracle grows from 90 to 207 cells. The harness (cell vocabulary, readers, hold management, runner) moves to tests/visibility-oracle.harness.ts, shared by the signal oracle (now 14 states: + body ended, un-superseded, held truth, loading window over a held input) and a new store oracle (8 states through plain stores, optimistic stores and projections). Two runtime fixes the new cells found: - latest(() => store.key) on an unresolved projection returned the SEED. read() routes a latest() read to the companion before its firewall logic, and the leaf's own _value is the seed; latestRead now judges "uninitialized" on the leaf's owner (the firewall) and throws like every other read (A25, A7). - The body-end supersession window (#3427) read differently from a landing supersession: a stale re-run showed the committed truth beside a display still showing the override, a fresh mainline memo published it, isPending read false while latest read the truth. One cause: an override written inside an action never passes the adoption loop that stamps _transition, and body-end stages nothing that would queue it, so the node carried no stamp. Ownership for an override node is _overrideOwner (#2912); supersededRead and the verdict resolve it now. Pinning that exposed a fourth: a latest() pull through supersededRead fell to enterStagedRead's initTransition path and captured the caller's block — verdict pulls are observations and never enter from mainline. Rulings recorded: A27 (verdict-quiet is a hydration invariant; the window's first real landing is initial-load class even over a held input), A18 body-end visibility, A29 verdict-pull note, A7 owner-judged. Also a type fix in born-held (bornHeld narrowed to never). Signals 2005 / solid 618 / web 783 green; brotli caps pass (core floor 8806 of 8850). Oracle: 207 cells, zero violations, 15 observed (12 on A28/#3337). Co-authored-by: Cursor <cursoragent@cursor.com>
ryansolid
force-pushed
the
test/oracle-stores
branch
from
September 15, 2026 09:19
ca29bb4 to
a6d4f9b
Compare
🦋 Changeset detectedLatest commit: e15b322 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 |
…visibility fixes (#3455) Measured at 11267 B against next's 11213 (+54): supersededRead's owner resolution and committed-truth entry, the verdict's body-end A18 (d) branch, and uninitializedSource's owner walk — all in the verdict/ optimistic modules this scenario retains. Core floor and +createStore stay in cap. Co-authored-by: Claude via Cursor <noreply@cursor.com> Co-authored-by: Cursor <cursoragent@cursor.com>
Coverage Report for CI Build 34955159006Coverage remained the same at 71.898%Details
Uncovered ChangesNo uncovered changes found. Coverage RegressionsNo coverage regressions found. Coverage Stats
💛 - Coveralls |
This was referenced Sep 15, 2026
Merged
Merged
Merged
ryansolid
added a commit
that referenced
this pull request
Sep 15, 2026
…ether tip it by 9 B Each PR fit alone; the union measures 15809 B on next a8a8949 against the 15800 cap. No source change. Co-authored-by: Claude via Cursor <noreply@cursor.com> Co-authored-by: Cursor <cursoragent@cursor.com>
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.
Follow-up to #3449 / #3451 (both merged). One commit, rebased onto
next.Oracle: 90 → 207 cells
The harness (cell vocabulary, nine readers, hold management, runner) moves to
tests/visibility-oracle.harness.ts, shared by:The store side tracked the signal side far more closely than expected (67/72 on the first run): A18 supersession — tracked pass derives from the landed truth, fresh reader born held, overlay stays displayed — works through store nodes exactly as through signals. #3434's store carve-out is about the body-end settle order, not landing supersession.
Runtime fixes
latest()leaked a projection's seed.latest(() => store.key)on an unresolvedcreateStore(fn, seed)returned the seed; untracked and tracked reads correctly threw (A25).read()routes alatest()read to the companion before its firewall/status logic, and the leaf's own_valueis the seed.latestReadnow judges "uninitialized" on the leaf's owner (the firewall). verdict.ts only.Body-end supersession read differently from landing supersession (3 oracle violations). After the action body ends and the override is superseded by the committed truth (#3427): a stale reader re-run by an unrelated write showed the truth while the display showed the override; a fresh mainline memo published the truth instead of being held;
isPendingread false whilelatestread the truth. One cause: the node had no_transitionstamp — an override written inside an action goes straight into the transaction's_optimisticNodeswithout the adoption loop that stamps, and body-end stages nothing that would queue it. #2912 already ruled that an override node's owner is_overrideOwner;supersededReadand the verdict now resolve it (resolveTransition). A superseded read enters as a staged read whether the truth is staged or committed.A
latest()call captured the caller's block. Found while pinning the above: thelatest()shadow's pull reads throughsupersededRead→enterStagedRead; verdict pulls are excluded from born-held and so fell to theinitTransitionpath — from an event handler, outside any flush. Verdict pulls are observations and now never enter from mainline.tests/body-end-supersession-visibility.test.tsreads the verdicts before the display checks on purpose.Rulings recorded (2026-09-15)
_overrideOwner.Verification
@solidjs/signals178 files / 2014 ·solid-js618 ·@solidjs/web783 — green (oneattribution-holdstiming flake on one run; clean on two reruns and in isolation)observed(12 pre-flush cells parked on A28/fix(signals): writes become visible at flush — latest() reads the flushed staged world (A28) #3337; un-superseded/held-truth fresh-reader cells; held-truthisPending)Co-authored-by: Cursor cursoragent@cursor.com
Made with Cursor