AI Content Discovery
Fixes Category 1 (AI Content Discovery, 30% weight) issues from IsAgentReady.com. This category checks whether AI systems can find, crawl, and understand your website's content. It evaluates 7 checkpoints worth 100 points total.
When to Use
- Fixing robots.txt issues (missing, wrong content type, blocking bots)
- Adding or updating AI crawler directives (GPTBot, ClaudeBot, etc.)
- Creating or fixing XML sitemaps
- Creating llms.txt or llms-full.txt files
- Removing restrictive meta robots tags (noindex, noai)
- Fixing WAF/CDN bot blocking issues
- Adding content freshness signals (dateModified, article:modified_time)
- Any task to "improve AI discoverability" or "make site crawlable by AI"
When NOT to Use
- Adding structured data / JSON-LD (use
structured-data skill)
- Fixing semantic HTML or heading hierarchy (use
content-semantics skill)
- Setting up agent protocols like WebMCP or A2A (use
agent-protocols skill)
- Configuring security headers like CSP or HSTS (use
security-trust skill)
Checkpoints Overview
| ID |
Checkpoint |
Max Points |
What It Tests |
| 1.8 |
HTTP bot accessibility |
15 |
Page returns HTTP 200-299 (not 401/403 from WAF) |
| 1.1 |
robots.txt present |
15 |
/robots.txt returns 200 with text/plain Content-Type |
| 1.2 |
AI crawler directives |
15 |
Allow/Disallow rules for 13 AI user-agents in robots.txt |
| 1.3 |
XML Sitemap |
15 |
Valid XML sitemap with <urlset> or <sitemapindex> |
| 1.4 |
llms.txt |
15 |
/llms.txt with markdown heading + URLs; bonus for /llms-full.txt |
| 1.5 |
Meta robots / X-Robots-Tag |
15 |
No restrictive directives (noindex, noai, noimageai) |
| 1.6 |
Content freshness signals |
10 |
dateModified in JSON-LD, article:modified_time, or Last-Modified |
Checkpoint 1.8: HTTP Bot Accessibility (15 pts)
What passes: HTTP status 200-299.
What fails: HTTP 401 or 403 (WAF/CDN blocking bots).
Fix Workflow
Diagnose — test with an AI crawler user-agent:
curl -sI -A "Mozilla/5.0 (compatible; GPTBot/1.0)" https://example.com/
curl -sI -A "Mozilla/5.0 (compatible; ClaudeBot/1.0)" https://example.com/
If blocked by Cloudflare — create a WAF exception:
# Dashboard -> Security -> WAF -> Custom Rules -> Create rule:
# Field: User Agent | Operator: contains | Value: GPTBot
# Action: Skip remaining rules
#
# Repeat for ClaudeBot, Amazonbot, ChatGPT-User, etc.
If blocked by Nginx rate limiting — allow AI user-agents:
map $http_user_agent $is_ai_bot {
default 0;
"~*GPTBot" 1;
"~*ClaudeBot" 1;
"~*Amazonbot" 1;
"~*ChatGPT" 1;
}
# Skip rate limiting for AI bots
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
server {
location / {
if ($is_ai_bot) {
# Allow AI bots through without rate limits
}
limit_req zone=general burst=20;
}
}
If blocked by Apache — allow in .htaccess:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (GPTBot|ClaudeBot|Amazonbot) [NC]
RewriteRule ^ - [L]
Verify — re-test with curl to confirm 200 response.
Checkpoint 1.1: robots.txt Present (15 pts)
What passes: /robots.txt returns HTTP 200 with Content-Type: text/plain.
What fails: Missing file (404), HTML error page served, or wrong Content-Type.
Fix Workflow
Check current state:
curl -sI https://example.com/robots.txt | head -20
Create /robots.txt at your web root:
User-agent: *
Allow: /
User-agent: GPTBot
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: Google-Extended
Allow: /
Sitemap: https://example.com/sitemap.xml
Ensure correct Content-Type — must return text/plain. Nginx: default_type text/plain; in the location block. Apache: ForceType text/plain in a <Files> directive.
Verify:
curl -sI https://example.com/robots.txt | grep -i content-type
# Expected: Content-Type: text/plain
See references/robots-txt-guide.md for complete robots.txt syntax and rules.
Checkpoint 1.2: AI Crawler Directives (15 pts)
What passes: All 13 AI crawlers explicitly allowed (15 pts), or some allowed with none blocked (15 pts), or wildcard Allow: / with none blocked (15 pts).
Partial credit: No AI crawlers mentioned but default allow applies (10 pts), or mixed policies with some blocked (7 pts).
What fails: All AI crawlers explicitly disallowed (0 pts).
The 13 AI User-Agents
| User-Agent |
Owner |
Purpose |
| GPTBot |
OpenAI |
Training data crawling |
| ChatGPT-User |
OpenAI |
Real-time browsing in ChatGPT |
| OAI-SearchBot |
OpenAI |
SearchGPT results |
| ClaudeBot |
Anthropic |
Training data crawling |
| Claude-User |
Anthropic |
Real-time browsing in Claude |
| Claude-SearchBot |
Anthropic |
Claude search results |
| Google-Extended |
Google |
Gemini AI training |
| Amazonbot |
Amazon |
Alexa/AI training |
| Bytespider |
ByteDance |
TikTok/AI training |
| CCBot |
Common Crawl |
Open dataset crawling |
| PerplexityBot |
Perplexity |
AI search results |
| Applebot-Extended |
Apple |
Apple Intelligence training |
| meta-externalagent |
Meta |
Meta AI training |
Fix Workflow
Check current directives:
curl -s https://example.com/robots.txt
Add explicit Allow directives for each AI crawler to your robots.txt:
# AI Crawlers — explicitly allow (one block per agent)
User-agent: GPTBot
Allow: /
User-agent: ChatGPT-User
Allow: /
User-agent: OAI-SearchBot
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: Claude-User
Allow: /
User-agent: Claude-SearchBot
Allow: /
User-agent: Google-Extended
Allow: /
User-agent: Amazonbot
Allow: /
User-agent: Bytespider
Allow: /
User-agent: CCBot
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: Applebot-Extended
Allow: /
User-agent: meta-externalagent
Allow: /
If you want to allow all crawlers — a simple wildcard also works:
User-agent: *
Allow: /
If you want selective control — allow some, block others:
# Allow search-oriented AI crawlers
User-agent: ChatGPT-User
Allow: /
User-agent: PerplexityBot
Allow: /
# Block training-oriented crawlers
User-agent: GPTBot
Disallow: /
User-agent: CCBot
Disallow: /
See references/robots-txt-guide.md for full syntax and AI user-agent details.
Checkpoint 1.3: XML Sitemap (15 pts)
What passes: Valid XML sitemap found at a discoverable URL with <urlset> or <sitemapindex>.
What fails: No sitemap found, or sitemap is not valid XML.
The scanner checks these locations in order:
- URLs from
Sitemap: directives in robots.txt
/sitemap.xml
/sitemap_index.xml
Fix Workflow
Check if a sitemap exists:
curl -sI https://example.com/sitemap.xml | head -5
curl -s https://example.com/robots.txt | grep -i sitemap
Create /sitemap.xml:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://example.com/</loc>
<lastmod>2025-01-15</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://example.com/about</loc>
<lastmod>2025-01-10</lastmod>
</url>
</urlset>
For large sites, use a sitemap index:
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://example.com/sitemap-pages.xml</loc>
<lastmod>2025-01-15</lastmod>
</sitemap>
<sitemap>
<loc>https://example.com/sitemap-blog.xml</loc>
<lastmod>2025-01-14</lastmod>
</sitemap>
</sitemapindex>
Add the Sitemap directive to robots.txt:
Sitemap: https://example.com/sitemap.xml
Verify the sitemap is valid XML:
curl -s https://example.com/sitemap.xml | head -5
# Should start with <?xml and contain <urlset or <sitemapindex
Framework-Specific Generation
Most frameworks have sitemap plugins — prefer automated generation over manual files:
- WordPress: Yoast SEO or built-in (
/wp-sitemap.xml)
- Next.js:
next-sitemap package or App Router sitemap.ts
- Rails:
sitemap_generator gem
- Django:
django.contrib.sitemaps
- Laravel:
spatie/laravel-sitemap
- Phoenix/Elixir: Custom plug or controller route
Checkpoint 1.4: llms.txt (15 pts)
What passes: /llms.txt returns HTTP 200 with text/plain or text/markdown, starts with a # heading, and contains at least one URL. Bonus: /llms-full.txt companion found.
What fails: Missing file, wrong content type, no heading, or no URLs.
Fix Workflow
Create /llms.txt — a markdown-formatted overview of your site for LLMs:
# Your Company Name
> Brief description of what your company does.
## Docs
- [Getting Started](https://example.com/docs/getting-started)
- [API Reference](https://example.com/docs/api)
- [Tutorials](https://example.com/docs/tutorials)
## Products
- [Product Overview](https://example.com/products)
- [Pricing](https://example.com/pricing)
## Optional
- [Blog](https://example.com/blog)
- [Changelog](https://example.com/changelog)
- [Status Page](https://status.example.com)
Optionally create /llms-full.txt — expanded version with more detail:
# Your Company Name
> Detailed description of your company, products, and services.
## Getting Started
Full getting started content here, not just a link.
Include setup instructions, prerequisites, etc.
## API Reference
Inline API documentation or detailed summaries of endpoints.
Ensure correct Content-Type — must be text/plain or text/markdown. Same server config as robots.txt (see checkpoint 1.1).
Verify:
curl -sI https://example.com/llms.txt | grep -i content-type
curl -s https://example.com/llms.txt | head -5
# First line must start with #
# Must contain at least one https:// URL
See references/llms-txt-guide.md for the full specification and examples for different site types.
Checkpoint 1.5: Meta Robots / X-Robots-Tag (15 pts)
What passes: No restrictive directives found (15 pts).
Partial credit: Restrictive directives other than noindex found (8 pts) — e.g., nofollow, nosnippet, noai, noimageai.
What fails: noindex directive found (0 pts).
The scanner checks both:
<meta name="robots" content="..."> in HTML
X-Robots-Tag HTTP response header
Restrictive Directives
| Directive |
Effect |
noindex |
Prevents indexing entirely (worst for AI) |
nofollow |
Prevents following links on the page |
nosnippet |
Prevents showing snippets in search results |
noai |
Signals no AI usage (some crawlers respect) |
noimageai |
Signals no AI usage of images |
Fix Workflow
Check current meta robots:
curl -s https://example.com/ | grep -i 'name="robots"'
curl -sI https://example.com/ | grep -i x-robots-tag
Remove or replace restrictive tags in your HTML <head>:
<!-- WRONG: blocks AI indexing -->
<meta name="robots" content="noindex, nofollow">
<!-- CORRECT: allows AI indexing -->
<meta name="robots" content="index, follow">
<!-- ALSO CORRECT: omit entirely (default is index, follow) -->
Remove restrictive X-Robots-Tag headers:
Nginx:
# Remove if present:
# add_header X-Robots-Tag "noindex";
# Replace with (or remove entirely):
add_header X-Robots-Tag "index, follow";
For specific AI directives — if you have noai or noimageai and want to allow AI:
<!-- Remove noai/noimageai to allow AI systems -->
<meta name="robots" content="index, follow">
Verify:
curl -s https://example.com/ | grep -i 'name="robots"'
# Should show: content="index, follow" or no meta robots tag at all
Checkpoint 1.6: Content Freshness Signals (10 pts)
What passes: dateModified in JSON-LD or article:modified_time meta tag (10 pts).
Partial: Only datePublished, article:published_time, or <time datetime> (7 pts). Only Last-Modified header (5 pts).
What fails: No freshness signals detected (0 pts).
Why it matters: ChatGPT shows 3.2x preference for content with fresh date signals. AI systems use dates to prioritize recent, authoritative content.
Fix Workflow
Check current signals:
curl -sI https://example.com/ | grep -i last-modified
curl -s https://example.com/ | grep -iE 'dateModified|article:modified_time'
Add dateModified and datePublished to JSON-LD (best — 10 pts):
{
"@context": "https://schema.org",
"@type": "Article",
"datePublished": "2024-01-15T09:00:00Z",
"dateModified": "2024-03-01T14:30:00Z"
}
Add Open Graph meta tags (also 10 pts):
<meta property="article:published_time" content="2024-01-15T09:00:00Z">
<meta property="article:modified_time" content="2024-03-01T14:30:00Z">
Last-Modified HTTP header scores only 5 pts — use JSON-LD or meta tags for full credit.
<time datetime> element scores 7 pts as a fallback:
<time datetime="2024-03-01T14:30:00Z">March 1, 2024</time>
Verify:
curl -s https://example.com/ | grep -iE 'dateModified|article:modified_time'
Key Gotchas
- robots.txt returns HTML — 404 page served instead of a real robots.txt file
- Wrong Content-Type — robots.txt or llms.txt served as
text/html instead of text/plain
- Wildcard Disallow blocks everything —
User-agent: * / Disallow: / blocks all AI crawlers
- Sitemap is not valid XML — JSON or HTML page served at
/sitemap.xml
- llms.txt has no URLs — File exists but is just plain text without any links
- noai vs noindex confusion —
noai costs 7 points, noindex costs all 15
- Last-Modified header only — scores 5/10; add
dateModified in JSON-LD for full 10 points
See references/gotchas.md for detailed correct vs incorrect examples of each.
References
- robots-txt-guide.md — Complete robots.txt syntax, AI user-agents, and testing
- llms-txt-guide.md — llms.txt specification, content structure, and site-type examples
- gotchas.md — Common pitfalls with wrong vs correct examples
Instructions
- Identify failing checkpoints from the IsAgentReady.com scan results
- Follow the fix workflow for each failing checkpoint above
- Apply the code examples — adapt URLs, domain names, and content to the user's site
- Verify each fix using the curl commands provided in each workflow
- Re-scan at isagentready.com to confirm improvements
If $ARGUMENTS is provided, interpret it as the URL to fix or the specific checkpoint to address.
1---2name: ai-content-discovery3description: Fixes AI content discovery issues — creates and optimizes robots.txt, AI crawler directives, XML sitemaps, llms.txt, meta robots tags, and content freshness signals so AI systems can find, crawl, and understand website content. Use when asked to "fix robots.txt", "add llms.txt", "create a sitemap", "allow AI crawlers", "fix AI discoverability", "improve AI content discovery score", "make site crawlable by AI", "add dateModified", "fix content freshness", or any robots.txt, sitemap, or llms.txt task.4---56# AI Content Discovery78Fixes Category 1 (AI Content Discovery, 30% weight) issues from [IsAgentReady.com](https://isagentready.com). This category checks whether AI systems can find, crawl, and understand your website's content. It evaluates 7 checkpoints worth 100 points total.910## When to Use1112- Fixing robots.txt issues (missing, wrong content type, blocking bots)13- Adding or updating AI crawler directives (GPTBot, ClaudeBot, etc.)14- Creating or fixing XML sitemaps15- Creating llms.txt or llms-full.txt files16- Removing restrictive meta robots tags (noindex, noai)17- Fixing WAF/CDN bot blocking issues18- Adding content freshness signals (dateModified, article:modified_time)19- Any task to "improve AI discoverability" or "make site crawlable by AI"2021## When NOT to Use2223- Adding structured data / JSON-LD (use `structured-data` skill)24- Fixing semantic HTML or heading hierarchy (use `content-semantics` skill)25- Setting up agent protocols like WebMCP or A2A (use `agent-protocols` skill)26- Configuring security headers like CSP or HSTS (use `security-trust` skill)2728## Checkpoints Overview2930| ID | Checkpoint | Max Points | What It Tests |31|-----|-----------------------------|------------|------------------------------------------------------------------|32| 1.8 | HTTP bot accessibility | 15 | Page returns HTTP 200-299 (not 401/403 from WAF) |33| 1.1 | robots.txt present | 15 | /robots.txt returns 200 with text/plain Content-Type |34| 1.2 | AI crawler directives | 15 | Allow/Disallow rules for 13 AI user-agents in robots.txt |35| 1.3 | XML Sitemap | 15 | Valid XML sitemap with `<urlset>` or `<sitemapindex>` |36| 1.4 | llms.txt | 15 | /llms.txt with markdown heading + URLs; bonus for /llms-full.txt|37| 1.5 | Meta robots / X-Robots-Tag | 15 | No restrictive directives (noindex, noai, noimageai) |38| 1.6 | Content freshness signals | 10 | dateModified in JSON-LD, article:modified_time, or Last-Modified|3940## Checkpoint 1.8: HTTP Bot Accessibility (15 pts)4142**What passes:** HTTP status 200-299.43**What fails:** HTTP 401 or 403 (WAF/CDN blocking bots).4445### Fix Workflow46471. **Diagnose** — test with an AI crawler user-agent:48 ```bash49 curl -sI -A "Mozilla/5.0 (compatible; GPTBot/1.0)" https://example.com/50 curl -sI -A "Mozilla/5.0 (compatible; ClaudeBot/1.0)" https://example.com/51 ```52532. **If blocked by Cloudflare** — create a WAF exception:54 ```55 # Dashboard -> Security -> WAF -> Custom Rules -> Create rule:56 # Field: User Agent | Operator: contains | Value: GPTBot57 # Action: Skip remaining rules58 #59 # Repeat for ClaudeBot, Amazonbot, ChatGPT-User, etc.60 ```61623. **If blocked by Nginx rate limiting** — allow AI user-agents:63 ```nginx64 map $http_user_agent $is_ai_bot {65 default 0;66 "~*GPTBot" 1;67 "~*ClaudeBot" 1;68 "~*Amazonbot" 1;69 "~*ChatGPT" 1;70 }7172 # Skip rate limiting for AI bots73 limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;7475 server {76 location / {77 if ($is_ai_bot) {78 # Allow AI bots through without rate limits79 }80 limit_req zone=general burst=20;81 }82 }83 ```84854. **If blocked by Apache** — allow in `.htaccess`:86 ```apache87 RewriteEngine On88 RewriteCond %{HTTP_USER_AGENT} (GPTBot|ClaudeBot|Amazonbot) [NC]89 RewriteRule ^ - [L]90 ```91925. **Verify** — re-test with curl to confirm 200 response.9394---9596## Checkpoint 1.1: robots.txt Present (15 pts)9798**What passes:** `/robots.txt` returns HTTP 200 with `Content-Type: text/plain`.99**What fails:** Missing file (404), HTML error page served, or wrong Content-Type.100101### Fix Workflow1021031. **Check current state:**104 ```bash105 curl -sI https://example.com/robots.txt | head -20106 ```1071082. **Create `/robots.txt`** at your web root:109 ```110 User-agent: *111 Allow: /112 User-agent: GPTBot113 Allow: /114 User-agent: ClaudeBot115 Allow: /116 User-agent: Google-Extended117 Allow: /118 Sitemap: https://example.com/sitemap.xml119 ```1201213. **Ensure correct Content-Type** — must return `text/plain`. Nginx: `default_type text/plain;` in the location block. Apache: `ForceType text/plain` in a `<Files>` directive.1221234. **Verify:**124 ```bash125 curl -sI https://example.com/robots.txt | grep -i content-type126 # Expected: Content-Type: text/plain127 ```128129> See [references/robots-txt-guide.md](references/robots-txt-guide.md) for complete robots.txt syntax and rules.130131---132133## Checkpoint 1.2: AI Crawler Directives (15 pts)134135**What passes:** All 13 AI crawlers explicitly allowed (15 pts), or some allowed with none blocked (15 pts), or wildcard `Allow: /` with none blocked (15 pts).136**Partial credit:** No AI crawlers mentioned but default allow applies (10 pts), or mixed policies with some blocked (7 pts).137**What fails:** All AI crawlers explicitly disallowed (0 pts).138139### The 13 AI User-Agents140141| User-Agent | Owner | Purpose |142|---------------------|----------------|--------------------------------|143| GPTBot | OpenAI | Training data crawling |144| ChatGPT-User | OpenAI | Real-time browsing in ChatGPT |145| OAI-SearchBot | OpenAI | SearchGPT results |146| ClaudeBot | Anthropic | Training data crawling |147| Claude-User | Anthropic | Real-time browsing in Claude |148| Claude-SearchBot | Anthropic | Claude search results |149| Google-Extended | Google | Gemini AI training |150| Amazonbot | Amazon | Alexa/AI training |151| Bytespider | ByteDance | TikTok/AI training |152| CCBot | Common Crawl | Open dataset crawling |153| PerplexityBot | Perplexity | AI search results |154| Applebot-Extended | Apple | Apple Intelligence training |155| meta-externalagent | Meta | Meta AI training |156157### Fix Workflow1581591. **Check current directives:**160 ```bash161 curl -s https://example.com/robots.txt162 ```1631642. **Add explicit Allow directives** for each AI crawler to your robots.txt:165 ```166 # AI Crawlers — explicitly allow (one block per agent)167 User-agent: GPTBot168 Allow: /169 User-agent: ChatGPT-User170 Allow: /171 User-agent: OAI-SearchBot172 Allow: /173 User-agent: ClaudeBot174 Allow: /175 User-agent: Claude-User176 Allow: /177 User-agent: Claude-SearchBot178 Allow: /179 User-agent: Google-Extended180 Allow: /181 User-agent: Amazonbot182 Allow: /183 User-agent: Bytespider184 Allow: /185 User-agent: CCBot186 Allow: /187 User-agent: PerplexityBot188 Allow: /189 User-agent: Applebot-Extended190 Allow: /191 User-agent: meta-externalagent192 Allow: /193 ```1941953. **If you want to allow all crawlers** — a simple wildcard also works:196 ```197 User-agent: *198 Allow: /199 ```2002014. **If you want selective control** — allow some, block others:202 ```203 # Allow search-oriented AI crawlers204 User-agent: ChatGPT-User205 Allow: /206207 User-agent: PerplexityBot208 Allow: /209210 # Block training-oriented crawlers211 User-agent: GPTBot212 Disallow: /213214 User-agent: CCBot215 Disallow: /216 ```217218> See [references/robots-txt-guide.md](references/robots-txt-guide.md) for full syntax and AI user-agent details.219220---221222## Checkpoint 1.3: XML Sitemap (15 pts)223224**What passes:** Valid XML sitemap found at a discoverable URL with `<urlset>` or `<sitemapindex>`.225**What fails:** No sitemap found, or sitemap is not valid XML.226227The scanner checks these locations in order:2281. URLs from `Sitemap:` directives in robots.txt2292. `/sitemap.xml`2303. `/sitemap_index.xml`231232### Fix Workflow2332341. **Check if a sitemap exists:**235 ```bash236 curl -sI https://example.com/sitemap.xml | head -5237 curl -s https://example.com/robots.txt | grep -i sitemap238 ```2392402. **Create `/sitemap.xml`:**241 ```xml242 <?xml version="1.0" encoding="UTF-8"?>243 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">244 <url>245 <loc>https://example.com/</loc>246 <lastmod>2025-01-15</lastmod>247 <changefreq>weekly</changefreq>248 <priority>1.0</priority>249 </url>250 <url>251 <loc>https://example.com/about</loc>252 <lastmod>2025-01-10</lastmod>253 </url>254 </urlset>255 ```2562573. **For large sites, use a sitemap index:**258 ```xml259 <?xml version="1.0" encoding="UTF-8"?>260 <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">261 <sitemap>262 <loc>https://example.com/sitemap-pages.xml</loc>263 <lastmod>2025-01-15</lastmod>264 </sitemap>265 <sitemap>266 <loc>https://example.com/sitemap-blog.xml</loc>267 <lastmod>2025-01-14</lastmod>268 </sitemap>269 </sitemapindex>270 ```2712724. **Add the Sitemap directive to robots.txt:**273 ```274 Sitemap: https://example.com/sitemap.xml275 ```2762775. **Verify the sitemap is valid XML:**278 ```bash279 curl -s https://example.com/sitemap.xml | head -5280 # Should start with <?xml and contain <urlset or <sitemapindex281 ```282283### Framework-Specific Generation284285Most frameworks have sitemap plugins — prefer automated generation over manual files:286287- **WordPress:** Yoast SEO or built-in (`/wp-sitemap.xml`)288- **Next.js:** `next-sitemap` package or App Router `sitemap.ts`289- **Rails:** `sitemap_generator` gem290- **Django:** `django.contrib.sitemaps`291- **Laravel:** `spatie/laravel-sitemap`292- **Phoenix/Elixir:** Custom plug or controller route293294---295296## Checkpoint 1.4: llms.txt (15 pts)297298**What passes:** `/llms.txt` returns HTTP 200 with `text/plain` or `text/markdown`, starts with a `#` heading, and contains at least one URL. Bonus: `/llms-full.txt` companion found.299**What fails:** Missing file, wrong content type, no heading, or no URLs.300301### Fix Workflow3023031. **Create `/llms.txt`** — a markdown-formatted overview of your site for LLMs:304 ```markdown305 # Your Company Name306307 > Brief description of what your company does.308309 ## Docs310 - [Getting Started](https://example.com/docs/getting-started)311 - [API Reference](https://example.com/docs/api)312 - [Tutorials](https://example.com/docs/tutorials)313314 ## Products315 - [Product Overview](https://example.com/products)316 - [Pricing](https://example.com/pricing)317318 ## Optional319 - [Blog](https://example.com/blog)320 - [Changelog](https://example.com/changelog)321 - [Status Page](https://status.example.com)322 ```3233242. **Optionally create `/llms-full.txt`** — expanded version with more detail:325 ```markdown326 # Your Company Name327328 > Detailed description of your company, products, and services.329330 ## Getting Started331332 Full getting started content here, not just a link.333 Include setup instructions, prerequisites, etc.334335 ## API Reference336337 Inline API documentation or detailed summaries of endpoints.338 ```3393403. **Ensure correct Content-Type** — must be `text/plain` or `text/markdown`. Same server config as robots.txt (see checkpoint 1.1).3413424. **Verify:**343 ```bash344 curl -sI https://example.com/llms.txt | grep -i content-type345 curl -s https://example.com/llms.txt | head -5346 # First line must start with #347 # Must contain at least one https:// URL348 ```349350> See [references/llms-txt-guide.md](references/llms-txt-guide.md) for the full specification and examples for different site types.351352---353354## Checkpoint 1.5: Meta Robots / X-Robots-Tag (15 pts)355356**What passes:** No restrictive directives found (15 pts).357**Partial credit:** Restrictive directives other than noindex found (8 pts) — e.g., nofollow, nosnippet, noai, noimageai.358**What fails:** `noindex` directive found (0 pts).359360The scanner checks both:361- `<meta name="robots" content="...">` in HTML362- `X-Robots-Tag` HTTP response header363364### Restrictive Directives365366| Directive | Effect |367|-------------|--------------------------------------------|368| `noindex` | Prevents indexing entirely (worst for AI) |369| `nofollow` | Prevents following links on the page |370| `nosnippet` | Prevents showing snippets in search results |371| `noai` | Signals no AI usage (some crawlers respect) |372| `noimageai` | Signals no AI usage of images |373374### Fix Workflow3753761. **Check current meta robots:**377 ```bash378 curl -s https://example.com/ | grep -i 'name="robots"'379 curl -sI https://example.com/ | grep -i x-robots-tag380 ```3813822. **Remove or replace restrictive tags** in your HTML `<head>`:383 ```html384 <!-- WRONG: blocks AI indexing -->385 <meta name="robots" content="noindex, nofollow">386387 <!-- CORRECT: allows AI indexing -->388 <meta name="robots" content="index, follow">389390 <!-- ALSO CORRECT: omit entirely (default is index, follow) -->391 ```3923933. **Remove restrictive X-Robots-Tag headers:**394395 **Nginx:**396 ```nginx397 # Remove if present:398 # add_header X-Robots-Tag "noindex";399400 # Replace with (or remove entirely):401 add_header X-Robots-Tag "index, follow";402 ```4034044. **For specific AI directives** — if you have `noai` or `noimageai` and want to allow AI:405 ```html406 <!-- Remove noai/noimageai to allow AI systems -->407 <meta name="robots" content="index, follow">408 ```4094105. **Verify:**411 ```bash412 curl -s https://example.com/ | grep -i 'name="robots"'413 # Should show: content="index, follow" or no meta robots tag at all414 ```415416---417418## Checkpoint 1.6: Content Freshness Signals (10 pts)419420**What passes:** `dateModified` in JSON-LD or `article:modified_time` meta tag (10 pts).421**Partial:** Only `datePublished`, `article:published_time`, or `<time datetime>` (7 pts). Only `Last-Modified` header (5 pts).422**What fails:** No freshness signals detected (0 pts).423424**Why it matters:** ChatGPT shows 3.2x preference for content with fresh date signals. AI systems use dates to prioritize recent, authoritative content.425426### Fix Workflow4274281. **Check current signals:**429 ```bash430 curl -sI https://example.com/ | grep -i last-modified431 curl -s https://example.com/ | grep -iE 'dateModified|article:modified_time'432 ```4334342. **Add `dateModified` and `datePublished` to JSON-LD** (best — 10 pts):435 ```json436 {437 "@context": "https://schema.org",438 "@type": "Article",439 "datePublished": "2024-01-15T09:00:00Z",440 "dateModified": "2024-03-01T14:30:00Z"441 }442 ```4434443. **Add Open Graph meta tags** (also 10 pts):445 ```html446 <meta property="article:published_time" content="2024-01-15T09:00:00Z">447 <meta property="article:modified_time" content="2024-03-01T14:30:00Z">448 ```4494504. **`Last-Modified` HTTP header** scores only 5 pts — use JSON-LD or meta tags for full credit.4514525. **`<time datetime>` element** scores 7 pts as a fallback:453 ```html454 <time datetime="2024-03-01T14:30:00Z">March 1, 2024</time>455 ```4564576. **Verify:**458 ```bash459 curl -s https://example.com/ | grep -iE 'dateModified|article:modified_time'460 ```461462---463464## Key Gotchas4654661. **robots.txt returns HTML** — 404 page served instead of a real robots.txt file4672. **Wrong Content-Type** — robots.txt or llms.txt served as `text/html` instead of `text/plain`4683. **Wildcard Disallow blocks everything** — `User-agent: * / Disallow: /` blocks all AI crawlers4694. **Sitemap is not valid XML** — JSON or HTML page served at `/sitemap.xml`4705. **llms.txt has no URLs** — File exists but is just plain text without any links4716. **noai vs noindex confusion** — `noai` costs 7 points, `noindex` costs all 154727. **Last-Modified header only** — scores 5/10; add `dateModified` in JSON-LD for full 10 points473474> See [references/gotchas.md](references/gotchas.md) for detailed correct vs incorrect examples of each.475476## References477478- [robots-txt-guide.md](references/robots-txt-guide.md) — Complete robots.txt syntax, AI user-agents, and testing479- [llms-txt-guide.md](references/llms-txt-guide.md) — llms.txt specification, content structure, and site-type examples480- [gotchas.md](references/gotchas.md) — Common pitfalls with wrong vs correct examples481482## Instructions4834841. **Identify failing checkpoints** from the IsAgentReady.com scan results4852. **Follow the fix workflow** for each failing checkpoint above4863. **Apply the code examples** — adapt URLs, domain names, and content to the user's site4874. **Verify each fix** using the curl commands provided in each workflow4885. **Re-scan** at [isagentready.com](https://isagentready.com) to confirm improvements489490If `$ARGUMENTS` is provided, interpret it as the URL to fix or the specific checkpoint to address.