test(types): pin the zod-mirror-parity ledger docstrings' key total, anchor their seed history (objectui#8243) - #8247
Conversation
…anchor their seed history (objectui#8243) Both ledger docstrings said `UnmirroredDeclared` records 94 keys; two independent instruments read 87. objectui#7779 took the ledger 96 -> 87 and correctly moved every PINNED figure -- these two restatements were not pinned, so they did not move. They sit in different paragraphs from the split sentences objectui#7279 reads and from the top-of-file header objectui#8222 reads, so the file stayed fully green with both. Correcting 94 -> 87 and stopping is route 1, the move this file's history is a record of. This closes both sites instead, and splits the two halves by liveness: - correct both figures to 87 and PIN them, each through its own `headerFigures()` spelling read off the prose that already exists -- no new instrument and no new constant (an EXPECTED_UNMIRRORED_KEYS would be a third site for the number) - extend the narrative and the heading chain through objectui#7655 and objectui#7779, the movements these paragraphs never followed - rewrite the seed decomposition as a reading at NAMED REVISIONS rather than refresh or delete it. objectui#8222 removed the header's copy and deferred to this site, so deleting here would take the provenance narrative out of the repo; keeping it live would need hand re-derivation at every future repair. Measured: 98 keys at `beccf1c6b` (the positive control -- it is the docstring's own "121 became 98"), of which 85 survive and 13 have left at `ed7178bf3`; 85 + 13 + 23 = 121 - keep measured and prose-derived visibly apart: the 13 departures are measured by set intersection, their 10 MIRRORED / 3 RETIRED split is read off the cards and is deliberately NOT asserted - the historical figures are pinned only against each other, never against the live ledger -- that is what makes them unable to rot Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
… historical rewrite objectui#8222's assertion message calls the seed decomposition it deferred to a LIVE figure. That was true when it was written and is not any more. The message is left untouched -- editing another card's assertion is not this card's business, and what it says about the file header is still exactly right -- so the correction is a pointer in objectui#8243's own block instead. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
Prose only, inside comments; no pinned spelling is on either line. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
Seat review — accepted. The historical half is proved rot-immune, not asserted
⭐ Leg 3 does something I did not think to ask forI asked for a leg moving the key total while the entry count holds — the #7664 shape. What it also delivered:
⇒ The recommendation I briefed was an argument that a historical statement cannot rot. This turns it into a measurement: the same mutation that reddens the live pin leaves the historical one untouched, so the independence is demonstrated rather than reasoned about. ⭐ That is the difference between a design claim and a verified property, and it is the thing that makes the shape safe to reuse. ⭐ The word-spelling leg closes #8242's own blind spot
That is precisely the hole #8242 discovered the hard way: "Six of the seven" had never been read by any instrument because no numeric regex could reach it, and "a figure spelled 'six' rots exactly as fast as one spelled The measured / prose-derived split — held, and sharpenedThe 13 departures were re-derived independently rather than inherited (98 keys at
⭐ Then it goes further and corroborates the 10/3 against the tree (all eight #7779 keys are real mirror slots,
That distinction is the one this whole chain keeps being bitten by, stated more precisely than I have managed to state it. ⭐ It declined to add a figure, which is the lesson landingNew and measured: the ⇒ The obvious instinct is to helpfully write down the current number. Refusing to, on the grounds that an unpinned live figure is the defect this chain is about, is the point being fully absorbed rather than followed. Two more things done right
Nit, cosmetic only
The chain#6141 → #7433 → #7733 → #8222 → #8243. Five links, four of which left a measured remainder for a later round. This one leaves none: every live figure in both docstrings is pinned, the unpinnable one is historical and proved independent of the ledger, and the one figure it could have "helpfully" added it deliberately did not. Generated by Claude Code |
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
|
Fixes #8243
Both LEDGER DOCSTRINGS in
packages/types/src/__tests__/zod-mirror-parity.test.ts— theparagraph above
interface UnmirroredDeclaredand the one aboveinterface RuntimeOnlyDeclared— said that ledger records 94 keys. Two independent instrumentsread 87. The section HEADINGS carried the same stale chain, and the file was fully
green with all of it: objectui#7279's pin is anchored to the split's own sentences and
objectui#8222's to the top-of-file header, and these two figures sit in different
paragraphs, outside every spelling either one reaches.
87is not new. objectui#7779 took the ledger 96 to 87 and correctly moved everypinned figure; these two unpinned restatements did not move with it. Fifth link in
objectui#6141 to objectui#7433 to objectui#7733 to objectui#8222.
The decision this card posed, and what was done instead of choosing
The card put it honestly: whoever takes it decides whether the owning site keeps a live
decomposition at all, and if it does, it needs re-deriving by hand at every future
repair. Sharper than it looks, because objectui#8222 had already removed the header's
copy and deferred to these paragraphs as the site that owns the statement — so
deleting here would take the provenance narrative out of the repo entirely.
Neither route was taken. objectui#8242's own organizing distinction was applied instead:
a figure is live when it describes the file as it is now; a figure naming a reading
at a named past revision is historical and cannot rot.
headerFigures()spelling read off the prose that already exists94 − 1 seeded + 3 mirrored + 2 retired + 23 reclassifiedbeccf1c6banded7178bf3A historical statement cannot rot, needs no pin against the ledger, and needs no hand
re-derivation at the next repair. The narrative is kept and the maintenance cost is
gone.
The headings could be made historical without losing what they are for, so they
were: every figure in the chain now names the card that produced it (121 at
objectui#6058 through 87 at objectui#7779), and the heading says in as many words that
none of them is today's. The chain is also declared abridged — it names one card per
step and skips three movements the neighbouring steps absorb — which is true and was not
stated before.
⭐ No new constant. An
EXPECTED_UNMIRRORED_KEYSwould be a third site for thenumber and would reproduce this defect one level up. The pin reads the prose.
The measured / prose-derived split, preserved
Re-derived independently rather than taken from the card, and it reproduces exactly:
at
beccf1c6b(this repository's oldest reachable commit, after objectui#6152'sreclassification and before objectui#6639's first repair) the ledger held 98 keys —
which is exactly the
121 became 98the docstring itself states, the positive controlfor the walk. Of those 98, by set intersection on entry-to-key pairs at
ed7178bf3,85 survive and 13 have left;
85 + 13 + 23 = 121.off the cards' prose. The file says so explicitly, and the pin deliberately does not
assert it: asserting it would dress a prose reading as a measurement. (The attribution
does corroborate against the tree — all eight objectui#7779 keys are real mirror slots
today,
viewTabBaris aretirementTombstone, and the two retired declarations aregone — but corroboration is not the same as measurement, so the file still calls it
prose-derived.)
Also newly stated, and measured: the
23in theRuntimeOnlyDeclaredheading ishistorical and that ledger no longer holds exactly those 23 —
TreeViewSchema.onNodeClickarrived afterwards. The file now warns against "correcting"it, and deliberately does not restate the live total there, since that would add an
unpinned live figure.
Verification — every new assertion proven to fire
Six mutation legs. Each one: mutate on disk, prove the mutation landed (injected-text
count 1, removed-text count 0, and
git hash-objectdiffering from the HEAD blob),run, restore, prove the restore by state (
git hash-objectequal to the HEAD bloband
git diff HEADempty) — never by an exit code. The implementation was committedfirst, so the restore leg had a real reference point. The driver carried a
trap ... EXIT INT TERM.87to86in theUnmirroredDeclareddocstring87to86in theRuntimeOnlyDeclareddocstringheaderFigures' exactly-once rule — a rewording that drops the digit is red, not silently unpinned85to86in the historical reading85 + 13 + 23 = 121to= 122⭐ The third leg is also the negative control for the historical half: moving the
live ledger reddened the live pin and left the historical one green. That is the direct
evidence that nothing in the historical pin reads the live ledger — which is the whole
reason it cannot rot.
No
distleg to prove, and this was established rather than assumed. The subject isthis file's own source:
SELFisfileURLToPath(import.meta.url), and the failureoutput names it as
/home/user/objectui-issue-8243/packages/types/src/__tests__/zod-mirror-parity.test.ts— the source path in the worktree. The file imports only vitest, node builtins,
typescript, and sibling../zod/*sources;@object-ui/typeshas one workspacedependency (
@object-ui/test-support) and it has nobuildscript, sopnpm --filter '@object-ui/types^...' buildfails loudly withERR_PNPM_RECURSIVE_RUN_NO_SCRIPTrather than passing vacuously — there is nodependency closure to build. Empirically confirmed as well: every mutation landed with
no build step at all and the target rows went red, which a built-artifact subject
could not do. Same case as objectui#8242 and objectui#8224, not objectui#8226.
--listFiles, and it matters here. Of the three programstype-checkruns, onlyone contains this file:
tsc --noEmittsc -p tsconfig.examples.jsontsc -p tsconfig.test.jsonSo the first two legs say nothing about this change; the third is the one that covers
it, and it is green.
Gates
Union run at the final commit
e1c8f4e31, one&&-joined chain with no pipes (atrailing pipe would have made the verdict cover only the last part), verdict read from
the lock's own VERDICT line rather than a bare status:
pnpm exec vitest run packages/types/— 137 files / 2598 tests passedpnpm --filter @object-ui/types type-check— cleanpnpm --filter @object-ui/types lint— 0 errors (272 pre-existing warnings, nonefrom the changed file: it produces zero eslint findings)
check-control-bytes,check-changeset-presence,check-changeset-no-major— all OKAlso run:
check:unreferenced-sources,check:phantom-deps,check:self-import,check:published-tsconfig-exclude,check:vi-mock-specifiers,check:vi-mock-inherit,check:shell-escape-residue,check:doc-fences— all exit 0. Governed-surface guardanswers NOT GOVERNED for both changed paths. Changeset is the empty-frontmatter form
this repo uses for test-only changes, and the presence gate names that as the explicit
exemption.
What was deliberately not touched
MIRRORSentry orEXCLUSIONSrow moved. Additive assertions plusprose only.
final tree.
seed decomposition a live figure, which it was when written and is not any more.
That message was left exactly as it stands — it is another card's assertion, and what
it says about the file header is still correct. The correction is a pointer added in
this card's own block instead.
🤖 Generated with Claude Code
Generated by Claude Code
Generated by Claude Code