ADAGuard WCAG 2.2 Automated Coverage — ~78%
This is a criterion-by-criterion code audit against all 55 WCAG 2.2 Level A and AA success criteria. It counts only what ADAGuard's engine actually tests, not what is aspirationally claimed.
Summary
- 26 criteria: Fully covered — confirmed violations, high confidence
- 17 criteria: Partially covered — detects common patterns, some cases require manual review
- 12 criteria: Not automatable by any tool — require human judgment
- Total: 55 WCAG 2.2 Level A+AA criteria
Combined: 43 of 55 criteria = ~78% automated coverage
Tool Comparison (WCAG 2.2 AA, out of 55 criteria)
- ADAGuard: ~78% (criterion-by-criterion code audit)
- Deque WorldSpace: ~65% (published rule inventory)
- Siteimprove: ~60% (published documentation)
- axe-core alone: ~57% (published rule inventory)
- Lighthouse: ~42% (published audit categories)
- WAVE: ~40% (published rule documentation)
Coverage Matrix — Perceivable (1.x)
- 1.1.1 A Non-text Content — images.py + axe: image-alt — FULL
- 1.2.1 A Audio-only/Video-only — multimedia.py — PARTIAL (native HTML + iframe detection)
- 1.2.2 A Captions (Prerecorded) — multimedia.py — PARTIAL
- 1.2.3 A Audio Description or Alt — multimedia.py — PARTIAL (advisory)
- 1.2.4 AA Captions (Live) — NOT AUTOMATABLE (real-time transcription)
- 1.2.5 AA Audio Description — multimedia.py — PARTIAL
- 1.3.1 A Info and Relationships — forms.py, headings.py, tables.py, html_structure.py + axe — FULL
- 1.3.2 A Meaningful Sequence — axe tabindex detection — PARTIAL
- 1.3.3 A Sensory Characteristics — NOT AUTOMATABLE
- 1.3.4 AA Orientation — mobile.py — FULL
- 1.3.5 AA Input Purpose — forms.py, mobile.py + axe autocomplete-valid — FULL
- 1.4.1 A Use of Color — color_use.py, links.py — FULL
- 1.4.2 A Audio Control — multimedia.py, time_motion.py — FULL
- 1.4.3 AA Contrast Minimum — color_contrast.py + axe color-contrast — FULL
- 1.4.4 AA Resize Text — mobile.py + axe meta-viewport — FULL
- 1.4.5 AA Images of Text — NOT AUTOMATABLE (requires OCR)
- 1.4.10 AA Reflow — reflow.py, mobile.py — FULL
- 1.4.11 AA Non-text Contrast — non_text_contrast.py — FULL
- 1.4.12 AA Text Spacing — text_spacing.py — FULL
- 1.4.13 AA Content on Hover/Focus — hover_focus_content.py — PARTIAL (F95 confirmed + JS tooltip advisory)
Coverage Matrix — Operable (2.x)
- 2.1.1 A Keyboard — keyboard.py, aria.py, interactive.py, multimedia.py + axe — FULL
- 2.1.2 A No Keyboard Trap — axe no-keyboard-trap — PARTIAL
- 2.1.4 A Character Key Shortcuts — keyboard.py (accesskey detection) — FULL
- 2.2.1 A Timing Adjustable — time_motion.py — FULL
- 2.2.2 A Pause Stop Hide — time_motion.py, multimedia.py + axe — FULL
- 2.3.1 A Three Flashes — time_motion.py — PARTIAL (GIF advisory)
- 2.4.1 A Bypass Blocks — html_structure.py + axe bypass/landmark — FULL
- 2.4.2 A Page Titled — html_structure.py + axe document-title — FULL
- 2.4.3 A Focus Order — NOT AUTOMATABLE
- 2.4.4 A Link Purpose — links.py, images.py + axe link-name — FULL
- 2.4.5 AA Multiple Ways — multiple_ways.py — PARTIAL (single-page proxy)
- 2.4.6 AA Headings and Labels — headings.py + axe — FULL
- 2.4.7 AA Focus Visible — keyboard.py + axe focus-visible — FULL
- 2.4.11 AA Focus Not Obscured (Min) — wcag22.py — PARTIAL (sticky header heuristic)
- 2.5.1 A Pointer Gestures — NOT AUTOMATABLE
- 2.5.2 A Pointer Cancellation — NOT AUTOMATABLE
- 2.5.3 A Label in Name — axe label-content-name-mismatch — PARTIAL
- 2.5.4 A Motion Actuation — NOT AUTOMATABLE
- 2.5.7 AA Dragging Movements — wcag22.py — PARTIAL (drag interface detection)
- 2.5.8 AA Target Size Minimum — touch_targets.py, wcag22.py — FULL
Coverage Matrix — Understandable (3.x)
- 3.1.1 A Language of Page — html_structure.py + axe html-has-lang — FULL
- 3.1.2 AA Language of Parts — html_structure.py + axe valid-lang — FULL
- 3.2.1 A On Focus — NOT AUTOMATABLE
- 3.2.2 A On Input — NOT AUTOMATABLE
- 3.2.3 AA Consistent Navigation — NOT AUTOMATABLE (multi-page)
- 3.2.4 AA Consistent Identification — NOT AUTOMATABLE (multi-page)
- 3.2.6 A Consistent Help — wcag22.py — PARTIAL (unexpected locations only; nav/header/footer excluded)
- 3.3.1 A Error Identification — forms.py, color_use.py + axe — FULL
- 3.3.2 A Labels or Instructions — forms.py + axe label — FULL
- 3.3.3 AA Error Suggestion — forms.py — PARTIAL
- 3.3.4 AA Error Prevention — NOT AUTOMATABLE
- 3.3.7 A Redundant Entry — wcag22.py — PARTIAL (heuristic)
- 3.3.8 AA Accessible Authentication — wcag22.py — PARTIAL (CAPTCHA + cognitive test detection)
Coverage Matrix — Robust (4.x)
- 4.1.2 A Name Role Value — aria.py, links.py, forms.py, interactive.py + axe 20+ aria-* rules — FULL
- 4.1.3 AA Status Messages — forms.py + axe status-messages — PARTIAL
The 12 Criteria No Automated Tool Can Test
- 1.2.4 Captions (Live) — real-time transcription assessment
- 1.3.3 Sensory Characteristics — whether instructions rely solely on shape/color/location
- 1.4.5 Images of Text — requires OCR
- 2.4.3 Focus Order — meaningful order requires human navigation
- 2.5.1 Pointer Gestures — requires real user interaction testing
- 2.5.2 Pointer Cancellation — behavioral, not structural
- 2.5.4 Motion Actuation — requires testing device motion triggers
- 3.2.1 On Focus — observing whether focus triggers context changes
- 3.2.2 On Input — observing unexpected context changes
- 3.2.3 Consistent Navigation — cross-page comparison
- 3.2.4 Consistent Identification — cross-page comparison
- 3.3.4 Error Prevention — reversibility/confirmability of submissions
Checker Inventory (22 custom + axe-core 4.7.2)
All 23 modules run in parallel via asyncio.gather(). Combined scan time overhead vs axe-alone: ~15%.
- keyboard.py — 2.1.4, 2.4.7, 2.4.13 — Programmatically focuses every interactive element
- links.py — 1.4.1, 2.4.4, 4.1.2 — Empty/unclear/redundant link detection + color-only contrast check
- tables.py — 1.3.1 — 6 accessible name sources, complex header association
- time_motion.py — 2.2.x, 2.3.x — Carousels, GIFs, CSS animations, infinite scroll
- headings.py — 1.3.1, 2.4.6 — Modal-aware heading hierarchy analysis
- color_contrast.py — 1.4.3 — Alpha blending, CSS variable resolution, large text threshold
- axe_core.py — All axe rules — axe-core 4.7.2 with smart template grouping
- color_use.py — 1.4.1 — Color-only detection for links and error states
- non_text_contrast.py — 1.4.11 — CSS computed border contrast on UI components
- forms.py — 1.3.1, 1.3.5, 3.3.x — CAPTCHA, autocomplete, fieldsets, error patterns
- aria.py — 4.1.2 — Broken ARIA references, aria-hidden focus traps
- images.py — 1.1.1, 2.4.4 — Alt quality scoring, SVG, background image detection
- interactive.py — 2.1.1, 4.1.2 — Modals, accordions, tabs, dropdowns
- html_structure.py — 2.4.1, 2.4.2, 3.1.1, 3.1.2 — Skip links, landmarks, page language
- hover_focus_content.py — 1.4.13 — F95 violations + JS tooltip library detection
- reflow.py — 1.4.10 — Programmatic 320px viewport test
- text_spacing.py — 1.4.12 — CSS injection before/after comparison
- wcag22.py — 2.4.11, 2.5.7, 3.2.6, 3.3.7, 3.3.8 — All 5 new WCAG 2.2 criteria
- touch_targets.py — 2.5.5, 2.5.8 — AA vs AAA threshold separation
- broken_links.py — Best practice — DNS failures, 404s, redirects, noopener
- multiple_ways.py — 2.4.5 — Search, nav, sitemap, breadcrumbs, ToC
- multimedia.py — 1.2.1-1.2.5, 1.4.2 — Native HTML5 + embedded player detection
- mobile.py — 1.3.4, 1.4.4, 1.4.10 — Touch targets, zoom lock, orientation
Links
- Coverage page: https://www.adaguard.io/wcag-coverage
- Free scanner: https://www.adaguard.io/free-accessibility-scanner
- Pricing: https://www.adaguard.io/pricing
- WCAG 2.2 specification: https://www.w3.org/TR/WCAG22/