Skip to content

WCAG 2.1 Coverage Gap Analysis

This document maps every WCAG 2.1 success criterion against what the Accessible PDF Converter currently tests, and explains what is missing, why, and what would be needed to close each gap.

Last updated: 2026-03-07 (updated to reflect Phase 1–4 implementation and 7 new Tier 1 auto-fixes)


Background

The pipeline has three validation layers:

  1. Custom static validator (wcag-validator.ts) — regex/DOM analysis of HTML strings. Currently implements 38 rules spanning Level A, AA, and AAA. 20 of these rules are auto-fixable — violations are corrected before the HTML is saved.
  2. Browser custom checkers (wcag-resize-checker.ts, wcag-text-spacing-checker.ts, wcag-focus-order-checker.ts) — Puppeteer-based checks for criteria that require a rendered DOM.
  3. axe-core auditor (axe-validator.ts) — full browser audit covering ~90+ WCAG 2.0–2.2 rules.

WCAG 2.1 contains 78 success criteria across four principles (Perceivable, Operable, Understandable, Robust). This document answers the question: which of those 78 criteria are we checking, which are we missing but could check, and which are fundamentally impossible to test without a browser?


What We Currently Check

The table below lists the rules currently implemented across all three layers and the WCAG 2.1 success criterion each maps to. For the full rule reference see docs/WCAG-VALIDATION-RULES.md.

Custom static validator (38 rules, 20 auto-fixable):

Rule IDWCAG SCLevelLayer
image-alt1.1.1 Non-text ContentAStatic
image-alt-meaningful1.1.1 Non-text ContentAStatic
sensory-characteristics1.3.3 Sensory CharacteristicsAStatic
heading-order1.3.1 Info & RelationshipsAStatic
list-structure1.3.1 Info & RelationshipsAStatic
definition-list1.3.1 Info & RelationshipsAStatic
empty-heading1.3.1 Info & RelationshipsAStatic
empty-table-header1.3.1 Info & RelationshipsAStatic
table-has-header1.3.1 Info & RelationshipsAStatic
scope-attr-valid1.3.1 Info & RelationshipsAStatic
th-has-scope1.3.1 Info & RelationshipsAStatic
layout-table1.3.2 Meaningful SequenceAStatic
use-of-color1.4.1 Use of ColorAStatic
color-contrast1.4.3 Contrast MinimumAAStatic
images-of-text1.4.5 Images of TextAAStatic
meta-viewport1.4.4 / 1.4.10AAStatic
document-title2.4.2 Page TitledAStatic
skip-link2.4.1 Bypass BlocksAStatic
landmark-one-main2.4.1 Bypass BlocksAStatic
link-name2.4.4 Link PurposeAStatic
heading-descriptive2.4.6 Headings and LabelsAAStatic
button-name4.1.2 Name, Role, ValueAStatic
label3.3.2 Labels or InstructionsAStatic
html-has-lang3.1.1 Language of PageAStatic
document-lang-valid3.1.1 Language of PageAAStatic
lang-of-parts3.1.2 Language of PartsAAStatic
consistent-identification3.2.4 Consistent IdentificationAAStatic
duplicate-id4.1.1 ParsingAStatic
invalid-nesting4.1.1 ParsingAStatic
aria-role-valid4.1.2 Name, Role, ValueAStatic
aria-allowed-attr4.1.2 Name, Role, ValueAStatic
status-messages4.1.3 Status MessagesAAStatic
color-contrast-enhanced1.4.6 Contrast EnhancedAAAStatic
visual-presentation1.4.8 Visual PresentationAAAStatic
images-of-text-no-exception1.4.9 Images of Text (No Exception)AAAStatic
link-purpose-sole2.4.9 Link Purpose (Link Only)AAAStatic
section-headings2.4.10 Section HeadingsAAAStatic
abbreviation-expansion3.1.4 AbbreviationsAAAStatic

Browser custom checkers (3 checks):

CheckWCAG SCLevelLayer
checkResizeText1.4.4 Resize TextAABrowser
checkTextSpacing1.4.12 Text SpacingAABrowser
checkFocusOrder2.4.3 Focus OrderABrowser

axe-core covers ~90+ additional rules across WCAG 2.0–2.2 at all levels plus best practices. See docs/WCAG-VALIDATION-RULES.md Part 3 for the full list.


Gaps: Statically Testable — All Now Implemented ✓

All 11 criteria previously identified as statically testable have been implemented (Phases 1–3). No remaining static gaps exist.

WCAG SCLevelRule ID
1.1.1 Non-text Content (meaningful alt)Aimage-alt-meaningful
1.3.2 Meaningful Sequence (layout tables)Alayout-table
1.3.3 Sensory CharacteristicsAsensory-characteristics
1.4.1 Use of ColorAuse-of-color
1.4.5 Images of Text (AA)AAimages-of-text
2.4.6 Headings and LabelsAAheading-descriptive
3.1.2 Language of PartsAAlang-of-parts
3.2.4 Consistent IdentificationAAconsistent-identification
4.1.1 Parsing (invalid nesting)Ainvalid-nesting
4.1.2 Name, Role, Value (ARIA roles)Aaria-role-valid + aria-allowed-attr
4.1.3 Status MessagesAAstatus-messages

