What 2.4.2 requires
Web pages have titles that describe topic or purpose.
A title lets people know where they are without reading the page: in a row of tabs, in history and bookmarks, in a list of search results, and when a screen reader opens the page. It describes the topic or the purpose; the name of a document or an application is enough when that is what the page is.
Each page needs its own. When a single-page application changes the view, Understanding 2.4.2 says the title should change with it.
A title that does not identify the contents of the page is WCAG failure F25. A missing title is a failure too, and that one a rule can find.
Common failures
Under each example: what axe-core and Rampa reported on the markup before the fix, in a run with Gemma 4 12B on 8 October 2026.
A title left from the template
Starter templates come with a title of their own. Every view of the app then has the same tab name, and it says nothing about any of them.
Before, fails 2.4.2
<title>Vite + React + TS</title>
…
<h1>Your orders</h1>
<p>Orders placed in the last 12 months.</p>After, passes
<title>Your orders | Aurora Roasters</title>- axe-core
Passes:
document-titlefinds a title that is not empty.- Rampa
✗ html The page title "Vite + React + TS" names a different topic than the page. Evidence: "Vite + React + TS" Patch: - <title>Vite + React + TS</title> + <title>Your Orders</title> confidence high · 1/1 runs · evidence verified · id 95c905ad780c
A title copied from another page
The recipe was made from a copy of the espresso guide and kept its title. The tab, the bookmark and the search result all say “Espresso guide” over a cold brew recipe.
Before, fails 2.4.2
<title>Espresso guide | Aurora Roasters</title>
…
<h1>Cold brew at home</h1>After, passes
<title>Cold brew at home | Aurora Roasters</title>- axe-core
Passes:
document-titlefinds a title that is not empty.- Rampa
✗ html The page title "Espresso guide | Aurora Roasters" names a different topic than the page. Evidence: "Espresso guide | Aurora Roasters" Patch: - <title>Espresso guide | Aurora Roasters</title> + <title>Cold Brew at Home | Aurora Roasters</title> confidence high · 1/1 runs · evidence verified · id f3f67548ff6c
A file name as the title
Some editors and exports put the file name in the title when nobody writes one. “contact.html” tells a person nothing they can use.
Before, fails 2.4.2
<title>contact.html</title>
…
<h1>Contact us</h1>After, passes
<title>Contact us | Aurora Roasters</title>- axe-core
Passes:
document-titlefinds a title that is not empty.- Rampa
✗ html The page title "contact.html" is a file name or an address, not a topic. Evidence: "contact.html" Patch: - <title>contact.html</title> + <title>Contact Us</title> confidence high · 1/1 runs · evidence verified · id 76188c25046bHere the suggestion left out the site name. A suggested title is for a person to fit to the site’s own pattern.
What axe-core checks
axe-core 4.14.0 maps one rule to 2.4.2: document-title, which fails a page with no <title> or an empty one. Rampa reports that failure as it is, and then there is nothing for the model to judge.
| Rule | What it checks | Mapped to | In a Rampa run |
|---|---|---|---|
document-title, rule page at Deque University | Documents must have <title> element to aid in navigation | 2.4.2 | runs |
The rule does not read the title. “Untitled document”, “Vite + React + TS” and the title of another page all pass.
Each rule links to its page at Deque University, which makes axe-core.
What Rampa judges, and how
What goes to the model
The page, once: when its title is not empty and document-title did not fail it.
What the model sees
- The title, as the browser reads it.
- The page’s address: host and path, or the file name.
- Up to eight visible headings.
- The first 700 characters of the page’s text.
- The page language, for the suggestion.
What it must answer
A verdict, the title copied as evidence, the problem (generic, a file name or address, or a different subject than the page), a suggested title under 70 characters in the page’s language, and a confidence.
What drops a claim
- The evidence is not the current title: the same words, trimmed a little at most.
- A pass names a problem, or a fail names none.
- A fail has no suggested title, one over 140 characters, or one equal to the current title.
The patch
The suggested title replaces the text of <title>.
For every criterion
- Page content reaches the model marked as data, and the prompt tells it to ignore any instruction inside.
- Answers are cached by a hash of the prompt, the image, the model and its settings, so the same input never calls a model twice.
--runs 3asks three times and keeps the majority; when runs disagree, confidence drops. Findings below--min-confidence(medium by default) are hidden, and--verboselists them.- Claims dropped by verification are counted in every report, never shown as findings.
How Rampa was measured on it
| Set | Tests | Cases | axe-core, precision / recall | Rampa, precision / recall / F1 |
|---|---|---|---|---|
| 2.4.2, page has a title (ACT 2779a5) | syntax | 12 | 1.00 / 1.00 | 0.50 / 1.00 / 0.67 |
| 2.4.2, title describes the page (ACT c4a8a4) | meaning | 6 | not defined, nothing flagged / 0.00 | 1.00 / 1.00 / 1.00 |
Corrupted pairs: Rampa told 3 of 3 apart (page title), axe-core 0. A pair is a passing test page and a copy broken on purpose; a checker that gives both the same verdict is not judging.
Run on 9 October 2026: axe-core 4.14.0, Gemma 4 12B on a local GPU, reasoning off, one run, ACT test cases a9a1483e. Small samples and one run: read the numbers as a working pipeline, not as a result.
Read with these caveats
- The prompts and the context for 2.4.2, 2.4.4 and 2.4.6 were adjusted after reading this run’s errors, without copying the test pages into the prompts. They need fresh pages before the numbers mean more than “the pipeline works”.
- The low precision on 2779a5 is scoring, not judgment. That rule only checks that a title exists, and its passing pages are titled “Title of the page.” and “This page has a title”; Rampa says those describe nothing, which is right for 2.4.2.
Limitations
- It judges the title the page has when it loads. In a single-page app, point it at the address of each view.
- It reads up to eight headings and the first 700 characters of text, so a title that matches content further down is judged without it.
- It judges one page at a time and does not compare titles across a site.
- Only web pages: a snapshot from an app has no page title to judge.
Questions about 2.4.2
Does a site name alone pass 2.4.2?
On the home page it can. On any other page, a title with only the site name does not tell that page apart from the rest. A common pattern is the page’s topic first, then the site: “Contact us | Aurora Roasters”.
Does axe-core check that a title is descriptive?
No. Its document-title rule checks that a non-empty title exists, and Lighthouse reports the same check as “Document has a <title> element”. WAVE adds a word check that flags a title beginning with “untitled”. None of them compares the title with the page.
What about single-page apps?
The title should change with the view, as Understanding 2.4.2 says. Rampa checks the title a page has when it loads, so run it on the address of each view.
Check your pages
Rampa is not on npm yet. Clone it and run it from source with Node.js 22.12 or newer and Chrome or Edge. --criteria 2.4.2 judges only this criterion; leave it out to run the eight that run by default.
With Ollama running, Rampa picks a local model by itself; node dist/cli.mjs doctor says what is missing.
git clone https://github.com/guilhermebsantiago/rampa-cli.git
cd rampa-cli
pnpm install && pnpm build
node dist/cli.mjs check https://example.com --criteria 2.4.2Checked against rampa-cli (commit 0459809) and the W3C sources on 9 October 2026.