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
Measure the strict authoring face before building it: run catalog fixtures, docs json fences and apps through strict node schemas and count undeclared keys per component (first deliverable of the #5250 ruling) #7581
Filed by the director seat from the #5250 ruling (maintainer, 2026-09-04, decision batch #25: option 2 — a strict authoring face as a programme, measurement first). This card is the measurement. ⛔ It builds nothing that ships: no schema in packages/types changes, no gate is wired, .passthrough() on the rendering face is not touched.
Deliverable: a number per component, not a fix
Derive, in a throwaway (a script under scripts/ or a one-off test that is not left in the tree unless the seat decides it is worth keeping as the future gate's skeleton), a strict variant of every node schema in @object-ui/types/zod — the same declared members, unknown keys refused — and run three corpora through it:
every fixture under examples/schema-catalog/src/schemas/**/*.json;
A component with zero undeclared keys is a result too — the programme needs to know how much of the tree is already strict-clean.
Why a measurement card exists at all
The ruling on #5250 is a multi-week programme touching every node schema and AGENTS.md #0.1. Its appetite cannot be set without knowing how red strict goes on today's corpus, and which side of each red is wrong (schema under-declares, or corpus authors garbage). This card produces that reading; the programme cards (strict face on the spec side, validate + fence gate on the devx side) are priced from it on #5250 afterwards.
⛔ Do not flip .passthrough() on BaseSchemaCore; it is load-bearing for renderer props (see the specFieldsExcept docblock).
The throwaway must be reproducible: pin the main SHA it ran against and keep the script in the PR (or attach it to this card) so the numbers can be re-derived after the declaration repairs land.
Clause-②: no (no published surface moves). pm:queue and domain:devx set by the filing seat from the ruling's named executor; triage corrects if the landing point disagrees.
Filed by the director seat from the #5250 ruling (maintainer, 2026-09-04, decision batch #25: option 2 — a strict authoring face as a programme, measurement first). This card is the measurement. ⛔ It builds nothing that ships: no schema in
packages/typeschanges, no gate is wired,.passthrough()on the rendering face is not touched.Deliverable: a number per component, not a fix
Derive, in a throwaway (a script under
scripts/or a one-off test that is not left in the tree unless the seat decides it is worth keeping as the future gate's skeleton), a strict variant of every node schema in@object-ui/types/zod— the same declared members, unknown keys refused — and run three corpora through it:examples/schema-catalog/src/schemas/**/*.json;```jsonfence undercontent/docs/**that parses as a node document (a fence that is a deliberate fragment is counted separately as "fragment", ⛔ not silently skipped — the fragment-marking question finding: no gate reads a doc snippet's schema KEYS against the spec — #4823's deferred "second dimension", closed unbuilt #5138 already costed is part of what this measurement prices);apps/**andpackages/*/examples/**.Report, in the PR or on this card:
safeValidateSchemabecause the Zod mirror names a key its renderer never reads (8 components) #6939's shape — a key the renderer reads but the schema does not declare — versus the retirement worklist in finding(components):button-groupimplements no selection, and never wires the per-buttononClick/disabledit declares — the catalog authors 29 keys nothing reads #7077's shape — a key nothing reads);BaseSchema's own tolerance versus nested unknown keys inside declared members (the TS index signature atpackages/types/src/base.tslines 409 / 441 is the twin of the zod.passthrough(); both faces are measured, the TS side by the probe shape recorded on finding: JSON doc snippets are checked by nothing — the ts/tsx gate cannot see them, andBaseSchema.passthrough()makesobjectui validateaccept arbitrary undeclared keys #5250 comments 5521873763 / 5523535054).A component with zero undeclared keys is a result too — the programme needs to know how much of the tree is already strict-clean.
Why a measurement card exists at all
The ruling on #5250 is a multi-week programme touching every node schema and AGENTS.md #0.1. Its appetite cannot be set without knowing how red strict goes on today's corpus, and which side of each red is wrong (schema under-declares, or corpus authors garbage). This card produces that reading; the programme cards (strict face on the spec side,
validate+ fence gate on the devx side) are priced from it on #5250 afterwards.Constraints
safeValidateSchemabecause the Zod mirror names a key its renderer never reads (8 components) #6939, finding(components):button-groupimplements no selection, and never wires the per-buttononClick/disabledit declares — the catalog authors 29 keys nothing reads #7077,ChartSchemadeclares neither chart-leveldatanorxAxisKey— yet its own JSDoc teaches both, so the corrected chart model documents keys onlyBaseSchema's index signature admits #7549, finding(examples): a catalog menu item authorsvariant: "destructive", a key no arm ofMenuItemdeclares and no menu renderer reads — but the repair has a real fork #7101 already carry several of the likely hits) or list it in the report. A measurement that fixes as it goes stops being a measurement..passthrough()onBaseSchemaCore; it is load-bearing for renderer props (see thespecFieldsExceptdocblock).mainSHA it ran against and keep the script in the PR (or attach it to this card) so the numbers can be re-derived after the declaration repairs land.no(no published surface moves).pm:queueanddomain:devxset by the filing seat from the ruling's named executor; triage corrects if the landing point disagrees.Unlocks: #5250 (
Blocked-by:this card). Refs: #5250 (the ruling and the facet blocks) · #5138 / PR #5161 · #5174 · #5229 · #6939 · #7077 · ADR-0049.