skills/a11y/SKILL.md
Accessibility audit, remediation, and verification. WCAG 2.2 AA compliance. Three-agent protocol: audit (find issues) → remediate (fix them) → critique (verify fixes). Use when: "accessibility audit", "a11y", "WCAG", "screen reader", "keyboard navigation", "contrast check", "aria fix", "accessibility sprint", "audit accessibility", "fix accessibility", "a11y issues", "a11y check". Trigger: /a11y
npx skillsauth add phrazzld/spellbook a11yInstall 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.
Audit, fix, and verify accessibility. WCAG 2.2 AA.
Target: $ARGUMENTS
You are the executive orchestrator.
delegate on judgment per the shared Roster contract: native subagents
by default; add cross-model critics, roster providers, or sprite lanes
(/sprites) only when they answer a distinct question. See
harnesses/shared/AGENTS.md (Roster).
Local lane guidance: Use specialized lanes for accessibility auditor, remediation builder, keyboard/screen-reader verifier, and cold WCAG critic. Prefer different providers for audit and critique when available; native.
| Intent | Action |
|--------|--------|
| /a11y or /a11y audit | Full triad: audit → remediate → critique |
| /a11y audit <target> | Audit only — read references/audit.md |
| /a11y fix <target> | Remediate only — read references/remediate.md |
| /a11y verify | Critique recent changes — read references/critique.md |
If no sub-command, run the full triad below.
Launch an Explore subagent to find issues. It does NOT fix anything.
Automated scan:
wcag2a, wcag2aa, wcag22aa tags)Static analysis — grep for anti-patterns:
div onClick or span onClick without role + tabIndex + onKeyDown<img without alt=<table> without <caption> or aria-label<Button> with only icon children and no aria-label<input or <select without associated <label> or aria-labeltabindex values > 0outline: none or outline: 0 without replacement focus styleStructural checks:
<main>, <nav aria-label>, <header>, <footer>aria-required on required form fieldsaria-sort on sortable table columnsprefers-reduced-motion media query for animationsOutput: structured findings as:
## [SEVERITY] WCAG [criterion]: [title]
File: [path]:[line]
Issue: [what's wrong]
Fix: [specific change needed]
Ranked: critical → serious → moderate → minor.
Read references/audit.md for the full protocol.
Launch a builder/carmack subagent with the audit findings.
Priority order (from fixing-accessibility community skill):
Rules:
<button> not <div role="button">.Read references/remediate.md for the full protocol.
Launch a critic subagent. No shared context with the implementer.
If FAIL → back to Phase 2 with the critic's issues.
Read references/critique.md for the full protocol.
<th> is not enough — the sort trigger must be a focusable <button> inside <th>opacity-50 on disabled elements drops contrast below 4.5:1 — test disabled states explicitlyonCloseAutoFocus with preventDefault() kills focus restoration — let the headless library handle itaria-required and HTML required serve different purposes — use both| Criterion | Level | What to check | |-----------|-------|---------------| | 2.4.11 Focus Not Obscured | AA | Fixed headers/footers don't cover focused element | | 2.4.13 Focus Appearance | AAA | Focus indicator >=2px, 3:1 contrast | | 2.5.7 Dragging Movements | AA | Drag-and-drop has non-drag alternative | | 2.5.8 Target Size | AA | Interactive targets >= 24x24 CSS px | | 3.2.6 Consistent Help | A | Help in same relative position across pages | | 3.3.7 Redundant Entry | A | Don't ask for same info twice in multi-step flows | | 3.3.8 Accessible Auth | AA | No cognitive function tests for login |
| Tool | Layer | When |
|------|-------|------|
| eslint-plugin-jsx-a11y | Lint | Every save |
| vitest-axe | Unit test | Every component test |
| @axe-core/playwright | E2E | CI + targeted scans |
| axe DevTools (browser) | Dev | Manual spot-checks |
| VoiceOver / NVDA | Manual | Critical flow validation |
| Keyboard-only | Manual | Every interactive change |
tools
Enumerates the peer AI agent CLIs installed on this machine (codex, claude, pi, opencode, cursor-agent, grok, agy, hermes, thinktank) and how to invoke each headlessly. A capability map, not a quota: useful for fresh-context adversarial review on a different model family, second opinions, competing attempts, and wide benches. Use when: "ask codex", "ask another model", "second opinion", "cross-model review", "what AI tools do I have", "other agents", "different model family", "adversarial critique from another provider". Trigger: /roster.
development
Run lane cards on Fly Sprites: remote, isolated, scale-to-zero sandboxes for heavy or parallel agent work. Golden-checkpoint provisioning so lanes start on a ready sprite with zero setup tokens. Use when: "run this on a sprite", "remote lane", "offload to a sandbox", "dispatch to sprites", "bake a sprite", "sprite fleet", heavy/long-running/parallel sub-agent work that should not run on this machine. Trigger: /sprites, /sprite-lane.
testing
Compose and launch roster-backed specialist lanes with prompt-native lane cards and receipts. Use when: "dispatch agents", "use subagents", "compose a team", "run provider lanes", "make lane cards". Trigger: /dispatch, /subagents, /lanes.
tools
Fast session-start repository orientation from live local evidence. Use when: "orient yourself", "start of session", "new session", "where are we", "catch me up before acting", "what should I do next", after compaction, after switching worktrees, or before choosing a Harness Kit workflow. Trigger: /orient, /ground, /session-start.