Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

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

Closed

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 — objectstack packages/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

Provenance

  • objectui origin/main: git grep -n "spec.aria" -- packages/react/src/spec-bridge/bridges/form-view.ts → single hit at :193.
  • objectstack origin/main: git grep -n "aria:" -- packages/spec/src/ui/view.zod.ts → :1280 live (list view), :1807 retiredKey( (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.

Activity

  1. os-zhuang commented on Aug 9, 2026

    @os-zhuang
    Contributor

    Triage: finding (held for the findings round, as the filing itself requests).

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. claude commented on Aug 10, 2026

    @claude
    Contributor

    Findings round (periodic re-verification of oldest-checked holds): HOLD maintained (finding unchanged). Re-checked @ origin/main 6b6721c: packages/react/src/spec-bridge/bridges/form-view.ts still carries the dead if (spec.aria) node.aria = spec.aria; guard (~:193). The unmeasured precondition (can any path feed the bridge a non-validated object?) is still unanswered on the card, so the one-line delete stays gated on that measurement.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  3. claude commented on Aug 10, 2026

    @claude
    Contributor

    Findings round (quota re-verification): HOLD maintained (finding unchanged). Re-checked @ origin/main 2b94283: the dead guard is live verbatim — if (spec.aria) node.aria = spec.aria; at packages/react/src/spec-bridge/bridges/form-view.ts:193 — and FormViewSchema.aria remains retired upstream, so the branch is still unreachable for any validated spec. The gating measurement (can any path feed the bridge a non-validated object?) is still unanswered. Pairing note from the 16:20Z round stands: grade together with ui#3974 (defaultSort bridge read) — same spec-bridge-reads-retired-key family, one measurement approach serves both. Held.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  4. claude commented on Aug 11, 2026

    @claude
    Contributor

    Maintainer ruling — 2026-08-11. From the four-lens decision review (platform long-term coherence / measured business pull / AI-agent error-resistance / startup scope discipline); the maintainer accepted the recommendation set in full.

    Ruling: enforce-or-remove. First verify the ledger's dead verdict for this key per the spec-property-retirement discipline (producer-side check against current objectstack main), then remove the bridge read (and the local mirror declaration). One PR together with its pair card objectui#3974 (Fixes both) — one ruling decides both keys, and the diverged dead read is an imitation trap for future agents reading this bridge. State: finding → pm:queue.

    Recorded by the triage seat Routine (#5474 pilot) on the maintainer's direct instruction — ruling record, not a claim.


    Generated by Claude Code

  5. self-assigned this
    on Aug 16, 2026
  6. yinlianghui commented on Aug 16, 2026

    @yinlianghui
    Contributor

    【认领】objectui 分片 PM(session_01GTRjn8xBqp75dk7kFupVRt)批次 11 派发,与 #3974 一 PR 双关(维护者 2026-08-11 裁定 enforce-or-remove)。分支:claude/issue-3901-form-view-dormant-reads。执行序:先量非验证输入路径(裁定的前置门 —— 存证 fixture / 持久化直读 / 测试替身是否喂过这个 bridge),量到 load-bearing 路径即零代码停手回报;确认 dead 后删 form-view.ts:193(aria)与 :188(defaultSort)两条读 + 本地 mirror 声明,Fixes 双卡。


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions