06-reference/research

wcag gaps verify pdf output

2026-09-03·research-brief·source: deep-research·by Ray Data Co (deep-research synthesis)
accessibilitywcagverify-stackdesign-contractspdf-pipeline

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)

What the web says

Convergences and contradictions

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

Related

Sources

Local primary (read verbatim):

Artifacts measured:

Web: