Finds the barriers that lock real people out of a UI — and cites the exact success criterion, names the assistive tech that hits the wall, and separates what an automated scanner catches from what only a human with a screen reader will. The UI counterpart to devils-advocate (code), doc-critique (docs), and threat-model (designs): one adversarial pass, severity-tagged, evidence-first. Automated tools catch perhaps a third of WCAG issues; this audit is built for the other two thirds.
-
Establish what's auditable from the input, and say what isn't. Inputs vary in what they reveal:
- Component/page code or markup — the richest: roles, labels, semantics, focus management, tab order are all inspectable.
- Screenshot/image — visual only: contrast, target size, text-as-image, visible focus if captured. Keyboard behavior, screen-reader output, and focus order are not observable — list them as "must verify with live AT", never guess a pass.
- A described flow — reason about it, flag the checks that need the real thing.
Default standard is WCAG 2.2 level AA; note if the user wants A or AAA. State the input's coverage limits up front so a clean section never reads as a guarantee it can't be.
-
Sweep all four POUR principles using the success-criterion catalog in reference.md — Perceivable, Operable, Understandable, Robust. Don't transcribe the catalog; run it as a lens and report only what the UI actually fails or can't be verified for. The high-yield manual checks scanners miss, swept explicitly: keyboard-only operability (every interactive element reachable and operable, visible focus, no traps, logical order), screen-reader semantics (name/role/value, headings, landmarks, alt-text quality not just presence), meaningful sequence and focus order, error identification and recovery, reflow/zoom to 400%, target size (2.2), and motion/animation preferences.
-
Center every finding on the user it blocks and the AT involved. A finding without a victim is abstract. ✅ "Submit button is a <div> with a click handler — keyboard users cannot reach or activate it (Tab skips it, Enter does nothing), and a screen reader announces nothing actionable. Blocks: keyboard-only and screen-reader users from completing checkout." — ❌ "Button not accessible." Name the assistive tech (VoiceOver/NVDA/JAWS, keyboard-only, 400% zoom, switch control, reduced-motion) so the fix is testable.
-
Cite the specific success criterion — number, name, level — for every finding: 1.4.3 Contrast (Minimum) [AA], 2.1.1 Keyboard [A], 4.1.2 Name, Role, Value [A], 2.4.7 Focus Visible [AA], 2.5.8 Target Size (Minimum) [AA]. "Make it accessible" is not a finding; a criterion citation is what makes it actionable and arguable.
-
Severity-tag with the shared markers, by impact on task completion:
- 🟥 blocker — a user group cannot complete the task at all (keyboard trap, unlabeled critical control, contrast that renders text unreadable, a form that can't be submitted via keyboard).
- 🟧 major — significant barrier with a painful workaround (poor focus order, vague link text, missing error association).
- 🟨 minor — friction, not a wall (redundant alt text, a non-essential decorative image with empty-but-present alt).
- ⚪ nit — best-practice polish.
If everything is a blocker, the severity call failed — calibrate to whether the task can actually be completed.
-
Compute contrast and sizes where the input allows it. Given colors, state the actual ratio against the 4.5:1 (normal) / 3:1 (large) threshold: ✅ "#767676 on #fff = 4.54:1, passes AA for normal text by a hair; fails for the 14px placeholder which needs the same 4.5:1 and gets it — but #999 on #fff = 2.85:1 fails." Numbers, not eyeballing.
-
Separate scanner-catchable from human-only, explicitly, per finding (tag [auto] vs [manual]). It tells the team what to gate in CI (axe/Lighthouse) and what needs the screen-reader pass that no tool replaces — and it's honest that the audit's manual findings are the ones a pipeline won't keep catching. End with a "what's solid" section (the patterns done right, so they're preserved on refactor) and a prioritized fix order.
-
Emit in one message: coverage note (input limits), findings grouped by severity with SC citation + affected user/AT + [auto]/[manual] + concrete fix, contrast/size computations, what's solid, and the must-verify-with-live-AT checklist for anything the input couldn't confirm.