areas/software/qa/skills/accessibility-testing/SKILL.md
Run automated WCAG audits, manual keyboard/screen reader testing, and CI a11y gates.
npx skillsauth add sawrus/agent-guides accessibility-testingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Expertise: axe-core automation, WCAG 2.1 AA, keyboard testing, screen reader testing (NVDA/VoiceOver), CI gates.
// tests/a11y/checkout.a11y.spec.ts
import AxeBuilder from '@axe-core/playwright';
test.describe('Checkout a11y', () => {
test('step 1 address form has no WCAG AA violations', async ({ page }) => {
await page.goto('/checkout/address');
await page.waitForLoadState('networkidle'); // Wait for dynamic content
const results = await new AxeBuilder({ page })
.withTags(['wcag2a', 'wcag2aa', 'wcag21aa'])
.exclude('#third-party-widget') // Exclude known third-party violations
.analyze();
// Report violations with full context for easier debugging
if (results.violations.length > 0) {
const report = results.violations.map(v => ({
id: v.id,
impact: v.impact,
description: v.description,
elements: v.nodes.map(n => n.html).slice(0, 3),
}));
console.log(JSON.stringify(report, null, 2));
}
// Block on critical/serious only; log moderate/minor as warnings
const blocking = results.violations.filter(
v => v.impact === 'critical' || v.impact === 'serious'
);
expect(blocking).toHaveLength(0);
});
test('form inputs all have associated labels', async ({ page }) => {
await page.goto('/checkout/address');
const results = await new AxeBuilder({ page })
.withRules(['label', 'label-content-name-mismatch'])
.analyze();
expect(results.violations).toHaveLength(0);
});
});
Run this checklist on every new feature with interactive elements:
Tab order:
[ ] Tab key moves focus through all interactive elements in visual order
[ ] Focus never gets trapped (except modals — see below)
[ ] Focus is always visible (never hidden by CSS outline: none)
Activation:
[ ] Buttons activate with Enter and Space
[ ] Links activate with Enter only
[ ] Select/dropdown navigates with Arrow keys
Modal dialogs:
[ ] Focus moves to modal when it opens
[ ] Tab is trapped inside modal while open
[ ] Escape key closes modal
[ ] Focus returns to the trigger element when modal closes
Forms:
[ ] Each input has a visible label (not just placeholder)
[ ] Error messages are associated with their input (aria-describedby)
[ ] Required fields marked with aria-required="true"
[ ] Submit activates with Enter from any field
Enable: Cmd + F5
Navigate: VO + Right (next element), VO + Left (previous)
Forms: VO + Shift + Down (enter form mode)
Tables: VO + Shift + Right/Left (navigate columns)
Download: nvaccess.org/download
Navigate: Tab (interactive), H (headings), F (forms), L (lists)
Test: Browse mode (default) vs. Forms mode (Enter to switch)
aria-live# .github/workflows/a11y.yml
a11y:
steps:
- name: Run accessibility audit
run: npx playwright test tests/a11y/ --reporter=html
- name: Upload report
uses: actions/upload-artifact@v4
with:
name: a11y-report
path: playwright-report/
| Criterion | Level | What it means | |---|---|---| | 1.1.1 Non-text content | A | Images need alt text | | 1.3.1 Info & Relationships | A | Structure conveyed programmatically | | 1.4.3 Contrast (Minimum) | AA | 4.5:1 normal text, 3:1 large text | | 2.1.1 Keyboard | A | All functionality keyboard accessible | | 2.4.3 Focus Order | A | Focus order preserves meaning | | 2.4.7 Focus Visible | AA | Keyboard focus always visible | | 3.3.1 Error Identification | A | Errors described in text | | 3.3.2 Labels or Instructions | A | Form inputs have labels | | 4.1.2 Name, Role, Value | A | UI components have accessible names |
testing
QA Expert for writing E2E tests, test scenarios, test plans, and ensuring test coverage quality.
development
Expert UI/UX design intelligence for creating distinctive, high-craft, and mobile-first interfaces. Focuses on premium aesthetics, touch-first ergonomics, and Flutter performance.
development
Code Review Expert for static analysis, security auditing, architecture review, and ensuring code quality standards.
development
Babysit a GitHub pull request after creation by continuously polling review comments, CI checks/workflow runs, and mergeability state until the PR is merged/closed or user help is required. Diagnose failures, retry likely flaky failures up to 3 times, auto-fix/push branch-related issues when appropriate, and keep watching open PRs so fresh review feedback is surfaced promptly. Use when the user asks Codex to monitor a PR, watch CI, handle review comments, or keep an eye on failures and feedback on an open PR.