Carved out of objectui#7546 by the domain:ui PM seat before PR #7684 lands. #7684 carries Fixes #7546, so the merge closes that card — and the axis-config dialect below is measured in #7546's own body and would sink with it. Filed so it keeps a carrier.
What #7546 measured, verbatim from its body
Also undeclared, though merely passed through rather than stripped, on ChartSchema itself: xAxis (the axis config object dialect — field, format, title, showGridLines, min, max, position, logarithmic) and yAxis, both read by normalizeAxis / normalizeChartSchema at lines 204-220 and 287-298. #7113 deliberately folded only the bare-string xAxis and left the object dialect untouched, because folding it would discard its presentation keys — declaring it is the follow-up this finding covers.
And its warning, which is the reason this is a card and not a patch:
⚠️ Whether the axis-config object should be declared at all — versus retired under ADR-0049 if no authored document uses it — is a triage question, not a foregone conclusion.
Why this is a different card, not the same one
The series-key half of #7546 (#7684) is about a non-strict z.object that STRIPS an undeclared key. This half is the opposite mechanism: ChartSchema sits on BaseSchema, which is .passthrough(), so an undeclared key is KEPT and reaches the renderer — only its value goes unchecked. Same finding family, different failure mode, and the two need different liveness reads.
What is NOT decided
⛔ Do not open with "declare the eight keys". ADR-0049 is enforce-or-remove, and the retire arm is live here: if no authored document writes the object dialect, the correct outcome is retirement, not declaration. The first work on this card is the liveness read, per key, with lit controls — docs, fixtures, designer inputs, and real producers — exactly as #7684 did for the six series keys and for chartType.
Note the shape #7684 established for a key that measures dead: it was reported, not retired and not declared, because retiring it is a narrowing that needs its own card and its own changeset grade. The same discipline applies here.
Carrier note
Do not fold this into #7684. That PR's scope fence is deliberate and its review is in flight.
Generated by Claude Code
Carved out of objectui#7546 by the
domain:uiPM seat before PR #7684 lands. #7684 carriesFixes #7546, so the merge closes that card — and the axis-config dialect below is measured in #7546's own body and would sink with it. Filed so it keeps a carrier.What #7546 measured, verbatim from its body
And its warning, which is the reason this is a card and not a patch:
Why this is a different card, not the same one
The series-key half of #7546 (#7684) is about a non-strict
z.objectthat STRIPS an undeclared key. This half is the opposite mechanism:ChartSchemasits onBaseSchema, which is.passthrough(), so an undeclared key is KEPT and reaches the renderer — only its value goes unchecked. Same finding family, different failure mode, and the two need different liveness reads.What is NOT decided
⛔ Do not open with "declare the eight keys". ADR-0049 is enforce-or-remove, and the retire arm is live here: if no authored document writes the object dialect, the correct outcome is retirement, not declaration. The first work on this card is the liveness read, per key, with lit controls — docs, fixtures, designer
inputs, and real producers — exactly as #7684 did for the six series keys and forchartType.Note the shape #7684 established for a key that measures dead: it was reported, not retired and not declared, because retiring it is a narrowing that needs its own card and its own changeset grade. The same discipline applies here.
Carrier note
Do not fold this into #7684. That PR's scope fence is deliberate and its review is in flight.
Generated by Claude Code