ReadableByAI
Menu ▾

METHODOLOGY

Corrections & Measurement Policy

Every finding ReadableByAI publishes — in the free scan, the Index, or a case file — is a point-in-time measurement of a publicly reachable page. This page explains exactly what that means, how to check our work yourself, and what happens when we're wrong.

What "point-in-time measurement" means

When we say a homepage served 94 visible words, or that a robots.txt disallows a given crawler token, that is what our probe observed on the date stated, fetching a publicly accessible URL the same way anyone else can. It is not a claim about the site's intent, its engineering quality, or what it will serve tomorrow. Sites change. A finding published in the Index is a snapshot, dated, and it stays accurate for exactly as long as the page it describes stays unchanged.

Reproduce any claim yourself

Nothing here asks you to trust us on our word. The probe engine is open source — MIT licensed — at github.com/abouchard11/geo-crawl-audit (v0.1 — the Index runs a newer build; classification of edge cases may differ until the next release). The readability numbers cited on this site don't depend on that: the one-liner below does exactly the raw-HTML word count our probe does — no headless browser, no JavaScript execution, script and style tags stripped before counting. Swap in any domain:

curl -sL https://example.com | python3 -c "import re,sys; h=sys.stdin.read(); h=re.sub(r'<(script|style)(\s[^>]*)?>.*?</\1>','',h,flags=re.S|re.I); h=re.sub(r'<[^>]+>',' ',h); print(len(h.split()))"

If your result doesn't match a number we've published, tell us — see "How to reach us" below. That's not an inconvenience to us, it's the check this whole method depends on.

What we publish, and what we deliberately withhold

We only publish findings that are identity-independent — true no matter who is asking, and provable from a single ordinary fetch:

  • Raw-HTML readability — the visible word count and rendering classification (CSR_SHELL / SSR_THIN / SSR_FULL) extracted from a page's HTML before any JavaScript runs. This is the same for every visitor, human or bot.
  • Literal robots.txt contents — what the file says, verbatim. We report it as a fact about the file, not an inference about intent.

We deliberately do not publish bot-specific access results — which crawler user-agents got a 200, a 403, or a challenge page — as a claim about any named company. Here's why: our probes originate from our own servers with a claimed crawler identity in the request header. Vendors verify their real crawlers by published IP range, so a site can treat an unverified probe claiming to be ClaudeBot differently than it treats the genuine ClaudeBot. A challenge to our probe proves a bot-sensitive filtering layer exists — it does not prove a specific named company is blocking a specific real crawler. Only that company's own server logs can settle that question, and we don't have them. So a probe that can't settle a claim doesn't get to make that claim publicly about a named site. This is the same rule the free scan uses: when our baseline browser request itself gets filtered, we withhold the score instead of reporting a number we can't stand behind.

Free re-verification, any time

If your company appears in a ReadableByAI finding — named publicly or notified privately — and you believe it's wrong, outdated, or you've since fixed it, we will re-probe your domain at no charge and update or remove the entry. No catch, no upsell attached to the re-check itself. The goal of this Index is an accurate public record and pages that get fixed, not a leaderboard anyone stays stuck on.

How we correct errors

When a published finding turns out to be wrong or out of date, we correct it publicly and promptly, with a dated note explaining what changed and why — we do not silently edit a past claim away. If you're re-reading a page you saw before and a number has moved, there will be a visible trail showing when and why.

Corrections log

27 AUGUST 2026 — THE SAAS SHELL RATE, AND THE GAP

Changed: the share of established SaaS homepages serving an empty shell moved from 2.9% (13 of 455) to 2.0% (9 of 450), and the headline gap between YC Fall 2025 startups and established SaaS moved from 8.9x to 12.8x. Fully-readable SaaS moved from 94.7% to 95.1%. The YC figures did not change.

Why: five of the SaaS rows were not measurements of a homepage. Their baseline fetch returned a WAF challenge or interstitial — an empty <title> with a body under 2 KB, or a title naming a challenge page. Counting a bot-challenge page as a content measurement is exactly the error our own evidence rules exist to prevent, and we published it. Those rows are now excluded from both the numerator and the denominator. A separate rule moves two rows out of the shell count because AI crawlers receive substantially more content from them than a browser does — they are not invisible, and counting them as failures overstated the problem. Both rules were applied to the YC population as well; no YC domain matched either. Correcting the composition made the gap larger, not smaller.

27 AUGUST 2026 — THE REPRODUCTION COMMAND DID NOT REPRODUCE

Changed: the one-liner published on this page and on the Index now uses curl -sL instead of curl -s.

Why: our probe follows redirects; the published command did not. Anyone who ran it against the companies named on the Index fetched a redirect stub rather than the page we measured, and got a number that did not match ours — for every one of them. This page asks readers to check our work and tells them to report a mismatch. For as long as that command was wrong, we were generating mismatches and inviting people to treat them as our error. The measurements themselves were unaffected: with -L, four of the six named figures reproduce exactly nineteen days later, and the two that moved are sites that changed.

27 AUGUST 2026 — TWO FINDINGS WITHDRAWN (ORIGINALLY 13 AUGUST 2026)

Withdrawn: findings that two enterprise homepages served 6 visible words. Both were re-scanned on 13 August 2026 and found to serve a 205-byte bot-defense stub to a browser-agent fetch from our datacenter IP. The original counts measured that stub, not the companies' homepages, and say nothing about what those sites serve to ordinary visitors. Neither number should have been published, and neither will be cited again without a fresh scan from a network that is not challenged.

Why this is dated twice: we caught this on 13 August and recorded it privately, before the findings were used in any outreach. We did not post it here at the time. A correction the public cannot see is not a correction, so it is logged now, with both dates, rather than quietly folded into the change above.

Companies we didn't name publicly

The Index does not publish a full roster of every domain measured — see "What we're not publishing, and why" on the Index page for the reasoning. Any company with a finding that wasn't named publicly was notified privately instead, directly, before or in place of publication. That is the actual policy, not a fallback: the point of this Index is to get pages fixed, not to build a public list of who got caught.

How to reach us

Dispute a finding, request free re-verification, or report a reproducibility mismatch: email alex+corrections@midnightdev.dev. This is a small, single-operator project — a real person reads and answers every message.