…as never committed
A dated SPEC amendment (2026-10-06) naming the rule the create-time fixes
each implement by checking commit status: the loading-source rule, #3814
(#3802), and the pending #3800 and in-flush #3540 fixes. The same-tick
and in-flush shapes are recorded as not yet one-way and pinned it.fails
in tests/direction-rule-probe.test.ts; the boundary shape passes today.
Cross-references in INTERNALS-ASYNC-STATE.md §0 and the carve plan.
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Adds the direction rule to the async SPEC as a dated amendment (2026-10-06): a hold never waits on work that has never committed. Docs and tests only; no source changes, so no changeset.
Why
A structural review of the post-L2 fixes found the concept they were missing: direction. L2 has one relation between transactions,
merge, which is symmetric, so "this work read that hold" means both wait for each other. That's right for committed work. It's wrong for work that has never committed (a node mounted during a hold, its first load): that work should wait for the hold, and the hold should not wait for it. Each create-time fix said this locally by checkingSTATUS_UNINITIALIZED. The amendment names the rule and points at those mechanisms; it adds none.A carve that made direction a transaction-level relation (a frame follows a hold) was built and measured on a scratch branch. It is not adopted:
_bornIn). §15.2's loading-source rule, all four parts of Loadingonshould behave as a keyed <Show> around the boundary; a boundary mounted under a hold must not be born held (A29) #3540, F13, [2.0] Mounting a memo during a held action can crash a render callback #3802/fix(signals): skip the run for a re-staging effect pass #3814 and F6's guard were each still needed.What the amendment says
#2937loading-source rule (plan §15.2), onnext;onshould behave as a keyed <Show> around the boundary; a boundary mounted under a hold must not be born held (A29) #3540, pending onfix/create-time-holds(91e474506,ca71e5d9d). They are linked, not claimed as onnext.Pins
packages/signals/tests/direction-rule-probe.test.ts:nextit.failsit.failsit.failsThe three
it.failsrows pass under the measured follow model, so they will flip loudly if a fix makes those shapes one-way. They also stay failing with #3800 and #3540 applied, which is consistent with the amendment.Also:
INTERNALS-ASYNC-STATE.md§0 and the carve plan's §15 open question 4.RULES-INDEX.mdregenerated;rules-index --checkis clean.Public API changes
None.