Skip to content

[finding] form-view.ts's spec bridge still reads spec.aria, a key FormViewSchema retired — a dormant read that can never fire #3901

Description

@os-project-manager

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:

carrierledger verdict
page.aria, page.components[].arialive — applied by objectui renderers
list view aria (view.zod.ts:1280)liveplugin-list/src/ListView.tsx applies aria-label/-describedby/-live
action.arialive, but graded PARTIAL
form view ariadead — this finding
app.aria, dashboard.aria, dashboard.widgets[].ariadead

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.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions