Web Accessibility
Use this skill when the job is to name the failing accessibility surface, fix it at the right layer, and leave behind a short remediation + verification packet.
The job is not to dump generic WCAG prose, paste raw scanner output, or absorb every neighboring frontend concern.
This skill should:
- classify the failing accessibility surface,
- separate automated findings from manual or assistive-technology follow-up,
- choose the smallest credible remediation packet,
- keep routed-app feedback and focus behavior explicit,
- route broader design/layout/component-governance work honestly.
Read these support docs first:
- references/intake-packets-and-route-outs.md
- references/audit-remediation-checklist.md
- references/handoff-boundaries.md
When to use this skill
- A team says “make this accessible” and the missing accessibility surface is still unclear
- axe, Lighthouse, Accessibility Insights, Pa11y, QA notes, or user reports need to be turned into one remediation plan instead of a raw finding dump
- You need to decide whether the main issue is semantics, keyboard/focus, labels/announcements, reflow/contrast/motion, media alternatives, or routed-app navigation feedback
- A modal, form, nav, menu, table, dashboard, or routed flow needs manual-vs-automated verification guidance before release
- Screen-reader, keyboard-only, or zoom/reflow issues are suspected, but ownership and next checks are unclear
When not to use this skill
- The main task is broad UI polish, heuristic review, hierarchy, or interface consistency →
web-design-guidelines
- The main task is reusable primitive / slot / variant API design or component-family ownership →
ui-component-patterns
- The main task is viewport adaptation, breakpoint strategy, container-query planning, or layout overflow control →
responsive-design
- The main task is token governance, contribution rules, or system-wide frontend standards →
design-system
- The task is only to run one tool and paste raw results; run the tool directly, then return here to prioritize remediation and manual follow-up
Instructions
Step 1: Frame the accessibility job before naming fixes
Capture the minimum packet first.
accessibility_intake:
surface: page | routed-flow | modal | form | nav | menu | table | dashboard | component-family | mixed | unknown
workflow_type: audit-review | remediation-pass | release-readiness | regression-follow-up | user-reported-bug | design-system-follow-up
signal_source: axe | lighthouse | accessibility-insights | pa11y | manual-qa | screen-reader-report | user-feedback | mixed | unknown
primary_surface: semantics | keyboard-focus | labels-announcements | visual-perception-reflow | media-alternatives | routed-navigation-feedback | mixed | unknown
severity: blocker | major | medium | low | unknown
ownership: app-team | frontend-platform | design-system | qa-accessibility | shared | unknown
Rule: do not start with “add ARIA,” “run axe again,” or “quote WCAG 2.1.”
First label the failing accessibility surface.
Step 2: Choose exactly one primary remediation packet
Use the router in references/intake-packets-and-route-outs.md.
Primary packets:
semantics-structure
keyboard-focus
labels-announcements
visual-perception-reflow
media-alternatives
routed-navigation-feedback
Pick the highest-risk user-facing failure as primary.
List everything else as follow-up, not as equal co-owners.
Step 3: Keep the invariants visible
These rules survive every answer:
- automated tools accelerate discovery, but they do not prove accessibility completeness
- native HTML semantics beat ARIA patching when native controls already solve the problem
- keyboard/focus failures in interactive flows usually outrank cosmetic cleanups
- routed apps need explicit focus and announcement decisions because browser navigation cues disappear
- labels, instructions, errors, and async status text are part of task completion, not polish
- every remediation recommendation needs a matching manual verification step
Step 4: Build the accessibility remediation packet
Return this structure:
# Accessibility Remediation Packet
## Scope
- Surface:
- Workflow type:
- Primary packet:
- Confidence: high | medium | low
## Current signal
- Tool or report source:
- What is already known:
- What still needs direct verification:
## Highest-risk gaps
1. ...
2. ...
3. ...
## Recommended first slice
1. ...
2. ...
3. ...
## Verification plan
- Automated re-check:
- Manual keyboard / focus:
- Manual screen-reader / AT:
- Visual / zoom / motion / reflow:
## Ownership and route-outs
- Primary owner:
- Adjacent skills / teams:
Step 5: Use the packet, not a giant checklist
Pull the packet from references/intake-packets-and-route-outs.md.
Packet rules:
semantics-structure → landmarks, headings, lists, tables, buttons/links, form markup, native-first fixes
keyboard-focus → tab order, visible focus, trap/escape behavior, initial focus, focus return, composite widget behavior
labels-announcements → accessible names, helper/error relationships, live regions, status/error messaging, required-state clarity
visual-perception-reflow → contrast, reduced motion, zoom, reflow, target visibility, state visibility
media-alternatives → alt text, decorative-vs-informative imagery, captions, transcripts, fallback descriptions
routed-navigation-feedback → page title / heading announcement, route-change focus strategy, SPA/app-router cues, async load state announcements
Step 6: Separate automated findings from manual proof
Use this split in every serious answer:
- Automated-friendly — missing labels, duplicate IDs, invalid ARIA, simple contrast failures, landmark/heading gaps
- Manual keyboard/focus — tab sequence, visible focus, trap behavior, initial focus, focus return, menu/listbox/dialog interaction
- Manual AT / content quality — announcement usefulness, alt-text quality, label clarity, route-change comprehension, async feedback quality
If the request starts from a scanner, say explicitly that the scanner is the input artifact, not the finished answer.
Step 7: Route adjacent work explicitly
Use these route-outs when the problem crosses boundaries:
| If the real job is... |
Route to... |
| broad UI/design review, hierarchy, polish, or guideline compliance |
web-design-guidelines |
| reusable component API / primitive ownership / slot-variant design |
ui-component-patterns |
| viewport/container layout strategy or breakpoint planning |
responsive-design |
| token governance or system-wide frontend standards |
design-system |
| React/Next performance or hydration behavior |
react-best-practices |
Output expectations
A strong answer from this skill should:
- identify the primary failing accessibility surface,
- recommend one bounded remediation packet,
- name the manual verification still required,
- avoid equating a scanner pass with completion,
- route broader frontend ownership questions outward instead of absorbing them.
Examples
Example 1: modal audit after axe
Input
Audit this checkout modal for accessibility issues and tell me what to test manually after axe.
Output direction
- choose
keyboard-focus or labels-announcements
- treat axe as the input artifact, not the whole workflow
- verify initial focus, trap behavior, focus return, and announcement quality
- keep broader visual-polish critique out unless it materially affects accessibility
Example 2: routed app navigation confusion
Input
Screen-reader users say our React app changes routes but the new page is not announced and focus stays on the old nav link.
Output direction
- choose
routed-navigation-feedback
- classify title/heading announcement plus focus-reset strategy
- include manual AT verification after the fix
- avoid turning the task into generic routing architecture work
Example 3: component-boundary confusion
Input
Our button primitive API is messy and some variants are not accessible. Is this web-accessibility or ui-component-patterns?
Output direction
- keep accessible-name, focus-state, and disabled/loading announcement fixes in
web-accessibility
- route primitive API / variant ownership to
ui-component-patterns
- split the plan instead of forcing one skill to own everything
Example 4: manual checks after Lighthouse
Input
Lighthouse says contrast is okay now. What should I still test manually?
Output direction
- treat this as verification planning, not score celebration
- verify keyboard order, focus visibility, routed-flow cues, and screen-reader announcement quality where relevant
- include zoom/reflow and reduced-motion checks when the interface depends on them
Best practices
- Start with the user task and failing surface, not the rule number.
- Treat automated tools as accelerators, not as proof of accessibility completeness.
- Prefer native HTML semantics before ARIA-heavy patches.
- Keep focus behavior intentional for overlays, route changes, and async validation.
- Separate remediation packets from broader design-review or component-architecture work.
- When unsure, name the manual verification still required instead of pretending the scan is enough.
References
1---2name: web-accessibility3description: Routing-first skill for web accessibility remediation and verification. Use when the main job is classifying which accessibility surface is failing — semantics, keyboard/focus, labels/announcements, visual perception/reflow, media alternatives, or routed-app navigation feedback — and turning vague audit, WCAG, axe/Lighthouse, or "make this accessible" requests into one concrete remediation packet. Route broad UI critique to `web-design-guidelines`, component API architecture to `ui-component-patterns`, responsive layout strategy to `responsive-design`, and system governance to `design-system`.4license: MIT5---67# Web Accessibility89Use this skill when the job is to **name the failing accessibility surface, fix it at the right layer, and leave behind a short remediation + verification packet**.1011The job is not to dump generic WCAG prose, paste raw scanner output, or absorb every neighboring frontend concern.1213This skill should:141. classify the failing accessibility surface,152. separate automated findings from manual or assistive-technology follow-up,163. choose the smallest credible remediation packet,174. keep routed-app feedback and focus behavior explicit,185. route broader design/layout/component-governance work honestly.1920Read these support docs first:21- [references/intake-packets-and-route-outs.md](references/intake-packets-and-route-outs.md)22- [references/audit-remediation-checklist.md](references/audit-remediation-checklist.md)23- [references/handoff-boundaries.md](references/handoff-boundaries.md)2425## When to use this skill26- A team says “make this accessible” and the missing accessibility surface is still unclear27- axe, Lighthouse, Accessibility Insights, Pa11y, QA notes, or user reports need to be turned into one remediation plan instead of a raw finding dump28- You need to decide whether the main issue is semantics, keyboard/focus, labels/announcements, reflow/contrast/motion, media alternatives, or routed-app navigation feedback29- A modal, form, nav, menu, table, dashboard, or routed flow needs manual-vs-automated verification guidance before release30- Screen-reader, keyboard-only, or zoom/reflow issues are suspected, but ownership and next checks are unclear3132## When not to use this skill33- **The main task is broad UI polish, heuristic review, hierarchy, or interface consistency** → `web-design-guidelines`34- **The main task is reusable primitive / slot / variant API design or component-family ownership** → `ui-component-patterns`35- **The main task is viewport adaptation, breakpoint strategy, container-query planning, or layout overflow control** → `responsive-design`36- **The main task is token governance, contribution rules, or system-wide frontend standards** → `design-system`37- **The task is only to run one tool and paste raw results**; run the tool directly, then return here to prioritize remediation and manual follow-up3839## Instructions4041### Step 1: Frame the accessibility job before naming fixes42Capture the minimum packet first.4344```yaml45accessibility_intake:46 surface: page | routed-flow | modal | form | nav | menu | table | dashboard | component-family | mixed | unknown47 workflow_type: audit-review | remediation-pass | release-readiness | regression-follow-up | user-reported-bug | design-system-follow-up48 signal_source: axe | lighthouse | accessibility-insights | pa11y | manual-qa | screen-reader-report | user-feedback | mixed | unknown49 primary_surface: semantics | keyboard-focus | labels-announcements | visual-perception-reflow | media-alternatives | routed-navigation-feedback | mixed | unknown50 severity: blocker | major | medium | low | unknown51 ownership: app-team | frontend-platform | design-system | qa-accessibility | shared | unknown52```5354Rule: do **not** start with “add ARIA,” “run axe again,” or “quote WCAG 2.1.”55First label the failing accessibility surface.5657### Step 2: Choose exactly one primary remediation packet58Use the router in [references/intake-packets-and-route-outs.md](references/intake-packets-and-route-outs.md).5960Primary packets:611. `semantics-structure`622. `keyboard-focus`633. `labels-announcements`644. `visual-perception-reflow`655. `media-alternatives`666. `routed-navigation-feedback`6768Pick the **highest-risk user-facing failure** as primary.69List everything else as follow-up, not as equal co-owners.7071### Step 3: Keep the invariants visible72These rules survive every answer:73- automated tools accelerate discovery, but they do not prove accessibility completeness74- native HTML semantics beat ARIA patching when native controls already solve the problem75- keyboard/focus failures in interactive flows usually outrank cosmetic cleanups76- routed apps need explicit focus and announcement decisions because browser navigation cues disappear77- labels, instructions, errors, and async status text are part of task completion, not polish78- every remediation recommendation needs a matching manual verification step7980### Step 4: Build the accessibility remediation packet81Return this structure:8283```markdown84# Accessibility Remediation Packet8586## Scope87- Surface:88- Workflow type:89- Primary packet:90- Confidence: high | medium | low9192## Current signal93- Tool or report source:94- What is already known:95- What still needs direct verification:9697## Highest-risk gaps981. ...992. ...1003. ...101102## Recommended first slice1031. ...1042. ...1053. ...106107## Verification plan108- Automated re-check:109- Manual keyboard / focus:110- Manual screen-reader / AT:111- Visual / zoom / motion / reflow:112113## Ownership and route-outs114- Primary owner:115- Adjacent skills / teams:116```117118### Step 5: Use the packet, not a giant checklist119Pull the packet from [references/intake-packets-and-route-outs.md](references/intake-packets-and-route-outs.md).120121Packet rules:122- `semantics-structure` → landmarks, headings, lists, tables, buttons/links, form markup, native-first fixes123- `keyboard-focus` → tab order, visible focus, trap/escape behavior, initial focus, focus return, composite widget behavior124- `labels-announcements` → accessible names, helper/error relationships, live regions, status/error messaging, required-state clarity125- `visual-perception-reflow` → contrast, reduced motion, zoom, reflow, target visibility, state visibility126- `media-alternatives` → alt text, decorative-vs-informative imagery, captions, transcripts, fallback descriptions127- `routed-navigation-feedback` → page title / heading announcement, route-change focus strategy, SPA/app-router cues, async load state announcements128129### Step 6: Separate automated findings from manual proof130Use this split in every serious answer:131- **Automated-friendly** — missing labels, duplicate IDs, invalid ARIA, simple contrast failures, landmark/heading gaps132- **Manual keyboard/focus** — tab sequence, visible focus, trap behavior, initial focus, focus return, menu/listbox/dialog interaction133- **Manual AT / content quality** — announcement usefulness, alt-text quality, label clarity, route-change comprehension, async feedback quality134135If the request starts from a scanner, say explicitly that the scanner is the **input artifact**, not the finished answer.136137### Step 7: Route adjacent work explicitly138Use these route-outs when the problem crosses boundaries:139140| If the real job is... | Route to... |141|---|---|142| broad UI/design review, hierarchy, polish, or guideline compliance | `web-design-guidelines` |143| reusable component API / primitive ownership / slot-variant design | `ui-component-patterns` |144| viewport/container layout strategy or breakpoint planning | `responsive-design` |145| token governance or system-wide frontend standards | `design-system` |146| React/Next performance or hydration behavior | `react-best-practices` |147148## Output expectations149A strong answer from this skill should:1501. identify the **primary failing accessibility surface**,1512. recommend one bounded remediation packet,1523. name the **manual verification still required**,1534. avoid equating a scanner pass with completion,1545. route broader frontend ownership questions outward instead of absorbing them.155156## Examples157158### Example 1: modal audit after axe159**Input**160> Audit this checkout modal for accessibility issues and tell me what to test manually after axe.161162**Output direction**163- choose `keyboard-focus` or `labels-announcements`164- treat axe as the input artifact, not the whole workflow165- verify initial focus, trap behavior, focus return, and announcement quality166- keep broader visual-polish critique out unless it materially affects accessibility167168### Example 2: routed app navigation confusion169**Input**170> Screen-reader users say our React app changes routes but the new page is not announced and focus stays on the old nav link.171172**Output direction**173- choose `routed-navigation-feedback`174- classify title/heading announcement plus focus-reset strategy175- include manual AT verification after the fix176- avoid turning the task into generic routing architecture work177178### Example 3: component-boundary confusion179**Input**180> Our button primitive API is messy and some variants are not accessible. Is this web-accessibility or ui-component-patterns?181182**Output direction**183- keep accessible-name, focus-state, and disabled/loading announcement fixes in `web-accessibility`184- route primitive API / variant ownership to `ui-component-patterns`185- split the plan instead of forcing one skill to own everything186187### Example 4: manual checks after Lighthouse188**Input**189> Lighthouse says contrast is okay now. What should I still test manually?190191**Output direction**192- treat this as verification planning, not score celebration193- verify keyboard order, focus visibility, routed-flow cues, and screen-reader announcement quality where relevant194- include zoom/reflow and reduced-motion checks when the interface depends on them195196## Best practices1971. Start with the user task and failing surface, not the rule number.1982. Treat automated tools as accelerators, not as proof of accessibility completeness.1993. Prefer native HTML semantics before ARIA-heavy patches.2004. Keep focus behavior intentional for overlays, route changes, and async validation.2015. Separate remediation packets from broader design-review or component-architecture work.2026. When unsure, name the manual verification still required instead of pretending the scan is enough.203204## References205- [W3C: Evaluating Web Accessibility Overview](https://www.w3.org/WAI/test-evaluate/)206- [W3C: Easy Checks – A First Review of Web Accessibility](https://www.w3.org/WAI/test-evaluate/preliminary/)207- [web.dev: Manual accessibility testing](https://web.dev/learn/accessibility/test-manual)208- [MDN: Keyboard accessible](https://developer.mozilla.org/en-US/docs/Web/Accessibility/Guides/Understanding_WCAG/Keyboard)209- [React Router: Accessibility](https://reactrouter.com/how-to/accessibility)210- [Next.js: Accessibility](https://nextjs.org/docs/architecture/accessibility)