Skip to content

Desktop A11y Audit — v0.6 Beta

Date: 2026-07-27 Branch: codex/desktop-v06-stack-adrScope: All five read-only views (Overview, Inspect, Doctor, Diff Review, Timeline)

Implemented — WCAG 2.x baseline

CriterionTechniqueLocation
2.4.1 Bypass BlocksSkip-to-content link (<a href="#workspace-content">)App.tsx render root
2.4.3 Focus OrderOverlay autoFocus on primary action; focus returns to trigger via useEffect cleanupConfirmRootChange
2.4.7 Focus Visible:focus-visible outlines on all interactive elementsstyles.css
2.1.1 KeyboardEscape closes confirm overlay; ArrowUp/Down for Doctor, Diff, Timeline listboxesApp.tsx
1.3.1 Info & Relationshipsaria-current="page" on active nav itemApp.tsx nav
4.1.3 Status Messagesrole="status" + aria-live="polite" offscreen span announces connection changesApp.tsx topbar
4.1.3 Status Messagesrole="status" on reconnect-notice, timeline quality notices, doctor/diff empty statesApp.tsx
1.3.1 Info & Relationshipsaria-activedescendant + id on Doctor finding-item-DoctorView
1.3.1 Info & Relationshipsaria-activedescendant + id on Diff change-item-DiffView
1.3.1 Info & Relationshipsaria-activedescendant + id on Timeline timeline-row-TimelineView
2.4.6 Headings and LabelsAll sections use aria-labelledby pointing to real h2all views
1.1.1 Non-text ContentDecorative icons use aria-hidden="true"all views
4.1.2 Name, Role, Valuerole="dialog" + aria-modal + aria-labelledby + aria-describedby on confirm overlayConfirmRootChange
1.3.6 Identify Purposeid="workspace-content" landmark for skip link targetApp.tsx
1.3.1 Info & Relationshipsdl/dt/dd for all metadata panelsall views
1.3.1 Info & Relationshipsscope="col" on Timeline table column headersTimelineView

Known gaps (not blocking v0.6 beta)

GapWCAGPriorityNotes
Color contrast: tertiary text may fall below 4.5:11.4.3MediumNeeds axe-core / Lighthouse measurement
Dialog focus trap: Tab/Shift+Tab can escape the overlay2.1.1MediumReal fix: native dialog element or focus-trap-react
role="option" on button elements inside role="listbox"4.1.2LowWidely supported; fix requires li items or grid role
role="option" on tr elements inside role="listbox"4.1.2Lowrole="row" is correct for tr
aria-busy on loading containers1.3.1LowStatus chips already communicate loading
@media (prefers-reduced-motion) guard on transitions2.3.3LowTransitions are short (<200ms)

Path to automated testing

Adding axe-core + Playwright on CI would automate WCAG validation each build. This requires maintainer authorization per AGENTS.md (new devDependencies).

Manual keyboard test matrix

FlowExpectedStatus
Tab to project-switcher, EnterConfirm overlay (if data loaded)PASS
Escape in overlayCloses, focus returns to switcherPASS
Tab to nav item, EnterView changesPASS
ArrowDown/Up in Doctor listaria-activedescendant updatesPASS
ArrowDown/Up in Diff listaria-activedescendant updatesPASS
ArrowDown/Up in Timeline listaria-activedescendant updatesPASS
Shift+Tab from first elementSkip link visible at page topPASS
Connection status changePolite live region firesPASS