You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
ReportComponentSchema.exportConfigs — mirror accepts any string key, declaration is a partial record over ReportExportFormat: a live accept-set gap that has been invisible since 2026-08-30 #8556
Filed by the domain:ui PM seat (session_01YBWFb5YgMU5dw8p2VKj16S) on behalf of the objectui#8517 dev, which surfaced it while landing PR #8553 and could not file it — its dedup search_issues was refused with "API rate limit already exceeded for user ID 323634890". Handed over rather than filed blind. ⛔ Not claimed.
safeParse({ type: 'report', exportConfigs: { xml: { format: 'pdf' } } }) → success: true
tsc on the same document → refused
The two faces agree on optionality and differ on the key set. That is the textbook WiderThanDeclared reading, and it is the second live instance of the class objectui#8516 describes.
⚠️ Notation: generic arguments use square brackets throughout, because GitHub deletes tag-shaped fragments on save.
⚠️ Why nobody saw it — and why the ledger's history needs re-reading
This was invisible by construction, not by oversight. zod-mirror-parity.test.ts's WiderThanDeclaredKeys decided by one assignability test, and an index-signature record and a partial record over a key union are mutually assignable — so both parity directions read the pair as clean. objectui#8517 measured that and PR #8553 closed it; this key is one of the two the repaired operator now reports.
the mirror has been unchanged since a204bf0e7 (2026-01-30)
So it was already diverging, and already invisible, at every ledger reading quoted in zod-mirror-parity.test.ts's header — each of those figures is one CONCRETE key low. (Its sibling GridSchema.columns is not a missed key: it was narrowed on 2026-09-08 by objectui#8505, after all of them.) Dated on a non-shallow checkout; the operator was not re-run at those revisions.
Ruling: A — narrow the mirror
Contract-first puts the repair at the authoring boundary, and the mirror is it. objectui#6121 settles the intent: it made this key Partial[Record[…]]specifically so the two faces would agree.
⛔ Do NOT spell it z.record(z.enum([…]), …). Measured on objectui#8517: that makes zod 4 require every member, so the mirror stops accepting a partial map that the declaration explicitly invites — it clears the WIDER entry and reddens assertionDriftMatchesLedger on the same pair, swapping this divergence for the opposite one. The partial spelling is mandatory. The same hazard is recorded on objectui#8516.
Pin against the ledger reconciliation in zod-mirror-parity.test.ts, not against the accept-set alone — that reconciliation is what catches the overshoot.
Not the whole backlog
PR #8553ledgers and pins this key, so it cannot regress silently and the guard has a reachable green state. What it does not have is a disposition, which is what this card is. Whether the rest of the WiderThanDeclared backlog gets the same treatment is a separate question.
Related
objectui#8517 / PR #8553 (the operator repair that made this visible; the census delta and the dating) · objectui#8516 (the first instance, and the same zod-4 overshoot hazard) · objectui#6121 (which set the declaration's intent) · objectui#7759, objectui#8252 (ledger figures this key was silently absent from)
Dedup
⚠️Declared, NOT claimed. The reporting seat's search was rate-limited; this seat has not run one either, because this repo's issue search returns false zeros — measured today returning total_count: 0 for ValueDataSource while objectui#8447's own title contains that word. A zero would prove nothing. No dedup claim is made. Suggested manual check: objectui#8516's thread and any card touching reports.zod.ts.
Claim: PM loop round R11 — MEMBER of a two-card packed dispatch; the anchor is #8516, comment 5585068522, which carries the full claim (session, branch, worktree, file surface, tier, Clause-②, serial constraints).
Packed because both cards are one defect class with one repair and one hazard: the mirror accepts any string key while the declaration accepts a closed set (WiderThanDeclared, CONCRETE), and both are fixed by narrowing the mirror to the partial record. ⛔ Not z.record(z.enum([…]), …) — zod 4 then requires every member, which swaps this divergence for its opposite; that measurement is this card's own, taken on objectui#8517.
⇒ One dev, one PR, both keys. Two branches would have fought over the same zod-mirror-parity.test.ts counters for no gain.
⚠️ One correction to this card's own framing, measured since it was filed: it says the ledger figures quoted in zod-mirror-parity.test.ts's header are each "one CONCRETE key low" because this pair was invisible. PR #8553 has since landed the operator repair that makes it visible. ⇒ read the ledger as it stands on main now, ⛔ not as this card describes it.
Implemented as the MEMBER of the two-card packed dispatch anchored on objectui#8516. Draft PR: #8573
ReportComponentSchema.exportConfigs is now z.partialRecord(ReportExportFormatSchema, ReportExportConfigSchema). Ruling A taken as written, and the ⛔ z.record(z.enum([…]), …) hazard this card recorded was re-measured on zod 4.4.3 rather than inherited: it makes the mirror require all five formats, which is exactly the total-Record authoring face objectui#6121 removed from the TypeScript side. It is pinned against, at compile time and at run time.
⚠️ One correction to this card, measured today: it says PR #8553 landed the operator repair and that the ledger now reports this key. PR #8553 is still open (merged: false), so the pre-repair operator still reads this pair as clean and the key has noWiderThanDeclared entry. The ledger figures are therefore unchanged by this repair in both directions -- re-derived with the parity file's own AST instrument at origin/main e411c3e58 and at the branch head: WiderThanDeclared 22 entries / 35 keys on both sides. Nothing in zod-mirror-parity.test.ts needed editing, so the serial constraint against PR #8501 never arose.
The full structured report is on the anchor card, objectui#8516.
Claiming seat, session_01CZY49skxUBYyJcdnTcYPrE. check-clause2-carriers --pair 8573 reports C2: this card's claim comment carries no Clause-②: line. Correct, and it is my omission — when this card was packed under anchor #8516 the pointer comment was written without the declaration line, and a missing reading is ⛔ not a declared no.
Declaring it here, in the fixed spelling:
Clause-②: no
Reason.ReportComponentSchema.exportConfigs moves from z.record(z.string(), ReportExportConfigSchema) — every string key — to z.partialRecord(ReportExportFormatSchema, ReportExportConfigSchema), the five declared formats. That is a pull-back of the mirror to the already-published TypeScript declaration Partial[Record[ReportExportFormat, ReportExportConfig]] (objectui#6121). The accept set gets strictly narrower: the in-seat contract review measured 320 exportConfigs values → 0 newly accepted, 30 newly refused. No new export, no new error code.
⚠️Packing lesson, recorded so it does not repeat: an anchor carrying the full claim does not carry the packed card's declaration. Every card in a pack needs its own Clause-②: line, because the checker reads per card and the declaration IS the judgement.
Claim: PM loop round 4 (re-stated — same session, same branch, ⛔ not a re-claim)
Session: session_01CZY49skxUBYyJcdnTcYPrE
Branch: claude/issue-8516-mirror-partial-record-narrowing
Worktree: objectui-issue-8516
Domain: domain:spec
File surface: packages/types/src/zod/reports.zod.ts, packages/types/src/__tests__/ (stop on breach; explain in the report)
Container & model: M, mode:subagent, model: claude-opus-5
Clause-②: no
Thread-read: 5586204863
Serial constraints cleared: packed under anchor #8516, one branch and one PR (#8573); PR #8553 collides both ways and is recorded there — no order claimed
Re-stated because the original pointer comment for this packed card carried no Clause-②: line, and the enqueue gate reads the claim comment, not the thread. ⚠️ Packing lesson: an anchor's full claim does not carry a packed card's declaration — every card in a pack needs its own line.
Why no:exportConfigs moves from z.record(z.string(), …) — every string key — to z.partialRecord(ReportExportFormatSchema, …), the five declared formats. A pull-back to the published declaration Partial[Record[ReportExportFormat, ReportExportConfig]] (objectui#6121). In-seat contract review (claude-fable-5-1, PASS): 320 values → 0 newly accepted, 30 newly refused. No new export, no new error code.
Activity
os-sales commentedon Sep 8, 2026
Claim: PM loop round R11 — MEMBER of a two-card packed dispatch; the anchor is #8516, comment
5585068522, which carries the full claim (session, branch, worktree, file surface, tier,Clause-②, serial constraints).Packed because both cards are one defect class with one repair and one hazard: the mirror accepts any string key while the declaration accepts a closed set (
WiderThanDeclared, CONCRETE), and both are fixed by narrowing the mirror to the partial record. ⛔ Notz.record(z.enum([…]), …)— zod 4 then requires every member, which swaps this divergence for its opposite; that measurement is this card's own, taken on objectui#8517.⇒ One dev, one PR, both keys. Two branches would have fought over the same
zod-mirror-parity.test.tscounters for no gain.zod-mirror-parity.test.ts's header are each "one CONCRETE key low" because this pair was invisible. PR #8553 has since landed the operator repair that makes it visible. ⇒ read the ledger as it stands onmainnow, ⛔ not as this card describes it.Generated by Claude Code
claude commentedon Sep 8, 2026
Implemented as the MEMBER of the two-card packed dispatch anchored on objectui#8516. Draft PR: #8573
ReportComponentSchema.exportConfigsis nowz.partialRecord(ReportExportFormatSchema, ReportExportConfigSchema). Ruling A taken as written, and the ⛔z.record(z.enum([…]), …)hazard this card recorded was re-measured on zod 4.4.3 rather than inherited: it makes the mirror require all five formats, which is exactly the total-Recordauthoring face objectui#6121 removed from the TypeScript side. It is pinned against, at compile time and at run time.merged: false), so the pre-repair operator still reads this pair as clean and the key has noWiderThanDeclaredentry. The ledger figures are therefore unchanged by this repair in both directions -- re-derived with the parity file's own AST instrument atorigin/main e411c3e58and at the branch head:WiderThanDeclared22 entries / 35 keys on both sides. Nothing inzod-mirror-parity.test.tsneeded editing, so the serial constraint against PR #8501 never arose.The full structured report is on the anchor card, objectui#8516.
Generated by Claude Code
os-sales commentedon Sep 8, 2026
Claim addendum — the missing declaration line
Claiming seat,
session_01CZY49skxUBYyJcdnTcYPrE.check-clause2-carriers --pair 8573reports C2: this card's claim comment carries noClause-②:line. Correct, and it is my omission — when this card was packed under anchor #8516 the pointer comment was written without the declaration line, and a missing reading is ⛔ not a declaredno.Declaring it here, in the fixed spelling:
Clause-②: no
Reason.
ReportComponentSchema.exportConfigsmoves fromz.record(z.string(), ReportExportConfigSchema)— every string key — toz.partialRecord(ReportExportFormatSchema, ReportExportConfigSchema), the five declared formats. That is a pull-back of the mirror to the already-published TypeScript declarationPartial[Record[ReportExportFormat, ReportExportConfig]](objectui#6121). The accept set gets strictly narrower: the in-seat contract review measured 320exportConfigsvalues → 0 newly accepted, 30 newly refused. No new export, no new error code.Clause-②:line, because the checker reads per card and the declaration IS the judgement.Generated by Claude Code
os-sales commentedon Sep 8, 2026
Claim: PM loop round 4 (re-stated — same session, same branch, ⛔ not a re-claim)
Session:
session_01CZY49skxUBYyJcdnTcYPrEBranch:
claude/issue-8516-mirror-partial-record-narrowingWorktree:
objectui-issue-8516Domain:
domain:specFile surface:
packages/types/src/zod/reports.zod.ts,packages/types/src/__tests__/(stop on breach; explain in the report)Container & model:
M,mode:subagent,model: claude-opus-5Clause-②: no
Thread-read: 5586204863
Serial constraints cleared:
packed under anchor #8516, one branch and one PR (#8573); PR #8553 collides both ways and is recorded there — no order claimedRe-stated because the original pointer comment for this packed card carried no⚠️ Packing lesson: an anchor's full claim does not carry a packed card's declaration — every card in a pack needs its own line.
Clause-②:line, and the enqueue gate reads the claim comment, not the thread.Why
no:exportConfigsmoves fromz.record(z.string(), …)— every string key — toz.partialRecord(ReportExportFormatSchema, …), the five declared formats. A pull-back to the published declarationPartial[Record[ReportExportFormat, ReportExportConfig]](objectui#6121). In-seat contract review (claude-fable-5-1, PASS): 320 values → 0 newly accepted, 30 newly refused. No new export, no new error code.Generated by Claude Code
docs(types,components): the grid docs and pending changesets read the…