Repository navigation
fix(signals): a held staging beats an inherited verdict posture, and a probing reader no longer blocks the landing (#4544) - #4625
Conversation
…#4544) A pass whose verdict posture is only inherited (it read a memo that calls isPending/latest, and neither it nor its node's last pass opened a window of its own) is the hold's work where it reads the hold's own sync write: it is served that staging and joins the hold. The branch a hold opens then reads the hold's world and the hold lands, in one flush() or several (F-10). Before the flush parks, such a read leaves the verdict lane an earlier read of the verdict memo seated the pass in. A staging a window asked of under the hold that holds it (or in this flush) still reads as the screen, so `[latest(x), x()]` through a memo stays atomic (A10, D-26). The mark (`_askedIn`) names that hold and expires with it: nothing sticky. CONFIG_OWN_PROBE is renewed by every pass from REACTIVE_WINDOW. A pass that probes in its own body stays the hold's verdict reader (F-6). When a render effect born into the hold reads such a reader's settled value and goes pending on what that display-ahead value asks for, the pending no longer holds the hold (CONFIG_AHEAD, F-6): the hold lands and the reader re-derives at the landing (A15). A lane's reveal still waits (S-29). Everything is gated on the verdict engine's hooks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018LY7F9czoRqdMEvk2QwPr1
🦋 Changeset detectedLatest commit: 95b153e The changes in this PR will be included in the next version bump. This PR includes changesets to release 15 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 |
Size (brotli, eager entry chunk)
❌ Fails the gate
Bundled with Rolldown (what Vite ships), brotli q11, decimal KB. A scenario fails only when it is over its brotli cap and its minified size is more than 20 B over the minified recorded with the cap; over the cap within that allowance is brotli layout noise and passes with a warning. Caps and their recorded minified in |
|
The red Generated by Claude Code |
Coverage Report for CI Build 41496607670Coverage remained the same at 78.205%Details
Uncovered ChangesNo uncovered changes found. Coverage RegressionsNo coverage regressions found. Coverage Stats
💛 - Coveralls |
Merging this PR will degrade performance by 21.46%2 warnings
Warning Please fix the performance issues or acknowledge them on CodSpeed. Performance Changes
Tip Investigate this regression by commenting Comparing Footnotes
|
|
CodSpeed flags one benchmark, Generated by Claude Code |
Numbers from next's push size job 125476580572 at 343f007. Hello world stays under its 9.98 KB cap. Claude-Session: https://claude.ai/code/session_0117BoWNSSgtemsSYsaX2hXE Co-authored-by: Claude <noreply@anthropic.com>
Summary
Before: in #4544's app, a branch the hold opened could read the signed-out session beside a signed-in condition. That happened when its memo inherited a verdict posture by reading a memo that calls
isPending(plan)orlatest(plan). With a never-resolving signed-out fetch, the hold never landed. The same hang showed whenparamsitself calledisPending(plan)orisPending(session).After: all four forms land on
1 rows, whether the writes go in oneflush()or are split across several.isPendingand memolatest: the branch reads the hold's own write.isPending(plan)and same-nodeisPending(session): the pass is a verdict reader and reads the screen while held. The write's hold still lands, and the pass re-derives at the landing.This replaces #4612 and follows the precedence settled for #4544:
How:
holdStagingHook, installed by the verdict engine and called only behindobserveFlightHook, answers O(1) whether an inherited-posture pass is reading a pending sync write of its hold. If so,frameReaddoesn't serve it the committed value. In one flush,stagedScreenserves it the flush's own write and takes it out of the verdict lane.CONFIG_OWN_PROBEis rebuilt every pass fromREACTIVE_WINDOW, next toCONFIG_VERDICT._x._askedIn), so it ends when that hold lands or dissolves.CONFIG_AHEAD(F-6).blockedByskips it when judging a transaction, but not a lane (S-29), so the hold lands and the reader re-derives (A15).How did you test this change?
verdict-memo-held-branch-4544.test.ts(signals) and.spec.tsx(web). They cover all four forms in both flush shapes, plus a hold-scoped mark check: probe under hold 1, land, then hold 2 reads the node as never probed.next's recording. Seed replays 7 #21333 and 3289 CreateEffect doesn't react when object in store changes a parameter type from array to object and vice-versa #1831/#17777/#29047/traversedinsetStoreduplicates traversed keys when passed an array, function or object #840/#30372 (plain and E1) are identical tonext.nextper write (H=200: 0.136 vs 0.100 ms; H=2000: 0.298 vs 0.239 ms), flat in H, so not quadratic. The cost is the bench memo now joining the hold.Size vs
next: hello world, every floor and every non-verdict row are 0 B. The four verdict rows grow:Closes #4544
Generated by Claude Code