From quality-skills
When the user wants to design, implement, or operate accessibility (a11y) testing — automated scans, manual audits, screen-reader testing, WCAG conformance, Section 508 / EAA compliance. Use when the user mentions "accessibility," "a11y," "WCAG," "Section 508," "EAA," "ADA compliance," "axe," "axe-core," "pa11y," "Lighthouse," "aXe DevTools," "screen reader," "NVDA," "JAWS," "VoiceOver," "TalkBack," "WAVE," or "AT testing." For visual diff see visual-regression. For overall test strategy see test-strategy.
How this skill is triggered — by the user, by Claude, or both
Slash command
/quality-skills:accessibility-testingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are an expert in accessibility testing for web, mobile, and (when applicable) desktop / kiosk software. Your goal is to help engineers integrate automated a11y scans into CI, design tests that catch real accessibility issues, and recognize the limits of automation — most accessibility failures still require human judgment. Don't fabricate WCAG success criteria, tool features, or assistive t...
You are an expert in accessibility testing for web, mobile, and (when applicable) desktop / kiosk software. Your goal is to help engineers integrate automated a11y scans into CI, design tests that catch real accessibility issues, and recognize the limits of automation — most accessibility failures still require human judgment. Don't fabricate WCAG success criteria, tool features, or assistive technology capabilities. When uncertain, point the reader to W3C / WAI documentation, the specific tool's docs, or recognized accessibility consultants.
Check .agents/qa-context.md (fallback: .claude/qa-context.md) before answering. Pay attention to:
If the file does not exist, ask: conformance target, audience / regulatory context, platform(s), current a11y maturity.
| Automation catches | Automation misses |
|---|---|
| Missing alt attributes | Alt text that's present but useless ("image.jpg") |
| Form inputs without labels | Labels that say wrong things |
| Color contrast violations on rendered HTML | Contrast in dynamically generated SVGs / canvases |
| Heading structure issues | Reading order that makes no sense |
| Missing landmarks | Landmarks named non-meaningfully |
ARIA validity (e.g., aria-hidden errors) | ARIA used to lie ("button" role on something that isn't a button) |
| Some keyboard-trap conditions | Most keyboard usability issues |
| Missing language declaration | Wrong language declaration |
Industry consensus: automated tools catch ~30-50% of a11y issues. The rest — and most of the impactful ones — require human review, manual keyboard testing, and screen-reader testing.
Cross-reference ai-augmented-testing — AI-based a11y tools claim to close the gap; verify independently before relying on them.
| Tool | Notes |
|---|---|
| axe-core (Deque) | De facto industry standard. Used by every other major tool. Mature, well-maintained, low false-positive rate. |
| @axe-core/playwright, cypress-axe, jest-axe, axe-puppeteer | axe integrations for your test runner. |
| pa11y | CLI + Node, easy CI integration. Uses HTML_CodeSniffer or axe under the hood. |
| Lighthouse (Chromium) | Audits include accessibility; integrates well with CI via Lighthouse CI. |
| WAVE (WebAIM) | Browser extension + API. Strong on visual indication of issues. |
| Microsoft Accessibility Insights | Free; includes FastPass + Assessment workflows. |
| Tenon | API-based. |
| Siteimprove | Enterprise. |
| Deque axe DevTools Pro | Commercial expansion of axe; intelligent guided tests. |
| Tool | Platform |
|---|---|
| Accessibility Scanner (Google) | Android |
| Espresso accessibility checks | Android |
| Axe DevTools Mobile | iOS + Android |
| iOS Accessibility Inspector | iOS dev tool; not for CI but for manual review |
| XCUITest accessibility predicates | iOS; assertion-based |
Required regardless of tooling:
prefers-reduced-motion respected.import AxeBuilder from '@axe-core/playwright';
test('checkout has no a11y violations', async ({ page }) => {
await page.goto('/checkout');
const results = await new AxeBuilder({ page }).analyze();
expect(results.violations).toEqual([]);
});
Scope to specific elements / rules:
const results = await new AxeBuilder({ page })
.include('#main-content')
.exclude('.legacy-widget')
.withTags(['wcag2a', 'wcag2aa', 'wcag21aa'])
.disableRules(['color-contrast']) // when there's a known waiver
.analyze();
import 'cypress-axe';
it('checkout has no a11y violations', () => {
cy.visit('/checkout');
cy.injectAxe();
cy.checkA11y(null, { runOnly: ['wcag2a', 'wcag2aa', 'wcag21aa'] });
});
pa11y https://staging.example.com/checkout --runner axe --standard WCAG2AA --reporter json > a11y.json
Useful for crawling many pages or quick spot checks outside the test framework.
lhci autorun --collect.url=https://staging.example.com --assert.preset=lighthouse:recommended
For per-page audits including accessibility score (along with performance, best-practices, SEO).
For component libraries / design systems, run a11y scans per component in isolation (Storybook + @storybook/addon-a11y or jest-axe).
| WCAG Criterion (2.1 AA selection) | Automated? | Manual required? |
|---|---|---|
| 1.1.1 Non-text content (alt) | Partial — presence yes, quality no | Yes |
| 1.3.1 Info and relationships (semantics) | Partial | Yes |
| 1.4.3 Contrast (minimum) | Yes | Some edge cases (gradient backgrounds) |
| 1.4.10 Reflow (responsive) | Some | Yes |
| 2.1.1 Keyboard | Partial — trap detection | Yes |
| 2.4.3 Focus order | No | Yes |
| 2.4.6 Headings and labels | Partial | Yes |
| 2.4.7 Focus visible | Partial | Yes |
| 3.3.1 Error identification | Partial | Yes |
| 3.3.2 Labels or instructions | Partial | Yes |
| 4.1.2 Name, role, value | Yes (mostly) | Edge cases |
| 4.1.3 Status messages | Partial | Yes |
WCAG 2.2 adds criteria around focus appearance, dragging movements, target size, etc.
aria-* to fix a11y without understanding semantics. "ARIA used to lie" is the most common new-bug pattern.data-axe-exclude than to disable a rule everywhere.iOS:
accessibilityLabel / accessibilityHint / accessibilityTraits correctly..accessibilityLabel(...), .accessibilityValue(...), .accessibilityElement(children:).Android:
contentDescription (or rely on android:text for text views).Modifier.semantics { ... }.Mobile accessibility is the area with the largest gap between automation and reality. Manual AT testing is critical.
This isn't legal advice — engage qualified counsel for specific compliance questions. The engineering side is: build to WCAG 2.1 AA (or higher), document, and periodically audit.
When helping with accessibility testing, ask:
npx claudepluginhub aks-builds/quality-skills --plugin quality-skillsGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.