Skip to content

finding(types): zod-mirror-parity's two ledger docstrings say UnmirroredDeclared records 94 keys; two instruments measure 87 — unmoved since objectui#7779, and outside every pin in the file #8243

Description

@claude

Filed by the dev seat implementing #8222 (branch claude/pin-zod-mirror-parity-key-totals-8222, PR #8242), unassigned and unlabelled — grading and domain:* are triage's. Out of #8222's scope by that card's own boundary (its subject is the file's top-of-file HEADER; these two sites are ledger docstrings), so it is reported rather than repaired.

The numbers

packages/types/src/__tests__/zod-mirror-parity.test.ts. Two docstrings state how many keys UnmirroredDeclared records, and both say 94:

  1. Above interface UnmirroredDeclared — the section headed ⚠️ READ THIS BEFORE QUOTING THE NUMBER — 121 became 98 by RECLASSIFICATION, then 97 by the first REPAIR, then 96 by RETIREMENT, then 94 by REPAIR again:

    objectui#6058 seeded this ledger at 121 keys. It records 94, and the movements are different facts.

    and, in the same block:

    So: 94 is the mirroring debt; 94 − 1 seeded + 3 mirrored + 2 retired + 23 reclassified is what "121" used to mean

  2. Above interface RuntimeOnlyDeclared — the section headed ⚠️ THIS IS WHERE 23 KEYS WENT:

    UnmirroredDeclared above was seeded at 121 keys by objectui#6058. It records 94 today

quantity prose measured on 7444916ce
UnmirroredDeclared keys 94 (twice) 87

The file is fully green with both. The section HEADINGS carry the same stale chain (… then 94 by REPAIR again).

Why nothing caught it

objectui#7279's pin (the split figures and the totals the header writes down equal the ledger) reads four figures plus a totals line, all of which are correct today and derived — **SPEC-DERIVED (2 entries, 3 keys)**, **LOCAL (12 entries, 84 keys)**, **14 entries / 87 keys** — 2 / 3 spec-derived, 12 / 84 local, and the header's **14 entries** … **87 keys**. The two 94s sit in different paragraphs of the same docstrings and are outside every headerFigures() spelling that pin uses. objectui#8222's new pin does not reach them either — its regexes are anchored to the top-of-file header.

87 is not new: objectui#7779 took the ledger 96 → 87 on 2026-09-06 and correctly moved every pinned figure. These two unpinned restatements did not move with it. That is the same shape as objectui#7664 → #8222 and objectui#7542 → #7733, one site further in.

Measured, with a positive control

Two independent instruments over the ledger interfaces — a TypeScript AST walk summing each property signature's string-literal union arms, and a line-oriented parse of the same block with comments stripped — both read UnmirroredDeclared = 14 entries / 87 keys on 7444916ce.

Control: the same instruments read RuntimeOnlyDeclared 7 / 24 and KnownDrift 41 / 63, and the 87 is independently derived by objectui#7279's own green pin through ledgerEntryMembers(). So the semantics in use are the ones the file already treats as authoritative.

The decomposition beside it also needs re-deriving, and it is the harder half

94 − 1 seeded + 3 mirrored + 2 retired + 23 reclassified is an accounting of what became of the original 121. Measured on the file's history in this container's (shallow) checkout:

  • at beccf1c6b, the oldest revision of this file reachable here — after the 23 moved out, before the first repair — UnmirroredDeclared holds 98 keys, which is exactly the 121 became 98 by RECLASSIFICATION the docstring states. That agreement is the control for this walk.
  • of those 98 keys, 85 survive into today's set and 13 have left (set intersection on entry.key pairs).
  • so the true statement today is of the shape 87 − 2 seeded + 10 mirrored + 3 retired + 23 reclassified = 121, where 85 + 13 + 23 = 121 and the two seeded keys are ChatbotFloatingSchema's pair from objectui#7655.

⚠️ Stated as a reading, and one term is NOT measured: the split of the 13 departures into mirrored vs retired is read off the prose history (objectui#6639 mirrored 1, objectui#7129 retired 1, objectui#7623 retired 1, objectui#7352 mirrored 1 of the two drillDown rows that was part of the seed, objectui#7779 mirrored 8 and retired 1 = 10 + 3). It reconciles arithmetically, but it is prose-derived. The 13 is measured; the 10 / 3 is not.

Suggested remedy, and the fence around it

⛔ Not route 1 — correcting 9487 alone is the move this file's history is a record of.

The 87 half is mechanical and pinnable: it is the number objectui#7279's pin already derives, and both docstrings would be read by a headerFigures() spelling the same way the top-of-file header's copy is. Note both section HEADINGS restate the chain and would need the same treatment, or the same rewrite that stops restating it.

⚠️ The decomposition half is NOT pinnable and should not be pinned. Every term but 23 reclassified needs each key's provenance — which of today's keys descend from the seed — and no ledger in this file records provenance; they record entry → key set as it stands. #8222 hit the identical figure in the top-of-file header and removed the copy rather than refreshing the digit, leaving an explicit exclusion with its reason and deferring to these ledger paragraphs as the site that owns the statement. ⇒ whoever takes this decides whether the owning site keeps a live decomposition at all; if it does, it will need re-deriving by hand on every future repair, and that cost is the decision.

Duplicate check

GET /search/issues is refused by this session's egress proxy, so this ran as the declared fallback: the repo-scoped REST list endpoint (state=all, 6 pages of 100, issues #7644#8241, 321 issues after dropping PRs) plus a local grep. The control fired: zod-mirror-parity returns 10 issues including #8222 and #7733, so the scan is not blind. The targeted pattern (mirroring debt, records **94**, 121 used to mean, ledger docstring) returns 0. The near ones and why none is this card: #8222 (the header's key totals — this seat's card, and these two sites are explicitly outside it), #7733 (the header's entry counts), #7947 (NamedListView member figures, a different file). ⚠️ The window is #7644 upward; a card older than that would not be seen, though the defect itself only became wrong at objectui#7779 on 2026-09-06.

Refs: #8222 · #8242 (the PR for the header half) · objectui#7279 (the pin whose spelling the remedy would reuse) · objectui#7779 (the change that moved the ledger and not these two figures)


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions