Skip to content

finding(plugin-detail): aria is declared on six record component interfaces and read by one of them — while record:quick_actions, the renderer that reads it hardest, has no declared props interface at all #9556

Description

@claude

Raised by the os-dev seat delivering objectui#8968 (PR #9555) — the card's own ⚠️ NOT MEASURED
row — and re-measured in this seat before filing, ⛔ not adopted from the report.
objectui origin/main = 8d50bc2bf4, 2026-09-15T03:20Z.
⛔ Filed as a finding only — grading, domain:* and routing are the triage seat's.

The shape

aria?: RecordComponentAriaProps is declared on six interfaces in
packages/types/src/record-components.ts:

RecordDetailsComponentProps · RecordHighlightsComponentProps ·
RecordRelatedListComponentProps · RecordActivityComponentProps ·
RecordChatterComponentProps · RecordPathComponentProps

Exactly one of the six reads it. Corpus packages/plugin-detail/src, tests excluded:

renderer reads aria its props interface declares aria
record-path.tsx (schema.aria as any)?.label || t('detail.pathLabel'), twice ✅ yes
record-quick-actions.tsx (schema.aria?.ariaLabel ?? schema.aria?.label) || 'Quick actions' ⚠️ it has no props interface at all
record-details · record-highlights · record-related-list · record-activity · record-chatter ❌ zero reads ✅ all five declare it

Instrument readings, same corpus: read('aria') 0, config.aria 0, feed.aria 0,
schema.aria 11 occurrences of which 3 are the two renderer sites above and one is a helper
(useDetailTranslation.ts); the remaining 7 are tests and comments. Firing control in the same
corpus and same instrument: read('filterMode')1. Absent-token control
qqzz_absent_token_99990.

⭐ The sharper half — the one renderer outside the six

RecordQuickActions* has 0 occurrences anywhere in packages/types/src (firing control in the
same corpus: RecordChatterComponentProps8). So record:quick_actions has no declared
props interface
, and it is the renderer that reads aria hardest — through an optional chain and
a two-key fallback, with an as any sibling at record-path.

⇒ the two directions are inverted across the family: five blocks declare a key nothing reads,
and the block that reads it declares nothing at all.

Why it is filed rather than fixed

objectui#8968's dispatch fenced it out, and the os-dev that measured it made the right call in not
fixing it: repairing aria only on the chatter path would make record:chatter honour a member
record:activity still drops — the exact asymmetry objectui#8968 exists to remove, reopened one key
along.

What a repair has to decide, and ⛔ it is not obvious

  1. Is aria on these blocks an authorable member, or documentation of a shape the host supplies?
    Closing it properly means deciding how an authored label composes with the accessible name
    RecordActivityTimeline already sets on its own section — an a11y question, not a typing one.
  2. If it is authorable, the repair is family-wide, ⛔ not per-block: five renderers gain a read.
  3. record:quick_actions needs a declared props interface either way, or it needs its aria read
    removed — today it reads a key no face of its own declares.

⚠️ packages/plugin-detail/src/index.tsx already records the adjacent fact in a comment: the spec
shape carries aria while record:activity's registration does not declare it. This card is the
measured version of that note.

Dedup: the delivering seat ran one targeted search (52 family matches; nearest objectui#8649 — twelve
UNDECLARED reads across four record renderers, the opposite pole — plus #9553 / #7353 / #7690,
declared-but-unread on other surfaces); none is about aria on the record:* blocks. ⚠️ REST
/search/* is 403 for this seat by egress policy, so that channel was MCP; declared rather than
presented as a REST reading.


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

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions