Observation-class finding. Nothing breaks today — filed so it is recorded rather than rediscovered. Unassigned and unlabelled for triage to grade.
Surfaced during objectstack PR #6854 (the aria tombstone re-aim, objectstack#6756) by a dev working the spec side; it had no worktree in this repo, so it reported the observation upward rather than opening a cross-repo PR. Verified independently here before filing.
The finding
packages/react/src/spec-bridge/bridges/form-view.ts:193:
if(spec.aria)node.aria=spec.aria;
FormViewSchema.aria is a retiredKey() tombstone — objectstackpackages/spec/src/ui/view.zod.ts:1807 — so a form view carrying aria no longer parses. The guard can never be true for any spec that passed validation, and the assignment is unreachable.
Why it is dormant rather than broken
retiredKey() returns z.never({ error: … }).optional(), so the key is rejected at the parse rather than stripped. A FormView reaching this bridge has therefore already been validated without an aria, and spec.aria is always undefined. No renderer output changes, and no test can distinguish the branch from its absence — which is exactly why it survived the retirement.
Corroborating measurement (from PR #6854's ledger sweep)
aria is a live authoring surface on some carriers and retired on others, and the split is recorded in objectstack's own liveness ledgers:
| carrier | ledger verdict |
|---|
page.aria, page.components[].aria | live — applied by objectui renderers |
list view aria (view.zod.ts:1280) | live — plugin-list/src/ListView.tsx applies aria-label/-describedby/-live |
action.aria | live, but graded PARTIAL |
form view aria | dead — this finding |
app.aria, dashboard.aria, dashboard.widgets[].aria | dead |
So this is not "ARIA support was removed"; it is one carrier among several, and the bridge kept a read for the one that went away.
Suggested direction
Non-binding: delete the line. If instead it is kept deliberately — e.g. as tolerance for pre-17 stored documents that bypass validation on some path — that intent should be written down at the site, because as it stands the code reads as live support for an authoring key the contract refuses.
⚠️ Worth measuring before deleting: whether any path feeds this bridge a non-validated object (a stored document read straight from persistence, a fixture, or a test double). If one exists, the line is load-bearing for that path and the fix is different. I did not measure that here.
Not in scope
- The objectstack-side tombstone and its prescription — correct as of objectstack PR #6854, which re-aimed the sibling
aria prescriptions at their measured-live carriers. - Other
spec.* reads in this bridge; only aria was measured.
Provenance
objectuiorigin/main: git grep -n "spec.aria" -- packages/react/src/spec-bridge/bridges/form-view.ts → single hit at :193.objectstackorigin/main: git grep -n "aria:" -- packages/spec/src/ui/view.zod.ts → :1280 live (list view), :1807retiredKey( (form view). Both read at their respective origin/main, not a working tree.- Control against a false reading: the same query distinguishes the live list-view carrier from the retired form-view one in the same file, so the instrument is not simply matching any
aria.
Observation-class finding. Nothing breaks today — filed so it is recorded rather than rediscovered. Unassigned and unlabelled for triage to grade.
Surfaced during objectstack PR #6854 (the
ariatombstone re-aim, objectstack#6756) by a dev working the spec side; it had no worktree in this repo, so it reported the observation upward rather than opening a cross-repo PR. Verified independently here before filing.The finding
packages/react/src/spec-bridge/bridges/form-view.ts:193:FormViewSchema.ariais aretiredKey()tombstone —objectstackpackages/spec/src/ui/view.zod.ts:1807— so a form view carryingariano longer parses. The guard can never be true for any spec that passed validation, and the assignment is unreachable.Why it is dormant rather than broken
retiredKey()returnsz.never({ error: … }).optional(), so the key is rejected at the parse rather than stripped. AFormViewreaching this bridge has therefore already been validated without anaria, andspec.ariais alwaysundefined. No renderer output changes, and no test can distinguish the branch from its absence — which is exactly why it survived the retirement.Corroborating measurement (from PR #6854's ledger sweep)
ariais a live authoring surface on some carriers and retired on others, and the split is recorded in objectstack's own liveness ledgers:page.aria,page.components[].ariaaria(view.zod.ts:1280)plugin-list/src/ListView.tsxappliesaria-label/-describedby/-liveaction.ariaariaapp.aria,dashboard.aria,dashboard.widgets[].ariaSo this is not "ARIA support was removed"; it is one carrier among several, and the bridge kept a read for the one that went away.
Suggested direction
Non-binding: delete the line. If instead it is kept deliberately — e.g. as tolerance for pre-17 stored documents that bypass validation on some path — that intent should be written down at the site, because as it stands the code reads as live support for an authoring key the contract refuses.
Not in scope
ariaprescriptions at their measured-live carriers.spec.*reads in this bridge; onlyariawas measured.Provenance
objectuiorigin/main:git grep -n "spec.aria" -- packages/react/src/spec-bridge/bridges/form-view.ts→ single hit at:193.objectstackorigin/main:git grep -n "aria:" -- packages/spec/src/ui/view.zod.ts→:1280live (list view),:1807retiredKey((form view). Both read at their respectiveorigin/main, not a working tree.aria.