docs(audits): the strictness ledger stops restating the union-flattening claim in its ui/ batch narrative - #16792
Conversation
… claim The `ui/` batch narrative's clause (a) restated, a few hundred lines below the `chart.zod.ts` row, the same claim that row's clause made: that what carries a strict arm's named surface and rename to the author is `packages/lint`'s arm unpacking, and that this is "a general fact about this campaign's remaining union sites". Both halves were already false the day they were written -- `e0f300ba5` (2026-08-08) is the same commit that wrote the `chart` row's clause, and all three flatteners had closed before it (#4971 / #5014 on 2026-08-05, #5341 on 2026-08-04). Under the ledger convention ruled on #14977, a clause false at its own batch is corrected outright rather than kept as a WRITTEN AT THE TIME record, so this site takes the same treatment the `chart` row received: the cleft is struck, the generalisation withdrawn, and `packages/spec/src/shared/union-branch-policy.ts` named as what lifted it. The two rows now state the mechanism identically. Re-measured through the paragraph's own door: `ChartAggregateSchema.safeParse` with `dateGranularty` inside `groupBy`, rendered by spec's own `formatZodError` with no `packages/lint` in the path, delivers the surface, the offending key and the rename beneath the one `invalid_union` wrapper line. The parenthesis each row keeps -- zod still raises a keyless `invalid_union` whose message is "Invalid input" -- is unchanged and still true. No other row is touched and the os-regen `.counts.md` companion is not edited. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016N6xmWt5hYm94ffVEwGH8x
ACCEPT on content — PM-verified at head
|
Enqueued — the CI gate the ACCEPT was held on is now discharged
Re-read on the current head, as the ACCEPT said it would be:
⛔ The count was 33 → 34 → 35 across this PR's life, which is why the earlier partial readings were refused: eligibility is EVERY run completed, never the required subset and never "nothing has failed yet". Had this been enqueued on the 33-run reading, two of the checks that ultimately gated it had not yet been created. Actions: ready → auto-merge (
https://claude.ai/code/session_016N6xmWt5hYm94ffVEwGH8x Generated by Claude Code |
Fixes #14977
Delivers the card's whole remaining scope after PR #16766: the fourth instance of the union-flattening claim in
docs/audits/2026-07-unknown-key-strictness-ledger.md, in theui/batch narrative's clause (a).What changed
One file, one paragraph. The clause asserted two things that the tree does not do:
packages/lint/src/zod-issue-format.ts's arm unpacking" — which makes lint's unpacker the author's only route;chart.zod.tsrow.Both are struck,
only as loud asbecomesexactly as loud as, andpackages/spec/src/shared/union-branch-policy.tsis named as what lifted it. The parenthesis the paragraph keeps — zod still raises a keylessinvalid_unionwhose message is the bare string "Invalid input" — is untouched and still true.Why corrected outright rather than given a LIFTED note
Ruling A on #14977 (comment 5579112979): a row keeps its batch-tense text and gains an inline
LIFTEDnote, except a clause that was false at its own batch, which is corrected outright. This site is in the exception, and I re-measured that rather than inheriting it:Exit 0 is the self-proving direction: the lift was already in the tree three days before the clause was written.
Evidence — a reproduction, not a green gate
pnpm --filter @objectstack/spec check:strictness-ledgergrades row structure and the generated counts, not prose, and is green either way. It is reported below, and it is not evidence for this diff.The evidence is a run through the door the paragraph itself names — spec's own
formatZodError, with nopackages/lintanywhere in the path, on@objectstack/specfreshly built at this branch:The surface, the offending key and the rename all arrive; the union's cost is the one wrapper line. Mechanism read in source:
formatZodIssue(packages/spec/src/shared/error-map.zod.ts:221) descendsinvalid_unionand ranks the branches throughselectUnionBranches;packages/spec/src/api/zod-issues-to-fields.ts:51imports the same function — one policy since #8318.The probe was a scratch file inside the worktree, run under an
EXIT INT TERMtrap and deleted;git statusis clean and no test file is added. No ablation applies — the deliverable is prose, not a guard.Consistency with the
chartrowThe two statements of the mechanism now read identically:
The note also points the reader up to the
chartrow rather than arguing the case a second time.Fifth-site sweep — method and result
Result: no fifth site to correct. One adjacent finding, reported not filed (below).
Method, because a count is only as good as the way it was taken, and a single-line grep over a line slice already produced one false zero on this card:
flatten*,collaps*,as loud as,invalid_union,Invalid input,zod-issue-format,formatZodError|formatZodIssue|zodIssuesToFields|selectUnionBranches,unpack*,never reaches|does not reach|not in the message,#4971|#5014|#5341, and the note vocabulary. 7 candidate blocks.unionalone — no formatter or flattening vocabulary at all. 15 blocks, and it surfaced no claim-bearing block the first pass had missed.:676,:737,:940,:976), so the zero elsewhere is a real zero and not an unread file.Classification of all 7 candidates:
:215-237,:437-443,:1199-1209:665-681(chart.zod.ts:676):733-747(state-machine.zod.ts:737)LIFTEDnote:938-943(view.zod.ts:940)LIFTEDnote:969-989(ui/narrative:976)One block deserves naming because it is a claim the first three passes on this card never examined — see 验收备注.
Gates
Derived, not guessed:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack docs/audits/2026-07-unknown-key-strictness-ledger.md, then reconciled.All 17 exit 0, each captured before any pipe (
cmd > log 2>&1; ex=$?). Verdict lines quoted rather than bare$?:pnpm --filter @objectstack/lint check:doc-formula-expressionsfirst returned exit 3 = PREREQUISITE NOT MET ("Nothing was measured");@objectstack/formulaand@objectstack/lintwere built as it instructed, underscripts/pm/os-verify-lock.sh(VERDICT command-exit 0), and only the re-run is recorded as measured.Outside this run by the tool's own accounting: the 2 families taking a value from the workflow, 10 declaring a population too wide to place, 43 artifact rosters whose silence is a fact about a list, and the always-runs tail. No repo-wide eslint run —
pnpm lintis CI-owned.Changeset
skip-changeset, measured rather than assumed: the root package isprivate: true,docs/audits/is a repo-root path outside every package directory so no package-relativefiles[]can reach it, and 0 of the 23files[]declarations name it. Nothing published moves.验收备注
A fifth clause exists, it is NOT this card's exception case, and it is deliberately untouched.
dashboard.zod.ts:673carries, beside the batch record this card already verified as correctly framed, a second and distinct present-tense sentence: "#5014 still binds every OTHER curated message this campaign has put inside a union arm — this row is one slot's correction, not the finding's retraction." That sentence is present-tense and no longer describes the tree. It is not in ruling A's correct-outright exception, and I measured that rather than assuming it:So it was true when written and expired the next day — which under ruling A is the
LIFTED-note case, not the correct-outright case, and a different edit from this one. It is also explicitly fenced by this dispatch (do not touch :673). Reported, not filed: a stale prose sentence is not a reproducible defect, a declared-contract violation, or a metadata-authoring trap — the same grading the seat applied to the fourth site. Successor: this seat, on the ledger-convention pass that ruling A opened; the two prior readings of:673looked at its batch-record clause and itsRESOLVEDnote, not at this sentence.Interim state now ends. Before this PR the file carried a corrected
chartrow and an uncorrected restatement of it ~300 lines below. After it, the two agree.Generated by Claude Code