Summary
The served robots.txt disallows the major AI crawlers — including ClaudeBot and GPTBot. This directly contradicts roadmap item 1.5, which requires the opposite:
| 1.5 | llms.txt at root summarizing the site for AI crawlers; ensure GPTBot/ClaudeBot/PerplexityBot not blocked in robots.txt | none | File fetchable; AI crawlers appear in CF analytics |
— docs/seo/IMPLEMENTATION-ROADMAP.md:14
It is failing silently: nothing in this repo is wrong, so no build, check, or review would ever catch it.
Evidence
public/robots.txt and dist/robots.txt are both correct and identical (4 lines):
User-agent: *
Allow: /
Sitemap: https://keeltrading.com/sitemap-index.xml
But curl https://keeltrading.com/robots.txt returns 65 lines. Cloudflare prepends a # BEGIN Cloudflare Managed content section at the edge, containing:
User-agent: *
Content-Signal: search=yes,ai-train=no,use=reference
Allow: /
User-agent: Amazonbot
Disallow: /
User-agent: Applebot-Extended
Disallow: /
User-agent: Bytespider
Disallow: /
User-agent: CCBot
Disallow: /
User-agent: ClaudeBot
Disallow: /
User-agent: CloudflareBrowserRenderingCrawler
Disallow: /
User-agent: Google-Extended
Disallow: /
User-agent: GPTBot
Disallow: /
User-agent: meta-externalagent
Disallow: /
Nine AI/LLM user-agents blocked, plus an ai-train=no content signal. None of it is in the repo — it is injected by a zone-level Cloudflare dashboard setting, so it cannot be overridden from the origin.
Impact
- GEO work is undercut at the root: ChatGPT, Claude, CCBot-derived corpora and Google's AI surfaces are told not to fetch the site.
llms.txt ships and serves 200, but the crawlers it exists for are disallowed from reading the pages it points at — half of 1.5 is done and the other half negates it.
Google-Extended: Disallow opts out of Gemini/AI Overviews grounding. (Normal Google Search indexing is unaffected — search=yes and User-agent: * Allow: / still stand.)
CloudflareBrowserRenderingCrawler: Disallow can also affect link-preview/unfurl rendering, which matters for the outreach in docs/seo/LINK-ACQUISITION.md.
Root cause
Cloudflare's managed robots.txt / AI-crawler-blocking feature is enabled on the keeltrading.com zone. This is a dashboard toggle, not code — it was very likely on by default rather than chosen.
Fix
Manual, dashboard-only (cannot be done from this repo):
- Cloudflare dashboard → the
keeltrading.com zone
- Find the AI crawler control setting — the one that injects managed
robots.txt content (Cloudflare has shipped this under AI Crawl Control, previously AI Audit / "Block AI bots"; the label has moved across releases, so look for the setting that mentions managed robots.txt or content signals)
- Turn off the managed AI-bot block for the zone
- Decide the Content Signals policy deliberately.
ai-train=no is a defensible stance for an open-source project; ai-input / search should stay permissive so answer engines can cite the site.
Falsifiability
curl -s https://keeltrading.com/robots.txt | grep -A1 -E '^User-agent: (ClaudeBot|GPTBot|Google-Extended)'
Passes when no AI crawler is followed by Disallow: /. Confirm afterwards that AI crawlers appear in Cloudflare analytics, per 1.5's own check.
Regression guard
Because this failed silently from outside the repo, a live-site check is being added so it cannot regress unnoticed. See linked PR.
Summary
The served
robots.txtdisallows the major AI crawlers — includingClaudeBotandGPTBot. This directly contradicts roadmap item 1.5, which requires the opposite:—
docs/seo/IMPLEMENTATION-ROADMAP.md:14It is failing silently: nothing in this repo is wrong, so no build, check, or review would ever catch it.
Evidence
public/robots.txtanddist/robots.txtare both correct and identical (4 lines):But
curl https://keeltrading.com/robots.txtreturns 65 lines. Cloudflare prepends a# BEGIN Cloudflare Managed contentsection at the edge, containing:Nine AI/LLM user-agents blocked, plus an
ai-train=nocontent signal. None of it is in the repo — it is injected by a zone-level Cloudflare dashboard setting, so it cannot be overridden from the origin.Impact
llms.txtships and serves 200, but the crawlers it exists for are disallowed from reading the pages it points at — half of 1.5 is done and the other half negates it.Google-Extended: Disallowopts out of Gemini/AI Overviews grounding. (Normal Google Search indexing is unaffected —search=yesandUser-agent: * Allow: /still stand.)CloudflareBrowserRenderingCrawler: Disallowcan also affect link-preview/unfurl rendering, which matters for the outreach indocs/seo/LINK-ACQUISITION.md.Root cause
Cloudflare's managed robots.txt / AI-crawler-blocking feature is enabled on the
keeltrading.comzone. This is a dashboard toggle, not code — it was very likely on by default rather than chosen.Fix
Manual, dashboard-only (cannot be done from this repo):
keeltrading.comzonerobots.txtcontent (Cloudflare has shipped this under AI Crawl Control, previously AI Audit / "Block AI bots"; the label has moved across releases, so look for the setting that mentions managedrobots.txtor content signals)ai-train=nois a defensible stance for an open-source project;ai-input/searchshould stay permissive so answer engines can cite the site.Falsifiability
Passes when no AI crawler is followed by
Disallow: /. Confirm afterwards that AI crawlers appear in Cloudflare analytics, per 1.5's own check.Regression guard
Because this failed silently from outside the repo, a live-site check is being added so it cannot regress unnoticed. See linked PR.