verify-pdf-output covers zero WCAG criteria, five gaps are real, and four of the five are already fixed by a Typst flag we own
The question
"What specific WCAG 2.2 AA checks (color contrast ratios, focus order, keyboard navigation, screen-reader landmarks, alt-text presence, heading hierarchy) does verify-pdf-output's 12-check rubric NOT cover today, and which of those gaps would actually fail a real accessibility audit on a Sanity Check / MAC / Squarely artifact?"
Context: the brand DESIGN.md files were said to have picked up Accessibility sections, and /verify-pdf-output covers visual quality. The decision downstream is extend the existing skill, build a sibling verify-accessibility, or scope WCAG out for now.
What we already know (from the vault)
- The 12 checks were never meant to cover accessibility, and the source synthesis says so in writing.
~/.claude/state/pdf-quality-bar-synthesis.mdline 237 records the scoping decision verbatim: the author "did not inspect raw PDF object structure for things like form-field metadata, accessibility tagging, or color profiles. These are likely irrelevant for RDCO's use case." Every one of the 12 checks is a house-style or print-craft rule. None maps to a WCAG success criterion. Check 3 (body ≥11pt) is the closest-looking, and WCAG has no minimum-font-size criterion at all, so it maps to nothing. - The premise that "brand DESIGN.md files just got Accessibility sections" is only one-quarter true. Only [[DESIGN-rdco]] has an
## Accessibilitysection. [[DESIGN-sanity-check]], [[DESIGN-mac]], [[DESIGN-squarely]] and DESIGN-scribble-works have none. Their contrast claims live as free-text annotations in the Notes column of the color table, and MAC's is wrong (below). - [[DESIGN-rdco]] already names this exact gap and defers it. Its "Validator hook" paragraph states token-pair contrast validation "is not yet automated - a Phase-5 enhancement is to extend the critic to read token pairs from a fixture and assert ratios."
- The verify stack already has a two-tier eval architecture that answers the extend-vs-sibling question. [[2026-05-20-verify-stack-two-gate-pass-fail-architecture]] separates the LLM-as-judge tier (the
verify-*family) from the code-based eval tier (audit-newsletter-outputs.py, 13 invariant checks, zero LLM calls). Contrast ratios and tag-tree counts are arithmetic, not judgment, so they belong in the second tier. - Adding a seventh critic is the move the audit evidence argues against. [[2026-07-03-verify-skills-pass-disagreement-audit]] found the family's real failure mode is defects landing before a critic exists, not critics disagreeing. [[2026-07-26-autoreview-skill-teardown-second-model-critic-design]] makes the same point from the other side: every RDCO critic reads the source, so more of them adds surface, not coverage.
What the web says
- The applicable-criteria set for a static PDF is small. W3C publishes 23 PDF-specific techniques (PDF1 through PDF23); roughly half are form-control techniques that are dead letters for a non-interactive document. The live ones for RDCO artifacts are PDF1 (Alt on images), PDF4 (Artifact tag for decorative images), PDF6 (Table/TH markup), PDF9 (heading tags), PDF16 (/Lang in the catalog), PDF18 (Title in the doc info dictionary), PDF2 (bookmarks) and PDF17 (consistent page numbering, which check 9 already covers as house style). Source: w3.org/WAI/WCAG22/Techniques/#pdf.
- The entire WCAG 2.2 delta is inapplicable to this surface. All nine new criteria are interaction criteria: 2.4.11 Focus Not Obscured (AA), 2.4.12 (AAA), 2.4.13 Focus Appearance (AAA), 2.5.7 Dragging Movements (AA), 2.5.8 Target Size Minimum (AA), 3.2.6 Consistent Help (A), 3.3.7 Redundant Entry (A), 3.3.8/3.3.9 Accessible Authentication. 4.1.1 Parsing was removed as obsolete. Source: w3.org/WAI/standards-guidelines/wcag/new-in-22/. Practical consequence: [[DESIGN-rdco]] citing "WCAG 2.1 AA" is stale-looking but substantively correct for a PDF, since 1.4.3, 1.4.11, 1.1.1 and 1.3.1 are identical across 2.1 and 2.2.
- Typst 0.14.2 ships a PDF/UA-1 export that hard-fails the build on exactly the gaps that matter. Verified locally, not read from docs:
typst compile --pdf-standard ua-1refuses to compile witherror: PDF/UA-1 error: missing alt textanderror: PDF/UA-1 error: missing document title. With#set document(title:)andalt:on the figure it compiles clean and emits/Alt,/Lang (en),/StructTreeRootand a Title entry. Typst is already the contract-grade RDCO PDF substrate per [[DESIGN-rdco]], and 0.14.2 is the installed version. - The legal driver is weaker than the craft driver. The European Accessibility Act microenterprise exemption (<10 employees, ≤€2M turnover) covers services including e-books, so a solo RDCO distributing MAC or Sanity Check almost certainly sits inside it today. Sources are compliance-vendor summaries, not the statute, so treat this as medium-low confidence and do not use it as a decision input on its own.
Convergences and contradictions
- Convergence. The synthesis scoped accessibility out in May, [[DESIGN-rdco]] deferred contrast validation to a "Phase 5," and the 12 checks contain no WCAG coverage. Three independent artifacts agree the gap is deliberate and unclosed. Nothing here is a surprise finding about the rubric; the finding is about what that gap has already let ship.
- Contradiction 1: the DESIGN-rdco Accessibility section is keyed to a retired palette. Its precomputed table uses
colors.surface= cream,colors.primary= terracotta,colors.secondary= lavender. Two sections above, the v2 Colors table definescolors.surface= sky#eaf2f8,colors.primary= sun#f0b820,colors.secondary= coral#e08570. Same token names, different hexes. Any skill resolving those tokens today gets the v2 values, so the callout token-contract silently changes meaning: rule 3 ("colors.primaryas a 3-4pt left rail ONLY") now specifies sun-on-sky at 1.60:1, against a 3:1 non-text minimum the same section declares four paragraphs earlier. - Contradiction 2: five of the seven precomputed ratios in that table are wrong even against the palette they describe. Recomputed from the hexes: ink/lavender is 11.56:1 not 12.8; terracotta/lavender is 3.80:1 not 2.6; ink/terracotta is 3.04:1 not 5.2. The third one matters most, because the doc reasons from its own wrong number ("only 5.2:1, just AA-normal but tight") to a correct conclusion. The guidance survived; the arithmetic did not. This is the strongest single argument that contrast belongs in code rather than in a prose contract.
Synthesis for RDCO
The gap is total, and it is five criteria wide, not "all of WCAG." Measured against the 12 checks, the genuine uncovered criteria are: 1.4.3 Contrast (Minimum, AA), 1.4.11 Non-text Contrast (AA), 1.1.1 Non-text Content (A), 1.3.1 Info and Relationships (A) covering heading hierarchy and table markup, and the two metadata criteria 2.4.2 Page Titled and 3.1.1 Language of Page. Three of the six things the question names are category errors and should be dropped rather than tracked. Focus order and keyboard navigation have no author-side surface in a static PDF; the reader application supplies keyboard access. The nuance worth one sentence: the sample PDFs do carry 2-8 /Link annotations each, which are focusable, so PDF3 (tab and reading order) is technically in scope, but both Chrome and Typst derive tab order from content order and there is nothing we are doing to break it. Screen-reader landmarks are an ARIA/HTML construct with no PDF analog; the correct PDF-side ask is a structure tree plus heading tags (PDF9) and bookmarks (PDF2), which is a different and much smaller request.
Four of the five real gaps are already failing on shipped artifacts, and I verified them by measurement rather than inference. The four v2 brand style guides in 02-sops/brand-style-guides/ are the live production case: 13-19 pages each, built by Typst 0.14.2, tagged, /Lang present. All four carry zero Title entries (2.4.2 fail, PDF18). The RDCO and Sanity Check guides carry 10 and 13 /Figure elements with zero /Alt (1.1.1 fail, PDF1, or PDF4 if those figures are decorative and should be Artifacts instead). All four carry 48-99 /Table elements with zero /TH (1.3.1 fail, PDF6). On the design samples, mac-sample.pdf has three /H2 and zero /H1, a heading tree that starts at level 2. On contrast, the MAC signature component fails outright: .test-row.fail is cream #F4F1EA on spray #FF3E2F at 11px mono, which computes to 3.11:1 against a 4.5:1 requirement, and it renders twice on page 1 of mac-sample.pdf. The current rubric passes that page cleanly, because check 4 counts four hues (within the ≤5 budget) and no check looks at foreground-background pairs at all. Two more contract-level contrast defects sit upstream of any render: [[DESIGN-mac]] documents colors.neutral #7A7A78 as "4.5+ AA on cream" when it is 3.81:1, and [[DESIGN-squarely]]'s marketing tiles put white numerals on gradients that compute to 1.38:1 to 3.91:1 at 14px bold (tile 3, the amber, is the worst at roughly 1.9:1 mid-gradient). [[DESIGN-rdco]]'s colors.neutral #5a6e82 on sky is 4.65:1, which passes AA but is documented as "6.6:1 AAA," a two-band overstatement on the token used for every byline and caption.
Recommendation: none of the three options as stated. Do a three-way split that puts each gap in the cheapest tier that can catch it. (1) Flip the Typst flag. Add --pdf-standard ua-1 plus #set document(title:) to the RDCO Typst templates. Verified working end-to-end on the installed 0.14.2: it hard-fails the build on missing alt text and missing title, and produces /Alt, /Lang (en) and a Title entry when satisfied. That converts 1.1.1, 2.4.2, 3.1.1 and the structure-tree half of 1.3.1 from "a critic might notice" to "the artifact cannot be produced." Zero LLM cost, zero false negatives, and it is the highest-leverage single change in this entire analysis. (2) Write a token-pair contrast validator, not a PDF critic. Every contrast failure above is decidable from the DESIGN.md hex tables before anything renders, and three of them are baked into the design contracts themselves, meaning the same defect will keep reappearing on web, video and app surfaces that a PDF critic never sees. A short script that parses the four color tables and asserts 4.5:1 / 3:1 catches all of them once, everywhere. It also mechanically retires the two contradictions above, since the wrong precomputed ratios and the retired-palette token collision both surface the moment the numbers are computed instead of typed. This is the code-based eval tier that [[2026-05-20-verify-stack-two-gate-pass-fail-architecture]] already defines. (3) Extend /verify-pdf-output by exactly two checks. Check 13, tag-tree sanity: /StructTreeRoot present, /Lang set, /Figure count equals /Alt count, no heading-level skip, tabular content carries /Table and /TH. Check 14, a rendered contrast spot check on the three lowest-contrast text-on-background pairs visible in the page PNGs. Both are cheap, both catch the residual the other two tiers structurally cannot see, such as a one-off Chrome render or type placed over a photograph.
Explicitly reject the sibling verify-accessibility skill, and explicitly reject scoping WCAG out. The sibling loses on arithmetic: five applicable criteria, three of them fully mechanizable at build time, would each get a full dispatch-preflight-verdict scaffold plus a seventh entry in a critic family whose documented failure mode is not "too few critics." It also has no growth path, because the whole WCAG 2.2 delta is inapplicable to this surface. Scoping out loses for a reason that is about positioning rather than law: the EAA microenterprise exemption probably covers RDCO today, so the honest driver is that RDCO sells mechanical rigor about data quality, and a lead magnet titled MODEL ACCEPTANCE CRITERIA whose own FAIL rows fail a mechanical criterion is a credibility problem before it is a compliance one. Confidence: high on the rubric gap, the contrast arithmetic and the tag-tree measurements, all of which are computed or measured and reproducible from the commands in Sources. Medium on whether the design samples represent current output, since they are May 2026 Chrome renders that predate the Typst migration; the style guides are the better evidence and they are also May 2026. Low on the legal read, which came from vendor summaries rather than the statute, and unverified on whether the Squarely iOS app itself shares the tile-numeral contrast problem, since I checked only the marketing HTML and not the Swift source.
Why this is in the vault
This resolves the open "Phase-5 enhancement" that [[DESIGN-rdco]] left dangling in its Validator hook paragraph, and it converts a vague "extend or sibling or skip" backlog item into a three-part build spec with a verified one-flag fix at the front. It also corrects two live defects in [[DESIGN-rdco]] (retired-palette token collision, five wrong precomputed ratios) and one in [[DESIGN-mac]] (colors.neutral documented as AA when it is 3.81:1), each of which is currently being read as authoritative by every design skill that consults those contracts.
Open follow-ups
- Does PDF/UA-1 conformance actually get a static document to WCAG 2.2 AA, or is there a residual delta? The recommendation above leans on the Typst
--pdf-standard ua-1flag, and PDF/UA (ISO 14289) tests structure, not perception. Contrast in particular is almost certainly outside what the flag can check, which is why the token validator is a separate tier. The ISO 14289 to WCAG mapping and the Matterhorn Protocol checkpoints would settle exactly which criteria the flag does and does not close, and therefore whether "flag plus validator" is a complete AA story or a partial one. - Read Directive (EU) 2019/882 directly on whether the microenterprise exemption reaches a US solo operator selling a PDF info-product to EU buyers. The current read is from compliance-vendor summaries and is flagged low confidence in this brief. It is a primary-source question with a freely available statute, and it changes whether accessibility is a craft choice or an obligation for MAC and Sanity Check.
- Unverified and left open: whether the Squarely iOS app's in-game tile numerals share the marketing-surface contrast problem. The Swift
TileColorssource settles it directly; this is a lookup, not research.
Related
- [[DESIGN-rdco]]
- [[DESIGN-mac]]
- [[DESIGN-squarely]]
- [[DESIGN-sanity-check]]
- [[2026-05-20-verify-stack-two-gate-pass-fail-architecture]]
- [[2026-07-03-verify-skills-pass-disagreement-audit]]
- [[2026-07-26-autoreview-skill-teardown-second-model-critic-design]]
Sources
Local primary (read verbatim):
~/.claude/skills/verify-pdf-output/SKILL.md- all 12 checks enumerated~/rdco-vault/02-sops/DESIGN-rdco.md(Colors + Accessibility + Format-specific templates)~/rdco-vault/02-sops/DESIGN-sanity-check.md,DESIGN-mac.md,DESIGN-squarely.md(Colors tables; no Accessibility sections present)~/.claude/state/pdf-quality-bar-synthesis.mdline 237 (the original out-of-scope decision)~/rdco-vault/02-sops/2026-05-20-verify-stack-two-gate-pass-fail-architecture.md
Artifacts measured:
~/rdco-vault/02-sops/design-samples/{rdco,sanity-check,mac,squarely}-sample.{html,pdf}~/rdco-vault/02-sops/brand-style-guides/{rdco,sanity-check,mac,squarely}-brand-style-guide-v2.pdf- Method:
pdfinfofor Title/Tagged/Producer; byte-count of/StructTreeRoot,/Lang,/Alt,/Figure,/H1,/H2,/Table,/TH,/Artifactin the raw PDF;pdftoppm -r 100page render for visual confirmation of the MAC test rows; WCAG 2.x relative-luminance formula applied to the DESIGN.md hex tokens for every ratio quoted. - Toolchain check:
typst 0.14.2,typst compile --pdf-standard ua-1run against a minimal fixture both with and without alt text and document title.
Web:
- https://www.w3.org/WAI/WCAG22/Techniques/#pdf (PDF1-PDF23 technique list)
- https://www.w3.org/WAI/standards-guidelines/wcag/new-in-22/ (nine new criteria, levels, 4.1.1 removal)
- EAA microenterprise-exemption scope: compliance-vendor summaries (levelaccess.com, webyes.com, barrierenlos.com) - secondary sources, flagged medium-low confidence, statute not read