What Level AA actually means
WCAG is organised in three levels. A is the floor, AA is the level European procurement and EN 301 549 work from, and AAA is a target nobody is required to reach across a whole site. When a tender asks for “WCAG 2.2 AA”, it means every A and AA success criterion, on every page in scope, in every state that a user can reach.
Success criteria are testable statements, not techniques. “Contrast (minimum)” does not tell you which token to change; it tells you the measured ratio a piece of text has to clear. That distinction matters in an audit: a finding is defensible when it names the criterion, the element and the measurement, not when it names a tool.
A site does not pass or fail as a whole. Conformance is claimed per page, and a single non-conforming element on a page removes the claim for that page. This is why continuous monitoring beats a one-off audit: a theme update can undo a claim for a hundred pages at once.
The nine criteria WCAG 2.2 added
Six of them sit at A or AA, so they are in scope for an EN 301 549 assessment. The last column says whether a scanner can judge it or a person has to.
| SC | Name | Level | How it is tested |
|---|---|---|---|
| 2.4.11 | Focus not obscured (minimum) | AA | manual |
| 2.4.12 | Focus not obscured (enhanced) | AAA | manual |
| 2.4.13 | Focus appearance | AAA | manual |
| 2.5.7 | Dragging movements | AA | manual |
| 2.5.8 | Target size (minimum) | AA | automated |
| 3.2.6 | Consistent help | A | manual |
| 3.3.7 | Redundant entry | A | manual |
| 3.3.8 | Accessible authentication (minimum) | AA | partly automated |
| 3.3.9 | Accessible authentication (enhanced) | AAA | manual |
What the scanner checks, rule by rule
Every automated rule carries both references, so one finding reads as a WCAG success criterion for the developer and an EN 301 549 clause for the reviewer. These are the rules seeded in the public mapping table; the catalogue in the product is larger and is maintained centrally.74 rules seeded
| Rule | What it detects | WCAG | EN 301 549 | Typical impact |
|---|---|---|---|---|
| accesskeys | Two elements claim the same access key | 2.1.1 | 9.2.1.1 | serious |
| area-alt | Image map region without alternative text | 1.1.1, 2.4.4, 4.1.2 | 9.1.1.1, 9.2.4.4, 9.4.1.2 | critical |
| aria-allowed-attr | ARIA attribute not allowed on this role | 4.1.2 | 9.4.1.2 | critical |
| aria-command-name | Custom button, link or menu item without a name | 4.1.2 | 9.4.1.2 | serious |
| aria-hidden-body | Whole document hidden from assistive technology | 4.1.2 | 9.4.1.2 | critical |
| aria-hidden-focus | Focusable element hidden from assistive technology | 1.3.1, 4.1.2 | 9.1.3.1, 9.4.1.2 | serious |
| aria-input-field-name | Custom input field without an accessible name | 4.1.2 | 9.4.1.2 | serious |
| aria-meter-name | Meter without an accessible name | 1.1.1 | 9.1.1.1 | serious |
| aria-progressbar-name | Progress indicator without an accessible name | 1.1.1 | 9.1.1.1 | serious |
| aria-required-attr | ARIA role missing a required attribute | 4.1.2 | 9.4.1.2 | critical |
| aria-required-children | Composite role without its required child roles | 1.3.1 | 9.1.3.1 | critical |
| aria-required-parent | ARIA role placed outside its required container | 1.3.1 | 9.1.3.1 | critical |
| aria-roles | Role value is not a recognised ARIA role | 4.1.2 | 9.4.1.2 | critical |
| aria-toggle-field-name | Checkbox, radio or switch without an accessible name | 4.1.2 | 9.4.1.2 | serious |
| aria-tooltip-name | Tooltip role without any text | 4.1.2 | 9.4.1.2 | serious |
| aria-valid-attr | Attribute name is not a valid ARIA attribute | 4.1.2 | 9.4.1.2 | critical |
| aria-valid-attr-value | ARIA attribute points at a value that does not resolve | 4.1.2 | 9.4.1.2 | critical |
| audio-caption | Audio without a captions or transcript track | 1.2.1 | 9.1.2.1 | critical |
| autocomplete-valid | autocomplete value not recognised | 1.3.5 | 9.1.3.5 | serious |
| avoid-inline-spacing | Text spacing locked by an inline style | 1.4.12 | 9.1.4.12 | serious |
| blink | Blinking content that cannot be stopped | 2.2.2 | 9.2.2.2 | serious |
| button-name | Button without an accessible name | 4.1.2 | 9.4.1.2 | critical |
| bypass | No way to skip the repeated navigation | 2.4.1 | 9.2.4.1 | serious |
| color-contrast | Text contrast below the required ratio | 1.4.3 | 9.1.4.3 | serious |
| css-orientation-lock | Content locked to one screen orientation | 1.3.4 | 9.1.3.4 | serious |
| definition-list | Definition list built from the wrong children | 1.3.1 | 9.1.3.1 | serious |
| dlitem | Definition term or description outside a list | 1.3.1 | 9.1.3.1 | serious |
| document-title | Page has no title | 2.4.2 | 9.2.4.2 | serious |
| duplicate-id-active | Duplicate id on an interactive element | 4.1.1 | 9.4.1.1 | serious |
| empty-heading | Heading with no text | 1.3.1 | 9.1.3.1 | minor |
| empty-table-header | Table header cell with no text | 1.3.1 | 9.1.3.1 | minor |
| focus-order-semantics | Focusable element with no interactive role | 2.4.3 | 9.2.4.3 | minor |
| form-field-multiple-labels | Field bound to more than one label | 3.3.2 | 9.3.3.2 | moderate |
| frame-title | Frame without a title | 2.4.1, 4.1.2 | 9.2.4.1, 9.4.1.2 | serious |
| heading-order | Heading level skipped | 1.3.1 | 9.1.3.1 | moderate |
| html-has-lang | Page language not declared | 3.1.1 | 9.3.1.1 | serious |
| html-lang-valid | Page language code is not valid | 3.1.1 | 9.3.1.1 | serious |
| html-xml-lang-mismatch | lang and xml:lang disagree | 3.1.1 | 9.3.1.1 | moderate |
| identical-links-same-purpose | Links with the same text lead somewhere different | 2.4.9 | 9.2.4.9 | minor |
| image-alt | Image without a text alternative | 1.1.1 | 9.1.1.1 | critical |
| input-button-name | Input button with no value or label | 4.1.2 | 9.4.1.2 | critical |
| input-image-alt | Image button without alternative text | 1.1.1, 4.1.2 | 9.1.1.1, 9.4.1.2 | critical |
| label | Form field without a programmatic label | 1.3.1, 4.1.2 | 9.1.3.1, 9.4.1.2 | critical |
| landmark-banner-is-top-level | Banner landmark nested inside another region | 1.3.1 | 9.1.3.1 | moderate |
| landmark-complementary-is-top-level | Complementary landmark nested inside another region | 1.3.1 | 9.1.3.1 | moderate |
| landmark-no-duplicate-main | More than one main landmark on the page | 1.3.1 | 9.1.3.1 | moderate |
| landmark-one-main | Page has no single main landmark | 1.3.1, 2.4.1 | 9.1.3.1, 9.2.4.1 | moderate |
| landmark-unique | Two landmarks share a role and a name | 1.3.1 | 9.1.3.1 | moderate |
| link-name | Link without discernible text | 2.4.4, 4.1.2 | 9.2.4.4, 9.4.1.2 | serious |
| list | List contains elements that are not list items | 1.3.1 | 9.1.3.1 | moderate |
| listitem | List item outside a list | 1.3.1 | 9.1.3.1 | serious |
| marquee | Scrolling marquee content | 2.2.2 | 9.2.2.2 | serious |
| meta-viewport | Zoom disabled by the viewport meta tag | 1.4.4 | 9.1.4.4 | serious |
| nested-interactive | Interactive control nested inside another | 4.1.2 | 9.4.1.2 | serious |
| no-autoplay-audio | Audio starts on its own for more than three seconds | 1.4.2 | 9.1.4.2 | moderate |
| object-alt | Embedded object without a text alternative | 1.1.1 | 9.1.1.1 | serious |
| p-as-heading | Paragraph styled to look like a heading | 1.3.1 | 9.1.3.1 | serious |
| page-has-heading-one | Page has no level one heading | 1.3.1 | 9.1.3.1 | moderate |
| presentation-role-conflict | Presentation role cancelled by other markup | 4.1.2 | 9.4.1.2 | minor |
| region | Content sits outside any landmark | 1.3.1 | 9.1.3.1 | moderate |
| role-img-alt | Element with role img has no alternative text | 1.1.1 | 9.1.1.1 | serious |
| scrollable-region-focusable | Scrollable area cannot be reached by keyboard | 2.1.1 | 9.2.1.1 | serious |
| select-name | Select element without an accessible name | 1.3.1, 4.1.2 | 9.1.3.1, 9.4.1.2 | critical |
| server-side-image-map | Server-side image map in use | 2.1.1 | 9.2.1.1 | minor |
| summary-name | Disclosure summary without a name | 4.1.2 | 9.4.1.2 | serious |
| svg-img-alt | Meaningful SVG without a text alternative | 1.1.1 | 9.1.1.1 | serious |
| tabindex | Positive tabindex overrides the natural focus order | 2.4.3 | 9.2.4.3 | serious |
| table-fake-caption | Table title styled as a caption instead of marked as one | 1.3.1 | 9.1.3.1 | serious |
| target-size | Touch target smaller than 24 by 24 pixels | 2.5.8 | 9.2.5.8 | moderate |
| td-has-header | Data cell in a large table has no header | 1.3.1 | 9.1.3.1 | serious |
| td-headers-attr | Data cell not associated with a header | 1.3.1 | 9.1.3.1 | serious |
| th-has-data-cells | Table header with no data cells attached | 1.3.1 | 9.1.3.1 | serious |
| valid-lang | Language of a passage is not a valid code | 3.1.2 | 9.3.1.2 | serious |
| video-caption | Video without a captions track | 1.2.2 | 9.1.2.2 | critical |
What automation can and cannot see
Every score in Conforma carries the same sentence, because the number is only part of the picture. Automated rules are excellent at measurable properties and blind to intent.
Automated testing covers a subset of accessibility barriers. Manual verification is required for a complete assessment.
How Conforma tests WCAG 2.2 AA
- Automated rules run on every page of a scan, and each violation is written as a finding with the rule, the selector, the HTML snippet and a screenshot of the element in place.
- Every finding carries both references: the WCAG success criterion and the EN 301 549 clause, so a report reads the same way to a developer and to a procurement reviewer.
- Findings are fingerprinted from rule, selector and path. A fix that comes back after a deploy is reported as a regression instead of quietly counted as new work.
- The manual checklist covers what rules cannot judge, with video evidence, the assistive technology used and a named tester, and it is sealed into the same evidence pack as the automated run.
Questions we get on this
Is WCAG 2.2 AA the same as meeting the Accessibility Act?
No. The European Accessibility Act is the law, EN 301 549 is the harmonised standard used to demonstrate it, and EN 301 549 references WCAG 2.2 Level AA for web content. Meeting AA is the technical basis for a declaration, not a certificate.
Do we have to move from 2.1 to 2.2 now?
The safe answer is yes for anything new. WCAG 2.2 is backwards compatible: content that meets 2.2 also meets 2.1, so testing against the newer version costs nothing and covers both.
Does a perfect automated score mean the site conforms?
It means no automated violation was detected on the pages scanned. Keyboard operation, focus order and screen reader flow still need a person before any claim is made.