amal66 makes Mike's accessibility checks pull their weight

This fork turns accessibility from a late-stage concern into a routine quality check, while fixing barriers it already found.

complianceworkflow

amal66 has expanded browser testing to look for accessibility problems across sign-in, the assistant, project lists and tabular review.

  • Automated checks now catch page-blocking barriers for screen-reader users.
  • The first scans prompted clearer labels for the assistant send control and bulk-selection boxes, so those controls are usable now.
  • Nightly checks, retry attempts and downloadable failure reports make problems easier to spot and investigate.

The team has started by blocking only the most severe issues, while keeping less severe findings visible until they are ready to raise the bar.

So what Legal teams that expect staff or clients to rely on these workflows should care because usability failures are now more likely to be caught before release.

View this fork on GitHub →

Spotted something wrong? Or know the PR text has fresher detail than the writeup above?

Commits in this thread

4 commits from amal66/mike, oldest first. Source extracted verbatim from the harvested git log.

SHA Subject Author Date
b66c0cbc fix(a11y): accessible names for icon button and unlabeled inputs Amalanand Muthukumaran 2026-07-25 ↗ GitHub
commit body
Fixes the 3 critical axe violations flagged by e2e/accessibility.spec.ts
on its first CI run (upstream PR #243):

- /assistant, `button-name`: the icon-only send/stop button in ChatInput
  (ArrowRight/Square icon, no text) had no accessible name. Add a
  state-aware aria-label ("Send message" / "Stop response"), matching the
  aria-label convention of its siblings (AddDocButton, workflows button).
- /projects, `label`: the select-all checkbox in the table header row had
  no label/aria-label. Add aria-label="Select all projects".
- /tabular-reviews, `label`: same select-all header checkbox pattern.
  Add aria-label="Select all reviews".

No markup or styling changes - aria-label attributes only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
cf4821ad test(e2e): axe accessibility spec, failure traces, nightly schedule Amalanand Muthukumaran 2026-07-25 ↗ GitHub
commit body
- e2e/accessibility.spec.ts: axe-core scans (@axe-core/playwright) over
  /login (pre-auth), /assistant, /projects, and /tabular-reviews. Two-tier
  policy: critical-impact violations fail the build; serious-impact
  violations are logged without failing, to be ratcheted into the blocking
  tier once the backlog is cleared.
- .github/workflows/e2e.yml: nightly schedule (03:47 UTC) so drift landing
  between PRs is caught within a day; LLM-gated specs run on schedule only
  when the ANTHROPIC_API_KEY secret is configured, else they self-skip.
- docs/e2e-ci.md: document the accessibility scans, the nightly run, and
  how to use the uploaded playwright-report artifact (retries + traces
  were already configured; no config change needed there).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
4669cc01 fix(e2e): keep the HTML report when the CI reporter is set to "github" Amal 2026-08-05 ↗ GitHub
commit body
WHY THIS MATTERS
docs/e2e-ci.md ("Failure artifacts") tells a maintainer debugging a red
nightly run to download the `playwright-report` artifact and open it with
`npx playwright show-report playwright-report`. But the config set
`reporter: "github"` on CI, and naming ANY reporter REPLACES Playwright's
default `html` reporter rather than adding to it - so `playwright-report/`
was never written, the artifact upload had nothing to ship (it only
survived because `if-no-files-found: ignore` hid the gap), and the
documented debugging flow failed at exactly the moment it was needed:
when a nightly run is red and someone needs the per-spec traces.

WHAT IS A PLAYWRIGHT REPORTER (AND WHY "REPLACES", NOT "ADDS")
A reporter is a plugin that consumes test events and renders them
somewhere: `list` prints one line per test to the terminal, `github`
emits workflow annotations (`::error file=...`) that GitHub renders
inline on the PR diff, and `html` writes a browsable report with
screenshots and traces to `playwright-report/`. When no `reporter` is
configured, Playwright uses `html` on CI by default - but the `reporter`
option is a full override, not a merge. Setting it to a single reporter
silently drops the default. To get several outputs you must list them
all explicitly as an array of tuples:

    reporter: process.env.CI
        ? [["github"], ["html", { open: "never" }]]
        : "list",

Each entry is `[name]` or `[name, options]`.

HOW THE FIX WORKS
CI now runs BOTH reporters: `github` keeps the inline PR annotations,
and `html` regenerates `playwright-report/` so the workflow's existing
`actions/upload-artifact` step (which already lists `playwright-report/`
in its `path`) has real content to upload. The `open: "never"` option
matters on CI: the html reporter's default (`on-failure`) tries to
launch a local browser to display the report after a red run, which is
useless on a headless runner. The workflow runs `npx playwright test`
from the repo root, so the reporter's default output folder
(`playwright-report/` relative to the config) lands exactly where the
artifact step looks. Local runs keep the terse `list` reporter.
Verified: `npx tsc --noEmit` passes and `CI=1 npx playwright test
--list` loads the config and enumerates all 31 tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3294e914 docs(e2e): correct stale spec counts in the workflow's comments Amal 2026-08-05 ↗ GitHub
commit body
WHY THIS MATTERS
Two comments in .github/workflows/e2e.yml still said a keyless run
"passes the other 23 specs". That was true of an earlier revision of
this branch, but the suite has since grown (4 accessibility specs were
added): it now has 31 specs, of which 4 are LLM-gated, so a keyless run
passes 27. Stale numbers in CI comments are worse than no numbers: a
maintainer eyeballing a green keyless run against the comment ("23
passed? but I see 27...") is left wondering whether extra specs
accidentally ran with a leaked key, or whether the skip mechanism is
broken - the comment turns a healthy run into a false alarm. The
companion doc (docs/e2e-ci.md) already states 31/27; the workflow now
agrees with it.

WHAT IS COMMENT DRIFT
Comments are not checked by any compiler or test, so they rot silently
when the code they describe changes - here, the spec count changed in a
later commit on the same branch and nothing forced the comment to keep
up. The practical defenses are (a) keeping numbers in as few places as
possible and pointing everywhere else at that one place, and (b)
sweeping comments whenever the quantity they cite changes. This commit
applies (b); both comments also point at docs/e2e-ci.md, which remains
the authoritative source for expected pass/skip totals.

HOW THE FIX WORKS
Pure comment edits, no behavioral change:

- the workflow header now reads "of the 31 specs, the 4 LLM-dependent
  ones ... skip themselves ... so a keyless run passes the other 27
  specs";
- the ANTHROPIC_API_KEY env comment now reads "still green on the other
  27 of the 31 specs".

Verified the file still YAML-parses (python3 -c "import yaml;
yaml.safe_load(...)") and that `CI=1 npx playwright test --list`
reports "Total: 31 tests", matching the corrected figures.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Capture this thread into my fork

Download a single Markdown prompt that tells Claude how to port every commit above into your working tree — adapting paths and structure to match your repo. Run it via claude -p < capture-thread-1308.md from inside the repo you want the changes in.

⬇ Download capture-thread-1308.md