Problem
#344 added visual keyboard-focus rings and reduced-motion support, but assistive-technology semantics are still missing across the console. Several dynamic surfaces convey state purely visually:
- StatusPill (
components/StatusPill.tsx): run status (planning → running → completed/failed) changes with no role="status" / aria-live="polite", so screen readers never announce execution state transitions.
- EventStream log (
components/EventStream.tsx): telemetry lines append with no role="log" / aria-live, so SR users get no feedback as events stream in.
- Navigation (
App.tsx): nav buttons track selection only via data-active; no aria-current (or tab semantics), so the active view isn't exposed to AT.
- ApprovalDrawer (
components/ApprovalDrawer.tsx): a blocking approve/reject decision surface with icon-only ⚠ and a bare risk token; no role="group"/aria-label tying the controls to the request.
Proposed change
- Add
role="status"/aria-live="polite" to StatusPill (announce label changes).
- Add
role="log"/aria-live="polite"/aria-relevant="additions" to the stream log container.
- Add
aria-current="page" to the active nav item.
- Give ApprovalDrawer an
aria-label describing the pending approval and a text alternative for the warning glyph/risk.
Purely additive ARIA attributes — no behavioral or visual change.
Scope
components/StatusPill.tsx, components/EventStream.tsx, components/ApprovalDrawer.tsx, renderer/App.tsx. Independent of the TaskComposer cleanup issue (no shared files).
Category / priority
Accessibility (P2). Distinct from #344, which covered only visual focus + motion.
Problem
#344 added visual keyboard-focus rings and reduced-motion support, but assistive-technology semantics are still missing across the console. Several dynamic surfaces convey state purely visually:
components/StatusPill.tsx): run status (planning → running → completed/failed) changes with norole="status"/aria-live="polite", so screen readers never announce execution state transitions.components/EventStream.tsx): telemetry lines append with norole="log"/aria-live, so SR users get no feedback as events stream in.App.tsx): nav buttons track selection only viadata-active; noaria-current(or tab semantics), so the active view isn't exposed to AT.components/ApprovalDrawer.tsx): a blocking approve/reject decision surface with icon-only⚠and a bare risk token; norole="group"/aria-labeltying the controls to the request.Proposed change
role="status"/aria-live="polite"to StatusPill (announce label changes).role="log"/aria-live="polite"/aria-relevant="additions"to the stream log container.aria-current="page"to the active nav item.aria-labeldescribing the pending approval and a text alternative for the warning glyph/risk.Purely additive ARIA attributes — no behavioral or visual change.
Scope
components/StatusPill.tsx,components/EventStream.tsx,components/ApprovalDrawer.tsx,renderer/App.tsx. Independent of the TaskComposer cleanup issue (no shared files).Category / priority
Accessibility (P2). Distinct from #344, which covered only visual focus + motion.