{
 "what_this_is": "Published answers to one question — what share of sites serve an llms.txt — laid side by side with the parameters that make them differ. Every external figure here was read at its own source on the access date shown, not quoted from a secondary summary.",
 "question": "What share of sites serve an llms.txt?",
 "issued": "2026-11-02",
 "finding": "The answers run from 5.86% to 47.49%, a spread of 8.1x, and none of it is error. Three parameters decide the number: which population was sampled, whether an HTTP 200 was validated as a real file, and how unreachable hosts are treated in the denominator. Every measurer below states its own parameters; the fault is in quoting a single figure as the rate, not in the measuring.",
 "not_a_rating": "This page does not rank these measurements by quality and does not claim any of them is wrong. Each is correct for the population and rule it declares.",
 "entries": [
  {
   "who": "Thunderbit",
   "url": "https://thunderbit.com/blog/llms-txt-website-trend",
   "accessed": "2026-11-02",
   "population": "Tranco top 10,000, list downloaded 2026-05-06",
   "n": 10000,
   "rate_pct": 5.86,
   "validation": "1,606 responses returned HTTP 200 at /llms.txt; 586 passed validation. 618 were off-target redirects and 367 generic HTML.",
   "denominator": "the full sampled list",
   "their_own_words": "status codes are a poor proxy for adoption",
   "overcount_if_200_counted": "2.74x"
  },
  {
   "who": "Seomator",
   "url": "https://seomator.com/blog/llms-txt-adoption",
   "accessed": "2026-11-02",
   "population": "Cloudflare Radar top 100,000, requested 2026-09-13",
   "n": 100000,
   "rate_pct": 8.6,
   "rate_pct_responders_only": 11.4,
   "validation": "8,598 domains publish a file; 20,171 returned a 200 at that path, of which 10,775 served ordinary HTML.",
   "denominator": "8.6% over the full list; 11.4% over the 75,353 that responded, with 24,647 non-responders excluded",
   "their_own_words": "a checker looking only for 200 OK overcounts adoption by more than double",
   "overcount_if_200_counted": "2.35x"
  },
  {
   "who": "Rankability",
   "url": "https://www.rankability.com/blog/llms-txt-adoption/",
   "accessed": "2026-11-02",
   "population": "Tranco list V3YPN, checked 2026-09-18",
   "n": 10000,
   "rate_pct": 8.3,
   "rate_pct_top_1000": 9.3,
   "validation": "confirmed means at least one of llms.txt or llms-full.txt was found; a blocked or inconclusive check stays unknown (4,211 of the 10,000; 474 of the top 1,000)",
   "denominator": "every sampled domain, including those that blocked the scan or could not be reached",
   "their_own_words": "Read the denominator. These percentages include every sampled domain, even when a site blocked the scan or could not be reached."
  },
  {
   "who": "Ahrefs",
   "url": "https://ahrefs.com/blog/llmstxt-study/",
   "accessed": "2026-11-02",
   "population": "all 137,210 domains in Ahrefs Web Analytics that received traffic in May 2026",
   "n": 137210,
   "rate_pct": 28.0,
   "validation": "checked for an HTTP 200, confirmed the file was Markdown rather than HTML, and screened for soft-404 signals",
   "denominator": "the full set of traffic-receiving customer domains",
   "their_own_words": "Ahrefs Web Analytics customers skew more technical and SEO-aware than the web at large, so treat the 28% adoption figure as an upper bound."
  },
  {
   "who": "Atlas (this index), brochure corpus",
   "url": "https://atlas.geosensor.tech/findings/llms-txt-reconciliation.json",
   "accessed": "2026-11-02",
   "population": "the brochure corpus — enterprise and mid-market marketing sites in our live rotation",
   "n": 197,
   "rate_pct": 42.13,
   "ci95_pct": [
    35.45,
    49.11
   ],
   "validation": "GET /llms.txt must return a real non-HTML file; 404 or 410 affirms absence; a transport failure is recorded unknown",
   "denominator": "hosts with a usable observation; unknown is counted neither as present nor absent",
   "their_own_words": "A rate is a rate for the declared target set. It is a sample, not a census.",
   "recompute": "PYTHONPATH=. python3 -c \"import pathlib;from phantom.report import grade;print([r for r in grade(pathlib.Path('data'), pathlib.Path('targets/corpus.tsv')) if r['probe']=='llms_txt'])\"  — absence is reported; presence is 1 − absence.",
   "source_note": "Computed for this page from the signed append-only chain on the access date. Not published elsewhere, so the citation is the method and the chain rather than a prior article — the command above returns it."
  },
  {
   "who": "Atlas (this index), agent-native corpus",
   "url": "https://atlas.geosensor.tech/findings/llms-txt-reconciliation.json",
   "accessed": "2026-11-02",
   "population": "the agent-native corpus — hosts that publish an agent-facing interface",
   "n": 1754,
   "rate_pct": 47.49,
   "ci95_pct": [
    45.16,
    49.83
   ],
   "validation": "as above",
   "denominator": "as above",
   "their_own_words": "Measurement is from a single vantage. A series that mixed vantages would mix WHERE with WHEN.",
   "recompute": "PYTHONPATH=. python3 -c \"import pathlib;from phantom.report import grade;print([r for r in grade(pathlib.Path('data'), pathlib.Path('targets/agents.tsv')) if r['probe']=='llms_txt'])\"  — absence is reported; presence is 1 − absence.",
   "source_note": "Computed for this page from the signed append-only chain on the access date. Not published elsewhere, so the citation is the method and the chain rather than a prior article — the command above returns it."
  }
 ],
 "excluded_from_the_table": [
  {
   "figure": "~2% (2025), attributed to the HTTP Archive Web Almanac",
   "why": "seen only as a citation inside a Common Crawl post, not verified at the Almanac itself. A page about reading sources does not get to quote one at second hand."
  },
  {
   "figure": "5.61% for the top 10,000, which an earlier internal note attributed to the HTTP Archive",
   "why": "the figure appears in a Topify post with no named source, and no HTTP Archive publication for it could be found. The attribution was ours and it was wrong."
  },
  {
   "figure": "15.8% over 549 reachable domains, which an earlier internal note attributed to Rankability",
   "why": "no Rankability surface publishes it, live or in the 2026-10-18 archive snapshot. Their published rule is the opposite: all domains stay in the denominator. The arithmetic was most likely ours, recorded as if it were theirs."
  }
 ],
 "right_of_reply": {
  "status": "complete",
  "statuses": [
   "not_sent",
   "sent",
   "complete"
  ],
  "rule": "Condition 3 of the approval to name third parties: every named party gets the draft, the figure and our characterisation of their method BEFORE publication. tools/check_reconciliation.py refuses to let this page into the deploy list until status is 'complete', so the condition is enforced by the build rather than remembered by a person.",
  "parties": [
   "Thunderbit",
   "Seomator",
   "Rankability",
   "Ahrefs"
  ],
  "sent_on": "2026-11-02",
  "replies": [
   {
    "who": "Thunderbit",
    "on": "2026-11-02",
    "from": "Shuai Guan, Co-Founder & CEO",
    "verdict": "confirmed every figure, no changes requested",
    "checked": [
     "5.86% across the Tranco Top 10,000, full 10,000 as the denominator",
     "1,606 HTTP 200s, 586 validated, 618 off-target redirects, 367 generic HTML",
     "the quoted sentence"
    ],
    "asked_for": "link the row to the original post so readers can see the full validation rules; the crawler, analysis scripts and raw CSV are linked from it",
    "done": "the measured-by cell now links to the source URL, for every row"
   }
  ],
  "addresses": {
   "Thunderbit": "contact@thunderbit.com",
   "Seomator": "hello@seomator.com",
   "Rankability": "support@rankability.com",
   "Ahrefs": "pr@ahrefs.com"
  },
  "note": "Each address is published by that company on its own site (Ahrefs lists pr@ and support@ on /about; the press address is the right one for a published study). Confirmed present in =Sent over IMAP, not merely reported by the sender's exit status. Log: outreach/sent/reconciliation.log.",
  "deadline": "2026-11-06",
  "deadline_note": "Armindo, 2026-11-04: the three parties who have not answered get until Friday 6 November. On or after that date the status may be moved to 'complete' — a deliberate act that records the date — which is what lets the page into the deploy list. The deadline does not expire by itself, and the gate keeps refusing until someone sets it.",
  "completed_on": "2026-11-10",
  "silent": [
   "Seomator",
   "Rankability",
   "Ahrefs"
  ],
  "completion_note": "Released by Armindo on 2026-11-10, four days after the deadline he set. Thunderbit replied and confirmed every figure attributed to it. Seomator, Rankability and Ahrefs received the same draft on 2026-11-02, had until 2026-11-06, and did not reply — neither by the deadline nor in the four days since. Their rows stand as read at their own sources on the access dates recorded, and a correction from any of them will be made and shown."
 }
}
