a11y in CI: axe-core gate + accessibility-tree snapshots as the screen-reader proxy #222

Closed
opened 2026-09-18 21:41:08 -04:00 by jared · 1 comment
Owner

Lowest priority per the owner. A real NVDA/VoiceOver pass still needs a human, but the machine-checkable part can run on every push: @axe-core/playwright over login, room timeline, settings, room settings, thread panel (baseline from 2026-09-18 on #185: 0 critical on the room view after the label fixes), failing the job on new critical/serious findings; plus Playwright aria snapshots of the composer, message menu, thread panel and settings so name/role/live-region regressions show up as diffs. Remaining known items to burn down first: aria-selected on NavItem divs, composer placeholder contrast, one <main> landmark, the voice-limit input label.

Lowest priority per the owner. A real NVDA/VoiceOver pass still needs a human, but the machine-checkable part can run on every push: `@axe-core/playwright` over login, room timeline, settings, room settings, thread panel (baseline from 2026-09-18 on #185: 0 critical on the room view after the label fixes), failing the job on new `critical`/`serious` findings; plus Playwright `aria snapshots` of the composer, message menu, thread panel and settings so name/role/live-region regressions show up as diffs. Remaining known items to burn down first: `aria-selected` on `NavItem` divs, composer placeholder contrast, one `<main>` landmark, the voice-limit input label.
jared added this to the Features 2026-Q4 milestone 2026-09-18 21:41:08 -04:00
jared added the priority: lowa11yarea: build-ci labels 2026-09-18 21:41:08 -04:00
Author
Owner

Done in 6aa77552 (CI #2005 green).

e2e/a11y.spec.ts: @axe-core/playwright (WCAG 2.x A/AA tags) over login, room timeline + composer, message options menu, thread panel, user settings, room settings — fails on critical/serious except color-contrast, which is printed but not gated (the hits are generated avatar colours like white-on-#009699 initials and a portal false positive on the settings dialog; listed in the log each run). Aria snapshots of the composer, message menu, thread panel and settings nav live in e2e/a11y.spec.ts-snapshots/ (dynamic bits as regexes).

Burned down what the first run found:

  • NavItem divs carried aria-selected (axe critical) → now data-selected for styling + aria-current="page"
  • composer placeholder was 2.3:1 → P300 opacity
  • voice-limit and explore "custom limit" number inputs had no label
  • thread panel is an <aside aria-label="Thread">, the settings modal has role=dialog, the settings sections are a <nav>, the message action menu is labelled

A real NVDA/VoiceOver pass is still a human task.

Done in 6aa77552 (CI #2005 green). `e2e/a11y.spec.ts`: `@axe-core/playwright` (WCAG 2.x A/AA tags) over login, room timeline + composer, message options menu, thread panel, user settings, room settings — fails on **critical/serious** except `color-contrast`, which is printed but not gated (the hits are generated avatar colours like white-on-`#009699` initials and a portal false positive on the settings dialog; listed in the log each run). Aria snapshots of the composer, message menu, thread panel and settings nav live in `e2e/a11y.spec.ts-snapshots/` (dynamic bits as regexes). Burned down what the first run found: - `NavItem` divs carried `aria-selected` (axe critical) → now `data-selected` for styling + `aria-current="page"` - composer placeholder was 2.3:1 → P300 opacity - voice-limit and explore "custom limit" number inputs had no label - thread panel is an `<aside aria-label="Thread">`, the settings modal has `role=dialog`, the settings sections are a `<nav>`, the message action menu is labelled A real NVDA/VoiceOver pass is still a human task.
jared closed this issue 2026-09-20 14:14:59 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#222