The <html> element carries a lang attribute.
a11y-html-langEvery score comes from these rules, not from a language model. The same page always produces the same number.
Each rule declares a maximum penalty and whether it applies to the page being audited. A category’s score is:
100 × (1 − penalties incurred / penalties possible on this page)
Normalising over applicable rules is what stops a nearly empty page scoring well for the checks it never triggered — a page with no images gets no credit for “all images have alt text”. The overall score is the mean of the active category scores.
5 of the 27 rules need the page to be rendered in a real browser. Where no browser is available they are skipped entirely — they neither pass nor fail, and the report says so.
Whether the page can be used by someone relying on a screen reader, a keyboard, or zoom.
a11y-html-langa11y-page-titlea11y-viewporta11y-image-alta11y-main-landmarka11y-h1a11y-form-labelsa11y-button-namea11y-link-texta11y-skip-linka11y-positive-tabindexa11y-iframe-titlevisual-contrastvisual-font-sizevisual-touch-targetsWhether the page's structure lets someone scan it and find what they came for.
hier-heading-orderhier-heading-densityhier-landmarkshier-inline-stylesvisual-horizontal-scrollWhether the page says what it is, and whether a visitor can tell what to do next.
clarity-meta-descriptionclarity-title-qualityclarity-call-to-actionclarity-social-previewclarity-content-depthclarity-faviconvisual-above-foldA separate, optional layer sends the rendered screenshot and the page copy to Claude. It writes the summary and adds observations a rule engine cannot make — whether a headline says anything, whether the primary action looks primary. Every AI observation must quote the page or it is discarded before reaching the report.
It never touches the score. The number is produced by the rules above before the model is called, and an audit run with the AI layer disabled returns exactly the same score.