test(signals): posture matrix — gatedAway posture, direct-effect reader, fuzzer P1 as a cell and pinned violation - #3485
Conversation
…er, the fuzzer's P1 as a cell and a pinned violation Adds to the posture matrix: - posture `gatedAway`: the reader is built behind a `show()` gate, then the gate closes — alive, no longer deriving from `x`. Records `x`, `isPending(x)` and the state's held SOURCE write after the gate closes, before any release. - reader `effect`: a render effect reading `x` DIRECTLY (the reporter shape the fuzzer's reduction used; the matrix only had memo + effect-over-memo). - state contract: `source` (the mainline signal whose write the flight holds) and `perturb` (a write made after the matrix reader exists, so the reader observes the flight it opens). - a matrix-only state, "pending own async, observed only by the matrix reader (fuzzer P1)". Result: fuzzer #3446 law P1 (21/1000 cases, one symptom group, case 854) reproduces as exactly one cell — `effect × gatedAway` on that state: the source's write stays held after the only reader gated away; with a memo between the effect and the flight (`memo × gatedAway`) it releases. Pinned `it.fails` in posture-born-held-and-observation.test.ts; recorded as spec O3 (violation, open): A15 / #3426 live reporter — "re-ran and no longer derives from the source" is the fifth liveness case, to be fixed in one readerLive() predicate rather than a fifth arm of reporterBlocksSource. Co-authored-by: Claude via Cursor <noreply@cursor.com> Co-authored-by: Cursor <cursoragent@cursor.com>
|
Coverage Report for CI Build 35066086155Coverage remained the same at 71.46%Details
Uncovered ChangesNo uncovered changes found. Coverage RegressionsNo coverage regressions found. Coverage Stats
💛 - Coveralls |
Merging this PR will improve performance by 11.58%
|
| Benchmark | BASE |
HEAD |
Efficiency | |
|---|---|---|---|---|
| ⚡ | projection derive: write one NESTED field (reference) |
2.9 ms | 2.6 ms | +11.58% |
Tip
Curious why performance improved? Comment @codspeedbot explain why performance improved on this PR, or directly use the CodSpeed MCP with your agent.
Comparing oracle/gated-away-posture (3a09d3f) with next (48463f5)
Tests and spec only — no runtime change. Follows #3483.
What
The fuzzer's (#3446) campaign against current
next(seed 3289, 1,000 cases) produced 21 failures in one symptom group, law P1 — "ordinary writes publish after a drain when no visible reader still needs an unresolved answer" — reduced to case 854. This PR gives that finding a home in the posture matrix and pins it.gatedAway: reader built behind ashow()gate, then the gate closes — alive, no longer deriving fromx. Recordsx,isPending(x), and the state's held source write after the gate closes, before any release.effect: a render effect readingxdirectly — the reporter shape the reduction used. The matrix previously only had memo + effect-over-memo, and the two behave differently here.source(the mainline signal whose write the flight holds) andperturb(a write made after the matrix reader exists).Result
P1 reproduces as exactly one cell —
effect × gatedAway: the source's write stays held (forever, the flight never lands) after the only reader stopped reading the memo.memo × gatedAwayon the same state releases: the memo's re-run clears its status; a render effect that directly observed the flight keepsreporterBlocksSourcetrue from its stale_pendingSources/ NotReadysource. Verified onnextand on the runtime currently in the batch-2 worktree — neither covers it.Pinned
it.failsinposture-born-held-and-observation.test.ts; recorded as spec O3 (violation, open): A15 / #3426 live reporter — "re-ran and no longer derives from the source" is the fifth liveness case after disposed, zombie, behind-fallback and first-observer. The fix belongs in onereaderLive()predicate, not a fifth arm.Also observed in the new posture:
isPending(x)isfalseafter the gate closes on every state where the flight isx's own — consistent with the reader no longer deriving from it.The fuzzer's other finding (W1, 12 policy) translates to plain Solid that publishes synchronously; it's the fuzzer's wait-budget model, not a hang.
signals 2,494 + 1 expected fail.