The formula
A page starts at 100. Every failing element deducts points according to how badly it hurts someone, and the deduction for any single rule is capped.
pageScore = clamp(0, 100,
100 − Σ weight(impact) × min(failingElements, 10)
rules
)
siteScore = mean(pageScore) // every page counts the sameWhy the cap exists
One broken template can produce four hundred identical failures — a product grid where every link has no accessible name, say. Without a cap, that page scores zero, and so does the page after you fix half of them. A score that cannot move is a score nobody checks.
Capping the deduction at 10 elements per rule keeps the number responsive to progress. The full count is always shown next to it, so nothing is hidden — the cap changes the score, not the report.
What the number is not
It is not a conformance percentage, and 100 does not mean compliant. It means no automated rule failed on the pages we could read. Automated checks cover roughly a third of WCAG; the rest — focus order, whether alt text is meaningful, whether a custom widget behaves like the pattern it imitates — needs a person.
Every criterion page says whether an automated rule covers it. Where none does, we say so rather than leaving a gap you might read as a pass. See what automated testing can and cannot find.
What runs, exactly
Grades
A grade is shorthand for a conversation with a client, nothing more. A 95 and a 96 are the same site.
We run this on ourselves
Every build of this site is scanned by the same engine, and the build fails if anything serious appears. The first time we ran it we found thirteen contrast failures on our own home page, which is a good argument for continuous scanning and a poor one for trusting a design review.