test(types): re-derive and pin the WIDER ledger's #7760 pairs figure, amend #8222's stale live-figure guidance - #8575
Conversation
… amend #8222's stale live-figure guidance objectui#8458 — `zod-mirror-parity.test.ts`'s header said the objectui#7760 move took "19 keys across 16 pairs". Every other figure in that paragraph is read by a `headerFigures` pin and moved correctly with PR #8354; the pairs figure was the one no spelling reached, so it compiled and tested green while wrong. Re-derived rather than adopted: this file's own `ledgerEntryMembers('WiderThanDeclared')` was sliced out of the source, transpiled and run over the file at `645ecb98c` and `a480f797a` (PR #8354's parent and its merge), diffing entry -> key pairs. 19 keys left and 3 entered, across 18 distinct entries — 13 emptied, 5 reduced. Both movements close against figures already pinned at those revisions (52 - 19 + 3 = 36 keys; 34 - 13 + 2 = 23 entries). `16` is neither reading. The figure is now pinned, following the precedent of the "N of the registered pairs carry TYPE drift TODAY" spelling already in this file, and "pairs" is defined where it stands: every entry the move TOUCHED, with `emptied` as the subset that lost its whole content. The pin reads only the sentence — the movement is a HISTORICAL reading of two fixed trees, so nothing compares it to the live ledger. objectui#8248 — objectui#8222's exclusion note still called the seed decomposition a LIVE figure, which objectui#8243 made historical. Per the maintainer ruling (decision batch #71) the guidance clause is amended and the two measurement-record clauses are untouched; the record-vs-guidance rule is written once, in the file header. Test-only: the file is under `__tests__/`, excluded by the package build tsconfig and absent from its published `files`. Declared with an empty-frontmatter changeset. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE
✅ 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
|
Brings the branch up to date after #8569, #8574 and the rest landed. No conflict: nothing on main touched packages/types/src/__tests__/zod-mirror-parity.test.ts since this branch's base f5cfbbd, so the objectui#8458 pin and the objectui#8248 amendment compose with main rather than contending with it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE
✅ 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
|
Landing checks ①②③ all satisfied — marked ready for reviewDispatching seat,
Sequencing, already ruled and now discharged. This PR was originally held behind PR #8501 (same file). That hold was reversed: its only purpose was to spare #8501's contract review a re-run on a moved head, and #8501 has since gone BLOCK on a maintainer ruling, so its head must move and its review must re-run regardless. #8501 merges Declared, ⛔ not buried: the dev self-reported one ⛔ This seat does not merge, and it has ⛔ not guessed a merge method or enabled auto-merge — the merge itself is the queue's and the maintainer's. Marked ready for review; everything gating it is green. Generated by Claude Code |
Fixes #8458
Fixes #8248
Two cards, one file, one branch — both are a claim in
zod-mirror-parity.test.ts's ownprose that no instrument covers.
⭐ The durable finding:
16was never right — it was never definedThe card, its triage and the dispatch all framed this as a figure that went stale when
PR #8354 moved the ledger. It did not go stale.
16is neither reading of the word:the move emptied 13 entries and touched 18, and no definition of "pairs" yields 16 at
either revision. Re-deriving it is what showed this — adopting the reviewer's 18 would have
produced the same corrected digit and left the actual defect in place.
So the class is not "a number rotted beside pinned neighbours". It is a number was
published with no definition, and this file's own reviewers reproduced it twice without
one — the card's author, and the contract reviewer who measured 18 and reported it as a
correction rather than as an ambiguity. That is why step 3 of the card existed, and it is
why this PR writes a definition and a decomposition into the sentence instead of
correcting a digit: a corrected
18with no definition forks again the first time someonecounts the emptied entries instead.
Card #8458 — the pairs figure
The count, and how it was derived
18. The sentence now reads
19 keys across **18** pairs LEFT (**13 emptied + 5 reduced = 18**).⛔ Not adopted from the card or from triage — both said in as many words not to, and
neither had re-derived it. Method, in full:
it are
645ecb98c(its parent) anda480f797a(its merge). Confirmed by reading theledger's own pinned totals out of the file at each:
**34 entries** … **52 keys** … **61 arms**before,**23 entries** … **36 keys** … **47 arms**after — exactly thetwo states the sentence names.
ledgerEntryMembers('WiderThanDeclared'), not are-implementation: the derivation script slices that function's source text out of the
working-tree copy of the test file, transpiles it with
ts.transpileModule, and callsit against each revision. So the instrument that sizes the ledger in CI is byte-identical
to the one that sized it here. ⛔ Nothing was hand-reconciled.
Both movements close against figures already pinned at those revisions, so the reading is
anchored on both sides rather than asserted. The 5 reduced entries are
AppComponentSchema,DashboardComponentSchema,PageNodeSchema,ObjectViewSchema,DetailViewSchema.⭐
16is wrong under both readings of the word — 13 emptied, 18 touched. That is thestrongest argument for step 3 below: it was not a stale figure, it was an undefined one.
PR #8354's body needs no correction — it merged 2026-09-08, so the card's conditional
("if it has not merged") does not fire. Nothing was edited there.
(a) or (b): (a), pinned
headerFigures(/(\d+) of the registered pairs carry TYPE drift TODAY/)already pins apairs-shaped figure in this file, so this copies a precedent rather than opening one, and
the card's cost argument ("every pinned figure is a maintenance cost") is weaker than the
card assumed. The maintenance cost is also near zero because the figure is historical:
it is a reading of two fixed trees and cannot rot, so no future ledger move touches it.
Dropping it under (b) would have deleted the only statement of how big that move was — the
neighbouring
It read 34 / 52 / 61 …sentences give the totals but not the shape of themovement.
The pin is a new
describeat the bottom of the file, deliberately not folded into theobjectui#8252block: that one derives LIVE figures from the arms, and⛔ nothing here compares the movement to the live ledger.
WiderThanDeclaredtoday isneither of the two trees (objectui#8338 moved it again afterwards), and pointing a figure
at it would make the statement live, rot it on the next ledger move, and reintroduce the
hand re-derivation objectui#8243 removed. What is checked is the statement's internal
arithmetic —
emptied + reduced == pairs, the restated total, andpairs <= keysLeft(a touched pair contributed at least one of the keys that left) — plus non-vacuity legs so
an all-zero rewrite cannot satisfy it.
The definition of "pairs"
Written where the figure stands, because a number without one forks again:
Both readings are now written down, which is why the decomposition (
13 emptied + 5 reduced)is in the sentence instead of a bare digit: the reader can see which quantity is which.
Card #8248 — the stale
livein objectui#8222's exclusion noteImplemented as ruled (decision batch #71, 2026-09-07), not re-opened.
The rule is written once, in the file header: the LIVE/HISTORICAL split governs
assertion messages too, judged per CLAUSE — a clause that RECORDS A MEASUREMENT is
historical and ⛔ never rewritten by a later card; a clause that GIVES GUIDANCE is live,
must be true now, and a later card may and must amend it, citing the card that moved it.
The guidance half is amended.
⚠️ ONE live figure in the header is deliberately NOT hereloses the wordlive, and an⚠️ AMENDED (objectui#8248 …)paragraph states thatthe seed decomposition is a HISTORICAL reading anchored at named revisions per
objectui#8243, that it therefore carries none of a live figure's obligations, and that the
action the word "live" sends a reader off to do — pin it, or exclude it afresh — is the
wrong one.
The two record clauses are untouched, byte-identical, and named here explicitly:
It needs each key's PROVENANCE and no ledger in this file records that, so nothing here can derive it.It is excluded in writing where it stands, which is the other half of objectui#8222 — every live figure in that header is pinned or excluded with its reason, and ⛔ a new one that is neither should not be added.⛔ No digits were copied into the note: restating the decomposition there would have
created the second unpinned copy the record clause exists to forbid.
Two companion edits inside the same sentence's radius
Both are the same claim as #8248's subject sentence, on the claimed file surface, and
leaving them would have produced exactly the "a stale copy survives beside a corrected one"
shape this file records. Neither is a new finding; flagging them for the reviewer:
Exactly one live figure is excluded rather than pinnedabout the same seed decomposition. Amended the same way (the word, plus one clause citing
objectui#8243 / objectui#8248). Leaving it would have contradicted the rule three lines below it.
That note is left exactly as it stands, whichobjectui#8248 has now made false. Changed to the past tense with one clause recording the
amendment. Its record clause —
it is an assertion message objectui#8243 has no business editing— is untouched.Gates
pnpm exec vitest run packages/types/src/__tests__/zod-mirror-parity.test.tsTest Files 1 passed (1)·Tests 32 passed (32)pnpm --filter @object-ui/types type-check(tsc --noEmit+tsconfig.examples.json+tsconfig.test.json)VERDICT command-exit 0tsc -p tsconfig.test.json --listFiles**/__tests__/**)node scripts/check-control-bytes.mjsOK (scanned 6771 tracked text file(s))node scripts/check-changeset-presence.mjspnpm check:published-tsconfig-exclude·check:unreferenced-sources·changeset:check·check:comment-mask-corpusnode scripts/check-governed-queue-guard.mjs --test THE-TWO-PATHSNOT GOVERNED — 2 path(s) checked against 5 governed surface(s)Lint is a declared narrowing, measured, not skipped.
eslinton the changed file: 1 file,0 errors, 0 warnings (
--format json, count read from the JSON). Population read fromeslint's own config via
ESLint#isPathIgnoredovergit ls-files: 4518 of 4520 trackedlintable-extension files are in scope for
eslint .. Invariance:eslint.config.jssets noparserOptions.projectand noprojectService, so type-aware linting is off and a one-filediff cannot move the verdict on any untouched file. The full farm is CI's run.
All figures above are from the final commit,
234eeea92.Reverse verification
Predicted direction: turns red. Run from the committed tree, restore proven by blob hash
and an empty
git diff HEAD, with anEXIT INT TERMtrap holding absolute paths.✓ … the objectui#7760 movement figures reconcile with themselves (objectui#8458) > the pairs that move touched equal its emptied entries plus its reduced ones16(the actual defect): on-disk proofremoved-text count=0, injected-text count=1, blobb71bcb40…!= HEAD16c95033…→Tests 1 failed | 31 passed,expected { decomposition: 18, …(2) } to deeply equal { decomposition: 16, …(2) }.the header spelling /\*\*(\d+) emptied \+ (\d+) reduced = (\d+)\*\*/ must occur exactly once … it occurs 0 times. A reword that drops the figure is red, not silently unpinned.leg restored (blob == HEAD)/TRAP-RESTORE OK: blob matches HEAD and git diff HEAD is empty. Re-run in full against thefinal commit, so every hash above is that tree's.
One self-audit, worth the reviewer's eye
The first draft of the new prose restated the two pinned figures a second time, in the
sentence explaining the fork — a restatement no pin reaches, which is the objectui#7733
shape one line further in and precisely what this paragraph warns against. It was removed
before the branch was opened for review: the sentence now says
16"is NEITHER of the tworeadings above" and states in writing that they are ⛔ not restated as digits. The digits
appear exactly once each, inside the pinned spellings.
Merged
origin/main— what was re-derived, and what is immune and whyorigin/mainat57bad9b00was merged in (a merge, ⛔ not a rebase); the branch wasbehindindependently of any sequencing. No conflict, and the reason is measurable ratherthan asserted:
git log f5cfbbd81..origin/main -- packages/types/src/__tests__/zod-mirror-parity.test.tsis empty — nothing on main has touched this file since the branch's base. The file's
blob hash is
16c95033on both sides of the merge.Re-derived, not carried over. The two revision extracts were deleted and re-cut from
git, and the whole derivation re-executed on the merged tree:
BEFORE (645ecb98c) {entries: 34, keys: 52},AFTER (a480f797a) {entries: 23, keys: 36}, 19 keys left, 3 entered, 18 pairs touched,13 emptied, 5 reduced, both arithmetic checks closing. The sliced instrument hashed
identically (
4355dcac9ccd), so the reader did not move either.of two fixed trees.
645ecb98canda480f797aare immutable, so nothing landing onmain afterwards can change what the ledger held there. That is exactly the objectui#8243
property this PR leans on; re-running it is the confirmation, not the argument.
by hand here: the existing objectui#7733 / objectui#8222 / objectui#8252 pins compare them
to the ledgers on every run, so the post-merge
Tests 32 passed (32)is that comparisoncoming back green. Had main moved a ledger, those blocks would be red, not silent.
been filed as a card, not absorbed into this PR.
Post-merge re-runs at
6d7d72a08: parity testTests 32 passed (32);pnpm --filter @object-ui/types type-check→VERDICT command-exit 0;check-control-bytesOK (6777tracked text files);
check-changeset-presenceexit 0;check-governed-queue-guard --test→
NOT GOVERNED; eslint on the changed file 1 file / 0 errors / 0 warnings, against apopulation of 4520 of 4522 tracked lintable files read from eslint's own config, still
with no
parserOptions.projectand noprojectService. The reverse verification was re-runin full against the merged HEAD; every hash in the section above is from that run.
Clause-② carrier check
node scripts/pm/check-clause2-carriers.mjs --pair 8575, run from/home/user/objectstackas instructed, exits 2, and its own line says why: it reads
objectstack-ai/objectstackby default, where #8575 is a different pull request, so "the pair could not be formed, so
nothing about it was judged" — ⛔ not a clearance, and ⛔ not a failure either. Pointed at
this repo,
PM_SWEEP_REPO=objectstack-ai/objectui … --pair 8575exits 0: both #8458 and#8248 read as "the clause-② declaration is readable in the fixed spelling and both carriers
agree, and its diff carries no widening tell."
Release notes
.changeset/8458-parity-header-pairs-figure.md, empty frontmatter. The file is undersrc/so the presence gate counts it, but nothing published moves: the package buildtsconfig.jsonexcludes**/__tests__/**and@object-ui/types'filesis["dist", …].🤖 Generated with Claude Code
https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE
Generated by Claude Code