Repository navigation
Releases
v1.1.0
- Freshness classifier matches its examples: future dates are unknown, truncation is named without changing the class, a Labs window with no date is aging, and a page
dateModifiedis not an observation. - Reports gate on evidence sources. A context dataset (Labs volumes used only to pick keywords, an unused CDN chart) does not make the whole report unknown.
- Bot audit compares body size to the browser, scores a missing Claude-SearchBot allow at −5 once, and does not fail a light static page or an unreachable port 80.
- Citability keeps article footers and cited social posts, defines the X-01 query, and marks X-02 N/A without both snapshots.
- Information gain checks indexing first, can run lite (3 pages, 25 ledger rows), and says the score is judged.
- Worked examples for all four skills, from the fluyeporlaweb.com audit on 2026-10-20. No new numbers.
Install: npx skills add Pautthead/seo-aeo-agent-skills
v1.0.4 - verification commands actually test the token
v1.0.4 — verification commands actually test the token
Closes the last three items from the third review that lived in the product files rather than in the prose.
The real bug: the commands could not fail
EDGE_VERIFICATION.md and ROBOTS_TRAPS.md sent full User-Agent strings with frozen versions in every copy-paste command — ...compatible; OAI-SearchBot/1.4; +https://openai.com/searchbot, Google-Agent/1.0, PerplexityBot/1.0.
That is precisely the failure CRAWLERS.md warns about in its own text: the day a vendor bumps the version, the request no longer matches the customer's WAF rule, the site returns a normal 200, and the audit reports "bot allowed" for a bot that is being blocked. A test that cannot fail is worse than no test.
Every command now sends the bare token — -A 'OAI-SearchBot', -A 'Google-Agent', -A 'PerplexityBot' — which is what an edge rule keyed on the token actually matches. 33 replacements across the two files.
Also in this release
- One canonical form per bot. The two files had carried two different strings for
OAI-SearchBotandChatGPT-User, and aGoogle-Agent/1.0that Google does not publish. With tokens, the ambiguity is gone. - The rationale is now written down above the per-bot commands, so the next contributor does not "improve" them back into full strings.
aeo-citability-auditthreshold fixed. The rule said to state the headline "whenever the score is above 70", while the published band calls 60–79 workable. A page scoring 72 would have been described as "nothing is wrong on-page". It now fires in the 80–100 strong band only.
Verified
validate_skill_inventory.py --strictandreference_freshness.py: PASS.- 0 broken relative links, 0 mojibake, no BOM. EN/ES URL parity: 41 shared URLs plus 3 localised badge pairs.
- Bodies: 4,997 / 4,462 / 2,873 / 4,673 estimated tokens.
Install: npx skills add Pautthead/seo-aeo-agent-skills
v1.0.3 - third review pass, primary sources re-read
v1.0.3 — third review pass: primary sources re-read
A third external review flagged overclaims and dead citations. Every contested claim was re-checked against the primary text. Most were real. Two of the reviewer's own findings were wrong, and the files now say so.
Fixed
- The Google
llms.txtquote was on the wrong page, and paraphrased. The "you don't need to create new machine readable files" sentence lives onai-optimization-guide, notai-features, andai-featureshas no "Mythbusting" section at all. Both READMEs,LIMITS.mdandSOURCE-VERIFICATION.mdnow carry the verbatim sentence and the correct URL. - "Six independent 2026 measurements" was an overclaim. They are six 2026 studies. None finds a link between
llms.txtand more citations or more crawling, but several measure fetches rather than citations. Saying "independent measurements" implied a design they do not all have. - Google crawler user agents.
Google-Agentis published without a version.Google-Extendedhas no User-Agent string at all — it is a robots.txt token only.Google-PageRendererdoes not appear in Google's documentation. YouBotandMistralAI-Userwere presented with fabricated full UA strings. You's verification page returns 404. Mistral publishes no string. Both are now bare tokens, with the failed check stated inline, and the cut-the-string test that could not work was removed.- Uncalibrated numbers now say they are uncalibrated. The
aeo-bot-access-auditweights and bands are labelled design thresholds. The a14y markdown-mirror study is labelled vendor research with its n=5-per-arm, single-site design and its conflict of interest stated in both READMEs. - Search Engine Land arithmetic. The
llms.txtrow now records the site that fell 19.7% and notes that 2 + 8 + 1 does not reconcile with the stated n=10.
Structural
- Link convention corrected to standard renderer-relative paths (option c, the one
CONSISTENCY-REPORT.md§7 recommended but did not implement). The old skill-root convention made 30 links 404 on GitHub while the validator passed them — it resolved from the skill root, not from the file.SKILL.mdstill linksreferences/FOO.md; files insidereferences/now linkFOO.md. The validator resolves like GitHub does and rejects links that escape the skill root. aeo-citability-auditis back under budget: 4,995 estimated body tokens (limit 5,000) and a 300-character description. The previous body was at the ceiling and the description exceeded the Codex truncation guideline.seo-data-contract's reference list uses real links, so the link gate actually checks those three files instead of skipping them.SOURCE-VERIFICATION.mdgains Appendix B listing what could not be verified and what the skills say instead, so "checked and clean" is distinguishable from "checked and still uncertain".- GeoTest located. The reviewer could not find it; it exists at geotest.ai/geo-score (GEO Score v6.0, Citation Worthiness 34/100) and is now cited with vendor and version.
Verified
- Both CI gates pass:
validate_skill_inventory.py --strictandreference_freshness.py. - 0 broken relative links, 0 mojibake, no BOM. EN/ES URL parity: 41 shared URLs plus 3 localised badge pairs.
- Zenodo
10.5281/zenodo.23018429and10.5281/zenodo.23128812resolve and match the quoted figures (zerollms.txthits across 22 tokens; 1,549 fetches across 165 announced site-days).
Install: npx skills add Pautthead/seo-aeo-agent-skills
v1.0.2 — corrections pass 2: Ahrefs misattribution fixed
Corrections pass 2
A second review turned up one error left over from v1.0.1, plus a handful of framing problems of the same kind as the ones we had just fixed. All are corrected here.
The Ahrefs number was misattributed
v1.0.1 said AI agents are "10.5% of llms.txt requests — more than any other bot type". The 10.5% figure is real, but the second half is not true of it.
In Ahrefs' own words:
"Individually, no AI bot category makes the top four. SEO audit tools (21.7%), Other and unidentified (14.9%), General web crawlers (13.1%), and Tech profiling tools (11.6%) all send more requests than any one AI bot."
AI agents are fifth. The "larger than any other bot type" comparison belongs to the 19.5% figure you get by combining all four AI categories — and Ahrefs is explicit that combining them is what makes them largest.
Two more corrections in the same paragraph:
- "Files that are fetched are read mostly by agents" was too strong. 77% of the bots fetching llms.txt are not AI tools.
- The Claude-Code quote was missing its prefix. Ahrefs writes "Aside from statespace-indexer and GPTBot, Claude-Code…" — so Claude-Code is out-fetching the retrieval bots, assistants and training crawlers, but is not the top fetcher overall. The ellipsis now shows what was cut.
This is the exact failure class we removed from v1.0.0 — a true number attached to the wrong comparison. Catching it in our own correction release is the point of writing the rule down.
"Six independent studies" was wrong
Three of the six (Ahrefs, Otterly.AI, Arsentev) measure fetches of the file, not citations. Three are vendor research and one is editorial. "Independent" is gone, and so is the sentence "five are negative and one is the nuance" — that stopped matching the table when Hall left it. The wording is now: "Six 2026 studies find no link between publishing the file and more citations or more crawling."
Mueller's quote, framed properly
The Mueller exchange was about Google's markdown developer documentation, not about llms.txt as a standalone standard. Ahrefs extends it to the file. The README now says so and attributes the extension to Ahrefs rather than to Mueller.
Small corrections
- Release badge updated from v1.0.0 to v1.0.1 (it had not followed the release).
- "the most common state in the market" — removed. It was an unsourced generalisation about what other sites do. The factual observation stands without it.
- "Every claim links to its primary source" → "every statistic". Quotes, competitor star counts and vendor prices are not statistics of the same kind, and some of them were not in the verification table. They now are: see the new appendix in
SOURCE-VERIFICATION.md. - Affiliate wording — changed from "a paid vendor we use" to a plain referral disclosure: "we may earn a commission if you sign up." The prices now carry a check date and a link to the vendor's pricing page.
SOURCE-VERIFICATION.mdnow opens with a status line stating that everything in it was actioned in v1.0.1, so the "Must change" section is not mistaken for a list of open defects.AGENTS.mdcarried the same "six independent measurements say it does not work" overclaim and is now aligned.
What this says about the repo
Every fix in this release is a place where we asserted something slightly larger than the sources support. That is the failure mode this repo exists to argue against, so it belongs in the open record rather than in a quiet commit. The verified numbers themselves — 97% of files unread, 28% adoption as an upper bound, zero AI bots hunting for missing files — are unchanged and still hold.
v1.0.1 — source verification pass: fabricated quote removed, headline corrected
Correction release
An independent review, followed by a full primary-source verification of every citation in the repo. Several claims did not survive contact with the sources — including one that should never have shipped.
Note: the first version of these notes repeated a claim that was itself wrong (that AI agents are "more than any other bot type" at 10.5% of llms.txt requests). That is corrected below and recorded in v1.0.2. The repo is not exempt from its own rule.
A fabricated quote, removed
The README attributed to Danny Sullivan the line "There is no benefit to creating a llms.txt file for SEO." It is not in any source, and it linked to a blog index rather than a post. It reached us through a research pass and sat in the README until someone went looking for it.
Replaced with Google's own first-party documentation, which is a strictly stronger citation:
"You don't need to create new machine readable files, AI text files, or markup to appear in these features."
One released version carried that fabrication. We are keeping it in the record rather than quietly overwriting it.
The headline was overclaiming
The repo title and description said llms.txt "doesn't work". That is stronger than the evidence, and our own research contradicted us.
What the sources support is narrower and still decisive: llms.txt does not get you cited in AI answers. It is fetched — of the 3% of files that get read at all, named AI bots are 19.5% of requests, and that becomes the largest single bucket only when the four AI categories are combined. Within them, AI agents are the biggest individual AI category at 10.5%, yet they sit fifth overall, behind SEO audit tools (21.7%), unidentified clients (14.9%), general web crawlers (13.1%) and tech-profiling tools (11.6%). 77% of the bots fetching the file are not AI tools at all. What the data does show is a coding-agent audience: aside from two crawlers, Claude-Code out-fetched every AI retrieval bot, every AI assistant and every AI training crawler.
Getting this wrong mattered. A claim that's too strong is falsifiable by anyone who runs one experiment — and the first draft of even these release notes repeated the overclaim.
Zyppy's scores were called measurements. They are not.
Shepard's own text:
"I assigned each score by hand against those criteria, using AI to help adjust the final numbers... These are not confirmed ranking factors. Correlation is not causation."
Every presentation of the 9.5 / 9.4 / 2.0 values now says hand-assigned correlation score, and they are used for ordering only, never as effect sizes.
Structured data was quoted one-sidedly
We cited only the negative half of Shepard's position. He also writes that "practically every study that looks at schema and AI citations finds a positive relationship. The effect is typically small, but it's amazingly consistent."
Both halves now appear. The recommendation is unchanged; the reasoning is no longer selectively negative.
Numbers and sources corrected
| Claim | Was | Now |
|---|---|---|
| Origin-log robots.txt requests | 2,135 | 698, from 11 crawler tokens |
| SlopShape accuracy | ~98% | 97.0 macro-F1 (and macro-F1 is not an accuracy percentage) |
| On-Page.ai position correlation | "mean ~51", barely separated | Median 52/100; position unrelated within the top 3 |
| a14y test arms | "five link formats" | five arms, three of them link formats |
| Citation-lift window | 60–120 days (ProCloser) | Removed — source not found |
| Reddit volume | 25,000 posts/day | Removed — not confirmed |
| Subreddit removals | "banned for upvote automation" | OtterlyAI's own communities, Rule 2 breach |
Every source now carries a type: measured / vendor research / editorial / vendor docs. Muck Rack's 84% earned-media figure includes Wikipedia and PubMed Central; On-Page.ai sells the Information Gain Score it published; Hall discloses he owns the plugin he measured. All still usable, all now labelled.
User-Agent strings — a functional bug
These appear in copy-pasteable curl commands:
OAI-SearchBot/1.0→/1.4GPTBot/1.2→/1.4Perplexity-Userverification URL is/perplexity-user, not/perplexitybot— the file claimed otherwise- Anthropic publishes no UA strings at all. That block is relabelled OBSERVED and points at the published IP list, which is the only real verification method. A UA header is a claim anyone can make.
- Added the missing
OAI-AdsBot
Links
Fixed two URLs that silently resolved to blog index pages and two malformed arXiv paths. Re-attributed the 91% single-engine figure to its Growth Memo primary.
Added
- A real run of
aeo-bot-access-auditagainstahrefs.com, with actual output, not a fabricated example - "Sources last verified 2026-10-19" near the top
- The install command above the fold
docs/SOURCE-VERIFICATION.md— every source with its verdict
The honest summary: the four skills' engineering held up under audit, but the evidence layer had real defects, including one fabricated citation that shipped in v1.0.0. That's what happens when you build a repo whose premise is "we verify everything" — the premise is only worth anything if you're willing to find the failures in yourself.
Full table: docs/SOURCE-VERIFICATION.md. Removal register: docs/METHODOLOGY-BRIEF.md §1.9c.
v1.0.0 — four verifiable SEO / AEO / GEO skills for AI agents
Four evidence-based SEO, AEO & GEO skills for AI coding agents. Every scoring rule traces to a dated source. Zero API keys required.
Why this exists
The agent-skills market for SEO split into two camps during 2026. Either you get a pack of prompts that cannot see real data, or you get a data-rich pack locked behind a paid subscription. Most of them also do not document what they cannot detect, and several have open correctness bugs against their own primary data source.
This takes a third position:
- Every scoring rule traces to a dated source, with the level of evidence stated (
measured, n=137,210 domainsvsvendor claim, unverified). - Every skill documents its own limits, including what it genuinely cannot detect.
- Nothing requires an API key, an MCP server, or a subscription.
The four skills
| Skill | The question it answers |
|---|---|
seo-data-contract |
Is this data fresh and trustworthy enough to act on? |
aeo-bot-access-audit |
Can AI bots actually fetch this site? |
aeo-citability-audit |
Would this page survive being extracted and cited? |
information-gain-analysis |
What does this page know that the SERP does not? |
Install into Claude Code, Codex, Cursor, OpenCode, Grok Build, Gemini CLI, Cline, Hermes, OpenClaw and ~75 other hosts:
npx skills add Pauthead/seo-aeo-agent-skillsThe one that fills a real gap
seo-data-contract exists because of the most-cited structural failure in agentic SEO — the workflow that reports success while acting on data it can no longer refresh:
"At analook dot com, a GSC OAuth token expired and the agent continued using cached Search Console data for two weeks... The workflow can run successfully against an input that should no longer be trusted."
— r/AiAutomations, 2026-09-07
It forces three separate questions before any analysis: can it authenticate now, when did a retrieval last succeed, and what is the newest date represented inside the data — not the fetch time. The third is the one everyone misses.
No competitor repo has this.
What this deliberately does not do
Documented with evidence in the README, because those are the tactics currently being sold as 2026 best practice:
llms.txtis not a traffic or citation lever. Six independent 2026 measurements, every one negative or null. 97% of llms.txt files received zero requests across 137,210 domains (Ahrefs). A 15-day origin log saw zero requests from any of 22 crawler tokens. Google at Search Central Live: "There is no benefit to creating a llms.txt file for SEO." Shepard scores it 2.0/10, the lowest of 23 factors.- FAQPage schema is not a GEO tactic.
- No automated forum or Reddit posting. Reddit catches 25,000 spammy posts/day specifically to stop brands gaming AI recommendations, and banned 4 subreddits over GEO upvote automation. Measure, never post.
- No AI-visibility promise under 60 days.
- No claim that GEO is a separate discipline. ~80% of GEO is good, fundamental SEO (Moser, via Digiday, 2026-03-10).
Quality gates
Two validation gates run in CI on every push:
validate_skill_inventory.py— Agent Skills spec conformance, frontmatter restrictions, body budget, internal link resolution. Refuses to report PASS when it checks nothing.reference_freshness.py— two thresholds: 90 days is a review trigger (the finding may have been superseded), 365 days fails.
An independent adversarial audit ran before this release. It found one critical defect — an unreachable safety override in the freshness classifier that would have classified a dead-token export as analysable instead of refusing it — plus two high-severity false-pass bugs in the validator itself. All are fixed and regression-tested; the report is in docs/AUDIT-REPORT.md.
License
Apache-2.0. Optional paid data (DataForSEO) is documented in the README but never required by any skill.