You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
2.0.0-rc.3 | projection leaks after flush while in transition #3074
changed the title [-]2.0.0.rc3 | projection leaks after flush while in transition [/-][+]2.0.0-rc.3 | projection leaks after flush while in transition [/+]on Aug 27, 2026
Fixed in 0e37f90 — thanks for the tight repro, and for filing #3075 alongside it: they turned out to be the two halves of the same isolation gap, in opposite directions.
What was happening: a projection recompute commits its output through the store's adoption channel, which swaps the committed backing eagerly by contract (that's what makes reconcile immediately visible outside transitions). Node-level notifications ride core setSignal and park correctly under the transition — which is why subscribed effects were properly held — but an untracked read serves the backing directly, so p.a showed the speculative value after flush() while count() (whose write parked in the signal's pending slot) correctly stayed committed.
The fix stages a held view: when a projection adoption lands under a live transition, the pre-hold committed backing stays servable, and committed-visibility readers (untracked reads included) keep seeing it until the transition commits. Speculative readers — the derive's own draft, computeds recomputing inside the transaction, and latest() — see the adopted backing, so the transaction still observes itself consistently.
Your repro's log sequence now reads p.a 0 / count 0 after the flush, and both flip to 5 when the action's transition lands.
Activity
[-]2.0.0.rc3 | projection acts[/-][+]2.0.0.rc3 | projection leaks after flush while in transition [/+][-]2.0.0.rc3 | projection leaks after flush while in transition [/-][+]2.0.0-rc.3 | projection leaks after flush while in transition [/+]fix(signals): projection transition isolation and latest() parity (#3074
ryansolid commentedon Aug 27, 2026
Fixed in 0e37f90 — thanks for the tight repro, and for filing #3075 alongside it: they turned out to be the two halves of the same isolation gap, in opposite directions.
What was happening: a projection recompute commits its output through the store's adoption channel, which swaps the committed backing eagerly by contract (that's what makes reconcile immediately visible outside transitions). Node-level notifications ride core
setSignaland park correctly under the transition — which is why subscribed effects were properly held — but an untracked read serves the backing directly, sop.ashowed the speculative value afterflush()whilecount()(whose write parked in the signal's pending slot) correctly stayed committed.The fix stages a held view: when a projection adoption lands under a live transition, the pre-hold committed backing stays servable, and committed-visibility readers (untracked reads included) keep seeing it until the transition commits. Speculative readers — the derive's own draft, computeds recomputing inside the transaction, and
latest()— see the adopted backing, so the transaction still observes itself consistently.Your repro's log sequence now reads
p.a 0 / count 0after the flush, and both flip to 5 when the action's transition lands.Tier-1 creation-cost benches (stage-3 fence) (#3083)
fix: restore next work reverted by the stage-2 replay (pre-merge sweep)
fix: restore next work reverted by the stage-2 replay (pre-merge sweep)
Stage 2: store patch channel + patch-mode list driver (dormant by def…