Add blocking accessibility gate: axe scans + keyboard-only onboarding coverage - #134
Conversation
|
CI note: the initial Pushed Verified locally on the bumped stack: audit clean, typecheck, 438 unit tests, full Playwright suite (33 passed / 1 intentional 🤖 Generated with Claude Code |
New specs run inside the existing Playwright step of the required quality job, so they block merges with no CI changes: - tests/e2e/a11y.spec.ts: axe-core scans (WCAG 2.x A/AA, serious/ critical block) of /welcome, onboarding text-entry + match steps, /dashboard, app detail, and the mobile nav drawer (scoped to nav.nav). Known, already-tracked defects are suppressed per rule + selector; each entry names its pending fix, must be deleted in the same PR as that fix, and stale entries print a removal notice. - tests/e2e/onboarding-keyboard.spec.ts: keyboard-only walk of the manual import path (passes), plus a fixme-gated candidate-selection spec that becomes the regression guard once the candidate rows are converted to native controls. - tests/e2e/helpers/axe.ts + keyboard.ts: shared harness (violation filtering/reporting, tabTo reachability helper). First scans surfaced defects beyond the known set, now allowlisted for fixing: icon-only .nav-brand link, aria-hidden annotations sidebar with focusable children, critical aria-required-children on the empty ImportedAppsTable list, and ~15 colour-contrast nodes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The quality job's audit gate fails on every branch since today's advisory batch — none of it introduced by this PR's diff: - next 16.2.9 -> 16.2.11: patches the 2026-07-22 Next.js batch (4 high + 5 moderate, all fixed in 16.2.11) - dompurify 3.4.11 -> 3.4.12: GHSA-c2j3-45gr-mqc4 (low) - sharp forced to ^0.35.0 via the existing pnpm-workspace.yaml overrides block: Next still pins ^0.34.5 transitively, which audit rejects for GHSA-f88m-g3jw-g9cj (libvips CVEs, fixed in 0.35.0). Same pattern as the postcss / @babel/core overrides; drop when Next's own range reaches >=0.35. Verified: pnpm audit --prod clean, typecheck, 438 unit tests, full Playwright suite (33 passed / 1 intentional skip) on a clean production build of next 16.2.11 with sharp 0.35.3. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
4d0ec83 to
fb08e41
Compare
Summary
Adds an accessibility regression gate to the E2E suite.
tests/e2e/a11y.spec.ts— axe-core scans (WCAG 2.x A/AA; serious/critical block, minor/moderate logged) of the five highest-traffic surfaces:/welcome, onboarding text-entry + match steps,/dashboard, app detail, and the mobile nav drawer (scoped tonav.nav).tests/e2e/onboarding-keyboard.spec.ts— keyboard-only walk of the manual import path (passes today), plus afixme-gated candidate-selection spec that becomes the regression guard once the candidate rows are converted to native controls.tests/e2e/helpers/axe.ts/keyboard.ts— shared harness: violation filtering + reporting, known-issue allowlist with stale-entry notices,tabToreachability helper.No CI changes needed: these specs run inside the existing Playwright step of the required
qualityjob, so they block merges automatically.Known-issue allowlist
Already-tracked defects are suppressed per rule + selector; each entry names its pending fix and must be deleted in the same PR as that fix — the harness prints a "known issue no longer detected — remove its allowlist entry" notice once a fix lands. New violations anywhere else fail immediately.
The first scans surfaced defects beyond the previously-known set, now allowlisted for fixing:
link-nameon the icon-only.nav-brandlink (mobile)aria-hidden-focus: collapsed annotations sidebar keeps focusable childrenaria-required-children(critical): emptyImportedAppsTablerenders its hint as the only child of arole="list"containercolor-contrastnodes across the scanned surfaces (full selector list = thecontrast(…)entries ina11y.spec.ts)Note: the unlabeled app-names textarea is deliberately not allowlisted — axe accepts placeholders as accessible names, so that rule never fires; its fix is tracked separately on WCAG grounds.
Dependency fix (second commit)
The
qualityjob'spnpm audit --prodstep fails on every branch since the 2026-07-22 advisory batch — unrelated to this PR's diff.fix(deps)clears it: next 16.2.11, dompurify 3.4.12, and asharp ^0.35.0override in the existingpnpm-workspace.yamloverrides block (Next still pins^0.34.5transitively; same documented-GHSA pattern as postcss / @babel/core). Other open PRs need this lockfile change or a rebase once merged.Verification
fixme), on a clean production build of next 16.2.11 with sharp 0.35.3.pnpm audit --prodclean;pnpm test(438 pass / 0 fail),pnpm typecheck,pnpm lintall green.🤖 Generated with Claude Code