AEO Optimize
Source: github.com/psyduckler/aeo-skills
Part of: AEO Skills Suite (v2 Core)
Reads: aeo-data/*.json (evidence) + optional aeo-reports/*.md
Writes: A Markdown work queue (printed to chat or saved to file)
The action layer of the AEO loop. aeo-baseline measures, aeo-report analyzes, aeo-optimize recommends.
How this skill works
This is a SKILL.md-only skill — there is no script to run. The agent reads the methodology in this file plus the references in references/, then applies that methodology to the user's actual data.
The agent should:
- Locate the latest evidence file. Sort
aeo-data/*.json by run timestamp and load the latest.
- Optionally read the latest aeo-report output at
aeo-reports/*.md for pre-computed trend signals.
- Optionally fetch one or more brand URLs when a recommendation involves a specific page (use
web_fetch).
- Apply the playbooks in
references/action-playbooks.md to map gaps in the data to concrete actions.
- Output a prioritized Markdown work queue with the structure shown below.
Output format
# AEO Action Plan — <brand>
Generated from `aeo-data/<latest-evidence-file>` covering prompts: <list>.
## Quick wins (high impact, low effort)
### 1. Refresh `<url>` with entity "<entity>"
**Evidence:** Mentioned in 14/20 Gemini responses for prompt `<prompt_id>` but missing from your page (`citation_rate = 60%, position avg #4.2`).
**Action:** Add a section that names "<entity>" and explains how it relates to <topic>. Aim for 2–3 sentences of natural mention.
**Effort:** ~30 min
**Expected gain:** Citation rate from 60% → 75–80% based on the recurring retrieval set.
### 2. Add JSON-LD `<schema-type>` to `<url>`
**Evidence:** All cited competitor pages on prompt `<prompt_id>` include `<schema-type>` markup; your page does not.
**Action:** Use [aeo-schema](../aeo-schema/) to generate the JSON-LD block.
**Effort:** ~15 min
**Expected gain:** Improves structural signals for citation.
## Strategic plays (higher effort, higher impact)
### 3. Create comparison page: `<You> vs <Competitor>`
**Evidence:** 8/20 Gemini runs for prompt `<prompt_id>` cited a comparison page from <competitor> (`<competitor>.com/<you>-vs-<competitor>`). You have no comparison page in your sitemap.
**Action:** Draft a 1500–2000 word vs page covering pricing, features, integrations, ideal use case.
**Effort:** ~4 hours
**Expected gain:** Entry into the recurring retrieval set for this prompt; ~15–25pp lift in citation rate over 4–8 weeks.
## Maintenance (alerts, decay)
### 4. Refresh `<url>` — citation rate decaying
**Evidence:** prompt `<prompt_id>` shows citation rate decay: 80% → 45% over the last 6 baselines (METHODOLOGY.md §4: HIGH severity).
**Action:** Audit the page for stale claims, outdated stats, missing competitive context. Update timestamps. Re-publish.
**Effort:** ~1 hour
**Expected gain:** Reverse the decay; restore to 70%+ over 2–4 weeks.
## Hub-page consolidation
### 5. Double down on `<url>` — your strongest hub
**Evidence:** This URL is cited across 4 of 6 tracked prompts (66% coverage). It is your highest-leverage page.
**Action:** Add 3–5 additional sections covering the entities and questions surfaced in `aeo-report` for those prompts. One page that wins more prompts is cheaper than five pages winning one each.
**Effort:** ~2 hours
**Expected gain:** Reinforces hub status; may pick up additional prompts.
## Cannibalization fixes
### 6. Consolidate `<url-a>` and `<url-b>`
**Evidence:** Both pages are cited for prompt `<prompt_id>` with 60%/40% share — the model can't decide which to surface. Internal competition is diluting both.
**Action:** Pick the canonical URL (the one ranking better; usually the older or more comprehensive). 301 the other. Merge unique content into the canonical.
**Effort:** ~1 hour
**Expected gain:** Concentrated citation share on one URL; cleaner signal to the model.
Every recommendation includes: the prompt_id driving it, the metric/evidence backing it, the specific action, the rough effort estimate, and the expected gain. No vibes, no vague advice.
How to choose what to recommend
Read references/action-playbooks.md for the full mapping. Summary:
| Gap signal in the evidence file |
Recommended action |
Brand mentioned but not cited (mention_rate > 0.5, citation_rate < 0.2) |
Add/improve a brand URL that should be cited; check schema; submit to Search Console |
| Brand cited at position #5+ when competitors are at #1 |
Improve content depth/freshness on the brand URL; entity coverage |
Entity in entity_universe with high frequency but not on your page |
Add a section covering that entity |
Decay flagged in aeo-report |
Refresh the page; update stats; add new sections; re-publish |
| Cannibalization flagged |
Consolidate competing URLs; 301; canonical |
| Hub-page coverage ≥30% |
Double down — add sections for adjacent prompts |
| Citation gap on comparison-intent prompt (no comparison page) |
Build a <You> vs <Competitor> page |
| No JSON-LD on a cited brand page when competitors have it |
Run aeo-schema |
Pairs With
- aeo-baseline — produces the evidence file this skill reads
- aeo-report — produces trend reports this skill can cross-reference
- aeo-schema — execute the "add JSON-LD" recommendations
- aeo-content-free — execute the "create new page" recommendations
Principles
- Every recommendation must cite evidence. If you can't point to a specific prompt + metric, the recommendation is vibes.
- Prioritize by leverage, not novelty. Refreshing a hub page is almost always higher-leverage than creating a new page.
- One owner per recommendation. Tasks that need cross-team coordination are weaker than tasks one person can ship.
- Effort estimates matter. "Refresh a page" is 1 hour; "build a new comparison page" is 4. Knowing this helps the user pick what fits their week.
- Be honest about uncertainty. Expected gain is a directional estimate, not a promise. At N=20 samples, Wilson 95% CI widths are ~30pp — small movements are noise.
Notes for the agent
- If
aeo-data/ is empty or missing, recommend running aeo-baseline first — do not invent recommendations from prior knowledge.
- If only one evidence file exists, you can still recommend based on snapshot data, but flag that decay and trend signals are unavailable.
- If multiple brand URLs are cited for the same prompt, consider cannibalization before recommending a refresh — fix the duplicate problem first.
- When fetching brand URLs for context, respect rate limits. The user's
web_fetch allowance matters.
- Default output: print the work queue to chat. If the user asks, save it to
aeo-reports/<timestamp>-action-plan.md.
1---2name: aeo-optimize3description: Turn an AEO visibility baseline into a concrete content work queue. Reads the latest aeo-evidence-v1 file from aeo-data/, optionally reads aeo-report output and fetched page content, then produces a prioritized Markdown task list. Each task is evidence-backed: it cites the prompt_id, the metric driving the recommendation (mention rate, citation rate, position, decay, cannibalization, hub-page opportunity), and concrete next steps (refresh URL X, create page A vs B, add JSON-LD type Z, surface entity Y). SKILL.md-only — the agent reasons over the methodology in references/ and applies it to the user's data. No script, no API calls. Use when a user wants to: turn baseline data into action, decide what content to refresh or create next, plan an AEO sprint, build a backlog from a visibility report, or close the gap between "what's broken" and "what should I do about it".4---56# AEO Optimize78> **Source:** [github.com/psyduckler/aeo-skills](https://github.com/psyduckler/aeo-skills/tree/main/aeo-optimize)9> **Part of:** [AEO Skills Suite](https://github.com/psyduckler/aeo-skills) (v2 Core)10> **Reads:** `aeo-data/*.json` (evidence) + optional `aeo-reports/*.md`11> **Writes:** A Markdown work queue (printed to chat or saved to file)1213The action layer of the AEO loop. `aeo-baseline` measures, `aeo-report` analyzes, `aeo-optimize` recommends.1415## How this skill works1617This is a SKILL.md-only skill — there is no script to run. The agent reads the methodology in this file plus the references in `references/`, then applies that methodology to the user's actual data.1819The agent should:20211. **Locate the latest evidence file.** Sort `aeo-data/*.json` by run timestamp and load the latest.222. **Optionally read the latest aeo-report output** at `aeo-reports/*.md` for pre-computed trend signals.233. **Optionally fetch one or more brand URLs** when a recommendation involves a specific page (use `web_fetch`).244. **Apply the playbooks in `references/action-playbooks.md`** to map gaps in the data to concrete actions.255. **Output a prioritized Markdown work queue** with the structure shown below.2627## Output format2829```markdown30# AEO Action Plan — <brand>3132Generated from `aeo-data/<latest-evidence-file>` covering prompts: <list>.3334## Quick wins (high impact, low effort)3536### 1. Refresh `<url>` with entity "<entity>"37**Evidence:** Mentioned in 14/20 Gemini responses for prompt `<prompt_id>` but missing from your page (`citation_rate = 60%, position avg #4.2`).38**Action:** Add a section that names "<entity>" and explains how it relates to <topic>. Aim for 2–3 sentences of natural mention.39**Effort:** ~30 min40**Expected gain:** Citation rate from 60% → 75–80% based on the recurring retrieval set.4142### 2. Add JSON-LD `<schema-type>` to `<url>`43**Evidence:** All cited competitor pages on prompt `<prompt_id>` include `<schema-type>` markup; your page does not.44**Action:** Use [aeo-schema](../aeo-schema/) to generate the JSON-LD block.45**Effort:** ~15 min46**Expected gain:** Improves structural signals for citation.4748## Strategic plays (higher effort, higher impact)4950### 3. Create comparison page: `<You> vs <Competitor>`51**Evidence:** 8/20 Gemini runs for prompt `<prompt_id>` cited a comparison page from <competitor> (`<competitor>.com/<you>-vs-<competitor>`). You have no comparison page in your sitemap.52**Action:** Draft a 1500–2000 word vs page covering pricing, features, integrations, ideal use case.53**Effort:** ~4 hours54**Expected gain:** Entry into the recurring retrieval set for this prompt; ~15–25pp lift in citation rate over 4–8 weeks.5556## Maintenance (alerts, decay)5758### 4. Refresh `<url>` — citation rate decaying59**Evidence:** prompt `<prompt_id>` shows citation rate decay: 80% → 45% over the last 6 baselines (METHODOLOGY.md §4: HIGH severity).60**Action:** Audit the page for stale claims, outdated stats, missing competitive context. Update timestamps. Re-publish.61**Effort:** ~1 hour62**Expected gain:** Reverse the decay; restore to 70%+ over 2–4 weeks.6364## Hub-page consolidation6566### 5. Double down on `<url>` — your strongest hub67**Evidence:** This URL is cited across 4 of 6 tracked prompts (66% coverage). It is your highest-leverage page.68**Action:** Add 3–5 additional sections covering the entities and questions surfaced in `aeo-report` for those prompts. One page that wins more prompts is cheaper than five pages winning one each.69**Effort:** ~2 hours70**Expected gain:** Reinforces hub status; may pick up additional prompts.7172## Cannibalization fixes7374### 6. Consolidate `<url-a>` and `<url-b>`75**Evidence:** Both pages are cited for prompt `<prompt_id>` with 60%/40% share — the model can't decide which to surface. Internal competition is diluting both.76**Action:** Pick the canonical URL (the one ranking better; usually the older or more comprehensive). 301 the other. Merge unique content into the canonical.77**Effort:** ~1 hour78**Expected gain:** Concentrated citation share on one URL; cleaner signal to the model.79```8081Every recommendation includes: **the prompt_id driving it**, **the metric/evidence backing it**, **the specific action**, **the rough effort estimate**, and **the expected gain**. No vibes, no vague advice.8283## How to choose what to recommend8485Read [references/action-playbooks.md](references/action-playbooks.md) for the full mapping. Summary:8687| Gap signal in the evidence file | Recommended action |88|---|---|89| Brand mentioned but not cited (`mention_rate > 0.5`, `citation_rate < 0.2`) | Add/improve a brand URL that should be cited; check schema; submit to Search Console |90| Brand cited at position #5+ when competitors are at #1 | Improve content depth/freshness on the brand URL; entity coverage |91| Entity in `entity_universe` with high frequency but not on your page | Add a section covering that entity |92| Decay flagged in `aeo-report` | Refresh the page; update stats; add new sections; re-publish |93| Cannibalization flagged | Consolidate competing URLs; 301; canonical |94| Hub-page coverage ≥30% | Double down — add sections for adjacent prompts |95| Citation gap on comparison-intent prompt (no comparison page) | Build a `<You> vs <Competitor>` page |96| No JSON-LD on a cited brand page when competitors have it | Run [aeo-schema](../aeo-schema/) |9798## Pairs With99100- **[aeo-baseline](https://github.com/psyduckler/aeo-skills/tree/main/aeo-baseline)** — produces the evidence file this skill reads101- **[aeo-report](https://github.com/psyduckler/aeo-skills/tree/main/aeo-report)** — produces trend reports this skill can cross-reference102- **[aeo-schema](https://github.com/psyduckler/aeo-skills/tree/main/aeo-schema)** — execute the "add JSON-LD" recommendations103- **[aeo-content-free](https://github.com/psyduckler/aeo-skills/tree/main/aeo-content-free)** — execute the "create new page" recommendations104105## Principles1061071. **Every recommendation must cite evidence.** If you can't point to a specific prompt + metric, the recommendation is vibes.1082. **Prioritize by leverage, not novelty.** Refreshing a hub page is almost always higher-leverage than creating a new page.1093. **One owner per recommendation.** Tasks that need cross-team coordination are weaker than tasks one person can ship.1104. **Effort estimates matter.** "Refresh a page" is 1 hour; "build a new comparison page" is 4. Knowing this helps the user pick what fits their week.1115. **Be honest about uncertainty.** Expected gain is a directional estimate, not a promise. At N=20 samples, Wilson 95% CI widths are ~30pp — small movements are noise.112113## Notes for the agent114115- If `aeo-data/` is empty or missing, recommend running `aeo-baseline` first — do not invent recommendations from prior knowledge.116- If only one evidence file exists, you can still recommend based on snapshot data, but flag that decay and trend signals are unavailable.117- If multiple brand URLs are cited for the same prompt, consider cannibalization before recommending a refresh — fix the duplicate problem first.118- When fetching brand URLs for context, respect rate limits. The user's `web_fetch` allowance matters.119- Default output: print the work queue to chat. If the user asks, save it to `aeo-reports/<timestamp>-action-plan.md`.