From 9cbea4d94ac1aa1e2adc0a46168e516502c5b91b Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 30 Oct 2026 16:35:49 +0000 Subject: [PATCH 1/5] fix(signals): net staged rewrites a custom equals calls equal to the committed value (D-8, #4483) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_015hPxMkC3jg3Uivh65gvaf2 --- .changeset/equals-netting-4483.md | 5 ++ packages/signals/src/core/core.ts | 13 ++-- .../signals/tests/netted-equals-4483.test.ts | 66 +++++++++++++++++++ scripts/size/floor-caps.json | 14 ++-- scripts/size/scenarios.js | 55 +++++++++++----- 5 files changed, 122 insertions(+), 31 deletions(-) create mode 100644 .changeset/equals-netting-4483.md create mode 100644 packages/signals/tests/netted-equals-4483.test.ts diff --git a/.changeset/equals-netting-4483.md b/.changeset/equals-netting-4483.md new file mode 100644 index 0000000000..abaa123caf --- /dev/null +++ b/.changeset/equals-netting-4483.md @@ -0,0 +1,5 @@ +--- +"@solidjs/signals": patch +--- + +A write that a custom `equals` calls equal to the committed value now nets to it (D-8) while another write to the signal is staged, so it pends nothing (#4483). diff --git a/packages/signals/src/core/core.ts b/packages/signals/src/core/core.ts index 868d6fef89..16377516b5 100644 --- a/packages/signals/src/core/core.ts +++ b/packages/signals/src/core/core.ts @@ -2484,11 +2484,8 @@ export function setSignal(el: Signal | Computed, v: T | ((prev: T) => T // user comparator must not run against `undefined` (matches recompute). // D-41: a write over a shown error is a change whatever the last good // value was — the error leaves at its commit (`commitPendingNode`). - const valueChanged = - !!((el as Computed)._statusFlags & STATUS_UNINITIALIZED) || - !!el._x?._shownError || - !isSame(el, currentValue, v); - if (!valueChanged) return v; + const settled = !((el as Computed)._statusFlags & STATUS_UNINITIALIZED || el._x?._shownError); + if (settled && isSame(el, currentValue, v)) return v; // Attribution hook: this committed write is where a re-run chain begins. if (__OBSERVE__ && attrHooks !== null) attrHooks.write(el, currentValue, v); @@ -2509,7 +2506,11 @@ export function setSignal(el: Signal | Computed, v: T | ((prev: T) => T // A28: a held node rewritten outside a flush keeps its flushed staging // for every reader until the flush that carries the rewrite. else if (el._config & CONFIG_HELD && !globalQueue._running) stashFlushed(el); - el._pendingValue = v; + // D-8 (#4483): a staged rewrite the comparator calls equal to the + // committed value nets to it; staging the committed value itself lets + // every netted test (`_pendingValue === _value`) see writes that made no + // proposal. (Unstaged, the gate above already compared it.) + el._pendingValue = settled && wasStaged && isSame(el, el._value, v) ? el._value : v; // A28 arm, gated on the load the write already pays for (`context`); the // arm itself is a cold helper so setSignal stays within every setter's // inlining budget, ~300 B bytecode. diff --git a/packages/signals/tests/netted-equals-4483.test.ts b/packages/signals/tests/netted-equals-4483.test.ts new file mode 100644 index 0000000000..fe90ddcbbe --- /dev/null +++ b/packages/signals/tests/netted-equals-4483.test.ts @@ -0,0 +1,66 @@ +// #4483 (D-8: a tick whose writes net to the slot's committed value made no +// proposal). An action rewrites a signal back to its committed value while a +// mainline write to it is still staged. Under a custom `equals`, a new object +// the comparator calls equal nets exactly like the committed object itself: +// the slot pends nothing, so `isPending` of a memo over it stays `false`. +// Without a custom `equals`, only identity nets; a new object is a proposal. +import { afterEach, describe, expect, it } from "vitest"; +import { + action, + createMemo, + createRenderEffect, + createRoot, + createSignal, + flush, + isPending, + resetErrorHalt +} from "../src/index.js"; + +afterEach(() => resetErrorHalt()); +const tick = async () => { + await new Promise(r => setTimeout(r, 0)); + flush(); +}; + +const run = async (custom: boolean, write: "committed" | "copy") => { + const one = { k: 1 }; + const [s, setS] = createSignal(one, custom ? { equals: (a, b) => a.k === b.k } : undefined); + const seen: boolean[] = []; + const dispose = createRoot(d => { + const m0 = createMemo(() => { + const v = s().k + 1; + if (v % 4 === 2) throw new Error(`m0:${v}`); + return v; + }); + createRenderEffect( + () => isPending(m0), + v => void seen.push(v) + ); + return d; + }); + flush(); + const act = action(function* () { + setS(write === "committed" ? one : { k: 1 }); + yield new Promise(() => {}); + }); + setS({ k: 2 }); + act(); + await tick(); + dispose(); + return seen; +}; + +describe("#4483: writes that net under a custom equals pend nothing (D-8)", () => { + it("nets the committed object itself (identity)", async () => { + expect(await run(true, "committed")).toEqual([false]); + }); + + it("nets a new object the comparator calls equal", async () => { + expect(await run(true, "copy")).toEqual([false]); + }); + + it("without a custom equals, nets only the committed object", async () => { + expect(await run(false, "committed")).toEqual([false]); + expect(await run(false, "copy")).toEqual([false, true]); + }); +}); diff --git a/scripts/size/floor-caps.json b/scripts/size/floor-caps.json index 2a42d8a491..b4d2ac3abd 100644 --- a/scripts/size/floor-caps.json +++ b/scripts/size/floor-caps.json @@ -1,23 +1,23 @@ { "signals: core floor (createSignal/Memo/Effect/Root/flush)": { "cap": "7.43 KB", - "minified": 19908 + "minified": 19954 }, "app: render + one signal (the simple-app floor)": { - "cap": "9.78 KB", - "minified": 26739 + "cap": "9.81 KB", + "minified": 26785 }, "app: hydrating (no stores) with Show/For/Loading/Errored/lazy": { - "cap": "18.74 KB", - "minified": 53585 + "cap": "18.76 KB", + "minified": 53631 }, "page: base server components (hydrating + dynamic + frames + sf reference)": { "cap": "33.77 KB", - "minified": 101638 + "minified": 101671 }, "page: live server components (base + live/GET + action + isPending/latest)": { "cap": "38.85 KB", - "minified": 117376 + "minified": 117422 }, "server: floor (getRequestEvent + isServer)": { "cap": "1.29 KB", diff --git a/scripts/size/scenarios.js b/scripts/size/scenarios.js index f258ebe203..1b33e5283c 100644 --- a/scripts/size/scenarios.js +++ b/scripts/size/scenarios.js @@ -606,6 +606,7 @@ module.exports = [ // B; CI-measured at 7,416 B (19,907 B minified). Lower only: cap at // measured + 10 B rounded up to 0.01 KB; recorded minified never raised. // Batch re-record (2026-10-30, next @ 32163a9, size job 123956613767): cap unchanged, recorded minified 19,907 -> 19,908 B, measured in CI at 7,415 B brotli. Growth is the 2026-10-30 merges (#4424, #4436, #4416, #4442); #4416's truncation sweep is the +19 B minified on the hydrating scenarios. Cap at measured + 10 B rounded up to 0.01 KB where over; recorded minified = measured. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): cap unchanged at 7.43 KB, recorded minified 19,908 -> 19,954 B (+46 B), measured locally (linux) at 7,424 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: floorCaps["signals: core floor (createSignal/Memo/Effect/Root/flush)"], capMinified: floorMinified["signals: core floor (createSignal/Memo/Effect/Root/flush)"], alias @@ -1119,8 +1120,9 @@ module.exports = [ // 0.01 KB; recorded minified never raised. // A tick whose writes net to the committed value pends no errored re-run (D-8, async-gen rerun on 5e68925c) (2026-10-30, over next @ 7135a77a): 14.89 -> 14.95 KB, recorded minified 43,875 -> 43,888 B (+13 B), measured locally (linux) at 14,932 B brotli. A signal read whose staging equals its committed value is not a read of the frame's future (`read`): +13 B minified, the rest brotli layout. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // Batch re-record after the 2026-10-30 merges (#4454, #4457, #4461; over next @ 563b6b0): 14.95 KB -> 14.97 KB, recorded minified 43,888 -> 43,924 B (+36 B), measured locally (linux) at 14,951 B brotli. Growth is #4454's `stagedScreen` held-node check (+20 B minified in core.js) and #4457's same-error skip in `errorFamily`; together they put next over this cap. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - limit: "14.97 KB", - capMinified: 43924, + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): 14.97 KB -> 15.00 KB, recorded minified 43,924 -> 43,961 B (+37 B), measured locally (linux) at 14,988 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + limit: "15.00 KB", + capMinified: 43961, alias }, { @@ -1443,9 +1445,10 @@ module.exports = [ // A probe beside `latest()` outside any Loading no longer loops on a refetch (F-6, D-23; 2026-10-30, over next @ 7135a77a): 11.07 KB -> 11.10 KB, recorded minified 30,492 -> 30,569 B (+77 B), measured locally (linux) at 11,085 B brotli. `pendingVerdict` remembers the transaction a `latest` read of an unheld flight opened, and a probe in it joins the verdict lane without asking to re-run at its landing (the re-run re-opened it every flush). Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 30,569 -> 30,596 B (+27 B), measured locally (linux) at 11,092 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. // D-28's verdict-seat reset compares holds, not lane objects: a seated leaf reading a merged transaction's verdict lane stays the hold's verdict reader (`laneRead`) (#4427, #4455, 2026-10-30, over next @ cddaa76): 11.10 KB -> 11.12 KB, recorded minified 30,596 -> 30,641 B (+45 B), measured locally (linux) at 11,109 B brotli. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - limit: "11.12 KB", + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): 11.12 KB -> 11.14 KB, recorded minified 30,641 -> 30,689 B (+48 B), measured locally (linux) at 11,121 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + limit: "11.14 KB", // latest() read inline and through a memo show the same screen (#4284 through a memo; a plain write beside an async memo), 2026-10-29, over next @ 7ebd4a32: recorded minified 28,693 -> 29,086 B (+343 B minified over next), measured locally (linux) at 10,565 B brotli (+135 B over next). A render effect a verdict memo's change re-runs reads as its verdict reader for that pass (`laneDirty`), a pass that read a staging before the frame had a transaction re-derives once as a verdict reader only if the frame parks, `latest()` of a first load in flight in a verdict lane is loading (also through an identity memo, a derived store and `isPending`), a lane's dissolution leaves such a load and the nodes pending on it uninitialized instead of committing `undefined`, a verdict lane born at a seam is judged at it, a pass born in a staged reader stays the frame's on a verdict-memo read (C4, #4010), a plain write beside `latest()` computes once (the seam re-derives a pre-transaction staged reader only if the frame parks), a verdict reader's plain read of a staging in a transaction only a `latest()` opened is the frame's read, so a memo of `latest()` computes once too (D-22; not a pass with no value yet, D-6), and an error stays the display while the memo it came through re-asks, a Loading fallback behind it included (D-39, async-gen 91501 #1831). recompute's CONFIG_VERDICT clear now sits behind the lane engine: -21 B minified on every floor. Correctness; the maintainer: "only flag me if brotli goes more than 20kb" (2026-10-29). Cap unchanged; recorded minified = measured. - capMinified: 30641, + capMinified: 30689, alias }, { @@ -1492,8 +1495,9 @@ module.exports = [ // (21,719 B minified). Lower only: cap at measured + 10 B rounded up to // 0.01 KB; recorded minified never raised. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 21,719 -> 21,732 B (+13 B), measured locally (linux) at 8,043 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): cap unchanged at 8.06 KB, recorded minified 21,732 -> 21,765 B (+33 B), measured locally (linux) at 8,060 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "8.06 KB", - capMinified: 21732 + capMinified: 21765 }, { name: "app: render + one signal (the simple-app floor)", @@ -1757,6 +1761,7 @@ module.exports = [ // 9.78 KB, recorded minified 26,738 -> 26,739 B; CI-measured at 9,769 B // (26,739 B minified). Lower only: cap at measured + 10 B rounded up to // 0.01 KB; recorded minified never raised. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): 9.78 KB -> 9.81 KB, recorded minified 26,739 -> 26,785 B (+46 B), measured locally (linux) at 9,795 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: floorCaps["app: render + one signal (the simple-app floor)"], capMinified: floorMinified["app: render + one signal (the simple-app floor)"], alias @@ -2158,6 +2163,7 @@ module.exports = [ // B; CI-measured at 18,701 B (53,566 B minified). Lower only: cap at // measured + 10 B rounded up to 0.01 KB; recorded minified never raised. // Batch re-record (2026-10-30, next @ 32163a9, size job 123956613767): 18.72 KB -> 18.74 KB, recorded minified 53,566 -> 53,585 B, measured in CI at 18,726 B brotli. Growth is the 2026-10-30 merges (#4424, #4436, #4416, #4442); #4416's truncation sweep is the +19 B minified on the hydrating scenarios. Cap at measured + 10 B rounded up to 0.01 KB where over; recorded minified = measured. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): 18.74 KB -> 18.76 KB, recorded minified 53,585 -> 53,631 B (+46 B), measured locally (linux) at 18,745 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: floorCaps["app: hydrating (no stores) with Show/For/Loading/Errored/lazy"], capMinified: floorMinified["app: hydrating (no stores) with Show/For/Loading/Errored/lazy"], alias @@ -2737,11 +2743,12 @@ module.exports = [ // A held memo's parked reader re-derives at the seam (#4439, 2026-10-30, over next @ b249ad96): 32.42 KB -> 32.45 KB, recorded minified 98,607 -> 98,689 B (+82 B), measured locally (linux) at 32,433 B brotli. `laneSeams` also re-derives a reader whose pass read a held node, so `isPending` of a memo parked behind a held one turns true. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 98,689 -> 98,387 B (-302 B), measured locally (linux) at 32,372 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. // D-28's verdict-seat reset compares holds, not lane objects: a seated leaf reading a merged transaction's verdict lane stays the hold's verdict reader (`laneRead`) (#4427, #4455, 2026-10-30, over next @ cddaa76): 32.45 KB -> 32.48 KB, recorded minified 98,387 -> 98,432 B (+45 B), measured locally (linux) at 32,465 B brotli. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): cap unchanged at 32.48 KB, recorded minified 98,432 -> 98,471 B (+39 B), measured locally (linux) at 32,390 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "32.48 KB", // An Errored heals when the last reader that caught its error is disposed (#4373, #4384, 2026-10-28, re-recorded over next @ cbc0eebd): recorded minified 96,989 -> 97,047 B (+58 B minified over next's record), measured locally (linux) at 31,811 B brotli. Recorded minified = measured; CI re-bases. // Boundary readers keyed by the source they wait on (#4373), with enterLane's tail folded into one else-chain as an offset (-29 B on lane pages) (#4384, 2026-10-28, re-recorded over next @ 1b32ff2e): recorded minified 97,024 -> 97,045 B (+21 B minified over next's record), measured locally (linux) at 31,798 B brotli. Recorded minified = measured; CI re-bases. // latest() read inline and through a memo show the same screen (#4284 through a memo; a plain write beside an async memo), 2026-10-29, over next @ 7ebd4a32: recorded minified 97,045 -> 97,426 B (+240 B minified over next), measured locally (linux) at 31,976 B brotli (+109 B over next). A render effect a verdict memo's change re-runs reads as its verdict reader for that pass (`laneDirty`), a pass that read a staging before the frame had a transaction re-derives once as a verdict reader only if the frame parks, `latest()` of a first load in flight in a verdict lane is loading (also through an identity memo, a derived store and `isPending`), a lane's dissolution leaves such a load and the nodes pending on it uninitialized instead of committing `undefined`, a verdict lane born at a seam is judged at it, a pass born in a staged reader stays the frame's on a verdict-memo read (C4, #4010), a plain write beside `latest()` computes once (the seam re-derives a pre-transaction staged reader only if the frame parks), a verdict reader's plain read of a staging in a transaction only a `latest()` opened is the frame's read, so a memo of `latest()` computes once too (D-22; not a pass with no value yet, D-6), and an error stays the display while the memo it came through re-asks, a Loading fallback behind it included (D-39, async-gen 91501 #1831). recompute's CONFIG_VERDICT clear now sits behind the lane engine: -21 B minified on every floor. Correctness; the maintainer: "only flag me if brotli goes more than 20kb" (2026-10-29). Cap unchanged; recorded minified = measured. - capMinified: 98432, + capMinified: 98471, alias }, { @@ -3041,8 +3048,9 @@ module.exports = [ // measured + 10 B rounded up to 0.01 KB; recorded minified never raised. // Batch re-record (2026-10-30, next @ 32163a9, size job 123956613767): cap unchanged, recorded minified 37,014 -> 37,015 B, measured in CI at 13,423 B brotli. Growth is the 2026-10-30 merges (#4424, #4436, #4416, #4442); #4416's truncation sweep is the +19 B minified on the hydrating scenarios. Cap at measured + 10 B rounded up to 0.01 KB where over; recorded minified = measured. // A tick whose writes net to the committed value pends no errored re-run (D-8, async-gen rerun on 5e68925c) (2026-10-30, over next @ 7135a77a): 13.43 -> 13.47 KB, recorded minified 37,015 -> 37,028 B (+13 B), measured locally (linux) at 13,451 B brotli. A signal read whose staging equals its committed value is not a read of the frame's future (`read`): +13 B minified, the rest brotli layout. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): cap unchanged at 13.47 KB, recorded minified 37,028 -> 37,061 B (+33 B), measured locally (linux) at 13,463 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "13.47 KB", - capMinified: 37028, + capMinified: 37061, alias }, { @@ -3394,8 +3402,9 @@ module.exports = [ // measured + 10 B rounded up to 0.01 KB; recorded minified never raised. // Batch re-record (2026-10-30, next @ 32163a9, size job 123956613767): cap unchanged, recorded minified 41,968 -> 41,969 B, measured in CI at 15,193 B brotli. Growth is the 2026-10-30 merges (#4424, #4436, #4416, #4442); #4416's truncation sweep is the +19 B minified on the hydrating scenarios. Cap at measured + 10 B rounded up to 0.01 KB where over; recorded minified = measured. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 41,969 -> 41,982 B (+13 B), measured locally (linux) at 15,180 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): cap unchanged at 15.20 KB, recorded minified 41,982 -> 42,015 B (+33 B), measured locally (linux) at 15,174 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "15.20 KB", - capMinified: 41982, + capMinified: 42015, alias: observeAlias }, { @@ -3901,8 +3910,9 @@ module.exports = [ // (88,303 B minified). Lower only: cap at measured + 10 B rounded up to // 0.01 KB; recorded minified never raised. // A tick whose writes net to the committed value pends no errored re-run (D-8, async-gen rerun on 5e68925c) (2026-10-30, over next @ 7135a77a): 29.74 -> 29.78 KB, recorded minified 88,303 -> 88,316 B (+13 B), measured locally (linux) at 29,762 B brotli. A signal read whose staging equals its committed value is not a read of the frame's future (`read`): +13 B minified, the rest brotli layout. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - limit: "29.78 KB", - capMinified: 88316, + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): 29.78 KB -> 29.80 KB, recorded minified 88,316 -> 88,349 B (+33 B), measured locally (linux) at 29,785 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + limit: "29.80 KB", + capMinified: 88349, alias: observeAlias }, // Compiled-template scenarios (2026-10-05): the four `app:` fixtures above @@ -4000,8 +4010,9 @@ module.exports = [ // measured + 10 B rounded up to 0.01 KB; recorded minified never raised. // Batch re-record (2026-10-30, next @ 32163a9, size job 123956613767): cap unchanged, recorded minified 27,270 -> 27,271 B, measured in CI at 9,961 B brotli. Growth is the 2026-10-30 merges (#4424, #4436, #4416, #4442); #4416's truncation sweep is the +19 B minified on the hydrating scenarios. Cap at measured + 10 B rounded up to 0.01 KB where over; recorded minified = measured. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 27,271 -> 27,284 B (+13 B), measured locally (linux) at 9,963 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): cap unchanged at 9.98 KB, recorded minified 27,284 -> 27,317 B (+33 B), measured locally (linux) at 9,979 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "9.98 KB", - capMinified: 27284, + capMinified: 27317, alias }, { @@ -4142,8 +4153,9 @@ module.exports = [ // 0.01 KB; recorded minified never raised. // A tick whose writes net to the committed value pends no errored re-run (D-8, async-gen rerun on 5e68925c) (2026-10-30, over next @ 7135a77a): 26.27 -> 26.31 KB, recorded minified 79,986 -> 79,999 B (+13 B), measured locally (linux) at 26,294 B brotli. A signal read whose staging equals its committed value is not a read of the frame's future (`read`): +13 B minified, the rest brotli layout. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // Batch re-record after the 2026-10-30 merges (#4454, #4457, #4461; over next @ 563b6b0): 26.31 KB -> 26.33 KB, recorded minified 79,999 -> 80,035 B (+36 B), measured locally (linux) at 26,312 B brotli. Growth is #4454's `stagedScreen` held-node check (+20 B minified in core.js) and #4457's same-error skip in `errorFamily`; together they put next over this cap. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): cap unchanged at 26.33 KB, recorded minified 80,035 -> 80,072 B (+37 B), measured locally (linux) at 26,310 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "26.33 KB", - capMinified: 80035, + capMinified: 80072, alias }, { @@ -4318,8 +4330,9 @@ module.exports = [ // A tick whose writes net to the committed value pends no errored re-run (D-8, async-gen rerun on 5e68925c) (2026-10-30, over next @ 7135a77a): 32.43 -> 32.52 KB, recorded minified 100,748 -> 100,761 B (+13 B), measured locally (linux) at 32,508 B brotli. A signal read whose staging equals its committed value is not a read of the frame's future (`read`): +13 B minified, the rest brotli layout. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 100,761 -> 100,797 B (+36 B), measured locally (linux) at 32,473 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. // A propagated error reaches a derived store's readers once (#4463, 2026-10-30, over next @ 131ceb8c): 32.52 KB -> 32.54 KB, recorded minified 100,797 -> 100,803 B (+6 B), measured locally (linux) at 32,522 B brotli. familyStatus hands the error to errorFamily so a reader its derive's pass already handed it is skipped; the brotli move is layout from +2 B minified. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): cap unchanged at 32.54 KB, recorded minified 100,803 -> 100,834 B (+31 B), measured locally (linux) at 32,484 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "32.54 KB", - capMinified: 100803, + capMinified: 100834, alias }, { @@ -5256,6 +5269,7 @@ module.exports = [ // (101,605 B minified). Lower only: cap at measured + 10 B rounded up to // 0.01 KB; recorded minified never raised. // A verdict reader born into a hold reads it whichever flush runs it (#4426, D-25/D-27; re-measured over next @ 9c4e4a8): 33.66 KB -> 33.77 KB, recorded minified 101,605 -> 101,638 B, measured locally (linux) at 33,755 B brotli. `stagedScreen`'s held-node check (+20 B minified in core.js) on top of next's +13 B over this floor's record (#4452); the brotli is layout. Correctness; a frozen floor, Size-Exception in the PR body. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): cap unchanged at 33.77 KB, recorded minified 101,638 -> 101,671 B (+33 B), measured locally (linux) at 33,750 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: floorCaps["page: base server components (hydrating + dynamic + frames + sf reference)"], capMinified: floorMinified["page: base server components (hydrating + dynamic + frames + sf reference)"], @@ -5612,6 +5626,7 @@ module.exports = [ // A held memo's parked reader re-derives at the seam (#4439, 2026-10-30, over next @ b249ad96): 38.74 KB -> 38.76 KB, recorded minified 117,143 -> 117,227 B (+84 B), measured locally (linux) at 38,741 B brotli. `laneSeams` also re-derives a reader whose pass read a held node, so `isPending` of a memo parked behind a held one turns true. Correctness; a frozen floor, +15 B brotli is under the maintainer's 20 B flag line (2026-10-29), Size-Exception in the PR body. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A verdict reader born into a hold reads it whichever flush runs it (#4426, D-25/D-27; re-measured over next @ 9c4e4a8): 38.81 KB -> 38.83 KB, recorded minified 117,251 -> 117,331 B, measured locally (linux) at 38,817 B brotli. `stagedScreen`'s held-node check (+20 B minified in core.js) on top of next's +13 B over this floor's record (#4452); the brotli is layout. Correctness; a frozen floor, Size-Exception in the PR body. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // D-28's verdict-seat reset compares holds, not lane objects: a seated leaf reading a merged transaction's verdict lane stays the hold's verdict reader (`laneRead`) (#4427, #4455, 2026-10-30, over next @ cddaa76): 38.83 KB -> 38.85 KB, recorded minified 117,331 -> 117,376 B (+45 B), measured locally (linux) at 38,839 B brotli. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): cap unchanged at 38.85 KB, recorded minified 117,376 -> 117,422 B (+46 B), measured locally (linux) at 38,832 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: floorCaps["page: live server components (base + live/GET + action + isPending/latest)"], capMinified: floorMinified["page: live server components (base + live/GET + action + isPending/latest)"], @@ -5782,8 +5797,9 @@ module.exports = [ // (107,974 B minified). Lower only: cap at measured + 10 B rounded up to // 0.01 KB; recorded minified never raised. // A verdict reader born into a hold reads it whichever flush runs it (#4426, D-25/D-27; re-measured over next @ 9c4e4a8): 35.66 KB -> 35.72 KB, recorded minified 107,974 -> 108,007 B (+33 B), measured locally (linux) at 35,702 B brotli. `stagedScreen`'s held-node check (+20 B minified in core.js) on top of next's +13 B; the brotli is layout. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): cap unchanged at 35.72 KB, recorded minified 108,007 -> 108,040 B (+33 B), measured locally (linux) at 35,649 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "35.72 KB", - capMinified: 108007, + capMinified: 108040, alias: pageAlias }, { @@ -5928,11 +5944,12 @@ module.exports = [ // A probe beside `latest()` outside any Loading no longer loops on a refetch (F-6, D-23; 2026-10-30, over next @ 7135a77a): 42.67 KB -> 42.71 KB, recorded minified 125,374 -> 125,450 B (+76 B), measured locally (linux) at 42,693 B brotli. `pendingVerdict` remembers the transaction a `latest` read of an unheld flight opened, and a probe in it joins the verdict lane without asking to re-run at its landing (the re-run re-opened it every flush). Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 125,450 -> 125,478 B (+28 B), measured locally (linux) at 42,695 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. // D-28's verdict-seat reset compares holds, not lane objects: a seated leaf reading a merged transaction's verdict lane stays the hold's verdict reader (`laneRead`) (#4427, #4455, 2026-10-30, over next @ cddaa76): 42.71 KB -> 42.73 KB, recorded minified 125,478 -> 125,518 B (+40 B), measured locally (linux) at 42,715 B brotli. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - limit: "42.73 KB", + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): 42.73 KB -> 42.77 KB, recorded minified 125,518 -> 125,564 B (+46 B), measured locally (linux) at 42,752 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + limit: "42.77 KB", // An Errored heals when the last reader that caught its error is disposed (#4373, #4384, 2026-10-28, re-recorded over next @ cbc0eebd): recorded minified 123,191 -> 123,249 B (+58 B minified over next's record), measured locally (linux) at 41,899 B brotli. Recorded minified = measured; CI re-bases. // Boundary readers keyed by the source they wait on (#4373), with enterLane's tail folded into one else-chain as an offset (-29 B on lane pages) (#4384, 2026-10-28, re-recorded over next @ 1b32ff2e): recorded minified 123,203 -> 123,224 B (+21 B minified over next's record), measured locally (linux) at 41,966 B brotli. Recorded minified = measured; CI re-bases. // latest() read inline and through a memo show the same screen (#4284 through a memo; a plain write beside an async memo), 2026-10-29, over next @ 7ebd4a32: recorded minified 123,224 -> 123,733 B (+403 B minified over next), measured locally (linux) at 42,119 B brotli (+169 B over next). A render effect a verdict memo's change re-runs reads as its verdict reader for that pass (`laneDirty`), a pass that read a staging before the frame had a transaction re-derives once as a verdict reader only if the frame parks, `latest()` of a first load in flight in a verdict lane is loading (also through an identity memo, a derived store and `isPending`), a lane's dissolution leaves such a load and the nodes pending on it uninitialized instead of committing `undefined`, a verdict lane born at a seam is judged at it, a pass born in a staged reader stays the frame's on a verdict-memo read (C4, #4010), a plain write beside `latest()` computes once (the seam re-derives a pre-transaction staged reader only if the frame parks), a verdict reader's plain read of a staging in a transaction only a `latest()` opened is the frame's read, so a memo of `latest()` computes once too (D-22; not a pass with no value yet, D-6), and an error stays the display while the memo it came through re-asks, a Loading fallback behind it included (D-39, async-gen 91501 #1831). recompute's CONFIG_VERDICT clear now sits behind the lane engine: -21 B minified on every floor. Correctness; the maintainer: "only flag me if brotli goes more than 20kb" (2026-10-29). Cap unchanged; recorded minified = measured. - capMinified: 125518, + capMinified: 125564, alias: pageAlias }, { @@ -6142,8 +6159,9 @@ module.exports = [ // Batch re-record (2026-10-30, next @ 32163a9, size job 123956613767): 41.16 KB -> 41.23 KB, recorded minified 125,416 -> 125,435 B, measured in CI at 41,215 B brotli. Growth is the 2026-10-30 merges (#4424, #4436, #4416, #4442); #4416's truncation sweep is the +19 B minified on the hydrating scenarios. Cap at measured + 10 B rounded up to 0.01 KB where over; recorded minified = measured. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 125,435 -> 125,468 B (+33 B), measured locally (linux) at 41,178 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. // A propagated error reaches a derived store's readers once (#4463, 2026-10-30, over next @ 131ceb8c): 41.23 KB -> 41.25 KB, recorded minified 125,468 -> 125,470 B (+2 B), measured locally (linux) at 41,231 B brotli. familyStatus hands the error to errorFamily so a reader its derive's pass already handed it is skipped; the brotli move is layout from +2 B minified. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): cap unchanged at 41.25 KB, recorded minified 125,470 -> 125,501 B (+31 B), measured locally (linux) at 41,189 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "41.25 KB", - capMinified: 125470, + capMinified: 125501, alias: pageAlias, conditions: solidConditions, compile: { hydratable: true } @@ -6334,11 +6352,12 @@ module.exports = [ // A probe beside `latest()` outside any Loading no longer loops on a refetch (F-6, D-23; 2026-10-30, over next @ 7135a77a): 48.42 KB -> 48.44 KB, recorded minified 142,631 -> 142,706 B (+75 B), measured locally (linux) at 48,421 B brotli. `pendingVerdict` remembers the transaction a `latest` read of an unheld flight opened, and a probe in it joins the verdict lane without asking to re-run at its landing (the re-run re-opened it every flush). Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 142,706 -> 142,735 B (+29 B), measured locally (linux) at 48,365 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. // D-28's verdict-seat reset compares holds, not lane objects: a seated leaf reading a merged transaction's verdict lane stays the hold's verdict reader (`laneRead`) (#4427, #4455, 2026-10-30, over next @ cddaa76): cap unchanged at 48.44 KB, recorded minified 142,735 -> 142,780 B (+45 B), measured locally (linux) at 48,394 B brotli. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ ab3d2add): cap unchanged at 48.44 KB, recorded minified 142,780 -> 142,826 B (+46 B), measured locally (linux) at 48,406 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "48.44 KB", // An Errored heals when the last reader that caught its error is disposed (#4373, #4384, 2026-10-28, re-recorded over next @ cbc0eebd): recorded minified 140,451 -> 140,509 B (+58 B minified over next's record), measured locally (linux) at 47,516 B brotli. Recorded minified = measured; CI re-bases. // Boundary readers keyed by the source they wait on (#4373), with enterLane's tail folded into one else-chain as an offset (-29 B on lane pages) (#4384, 2026-10-28, re-recorded over next @ 1b32ff2e): recorded minified 140,463 -> 140,485 B (+22 B minified over next's record), measured locally (linux) at 47,547 B brotli. Recorded minified = measured; CI re-bases. // latest() read inline and through a memo show the same screen (#4284 through a memo; a plain write beside an async memo), 2026-10-29, over next @ 7ebd4a32: recorded minified 140,485 -> 140,983 B (+405 B minified over next), measured locally (linux) at 47,722 B brotli (+162 B over next). A render effect a verdict memo's change re-runs reads as its verdict reader for that pass (`laneDirty`), a pass that read a staging before the frame had a transaction re-derives once as a verdict reader only if the frame parks, `latest()` of a first load in flight in a verdict lane is loading (also through an identity memo, a derived store and `isPending`), a lane's dissolution leaves such a load and the nodes pending on it uninitialized instead of committing `undefined`, a verdict lane born at a seam is judged at it, a pass born in a staged reader stays the frame's on a verdict-memo read (C4, #4010), a plain write beside `latest()` computes once (the seam re-derives a pre-transaction staged reader only if the frame parks), a verdict reader's plain read of a staging in a transaction only a `latest()` opened is the frame's read, so a memo of `latest()` computes once too (D-22; not a pass with no value yet, D-6), and an error stays the display while the memo it came through re-asks, a Loading fallback behind it included (D-39, async-gen 91501 #1831). recompute's CONFIG_VERDICT clear now sits behind the lane engine: -21 B minified on every floor. Correctness; the maintainer: "only flag me if brotli goes more than 20kb" (2026-10-29). Cap unchanged; recorded minified = measured. - capMinified: 142780, + capMinified: 142826, alias: pageAlias, conditions: solidConditions, compile: { hydratable: true } From 10d7f76e1390aeb34c3c794acf701de0cf683061 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 30 Oct 2026 17:51:00 +0000 Subject: [PATCH 2/5] fix(signals): gate the custom-equals netting on the verdict engine Only isPending/latest read the netted test before a commit, so the write-back staging is gated on observeFlightHook and bundles without the verdict engine pay 0 B. Drops the floor re-records and Size-Exception. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_015hPxMkC3jg3Uivh65gvaf2 --- packages/signals/src/core/core.ts | 17 +++++++-- scripts/size/floor-caps.json | 14 ++++---- scripts/size/scenarios.js | 58 +++++++++++-------------------- 3 files changed, 42 insertions(+), 47 deletions(-) diff --git a/packages/signals/src/core/core.ts b/packages/signals/src/core/core.ts index 4516f26bf8..993915632b 100644 --- a/packages/signals/src/core/core.ts +++ b/packages/signals/src/core/core.ts @@ -2496,8 +2496,11 @@ export function setSignal(el: Signal | Computed, v: T | ((prev: T) => T // user comparator must not run against `undefined` (matches recompute). // D-41: a write over a shown error is a change whatever the last good // value was — the error leaves at its commit (`commitPendingNode`). - const settled = !((el as Computed)._statusFlags & STATUS_UNINITIALIZED || el._x?._shownError); - if (settled && isSame(el, currentValue, v)) return v; + const valueChanged = + !!((el as Computed)._statusFlags & STATUS_UNINITIALIZED) || + !!el._x?._shownError || + !isSame(el, currentValue, v); + if (!valueChanged) return v; // Attribution hook: this committed write is where a re-run chain begins. if (__OBSERVE__ && attrHooks !== null) attrHooks.write(el, currentValue, v); @@ -2522,7 +2525,15 @@ export function setSignal(el: Signal | Computed, v: T | ((prev: T) => T // committed value nets to it; staging the committed value itself lets // every netted test (`_pendingValue === _value`) see writes that made no // proposal. (Unstaged, the gate above already compared it.) - el._pendingValue = settled && wasStaged && isSame(el, el._value, v) ? el._value : v; + // The netted test reads it only with the verdict engine (`isPending`, + // `latest`): a build without it stages `v` as written. + el._pendingValue = + observeFlightHook && + wasStaged && + !((el as Computed)._statusFlags & STATUS_UNINITIALIZED || el._x?._shownError) && + isSame(el, el._value, v) + ? el._value + : v; // A28 arm, gated on the load the write already pays for (`context`); the // arm itself is a cold helper so setSignal stays within every setter's // inlining budget, ~300 B bytecode. diff --git a/scripts/size/floor-caps.json b/scripts/size/floor-caps.json index 59d13b5e68..b797b2a3d9 100644 --- a/scripts/size/floor-caps.json +++ b/scripts/size/floor-caps.json @@ -1,23 +1,23 @@ { "signals: core floor (createSignal/Memo/Effect/Root/flush)": { "cap": "7.43 KB", - "minified": 19954 + "minified": 19908 }, "app: render + one signal (the simple-app floor)": { - "cap": "9.81 KB", - "minified": 26785 + "cap": "9.78 KB", + "minified": 26739 }, "app: hydrating (no stores) with Show/For/Loading/Errored/lazy": { - "cap": "18.77 KB", - "minified": 53638 + "cap": "18.74 KB", + "minified": 53607 }, "page: base server components (hydrating + dynamic + frames + sf reference)": { "cap": "33.77 KB", - "minified": 101678 + "minified": 101638 }, "page: live server components (base + live/GET + action + isPending/latest)": { "cap": "38.91 KB", - "minified": 117575 + "minified": 117544 }, "server: floor (getRequestEvent + isServer)": { "cap": "1.29 KB", diff --git a/scripts/size/scenarios.js b/scripts/size/scenarios.js index 40f8eb59a6..88bd026634 100644 --- a/scripts/size/scenarios.js +++ b/scripts/size/scenarios.js @@ -606,7 +606,6 @@ module.exports = [ // B; CI-measured at 7,416 B (19,907 B minified). Lower only: cap at // measured + 10 B rounded up to 0.01 KB; recorded minified never raised. // Batch re-record (2026-10-30, next @ 32163a9, size job 123956613767): cap unchanged, recorded minified 19,907 -> 19,908 B, measured in CI at 7,415 B brotli. Growth is the 2026-10-30 merges (#4424, #4436, #4416, #4442); #4416's truncation sweep is the +19 B minified on the hydrating scenarios. Cap at measured + 10 B rounded up to 0.01 KB where over; recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): cap unchanged at 7.43 KB, recorded minified 19,908 -> 19,954 B (+46 B), measured locally (linux) at 7,424 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: floorCaps["signals: core floor (createSignal/Memo/Effect/Root/flush)"], capMinified: floorMinified["signals: core floor (createSignal/Memo/Effect/Root/flush)"], alias @@ -1120,9 +1119,8 @@ module.exports = [ // 0.01 KB; recorded minified never raised. // A tick whose writes net to the committed value pends no errored re-run (D-8, async-gen rerun on 5e68925c) (2026-10-30, over next @ 7135a77a): 14.89 -> 14.95 KB, recorded minified 43,875 -> 43,888 B (+13 B), measured locally (linux) at 14,932 B brotli. A signal read whose staging equals its committed value is not a read of the frame's future (`read`): +13 B minified, the rest brotli layout. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // Batch re-record after the 2026-10-30 merges (#4454, #4457, #4461; over next @ 563b6b0): 14.95 KB -> 14.97 KB, recorded minified 43,888 -> 43,924 B (+36 B), measured locally (linux) at 14,951 B brotli. Growth is #4454's `stagedScreen` held-node check (+20 B minified in core.js) and #4457's same-error skip in `errorFamily`; together they put next over this cap. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): 14.97 KB -> 15.00 KB, recorded minified 43,924 -> 43,961 B (+37 B), measured locally (linux) at 14,988 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - limit: "15.00 KB", - capMinified: 43961, + limit: "14.97 KB", + capMinified: 43924, alias }, { @@ -1447,10 +1445,10 @@ module.exports = [ // D-28's verdict-seat reset compares holds, not lane objects: a seated leaf reading a merged transaction's verdict lane stays the hold's verdict reader (`laneRead`) (#4427, #4455, 2026-10-30, over next @ cddaa76): 11.10 KB -> 11.12 KB, recorded minified 30,596 -> 30,641 B (+45 B), measured locally (linux) at 11,109 B brotli. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A staged error reaches the memos and derived stores that derive from it (#4456, 2026-10-30, re-measured over next @ b773146): 11.12 KB -> 11.17 KB, recorded minified 30,641 -> 30,771 B (+130 B), measured locally (linux) at 11,153 B brotli. The settle walk marks a derivation of a staged error with it, and a derived store's family hears it (D-41), with the verdict engine alone. Correctness; Size-Exception in #4456. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A verdict reader born into a hold joins it at its re-pass (#4471, #4467, 2026-10-30, re-measured over next @ 749b0d7): cap unchanged at 11.17 KB, recorded minified 30,771 -> 30,800 B (+29 B), measured locally (linux) at 11,166 B brotli. Correctness (D-25, D-13); Size-Exception in #4471 for the floor. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): 11.17 KB -> 11.19 KB, recorded minified 30,800 -> 30,831 B (+31 B), measured locally (linux) at 11,176 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + // Custom-equals write-backs net with the verdict engine (D-8, #4483, 2026-10-30, over next @ 663ecb0a): 11.17 KB -> 11.19 KB, recorded minified 30,800 -> 30,843 B (+43 B), measured locally (linux) at 11,180 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, gated on the verdict engine (bundles without isPending/latest pay 0 B). Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "11.19 KB", // latest() read inline and through a memo show the same screen (#4284 through a memo; a plain write beside an async memo), 2026-10-29, over next @ 7ebd4a32: recorded minified 28,693 -> 29,086 B (+343 B minified over next), measured locally (linux) at 10,565 B brotli (+135 B over next). A render effect a verdict memo's change re-runs reads as its verdict reader for that pass (`laneDirty`), a pass that read a staging before the frame had a transaction re-derives once as a verdict reader only if the frame parks, `latest()` of a first load in flight in a verdict lane is loading (also through an identity memo, a derived store and `isPending`), a lane's dissolution leaves such a load and the nodes pending on it uninitialized instead of committing `undefined`, a verdict lane born at a seam is judged at it, a pass born in a staged reader stays the frame's on a verdict-memo read (C4, #4010), a plain write beside `latest()` computes once (the seam re-derives a pre-transaction staged reader only if the frame parks), a verdict reader's plain read of a staging in a transaction only a `latest()` opened is the frame's read, so a memo of `latest()` computes once too (D-22; not a pass with no value yet, D-6), and an error stays the display while the memo it came through re-asks, a Loading fallback behind it included (D-39, async-gen 91501 #1831). recompute's CONFIG_VERDICT clear now sits behind the lane engine: -21 B minified on every floor. Correctness; the maintainer: "only flag me if brotli goes more than 20kb" (2026-10-29). Cap unchanged; recorded minified = measured. - capMinified: 30831, + capMinified: 30843, alias }, { @@ -1497,9 +1495,8 @@ module.exports = [ // (21,719 B minified). Lower only: cap at measured + 10 B rounded up to // 0.01 KB; recorded minified never raised. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 21,719 -> 21,732 B (+13 B), measured locally (linux) at 8,043 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): cap unchanged at 8.06 KB, recorded minified 21,732 -> 21,765 B (+33 B), measured locally (linux) at 8,060 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "8.06 KB", - capMinified: 21765 + capMinified: 21732 }, { name: "app: render + one signal (the simple-app floor)", @@ -1763,7 +1760,6 @@ module.exports = [ // 9.78 KB, recorded minified 26,738 -> 26,739 B; CI-measured at 9,769 B // (26,739 B minified). Lower only: cap at measured + 10 B rounded up to // 0.01 KB; recorded minified never raised. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): 9.78 KB -> 9.81 KB, recorded minified 26,739 -> 26,785 B (+46 B), measured locally (linux) at 9,795 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: floorCaps["app: render + one signal (the simple-app floor)"], capMinified: floorMinified["app: render + one signal (the simple-app floor)"], alias @@ -2166,7 +2162,6 @@ module.exports = [ // measured + 10 B rounded up to 0.01 KB; recorded minified never raised. // Batch re-record (2026-10-30, next @ 32163a9, size job 123956613767): 18.72 KB -> 18.74 KB, recorded minified 53,566 -> 53,585 B, measured in CI at 18,726 B brotli. Growth is the 2026-10-30 merges (#4424, #4436, #4416, #4442); #4416's truncation sweep is the +19 B minified on the hydrating scenarios. Cap at measured + 10 B rounded up to 0.01 KB where over; recorded minified = measured. // #4428 fallback memo lazy (+7 B over next, which sits +15 over this record): cap unchanged at 18.74 KB; minified 53,585 -> 53,607 (+22), brotli 18,752 (Size-Exception) - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): 18.74 KB -> 18.77 KB, recorded minified 53,607 -> 53,638 B (+31 B), measured locally (linux) at 18,759 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: floorCaps["app: hydrating (no stores) with Show/For/Loading/Errored/lazy"], capMinified: floorMinified["app: hydrating (no stores) with Show/For/Loading/Errored/lazy"], alias @@ -2746,12 +2741,11 @@ module.exports = [ // A held memo's parked reader re-derives at the seam (#4439, 2026-10-30, over next @ b249ad96): 32.42 KB -> 32.45 KB, recorded minified 98,607 -> 98,689 B (+82 B), measured locally (linux) at 32,433 B brotli. `laneSeams` also re-derives a reader whose pass read a held node, so `isPending` of a memo parked behind a held one turns true. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 98,689 -> 98,387 B (-302 B), measured locally (linux) at 32,372 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. // D-28's verdict-seat reset compares holds, not lane objects: a seated leaf reading a merged transaction's verdict lane stays the hold's verdict reader (`laneRead`) (#4427, #4455, 2026-10-30, over next @ cddaa76): 32.45 KB -> 32.48 KB, recorded minified 98,387 -> 98,432 B (+45 B), measured locally (linux) at 32,465 B brotli. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): cap unchanged at 32.48 KB, recorded minified 98,432 -> 98,478 B (+46 B), measured locally (linux) at 32,437 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "32.48 KB", // An Errored heals when the last reader that caught its error is disposed (#4373, #4384, 2026-10-28, re-recorded over next @ cbc0eebd): recorded minified 96,989 -> 97,047 B (+58 B minified over next's record), measured locally (linux) at 31,811 B brotli. Recorded minified = measured; CI re-bases. // Boundary readers keyed by the source they wait on (#4373), with enterLane's tail folded into one else-chain as an offset (-29 B on lane pages) (#4384, 2026-10-28, re-recorded over next @ 1b32ff2e): recorded minified 97,024 -> 97,045 B (+21 B minified over next's record), measured locally (linux) at 31,798 B brotli. Recorded minified = measured; CI re-bases. // latest() read inline and through a memo show the same screen (#4284 through a memo; a plain write beside an async memo), 2026-10-29, over next @ 7ebd4a32: recorded minified 97,045 -> 97,426 B (+240 B minified over next), measured locally (linux) at 31,976 B brotli (+109 B over next). A render effect a verdict memo's change re-runs reads as its verdict reader for that pass (`laneDirty`), a pass that read a staging before the frame had a transaction re-derives once as a verdict reader only if the frame parks, `latest()` of a first load in flight in a verdict lane is loading (also through an identity memo, a derived store and `isPending`), a lane's dissolution leaves such a load and the nodes pending on it uninitialized instead of committing `undefined`, a verdict lane born at a seam is judged at it, a pass born in a staged reader stays the frame's on a verdict-memo read (C4, #4010), a plain write beside `latest()` computes once (the seam re-derives a pre-transaction staged reader only if the frame parks), a verdict reader's plain read of a staging in a transaction only a `latest()` opened is the frame's read, so a memo of `latest()` computes once too (D-22; not a pass with no value yet, D-6), and an error stays the display while the memo it came through re-asks, a Loading fallback behind it included (D-39, async-gen 91501 #1831). recompute's CONFIG_VERDICT clear now sits behind the lane engine: -21 B minified on every floor. Correctness; the maintainer: "only flag me if brotli goes more than 20kb" (2026-10-29). Cap unchanged; recorded minified = measured. - capMinified: 98478, + capMinified: 98432, alias }, { @@ -3051,9 +3045,8 @@ module.exports = [ // measured + 10 B rounded up to 0.01 KB; recorded minified never raised. // Batch re-record (2026-10-30, next @ 32163a9, size job 123956613767): cap unchanged, recorded minified 37,014 -> 37,015 B, measured in CI at 13,423 B brotli. Growth is the 2026-10-30 merges (#4424, #4436, #4416, #4442); #4416's truncation sweep is the +19 B minified on the hydrating scenarios. Cap at measured + 10 B rounded up to 0.01 KB where over; recorded minified = measured. // A tick whose writes net to the committed value pends no errored re-run (D-8, async-gen rerun on 5e68925c) (2026-10-30, over next @ 7135a77a): 13.43 -> 13.47 KB, recorded minified 37,015 -> 37,028 B (+13 B), measured locally (linux) at 13,451 B brotli. A signal read whose staging equals its committed value is not a read of the frame's future (`read`): +13 B minified, the rest brotli layout. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): cap unchanged at 13.47 KB, recorded minified 37,028 -> 37,068 B (+40 B), measured locally (linux) at 13,435 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "13.47 KB", - capMinified: 37068, + capMinified: 37028, alias }, { @@ -3405,9 +3398,8 @@ module.exports = [ // measured + 10 B rounded up to 0.01 KB; recorded minified never raised. // Batch re-record (2026-10-30, next @ 32163a9, size job 123956613767): cap unchanged, recorded minified 41,968 -> 41,969 B, measured in CI at 15,193 B brotli. Growth is the 2026-10-30 merges (#4424, #4436, #4416, #4442); #4416's truncation sweep is the +19 B minified on the hydrating scenarios. Cap at measured + 10 B rounded up to 0.01 KB where over; recorded minified = measured. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 41,969 -> 41,982 B (+13 B), measured locally (linux) at 15,180 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): cap unchanged at 15.20 KB, recorded minified 41,982 -> 42,022 B (+40 B), measured locally (linux) at 15,196 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "15.20 KB", - capMinified: 42022, + capMinified: 41982, alias: observeAlias }, { @@ -3913,9 +3905,8 @@ module.exports = [ // (88,303 B minified). Lower only: cap at measured + 10 B rounded up to // 0.01 KB; recorded minified never raised. // A tick whose writes net to the committed value pends no errored re-run (D-8, async-gen rerun on 5e68925c) (2026-10-30, over next @ 7135a77a): 29.74 -> 29.78 KB, recorded minified 88,303 -> 88,316 B (+13 B), measured locally (linux) at 29,762 B brotli. A signal read whose staging equals its committed value is not a read of the frame's future (`read`): +13 B minified, the rest brotli layout. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): 29.78 KB -> 29.80 KB, recorded minified 88,316 -> 88,356 B (+40 B), measured locally (linux) at 29,788 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - limit: "29.80 KB", - capMinified: 88356, + limit: "29.78 KB", + capMinified: 88316, alias: observeAlias }, // Compiled-template scenarios (2026-10-05): the four `app:` fixtures above @@ -4013,9 +4004,8 @@ module.exports = [ // measured + 10 B rounded up to 0.01 KB; recorded minified never raised. // Batch re-record (2026-10-30, next @ 32163a9, size job 123956613767): cap unchanged, recorded minified 27,270 -> 27,271 B, measured in CI at 9,961 B brotli. Growth is the 2026-10-30 merges (#4424, #4436, #4416, #4442); #4416's truncation sweep is the +19 B minified on the hydrating scenarios. Cap at measured + 10 B rounded up to 0.01 KB where over; recorded minified = measured. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 27,271 -> 27,284 B (+13 B), measured locally (linux) at 9,963 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): cap unchanged at 9.98 KB, recorded minified 27,284 -> 27,317 B (+33 B), measured locally (linux) at 9,979 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "9.98 KB", - capMinified: 27317, + capMinified: 27284, alias }, { @@ -4156,9 +4146,8 @@ module.exports = [ // 0.01 KB; recorded minified never raised. // A tick whose writes net to the committed value pends no errored re-run (D-8, async-gen rerun on 5e68925c) (2026-10-30, over next @ 7135a77a): 26.27 -> 26.31 KB, recorded minified 79,986 -> 79,999 B (+13 B), measured locally (linux) at 26,294 B brotli. A signal read whose staging equals its committed value is not a read of the frame's future (`read`): +13 B minified, the rest brotli layout. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // Batch re-record after the 2026-10-30 merges (#4454, #4457, #4461; over next @ 563b6b0): 26.31 KB -> 26.33 KB, recorded minified 79,999 -> 80,035 B (+36 B), measured locally (linux) at 26,312 B brotli. Growth is #4454's `stagedScreen` held-node check (+20 B minified in core.js) and #4457's same-error skip in `errorFamily`; together they put next over this cap. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): cap unchanged at 26.33 KB, recorded minified 80,035 -> 80,079 B (+44 B), measured locally (linux) at 26,302 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "26.33 KB", - capMinified: 80079, + capMinified: 80035, alias }, { @@ -4333,9 +4322,8 @@ module.exports = [ // A tick whose writes net to the committed value pends no errored re-run (D-8, async-gen rerun on 5e68925c) (2026-10-30, over next @ 7135a77a): 32.43 -> 32.52 KB, recorded minified 100,748 -> 100,761 B (+13 B), measured locally (linux) at 32,508 B brotli. A signal read whose staging equals its committed value is not a read of the frame's future (`read`): +13 B minified, the rest brotli layout. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 100,761 -> 100,797 B (+36 B), measured locally (linux) at 32,473 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. // A propagated error reaches a derived store's readers once (#4463, 2026-10-30, over next @ 131ceb8c): 32.52 KB -> 32.54 KB, recorded minified 100,797 -> 100,803 B (+6 B), measured locally (linux) at 32,522 B brotli. familyStatus hands the error to errorFamily so a reader its derive's pass already handed it is skipped; the brotli move is layout from +2 B minified. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): cap unchanged at 32.54 KB, recorded minified 100,803 -> 100,841 B (+38 B), measured locally (linux) at 32,484 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "32.54 KB", - capMinified: 100841, + capMinified: 100803, alias }, { @@ -5272,7 +5260,6 @@ module.exports = [ // (101,605 B minified). Lower only: cap at measured + 10 B rounded up to // 0.01 KB; recorded minified never raised. // A verdict reader born into a hold reads it whichever flush runs it (#4426, D-25/D-27; re-measured over next @ 9c4e4a8): 33.66 KB -> 33.77 KB, recorded minified 101,605 -> 101,638 B, measured locally (linux) at 33,755 B brotli. `stagedScreen`'s held-node check (+20 B minified in core.js) on top of next's +13 B over this floor's record (#4452); the brotli is layout. Correctness; a frozen floor, Size-Exception in the PR body. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): cap unchanged at 33.77 KB, recorded minified 101,638 -> 101,678 B (+40 B), measured locally (linux) at 33,757 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: floorCaps["page: base server components (hydrating + dynamic + frames + sf reference)"], capMinified: floorMinified["page: base server components (hydrating + dynamic + frames + sf reference)"], @@ -5631,7 +5618,6 @@ module.exports = [ // D-28's verdict-seat reset compares holds, not lane objects: a seated leaf reading a merged transaction's verdict lane stays the hold's verdict reader (`laneRead`) (#4427, #4455, 2026-10-30, over next @ cddaa76): 38.83 KB -> 38.85 KB, recorded minified 117,331 -> 117,376 B (+45 B), measured locally (linux) at 38,839 B brotli. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A staged error reaches the memos and derived stores that derive from it (#4456, 2026-10-30, re-measured over next @ b773146): cap unchanged at 38.85 KB, recorded minified 117,376 -> 117,514 B (+138 B), measured locally (linux) at 38,849 B brotli. The settle walk marks a derivation of a staged error with it, and a derived store's family hears it (D-41), with the verdict engine alone. Correctness; Size-Exception in #4456. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A verdict reader born into a hold joins it at its re-pass (#4471, #4467, 2026-10-30, re-measured over next @ 749b0d7): 38.85 KB -> 38.91 KB, recorded minified 117,514 -> 117,544 B (+30 B), measured locally (linux) at 38,898 B brotli. Correctness (D-25, D-13); Size-Exception in #4471 for the floor. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): cap unchanged at 38.91 KB, recorded minified 117,544 -> 117,575 B (+31 B), measured locally (linux) at 38,903 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: floorCaps["page: live server components (base + live/GET + action + isPending/latest)"], capMinified: floorMinified["page: live server components (base + live/GET + action + isPending/latest)"], @@ -5802,9 +5788,8 @@ module.exports = [ // (107,974 B minified). Lower only: cap at measured + 10 B rounded up to // 0.01 KB; recorded minified never raised. // A verdict reader born into a hold reads it whichever flush runs it (#4426, D-25/D-27; re-measured over next @ 9c4e4a8): 35.66 KB -> 35.72 KB, recorded minified 107,974 -> 108,007 B (+33 B), measured locally (linux) at 35,702 B brotli. `stagedScreen`'s held-node check (+20 B minified in core.js) on top of next's +13 B; the brotli is layout. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): cap unchanged at 35.72 KB, recorded minified 108,007 -> 108,047 B (+40 B), measured locally (linux) at 35,679 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "35.72 KB", - capMinified: 108047, + capMinified: 108007, alias: pageAlias }, { @@ -5952,12 +5937,12 @@ module.exports = [ // #4428 fallback memo lazy (+7 B over next @ ab3d2add, which sits +15 over this record; 2026-10-30): 42.73 KB -> 42.75 KB, recorded minified 125,518 -> 125,540 B (+22 B), measured locally (linux) at 42,735 B brotli. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A staged error reaches the memos and derived stores that derive from it (#4456, 2026-10-30, re-measured over next @ b773146): 42.75 KB -> 42.79 KB, recorded minified 125,540 -> 125,655 B (+115 B), measured locally (linux) at 42,777 B brotli. The settle walk marks a derivation of a staged error with it, and a derived store's family hears it (D-41), with the verdict engine alone. Correctness; Size-Exception in #4456. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A verdict reader born into a hold joins it at its re-pass (#4471, #4467, 2026-10-30, re-measured over next @ 749b0d7): 42.79 KB -> 42.83 KB, recorded minified 125,655 -> 125,684 B (+29 B), measured locally (linux) at 42,817 B brotli. Correctness (D-25, D-13); Size-Exception in #4471 for the floor. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): 42.83 KB -> 42.85 KB, recorded minified 125,684 -> 125,715 B (+31 B), measured locally (linux) at 42,833 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - limit: "42.85 KB", + // Custom-equals write-backs net with the verdict engine (D-8, #4483, 2026-10-30, over next @ 663ecb0a): cap unchanged at 42.83 KB, recorded minified 125,684 -> 125,727 B (+43 B), measured locally (linux) at 42,815 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, gated on the verdict engine (bundles without isPending/latest pay 0 B). Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + limit: "42.83 KB", // An Errored heals when the last reader that caught its error is disposed (#4373, #4384, 2026-10-28, re-recorded over next @ cbc0eebd): recorded minified 123,191 -> 123,249 B (+58 B minified over next's record), measured locally (linux) at 41,899 B brotli. Recorded minified = measured; CI re-bases. // Boundary readers keyed by the source they wait on (#4373), with enterLane's tail folded into one else-chain as an offset (-29 B on lane pages) (#4384, 2026-10-28, re-recorded over next @ 1b32ff2e): recorded minified 123,203 -> 123,224 B (+21 B minified over next's record), measured locally (linux) at 41,966 B brotli. Recorded minified = measured; CI re-bases. // latest() read inline and through a memo show the same screen (#4284 through a memo; a plain write beside an async memo), 2026-10-29, over next @ 7ebd4a32: recorded minified 123,224 -> 123,733 B (+403 B minified over next), measured locally (linux) at 42,119 B brotli (+169 B over next). A render effect a verdict memo's change re-runs reads as its verdict reader for that pass (`laneDirty`), a pass that read a staging before the frame had a transaction re-derives once as a verdict reader only if the frame parks, `latest()` of a first load in flight in a verdict lane is loading (also through an identity memo, a derived store and `isPending`), a lane's dissolution leaves such a load and the nodes pending on it uninitialized instead of committing `undefined`, a verdict lane born at a seam is judged at it, a pass born in a staged reader stays the frame's on a verdict-memo read (C4, #4010), a plain write beside `latest()` computes once (the seam re-derives a pre-transaction staged reader only if the frame parks), a verdict reader's plain read of a staging in a transaction only a `latest()` opened is the frame's read, so a memo of `latest()` computes once too (D-22; not a pass with no value yet, D-6), and an error stays the display while the memo it came through re-asks, a Loading fallback behind it included (D-39, async-gen 91501 #1831). recompute's CONFIG_VERDICT clear now sits behind the lane engine: -21 B minified on every floor. Correctness; the maintainer: "only flag me if brotli goes more than 20kb" (2026-10-29). Cap unchanged; recorded minified = measured. - capMinified: 125715, + capMinified: 125727, alias: pageAlias }, { @@ -6167,9 +6152,8 @@ module.exports = [ // Batch re-record (2026-10-30, next @ 32163a9, size job 123956613767): 41.16 KB -> 41.23 KB, recorded minified 125,416 -> 125,435 B, measured in CI at 41,215 B brotli. Growth is the 2026-10-30 merges (#4424, #4436, #4416, #4442); #4416's truncation sweep is the +19 B minified on the hydrating scenarios. Cap at measured + 10 B rounded up to 0.01 KB where over; recorded minified = measured. // Batch re-record (2026-10-30, over next @ 563b6b0): cap unchanged, recorded minified 125,435 -> 125,468 B (+33 B), measured locally (linux) at 41,178 B brotli. Growth is the 2026-10-30 merges (#4454, #4457, #4461). Recorded minified = measured. // A propagated error reaches a derived store's readers once (#4463, 2026-10-30, over next @ 131ceb8c): 41.23 KB -> 41.25 KB, recorded minified 125,468 -> 125,470 B (+2 B), measured locally (linux) at 41,231 B brotli. familyStatus hands the error to errorFamily so a reader its derive's pass already handed it is skipped; the brotli move is layout from +2 B minified. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): cap unchanged at 41.25 KB, recorded minified 125,470 -> 125,508 B (+38 B), measured locally (linux) at 41,245 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "41.25 KB", - capMinified: 125508, + capMinified: 125470, alias: pageAlias, conditions: solidConditions, compile: { hydratable: true } @@ -6362,12 +6346,12 @@ module.exports = [ // D-28's verdict-seat reset compares holds, not lane objects: a seated leaf reading a merged transaction's verdict lane stays the hold's verdict reader (`laneRead`) (#4427, #4455, 2026-10-30, over next @ cddaa76): cap unchanged at 48.44 KB, recorded minified 142,735 -> 142,780 B (+45 B), measured locally (linux) at 48,394 B brotli. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A staged error reaches the memos and derived stores that derive from it (#4456, 2026-10-30, re-measured over next @ b773146): 48.44 KB -> 48.51 KB, recorded minified 142,780 -> 142,918 B (+138 B), measured locally (linux) at 48,498 B brotli. The settle walk marks a derivation of a staged error with it, and a derived store's family hears it (D-41), with the verdict engine alone. Correctness; Size-Exception in #4456. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A verdict reader born into a hold joins it at its re-pass (#4471, #4467, 2026-10-30, re-measured over next @ 749b0d7): cap unchanged at 48.51 KB, recorded minified 142,918 -> 142,947 B (+29 B), measured locally (linux) at 48,462 B brotli. Correctness (D-25, D-13); Size-Exception in #4471 for the floor. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - // Writes that net under a custom equals pend nothing (D-8, #4483, 2026-10-30, over next @ 663ecb0a): 48.51 KB -> 48.53 KB, recorded minified 142,947 -> 142,978 B (+31 B), measured locally (linux) at 48,519 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, so it pends nothing. Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - limit: "48.53 KB", + // Custom-equals write-backs net with the verdict engine (D-8, #4483, 2026-10-30, over next @ 663ecb0a): cap unchanged at 48.51 KB, recorded minified 142,947 -> 142,990 B (+43 B), measured locally (linux) at 48,452 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, gated on the verdict engine (bundles without isPending/latest pay 0 B). Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + limit: "48.51 KB", // An Errored heals when the last reader that caught its error is disposed (#4373, #4384, 2026-10-28, re-recorded over next @ cbc0eebd): recorded minified 140,451 -> 140,509 B (+58 B minified over next's record), measured locally (linux) at 47,516 B brotli. Recorded minified = measured; CI re-bases. // Boundary readers keyed by the source they wait on (#4373), with enterLane's tail folded into one else-chain as an offset (-29 B on lane pages) (#4384, 2026-10-28, re-recorded over next @ 1b32ff2e): recorded minified 140,463 -> 140,485 B (+22 B minified over next's record), measured locally (linux) at 47,547 B brotli. Recorded minified = measured; CI re-bases. // latest() read inline and through a memo show the same screen (#4284 through a memo; a plain write beside an async memo), 2026-10-29, over next @ 7ebd4a32: recorded minified 140,485 -> 140,983 B (+405 B minified over next), measured locally (linux) at 47,722 B brotli (+162 B over next). A render effect a verdict memo's change re-runs reads as its verdict reader for that pass (`laneDirty`), a pass that read a staging before the frame had a transaction re-derives once as a verdict reader only if the frame parks, `latest()` of a first load in flight in a verdict lane is loading (also through an identity memo, a derived store and `isPending`), a lane's dissolution leaves such a load and the nodes pending on it uninitialized instead of committing `undefined`, a verdict lane born at a seam is judged at it, a pass born in a staged reader stays the frame's on a verdict-memo read (C4, #4010), a plain write beside `latest()` computes once (the seam re-derives a pre-transaction staged reader only if the frame parks), a verdict reader's plain read of a staging in a transaction only a `latest()` opened is the frame's read, so a memo of `latest()` computes once too (D-22; not a pass with no value yet, D-6), and an error stays the display while the memo it came through re-asks, a Loading fallback behind it included (D-39, async-gen 91501 #1831). recompute's CONFIG_VERDICT clear now sits behind the lane engine: -21 B minified on every floor. Correctness; the maintainer: "only flag me if brotli goes more than 20kb" (2026-10-29). Cap unchanged; recorded minified = measured. - capMinified: 142978, + capMinified: 142990, alias: pageAlias, conditions: solidConditions, compile: { hydratable: true } From 012acdd6b30b0126a031975085d8ac075f5528e8 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 30 Oct 2026 18:14:44 +0000 Subject: [PATCH 3/5] chore(size): re-record over next @ d0fc2851 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_015hPxMkC3jg3Uivh65gvaf2 --- scripts/size/floor-caps.json | 4 ++-- scripts/size/scenarios.js | 12 ++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/scripts/size/floor-caps.json b/scripts/size/floor-caps.json index 0c4f9878e8..2bd6f1e355 100644 --- a/scripts/size/floor-caps.json +++ b/scripts/size/floor-caps.json @@ -16,8 +16,8 @@ "minified": 101638 }, "page: live server components (base + live/GET + action + isPending/latest)": { - "cap": "38.91 KB", - "minified": 117566 + "cap": "38.94 KB", + "minified": 117604 }, "server: floor (getRequestEvent + isServer)": { "cap": "1.29 KB", diff --git a/scripts/size/scenarios.js b/scripts/size/scenarios.js index 7bcbb47f12..d2f2fd5e14 100644 --- a/scripts/size/scenarios.js +++ b/scripts/size/scenarios.js @@ -1446,9 +1446,10 @@ module.exports = [ // A staged error reaches the memos and derived stores that derive from it (#4456, 2026-10-30, re-measured over next @ b773146): 11.12 KB -> 11.17 KB, recorded minified 30,641 -> 30,771 B (+130 B), measured locally (linux) at 11,153 B brotli. The settle walk marks a derivation of a staged error with it, and a derived store's family hears it (D-41), with the verdict engine alone. Correctness; Size-Exception in #4456. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A verdict reader born into a hold joins it at its re-pass (#4471, #4467, 2026-10-30, re-measured over next @ 749b0d7): cap unchanged at 11.17 KB, recorded minified 30,771 -> 30,800 B (+29 B), measured locally (linux) at 11,166 B brotli. Correctness (D-25, D-13); Size-Exception in #4471 for the floor. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A derived store with no live leaf skips its flight's observe (#4479, 2026-10-30, re-measured over next @ 663ecb0): 11.17 KB -> 11.19 KB, recorded minified 30,800 -> 30,822 B (+22 B), measured locally (linux) at 11,177 B brotli. Correctness (F-3, D-11); Size-Exception in #4479 for the floor. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. - limit: "11.19 KB", + // Custom-equals write-backs net with the verdict engine (D-8, #4483, 2026-10-30, over next @ d0fc2851): 11.19 KB -> 11.20 KB, recorded minified 30,822 -> 30,865 B (+43 B), measured locally (linux) at 11,190 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, gated on the verdict engine (bundles without isPending/latest pay 0 B). Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + limit: "11.20 KB", // latest() read inline and through a memo show the same screen (#4284 through a memo; a plain write beside an async memo), 2026-10-29, over next @ 7ebd4a32: recorded minified 28,693 -> 29,086 B (+343 B minified over next), measured locally (linux) at 10,565 B brotli (+135 B over next). A render effect a verdict memo's change re-runs reads as its verdict reader for that pass (`laneDirty`), a pass that read a staging before the frame had a transaction re-derives once as a verdict reader only if the frame parks, `latest()` of a first load in flight in a verdict lane is loading (also through an identity memo, a derived store and `isPending`), a lane's dissolution leaves such a load and the nodes pending on it uninitialized instead of committing `undefined`, a verdict lane born at a seam is judged at it, a pass born in a staged reader stays the frame's on a verdict-memo read (C4, #4010), a plain write beside `latest()` computes once (the seam re-derives a pre-transaction staged reader only if the frame parks), a verdict reader's plain read of a staging in a transaction only a `latest()` opened is the frame's read, so a memo of `latest()` computes once too (D-22; not a pass with no value yet, D-6), and an error stays the display while the memo it came through re-asks, a Loading fallback behind it included (D-39, async-gen 91501 #1831). recompute's CONFIG_VERDICT clear now sits behind the lane engine: -21 B minified on every floor. Correctness; the maintainer: "only flag me if brotli goes more than 20kb" (2026-10-29). Cap unchanged; recorded minified = measured. - capMinified: 30822, + capMinified: 30865, alias }, { @@ -5619,6 +5620,7 @@ module.exports = [ // A staged error reaches the memos and derived stores that derive from it (#4456, 2026-10-30, re-measured over next @ b773146): cap unchanged at 38.85 KB, recorded minified 117,376 -> 117,514 B (+138 B), measured locally (linux) at 38,849 B brotli. The settle walk marks a derivation of a staged error with it, and a derived store's family hears it (D-41), with the verdict engine alone. Correctness; Size-Exception in #4456. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A verdict reader born into a hold joins it at its re-pass (#4471, #4467, 2026-10-30, re-measured over next @ 749b0d7): 38.85 KB -> 38.91 KB, recorded minified 117,514 -> 117,544 B (+30 B), measured locally (linux) at 38,898 B brotli. Correctness (D-25, D-13); Size-Exception in #4471 for the floor. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A derived store with no live leaf skips its flight's observe (#4479, 2026-10-30, re-measured over next @ 663ecb0): cap unchanged at 38.91 KB, recorded minified 117,544 -> 117,566 B (+22 B), measured locally (linux) at 38,849 B brotli. Correctness (F-3, D-11); Size-Exception in #4479 for the floor. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + // Custom-equals write-backs net with the verdict engine (D-8, #4483, 2026-10-30, over next @ d0fc2851): 38.91 KB -> 38.94 KB, recorded minified 117,566 -> 117,604 B (+38 B), measured locally (linux) at 38,930 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, gated on the verdict engine (bundles without isPending/latest pay 0 B). Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: floorCaps["page: live server components (base + live/GET + action + isPending/latest)"], capMinified: floorMinified["page: live server components (base + live/GET + action + isPending/latest)"], @@ -5939,11 +5941,12 @@ module.exports = [ // A staged error reaches the memos and derived stores that derive from it (#4456, 2026-10-30, re-measured over next @ b773146): 42.75 KB -> 42.79 KB, recorded minified 125,540 -> 125,655 B (+115 B), measured locally (linux) at 42,777 B brotli. The settle walk marks a derivation of a staged error with it, and a derived store's family hears it (D-41), with the verdict engine alone. Correctness; Size-Exception in #4456. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A verdict reader born into a hold joins it at its re-pass (#4471, #4467, 2026-10-30, re-measured over next @ 749b0d7): 42.79 KB -> 42.83 KB, recorded minified 125,655 -> 125,684 B (+29 B), measured locally (linux) at 42,817 B brotli. Correctness (D-25, D-13); Size-Exception in #4471 for the floor. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A derived store with no live leaf skips its flight's observe (#4479, 2026-10-30, re-measured over next @ 663ecb0): cap unchanged at 42.83 KB, recorded minified 125,684 -> 125,706 B (+22 B), measured locally (linux) at 42,822 B brotli. Correctness (F-3, D-11); Size-Exception in #4479 for the floor. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + // Custom-equals write-backs net with the verdict engine (D-8, #4483, 2026-10-30, over next @ d0fc2851): cap unchanged at 42.83 KB, recorded minified 125,706 -> 125,749 B (+43 B), measured locally (linux) at 42,820 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, gated on the verdict engine (bundles without isPending/latest pay 0 B). Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "42.83 KB", // An Errored heals when the last reader that caught its error is disposed (#4373, #4384, 2026-10-28, re-recorded over next @ cbc0eebd): recorded minified 123,191 -> 123,249 B (+58 B minified over next's record), measured locally (linux) at 41,899 B brotli. Recorded minified = measured; CI re-bases. // Boundary readers keyed by the source they wait on (#4373), with enterLane's tail folded into one else-chain as an offset (-29 B on lane pages) (#4384, 2026-10-28, re-recorded over next @ 1b32ff2e): recorded minified 123,203 -> 123,224 B (+21 B minified over next's record), measured locally (linux) at 41,966 B brotli. Recorded minified = measured; CI re-bases. // latest() read inline and through a memo show the same screen (#4284 through a memo; a plain write beside an async memo), 2026-10-29, over next @ 7ebd4a32: recorded minified 123,224 -> 123,733 B (+403 B minified over next), measured locally (linux) at 42,119 B brotli (+169 B over next). A render effect a verdict memo's change re-runs reads as its verdict reader for that pass (`laneDirty`), a pass that read a staging before the frame had a transaction re-derives once as a verdict reader only if the frame parks, `latest()` of a first load in flight in a verdict lane is loading (also through an identity memo, a derived store and `isPending`), a lane's dissolution leaves such a load and the nodes pending on it uninitialized instead of committing `undefined`, a verdict lane born at a seam is judged at it, a pass born in a staged reader stays the frame's on a verdict-memo read (C4, #4010), a plain write beside `latest()` computes once (the seam re-derives a pre-transaction staged reader only if the frame parks), a verdict reader's plain read of a staging in a transaction only a `latest()` opened is the frame's read, so a memo of `latest()` computes once too (D-22; not a pass with no value yet, D-6), and an error stays the display while the memo it came through re-asks, a Loading fallback behind it included (D-39, async-gen 91501 #1831). recompute's CONFIG_VERDICT clear now sits behind the lane engine: -21 B minified on every floor. Correctness; the maintainer: "only flag me if brotli goes more than 20kb" (2026-10-29). Cap unchanged; recorded minified = measured. - capMinified: 125706, + capMinified: 125749, alias: pageAlias }, { @@ -6348,11 +6351,12 @@ module.exports = [ // A staged error reaches the memos and derived stores that derive from it (#4456, 2026-10-30, re-measured over next @ b773146): 48.44 KB -> 48.51 KB, recorded minified 142,780 -> 142,918 B (+138 B), measured locally (linux) at 48,498 B brotli. The settle walk marks a derivation of a staged error with it, and a derived store's family hears it (D-41), with the verdict engine alone. Correctness; Size-Exception in #4456. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A verdict reader born into a hold joins it at its re-pass (#4471, #4467, 2026-10-30, re-measured over next @ 749b0d7): cap unchanged at 48.51 KB, recorded minified 142,918 -> 142,947 B (+29 B), measured locally (linux) at 48,462 B brotli. Correctness (D-25, D-13); Size-Exception in #4471 for the floor. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. // A derived store with no live leaf skips its flight's observe (#4479, 2026-10-30, re-measured over next @ 663ecb0): cap unchanged at 48.51 KB, recorded minified 142,947 -> 142,969 B (+22 B), measured locally (linux) at 48,496 B brotli. Correctness (F-3, D-11); Size-Exception in #4479 for the floor. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. + // Custom-equals write-backs net with the verdict engine (D-8, #4483, 2026-10-30, over next @ d0fc2851): cap unchanged at 48.51 KB, recorded minified 142,969 -> 143,012 B (+43 B), measured locally (linux) at 48,486 B brotli. A staged rewrite the comparator calls equal to the committed value stages the committed value itself, gated on the verdict engine (bundles without isPending/latest pay 0 B). Correctness. Cap at measured + 10 B rounded up to 0.01 KB; recorded minified = measured. limit: "48.51 KB", // An Errored heals when the last reader that caught its error is disposed (#4373, #4384, 2026-10-28, re-recorded over next @ cbc0eebd): recorded minified 140,451 -> 140,509 B (+58 B minified over next's record), measured locally (linux) at 47,516 B brotli. Recorded minified = measured; CI re-bases. // Boundary readers keyed by the source they wait on (#4373), with enterLane's tail folded into one else-chain as an offset (-29 B on lane pages) (#4384, 2026-10-28, re-recorded over next @ 1b32ff2e): recorded minified 140,463 -> 140,485 B (+22 B minified over next's record), measured locally (linux) at 47,547 B brotli. Recorded minified = measured; CI re-bases. // latest() read inline and through a memo show the same screen (#4284 through a memo; a plain write beside an async memo), 2026-10-29, over next @ 7ebd4a32: recorded minified 140,485 -> 140,983 B (+405 B minified over next), measured locally (linux) at 47,722 B brotli (+162 B over next). A render effect a verdict memo's change re-runs reads as its verdict reader for that pass (`laneDirty`), a pass that read a staging before the frame had a transaction re-derives once as a verdict reader only if the frame parks, `latest()` of a first load in flight in a verdict lane is loading (also through an identity memo, a derived store and `isPending`), a lane's dissolution leaves such a load and the nodes pending on it uninitialized instead of committing `undefined`, a verdict lane born at a seam is judged at it, a pass born in a staged reader stays the frame's on a verdict-memo read (C4, #4010), a plain write beside `latest()` computes once (the seam re-derives a pre-transaction staged reader only if the frame parks), a verdict reader's plain read of a staging in a transaction only a `latest()` opened is the frame's read, so a memo of `latest()` computes once too (D-22; not a pass with no value yet, D-6), and an error stays the display while the memo it came through re-asks, a Loading fallback behind it included (D-39, async-gen 91501 #1831). recompute's CONFIG_VERDICT clear now sits behind the lane engine: -21 B minified on every floor. Correctness; the maintainer: "only flag me if brotli goes more than 20kb" (2026-10-29). Cap unchanged; recorded minified = measured. - capMinified: 142969, + capMinified: 143012, alias: pageAlias, conditions: solidConditions, compile: { hydratable: true } From 932dff95f53596e9879e5b59a85389cab74d271e Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 30 Oct 2026 18:57:50 +0000 Subject: [PATCH 4/5] perf(signals): skip the custom-equals netting under the default comparator A rewrite loop over a staged signal (CodSpeed propagation:avoidable, updateSignals:update1to1000) ran the uninitialized/shown-error checks and isSame on every write. Under the default comparator only the committed object is equal and `v` is already it, so one load of `_equals` decides. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_015hPxMkC3jg3Uivh65gvaf2 --- packages/signals/src/core/core.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/signals/src/core/core.ts b/packages/signals/src/core/core.ts index 993915632b..81a5cf4ab4 100644 --- a/packages/signals/src/core/core.ts +++ b/packages/signals/src/core/core.ts @@ -2526,10 +2526,13 @@ export function setSignal(el: Signal | Computed, v: T | ((prev: T) => T // every netted test (`_pendingValue === _value`) see writes that made no // proposal. (Unstaged, the gate above already compared it.) // The netted test reads it only with the verdict engine (`isPending`, - // `latest`): a build without it stages `v` as written. + // `latest`): a build without it stages `v` as written. Under the default + // comparator only the committed object itself is equal, and `v` is already + // it, so a rewrite loop pays one load before the comparator runs. el._pendingValue = observeFlightHook && wasStaged && + el._equals !== isEqual && !((el as Computed)._statusFlags & STATUS_UNINITIALIZED || el._x?._shownError) && isSame(el, el._value, v) ? el._value From a7d3453710687aece4879584324e8a1ae28e710d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 30 Oct 2026 20:16:35 +0000 Subject: [PATCH 5/5] perf(signals): share setSignal's comparator test between the gate and D-8 netting CodSpeed (simulation, --no-opt so setSignal runs as Sparkplug code) put `propagation:avoidable` 5.3% behind next: every staged rewrite paid a fresh `_equals` load and a strict compare for the netting, ~120 instructions a write under callgrind, on a bench that is 2,000 staged rewrites per iteration. With the verdict engine installed, `custom` (`_equals !== isEqual`) is now taken once: the gate runs the default comparator's `===` inline instead of calling `isSame`, and the netting tests the local. Without the engine `custom` is `null`, so the gate folds to the plain `isSame` call and the netting away: every store-free / non-verdict client bundle is byte for byte next's (hello world 9,973 B). callgrind, Ir per bench iteration (CodSpeed's V8 flags): next 3,294,205; PR head 3,536,042 (+7.3%); this 3,122,267 (-5.2% vs next). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_015hPxMkC3jg3Uivh65gvaf2 --- packages/signals/src/core/core.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/signals/src/core/core.ts b/packages/signals/src/core/core.ts index 0e8fbae14c..31c6d4f89d 100644 --- a/packages/signals/src/core/core.ts +++ b/packages/signals/src/core/core.ts @@ -2543,10 +2543,17 @@ export function setSignal(el: Signal | Computed, v: T | ((prev: T) => T // user comparator must not run against `undefined` (matches recompute). // D-41: a write over a shown error is a change whatever the last good // value was — the error leaves at its commit (`commitPendingNode`). + // `custom`: with the verdict engine, whether `el` carries a comparator of + // its own — `isSame`'s fast-path test, taken once for this gate and D-8's + // netting below, so the default comparator's `===` runs inline and a + // rewrite loop pays nothing for the netting (CodSpeed `propagation: + // avoidable`). Without the engine it is `null`: the gate folds to the + // plain `isSame` call and the netting away, byte for byte as before. + const custom = observeFlightHook ? el._equals !== isEqual : null; const valueChanged = !!((el as Computed)._statusFlags & STATUS_UNINITIALIZED) || !!el._x?._shownError || - !isSame(el, currentValue, v); + (custom === false ? currentValue !== v : !isSame(el, currentValue, v)); if (!valueChanged) return v; // Attribution hook: this committed write is where a re-run chain begins. @@ -2575,11 +2582,11 @@ export function setSignal(el: Signal | Computed, v: T | ((prev: T) => T // The netted test reads it only with the verdict engine (`isPending`, // `latest`): a build without it stages `v` as written. Under the default // comparator only the committed object itself is equal, and `v` is already - // it, so a rewrite loop pays one load before the comparator runs. + // it, so a rewrite loop pays one local test (`custom`, from the gate). + // (`custom` is truthy only with the engine installed.) el._pendingValue = - observeFlightHook && + custom && wasStaged && - el._equals !== isEqual && !((el as Computed)._statusFlags & STATUS_UNINITIALIZED || el._x?._shownError) && isSame(el, el._value, v) ? el._value