Skip to content

spec: retire ChartConfigSchema.aria — no renderer ever applied it and the node-level ariaLabel / ariaDescribedBy / role already carry the accessibility vocabulary (objectui#4044 ruling C, the dashboard.aria precedent) #17751

Description

@os-tesla

Filed by the director seat on the maintainer's ruling for objectui#4044 (decision batch #118 item 2, 2026-09-12: 「其他同意」 to the seat's recommendation C — judge the protocol wrong for this one key). ⛔ packages/spec is the domain:spec seat's; the director seat writes no repo file.

Governing text

  • Maintainer standing ruling (2026-09-10, verbatim): 「我们的项目以objectstack 协议为准,文档应该以实际实现为准。协议不正确的应该先修改协议。」
  • objectui#4044 ruling (5617466747) — implementation follows the protocol for DashboardWidget.chartConfig; PR objectui#9202 (merged 2026-09-11) forwarded 9 of the 10 DO-NOW keys. The one it could not forward is aria, and the seat stopped and reported (objectui#4044 comment 5639000150).
  • Precedent, verbatim from objectui/packages/types/src/complex.ts:1915-1925: "the spec removed dashboard.aria at the POST /data/sharing/rules 绕过 SharingRuleSchema:criteria 缺失或拼错静默变成"共享该对象全部记录",与 ADR-0049 "never seeded as a permissive match-all" 直接冲突 #3896 audit close-out (no dashboard renderer ever applied it), so DashboardSchema.shape.aria is a tombstone that refuses any value" — pinned by __tests__/dashboard-aria-retired-contract-twins.test.ts.

The defect in the protocol

ChartConfigSchema.aria (packages/spec/src/ui/… — locate by symbol) declares a nested accessibility object on a chart's configuration. Measured on objectui origin/main (5639000150): no renderer reads it — ChartRenderer drops every prop but schema / onChartClick, AdvancedChartImpl declares no aria prop, normalizeChartSchema names it nowhere; forwarding it nested or flattened changed nothing in the DOM (lit control: description sets aria-label / role='img' on the same node). Meanwhile the platform already carries ONE accessibility vocabulary at the node level — BaseSchema.ariaLabel / ariaDescribedBy / role, converted to DOM attributes by SchemaRenderer.resolveAriaProps everywhere. chartConfig.aria is a second, block-local spelling of the same thing, with no reader, and giving it a reader would create two accessible-name sources on one element that then need a precedence rule.

⇒ Long-term shape: one node, one accessibility vocabulary, at the base node. The key is retired the way dashboard.aria was.

What to do

  1. Retire ChartConfigSchema.aria: tombstone that refuses any value with a message naming the flat trio on the node (ariaLabel / ariaDescribedBy / role), following the dashboard.aria shape.
  2. ADR-0087 semantic migration entry: chartConfig.aria.label → node ariaLabel, chartConfig.aria.describedBy → node ariaDescribedBy (adjust to the key's actual members), lossless where the members map one-to-one; a structured TODO for any member that does not.
  3. Liveness ledger row for widgets.chartConfig updated to the measured truth (this key never live); #17385 (xAxis / yAxis / series vs dataset derivation) is the sibling protocol card on the same row — coordinate, ⛔ do not fold.
  4. major changeset (a declared key stops parsing), Clause-②: no (narrowing).
  5. objectui#4044 is pm:blocked on this card; when it lands, objectui's contract twins gain the tombstone pin and the dashboard aria question closes.

Refs

objectui#4044 · objectui#9202 · objectui#5830 / #3896 (the dashboard.aria retirement) · #17385 · packages/types/src/complex.ts:1915-1925 (objectui)

Filed by the director seat, session_01QsCVSivtpwT6ZXs5Rtvqxe, 2026-09-12T02:1xZ, with Claude Code.


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions