Reference
WCAG 2.2 coverage
All 86 success criteria, and how the SDK decides each one. This is a standing position rather than the result of a run: where no rule can decide, it says why, and what would have to change.
Show
How it’s decided
86 of 86 criteria shown
Both filters scope the tiles and the table below. AAA criteria are only assessed when a run sets wcag: 'AAA'.
Every criterion
| Criterion | Level | How it’s decided | Why, and the rules behind it |
|---|---|---|---|
| 1 · Perceivable | |||
| 1.1.1Non-text Content | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: aria-meter-name, aria-progressbar-name, image-alt, input-image-alt, object-alt, role-img-alt, svg-img-alt |
| 1.2.1Audio-only and Video-only (Prerecorded) | Level A | Presence, not adequacy | Because we can see whether a media element has an alternative at all, and never whether the alternative conveys what the media conveys. It would change if transcription and a comparison of the transcript against the alternative became reliable enough to assert on.Rules behind it: setsquare-captions, audio-caption |
| 1.2.2Captions (Prerecorded) | Level A | Presence, not adequacy | Because a caption track either exists or it does not, which is checkable; whether the captions are accurate, synchronised and complete is not. It would change if speech recognition could be trusted to judge a caption track against its audio.Rules behind it: setsquare-captions, video-caption |
| 1.2.3Audio Description or Media Alternative (Prerecorded) | Level A | Presence, not adequacy | Because the criterion is met by an audio description or by a text alternative for the whole video, and the only trace either leaves in markup is a `<track kind="descriptions">` — which the W3C lists as an advisory technique for this criterion, recording that no major browser voices it natively, so its presence is reported as a question and never as a pass. A second audio track, a described version, narration in the soundtrack, and a transcript linked beside the video all conform with nothing a check can identify without reading the page's language; so does a video whose audio already conveys everything important, and one that is itself a labelled media alternative for text. Whether an alternative that IS provided describes what happens on screen is a judgement about content. It would change if a browser shipped native support for description tracks, which would make a present track a mechanism that reaches users; or video understanding could compare a description against the scene it describes.Rules behind it: setsquare-audio-description-or-media-alternative |
| 1.2.4Captions (Live) | Level AA | No rule can decide | Because the criterion is about captions on LIVE audio, and nothing in a page distinguishes a live stream from a recording — a `<video>` playing HLS and one playing a file are the same markup. Whether captions on a live broadcast keep up with it, and are accurate, is a judgement about something that has not happened yet when a page is scanned. It would change if a page declared its media as live, which no markup does; a suite that knows its own content is live can say so through `setsquare.covers()`.Rules behind it: setsquare-captions-aa |
| 1.2.5Audio Description (Prerecorded) | Level AA | Presence, not adequacy | Because we can see whether a video carries a `<track kind="descriptions">`, and that is the only audio-description mechanism with anything in the markup to find. Its absence proves little: the criterion is equally met by a second user-selectable audio track, by a separate described version, or by narration in the soundtrack itself, and needs no description at all where the audio already conveys everything important in the video. Its presence proves little too: the W3C lists the track element as an advisory technique for this criterion rather than a sufficient one, and records that no major browser voices such a track natively, so it counts only where a player script synthesises it — which markup does not show. Both states are reported as questions, never as a pass. Whether a description that IS provided conveys what happens on screen is a judgement about content. It would change if a browser shipped native support for description tracks; or audio and video analysis could agree on whether a description fits the gaps in the soundtrack, which is the same problem 1.2.7 has one level up.Rules behind it: setsquare-audio-description |
| 1.2.6Sign Language (Prerecorded) | Level AAA | No rule can decide | Because deciding that a video IS sign language, and of which language, needs to watch it. It would change if sign-language recognition became reliable, which is an active research area.Rules behind it: setsquare-captions-aaa |
| 1.2.7Extended Audio Description (Prerecorded) | Level AAA | No rule can decide | Because the criterion applies only "where pauses in foreground audio are insufficient to allow audio descriptions to convey the sense of the video", which is a judgement about the soundtrack that nothing in markup answers. Its one sufficient technique is a movie with extended descriptions built in; the track element appears under its ADVISORY techniques, so even finding one would not establish the criterion. It would change if audio analysis could measure whether the pauses in a soundtrack are long enough to carry the description the video needs, which is the question the criterion is defined by.Rules behind it: setsquare-captions-aaa |
| 1.2.8Media Alternative (Prerecorded) | Level AAA | No rule can decide | Because the sufficient technique is a link to an alternative placed next to the media, and which link on a page IS that alternative is a judgement about its text — in whatever language the page is written. A transcript, an alternative version and a marketing page look the same to a rule, and whether the alternative is EQUIVALENT to the media is a second judgement on top of the first. It would change if a page could declare which link is the alternative for a given media element, which no markup provides; a suite that tests its own transcript link can say so through `setsquare.covers()`.Rules behind it: setsquare-captions-aaa |
| 1.2.9Audio-only (Live) | Level AAA | No rule can decide | Because the criterion is about LIVE audio-only content, and a page does not say whether its media is live — an `<audio>` element streaming now and one playing a recording are the same markup. Whether an alternative presents EQUIVALENT information is a judgement on top of that. It would change if a page declared its media as live, which no markup does; a suite that knows its own content is live can say so through `setsquare.covers()`.Rules behind it: setsquare-captions-aaa |
| 1.3.1Info and Relationships | Level A | Presence, not adequacy | Because Whether markup carries the structure a page shows is checkable where the element is already there — a list built of the wrong children, a table with no header cells, text painted as a heading over a block of prose. Whether a visual grouping NEEDED an element it does not have is not: a border, a gap and a shared background are a section to a reader and nothing at all to a parser, and no rule can tell an intentional grouping from a decorative one.. It would change if A layout model that reported perceived grouping rather than boxes — something like an accessibility tree for visual structure. Until then the covered half grows one shape at a time: `setsquare-visual-headings` added the styled-heading case, and a styled list and a styled table are the two obvious next ones..Rules behind it: setsquare-visual-headings, aria-hidden-body, aria-required-children, aria-required-parent, definition-list, dlitem, list, listitem, p-as-heading, table-fake-caption, td-has-header, td-headers-attr, th-has-data-cells |
| 1.3.2Meaningful Sequence | Level A | One way to fail | Because the heuristic finds content whose visual order diverges from its DOM order — a CSS `order` or a reversed container — and that is one way to break a reading sequence. Finding none is not evidence that the DOM order IS the meaningful one, and whether the sequence affects meaning at all is a judgement about the content. It would change if a reading order could be derived from rendered geometry and compared against the DOM order for every block rather than only where CSS moved one, which is the same layout model 1.3.1 is waiting on.Rules behind it: setsquare-meaningful-sequence |
| 1.3.3Sensory Characteristics | Level A | One way to fail | Because the heuristic finds instructions that name a shape, a size or a position and nothing else — "the button on the right". Finding none means no sentence matched that pattern, and whether an instruction can be followed WITHOUT seeing the layout is a judgement about what the sentence relies on, which only a reader of it can make. It would change if the phrase list stopped being a list — an instruction is sensory because of what it relies on rather than which words it uses, and only a reader of the sentence knows that.Rules behind it: setsquare-sensory-characteristics |
| 1.3.4Orientation | Level AA | One way to fail | Because the rule implements F97 the way its ACT rule states it — orientation restricted using CSS transforms — and that is one way to lock a page. A page with no such rule may still lock itself with `screen.orientation.lock()`, with a viewport restriction, or with F100’s "please rotate your device" message, none of which is in the stylesheets it reads. It would change if the Screen Orientation API were instrumented the way `checks/listeners.ts` instruments event handlers, which would reach the script half; F100 is a sentence on the screen and stays a judgement.Rules behind it: css-orientation-lock |
| 1.3.5Identify Input Purpose | Level AA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: autocomplete-valid |
| 1.3.6Identify Purpose | Level AAA | Presence, not adequacy | Because the criterion asks that the purpose of user interface COMPONENTS, ICONS and REGIONS all be programmatically determinable, and only the last has a sufficient technique a page can write today — ARIA11, landmarks. The other two rest on the WAI-Adapt vocabulary, which nothing implements — so what an icon REPRESENTS is a judgement about a picture rather than anything a page states, and a pass on the landmarks is never the criterion. It would change if the WAI-Adapt vocabulary shipped in browsers and assistive technology, at which point the purpose of a component and of an icon would be readable from the page rather than being a judgement about what a picture means.Rules behind it: setsquare-identify-purpose |
| 1.4.1Use of Color | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: link-in-text-block |
| 1.4.2Audio Control | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: no-autoplay-audio |
| 1.4.3Contrast (Minimum) | Level AA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: color-contrast |
| 1.4.4Resize Text | Level AA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: meta-viewport |
| 1.4.5Images of Text | Level AA | No rule can decide | Because finding text inside an image needs OCR, and then deciding whether that text is essential to the image — a logo, a diagram label — is a judgement OCR cannot make. It would change if OCR were paired with a defensible rule for what counts as essential; the first half is available today and the second is the reason this has not been built. |
| 1.4.6Contrast (Enhanced) | Level AAA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: color-contrast-enhanced |
| 1.4.7Low or No Background Audio | Level AAA | No rule can decide | Because separating foreground speech from background audio needs to analyse the audio. It would change if audio source separation ran cheaply enough to be part of a test run. |
| 1.4.8Visual Presentation | Level AAA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-visual-presentation |
| 1.4.9Images of Text (No Exception) | Level AAA | No rule can decide | Because finding text inside an image needs OCR, and at AAA almost no image of text is permitted at all — so the judgement becomes whether the image is one of the narrow exceptions. It would change if OCR were paired with a defensible rule for what counts as essential. |
| 1.4.10Reflow | Level AA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-reflow |
| 1.4.11Non-text Contrast | Level AA | Presence, not adequacy | Because the criterion asks about "visual information required to identify user interface components and states" and about "parts of graphics required to understand the content", and REQUIRED is a judgement in both. What a rule can measure is a control’s own border and fill against the colour behind it, and only where the SC’s Boundaries paragraph makes that the identification — a control with a label needs no contrasting boundary at all. A graphic’s contrast, and which of its parts carry the meaning, are not measured. It would change if the parts of a graphic that carry its meaning could be told from its decoration, which is the same problem as describing an image; the STATES half would move sooner, since a suite that drives a control through its states already produces the scans to compare.Rules behind it: setsquare-non-text-contrast |
| 1.4.12Text Spacing | Level AA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-text-spacing, avoid-inline-spacing |
| 1.4.13Content on Hover or Focus | Level AA | One way to fail | Because the check hovers what the markup says is a trigger — an `aria-describedby`, an `aria-haspopup`, an `aria-expanded` with `aria-controls` — and a tooltip built from a bare mouseover handler declares none of that, so finding no misbehaving trigger is not evidence there is none. Each of the three conditions also has an escape that is a judgement: content communicating an input error need not be dismissible, the hoverable condition applies only where hover is what triggers the content, and persistent is met where the information is no longer valid. It would change if a trigger could be recognised by BEHAVIOUR rather than by markup — hovering every element and watching for content to appear, which is a cost per element rather than per declared trigger and would need a budget nobody has measured yet.Rules behind it: setsquare-hover-content |
| 2 · Operable | |||
| 2.1.1Keyboard | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: frame-focusable-content, scrollable-region-focusable, server-side-image-map |
| 2.1.2No Keyboard Trap | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-keyboard-trap |
| 2.1.3Keyboard (No Exception) | Level AAA | One way to fail | Because the rule that passes this criterion asks one question — can a scrollable region be reached by sequential focus — and clearing it says nothing about the rest of a page’s functionality. Our own check looks for the other failure mode, path-dependent input, and whether a function REQUIRES that path is a judgement; so is whether a separate keyboard mode of operation exists elsewhere in the application, which the criterion’s own Note says is enough to meet it. It would change if every function of a page could be enumerated and operated from the keyboard, which is what the criterion asks and what no scanner attempts; the path-dependent half narrows as the listener instrumentation improves, and the separate-keyboard-mode half does not.Rules behind it: setsquare-keyboard-no-exception, scrollable-region-focusable |
| 2.1.4Character Key Shortcuts | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-key-shortcuts |
| 2.2.1Timing Adjustable | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: meta-refresh |
| 2.2.2Pause, Stop, Hide | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: blink, marquee |
| 2.2.3No Timing | Level AAA | No rule can decide | Because proving that no part of a page has a time limit means proving a negative about behaviour nobody triggered. It would change if a suite declared which of its tests exercise timed content — which is what `setsquare.covers()` is for. |
| 2.2.4Interruptions | Level AAA | One way to fail | Because the two failures the criterion documents are both meta refresh, and a rule decides those — but finding no meta refresh is not evidence that a user can postpone or suppress what this page does. Every sufficient technique is a mechanism whose purpose a rule cannot read, and the exception is a judgement by definition: an emergency is "a sudden, unexpected situation... that requires immediate action to preserve health, safety, or property", which nothing can decide about a given interruption. It would change if a region that updates itself without being asked could be told from a status message that reports what the user just did — the same object, distinguished only by what prompted it. Not built: on the only real target available the candidate population is ZERO live regions across 133 scans, and a threshold chosen rather than measured has been wrong every time this repository has tried one.Rules behind it: meta-refresh-no-exceptions |
| 2.2.5Re-authenticating | Level AAA | One way to fail | Because the check compares the form on both sides of the re-authentication a test drives, and a field that did not come back with its value is one way to fail "without loss of data". Finding none is not the criterion: an activity also lives in a store, a server-side draft and the step of a wizard, none of which is in the form. Nor is finding one a failure — a CSRF token and a one-time code SHOULD be discarded, and G181, a sufficient technique, carries the data through as HIDDEN fields this check deliberately does not read. Whether the activity can continue is a judgement about what those fields were for. It would change if an application could state which of its state belongs to the activity being continued, which nothing in a document does — the form is the part that is legible from outside.Rules behind it: setsquare-reauthentication |
| 2.2.6Timeouts | Level AAA | No rule can decide | Because it needs a timeout to exist and a warning about it, and a page declares neither. How long a session lasts is a server’s judgement about risk and nothing on the page states it. It would change if a suite declared a test that waits out a timeout, which is what `setsquare.covers()` is for; a page could also state its own timeout, and none does. |
| 2.3.1Three Flashes or Below Threshold | Level A | No rule can decide | Because counting flashes means analysing rendered frames for luminance change over area and time. It would change if frame capture and analysis became affordable in a test run; the algorithm is published and is not the obstacle. |
| 2.3.2Three Flashes | Level AAA | No rule can decide | Because counting flashes means analysing rendered frames for luminance change over area and time, and at AAA there is no exception for a small area. It would change if frame capture and analysis became affordable in a test run. |
| 2.3.3Animation from Interactions | Level AAA | No rule can decide | Because deciding that an animation is decorative rather than essential is a judgement about what the animation is for. It would change if nothing plausible; whether motion is essential is a question about intent, though a suite can declare it with `setsquare.covers()`. |
| 2.4.1Bypass Blocks | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: bypass |
| 2.4.2Page Titled | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: document-title |
| 2.4.3Focus Order | Level A | One way to fail | Because the check watches which way focus travels through the document as Tab is pressed, and the criterion asks for an order that "preserves meaning and operability" — which is a judgement about the content, and F44’s failure is a reordering that does NOT preserve them rather than a reordering. Two things it does not see: a step between two children of one ARIA composite, because a toolbar or a radiogroup owns its own order and moves it with arrow keys; and a page whose focus order matches its document while CSS has moved the content, since the order a reader experiences is the visual one and comparing against it needs the layout model 1.3.1 and 1.3.2 are both waiting on. It would change if a reading order could be derived from rendered geometry and compared against the focus order, which is the same layout model those two criteria are waiting on; F85 — a dialog or menu not adjacent to its trigger in the sequence — is nearer, since the walk already holds the positions and `checks/hover-content.ts` already resolves the relationships.Rules behind it: setsquare-focus-order |
| 2.4.4Link Purpose (In Context) | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: area-alt, link-name |
| 2.4.5Multiple Ways | Level AA | Compared across pages | Worked out after the run by comparing surfaces. A one-page run reports it as untested. |
| 2.4.6Headings and Labels | Level AA | One way to fail | Because the heuristic finds headings and labels that are generic or repeated — "More", "Details", the same label twice. Finding none is not evidence that the rest DESCRIBE their topic or purpose, which is a judgement about whether the words match the content under them. It would change if a heading could be compared against the content it introduces, which is a question about meaning rather than markup.Rules behind it: setsquare-headings-and-labels |
| 2.4.7Focus Visible | Level AA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-focus-visible |
| 2.4.8Location | Level AAA | One way to fail | Because the heuristic finds a navigation carrying none of the four techniques the SC names — no breadcrumb, no current-page cue, no site map, no rel link. Finding one of them says the mechanism is on the page and nothing more — whether it tells a user where they are is a judgement about whether its label names this location. It would change if the cue could be checked against the page it appears on rather than counted, which is a judgement about whether a label names this location.Rules behind it: setsquare-location |
| 2.4.9Link Purpose (Link Only) | Level AAA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-link-purpose, identical-links-same-purpose |
| 2.4.10Section Headings | Level AAA | One way to fail | Because the heuristic finds a run of prose with no heading over it and no `aria-label`, past a character margin that is ours rather than the SC's. Finding none is not evidence the page is organised by headings — a page of short labelled groups is in scope and well under any prose margin, and whether a portion of content is the "self-contained portion" the SC names is a judgement about what the page is about. It would change if sections could be identified by what they are ABOUT rather than by length, which is the same perceived-grouping problem 1.3.1 records.Rules behind it: setsquare-section-headings |
| 2.4.11Focus Not Obscured (Minimum) | Level AA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-focus-obscured |
| 2.4.12Focus Not Obscured (Enhanced) | Level AAA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-focus-obscured-enhanced |
| 2.4.13Focus Appearance | Level AAA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-focus-appearance |
| 2.5.1Pointer Gestures | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-pointer-gestures |
| 2.5.2Pointer Cancellation | Level A | One way to fail | Because the check finds one way of failing — a down-event handler with no up-event handler on the same target — and a page where every press has a release has told us only that. Whether a down handler executes part of the function, whether an undo exists elsewhere, and whether completing on the down-event is essential are all judgements the SC turns on, and a registered listener shows none of them. It would change if a handler could be told from its own source to execute part of a function rather than paint a pressed state, which is reading intent out of code; on a page whose events are delegated to a framework root the rows cannot be attributed to a control at all.Rules behind it: setsquare-pointer-cancellation |
| 2.5.3Label in Name | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: label-content-name-mismatch |
| 2.5.4Motion Actuation | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-motion-actuation |
| 2.5.5Target Size (Enhanced) | Level AAA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-target-size-aaa, setsquare-target-size-delegated, setsquare-target-size-revealed |
| 2.5.6Concurrent Input Mechanisms | Level AAA | No rule can decide | Because this needs two real input devices used at once, which a browser cannot simulate. It would change if a driver could present touch and pointer simultaneously as real devices. |
| 2.5.7Dragging Movements | Level AA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-dragging-movements |
| 2.5.8Target Size (Minimum) | Level AA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: target-size |
| 3 · Understandable | |||
| 3.1.1Language of Page | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: html-has-lang, html-lang-valid, html-xml-lang-mismatch |
| 3.1.2Language of Parts | Level AA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: valid-lang |
| 3.1.3Unusual Words | Level AAA | No rule can decide | Because an unusual word is unusual RELATIVE TO AN AUDIENCE, and no tool knows who is reading. It would change if nothing plausible; the criterion is defined against a readership the page does not declare. |
| 3.1.4Abbreviations | Level AAA | One way to fail | Because the heuristic finds unexpanded all-caps tokens with no glossary on the page. Finding none is not evidence every abbreviation is expanded: an abbreviation that is not all caps is invisible to it, and whether a token IS an abbreviation rather than a word is a judgement about language that capitalisation only approximates. It would change if abbreviation detection stopped resting on capitalisation, which needs a lexicon rather than a pattern.Rules behind it: setsquare-abbreviations |
| 3.1.5Reading Level | Level AAA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-reading-level |
| 3.1.6Pronunciation | Level AAA | No rule can decide | Because knowing that a word needs a pronunciation guide means knowing that it is ambiguous to the reader in this context. It would change if nothing plausible; the same audience problem as 3.1.3. |
| 3.2.1On Focus | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-on-focus |
| 3.2.2On Input | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-on-input |
| 3.2.3Consistent Navigation | Level AA | Compared across pages | Worked out after the run by comparing surfaces. A one-page run reports it as untested. |
| 3.2.4Consistent Identification | Level AA | Compared across pages | Worked out after the run by comparing surfaces. A one-page run reports it as untested. |
| 3.2.5Change on Request | Level AAA | One way to fail | Because the focus walk sees a change of context it did not ask for, which is one way to fail — and finding none says only that MOVING FOCUS changed nothing. A timer, a scroll, a response arriving, a click we never made: all are changes of context and none is in this walk. The criterion is also met outright if a mechanism is available to turn such changes off, and whether a preference somewhere in the product is that mechanism is a judgement nothing on the page can settle. It would change if the walk grew a second half that waited on a page doing nothing, which would reach the automatic-update failures (F61) it cannot see today; the turn-it-off half would still need a person, or a suite declaring it through `setsquare.covers()`.Rules behind it: setsquare-change-on-request, meta-refresh-no-exceptions |
| 3.2.6Consistent Help | Level A | Compared across pages | Worked out after the run by comparing surfaces. A one-page run reports it as untested. |
| 3.3.1Error Identification | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-status-messages |
| 3.3.2Labels or Instructions | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: form-field-multiple-labels |
| 3.3.3Error Suggestion | Level AA | Presence, not adequacy | Because we can see that a field in an error state has text associated with it, which is what `setsquare-error-suggestion` reports. Whether that text SUGGESTS a correction rather than merely naming the error — "enter a valid date" against "use DD/MM/YYYY" — is a judgement about the sentence. So are both of the criterion’s escapes: suggestions are required only where they are KNOWN, and not at all where providing them would jeopardize the security or purpose of the content. It would change if a language model were trusted to grade the helpfulness of an error message, which is a judgement we would rather report than assert.Rules behind it: setsquare-error-suggestion |
| 3.3.4Error Prevention (Legal, Financial, Data) | Level AA | Presence, not adequacy | Because the criterion is met by any ONE of three escapes and only the third leaves anything in a page. Reversible is a property of what happens after the submission, which no document states; Checked is about a submission that FAILS validation, which is a different test. So where a test drives a submission we look for the third — "a mechanism... for reviewing, confirming, and correcting information before finalizing", all three verbs — and finding none is not a failure, because either of the other two would meet it with nothing here to find. Which submissions the criterion even applies to is a judgement about what the application does. It would change if a submission could state that it is reversible, which nothing in a document does; the Checked escape would need a test that submits data the form rejects.Rules behind it: setsquare-error-prevention-legal |
| 3.3.5Help | Level AAA | Presence, not adequacy | Because we can see that a help mechanism exists — help text associated with the field, or a help link on the page, which is the SC’s own sufficient technique G71. Whether that help is CONTEXT-SENSITIVE, which is what the criterion asks, is a judgement about whether the words answer the question this field is asking. The SC’s own Note goes further — "clear labels can act as context-sensitive help" — so a field with no mechanism at all may still meet it, which is why the check asks rather than fails. It would change if a reader of the help text and the field it describes could be replaced by a rule, which is the same problem as grading an error message under 3.3.3.Rules behind it: setsquare-context-help |
| 3.3.6Error Prevention (All) | Level AAA | Presence, not adequacy | Because the same three escapes as 3.3.4 over every submission, and the same one of them is observable: a review step that presents the entered values back, leaves them editable and offers something to finalise with. What limits it is the DENOMINATOR — we can only measure submissions a test actually drove, because submitting every form on an application is not something this package will ever do, and a figure over a population we did not reach is a number nobody measured. Whether a submission that shows nothing back is reversible instead is a judgement about what happens after it. It would change if nothing plausible for the other two escapes; the population would widen if a suite drove more of its own submissions, which is what `setsquare.acrossSubmission()` counts.Rules behind it: setsquare-error-prevention-all |
| 3.3.7Redundant Entry | Level A | One way to fail | Because the check reads one page and finds the same `autocomplete` token asked for twice, which is one way to fail — and a process runs across steps, so finding none on a page proves nothing about what step one asked and step three asks again. Even within a page the criterion is met if the second field is auto-populated or the information is available to select, which is a judgement about what is on the screen, and it is excepted where re-entry is essential or required for security. It would change if a suite declared the steps of a process — which is what `setsquare.covers()` and the run envelope’s per-test surfaces make possible, since every scan already carries the `testId` that groups them.Rules behind it: setsquare-redundant-entry |
| 3.3.8Accessible Authentication (Minimum) | Level AA | Presence, not adequacy | Because we can see one cognitive function test — a password field — and whether the step also offers an ALTERNATIVE that is not a cognitive function test is a judgement about what a control does. A "Sign in with…" button, a hardware key, a link sent by email: nothing in the markup says which of those authenticates and which is a link to a marketing page. The other tests the criterion names — a puzzle, a maths question, a transcription task — are not detected at all. It would change if an authentication step could be identified as a step, rather than as a form that happens to hold a password field, which is what `setsquare.covers()` and a declared flow would give us.Rules behind it: setsquare-authentication-minimum |
| 3.3.9Accessible Authentication (Enhanced) | Level AAA | Presence, not adequacy | Because this is 3.3.8 without the object-recognition and personal-content exceptions, so the two criteria differ only where an authentication step uses a CAPTCHA — which is the one thing the check does not detect. Its rows are therefore the same evidence read twice, and whether the step offers an alternative remains a judgement about what a control does. It would change if a cognitive function test other than a password could be recognised — an image-selection CAPTCHA has no markup that distinguishes it from any other grid of buttons.Rules behind it: setsquare-authentication-enhanced |
| 4 · Robust | |||
| 4.1.2Name, Role, Value | Level A | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: area-alt, aria-allowed-attr, aria-braille-equivalent, aria-command-name, aria-conditional-attr, aria-deprecated-role, aria-hidden-body, aria-hidden-focus, aria-input-field-name, aria-prohibited-attr, aria-required-attr, aria-roledescription, aria-roles, aria-tab-name, aria-toggle-field-name, aria-tooltip-name, aria-valid-attr, aria-valid-attr-value, button-name, duplicate-id-aria, frame-title, frame-title-unique, input-button-name, input-image-alt, label, link-name, nested-interactive, select-name, summary-name |
| 4.1.3Status Messages | Level AA | A rule decides | Rules decide a pass or a failure on every surface.Rules behind it: setsquare-status-messages |