Optimize websites, docs, and product surfaces for agent discoverability and operator UX. Use when working on agent SEO/AEO/GEO, crawl policy, markdown or JSON projections, llms.txt, sitemap.md, AGENTS.md guidance, content negotiation, accessibility for browser agents, or any request to make a site easier for pi, OpenCode, Claude Code, ChatGPT, Perplexity, or other agent harnesses to find and use.
69
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
This skill is about an opinionated blend of traditional SEO, static truth in the initial response, and UX ergonomics for agents and operators.
Don't reduce this to "AI SEO".
If a page can't be crawled, cited, parsed, navigated, or actioned by an agent harness, it is broken in a way normal SEO reports won't fully show.
Treat agent discoverability as four stacked layers:
If layer 1 is broken, you won't get found. If layer 2 is broken, agents won't extract the truth. If layer 3 is broken, harnesses waste tokens scraping HTML. If layer 4 is broken, operators and browser agents hit dead ends.
Use this skill when the task mentions:
Before fancy protocols, verify:
robots.txt allows the crawlers you actually wantnoindexUseful mental model from the audit side:
The important facts must survive:
curlDon't hide core facts behind:
divs pretending to be controlsStatic rendering is a principle, not a framework fetish.
A static shell with small dynamic holes is fine. A blank SPA shell is dogshit for both search and agents.
Give the same resource multiple machine-friendly shapes:
text/htmltext/markdownapplication/jsonllms.txt, index text) → text/plainThe rule is projection, not duplication.
Do not maintain three separate truths for HTML, markdown, and JSON. Project them from one canonical content source.
llms.txt is a hint surface, not a ranking hackUse llms.txt or similar text hints as:
Do not claim it boosts ranking by itself. Google has been explicit: AI discovery does not require special AI-only markup.
For coding-agent surfaces, persistent repo context matters more than wishful tool invocation.
Vercel's evals are useful here:
AGENTS.md / repo-instruction context won for broad, always-on guidanceUse:
That split matters for pi, OpenCode, and Claude Code.
Browser agents and automation stacks lean on the accessibility tree.
Prefer:
<a> links with href<button> elementsautocomplete where data entry mattersaria-expanded, role=status, aria-live)If Playwright can't find it by role or label, an agent harness will likely struggle too.
An operator using an agent harness should not need to reverse-engineer your product.
Good patterns:
next_actions / affordances)/api, /sitemap.md, etc.)Bad patterns:
When you need concrete evidence, start here.
apps/web/app/robots.ts
apps/web/app/sitemap.md/route.ts
.md twinsapps/web/app/llms.txt/route.ts
sitemap.md, feed.xml, and markdown accessapps/web/proxy.ts
/{slug}.md and rewrites to the markdown route handlerapps/web/app/[slug]/md/route.ts
text/markdown; charset=utf-8.md twinsapps/web/app/api/route.ts
nextActionsapps/web/app/api/search/route.ts
apps/web/components/clawmail-source-comment.tsx
apps/web/app/[slug]/page.tsx
apps/web/lib/jsonld.ts
apps/web/lib/posts.ts
apps/web/components/copy-as-prompt.tsx
apps/web/next.config.ts
cacheComponents: trueapps/web/app/[slug]/page.tsx
'use cache', cacheLife, cacheTag for fast static shells with truthful invalidationUse those as examples of the principle:
Not as a claim that Next.js is the only valid way.
curl -s https://example.com/robots.txt
curl -I -A 'OAI-SearchBot/1.3' https://example.com/
curl -I -A 'Googlebot' https://example.com/Check Search Console and Bing Webmaster Tools too.
curl -sL https://example.com/page | rg -n 'important fact|<h1>|<table>|application/ld\+json'
lynx -dump https://example.com/pageIf curl cannot see the fact, many agents will not either.
curl -I https://example.com/sitemap.md
curl -I https://example.com/page.md
curl -sS https://example.com/api | jqVerify exact MIME types:
text/markdown; charset=utf-8text/plain; charset=utf-8application/json; charset=utf-8If a markdown route returns text/html, treat it as broken.
getByRole / getByLabelTrack:
llms.txt is the magic ranking leverAsk four questions:
If any answer is no, fix that first.
That's the work.
7094ced
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.