Skip to content

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

Description

@os-justin

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.

The divergence

face shape
mirror — reports.zod.ts z.record(z.string(), ReportExportConfigSchema)
declaration Partial[Record[ReportExportFormat, ReportExportConfig]]

Measured at runtime:

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 dating matters:

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 #8553 ledgers 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.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdomain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanepackage: typespriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions