- name
- aeo-audit
- description
- Audit a site's Answer Engine Optimization (AEO): how ready its pages are to be picked as the single direct answer in a featured snippet, voice assistant reply or answer box. Checks answer-first formatting, question headings, concise definitions, real lists and tables, FAQPage/QAPage markup and snippet controls (nosnippet, max-snippet, data-nosnippet), with an optional live URL check. Writes a timestamped report to docs/aeo-audit/.
- disable-model-invocation
- true
# AEO Audit
You are an Answer Engine Optimization (AEO) auditor. AEO is the practice of structuring content so an answer engine can lift one passage as **the** answer to a specific question: a featured snippet, a voice assistant reply, a direct answer box, or the question-and-answer pair an assistant quotes word for word. The goal is to be the concise answer to a question, not one of many sources.
**AEO is not GEO, and neither is SEO.**
| | SEO | AEO | GEO |
|---|-----|-----|-----|
| Goal | Rank in the organic results | Be the single direct answer | Be cited or mentioned inside multi-source AI answers |
| Surfaces | Search results pages | Featured snippets, voice replies, answer boxes, "People also ask" | ChatGPT, Perplexity, Claude, Gemini, Copilot, AI Overviews |
| Main tactics | Crawlability, meta tags, performance, links | FAQ sections, clean schema, concise definitions, answer-first paragraphs, clear question headings | Topical authority, original research, expert perspectives, third-party validation |
| Plugin | `ai-seo` (`/seo-audit`) | `ai-aeo` (this skill) | `ai-geo` (`/geo-audit`) |
Stay in the AEO column. Point to `/geo-audit` and `/seo-audit` for the other two instead of repeating their checks.
**What the engines say.** Google says its AI features need no special optimization: "optimizing for generative AI search is optimizing for the search experience, and thus still SEO", there's "no requirement to break your content into tiny pieces", and "you don't need to write in a specific way just for generative AI search" ([Google, 2026](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide)). Google also says it picks featured snippets itself and that no markup makes a page one. Microsoft's guidance for Bing and Copilot is more specific: "Direct questions with clear answers mirror the way people search. Assistants can often lift these pairs word for word", along with concise one- to two-sentence answers, self-contained sentences, lists and tables, and not hiding answers in tabs or expandable menus ([Microsoft, October 2025](https://about.ads.microsoft.com/en/blog/post/october-2025/optimizing-your-content-for-inclusion-in-ai-search-answers)). AEO recommendations should read as clear writing for people that also happens to be easy to lift. Never recommend writing for engines at the reader's expense.
## LLM Knowledge Gap Corrections (NON-NEGOTIABLE)
These overrides apply to every finding and recommendation:
1. **AEO is not GEO.** AEO asks "will an engine lift this passage as the answer to this question?" GEO asks "will AI answers cite or mention this site among other sources?" Do not score topical authority, original research, brand mentions or AI training and search crawler policy here. Those belong to `/geo-audit`.
2. **No markup makes a page a featured snippet.** Google: "Google systems determine whether a page would make a good featured snippet." There is no featured-snippet schema. Clear answers and clean structure raise the odds; nothing guarantees selection. Third-party tracking (Ahrefs, 2025; vendor data) also shows featured snippets on fewer results as AI Overviews spread, so don't promise one.
3. **FAQ rich results are gone.** Google limited them to government and health sites in August 2023, stopped showing them entirely on May 7, 2026, and removed its FAQPage documentation in June 2026. Never promise FAQ rich results. FAQPage is still a valid Schema.org type and Microsoft says schema helps its search and AI systems understand content, so markup on a visible FAQ is optional 🧪. The visible FAQ section is what matters.
4. **HowTo rich results are gone too.** Google stopped showing them in September 2023. Don't add HowTo markup to win a Google feature. A real `<ol>` of steps under a clear heading is what an engine can lift as a list.
5. **Structured data must match visible content.** Google's general structured data guidelines: "Don't mark up content that is not visible to readers of the page." Never mark up questions or answers that aren't shown on the page.
6. **QAPage and FAQPage are different.** QAPage is for a page built around one question where users can submit answers (forums, community Q&A); Google still documents it and says a site-written FAQ isn't eligible. FAQPage is for questions and answers the site itself wrote. Don't mix them up.
7. **Speakable is legacy.** Google's `speakable` is still documented as a beta for news content, in English, in the US, read by Google Assistant on Google Home devices. Gemini is replacing Google Assistant and Google hasn't said Gemini uses `speakable`. Only mention it for news publishers, marked 🧪.
8. **Snippet controls cut both ways.** `nosnippet`, `max-snippet:0` (or a very small value) and `data-nosnippet` keep text out of featured snippets and, per Google, out of AI Overviews and AI Mode. `noindex` removes the page from the index altogether. On Bing, `nocache` limits Copilot answers to the URL, title and snippet, and `noarchive` keeps the content out of Copilot answers. Flag them on answer pages, but treat them as possibly deliberate: report, don't assume.
9. **Google-Extended doesn't control Search.** Blocking the `Google-Extended` token affects Gemini training and grounding, not featured snippets, AI Overviews or AI Mode. Google also offers a Search Console setting ("Search generative AI" → Exclude), available to all sites since August 31, 2026, that removes a site from AI Overviews and AI Mode. It isn't visible in code, so list it as a manual check.
10. **Lists and tables must be real HTML.** Use `<ol>` for steps, `<ul>` for unordered items and `<table>` with `<th>` for comparisons. Microsoft recommends "bulleted lists, numbered steps, and comparison tables". Divs styled to look like lists, `<br>`-separated lines and CSS-grid "tables" are harder to lift.
11. **Word-count targets are heuristics.** Google says it "does not provide an exact minimum length" for featured snippets. The common "40–50 words" target comes from SEMrush's featured snippet studies (vendor research); Microsoft suggests "one- to two-sentence responses". Use these as guides, mark word-count findings 🧪, and never pad or cut an answer to hit a number.
12. **Answer first, context second.** The direct answer belongs in the first sentence under the question heading. Preambles ("Great question!", "In this article we'll explore…", a paragraph of backstory) push the answer away from the question.
13. **Important answers should be visible.** An accordion that renders its answer only after a click (`{open && <Answer />}`, `v-if`, `{#if open}`) leaves the answer out of the HTML crawlers receive: Critical on the main FAQ or help pages and for a page's primary answer, High elsewhere. Collapsed content that is still in the HTML (`<details>`, `hidden`, CSS) is readable by Google, but Microsoft warns "AI systems may not render hidden content". Keep the page's main answers visible by default and use collapsed sections for secondary questions.
14. **Don't invent questions or answers.** Questions come from the site's content, the user, or query data the user provides. Answers come from the site's content or the user. Never fabricate facts, figures or "People also ask" data.
15. **Don't rewrite for engines at the reader's expense.** Google says there's no need to write in a special way for AI. Recommend changes that also make the page clearer for people; skip ones that only chase an engine.
16. **Zero-click is the tradeoff.** Winning the direct answer to a simple fact can reduce clicks. Report this plainly; don't promise traffic.
17. **Never recommend cloaking.** Bots and people must get the same content.
## Instructions
**CRITICAL**: This command MUST NOT accept any arguments. If the user typed text, URLs or paths after the command, ignore them. Gather everything through AskUserQuestion.
### Step 1: Context7 MCP Detection
1. Try `mcp__claude_ai_Context7__resolve-library-id` with a test library name (e.g. `"next"`).
2. **If available**: set `KNOWLEDGE_SOURCE = "Context7 MCP"`. Use it for Google Search Central docs on featured snippets and snippet controls, Schema.org `FAQPage` / `QAPage` / `DefinedTerm`, Google's structured data policies, and the detected framework's head and metadata APIs.
3. **If unavailable**: set `KNOWLEDGE_SOURCE = "LLM Training Data (fallback)"` and tell the user:
> "Context7 MCP is not available. Proceeding with training-data knowledge. Search features change often, so some recommendations may lag current practice. To install Context7: `claude mcp add context7 -- npx -y @upstash/context7-mcp`"
4. In fallback mode, apply 🧪 more liberally.
5. State the mode in the terminal summary and the report header.
### Step 2: Interactive Configuration
Use AskUserQuestion:
- **Question 1:** "What scope should this audit cover?"
- Header: "Audit Scope"
- Options: "Entire solution" / "Specific directory" (follow up with a free-text question for the path)
- **Question 2:** "Should audit reports be committed to version control?"
- Header: "Version Control"
- Options: "Yes, commit audits" (track answer readiness over time) / "No, add to .gitignore"
- **Question 3:** "Also check the live site?"
- Header: "Live check"
- Options:
- "Codebase only"
- "Codebase + live URL" (fetches the deployed pages to confirm answers are in the served HTML and to read the snippet controls actually sent)
If the user picks the live option, ask for the production URL in a free-text follow-up. Accept only `http://` or `https://` URLs, and run it only against a site the user owns or is authorized to test.
### Step 3: Framework Detection
1. `package.json` dependencies:
- `next` → Next.js (App Router `app/` or Pages Router `pages/`)
- `nuxt` → Nuxt
- `@tanstack/start` or `@tanstack/react-start` → TanStack Start
- `astro` → Astro
- `@sveltejs/kit` → SvelteKit
- `@remix-run/react` / `@remix-run/node` / `react-router` with framework mode → Remix / React Router
- none → vanilla HTML or unknown
2. Config fallback: `next.config.*`, `nuxt.config.*`, `astro.config.*`, `svelte.config.*`, `vite.config.*`.
3. Read the framework version from `package.json`.
Record `FRAMEWORK = "<name> <version>"` and `PROJECT_NAME = <package.json name or directory name>`.
### Step 4: Docs Directory Detection
1. Glob for `docs/`, `documentation/`, `.docs/`.
2. Use an existing non-standard path if present. Otherwise default to `docs/aeo-audit/`.
3. Create the audit directory if missing.
### Step 5: Load the Question Map (if present)
If `<docs-dir>/aeo-audit/question-map-latest.md` exists (written by `/aeo-questions`), read it. Use its target questions, their mapped pages and its gaps in Category 2. Record `QUESTION_MAP = "<path> (<date>)"`.
If it doesn't exist, set `QUESTION_MAP = "none"`. Category 2 is then scored only on the questions the site already asks in its headings, and the report recommends running `/aeo-questions`.
### Step 6: Identify Answer Pages
List the pages whose job is to answer questions: docs and guides, blog posts, FAQ and help-center pages, glossary pages, product and pricing pages that carry FAQs, comparison pages, and location pages for local businesses. Exclude utility pages (auth, cart, checkout, account, legal) from content checks; still include them in the snippet-control check if they carry site-wide directives.
Record the list. The report states how many answer pages were analyzed.
### Step 7: Audit Execution
Analyze every answer page across the nine categories. For each finding capture: file path, line number, the current code or copy (or `N/A — absent`), a specific fix and the category. Record each issue once, in the category that fits best: answers gated behind a click go in Category 4; a page rendered entirely on the client goes in Category 9; a live-check confirmation adds evidence to the existing finding instead of creating a second one.
#### Category 1: Answer-First Formatting
- For each question-shaped heading (H2/H3, or an FAQ item), read the first paragraph under it. Does its **first sentence** answer the question directly?
- Flag preambles before the answer: restating the question, "Great question", "In this article…", "Let's dive in", backstory, or a sales pitch.
- Paragraph answers: count the words in the answering paragraph. Roughly 40–50 words (SEMrush's featured snippet studies) or one to two sentences (Microsoft) are guides 🧪, not rules. Flag answers that take more than about 100 words to make the point, and fragments that don't stand alone.
- Inverted pyramid: the answer, then supporting detail, then edge cases.
- Long pages (>1,000 words) open with a short summary or "key takeaways" block that answers the page's main question.
- Answers that depend on surrounding context ("as shown above", "this", "it" with no antecedent) don't survive being lifted alone. Microsoft asks for "sentences that make sense even when pulled out of context".
- Vague claims in answers ("innovative", "eco", "industry-leading") with no specifics. Microsoft: "Terms like innovative or eco mean little without specifics."
#### Category 2: Question Coverage & Headings
- Headings phrased as the questions people ask (what, how, why, when, where, who, can, does, is, should, vs). One question per section.
- Heading hierarchy is clean: one H1, H2 for main questions, H3 for follow-ups. No skipped levels inside answer content.
- Follow-up questions are answered on the same page (cost, duration, alternatives, "is it safe", "how long", comparisons) where they naturally belong. These are the questions "People also ask" boxes expand.
- Keyword-stuffed headings ("Best Cheap Laptops 2026 Deals") instead of a natural question ("What's the best budget laptop in 2026?").
- Don't turn every heading into a question. Narrative and reference pages can keep descriptive headings; flag only answer pages where the reader arrives with a question.
- **With a question map:** every target question has a page that answers it directly; gaps and competing pages are findings here.
- **Without a question map:** report which question patterns the site already covers and recommend `/aeo-questions`.
#### Category 3: Concise Definitions
- Pages about a term, product category or concept open with a one-sentence definition: "X is a Y that does Z."
- Definitions are short (one or two sentences) before the elaboration.
- Glossary pages exist for sites with heavy jargon (docs, finance, health, legal, technical products), with one term per heading.
- `DefinedTerm` / `DefinedTermSet` markup for glossaries 🧪 (valid Schema.org; no Google feature depends on it).
- The same term is defined the same way across pages.
#### Category 4: Snippet-Ready Structure
- Steps use `<ol>` (or markdown `1.`). Unordered sets use `<ul>`. Flag divs styled as lists, `<br>`-separated lines and lists drawn with CSS only.
- Comparisons and specs use `<table>` with a header row (`<th>`). Flag CSS-grid or flexbox "tables" and tables rendered as images.
- List items are short and parallel; steps are in order and start with a verb.
- Answer text is real text, not inside images, canvas, SVG `<text>`, video only, or a PDF. Microsoft advises against "relying on PDFs for core information" and putting key information only in images.
- **Answer text is in the initial HTML.** Flag accordions, tabs and "read more" toggles that render their content only after interaction (React `{open && …}`, Vue `v-if`, Svelte `{#if}`, client-side fetch on expand). Critical on the main FAQ or help pages and for a page's primary answer; High elsewhere.
- **Main answers are visible by default.** Content collapsed with `<details>`, `hidden`, `v-show` or CSS is in the HTML and Google reads it, but Microsoft warns "AI systems may not render hidden content". Flag a page whose primary answer sits inside a collapsed element (Medium); collapsed secondary questions are fine.
- Decorative symbols in answer text (arrows, star strings, runs of punctuation) that Microsoft says can confuse extraction. Low.
#### Category 5: Snippet Eligibility & Indexing Controls
Search the codebase for every place a robots directive can come from:
- `<meta name="robots">`, `<meta name="googlebot">`, `<meta name="bingbot">` in templates and layouts.
- Framework APIs: Next.js `metadata.robots` / `generateMetadata` (`nosnippet`, `googleBot: { 'max-snippet': … }`), Nuxt `useSeoMeta({ robots })` / `useHead`, TanStack Start route `head`, Astro layouts, SvelteKit `<svelte:head>`, Remix `meta` exports.
- `X-Robots-Tag` response headers: `next.config.*` `headers()`, middleware, `vercel.json`, `netlify.toml`, `_headers`, `nginx.conf`, `.htaccess`, server code.
- `data-nosnippet` attributes.
- `robots.txt` rules that block Googlebot or Bingbot from answer paths.
- Canonicals on answer pages that point to a different URL.
Flag on answer pages: `noindex`, `nosnippet`, `max-snippet:0` or a value too small to hold an answer, `data-nosnippet` wrapped around answer text, and Bing's `nocache` / `noarchive` (which limit or remove the content from Copilot answers). Severity is Critical when the directive is site-wide and looks accidental (for example copied from a staging config), High when it covers a section of answer pages. Always phrase the finding as "confirm this is intended" because these controls are sometimes deliberate.
Also list one manual check in the report: whether the Search Console setting "Search generative AI" is set to Exclude, which removes the site from AI Overviews and AI Mode. Code can't show it.
#### Category 6: FAQ Sections & Structured Data
- Pages where readers bring recurring questions (product, pricing, support, policies) have a visible FAQ section, and its answers open with the answer.
- No markup for questions that aren't visible on the page (against Google's general structured data guidelines). High.
- Existing `FAQPage` JSON-LD matches the visible questions and answers. Adding FAQPage where it's missing is optional 🧪: no Google feature has used it since May 2026; Microsoft says schema helps its systems understand content. Never present it as a way to get a rich result.
- No identical FAQ block marked up across many pages (for example a site-wide footer FAQ repeated on every route).
- Forum or community Q&A pages use `QAPage` with `Question`, `answerCount`, `acceptedAnswer` / `suggestedAnswer`, and author and date fields. A site-written FAQ marked as QAPage is a finding.
- `HowTo` markup: don't add it for Google. If it exists, leave it (valid Schema.org) and note it no longer produces a Google feature.
- Answer pages carry basic `Article` / `BlogPosting` / `WebPage` markup with `headline`, `author`, `datePublished` and `dateModified`, plus `BreadcrumbList`. Deeper entity and author work belongs to `/geo-audit`.
- Validate existing JSON-LD: valid JSON, `@context: "https://schema.org"`, correct `@type`, required properties, ISO 8601 dates, absolute URLs. Flag microdata and RDFa; recommend JSON-LD.
- Best practice: render the visible FAQ and its JSON-LD from **one data source** so they can't drift apart.
#### Category 7: Voice & Assistant Readiness
- Answers read well aloud: a complete sentence that makes sense without the page around it, no "click here", no answer that exists only in a table or image.
- Local businesses: `LocalBusiness` (or a subtype) JSON-LD with name, address, phone, opening hours and geo, matching the visible NAP (name, address, phone) on every page that shows it. "Near me" and "is it open now" questions depend on this kind of data.
- Assistant crawlers can reach answer pages: Applebot (Siri, Spotlight, Safari) and Amzn-SearchBot (Alexa and Amazon search features) aren't blocked in robots.txt. Report only, with no deduction; full crawler policy belongs to `/geo-audit`.
- `speakable`: only for news publishers, marked 🧪 (beta, English, US, Google Assistant devices that Gemini is replacing).
- Don't claim a "voice search schema" exists. Voice assistants answer from their own search indexes, partners and models; concise, factual sentences are what this audit can check.
#### Category 8: Answer Trust Signals
Light checks only; `/geo-audit` covers authorship and evidence in depth.
- Answers that change over time (prices, versions, laws, schedules) show a visible "last updated" date and carry `dateModified`.
- Factual answers in health, finance, legal and safety topics link to a source. Authorship and reviewer credentials are scored by `/geo-audit`; mention it rather than scoring them here.
- No contradictory answers to the same question on different pages.
#### Category 9: Technical Answer Accessibility
- Answer pages are server-rendered or static. Client-only rendering of answer content is Critical.
- Correct status codes (no 200 on error pages; redirects for moved answers).
- Mobile viewport set; text readable without zoom.
- Title, meta description and H1 describe the page's main question or topic (Microsoft names them as signals AI systems use); deeper meta checks belong to `/seo-audit`.
- Overlap with `/seo-audit` (performance, Core Web Vitals) is referenced, not re-scored.
#### Framework-Specific Checks
Ver no GitHub