Repository navigation
signals: a re-armed boundary owns content another hold staged (U-9) - #4059
Conversation
A Loading boundary re-armed by `on` now owns what reads a hold under it (D-14, D-16): the fallback shows with the re-arming change, the content reveals at that hold's commit, and the hold does not wait for it. The held tree under a re-armed boundary no longer redraws forever. - `arm` records what an earlier hold staged under the boundary (`heldUnder`) and flips; the output leaves that hold (`unhold`). - A pass under a re-armed boundary that reads a hold is the boundary's, not the tick's (`_fresh` answers for committed passes too), and a re-ask of an old flight through it does not join the flush. - A re-arm whose own flush joins that hold folds back into it: the seam drops a fallback staged into the very hold its readers wait on. - LOADING_ON_OUTSIDE_HOLD only for a flight the change itself started. - Floors held at 0 B minified by golfing optional hook calls. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011JxYhsd8CeAgCp6h5DU8ic
🦋 Changeset detectedLatest commit: af6186a The changes in this PR will be included in the next version bump. This PR includes changesets to release 13 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)
|
|
The I haven't fixed this because the choice is a maintainer's call: raise those caps, golf further, or drop U-9 and file it as an issue. I've asked in the project thread and am leaving the caps alone until that's answered. The PR stays a draft and watched. Generated by Claude Code |
Coverage Report for CI Build 38588969410Coverage remained the same at 77.515%Details
Uncovered ChangesNo uncovered changes found. Coverage RegressionsNo coverage regressions found. Coverage Stats
💛 - Coveralls |
Merging this PR will not alter performance
|
|
CodSpeed's first run flagged one benchmark: Update: I re-ran the same commit (c2513e3) and all 195 benchmarks came back untouched, so the first reading was runner noise. Generated by Claude Code |
Size-Exception: a re-armed boundary owns content another hold staged (D-14/D-16/U-9). +416..418 B minified on the seven Loading-boundary app scenarios; the floors are 0 B minified. Accepted by the maintainer 2026-10-14. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011JxYhsd8CeAgCp6h5DU8ic
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011JxYhsd8CeAgCp6h5DU8ic
Requested by Ryan · project thread
Summary
Before: a Loading boundary re-armed by
oncould not show its fallback when the content under it read a hold that another change made. The content joined that hold, so no fallback showed and the boundary reported pending. In the S-19 shape (a held tree under a re-armed boundary) the boundary redrew forever.After: the re-armed boundary owns that content, as D-14 and D-16 rule. The fallback shows with the re-arming change, and the content reveals at the hold's commit, which no longer waits for it. A re-arm whose own change joins that hold still shows no fallback, because the frame waits on the same data (the "a read made pending before the flush joins its hold" pins are unchanged).
LOADING_ON_OUTSIDE_HOLDis now reported only for a flight the change itself started.This is U-9, the last of the re-arm deferrals. Nine pins flip from
it.failstoit:How:
armrecords what an earlier hold staged under the boundary (heldUnder, scheduler.ts) and flips. The boundary's output leaves that hold (unhold), so the fallback publishes now._freshnow answers for committed passes too (armedOver), at the held re-pass inrecomputeand injoinPass. A re-notified pending through such a pass does not join the flush, unless the change re-asked that flight.prunekeeps the tree as a held reader while armed, which is the loop fix.Size, measured locally against
next@ a4b3391:The floors are held at 0 B minified. The core's hook calls (
X && X(...)toX?.(...)) andremovalStagedBywere golfed to pay for the two new hook arguments. The five boundary apps are over their caps by 61–144 B brotli. The caps are left untouched until the maintainer rules.How did you test this change?
pnpm --filter @solidjs/signals build:js && npx vitest runin packages/signals: 5229 passed, 2 expected fail (U-5, U-6), 2 skipped.latestof held re-armed content is the staged value (c1 1, A11), as for a fresh boundary's content.node packages/signals/scripts/rules-index.mjs --check: current.node scripts/size/size.mjs(table above).Size
Size-Exception: a re-armed boundary owns content another hold staged (D-14/D-16/U-9). The seven Loading-boundary app scenarios grow +416 to +418 B minified, so their caps are raised (hydrating with no stores is a floor-caps.json entry). The floors are 0 B minified. Accepted by the maintainer on 2026-10-14.
🤖 Generated with Claude Code
https://claude.ai/code/session_011JxYhsd8CeAgCp6h5DU8ic
Generated by Claude Code
Generated by Claude Code