
AI summary: Five reproducible stages to test AI crawler readability: robots.txt audit, static fetch, rendering diff, false-positive checklist, and llms.txt content mapping. In Geolify audit data, 51.73% of completed runs scored below 50 on static content and 65.19% carried a CSR warning (MG-AUDIT-02, MG-AUDIT-03).
Can AI crawlers access and read your website? Run five stages in order. Write down what you observe at each.
llms.txt point models at your best pages?Each stage has a concrete pass condition. Two people running this protocol on the same site should reach the same conclusion. That reproducibility is the point. Crawler readability discussions are full of unfalsifiable claims. The antidote is a test you can rerun after every fix.
The motivation is quantified. Among 4,413 completed Geolify audit runs, 2,283 (51.73%) scored below 50 on static content and 2,877 (65.19%) carried a Client-Side Rendering warning (Geolify internal snapshot, MG-AUDIT-02, MG-AUDIT-03). Full caveats live in the benchmark article. These failure modes are common among sites whose owners bothered to check.
Access comes before readability. Start by listing each vendor's documented crawler identities.
OpenAI documents three identities, each controllable independently in robots.txt (OpenAI crawler docs, checked 2026-07-10):
GPTBot — potential model trainingOAI-SearchBot — search discovery and citationChatGPT-User — fetches triggered by a user's requestPerplexity documents two identities (Perplexity crawler docs, checked 2026-07-10):
PerplexityBot — indexingPerplexity-User — user-triggered fetches (generally does not follow robots.txt because a human asked)Google — no separate "AI Overviews crawler." Normal Googlebot eligibility is the relevant control. Google states no additional technical requirements for AI features beyond Search fundamentals (Google Search Central, checked 2026-07-10).
The test: Fetch your /robots.txt. For each identity above, resolve which rule group applies.
Pass condition: Every rule is deliberate — not "everything allowed." Many sites carry blanket disallows inherited from staging configs or 2023-era blocklists that no one revisited. Decide policy per identity. Record the date and rationale in the repo next to the file.
Fetch each money page the way a thin client would: HTTP GET, realistic user agent, no JavaScript, no cookies.
curl -sL -A "Mozilla/5.0 (compatible; readability-check)" \
https://example.com/pricing -o artifacts/pricing.static.htmlCheck three things per page:
grep -c "your distinctive sentence here" artifacts/pricing.static.htmlPass condition: The grep succeeds for content that matters — answer paragraphs, pricing tables, FAQs. Not merely boilerplate. If your framework serves an application shell, the grep fails in seconds and you have your diagnosis.
Render the same URL in a headless browser. Extract visible text. Diff against the Stage 2 body.
chrome --headless=new --dump-dom https://example.com/pricing \
> artifacts/pricing.rendered.htmlExtract text from both files, then diff:
diff artifacts/pricing.static.txt artifacts/pricing.rendered.txt | wc -lThe absolute diff size matters less than what is in it. Read the removed lines for money content.
Classify each page into severity tiers:
| Tier | Description | Action |
|---|---|---|
| Tier 1 — Cosmetic | Widgets and personalization differ; core copy identical | No action needed |
| Tier 2 — Partial | Some meaningful blocks (FAQs, tables, specs) exist only in rendered version | Content-relocation ticket |
| Tier 3 — Full | Static body has no meaningful copy at all | Architecture ticket (SSR, static gen, prerendering) |
Why this matters: Google documents that its crawler renders JavaScript. Other AI fetchers document identities but generally do not publish rendering guarantees. A page requiring JavaScript is making an unverified assumption about every non-Google system. The 65.19% CSR warning rate measures how often that assumption is made — not how often it fails (MG-AUDIT-03).
Pass condition: Tier 1 diffs on all money pages.
Suppose a pricing page produces a 240-line diff. Reading the removed lines, you find three clusters: a chat widget's markup, a personalized "welcome back" banner, and the entire plan-comparison table.
The widget and banner are Tier 1 noise — no consumer needs to quote them. The plan table is the page's most citable asset, and it exists only after rendering. Classification: Tier 2, with a content-relocation ticket that names the table specifically.
The ticket writes itself from the artifacts: "Plan-comparison table absent from static HTML (see pricing.static.html, line count); move table markup into the server response or prerender this template." An engineer can act on that without re-running your analysis. That is the standard each Stage 3 finding should meet — a named content block, a saved artifact pair, and a proposed fix scoped to a template.
networkidle can fail on pages with persistent analytics or streaming connections. A fixed sleep can be too short or wasteful. Prefer a page-specific readiness condition such as: the main heading is visible, the article container has text, the product data element exists, or a known loading marker disappears. Record the condition in the test output.
Every readability test can lie. Before acting on a failure, walk this checklist:
1. Your test client was blocked, not the crawler. CDN bot management may challenge curl while allowing documented crawlers. Re-test from a different network. Check CDN bot rules for specific identities.
2. Geographic or consent variance. Consent banners and geo-gates can replace content. Test from more than one region if your stack does geo-anything.
3. Race conditions in rendering. A headless render that screenshots too early under-reports content. Wait for network idle. Run the render twice.
4. Sampling noise in citation checks. If you extend the protocol to "did the AI cite us?" — answers are sampled from a distribution. Clarity data illustrates the scale: one readability query shows 31 citations at 20.39% share (CL-AIQ-01), two rendering variants show 26 at 10.00% and 6 at 27.27% (CL-AIQ-02, CL-AIQ-03). Small numbers, not addable across variants. Repeated sampling over weeks is the minimum unit of citation evidence.
5. Fixing the wrong page. Verify the URL AI systems actually cite (canonical vs. variant, trailing slash, locale path) before concluding your fix "didn't work."
Pass condition: A failure that survives all five checks is real. File a ticket with the artifacts attached.
llms.txt is a community proposal by Jeremy Howard (September 2024) for a root-path Markdown file that curates pages a language model should read when reasoning about your site (llmstxt.org, checked 2026-07-10).
What it is: An optional content map a model may consult.
What it is not: Access control. robots.txt expresses crawl permissions. llms.txt is a pointer. Publishing one cannot block anything. No primary source establishes that publishing one improves rankings or citations. Treat any such claim as unproven.
Within this protocol: After Stages 1-4 guarantee access and readability, llms.txt is a low-cost pointer to your best, most answer-complete pages. Keep it accurate and small. Stale links in a curation file are worse than no file.
Implementation details — format, sections, maintenance — are in The LLMS.txt Optimization Checklist.
A minimal, honest file opens with a single H1 line naming your company (for example, # Example Company), followed by:
> B2B software for X. The pages below are our most
> accurate, answer-complete resources.
## Stage 6: Identify the Cause
When essential content appears only after rendering, locate the dependency. Common causes include client-side data fetching, delayed hydration, personalization gates, consent managers, lazy-loaded sections, authentication, API failures, or browser-only routing.
Use browser network tools to identify the request supplying the content. Ask:
- Can the core information be included in the server response?
- Can the interactive layer hydrate over complete HTML?
- Is the content intentionally personalized or private?
- Does the page fail gracefully when scripts fail?
- Does the canonical URL return the same essential content?
The recommended fix should match the cause. “Use server-side rendering” is too broad when the actual issue is a blocked API or a consent configuration.
## Stage 7: Review Production Logs
Laboratory tests show what your client received. Production logs show what requested the site and how infrastructure responded. Capture necessary fields like timestamp, requested URL, status code, response bytes/time, user agent, verified crawler classification, and cache outcome.
Verify identities where possible: a user-agent string can be spoofed. Use official provider methods or published IP ranges when available. Classify requests as verified documented crawler, user-agent match only, known browser, or other automation.
Logs can tell you if requests reached the site, if responses succeeded, or if a crawler concentrated on certain templates. Logs cannot tell you if content was indexed, used for training, supported an answer, or if a user saw a citation.
## Product
- [What the product measures](https://example.com/product): scope and limits
- [Pricing](https://example.com/pricing): current plans
## Guides
- [Implementation guide](https://example.com/docs/setup): step-by-step setupTwo properties matter more than length. Every linked page should already pass Stages 2-3 — pointing a model at an unreadable page wastes the pointer. And the file should change when your site changes; wire it into the same review that owns your sitemap.
The five stages assume a top-20 page list. Sites with tens of thousands of URLs adapt by sampling templates.
Template-level sampling is the honest way to report coverage. "All seven templates pass Stage 3 at Tier 1" is verifiable. "The site is AI-readable" is not.
The protocol tests what a crawler could read. Server logs tell you who actually fetches. Close the loop monthly.
This monthly read is also your early-warning system: a documented crawler disappearing from your logs after a CDN or robots change is a regression the five stages will not catch on their own.
Run the loop twice on separate days before trusting a failure. Transient CDN behavior produces one-off artifacts.
Keep the user agent string honest. Impersonating specific crawler identities triggers anti-spoofing checks and measures the wrong thing. Real crawler traffic verification is a server-log exercise, not a curl exercise.
This protocol verifies access and readability. It does not guarantee citations, measure rankings, or establish that any fix caused any AI answer to change. The audit distributions describe Geolify audit runs, not the general web. Citation-share figures are per-query Clarity metrics from one month.
Nothing here should be read as "blocking GPTBot removes you from ChatGPT search." The crawler identities have distinct jobs — which is exactly why Stage 1 tests them separately.
How long does a full five-stage run take? For a 20-page money list on a familiar stack: Stage 1 under an hour, Stages 2-3 half a day including artifact capture, Stage 4 only where failures appear, Stage 5 an hour once the earlier stages pass. The first run is the slowest; scripted re-runs compress to minutes.
Do I need special tooling?
No. curl, a headless browser, and diff cover Stages 2-3. A GEO Audit automates the same checks at scale and adds scoring, which matters once you move from one site to a portfolio — but the protocol is deliberately runnable with what your engineers already have.
What if my page passes every stage and still is not cited? Then readability was never your bottleneck — which is exactly what the protocol is for. Citation depends on content quality, authority, and retrieval competition. Passing here means you can stop debugging infrastructure and invest in the content itself.
All external sources verified 2026-07-10: OpenAI crawlers; Perplexity crawlers; Google Search Central; llmstxt.org. Internal figures from Geolify snapshot 2026-07-10 (MG-AUDIT-02, MG-AUDIT-03, CL-AIQ-01, CL-AIQ-02, CL-AIQ-03).
| Operator | Identity (Examples) | Primary Documentation |
|---|---|---|
| OpenAI | OAI-SearchBot (search), GPTBot (training) | Crawlers overview |
| Perplexity | PerplexityBot, Perplexity-User | Perplexity crawlers |
| Googlebot (standard Search eligibility) | AI features |

Tavily vs. WebMCP: Two Architectures for Agent Discovery AI summary: Tavily is a retrieval API that agents call to search and extract web content. WebMCP is a draft proposal for exposing site tools to agents in the browser. They are complementary, not rivals. AI agent traffic is real but still single-digit. Tavily and WebMCP solve […]

Answer‑first writing bridges classic SEO with LLM Optimization (LLMO): use keywords, headings and schema, but open every section with a direct answer in the first 40–60 words so humans and AI search engines like Perplexity, ChatGPT and Google AI Overviews can extract it instantly. What Is Answer‑First Writing and Why It Matters Now Answer‑first writing […]

Executive Summary The digital information ecosystem is currently navigating its most profound architectural fracture in two decades. The traditional “Information Retrieval” (IR) model—defined by keyword queries and a list of “ten blue links”—is being rapidly subsumed by “Information Synthesis.” The ascendancy of Large Language Models (LLMs) and Answer Engines (such as ChatGPT, Perplexity, Claude, and […]