Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Validate WCAG 2.2 compliance (A/AA/AAA) with ARIA, color contrast, keyboard navigation, screen readers, and automated testing via axe-core/Pa11y.
.claude/skills/williamzujkowski-frontend-accessibility-validator/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 208% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 410% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 862% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 1859% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 339% | 0% |
Purpose: Validate web application accessibility against WCAG 2.2 standards (released October 2023) using automated testing (axe-core, Pa11y, Lighthouse) and manual verification for keyboard navigation, screen reader compatibility, color contrast (4.5:1 for AA, 7:1 for AAA), ARIA attributes, semantic HTML, and the 9 new WCAG 2.2 success criteria (focus visibility, target sizing, accessible authentication, redundant entry).
When to Use:
Complements:
frontend-designsystem-validator: Validates design tokens, component consistency; this validates runtime accessibility.testing-accessibility-automation: Integrates axe-core/Pa11y into CI/CD; this provides audit reports and recommendations.frontend-performance-optimizer: Validates Core Web Vitals; this validates a11y (both are Lighthouse metrics).Mandatory Inputs:
web_pages: At least one URL or HTML file to validate.Validation Steps:
Goal: Run automated accessibility testing on a single page using axe-core to detect ~57% of issues with zero false positives.
Steps:
bash npx axe-core <URL> # Or use browser extension: Axe DevTools in Chrome/Firefox
Token Budget: ≤2k tokens (single page, automated scan only).
Goal: Validate multiple pages against WCAG 2.2 Level AA with automated testing (axe-core + Pa11y) and manual checks for keyboard navigation, screen reader, and new WCAG 2.2 criteria.
Steps:
npx @axe-core/cli <URL> (57% detection, zero false positives).npx pa11y <URL> (uses axe-core or HTML_CodeSniffer engine).lighthouse <URL> --only-categories=accessibility (uses axe-core, provides 0-100 score).outline: 0), ≥3:1 contrast, size adequate.<main>, <nav>, <aside>, <header>, <footer> or role="main", role="navigation".role="button", role="tab", role="dialog" with required states (aria-expanded, aria-selected).aria-live="polite" for status messages, aria-live="assertive" for errors.aria-label or aria-labelledby for all interactive elements without visible labels.<button> instead of <div role="button">).<input>, <textarea>, <select> has <label for="id"> or aria-label.<img> have alt attribute (empty alt="" for decorative images).<th scope="col|row"> for data tables, <caption> for table description.Token Budget: ≤6k tokens (multi-page, multi-tool, manual checks, WCAG 2.2 new criteria).
Goal: Perform a full enterprise accessibility audit across multiple pages/templates with automated testing in CI/CD, manual testing across screen readers/browsers, and a prioritized remediation roadmap.
Steps:
javascript import { axe, toHaveNoViolations } from 'jest-axe'; expect.extend(toHaveNoViolations); it('should have no accessibility violations', async () => { const { container } = render(<MyComponent />); const results = await axe(container); expect(results).toHaveNoViolations(); });
json { "urls": ["http://localhost:3000", "http://localhost:3000/products"], "defaults": {"timeout": 5000, "wait": 500, "runners": ["axe"]}, "threshold": 0 }
bash lhci autorun --collect.url=http://localhost:3000 --assert.assertions.accessibility=0.95
aria-expanded toggles, focus management.role="tablist", aria-selected, arrow key navigation.aria-live for auto-advance, pause button, keyboard nav.aria-sort, aria-rowcount, aria-colcount for virtualized tables.aria-live="polite", auto-dismiss with manual dismiss option.<label for> or aria-labelledby, not placeholder-only.<fieldset> + <legend> for radio/checkbox groups.aria-invalid="true", aria-describedby linking to error, inline + summary.required attribute + aria-required="true" + visual indicator (not color only).autocomplete attributes for user data (name, email, address).aria-describedby on Safari").Token Budget: ≤12k tokens (enterprise audit, CI/CD setup, full manual testing, remediation roadmap).
Ambiguity Resolution:
wcag_level not specified:automated_tools not specified:manual_checks not specified:aria-label conflicts with visible text:Stop Conditions:
Thresholds:
Required Fields:
typescript{ wcag_compliance_report: { level: "A" | "AA" | "AAA"; overall_status: "pass" | "fail" | "needs_review"; success_criteria: Array<{ id: string; // 1.1.1, 2.4.11, 3.3.7, etc. name: string; // Non-text Content, Focus Not Obscured, Redundant Entry level: "A" | "AA" | "AAA"; status: "pass" | "fail" | "not_applicable" | "needs_review"; automated: boolean; // True if automated tools can detect evidence: string; // "axe-core passed", "Manual test: keyboard nav OK" new_in_22: boolean; // True for 9 new WCAG 2.2 criteria }>; compliance_percentage: { level_a: number; // % of Level A criteria passing level_aa: number; level_aaa: number; }; }; violations: Array<{ id: string; // axe-rule-id or wcag-criterion wcag_criterion: string; // 1.4.3 Contrast (Minimum) level: "A" | "AA" | "AAA"; severity: "critical" | "serious" | "moderate" | "minor"; impact: string; // "Users with low vision cannot read text" element: string; // CSS selector or HTML snippet remediation: string; // "Increase contrast to 4.6:1 by darkening text" page_url: string; }>; automated_test_results: { axe_core: { violations: number; incomplete: number; // Needs manual review passes: number; detection_rate: "~57%"; // axe detects 57% of WCAG issues }; pa11y?: { errors: number; warnings: number; engine: "axe" | "htmlcs"; }; lighthouse?: { score: number; // 0-100 audits_passed: number; audits_failed: number; }; }; manual_test_checklist: Array<{ category: "keyboard" | "screen_reader" | "color_contrast" | "aria" | "semantic_html" | "touch_targets"; item: string; // "Tab order is logical" status: "pass" | "fail" | "not_tested"; notes?: string; }>; aria_issues: Array<{ element: string; issue: string; // "Missing aria-label on button" recommendation: string; // "Add aria-label='Close dialog'" }>; color_contrast_report: { failures: Array<{ foreground: string; // #333333 background: string; // #CCCCCC ratio: number; // 2.8 required: number; // 4.5 (for AA normal text) element: string; location: string; // "Homepage, product title" }>; summary: { total_checks: number; failures: number; aa_compliant: boolean; aaa_compliant: boolean; }; }; }
Optional Fields:
screen_reader_results: Object with findings from NVDA, JAWS, VoiceOver testing.remediation_roadmap: Array of phases (Phase 1/2/3) with effort estimates and priorities.ci_cd_integration: Object with axe-core, Pa11y-ci, Lighthouse CI setup examples.accessibility_statement: Markdown template for public compliance statement.Format: JSON for structured data, Markdown for remediation plan and manual checklist.
Input:
yamlweb_pages: - "https://example.com/checkout" wcag_level: "AA" automated_tools: ["axe-core", "Pa11y"] manual_checks: true
Output (T2 Summary):
yamlWCAG 2.2 Level AA Compliance: 78% (45/58 success criteria passing) Automated Tests: axe-core: 12 violations, 3 incomplete, 87 passes (57% detection rate) Pa11y: 15 errors, 8 warnings (using axe engine) Manual Tests: Keyboard: ✅ Tab order logical, ⚠️ Focus indicator low contrast (2.2:1, need 3:1) Screen Reader (NVDA): ⚠️ Error messages not announced (missing aria-live) Top Violations: 1. Color Contrast (1.4.3, AA): 8 failures (text 3.1:1, need 4.5:1) - CRITICAL 2. Form Labels (3.3.2, A): 3 inputs missing labels - CRITICAL 3. Focus Visible (2.4.7, AA): Focus indicator contrast 2.2:1 (need 3:1) - SERIOUS 4. Accessible Auth (3.3.8, AA): CAPTCHA has no alternative - SERIOUS (NEW in 2.2) 5. Target Size (2.5.8, AA): "Edit" button 20×20px (need 24×24px) - MODERATE (NEW in 2.2) Remediation Priority: Phase 1 (7 days): Fix Level A violations (form labels, keyboard traps) Phase 2 (14 days): Fix AA violations (contrast, focus indicators, CAPTCHA alternative)
Link to Full Example: See skills/frontend-accessibility-validator/examples/ecommerce-checkout-audit.txt
WCAG 2.2 New Success Criteria Status:
yaml2.4.11 Focus Not Obscured (Minimum) - AA: ⚠️ FAIL Issue: Sticky header hides focused button when tabbing Fix: Adjust scroll position or reduce header height 2.5.8 Target Size (Minimum) - AA: ⚠️ FAIL Issue: Mobile menu icons 18×18px (need 24×24px) Fix: Increase touch targets to 24×24px minimum 3.3.7 Redundant Entry - A: ✅ PASS Evidence: Shipping address auto-fills to billing address 3.3.8 Accessible Authentication (Minimum) - AA: ⚠️ FAIL Issue: CAPTCHA with no alternative (audio, SMS, email) Fix: Add audio CAPTCHA or SMS verification option
Token Budget Compliance:
Validation Checklist:
Safety & Auditability:
Determinism:
Official Standards:
Automated Testing Tools:
Color Contrast:
Screen Readers:
Complementary Skills:
frontend-designsystem-validator: Validates design tokens, component library consistency.testing-accessibility-automation: Integrates axe-core/Pa11y into CI/CD pipelines.frontend-performance-optimizer: Validates Core Web Vitals (LCP, FID, CLS) alongside accessibility.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-22 | pass→pass | 14,921 | 13,989 | -6% | 1 | 1 | 0% | 2,999 | 9,477 | +216% | 0 | 0 | — |
case-01 | fail→pass | 16,009 | 19,391 | +21% | 1 | 1 | 0% | 3,804 | 11,702 | +208% | 0 | 0 | — |
case-02 | fail→fail | 17,101 | 16,306 | -5% | 1 | 1 | 0% | 3,780 | 11,124 | +194% | 0 | 0 | — |
case-03 | fail→fail | 19,681 | 17,203 | -13% | 1 | 1 | 0% | 4,258 | 11,170 | +162% | 0 | 0 | — |
case-04 | fail→fail | 17,169 | 12,024 | -30% | 1 | 1 | 0% | 3,779 | 10,038 | +166% | 0 | 0 | — |
case-05 | fail→fail | 11,708 | 10,313 | -12% | 1 | 1 | 0% | 2,396 | 9,444 | +294% | 0 | 0 | — |
case-06 | fail→fail | 14,564 | 13,647 | -6% | 1 | 1 | 0% | 3,243 | 10,184 | +214% | 0 | 0 | — |
case-07 | fail→pass | 8,004 | 8,268 | +3% | 1 | 1 | 0% | 1,743 | 8,896 | +410% | 0 | 0 | — |
case-08 | pass→pass | 9,408 | 8,167 | -13% | 1 | 1 | 0% | 1,834 | 8,726 | +376% | 0 | 0 | — |
case-09 | pass→pass | 7,044 | 2,223 | -68% | 1 | 1 | 0% | 1,435 | 7,363 | +413% | 0 | 0 | — |
case-10 | fail→pass | 3,880 | 4,026 | +4% | 1 | 1 | 0% | 795 | 7,650 | +862% | 0 | 0 | — |
case-11 | pass→pass | 6,903 | 8,389 | +22% | 1 | 1 | 0% | 1,432 | 8,834 | +517% | 0 | 0 | — |
case-12 | fail→pass | 6,772 | 13,563 | +100% | 1 | 1 | 0% | 467 | 9,150 | +1859% | 0 | 0 | — |
case-13 | pass→pass | 8,850 | 9,041 | +2% | 1 | 1 | 0% | 1,899 | 8,952 | +371% | 0 | 0 | — |
case-14 | pass→pass | 10,699 | 14,348 | +34% | 1 | 1 | 0% | 2,375 | 10,107 | +326% | 0 | 0 | — |
case-15 | pass→pass | 4,397 | 5,982 | +36% | 1 | 1 | 0% | 1,136 | 8,539 | +652% | 0 | 0 | — |
case-16 | pass→pass | 5,747 | 6,218 | +8% | 1 | 1 | 0% | 1,271 | 8,737 | +587% | 0 | 0 | — |
case-17 | fail→pass | 10,051 | 9,968 | -1% | 1 | 1 | 0% | 2,126 | 9,331 | +339% | 0 | 0 | — |
case-18 | fail→fail | 13,267 | 18,506 | +39% | 1 | 1 | 0% | 2,920 | 11,395 | +290% | 0 | 0 | — |
case-19 | fail→pass | 33,762 | 21,943 | -35% | 1 | 1 | 0% | 6,178 | 11,879 | +92% | 0 | 0 | — |
case-20 | pass→pass | 10,452 | 8,444 | -19% | 1 | 1 | 0% | 2,066 | 8,745 | +323% | 0 | 0 | — |
case-21 | fail→pass | 3,892 | 10,937 | +181% | 1 | 1 | 0% | 689 | 9,155 | +1229% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +32 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.