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

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions