Every check Proof runs, and exactly how each one gets fixed.
No hand-waving: this is the full map — what’s tested, by which engine, and whether the resolution is a machine fix, a guided human decision, or a human attestation.
Automatic passes clear 63–74% of all defects (12,689 findings · three document libraries · Aug 2026), but most documents still need one or two human decisions, usually color contrast or reading order. The rest is a guided decision or a human attestation — mapped below, never hand-waved.
“Proof of accessibility” means evidence: the certificate records every WCAG 2.1 AA check Proof ran on that exact file and every judgment call a person attested; it is not a usability test, so for high-stakes documents, such as forms people must complete and notices people must act on, also test the finished file with a screen reader.
Three layers of checks
- layer 1
veraPDF
Built on veraPDF, the open-source PDF/UA validator, with every machine clause mapped to its WCAG criterion — plus Ockem’s own detectors for the checks it has no clause for.
- layer 2
Ockem’s own detectors
Checks veraPDF has no clause for — color contrast that ignores text hidden behind artwork, reading order, images of text found by comparing OCR with the text layer, language of parts, use of color, non-text contrast, and how forms and scripts behave. Checks most tools skip entirely.
- layer 3
Deterministic prescan
Document facts read directly from the file: structure tree, image-only detection, bookmarks, metadata, encryption flags.
How to read the resolution chips:
- Automatic
- deterministic fixer, re-verified
- Guarded
- live before/after diff inside the apply
- AI + human
- drafted locally, human-approved
- Decision queue
- human decides, machine applies
- Attestation
- human sign-off, listed on the certificate
Perceivable
content everyone can perceive
| Check | How Proof handles it | Resolution |
|---|---|---|
| Figures alternate text1.1.1 Non-text Content · A | Figure census from the structure tree, per-figure strict check, alt/content association analysis, empty-alt detection. Fixed by AI-drafted alt text with the figure crop beside the draft — human-approved — plus automatic figure wrapping so alt text has somewhere to live. How this gets fixed: Figures alternate text |
|
| Image-only PDFs1.1.1 · A | Scanned documents detected at prescan. OCR rebuilds the page as structured, accessible-by-default content — real headings, reading order, and tab order, with scan noise artifacted — not just an invisible text layer. How this gets fixed: Image-only PDFs |
|
| Multimedia alternatives1.2.1 / 1.2.2 / 1.2.3 / 1.2.5 · A / AA | Media annotations typed automatically; the alternate description is drafted as a placeholder for a person to word. A person checks each clip for captions and an audio description or text alternative. How this gets fixed: Multimedia alternatives |
|
| Tables1.3.1 Info & Relationships · A | 16 table-shape rules plus Ockem’s untagged-table detection in the raw content layer. Fixed by guarded structure builders (tag, headers→TH, scope, colspan balancing) when the table’s shape is unambiguous, and an in-browser table editor (first release) for the calls a machine shouldn’t make. How this gets fixed: Tables |
|
| Headings, lists & structure1.3.1 · A | Heading nesting, list structure, role mapping, tagged-content analysis. Guarded automatic repair — plus a decision queue that promotes real headings mis-tagged as page furniture. How this gets fixed: Headings, lists & structure |
|
| Logical reading order1.3.2 Meaningful Sequence · A | Ockem’s consensus audit compares geometric order against structure-tree order per page. Untagged content is an objective fail; divergent pages go to a step-by-step page review with numbered overlays. Confirmations are recorded attestations. How this gets fixed: Logical reading order |
|
| Sensory characteristics1.3.3 · A | Bilingual language scan for instructions relying on shape, position, or sound — deliberately over-flags for the reviewer. How this gets fixed: Sensory characteristics |
|
| Input purpose1.3.5 Identify Input Purpose · AA | A form field that asks for the person’s own details passes when its name says what it collects; a generic name goes to a person. How this gets fixed: Input purpose |
|
| Use of color1.4.1 Use of Color · A | Text, links, chart keys and chart-like pictures scanned for meaning carried by color alone. A file with none passes; each one found goes to a person. How this gets fixed: Use of color |
|
| Audio control1.4.2 · A | Audio that plays on its own needs a way to pause or stop it — checked by a person on every file with media. How this gets fixed: Audio control |
|
| Color contrast1.4.3 Contrast (Minimum) · AA | Every text run classified against 4.5:1 (3:1 large text), artifact-aware, with an occlusion guard that suppresses text hidden behind cover artwork. Fixed in the contrast decision queue: recolor to the nearest accessible color, or insert a backing band on photographic backgrounds. How this gets fixed: Color contrast |
|
| Resize text1.4.4 · AA | Reflow and zoom behavior is a judgment check — reviewed and attested by an accountable person. How this gets fixed: Resize text |
|
| Images of text1.4.5 · AA | Ockem’s OCR-diff detector: large raster regions are OCR’d and compared against the real text layer; a surplus means text living only inside an image. Evidence shown on the review card. Font embedding is repaired automatically. How this gets fixed: Images of text |
|
| Non-text contrast1.4.11 · AA | Form-control borders and chart keys measured against 3:1, and pictures that look like charts or maps found for a person to check. A file with none of these passes. How this gets fixed: Non-text contrast |
|
| Content on hover or focus1.4.13 · AA | Files with scripts: Acrobat’s built-in scripts pass; a custom script goes to a person, who checks anything it shows can be dismissed and stays put. How this gets fixed: Content on hover or focus |
|
Operable
navigation that works without a mouse
| Check | How Proof handles it | Resolution |
|---|---|---|
| Keyboard access & traps2.1.1 / 2.1.2 · A | Links and form fields work through the viewer’s own keyboard support and pass. Actions only a pointer can fire, and custom scripts, go to a person. How this gets fixed: Keyboard access & traps |
|
| Timing, motion & flicker2.2.1 / 2.2.2 / 2.3.1 · A | Scripts that run on a timer, custom scripts and embedded media go to a person, who confirms nothing demands a timed response, anything moving can be paused and nothing flashes. A file without them passes. How this gets fixed: Timing, motion & flicker |
|
| Bookmarks2.4.1 Bypass Blocks · A | Outline presence checked against document length; generated automatically from the heading structure. How this gets fixed: Bookmarks |
|
| Document title2.4.2 Page Titled · A | Catalog + XMP title checks, including filename-echo detection — a title that just repeats the filename fails until a human sets a real one. AI drafts a title; a person accepts it. How this gets fixed: Document title |
|
| Tab order2.4.3 Focus Order · A | Page tab-order settings checked and set to structure order automatically. How this gets fixed: Tab order |
|
| Link purpose2.4.4 · A | Link structure and accessible names checked; links wrapped, named from visible text, and bare URLs/emails/phones turned into real link annotations. How this gets fixed: Link purpose |
|
| Focus visible2.4.7 · AA | The viewer draws focus on links and form fields, so they pass; a script that moves or restyles a field on focus goes to a person. How this gets fixed: Focus visible |
|
| Label in name2.5.3 · A | Form fields whose spoken name is generic and shares no word with the printed label are flagged for a person. How this gets fixed: Label in name |
|
Understandable
language declared, forms that behave
| Check | How Proof handles it | Resolution |
|---|---|---|
| Document language3.1.1 Language of Page · A | Catalog and XMP language checked; auto-detected from content and written when absent. How this gets fixed: Document language |
|
| Language of parts3.1.2 · AA | Unicode-script scan surfaces runs of Cyrillic, Greek, Arabic, Hebrew, CJK and other scripts different from the document language, with locations. Span-level language is a content decision — attested. How this gets fixed: Language of parts |
|
| Change of context3.2.1 / 3.2.2 · A | A field that navigates, opens a file, submits, launches anything or moves focus when it gets focus or its value changes goes to a person. How this gets fixed: Change of context |
|
| Input errors3.3.1 / 3.3.3 · A / AA | Acrobat’s built-in validators pass when the field’s name states the expected format; custom validation goes to a person. A form that validates nothing passes. How this gets fixed: Input errors |
|
| Error prevention3.3.4 · AA | A form that is saved or printed passes; one that can submit goes to a person, who confirms entries can be reviewed, corrected or undone. How this gets fixed: Error prevention |
|
Robust
works with assistive technology
| Check | How Proof handles it | Resolution |
|---|---|---|
| AT-blocking encryption4.1.2 Name, Role, Value · A | Accessibility-permission flags detected and removed automatically. |
|
| Form fields4.1.2 · A | Field tagging and description checks. Widgets tagged into Form structure with tooltips written; per-field label text is human-authorable; vestigial exporter-artifact widgets removed. How this gets fixed: Form fields |
|
| Status messages4.1.3 · AA | Files with scripts: Acrobat’s built-in scripts pass; a custom script goes to a person, who checks any status message it shows is announced. How this gets fixed: Status messages |
|
| Fonts & character encodingsupports 1.1.1 / 1.4.5 | veraPDF’s font checks: unembedded fonts get metric-compatible replacements; character-map plumbing regenerated so extracted text is faithful; symbolic checkbox glyphs replaced with vector drawing. How this gets fixed: Fonts & character encoding |
|
| Structure-tree truststructure integrity | The Suspects flag is cleared so validators and assistive technology trust the tag tree. |
|
Every WCAG 2.1 A and AA criterion, and what a certificate claims
WCAG 2.1 has 50 success criteria at Levels A and AA. 11 never apply to a static PDF. The other 39 can apply, depending on what the file contains, and 14 apply to every PDF. Proof evaluates every one of the 39, by machine check or recorded attestation: 14 through machine checks, and 25 through scans that pass a file when they find nothing to question and otherwise ask a person to attest.
Each certificate counts its own coverage. When every criterion that applies to the document was evaluated, it says so: “every one of the M WCAG 2.1 Level A/AA criteria that apply to this document (M of M, by machine check or recorded attestation)”, with M the number of criteria that apply to it. It lists the checks it ran, and says that criteria it does not list are outside its scope and are not claimed. So its badge reads as WCAG 2.1 AA Compliant on every criterion that applies to the document, and the certificate gives the count.
A certificate says “N of the M” instead in two cases: it was issued before October 8, 2026, when Proof began evaluating every criterion that can apply, or every link in the document is tagged around empty content, which leaves 2.4.4 Link Purpose with no words to evaluate. Either way, the certificate names what was not evaluated: its “Not claimed” section lists, by number and name, each criterion that applies and was not evaluated, and its public verification page says the same. Certificates issued before October 8 add the names the next time their holder opens or downloads them in Ockem Proof.
Certificates anchor WCAG 2.1 Level AA, the standard the ADA Title II and HHS Section 504 rules cite. Proof does not evaluate the criteria added in WCAG 2.2.
- 14 evaluated by machine
- 25 attested by a person
- 11 not applicable to a static PDF
- Evaluated (machine)
- Proof’s checks decide pass or fail on their own. A person is asked only where a check cannot decide.
- Attested (human)
- Proof never fails these on its own. A scan passes the file when it finds nothing to question; otherwise a person decides, and the certificate lists the criteria that rest on that judgment and names the organization that attested.
- Not applicable to a static PDF
- Never engaged by a single static PDF, per W3C’s guidance for non-web documents (WCAG2ICT). No certificate counts it.
| Criterion | Level | Applies to | What Proof does | Notes |
|---|---|---|---|---|
| 1.1.1 Non-text Content | A | Every PDF | Evaluated (machine) | Every image needs real alternative text or a decorative mark; a tool’s placeholder does not count. The check confirms the text is there, not that it describes the image well. Deep dives for 1.1.1 Non-text Content: Alt text, Scanned documents |
| 1.2.1 Audio-only and Video-only (Prerecorded) | A | Files with audio or video | Evaluated (machine) | Applies only when the file embeds audio or video; checks the media is tagged with a text alternative. Deep dives for 1.2.1 Audio-only and Video-only (Prerecorded): Multimedia |
| 1.2.2 Captions (Prerecorded) | A | Files with audio or video | Attested (human) | Applies only when the file embeds audio or video, and then always goes to a person, who checks that each clip with sound has captions. Deep dives for 1.2.2 Captions (Prerecorded): Multimedia |
| 1.2.3 Audio Description or Media Alternative (Prerecorded) | A | Files with audio or video | Attested (human) | Applies only when the file embeds audio or video, and then always goes to a person, who checks that each video has an audio description or a text alternative. Deep dives for 1.2.3 Audio Description or Media Alternative (Prerecorded): Multimedia |
| 1.2.4 Captions (Live) | AA | No static PDF | Not applicable to a static PDF | A PDF cannot carry a live stream. |
| 1.2.5 Audio Description (Prerecorded) | AA | Files with audio or video | Attested (human) | Applies only when the file embeds audio or video, and then always goes to a person, who checks that each video has an audio description. Deep dives for 1.2.5 Audio Description (Prerecorded): Multimedia |
| 1.3.1 Info and Relationships | A | Every PDF | Evaluated (machine) | Tags, headings, lists and tables, checked against the PDF/UA structure rules and Proof’s own scans for structure that is shown but not tagged. Deep dives for 1.3.1 Info and Relationships: Tables, Headings and lists |
| 1.3.2 Meaningful Sequence | A | Every PDF | Evaluated (machine) | The tagged reading order is audited against the page layout; where the audit cannot decide, a person confirms the order. Deep dives for 1.3.2 Meaningful Sequence: Reading order |
| 1.3.3 Sensory Characteristics | A | Every PDF | Attested (human) | A scan flags instructions that lean on color, shape, position, size or sound; a person reviews each one. Deep dives for 1.3.3 Sensory Characteristics: Human-verified checks |
| 1.3.4 Orientation | AA | No static PDF | Not applicable to a static PDF | Not engaged by a single static PDF (WCAG2ICT). |
| 1.3.5 Identify Input Purpose | AA | Files with form fields | Attested (human) | Fillable forms: a field that asks for the person’s own details (name, email, phone, address, birth date) passes when its name says what it collects. A generic name goes to a person. Deep dives for 1.3.5 Identify Input Purpose: Forms |
| 1.4.1 Use of Color | A | Every PDF | Attested (human) | A scan looks for text, links, chart keys and chart-like pictures told apart by color alone. It passes the file when it finds none; otherwise a person checks each one. Deep dives for 1.4.1 Use of Color: Human-verified checks |
| 1.4.2 Audio Control | A | Files with audio or video | Attested (human) | Applies only when the file embeds audio or video, and then always goes to a person, who checks that no audio plays on its own without a way to pause or stop it. Deep dives for 1.4.2 Audio Control: Multimedia |
| 1.4.3 Contrast (Minimum) | AA | Every PDF | Evaluated (machine) | Text contrast is measured run by run, on scanned pages from the pixels. A page that cannot be measured with a clear margin goes to a person. Deep dives for 1.4.3 Contrast (Minimum): Color contrast |
| 1.4.4 Resize Text | AA | Every PDF | Attested (human) | Tagged text passes, because PDF viewers zoom it. An untagged file goes to a person. Deep dives for 1.4.4 Resize Text: Human-verified checks |
| 1.4.5 Images of Text | AA | Every PDF | Attested (human) | A text-recognition scan finds images that contain text; a person decides each one. Deep dives for 1.4.5 Images of Text: Human-verified checks |
| 1.4.10 Reflow | AA | Every PDF | Evaluated (machine) | Derived from the tagging, reading-order and images-of-text results; it passes only when they do. |
| 1.4.11 Non-text Contrast | AA | Every PDF | Attested (human) | Proof measures form-field borders and chart keys against 3:1 and finds pictures that look like charts or maps. A person confirms any shortfall and checks each chart; a file with none of these passes. Deep dives for 1.4.11 Non-text Contrast: Human-verified checks |
| 1.4.12 Text Spacing | AA | No static PDF | Not applicable to a static PDF | PDF viewers do not let a reader override spacing, so a document can neither meet nor fail it (WCAG2ICT). |
| 1.4.13 Content on Hover or Focus | AA | Files with scripts | Attested (human) | Applies only to files with scripts. Acrobat’s own built-in scripts pass; a custom script goes to a person, who checks that anything it shows on hover or focus can be dismissed and stays put. Deep dives for 1.4.13 Content on Hover or Focus: Human-verified checks |
| 2.1.1 Keyboard | A | Files with links, form fields, scripts or audio or video | Attested (human) | Links and form fields work through the viewer’s own keyboard support, so they pass. An action only a pointer can fire, or a custom script, goes to a person. Deep dives for 2.1.1 Keyboard: Human-verified checks |
| 2.1.2 No Keyboard Trap | A | Files with form fields, scripts or audio or video | Attested (human) | Form fields and media are operated through the viewer and pass. A custom script, or an action only a pointer can fire, goes to a person, who confirms focus is never trapped. Deep dives for 2.1.2 No Keyboard Trap: Human-verified checks |
| 2.1.4 Character Key Shortcuts | A | No static PDF | Not applicable to a static PDF | Not engaged by a single static PDF (WCAG2ICT). |
| 2.2.1 Timing Adjustable | A | Files with scripts | Attested (human) | Applies only to files with scripts. A script that runs on a timer goes to a person, who confirms no action needs a response in time; without one, the file passes. Deep dives for 2.2.1 Timing Adjustable: Human-verified checks |
| 2.2.2 Pause, Stop, Hide | A | Files with scripts or audio or video | Attested (human) | Applies only to files with scripts or media. Audio or video, or a custom script, goes to a person, who confirms anything that moves or updates on its own can be paused. Deep dives for 2.2.2 Pause, Stop, Hide: Human-verified checks, Multimedia |
| 2.3.1 Three Flashes or Below Threshold | A | Files with scripts or audio or video | Attested (human) | Applies only to files with scripts or media. Media, or a script that runs on a timer, goes to a person, who confirms nothing flashes more than three times a second. Deep dives for 2.3.1 Three Flashes or Below Threshold: Human-verified checks |
| 2.4.1 Bypass Blocks | A | Files over 20 pages | Evaluated (machine) | Applies to files over 20 pages: bookmarks or a heading structure meet it. With neither, a person decides. |
| 2.4.2 Page Titled | A | Every PDF | Evaluated (machine) | The file needs a real title that the viewer shows, not a file name, a generator default or garbled text. Deep dives for 2.4.2 Page Titled: Document title |
| 2.4.3 Focus Order | A | Files with links or form fields | Evaluated (machine) | Files with links or form fields: checks the tab order follows the document structure. Deep dives for 2.4.3 Focus Order: Links and navigation |
| 2.4.4 Link Purpose (In Context) | A | Files with links | Evaluated (machine) | Checks each link is tagged around the words that describe it. When every link is tagged around empty content there are no words to check, so the criterion is not evaluated on that file: its certificate says “N of the M” and names 2.4.4 as not claimed. Deep dives for 2.4.4 Link Purpose (In Context): Links and navigation |
| 2.4.5 Multiple Ways | AA | No static PDF | Not applicable to a static PDF | Applies to a set of web pages, not to one document. |
| 2.4.6 Headings and Labels | AA | Every PDF | Evaluated (machine) | Heading structure, a title marked as page decoration that screen readers skip, and form-field names. Deep dives for 2.4.6 Headings and Labels: Headings and lists |
| 2.4.7 Focus Visible | AA | Files with links or form fields | Attested (human) | The PDF viewer draws focus on links and form fields, so they pass. A script that moves or restyles a field on focus goes to a person. Deep dives for 2.4.7 Focus Visible: Human-verified checks |
| 2.5.1 Pointer Gestures | A | No static PDF | Not applicable to a static PDF | Not engaged by a single static PDF (WCAG2ICT). |
| 2.5.2 Pointer Cancellation | A | No static PDF | Not applicable to a static PDF | Not engaged by a single static PDF (WCAG2ICT). |
| 2.5.3 Label in Name | A | Files with form fields | Attested (human) | Fillable forms: a field is flagged when its spoken name is generic and shares no word with the label printed beside it. A person decides each one. Deep dives for 2.5.3 Label in Name: Forms |
| 2.5.4 Motion Actuation | A | No static PDF | Not applicable to a static PDF | Not engaged by a single static PDF (WCAG2ICT). |
| 3.1.1 Language of Page | A | Every PDF | Evaluated (machine) | Checks the file declares its primary language. Deep dives for 3.1.1 Language of Page: Document language |
| 3.1.2 Language of Parts | AA | Every PDF | Attested (human) | A scan finds passages in another writing system; a person confirms each is marked with its language. Deep dives for 3.1.2 Language of Parts: Human-verified checks |
| 3.2.1 On Focus | A | Files with form fields or scripts | Attested (human) | Forms and files with scripts: a field that navigates, opens a file, submits, launches anything or moves focus when it receives focus goes to a person. Deep dives for 3.2.1 On Focus: Forms |
| 3.2.2 On Input | A | Files with form fields or scripts | Attested (human) | Forms and files with scripts: a field that navigates, opens a file, submits, launches anything or moves focus when its value changes goes to a person. Deep dives for 3.2.2 On Input: Forms |
| 3.2.3 Consistent Navigation | AA | No static PDF | Not applicable to a static PDF | Applies to a set of web pages, not to one document. |
| 3.2.4 Consistent Identification | AA | No static PDF | Not applicable to a static PDF | Applies to a set of web pages, not to one document. |
| 3.3.1 Error Identification | A | Files with form fields | Attested (human) | Fillable forms: Acrobat’s built-in validators name the expected format and pass when the field’s name states it too. A custom validation script goes to a person. A form that validates nothing passes. Deep dives for 3.3.1 Error Identification: Forms |
| 3.3.2 Labels or Instructions | A | Files with form fields | Evaluated (machine) | Fillable forms: checks each field is properly structured, and that its name identifies it and states any required format. Deep dives for 3.3.2 Labels or Instructions: Forms |
| 3.3.3 Error Suggestion | AA | Files with form fields | Attested (human) | Checked with 3.3.1: a rejected entry needs a message that says what to enter. A custom validation script goes to a person. Deep dives for 3.3.3 Error Suggestion: Forms |
| 3.3.4 Error Prevention (Legal, Financial, Data) | AA | Files with form fields | Attested (human) | Fillable forms: a form that is saved or printed commits no one and passes. One that can submit goes to a person, who confirms entries can be reviewed and corrected, or the submission confirmed or undone. Deep dives for 3.3.4 Error Prevention (Legal, Financial, Data): Forms |
| 4.1.1 Parsing | A | No static PDF | Not applicable to a static PDF | W3C now treats it as always satisfied, and removed it in WCAG 2.2. |
| 4.1.2 Name, Role, Value | A | Files with links, form fields or scripts | Evaluated (machine) | Form fields and links need a name and a role; the file must also let assistive technology read it. Deep dives for 4.1.2 Name, Role, Value: Forms |
| 4.1.3 Status Messages | AA | Files with scripts | Attested (human) | Applies only to files with scripts. Acrobat’s own built-in scripts pass; a custom script goes to a person, who checks that any status message it shows is announced. Deep dives for 4.1.3 Status Messages: Human-verified checks |
What we deliberately don’t show as red
File-format bookkeeping rules that don’t affect assistive-technology behavior — conformance metadata, file-header details — are shown for information, never as failures. On fillable forms, Proof checks each field’s name, role and label (4.1.2, 3.3.2, 2.5.3) and how the form behaves: what a field does on focus or input (3.2.1, 3.2.2), how it reports an input error (3.3.1, 3.3.3), whether it can submit (3.3.4), and whether a field asking for personal details says what it collects (1.3.5). A check that finds nothing that could break its criterion passes; anything it finds goes to a person, never straight to “failed”.
Machine-detected, human-attested
Some criteria are genuinely judgment: images of text, sensory characteristics, focus visibility. Proof detects candidates and shows the evidence; an accountable person attests, and the attestation is recorded against them. We say so plainly — the claim is automated + attested, never "fully automatic."
Run the full profile on one of yours.
Free, no account: one PDF of up to 10 pages and 50 MB per verified email, remediated file and verification record included. Certify it for $59 when you’re ready.