BXUP Track progress & test yourself — free
QA & Testing · Playbook · Core · ~4 min read
QA & TESTING · PLAYBOOK · CORE

Run Accessibility Testing with Calibrated Trust — Scanner, AI, Human

Automated scanners catch roughly a third of WCAG failures, AI can explain and fix what scanners find, and neither can tell you whether a screen-reader user can actually complete checkout. This playbook layers all three — scanner, AI, human — with explicit trust boundaries between them.

Tier: Core · Workflow area: Non-functional & visual testing

The output is a repeatable three-layer protocol: axe-core in CI as the regression floor, an AI pass that turns raw violations into cited, prioritized fixes, and a scripted manual pass for the keyboard and screen-reader coverage automation cannot replace.

When to use

USE THIS WHEN

Coverage must be defensible

  • A release, audit, or procurement checklist requires WCAG 2.1/2.2 AA evidence.
  • Scanner reports arrive as JSON dumps developers ignore because nobody translates them into fixes.
  • A11y bugs keep reaching production because "the scanner passed."
SKIP IT WHEN

The layers collapse

  • You need a formal conformance audit (VPAT/legal) — that is a certified human auditor's job; this protocol prepares you for one, it does not replace one.
  • The UI is throwaway/internal-only prototype code with no users yet — run the scanner alone and move on.

Prerequisites

  • axe-core wired into Playwright (@axe-core/playwright) or Pa11y for URL sweeps.
  • An AI assistant with your component code available (Claude Code is ideal).
  • A real screen reader for the manual layer: NVDA (Windows), VoiceOver (macOS/iOS), or TalkBack.

The recipe

  1. Layer 1 — put the scanner in CI as a floor, not a goal.

    const results = await new AxeBuilder({ page })
      .withTags(['wcag2a', 'wcag2aa', 'wcag21aa'])
      .analyze();
    expect(results.violations).toEqual([]);
    
    npx playwright test a11y.spec.ts --reporter=line
    
    1) checkout page: 4 violations
       color-contrast (serious) ×3 · label (critical) ×1
    

    Gate on new violations only at first (snapshot the current count per page); a hard zero-gate on a legacy app gets the job deleted within a week.

  2. Layer 2 — AI turns violations into cited fixes. Feed the assistant the JSON plus the offending component source:

    Here is an axe-core violations array for our checkout page, and the
    CardForm.tsx source. For each violation:
    1. Explain the failure in one sentence a developer will not argue with.
    2. Cite the exact WCAG success criterion (number + name + level).
    3. Propose the minimal code fix — no redesigns.
    4. Say who is affected and how (screen reader, low vision, motor).
    Rank by user impact, not by axe's severity field.
    Do not invent criteria numbers; if unsure, say so.
    

    Sample of what good output looks like:

    1. The card-number input has no programmatic label (placeholder ≠ label).
       WCAG 1.3.1 Info and Relationships (A) / 4.1.2 Name, Role, Value (A).
       Fix: <label htmlFor="cardNo"> wired to the input; keep placeholder
       as example text only. Affects: screen-reader users hear "edit text,
       blank" and cannot tell which field this is.
    
  3. Verify the citations — this is the calibration step. Spot-check every WCAG number against the actual spec (or your bookmarked quick-ref) before the report leaves QA. Models occasionally cite a plausible-but-wrong criterion; one bad citation and developers stop trusting the whole report. Trust the explanation and fix draft; verify the citation and the severity.

  4. Layer 3 — the scripted manual pass. For each critical journey (login, search, checkout), run a fixed script no tool can automate:

    • Keyboard-only: Tab through the whole journey. Is focus always visible? Is the order logical? Any keyboard trap? Can you escape modals?
    • Screen reader: complete the journey with NVDA or VoiceOver. Are announcements meaningful ("Remove item, button" not "button")? Do dynamic updates (cart count, errors) get announced via live regions?
    • 200% zoom and reflow: does content reflow without horizontal scrolling (WCAG 1.4.10)?

    Ask the AI to generate this checklist per screen from the component tree — it is good at enumerating interactive elements to test — but a human executes it. Time cost: 20–30 minutes per journey, and it finds the failures that lose lawsuits.

  5. File findings with the layer attached. Every ticket states its evidence class: scanner (deterministic, non-negotiable), ai-explained (verified citation), or manual (human judgment). This is what "calibrated trust" means operationally — the reader always knows how much to trust the finding and how it was produced.

Warning

Never let an AI mark an a11y issue as a false positive on its own. Downgrading a finding is a human decision — models are eager to agree that an issue "may not affect real users," and that sentence has no place in a QA report without a human behind it.

Variations

  • Pa11y + CI for many URLs:pa11y-ci --sitemap https://app.example/sitemap.xml for breadth; keep axe-in-Playwright for authenticated flows.
  • Vision-model assist: screenshot + "identify likely contrast and target-size issues" is a useful pre-scan for design review, but it is Layer-2 evidence at best — never report it without a scanner or manual confirmation.
  • Component-library teams: run the protocol once per component (Storybook + axe addon), and the app-level burden drops dramatically.

Quality check

  • CI fails on new scanner violations; the baseline count only goes down.
  • Every AI-produced citation spot-checked against the WCAG text this sprint.
  • Manual pass completed and dated for each critical journey this release; script stored in the repo, not someone's head.
  • Tickets carry their evidence class and affected-user statement.

Pitfalls

  • "Scanner passed" declared as "accessible." Automated coverage is ~30–40% of criteria. Saying otherwise to stakeholders is the field's most common credibility mistake.
  • Hallucinated WCAG numbers. The failure mode step 3 exists for. It happens rarely — which is exactly why unchecked reports feel safe until the audit.
  • Overlay/widget shortcuts. If someone proposes an "accessibility overlay" instead of fixes, the answer is no; overlays do not fix the DOM and are named in lawsuits.
  • Testing only with a mouse-wielding QA engineer's habits. The manual script is fixed precisely so muscle memory does not skip the painful parts.
Key Takeaway:

Calibrated trust means each layer does what it is actually good at: the scanner regresses, the AI explains and drafts, the human judges. Collapse the layers in either direction — trusting AI to judge, or humans to scan at scale — and the protocol fails.

This is the free reading view. Open BXUP to track your progress, run the hands-on labs, and prove it with original, exam-pattern assessments.
© Anvi Innovate · BXUP — Be Exponentially Upskilled · BXUP is an independent learning platform, not affiliated with or endorsed by AWS, Microsoft, Google, NVIDIA, IBM, Salesforce, Databricks, Oracle or Anthropic. All trademarks belong to their respective owners. · bxup.in