Skip to main content
Real web · Before and after · Re‑verified live

Measured on the real web, not on fixtures.

From 2026-09-15 to 2026-09-16 we put the scanner through a controlled audit: 56 real websites, 5 pages each, scanned through production before and after a round of accuracy fixes. Then we went back to every finding the fixes removed and checked it on the live page. This is what we found, including the parts that did not flatter us.

Findings

928

from 926 · 0%

Duplicate rows

0

from 0 · the same defect, reported once

Findings with no rule id

0

from 0 · every row is filterable

September 2026 field audit III · 50 of 56 sites comparable (2 blocked the scanner in both runs, 4 changed reachability between runs) · builds ee7f57b115e5b2 · ran 2026-09-15 to 2026-09-16

Engine by engine

Rule-class counts are a poor scoreboard for an accuracy fix, because a fix that gives a row an id it previously lacked moves that row between classes without removing anything. Engine totals cannot be moved by relabelling.

SourceBeforeAfterChange
arc-style114119+5
axe-core225237+12
ibm-equal-access219198−21
lighthouse22220
pa11y113121+8
In-house analyzers, reported through the same field
focus-graph21−1
form-behavior110
keyboard-nav-tester220
mobile-accessibility228227−1

Did the fixes remove anything real?

Fewer findings proves nothing on its own. Every occurrence present in the first run and absent from the second - 1,176 of them - was re-measured on the live page with a method independent of the scanner: a verifier that shares no code with the scanner. Names, roles and hidden-ness come from Chromium's own accessibility tree over the DevTools protocol; contrast from rendered pixels, the glyphs isolated by screenshotting the text and then the same box with the text made transparent; id references by token lookup in the element's own root; focusability by calling focus() and reading the active element. Each occurrence keeps the scanner's page preparation (1920x1080, light theme, reduced motion, the scroll primer). Every occurrence the comparison counted has a row here: target-size occurrences, which the verifier hands to a separate mobile pass, are counted as indeterminate rather than dropped. rakuten.co.jp and stanford.edu lost three pages each to task timeouts while running side by side and were scanned once more alone; those runs are the ones compared. The bias runs toward reporting a lost true positive, not toward excusing the removal.

1,176 removed occurrences
Correctly removed42
Still counted, just not listed31
Same element, listed under another row123
Re-bucketed under another rule5
Genuinely lost13
Removed by a documented policy12
Indeterminate (dynamic pages)includes 19 not explained950
861 newly reported AA failures
Justified - the verifier confirms the failure on the live page232
Borderline - at exactly the 24px threshold0
Manufactured by the fixes42
Indeterminate (dynamic pages)587

The 13 genuinely lost occurrences are on six sites: hespress.com's consent widget (four icon-only buttons whose visible Material-icon ligature the verifier reads as a label, and a tabbable span), a skip link on one gitlab.com page, an unnamed svg each on linear.app and lit.dev's playground, a 'Like post' button on framer.com whose visible count is not in its name, and a skipped heading level and a tabbable div on theverge.com. Each is filed as an open defect against the after-build, not fixed before this page was published. The 19 unexplained rows are occurrences the reconciliation could not resolve on the live page hours later (usa.gov, gitlab.com, theverge.com and four others) and are shown inside Indeterminate; they are not evidence either way. The indeterminate rows are pages the other run did not analyse, target-size occurrences (judged by a separate mobile pass this census does not fold in), dynamic content whose selectors no longer resolve, and rows inside consent or ad vendors' frames.

Removed by a documented policy, 12 occurrences. PR #12's D78: brooklinen.com opens Attentive's SMS signup about twenty seconds after load, moves focus into its iframe and sets aria-hidden on the navigation, the nano-bar and main. The second run audited the rewards page in that state and reported the page's own chrome as focusable-but-hidden; the scanner now refuses the overlay's host, so those rows are gone. The verifier does not block it, still meets the popup, and keeps the literal reading, so these rows are neither counted as correctly removed nor as lost.

