Notes from measuring AI search
Pieces from the run behind the scanner: the distribution nobody quotes, the nine homepages that never answered, the markup gap in most of the sample, the two rules this site will not pretend to be stronger than they are, and the technical notes that follow from measuring the same thing repeatedly.
Published 18 October 2026 · by Alex
What I would measure next (and what this tool still cannot tell you)
The honest close to the series: what the tool cannot see, what was actually measured, and the next round of questions that could be answered without overclaiming.
A 30-site sample is not a benchmark: reading the study correctly
A small sample is useful when it is described as one. The damage starts when 30 hand-picked homepages become "the industry average".
Paywalls, consent walls and citation loss
A paywall is a business decision; a consent wall is a legal workflow. Both can hide the body, and the citation cost is the same.
Core Web Vitals and AI crawlers: what is actually connected
Both are about pages being fast, so a sentence connecting them sounds plausible. The connection is shared causes, not a shared score.
TTFB, edge caching and prerendered HTML
Prerendered does not mean cached. The build answer and the runtime answer are different, and TTFB plus a cache-status header shows which one a reader got.
Cache headers and what an auditor actually sees
An external audit read the old page after a deploy because the headers allowed it. The fix was not a harder purge; it was to stop granting permission to be stale.
Redirect chains and crawler budget
A redirect is for addresses the site cannot edit. When internal links depend on one, the site pays the hop on every crawl and every click.
Refused vs blocked: telling WAF from robots.txt
The same symptom has three causes and three fixes. Editing robots.txt for a WAF refusal is the most common waste in this category.
Three runs per question: why "2 of 3" beats a percentage
Three runs are the smallest set with a majority and a visible split. The result is x of n, never a rate, because the denominator is the finding.
Meta descriptions: does an AI engine read them?
The question is unanswerable from outside, and the useful response is not a guess. Write the summary for the reader, measure the length, and do not let it stand in for the page.
Content-Signal and robots.txt content policies
Content-Signal lets a site distinguish search, AI input and training. It does not block anything, and a line that disagrees with the robots rules is worse than no line.
Markdown alternates: serving LLM-readable content
The declaration is one point and never followed. The twin behind it is the work: generated from the same source, scoped to the pages that exist, and tested against the page.
Hreflang for a site that machine-translates
Cheap translation and a loop-generated cluster look complete. The failure is a declaration that names pages which do not exist, and a single fetch cannot catch it.
Sitemap lastmod: why false freshness is worse than none
A lastmod is a promise that something changed. A field that always claims freshness teaches the crawler to ignore it, and the loss is quiet.
Canonical URLs: the mistakes that split citations
The interesting failures are not in the tag but in the address it names. A canonical that points at a redirect, a 404 or another language is worse than none.
Heading hierarchy for extraction, not just SEO
One H1, real H2 sections, landmarks — but the reason is extraction, not a checklist. What a heading does for a passage, and what it does not.
Quotations, attribution and trust signals
The scanner passes any blockquote and any byline-shaped string. Neither is evidence. What a quotation needs, and the trust signals around it.
Statistics without sources: the citation trap
A number is the most quotable thing on a page and the easiest to fake. Both rules that touch statistics are presence checks, and the rule pages say so.
Tables, lists and the cost of prose-only facts
A paragraph can hold five facts and be cited for none of them cleanly. A list item is one claim; a table row is a tuple. The trade is real in both directions.
Answer-first writing: measured positions
Answer-first is a claim about position, so it can be measured. This is the measurement taken here — 101 pairs, 90% short openers — and the limits of a sample written to the rule.
How answer engines pick the span they quote
An engine quotes a sentence or a paragraph, not a URL. The author's half of that decision is making the passage findable, self-contained and checkable.
datePublished, dateModified and AI freshness
A page's dates are claims about its own history. The easiest way to make them worthless is to move one on every deploy.
FAQPage schema after the rich-result changes
Most sites kept their FAQPage markup after the rich result went away without asking what it still does. The answer is smaller and more useful than the old one.
sameAs: which profiles actually help an entity resolve
sameAs is a list of claims, not a link dump. What counts as corroboration, what counts as padding, and why the scanner's two-point check does not fetch a single profile.
The entity graph: Organization vs WebSite vs SoftwareApplication
Most entity markup is three disconnected blocks. The part that makes it a graph is the identifiers and relations — and the part most sites skip is deciding what the product is.
llms-full.txt and context budgets
A full corpus is offered as the generous version of llms.txt. It is also the version that pays a context bill on every request — and most sites never do the arithmetic.
llms.txt: what it changes and what it does not
llms.txt is cheap to publish and easy to over-claim. This is what it can do, what it cannot, and how to tell whether yours is worth the bytes.
What a crawler sees when your page needs JavaScript
A page that looks complete in a browser can be a shell in the fetch a crawler makes. The gap is cheap to measure and easy to miss, because every manual test runs JavaScript.
Cloudflare WAF and AI crawlers: what a 403 actually means
Most accidental AI-crawler blocks are a 403 that was never about robots.txt. The two-probe test tells you which layer refused the request before you edit anything.
Which robots.txt lines actually block AI crawlers
Most sites that block an AI crawler did not mean to. This is the difference between a deliberate policy line, a wildcard that catches more than intended, and a 403 that has nothing to do with robots.txt.
We scanned 30 homepages and none graded an A
The study has one number everyone quotes and four it rarely does. This is the distribution behind them, including the nine rows that never produced a page at all.
Six news publishers, six blocking AI crawlers
Every news publisher in the sample turns away at least one of the crawlers behind ChatGPT, Claude, Perplexity and Doubao. That is a policy choice with a measurable cost, and it is not obviously the wrong one.
Nine homepages never answered the crawler
A 403 is not a page. Nine rows in the study describe an error response rather than a site, and counting them as zero would have produced a more dramatic and less true number.
22 of 30 sites leave AI guessing who they are
A model that cannot bind a name to a domain has to guess, and a guess is not a citation. The markup that fixes it is four lines of JSON, and most of the sample does not have it.
llms.txt: what the evidence actually supports
The file is easy to add and hard to justify as a lever. This is the case for publishing one anyway, and the case against pretending it is more than it is.
How to read a failed check and fix the right thing
Most bad fixes come from reading a failure as an instruction. The rule pages publish what each check does not test for exactly this reason; this is how to use that.
All posts
36 of 36 postsEvery piece, newest first. Filter by category or year, or search a title.
2026
- What I would measure next (and what this tool still cannot tell you)Method
- A 30-site sample is not a benchmark: reading the study correctlyMethod
- Paywalls, consent walls and citation lossMethod
- Core Web Vitals and AI crawlers: what is actually connectedMethod
- TTFB, edge caching and prerendered HTMLMethod
- Cache headers and what an auditor actually seesMethod
- Redirect chains and crawler budgetMethod
- Refused vs blocked: telling WAF from robots.txtMethod
- Three runs per question: why "2 of 3" beats a percentageMethod
- Meta descriptions: does an AI engine read them?Method
- Content-Signal and robots.txt content policiesMethod
- Markdown alternates: serving LLM-readable contentMethod
- Hreflang for a site that machine-translatesMethod
- Sitemap lastmod: why false freshness is worse than noneMethod
- Canonical URLs: the mistakes that split citationsMethod
- Heading hierarchy for extraction, not just SEOExplainer
- Quotations, attribution and trust signalsMethod
- Statistics without sources: the citation trapMethod
- Tables, lists and the cost of prose-only factsMethod
- Answer-first writing: measured positionsMethod
- How answer engines pick the span they quoteExplainer
- datePublished, dateModified and AI freshnessExplainer
- FAQPage schema after the rich-result changesExplainer
- sameAs: which profiles actually help an entity resolveExplainer
- The entity graph: Organization vs WebSite vs SoftwareApplicationExplainer
- llms-full.txt and context budgetsExplainer
- llms.txt: what it changes and what it does notExplainer
- What a crawler sees when your page needs JavaScriptExplainer
- Cloudflare WAF and AI crawlers: what a 403 actually meansMethod
- Which robots.txt lines actually block AI crawlersMethod
- We scanned 30 homepages and none graded an AStudy
- Six news publishers, six blocking AI crawlersStudy
- Nine homepages never answered the crawlerMethod
- 22 of 30 sites leave AI guessing who they areStudy
- llms.txt: what the evidence actually supportsExplainer
- How to read a failed check and fix the right thingMethod
What is published here?
First-party writing: measurements from the 30-site study, explanations of rules that fail in ways worth explaining, and a record of where this method is weaker than it looks. Nothing here is a press release, nothing is sponsored, and no piece is written to fill a calendar.
The standard is one sentence long: delete the piece and ask what the reader lost. If the answer is a number they could not get elsewhere, or a step they can run themselves, it stays. If the answer is nothing, it does not get published — which is why every piece has to earn its place rather than fill a calendar.
The figures the archive turns on are all from one run over 30 homepages: 53% graded F, 7% reached a B, 30% never answered the crawler at all, 27% declared an entity and 63% have neither an entity nor asameAs list. Each piece below links to the rows it came from, and the rows can be re-scanned.
How was each piece made?
Every article rests on data that can be re-run. The study rows come from the scanner itself, the rule weights come from the published catalogue, and the limits come from the notes attached to each rule.
| Piece | Data it rests on | Rule it reads |
|---|---|---|
| The distribution of 30 scores | The published study rows | All 40, grouped by dimension |
| The news publishers | Six rows, their status codes and robots | Crawler passability |
| The nine that never answered | Status and browser-status pairs | The measurement guards |
| The entity gap | Two boolean fields across the sample | Entity and sameAs |
| llms.txt and the evidence | The weighting arithmetic | Context files |
| Reading a failed check | The rule pages and their notes | The published limits |
What will not appear here?
- Sponsored posts. There are no paid placements, and a vendor cannot buy a mention by buying a report.
- Numbers without a source. A figure that cannot be traced to the study or a re-runnable scan does not go in, however plausible it sounds.
- Predictions dressed as measurements. The scanner does not query a model about your brand, so neither do the articles about it.
- Volume for its own sake. A posting schedule is a promise to publish, and a site that keeps it by lowering the bar has published less than it appears to.
How do I read a piece I disagree with?
Send the check, the URL and what the scan reported. A disagreement that names a rule is the most useful message this project receives, and the method is public specifically so a disagreement can be specific.
How the writing is produced, corrected and funded is described on the author page. The full rule set is at the check reference, and the arithmetic is on the methodology page.
Questions about the writing
Is this a blog?
It is a blog of first-party notes: study results, rule explanations and stated limits. The plan is a new note every few days, and each one still has to sit on a measurement — no news feed, no sponsored posts.
Can I quote a piece?
Yes, with attribution and a link. Quoting a figure without the sample it came from is the failure this archive is written to make harder, so please take the sentence that carries the number and its source.
Are the pieces peer reviewed?
No, and calling them that would be false. They are checked against the published data and the rule catalogue, and each one states where its own method is weaker than it looks.
Evidence and sources
GEO can boost visibility by up to 40% overall in generative engine responses, and in the paper's Table 1 the best of the tested methods improve on the no-optimization baseline by 41% and 28%. — Generative Engine Optimization, KDD 2024
The weightings this archive argues about follow published research rather than taste; the study rows behind each figure are published and re-runnable.
Primary sources
- Generative Engine Optimization (KDD 2024) — the measured gains the citability weight follows
- What Generative Search Engines Like — what generative engines prefer in retrieved content
- What Gets Cited: Competitive GEO — which of two competing sources is cited first
- The rule set and its weights — every check, its weight and its pass condition