Found by the os-dev discharging #16948 (the strictness ledger's control-flow.zod.ts row), while running that card's standing instruction to probe on the claim rather than one spelling. The ledger was not the only hand-written restatement left in the tree. ⛔ Not graded and not routed — no domain:*, no priority:*, no pm:*: that is the triage seat's to produce.
What is false
packages/spec/src/automation/control-flow.test.ts restates both sentences #16835 retires and #16948 corrects — once in a block comment and once in a describe title, which is the half that reaches a test report and a grep.
Located by text, ⛔ not by line number (both will move):
- the
describe title [#4001] validateControlFlow and the key gate do not fight
- the comment above it: "It does not, and the reason is that they answer different questions. The schema rejects undeclared KEYS; the analysis rejects malformed STRUCTURE … They meet at exactly one seam"
Both halves are false for the reason #16134 gives (landed 21aabbc7b, PR #16825): FlowSchema's superRefine refuses a duplicate node id — a structural fact decided by the schema — over one node-id space spanning the top-level nodes[] and every region body. There are now two seams, and past MAX_REGION_DEPTH (32) the two guards hand off at a measured boundary. That boundary has its own pin in the sibling file: flow.test.ts's the seam at MAX_REGION_DEPTH case.
⭐ The tests themselves are correct and pass. Everything the block asserts is #4001 behaviour that #16134 did not move. What is stale is only the framing — which is why no gate reds on it, and why it will keep being read as current.
Measured
Base 59db8a02cb, plus #16948's own fix committed on its branch so the ledger no longer competes for the hits. Worktree clean, case-insensitive, grep -oi ... | wc -l for occurrences (⛔ not grep -c, which counts LINES):
git grep -Ini "do not fight" -- . ':!packages/spec/CHANGELOG.md'
-> packages/spec/src/automation/control-flow.test.ts:482 (the ONLY hit in the tree)
git grep -Ini "exactly one seam" -- . ':!packages/spec/CHANGELOG.md'
-> packages/spec/src/automation/control-flow.test.ts:477
(three further hits are unrelated uses of the word "seam" in rest/, runtime/ and scripts/)
LIT control: "validateControlFlow" in that file -> 15 occurrences (the block is read)
DARK control: "zzqq-not-a-term" in that file -> 0
After #16948's fix the ledger no longer carries either sentence, so this file becomes the last hand-written restatement in the tree. packages/spec/CHANGELOG.md also contains the old wording; that one is correct and must stay — it is RELEASE-OWNED and records, in the past tense, what the docblock said before #16947 changed it.
Scope
Why it was not fixed in #16948
⛔ Deliberately left alone rather than overlooked. That card's claim comment fences the file face to docs/audits/2026-07-unknown-key-strictness-ledger.md "and whatever pin the fix needs", and the in-place-fix exemption fails its fourth limb for the reason in the last bullet above.
Dup check
GET /repos/objectstack-ai/objectstack/issues?state=open&labels=documentation&per_page=100, paged to closure — one short page, 77 open documentation cards read — grepped for control-flow.test.ts / do not fight / exactly one seam. Zero hits on the file path; the two sentence probes hit #16948 only, which is the ledger card, not this file. LIT controls on the same corpus: control-flow and #16134 each fire on #16948, so the scan reads bodies rather than returning a vacuous zero. DARK control zzqq-fabricated-term reads 0.
⚠️ Two declared bounds on that reading. The documentation label was the narrowing, so a card filed without it would not appear. And the wider window — every issue and PR updated since 2026-09-08, when #16134 landed — would not close within this seat's targeted-channel budget (600+ items and still paging), so it was abandoned rather than reported as a closed enumeration.
Found by the
os-devdischarging #16948 (the strictness ledger'scontrol-flow.zod.tsrow), while running that card's standing instruction to probe on the claim rather than one spelling. The ledger was not the only hand-written restatement left in the tree. ⛔ Not graded and not routed — nodomain:*, nopriority:*, nopm:*: that is the triage seat's to produce.What is false
packages/spec/src/automation/control-flow.test.tsrestates both sentences #16835 retires and #16948 corrects — once in a block comment and once in adescribetitle, which is the half that reaches a test report and agrep.Located by text, ⛔ not by line number (both will move):
describetitle[#4001] validateControlFlow and the key gate do not fightBoth halves are false for the reason #16134 gives (landed
21aabbc7b, PR #16825):FlowSchema'ssuperRefinerefuses a duplicate node id — a structural fact decided by the schema — over one node-id space spanning the top-levelnodes[]and every region body. There are now two seams, and pastMAX_REGION_DEPTH(32) the two guards hand off at a measured boundary. That boundary has its own pin in the sibling file:flow.test.ts'sthe seam at MAX_REGION_DEPTHcase.⭐ The tests themselves are correct and pass. Everything the block asserts is #4001 behaviour that #16134 did not move. What is stale is only the framing — which is why no gate reds on it, and why it will keep being read as current.
Measured
Base
59db8a02cb, plus #16948's own fix committed on its branch so the ledger no longer competes for the hits. Worktree clean, case-insensitive,grep -oi ... | wc -lfor occurrences (⛔ notgrep -c, which counts LINES):After #16948's fix the ledger no longer carries either sentence, so this file becomes the last hand-written restatement in the tree.
packages/spec/CHANGELOG.mdalso contains the old wording; that one is correct and must stay — it is RELEASE-OWNED and records, in the past tense, what the docblock said before #16947 changed it.Scope
describetitle to the post-Decision: do a flow's top-levelnodes[]and its region bodies (loop/try_catch/parallel) share ONE node-id space, or two? — uniqueness is now enforced inside each, never across #16134 division, following the canonicalcontrol-flow.zod.tsdocblock as docs(spec): two docblocks that promised a future which has already arrived (#16835, #15239) #16947 left it (c3ce76c210) rather than inventing a third wording. ⛔ Do not restate the boundary independently — that is how the ledger and the docblock drifted apart in the first place.packages/spec/CHANGELOG.mdis out of scope and must not be edited (RELEASE-OWNED).describemoves test-report text, so this carriespackages/spec's own test + typecheck verification face — which is precisely why docs(audits): the strictness ledger'scontrol-flow.zod.tsrow still says the schema andvalidateControlFlow"do not fight" and meet at "exactly one seam" — #16134 made both false #16948 did not fold it in: the bounded in-place-fix exemption requires no new verification surface.Why it was not fixed in #16948
⛔ Deliberately left alone rather than overlooked. That card's claim comment fences the file face to
docs/audits/2026-07-unknown-key-strictness-ledger.md"and whatever pin the fix needs", and the in-place-fix exemption fails its fourth limb for the reason in the last bullet above.Dup check
GET /repos/objectstack-ai/objectstack/issues?state=open&labels=documentation&per_page=100, paged to closure — one short page, 77 opendocumentationcards read — grepped forcontrol-flow.test.ts/do not fight/exactly one seam. Zero hits on the file path; the two sentence probes hit #16948 only, which is the ledger card, not this file. LIT controls on the same corpus:control-flowand#16134each fire on #16948, so the scan reads bodies rather than returning a vacuous zero. DARK controlzzqq-fabricated-termreads 0.documentationlabel was the narrowing, so a card filed without it would not appear. And the wider window — every issue and PR updated since2026-09-08, when #16134 landed — would not close within this seat's targeted-channel budget (600+ items and still paging), so it was abandoned rather than reported as a closed enumeration.