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_9999 → 0.
⭐ The sharper half — the one renderer outside the six
RecordQuickActions* has 0 occurrences anywhere in packages/types/src (firing control in the
same corpus: RecordChatterComponentProps → 8). 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
- 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.
- If it is authorable, the repair is family-wide, ⛔ not per-block: five renderers gain a read.
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
Raised by the⚠️ NOT MEASURED
os-devseat delivering objectui#8968 (PR #9555) — the card's ownrow — and re-measured in this seat before filing, ⛔ not adopted from the report.
objectui
origin/main=8d50bc2bf4,2026-09-15T03:20Z.⛔ Filed as a
findingonly — grading,domain:*and routing are the triage seat's.The shape
aria?: RecordComponentAriaPropsis declared on six interfaces inpackages/types/src/record-components.ts:RecordDetailsComponentProps·RecordHighlightsComponentProps·RecordRelatedListComponentProps·RecordActivityComponentProps·RecordChatterComponentProps·RecordPathComponentPropsExactly one of the six reads it. Corpus
packages/plugin-detail/src, tests excluded:ariaariarecord-path.tsx(schema.aria as any)?.label || t('detail.pathLabel'), twicerecord-quick-actions.tsx(schema.aria?.ariaLabel ?? schema.aria?.label) || 'Quick actions'record-details·record-highlights·record-related-list·record-activity·record-chatterInstrument readings, same corpus:
read('aria')0,config.aria0,feed.aria0,schema.aria11 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 samecorpus and same instrument:
read('filterMode')→ 1. Absent-token controlqqzz_absent_token_9999→ 0.⭐ The sharper half — the one renderer outside the six
RecordQuickActions*has 0 occurrences anywhere inpackages/types/src(firing control in thesame corpus:
RecordChatterComponentProps→ 8). Sorecord:quick_actionshas no declaredprops interface, and it is the renderer that reads
ariahardest — through an optional chain anda two-key fallback, with an
as anysibling atrecord-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-devthat measured it made the right call in notfixing it: repairing
ariaonly on the chatter path would makerecord:chatterhonour a memberrecord:activitystill drops — the exact asymmetry objectui#8968 exists to remove, reopened one keyalong.
What a repair has to decide, and ⛔ it is not obvious
ariaon these blocks an authorable member, or documentation of a shape the host supplies?Closing it properly means deciding how an authored
labelcomposes with the accessible nameRecordActivityTimelinealready sets on its own section — an a11y question, not a typing one.record:quick_actionsneeds a declared props interface either way, or it needs itsariareadremoved — today it reads a key no face of its own declares.
packages/plugin-detail/src/index.tsxalready records the adjacent fact in a comment: the specshape carries
ariawhilerecord:activity's registration does not declare it. This card is themeasured version of that note.
Dedup: the delivering seat ran one targeted search (52 family matches; nearest objectui#8649 — twelve⚠️ REST
UNDECLARED reads across four record renderers, the opposite pole — plus #9553 / #7353 / #7690,
declared-but-unread on other surfaces); none is about
ariaon therecord:*blocks./search/*is 403 for this seat by egress policy, so that channel was MCP; declared rather thanpresented as a REST reading.
Generated by Claude Code