Where the removals came from

Only the classes the fixes touched. Everything else moved with the web, not with the scanner, and is not attributed.

Rule classBeforeAfterWhat changed
ibm-text_contrast_sufficient2824the same locator for IBM's XPaths
ibm-aria_id_unique41locations inside shadow roots resolve; a collapsed trigger's aria-controls is verified, not shipped on the engine's word
ibm-svg_graphics_labelled1512an svg inside a named control in a shadow root is contradicted
aria-hidden-focus54the same overlays and ad frames
ibm-element_tabbable_role_valid2928tiles an overlay had hidden are reported again
frame-title33ad frames that never load carry no untitled iframe
color-contrast1719a location that matches several elements is measured on the one it names or not at all
ibm-aria_hidden_nontabbable1013ad players and timed marketing overlays no longer load for the engines; rows inside them are gone, rows the overlay hid are back

Every site

Scores moved on 21 of 50 sites: 12 up, 9 down. A score can fall because the report got more accurate - when two engines' reports of one defect merge into a single row, the row keeps the higher severity.

SiteFindings beforeAfterScore
theverge.com302365 → 58
sanook.com363146 → 48
usa.gov8489 → 100
linear.app272468 → 71
hespress.com222065 → 63
n26.com11963 → 63
u-tokyo.ac.jp242273 → 79
bombas.com242349 → 50
djangoproject.com131263 → 63
about.gitlab.com282764 → 64
lit.dev181763 → 63
ryanair.com212056 → 56
userway.org111083 → 88
designsystem.digital.gov7689 → 89
australia.gov.au141471 → 71
bbc.com6651 → 51
getbootstrap.com292954 → 60
cam.ac.uk141465 → 62
carbondesignsystem.com181879 → 79
coolblue.nl212151 → 52
framer.com333348 → 49
ghost.org212157 → 57
github.com121283 → 83
gov.pl131370 → 70
gov.sg101085 → 85
government.nl3389 → 89
news.ycombinator.com151551 → 51
harvard.edu7779 → 79
kubernetes.io191968 → 68
service-manual.nhs.uk44100 → 100
nhs.uk33100 → 100
docs.python.org212170 → 70
rakuten.co.jp353548 → 48
skynewsarabia.com121273 → 73
telekom.de303049 → 50
webflow.com202055 → 55
who.int8887 → 87
wise.com252566 → 66
wix.com212163 → 63
corriere.it313250 → 46
meta.discourse.org293052 → 53
ethz.ch111279 → 79
hubspot.com192079 → 79
stanford.edu91089 → 74
en.wikipedia.org313259 → 53
stripe.com242663 → 59
berkshirehathaway.com91286 → 82
daum.net293456 → 63
openstreetmap.org192459 → 59
brooklinen.com213473 → 61

What this page does not claim

  • Not "0% fewer false positives." Findings fell by that much. Not every removed finding was false, and the census above is the only honest breakdown we have.
  • Not a false-positive rate. Producing one requires re-verifying every finding that remains, on the live page. We re-verified what changed. A single percentage would be more quotable and less true.
  • Not deterministic. Live sites ship new markup, rotate carousels and block scanners between runs. 2 sites were unreachable in both runs and are excluded; a site that changed reachability between runs is excluded too.
  • Not the whole story. 6 defects were found and fixed in this audit, each with a regression test proven to fail without it. Some were in the fixes themselves, found by the census. The open items are listed in the repository.

Reproduce it

  • Every number on this page is computed from the audit's raw result files by scripts/build-proof.py and committed with the site; none is typed by hand.
  • The fixture benchmark is the other half of the evidence: precision and recall on hand-annotated ground truth.
  • The scanner audited here runs on every pull request through the accessibility GitHub Action.
  • 4,350 backend tests pass in both CI modes on the build that shipped these fixes.
  • The raw figures for this edition: 2026-09-16.json. Other editions are listed in the field audit series.