CometWebResearch pack

WCAG 2.1: criteria counts and an axe-core scan

Maciej Zmitrukiewicz · Research pack

This is the material behind the article WCAG 2.1 explained: principles, AA and 2.2 changes. In September 2026 I made three small measurements: I counted the success criteria in each WCAG version, compared the Polish accessibility act with WCAG 2.1, and ran an automated scan on ten pages of my own site. None of them assesses whether a website conforms to WCAG, mine included. The Polish version of this note is metodologia.md.

Criteria per version and level

A script downloads the three W3C Recommendations (/TR/WCAG20/, /TR/WCAG21/ and /TR/WCAG22/) and pulls out every success criterion with its level. Those addresses always serve the newest edition of a version, which for WCAG 2.1 was the 2025 edition, and the W3C says later editions keep the same criteria. I counted 4.1.1 Parsing as removed in WCAG 2.2, because the spec marks it "Obsolete and removed" there.

VersionAAAAAATotalA + AAGuidelines
2.0251323613812
2.1302028785013
2.2312431865513

From 2.0 to 2.1, 17 criteria were added (5 A, 7 AA, 5 AAA), with nothing removed and no level changed. From 2.1 to 2.2, 9 were added (2 A, 4 AA, 3 AAA) and 4.1.1 was removed, again with no level changes. In the current WCAG 2.1 edition 4.1.1 is still Level A, with a note that it "should be considered as always satisfied" for HTML or XML content.

The annex to the Polish act

A second script reads the Polish digital accessibility act of 2019 (Dz.U. 2019 poz. 848) from eli.gov.pl and compares the criteria in its annex with the 50 WCAG 2.1 A and AA criteria. The annex lists 49 of them (30 A, 19 AA), with no level that differs. The one missing is 1.2.4 Captions (Live). That fits Article 3(2)(1), which excludes live-broadcast multimedia from the act, although the act itself gives no reason for leaving the criterion out.

The axe-core scan of ten pages

I ran axe-core in a clean Chromium on ten pages of cometweb.io: /, /pl, /pricing, /insight/accessibility, /tools/contrast, /pl/tools/a11y-checklist, /contact, /blog/accessibility-audit-wcag-eaa, /pl/blog/audyt-dostepnosci-wcag-eaa and /pl/glossary/wcag. That covers one page of each template, both homepages and two language pairs. The window was 1280 × 800 with reduced motion, and the cookie banner stayed as a first-time visitor sees it. I limited axe to the WCAG 2.1 A and AA rules, and its experimental rules stayed off, as they are by default.

Each of the 50 WCAG 2.1 A and AA criteria then got one outcome, starting with the most severe:

OutcomeWhat it meansCriteria
Violationa rule for this criterion failed on at least one page1
Needs reviewa rule couldn't decide on at least one page3
Rules passedthe rules ran on real content and found nothing11
Nothing to testa rule exists, but the pages had no video, audio, meta refresh or blinking content for it4
Experimental rule onlyonly an experimental axe rule covers this criterion3
No ruleno axe-core rule covers this criterion28

When axe links a rule to a criterion, the rule tests part of that criterion. So "rules passed" means the automated part found nothing on these ten pages. For example, image-alt checks that an image has alternative text, and whether that text is right is for you to judge.

What the scan found on my site

What this data can't tell you

Files

To run it again: python3 count_criteria.py and python3 count_annex_pl.py need only Python. For the scan, copy criteria.csv and run_axe_scan.mjs into an empty folder, run npm i playwright@1.62.1 axe-core@4.13.0, npx playwright install chromium and node run_axe_scan.mjs. The counts should match while the W3C documents stay the same, and the scan will differ as my pages change.

Back to the article