WCAG 2.1 A/AA Coverage Matrix
How every WCAG 2.1 Level A and AA success criterion is (or is not) handled by the PDF β accessible-HTML conversion pipeline and the guided remediation wizard.
Goal: every applicable criterion is either auto-fixed by the pipeline or has a dedicated guided tool that walks the user through fixing it.
Legend
- AUTO β the conversion pipeline fixes it deterministically (see
workers/api/src/services/{axe-fixer,wcag-validator,post-processing-pipeline}.ts). - TOOL β a wizard step walks the user through it.
- AUTO+TOOL β pipeline does the mechanical part; a tool handles the human-judgment part.
- N/A β not applicable to static, PDF-derived documents (no media, no time limits, single page, no custom widgets) unless the source embeds that content.
- GAP β applicable but not yet covered. Tagged
β auto(add to pipeline) orβ tool(needs a guided step).
Important: automated testing (axe-core, our 44-rule fixer) detects only ~30β55% of WCAG failures. βAUTOβ means the machine-testable part is handled β it is not a conformance guarantee. Several AUTO fixes satisfy the checker via heuristics (e.g.
aria-labelguessed fromplaceholder; contrast forced to dark-on-white) without guaranteeing the criterionβs intent.
Perceivable
| SC | Level | Name | Status | Notes / gap approach |
|---|---|---|---|---|
| 1.1.1 | A | Non-text Content | AUTO+TOOL | Vision-model alt at conversion (image-description-pipeline.ts) + Images tool. Tool should also flag alt quality, not just presence. |
| 1.2.1 | A | Audio/Video-only (Prerecorded) | N/A | Only if the source embeds media β β tool (media alternative prompt). |
| 1.2.2 | A | Captions (Prerecorded) | N/A | Media only. |
| 1.2.3 | A | Audio Description / Media Alt | N/A | Media only. |
| 1.2.4 | AA | Captions (Live) | N/A | Media only. |
| 1.2.5 | AA | Audio Description (Prerecorded) | N/A | Media only. |
| 1.3.1 | A | Info & Relationships | AUTO+TOOL | Landmarks/lists/th-td auto; Headings + Tables tools for structure. |
| 1.3.2 | A | Meaningful Sequence | GAP β tool | DOM order comes from PDF reading order, but no review step. Listen surfaces it aurally; add a Reading order tool to reorder content blocks (distinct from Tab order, which is focus only). |
| 1.3.3 | A | Sensory Characteristics | TOOL β | Sensory references tool (shipped): flags position/shape/size/color-only instructions (βthe button on the rightβ, βthe round iconβ) and lets the user reword them. |
| 1.3.4 | AA | Orientation | AUTO | Responsive HTML/CSS isnβt orientation-locked. |
| 1.3.5 | AA | Identify Input Purpose | GAP β auto | Add autocomplete tokens to recognized inputs (name/email/tel/address). Forms only. |
| 1.4.1 | A | Use of Color | TOOL β | Color cues tool (shipped): finds text/links distinguished only by a chromatic color with no non-color cue, and adds an underline. |
| 1.4.2 | A | Audio Control | N/A | No autoplay audio in documents. |
| 1.4.3 | AA | Contrast (Minimum) | AUTO | fixColorContrast forces #1a1a1a on #fff. Lossy β flattens intended color; see 1.4.1. |
| 1.4.4 | AA | Resize Text | AUTO (verify) | Relative/responsive units; add a check that no fixed px/user-scalable=no blocks 200% zoom. |
| 1.4.5 | AA | Images of Text | AUTO | The converter OCRs scanned-text images (image-enhancer.ts isScannedTextPage) and replaces them with real text, marking the image decorative. Logos / essential text-in-image are exempt. Reported as images-of-text in the scan. |
| 1.4.10 | AA | Reflow | AUTO (verify) | Responsive CSS + table column-splitting (TABLE_FIT_ENABLED). Verify no 320px horizontal scroll. |
| 1.4.11 | AA | Non-text Contrast | AUTO+TOOL β | Focus outline color auto. Border contrast tool (shipped): flags table/box borders below 3:1 on white and darkens them. Graphical information rides on alt text; real UI widgets are rare in documents. |
| 1.4.12 | AA | Text Spacing | AUTO | CSS permits user spacing overrides without clipping. |
| 1.4.13 | AA | Content on Hover/Focus | N/A | No hover/tooltip UI in static documents. |
Operable
| SC | Level | Name | Status | Notes / gap approach |
|---|---|---|---|---|
| 2.1.1 | A | Keyboard | AUTO | Links/controls are natively focusable; no custom widgets in static docs. |
| 2.1.2 | A | No Keyboard Trap | AUTO | No trapping scripts. |
| 2.1.4 | AA | Character Key Shortcuts | N/A | No single-key shortcuts. |
| 2.2.1 | A | Timing Adjustable | N/A | No time limits. |
| 2.2.2 | A | Pause, Stop, Hide | AUTO | Animations reduced to a single iteration. |
| 2.3.1 | A | Three Flashes | N/A | Static content. |
| 2.4.1 | A | Bypass Blocks | AUTO | Skip link injected. |
| 2.4.2 | A | Page Titled | AUTO+TOOL | Title from filename; optional confirm-title step improves quality. |
| 2.4.3 | A | Focus Order | TOOL | Tab order tool. |
| 2.4.4 | A | Link Purpose (In Context) | TOOL | Links tool. |
| 2.4.5 | AA | Multiple Ways | N/A β auto (nice-to-have) | Single document; optionally auto-generate a TOC from headings. |
| 2.4.6 | AA | Headings & Labels | AUTO+TOOL | Headings tool flags empty; enhance to flag vague/duplicate heading text. |
| 2.4.7 | AA | Focus Visible | AUTO | Global :focus-visible outline. |
| 2.5.1 | A | Pointer Gestures | N/A | No multipoint/path gestures. |
| 2.5.2 | A | Pointer Cancellation | N/A | No custom pointer handlers. |
| 2.5.3 | A | Label in Name | TOOL β | Covered by the Form fields tool (adds accessible names to controls). Forms only. |
| 2.5.4 | A | Motion Actuation | N/A | No motion-triggered actions. |
Understandable
| SC | Level | Name | Status | Notes / gap approach |
|---|---|---|---|---|
| 3.1.1 | A | Language of Page | AUTO | lang= injected on <html>. |
| 3.1.2 | AA | Language of Parts | PARTIAL β auto | Feature-flagged (WCAG_LANGUAGE_OF_PARTS). Enable/improve auto foreign-phrase detection, or a tool to mark. |
| 3.2.1 | A | On Focus | AUTO | No context change on focus. |
| 3.2.2 | A | On Input | AUTO | No auto-submit on input. |
| 3.2.3 | AA | Consistent Navigation | N/A | Single document. |
| 3.2.4 | AA | Consistent Identification | N/A | Single document. |
| 3.3.1 | A | Error Identification | N/A β tool | Forms only β Form fields tool. |
| 3.3.2 | A | Labels or Instructions | AUTO+TOOL β | Heuristic aria-label auto; Form fields tool (shipped) finds controls with no label / placeholder-only and adds a real one. Forms only. |
| 3.3.3 | AA | Error Suggestion | N/A β tool | Forms only β Form fields tool. |
| 3.3.4 | AA | Error Prevention (Legal/Financial) | N/A β tool | Interactive forms only. |
Robust
| SC | Level | Name | Status | Notes / gap approach |
|---|---|---|---|---|
| 4.1.1 | A | Parsing | AUTO | Duplicate-id + invalid-nesting fixes. (Removed in WCAG 2.2, retained here for 2.1.) |
| 4.1.2 | A | Name, Role, Value | AUTO | ARIA role/attr fixes for standard controls. |
| 4.1.3 | AA | Status Messages | N/A | No dynamic status regions in static docs. |
Whatβs actually missing (applicable, not yet covered)
New guided tools to build
Color cues (1.4.1)β shipped: finds color-only distinctions and adds an underline.- Reading order (1.3.2) β reorder content blocks to match visual order (content, not just focus). (Deferred: needs layout via an iframe bridge like Tab order; the converter already emits DOM in reading order.)
Sensory references (1.3.3)β shipped: flags shape/size/location/color-only instructions to reword.Images of text (1.4.5)β already auto-fixed by the converter (OCR β real text); not a tool gap.Graphics & UI contrast (1.4.11)β shipped as Border contrast: darkens faint table/box borders below 3:1 (the applicable slice; graphics ride on alt text).Form fields (2.5.3, 3.3.2)β shipped: labels controls with no label / placeholder-only. (Error handling 3.3.1/3.3.3 and input-purpose 1.3.5 remain surfaced by the scan for the rare interactive-form document.)
Status: every applicable WCAG 2.1 A/AA criterion is now auto-fixed or has a guided tool. The only remaining items are inherently N/A for static documents (media, timing, multi-page) or need human judgment the tools capture (is the alt text accurate?).
Pipeline auto-fixes to add
autocompletetokens on recognized inputs (1.3.5).- Zoom/reflow guard: strip
user-scalable=no, flag fixed-px widths (1.4.4 / 1.4.10). - Enable/strengthen language-of-parts detection (3.1.2).
- Optional: auto-generate a table of contents from headings (2.4.5).
Enhancements to existing tools
- Images β prompt on alt quality, not just presence (1.1.1).
- Headings β flag vague/duplicate heading text (2.4.6).
Wizard summary β drive completeness from the real axe-core conformance scanβ shipped: the wizard summary now readsfile.wcagStatus.evaluatedRules, routes each failing rule to its guided tool (or notes it as auto-fixed/manual), and reports βN of M checks passβ from the last validation.
Honest framing
Not every one of the 50 criteria needs a tool: for static, PDF-derived documents, the media (1.2.x), timing (2.2.x), flashing (2.3.1), pointer/motion (2.5.x), multi-page consistency (3.2.3/4), and status-message (4.1.3) criteria are N/A by content type β they only apply when the source embeds media or interactive forms. The realistic target is: every applicable criterion is auto-fixed or has a tool, and the wizardβs end state reflects the actual conformance scan rather than a fixed list. With the tools above added, the applicable-criteria coverage is essentially complete β the remaining residue (is the alt text accurate? is a heading meaningful?) is inherently human judgment, which is what the guided tools exist to capture.