Filed unassigned by the domain:ui execution seat (PM session session_013hfmP9hoMd3dJwTh85J4yB) as the carrier for a deferred ruling, at the explicit condition of the contract review on PR #6945 / card #6150. ⛔ Recording, not choosing — priority:* and any re-grade are triage's.
Why this card exists at all, in the reviewer's words:
Fixes #6150 closes this card on merge, and today those three questions live only in report comments that drop off the open-issue radar the moment it closes. A filed card linked from here turns "interim" into a tracked state instead of a permanent accident.
That is the whole point: #6150 made a real defect visible, and the visibility is about to become invisible again.
What #6150 did, and why it is not the end of the story
#6150 / PR #6945 declares 13 previously-undeclared-but-consumed keys across 8 zod mirrors. Two of those declarations are both halves of an alias pair — the PR declared both spellings deliberately, because both are genuinely read:
| type | pair | read sites (verified on head 065b16b98) |
|---|
TextSchema | content / value | text.tsx:51, text.tsx:56 |
TreeViewSchema | nodes / data | tree-view.tsx:105 |
Declaring both was the right interim call and the review confirmed it: declaring only the winner would have left a working, documented capability unrecorded — the exact defect #6150 exists to fix. And these fallbacks were already in the renderer; the PR did not accrete them, it made them visible and pinned them with winner-naming doc comments. AGENTS.md #0.1 forbids accreting consumer tolerance, which is not what happened.
⚠️But the review was explicit that this is acceptable as an interim and NOT as a permanent state:
Interim: acceptable. Permanent: no — hence the condition.
The ruling this card carries
Under ADR-0049 (enforce-or-remove): retire one spelling of each pair. Two published dialects for one slot is exactly the shape the ADR exists to close, and #6150 has now made both of them declared, which raises the stakes — an undeclared tolerance is a bug, a declared one is a contract.
⛔ This needs a ruling, not a sweep. Each pair needs its own census of authored documents before either spelling can be deleted, and the two pairs may not resolve the same way:
Folded in: TreeViewSchema.data required-ness
Per the implementing dev's own recommendation, the third deferred question folds here rather than getting its own card, because it is the same slot:
data is required on TreeViewSchema while nodes is the spelling the docs name as canonical. Measured by the reviewer at both revs: a nodes-only tree-view document is refused@[data]at base and at head alike — so this is not something #6150 introduced, and #6150 correctly did not fix it. But it means the documented spelling alone does not validate, which is the same defect class from the opposite direction.
Whichever way the pair ruling goes, the required-ness has to move with it. That is why it is one card.
Explicitly NOT in this card
Provenance
Filed unassigned by the
domain:uiexecution seat (PM sessionsession_013hfmP9hoMd3dJwTh85J4yB) as the carrier for a deferred ruling, at the explicit condition of the contract review on PR #6945 / card #6150. ⛔ Recording, not choosing —priority:*and any re-grade are triage's.Why this card exists at all, in the reviewer's words:
That is the whole point: #6150 made a real defect visible, and the visibility is about to become invisible again.
What #6150 did, and why it is not the end of the story
#6150 / PR #6945 declares 13 previously-undeclared-but-consumed keys across 8 zod mirrors. Two of those declarations are both halves of an alias pair — the PR declared both spellings deliberately, because both are genuinely read:
065b16b98)TextSchemacontent/valuetext.tsx:51,text.tsx:56TreeViewSchemanodes/datatree-view.tsx:105Declaring both was the right interim call and the review confirmed it: declaring only the winner would have left a working, documented capability unrecorded — the exact defect #6150 exists to fix. And these fallbacks were already in the renderer; the PR did not accrete them, it made them visible and pinned them with winner-naming doc comments. AGENTS.md #0.1 forbids accreting consumer tolerance, which is not what happened.
The ruling this card carries
Under ADR-0049 (enforce-or-remove): retire one spelling of each pair. Two published dialects for one slot is exactly the shape the ADR exists to close, and #6150 has now made both of them declared, which raises the stakes — an undeclared tolerance is a bug, a declared one is a contract.
⛔ This needs a ruling, not a sweep. Each pair needs its own census of authored documents before either spelling can be deleted, and the two pairs may not resolve the same way:
content/value—contentis the winner named in the doc comment.content: 42renders today (React renders numbers), so a wrong-typed document can "work" by coincidence. That coincidence is now refused at validation time by finding(types): 13 top-level schema keys that component renderers genuinely READ are declared by no shipped type — measured across all 76content/docs/componentspages #6150 — correctly, per declared-equals-enforced.nodes/data—nodesis the winner named in the doc comment.Folded in:
TreeViewSchema.datarequired-nessPer the implementing dev's own recommendation, the third deferred question folds here rather than getting its own card, because it is the same slot:
datais required onTreeViewSchemawhilenodesis the spelling the docs name as canonical. Measured by the reviewer at both revs: a nodes-only tree-view document isrefused@[data]at base and at head alike — so this is not something #6150 introduced, and #6150 correctly did not fix it. But it means the documented spelling alone does not validate, which is the same defect class from the opposite direction.Whichever way the pair ruling goes, the required-ness has to move with it. That is why it is one card.
Explicitly NOT in this card
optsopen-record shape ruling onCarouselSchema— filed separately, because it turns on a census of authored embla option bags rather than on a spelling choice.ContextMenuSchema.children(required and read by nothing) — already split out as finding(types): 4 more genuinely-read undeclared keys the #6150 census could not see, plus one declared-but-dead key — all on the same 8 renderers #6938 by finding(types): 13 top-level schema keys that component renderers genuinely READ are declared by no shipped type — measured across all 76content/docs/componentspages #6150's dev, correctly not folded.DashboardWidgetSchemaSILENTLY DROPS every undeclared widget key — the file's own docstring names this failure mode, and it still applies to the keys nothing declares #6002 does not cover any of this. It is the unknown-key policy decision, and the review measured that PR feat(types): declare the 13 renderer-read keys that no shipped type declared #6945 provably does not touch it (all 8 mirrors read catchallunknownat base and head, with three-way hot controls distinguishing passthrough / strip / refuse).Provenance
content/docs/componentspages #6150 / PR feat(types): declare the 13 renderer-read keys that no shipped type declared #6945 — the declarations, and the source of all three deferralscontent/docs/componentspages #6150 (comment)childrensibling, split out at the same time