
Categories
- Visual communication: text, space, and graphical encoding make content relationships and priorities clearly distinguishable.
- Information and findability: relevant content and predictable structure help people understand the topic, find information and make decisions.
- Functional and interaction support: the website provides the functions required by the target task and supports their use through understandable, operable, and recoverable flows.
- Inclusion and adaptation: core information and functions have accessible and adaptable paths across abilities, assistive technologies, input methods, and stated supported device environments.
- Visual expression: typography, imagery, color, and components form an intentional visual language suited to the site’s purpose.
- Transparency and agency: make important claims, commitments, and data uses inspectable, with understandable choices and ways to change them.
v0.10 · 6 domains · 31 construct families · 85 principles · 211 checks written as 533 runnable rules. Since v0.9 we removed the 11 checks that needed a user study and 17 rules that scored personal taste; the taste rules now sit under Measured, not scored at the end of the page. Three principles lost their only checks and were removed: 1.1.1 Character legibility, 2.2.2 Understandable terminology and 2.4.3 Predictable categorization. The per-domain coverage lines below still show v0.9 counts. We have scored 0 website outputs and run 0 calibration studies so far.
Rules by method: Programmatic 224; Scripted test 145; LLM 51; VLM 30; LLM vs. spec 28; axe 21; LLM vs. brief 16; Programmatic + pixel sampling 14; Model (UMSI++) 2; axe + pixel sampling 1; textstat 1. Programmatic rules run on Playwright renders at 320, 390 and 1440 px (DOM, computed styles, bounding boxes, accessibility tree, screenshots). VLM rules are the fallback when no measurement captures the judgment: a vision-language model judges screenshots against the stated decision rule. LLM vs. brief and LLM vs. spec rules compare the page against a supplied reference.
Pass ranges come from the cited source where it gives one. 93 rules use a number marked "project default, calibrate" or N (calibrate): treat those as starting points to set against designer ratings. WCAG and design-system requirements go straight from Pass to Error; source recommendations score Warning. A rule that builds on a house rule (T-, L-, C-, W-, I-) adapts it from the ‣ page to this check's scope.
Each domain splits into construct families. Under each family, a principle line says what the design should do; the checks beneath it test that principle. A split check lists its sub-rules (C016.1, C016.2 …); each sub-rule scores on its own. Only rules get scored; a principle adds no score of its own. Not applicable and Insufficient evidence stay separate outcomes from Pass and Error.
1. Visual communication
Text, space, and graphical encoding make content relationships and priorities clearly distinguishable. Coverage: 14 Full / 7 Partial / 0 Not operationalized across 21 principles.
1.1 Reading and typographic roles
1.1.2 Reading rhythm · Partial coverage: Set line length, leading and paragraph breaks so readers can follow continuous text from line to line and paragraph to paragraph.
- C004 · Paragraph boundary recognition · split into 2 rules
- C004.2 · No false paragraph breaks · Programmatic · Butterick, key rules
- Does the layout imply paragraph starts that do not exist? Within each body paragraph at 320, 390 and 1440 px, count br elements, inline-block or floated children, and margin changes that open a vertical gap ≥ the measured paragraph gap from C004.1, plus single-line orphan blocks split from their paragraph at narrow widths. Count per page.
- Pass: 0 false breaks · Warning: 1–2 false breaks · Error: 3+ false breaks, or any paragraph split so a continuation line reads as a new paragraph
- C004.3 · Paragraph count readback · VLM · Butterick, key rules
- Can a reader count the paragraphs from the picture alone? The VLM counts paragraph starts in a screenshot of each body passage at 390 and 1440 px without DOM access, and the check compares the count with the number of intended paragraphs in the DOM (p elements or declared blocks). Passages of 2+ paragraphs count.
- Pass: VLM count equals DOM count for every passage · Error: any passage where the counts differ
1.1.3 Role differentiation · Full coverage: Give headings, body text and supporting text visual treatments that readers can tell apart.
- C005 · Heading versus body differentiation · split into 3 rules
- C005.1 · Heading cue strength · Programmatic · Butterick, Headings
- Does each heading differ from its adjacent body text by at least one visible cue? For every h1–h6 or role=heading and the first body paragraph after it at 320, 390 and 1440 px, compare computed font-size ratio, font-weight delta, font-family, text-transform or font-variant, and color ΔE2000. A cue counts when size ratio ≥1.15 (project default, calibrate), weight delta ≥200 (project default, calibrate), family differs, caps or small caps apply, or color ΔE2000 ≥10 (project default, calibrate).
- Pass: every heading has ≥1 cue, and ≥2 cues when size ratio <1.15 (project default, calibrate) · Warning: 1 heading with exactly 1 weak cue (color only) · Error: any heading with 0 cues, or 2+ headings with color as the only cue
- C005.2 · Heading not below body · Programmatic · Butterick, Headings · builds on T-04
- Is any heading rendered smaller than the body text it introduces? Compare computed font-size of each h1–h6 with the body paragraph that follows at 320, 390 and 1440 px.
- Pass: no heading smaller than adjacent body · Warning: 1 heading equal in size to body with 2+ other cues · Error: any heading smaller than adjacent body, or 2+ equal with 1 cue
- C005.3 · Space above heading · Programmatic · Butterick, Headings · builds on L-01
- Does each heading sit closer to the text it introduces than to the text before it? Measure the gap above and below each h2–h6 that has text on both sides at 1440 px and count headings where gap below ≥ gap above.
- Pass: 0 headings · Warning: 1–2 headings · Error: 3+ headings
- C006 · Supporting text differentiation · split into 3 rules
- C006.1 · Supporting text demoted · Programmatic · Butterick, Headings
- Does supporting text look subordinate to the text it qualifies? Supporting text = elements referenced by aria-describedby, figcaption, small, footnotes, form hint or help text; its primary = the matching label, control, figure heading or paragraph. At 320, 390 and 1440 px compare font-size, font-weight and color ΔE2000 against the page body text color. Demoting cue: size ≤0.9× primary, weight ≤ primary minus 100, or muted color ΔE2000 ≥10 from body text (project default, calibrate). Promoting cue: size >primary, weight > primary, or a heading-style tuple from C007.
- Pass: every supporting text has ≥1 demoting cue and 0 promoting cues · Warning: 1–2 supporting texts with 0 cues either way · Error: any supporting text with a promoting cue, or 3+ with 0 cues
- C006.2 · Muted text still legible · axe · WCAG 2.2 SC 1.4.3 · builds on C-01
- Does supporting text that is muted for hierarchy still meet contrast? Run axe color-contrast on every supporting text element identified in C006.1 at 390 and 1440 px.
- Pass: all ≥4.5:1, or ≥3:1 at ≥24 px or ≥18.66 px bold · Error: any below
- C006.3 · Supporting role readback · VLM · Butterick, Headings
- Would a reader mistake a hint for the instruction? For each supporting text and primary pair from C006.1, the VLM sees a cropped screenshot at 390 px and names which line is the main instruction or title. Only pairs flagged with 0 cues or a promoting cue in C006.1 count.
- Pass: VLM names the primary text in every pair · Error: any pair where the VLM names the supporting text