Browser-Required Criteria — Checked or Covered

These criteria require a rendered browser. They are addressed by the browser custom checkers (Phase 4) or by axe-core.

WCAG SCLevelStatusHow
1.4.4 Resize TextAA✓ CheckedcheckResizeText() — applies 200% zoom, measures overflow
1.4.11 Non-text ContrastAA✓ Coveredaxe-core non-text-contrast rule
1.4.12 Text SpacingAA✓ CheckedcheckTextSpacing() — injects WCAG spacing overrides, detects clipping
2.4.3 Focus OrderA✓ CheckedcheckFocusOrder() — computes theoretical tab sequence vs. DOM order
2.4.7 Focus VisibleAA✓ Coveredaxe-core focus-visible rule
2.5.3 Label in NameA✓ Coveredaxe-core label-content-name-mismatch rule
2.1.1 Keyboard (partial)A✓ Coveredaxe-core scrollable-region-focusable, tabindex rules

Browser-Required Criteria — Not Checked

These criteria cannot be verified by this pipeline. No violation is reported, no fix is applied, and no audit entry is produced. Documents that may involve these criteria must be verified manually by the document author.

These criteria still require live user interaction, media playback, or device capabilities that cannot be automated in a static document conversion pipeline.

WCAG SCLevelWhy not checked
1.2.1 Audio-only / Video-only (Prerecorded)ARequires inspecting or playing actual media files
1.2.2 Captions (Prerecorded)ARequires reading caption tracks from media
1.2.3 Audio Description or Media AlternativeARequires media playback
1.2.4 Captions (Live)AARequires live media stream
1.2.5 Audio Description (Prerecorded)AARequires media playback
1.4.13 Content on Hover or FocusAARequires triggering hover/focus states — not present in static PDF output
2.1.2 No Keyboard TrapARequires entering every widget via keyboard and confirming focus can exit
2.3.1 Three Flashes or Below ThresholdARequires measuring frame-by-frame animation rates
2.5.1 Pointer GesturesANot applicable — no multi-touch gestures in static PDF output
2.5.2 Pointer CancellationANot applicable — no interaction flows in static output
2.5.4 Motion ActuationANot applicable — static document output
3.2.1 On FocusARequires triggering focus events and observing context changes
3.2.2 On InputARequires triggering input events
3.3.1 Error IdentificationARequires form submission with invalid data — not in static PDF output
3.3.3 Error SuggestionAASame as above
3.3.4 Error PreventionAARequires form submission with reversibility verification

Not Applicable to PDF-to-HTML Output

These criteria are structurally irrelevant to this product. They govern dynamic web application behaviors — session management, multi-page navigation, pointer gestures, orientation locking — that are absent from a static converted document. No testing is needed and no report entry is produced.

These criteria address behaviors that do not arise in static document conversion output. They apply to web applications or sites with navigation, accounts, or dynamic interaction — not to a single converted HTML document.

WCAG SCLevelReason not applicable
1.3.4 OrientationAAConverted documents do not lock screen orientation via CSS or JS
1.3.5 Identify Input PurposeAAThe autocomplete attribute is relevant for account/login forms, not for tables or text from a PDF
2.1.4 Character Key ShortcutsAANo single-character keyboard shortcuts are added to converted output
2.2.1 Timing AdjustableANo time limits are imposed on static documents
2.2.2 Pause, Stop, HideANo auto-updating or moving content in static output
2.2.6 TimeoutsAAANo session timeouts in a static document
2.4.5 Multiple WaysAAA single converted document has no site-level navigation to audit
3.2.3 Consistent NavigationAANo multi-page navigation structure
3.2.5 Change on RequestAAANo dynamic context changes in static output
3.3.5 HelpAAAContext-sensitive help is a web-app concept
3.3.6 Error Prevention (All)AAANo user data submission in static output

Summary

CategoryCountNotes
Static validator rules38 rules20 auto-fixable; 19 flagged-only (reported, not fixed)
Browser custom checkers3 checks (1.4.4, 1.4.12, 2.4.3)Detect only — fixes require CSS/markup restructuring
axe-core rules (browser)~90+ rules20 auto-fixable; 30+ reported only
Statically testable — not yet implemented0 (all closed)
Browser-required — now checked7 criteria1.4.4, 1.4.11, 1.4.12, 2.4.3, 2.4.7, 2.5.3, 2.1.1 (partial)
Browser-required — NOT checked16 criteriaNo detection, no report, no fix — manual verification required
Not applicable to this product14 criteriaN/A — no testing needed

All previously identified static gaps have been closed. The remaining unchecked criteria either require live user interaction (form submission, real keypress sequences), media playback, or are not applicable to static PDF-to-HTML output.