axe scans every page no journey reached, and the four violations they found are fixed (#367) #1050

Merged
claude-bot merged 6 commits from test/367-axe-coverage into main 2026-10-03 17:09:36 +00:00
Collaborator

Part of #367: the second automatable slice.

Summary

Scans. 34 routes that no journey reached now get an axe scan (wcag22aa, the existing fixture), as Dana, the seeded GM and admin. Three read-only specs:

  • a11y-campaign-pages: prep, analytics, characters/new, the settings index plus ownership, packs, archive and wiki, /sessions/:id/edit, and /profile/plan.
  • a11y-wiki-pages: health, recent, deleted, map, rules, new, name/:title, and an entry's edit, history and talk.
  • a11y-admin-pages: the 14 admin sub-pages.

Ids come from the seeded data through the API. A shared scan-pages.js scans each page once main and its h1 are in, and fails once at the end naming every failing page.

Violations found, and fixed in the app. No axe rule is disabled and no element excluded.

Page Rule Fix
/admin/about link-in-text-block The "Users" link in a sentence was told from its words by colour alone (about 2.2:1).
settings ownership link-in-text-block Same, "Members & characters".
wiki rules link-in-text-block Same, "Settings → Content packs", and the "Lore" link beside it.
/admin/usage, phone scrollable-region-focusable Its three .tscroll tables become labelled, focusable regions, the pattern AdminUsers and AdminAudit already use.

The three links take a new .qb a.textlink style (src/ui/base.css): underlined, in the existing --accent-ink. That is a small visible change: those three links gain an underline. In-sentence links elsewhere were not changed; a global rule would be the owner's call.

Changelog

  • changelog.d/367-axe-coverage.fixed.md

Test plan

  • Journeys on docker-test (own compose project, no host ports): --grep "A11y" gives 9 passed (3 specs × desktop, phone, keyboard). Earlier runs failed on exactly the four violations above, and the scans caught them.
  • Unit tests: new AdminAbout.test.jsx, plus assertions in the Ownership, Rules and AdminUsage tests.
  • Full vitest: 3775 passed, 1 failed. The failure was SheetPage.test.jsx, untouched here; it passes alone (69 passed), so the host's load is the likely cause.
  • eslint: 0 errors.
  • CI on this PR.
  • Render check: the underlined links on About, Ownership and Rules in both themes, and the focus ring on the phone usage tables. For the owner's review on dev.

Noted, not changed: the .tscroll wrappers in AdminHealth, AdminNotices and AdminUsers:51 have the same latent gap if their content overflows. They pass with the seeded data.

🤖 Generated with Claude Code

Part of #367: the second automatable slice. ## Summary **Scans.** 34 routes that no journey reached now get an axe scan (`wcag22aa`, the existing fixture), as Dana, the seeded GM and admin. Three read-only specs: - `a11y-campaign-pages`: prep, analytics, `characters/new`, the settings index plus ownership, packs, archive and wiki, `/sessions/:id/edit`, and `/profile/plan`. - `a11y-wiki-pages`: health, recent, deleted, map, rules, new, `name/:title`, and an entry's edit, history and talk. - `a11y-admin-pages`: the 14 admin sub-pages. Ids come from the seeded data through the API. A shared `scan-pages.js` scans each page once `main` and its h1 are in, and fails once at the end naming every failing page. **Violations found, and fixed in the app.** No axe rule is disabled and no element excluded. | Page | Rule | Fix | |---|---|---| | `/admin/about` | `link-in-text-block` | The "Users" link in a sentence was told from its words by colour alone (about 2.2:1). | | settings `ownership` | `link-in-text-block` | Same, "Members & characters". | | wiki `rules` | `link-in-text-block` | Same, "Settings → Content packs", and the "Lore" link beside it. | | `/admin/usage`, phone | `scrollable-region-focusable` | Its three `.tscroll` tables become labelled, focusable regions, the pattern `AdminUsers` and `AdminAudit` already use. | The three links take a new `.qb a.textlink` style (`src/ui/base.css`): underlined, in the existing `--accent-ink`. That is a small visible change: those three links gain an underline. In-sentence links elsewhere were not changed; a global rule would be the owner's call. ## Changelog - [x] `changelog.d/367-axe-coverage.fixed.md` ## Test plan - [x] **Journeys on docker-test** (own compose project, no host ports): `--grep "A11y"` gives `9 passed` (3 specs × desktop, phone, keyboard). Earlier runs failed on exactly the four violations above, and the scans caught them. - [x] **Unit tests:** new `AdminAbout.test.jsx`, plus assertions in the Ownership, Rules and AdminUsage tests. - [x] **Full vitest:** 3775 passed, 1 failed. The failure was `SheetPage.test.jsx`, untouched here; it passes alone (69 passed), so the host's load is the likely cause. - [x] **eslint:** 0 errors. - [ ] CI on this PR. - [ ] **Render check:** the underlined links on About, Ownership and Rules in both themes, and the focus ring on the phone usage tables. For the owner's review on dev. **Noted, not changed:** the `.tscroll` wrappers in `AdminHealth`, `AdminNotices` and `AdminUsers:51` have the same latent gap if their content overflows. They pass with the seeded data. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
fix(a11y): Admin usage tables scroll from the keyboard (#367)
Some checks failed
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been cancelled
CI / End-to-end journeys (desktop) (pull_request) Has been cancelled
CI / End-to-end journeys (keyboard) (pull_request) Has been cancelled
CI / End-to-end journeys (phone) (pull_request) Has been cancelled
CI / Bot/backend version sync (pull_request) Has been cancelled
CI / Bot tests and audit (pull_request) Has been cancelled
CI / Does this change touch the recording path? (pull_request) Has been cancelled
CI / Backend lint (ruff) (pull_request) Has been cancelled
CI / Frontend (shard 1/2) (pull_request) Has been cancelled
CI / Backend migration, tests, and audit (pull_request) Has been cancelled
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Has been cancelled
CI / Feedback site tests (pull_request) Has been cancelled
CI / Frontend (shard 2/2) (pull_request) Has been cancelled
CI / Docker image build (pull_request) Has been cancelled
da7c69e5e5
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Merge remote-tracking branch 'origin/main' into test/367-axe-coverage
Some checks failed
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been cancelled
CI / End-to-end journeys (desktop) (pull_request) Has been cancelled
CI / End-to-end journeys (keyboard) (pull_request) Has been cancelled
CI / End-to-end journeys (phone) (pull_request) Has been cancelled
CI / Frontend (shard 1/2) (pull_request) Has been cancelled
CI / Backend migration, tests, and audit (pull_request) Has been cancelled
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Has been cancelled
CI / Frontend (shard 2/2) (pull_request) Has been cancelled
CI / Does this change touch the recording path? (pull_request) Has been cancelled
CI / Docker image build (pull_request) Has been cancelled
CI / Backend lint (ruff) (pull_request) Has been cancelled
CI / Feedback site tests (pull_request) Has been cancelled
CI / Bot/backend version sync (pull_request) Has been cancelled
CI / Bot tests and audit (pull_request) Has been cancelled
f3f1e9b852
The #367 axe-coverage changelog fragment takes the fragment format (#367)
All checks were successful
CI / Does this change touch the recording path? (pull_request) Successful in 15s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Bot/backend version sync (pull_request) Successful in 31s
CI / Backend lint (ruff) (pull_request) Successful in 33s
CI / Docker image build (pull_request) Successful in 34s
CI / Feedback site tests (pull_request) Successful in 50s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 58s
CI / Bot tests and audit (pull_request) Successful in 1m48s
CI / End-to-end journeys (phone) (pull_request) Successful in 10m28s
CI / End-to-end journeys (keyboard) (pull_request) Successful in 11m16s
CI / End-to-end journeys (desktop) (pull_request) Successful in 11m19s
CI / Frontend (shard 2/2) (pull_request) Successful in 13m6s
CI / Frontend (shard 1/2) (pull_request) Successful in 15m54s
CI / Backend migration, tests, and audit (pull_request) Successful in 21m11s
be93e2bfa4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-bot deleted branch test/367-axe-coverage 2026-10-03 17:09:37 +00:00
rbrooks referenced this pull request from a commit 2026-10-03 17:39:50 +00:00
Sign in to join this conversation.
No description provided.