Our coverage of the W3C ACT Rules
The ACT Rules are the W3C's shared, testable definitions of accessibility checks, so that different tools can be compared on the same terms. This page says which of them Markproof actually implements, which it partly covers, and which it cannot cover — with the reason. Checked on 18 October 2026 against their published list; if they add rules, this page is out of date until we update it.
Why publish this at all: a tool that will not tell you its gaps is asking you to guess. The gaps below are the ones we know about, and some of them are permanent, because they need a browser or a person rather than a parser.
Implemented
| ACT rule | Our check | Note |
|---|---|---|
| Image has non-empty accessible name | img_missing_alt | An image with no accessible name: we accept alt, aria-label, aria-labelledby or title, in that order of precedence. We do not evaluate whether the name is good; that needs a person. |
| Button has non-empty accessible name | button_empty_name | Includes buttons whose only content is an image with no alt text. |
| Link has non-empty accessible name | link_empty_name | Includes icon links and links whose only content is an unnamed image. |
| Form field has non-empty accessible name | input_missing_label | Labels, wrapped labels, aria-label and aria-labelledby are all accepted; hidden and submit inputs are left alone. |
HTML page has lang attribute | html_missing_lang | We check that it is present, not that the language tag is valid; that is their next rule. |
| Meta viewport allows for zoom | zoom_blocked | Flags user-scalable=no and maximum-scale values that block zoom. |
| HTML page has non-empty title | missing_page_title | We check presence and emptiness, not whether the title describes the page. |
Element with aria-hidden has no content in sequential focus navigation | aria_hidden_focusable | A link or button inside aria-hidden="true" without tabindex="-1" is reachable by keyboard and invisible to a screen reader at the same time. |
Partly covered
| ACT rule | What we do | What we do not do |
|---|---|---|
| Heading has non-empty accessible name | heading_empty flags headings with no text at all. | Headings whose only content is an image or an ARIA reference: we do not compute an accessible name for every heading, only check for emptiness. |
| Iframe element has non-empty accessible name | iframe_missing_title accepts title, aria-label or aria-labelledby. | Whether the name describes the frame's content. |
| Link is descriptive | generic_link_text flags "click here" and its cousins; img_alt_filename and img_alt_generic flag alt text that is a file name or a placeholder. | Whether a link's wording is genuinely descriptive in context. That is a judgement, and ours is a list of known-bad phrasings rather than an opinion. |
| Table header cell has assigned cells | table_missing_header flags a table with no header cells at all, unless it declares role="presentation". | The headers attribute relationships and whether each header's scope covers the right cells. |
Not covered, and why
| ACT rules | Why not |
|---|---|
| The contrast rules: Text has minimum contrast, Text has enhanced contrast, and the letter, word and line spacing rules | They need computed styles from a rendered page. A parser reading HTML cannot know what colour anything ends up. |
| The media rules: transcripts, captions, audio description, autoplay control | They need the media itself, not the markup. autoplay_media flags the attribute, which is not the same thing as measuring what plays. |
| The keyboard and focus rules: keyboard traps, visible focus, focus order, scrollable content reachable by focus | They need a rendered, interactive page. |
| The ARIA consistency rules: valid attribute values, required states and properties, permitted roles, required owned elements | We check a few of these indirectly (a label pointing at a missing id), but we do not validate ARIA against the specification. Doing it properly means shipping a copy of the ARIA vocabulary and keeping it current. |
| The descriptive-name rules: whether an image's alternative is descriptive, whether a form field's label is descriptive, whether a page title is descriptive | These are judgements about meaning. We say plainly that we cannot make them. |
| Structure rules that need the whole page or the site: bypass blocks, landmarks for the main content, repeated content | Partly measurable from one page, but the answer depends on the template and on what repeats across the site, which one page cannot tell us. |
Rules of ours that are not ACT rules
Some of what we check has no ACT rule, usually because it is a convention rather than a conformance
requirement: heading levels that skip (heading_order), positive tabindex
(positive_tabindex), duplicate id attributes (duplicate_ids), links that
open a new window without warning (link_new_window), links built out of JavaScript
(link_javascript_href), interactive elements nested inside one another
(nested_interactive), label references that point at nothing
(aria_reference_missing), and the obsolete scrolling element
(obsolete_element).
How we would prove any of this
Every finding quotes the exact markup, so each one can be checked by hand in seconds. The rules themselves are
tested by two fixtures in the source: a page with twenty-two planted problems that must all be found, and a
page that is correct in the ways that tempt a rule to invent a finding — a decorative image, a layout table the
author declared presentational, a frame named with aria-label, inert template content — which must
produce nothing at all. The second fixture matters more than the first: a wrong finding wastes somebody's
afternoon and teaches them to distrust everything else.