AEO Content Brief Generator
Third piece of the AEO/GEO loop. AEO / LLM Visibility Audit finds the gap questions. AEO / GEO Improvement Bot diagnoses which ones need net-new content. This skill turns each of those into a brief a writer can execute today, without inventing the facts that make the answer citable.
When to use
- On the
content-type fixes from the improvement bot's fixes[].
- Any time the ask is "write a page that answers X the way an AI assistant would quote it" -- direct answer first, structure after.
When NOT to use
- For
schema, citation, or authority fixes -- those need markup, outreach, or backlinks, not a new page. Route them to a schema-audit or outreach skill instead.
- As a final draft -- this produces a brief and an opener grounded in supplied facts, not the full article. A writer (human or a long-form content skill) still builds it out.
Method
- Classify the question's shape from its wording -- "how to" → how-to, "best/top/tools" → best-of/listicle, "vs/compare" → comparison, "what is/why" → definition, else general.
- Match the shape to the schema type an AI crawler parses most reliably for that shape (HowTo, ItemList, FAQPage).
- Draft the direct-answer opener strictly from the
facts supplied for that question. If none are supplied, emit an explicit [INSERT: ...] placeholder rather than a fabricated claim -- ship-blocking on purpose.
- Return a section outline and word-count target sized to the shape, so the brief is handoff-ready.
Inputs
brand -- the brand name
questions[] -- each {question, facts[]}. facts are real, verifiable proof points about the brand relevant to that question; leave empty if none exist yet.
Output (JSON)
briefs[] (each with question, shape, recommended_schema, title_suggestion, opener_draft, sections[], word_count_target, needs_real_data), questions_missing_data[], and a one-line summary.
Run it
python scripts/content_brief.py # built-in sample
python scripts/content_brief.py in.json # your own brand + questions + facts
Zero dependencies, no API keys. Feed its briefs[] to whatever writes the full page; feed questions_missing_data[] back to the brand team as "we need real proof points before this can publish."
1---2name: aeo-content-brief-generator3description: Turns a "content" gap (a buyer question with no owned page answering it) into a writable brief -- the question's shape (how-to, best-of, comparison, definition), the matching schema type, a fact-grounded direct-answer opener, and a section outline with a word-count target. Never fabricates data -- when no real facts are supplied it scaffolds an explicit [INSERT] placeholder instead of inventing a claim. Use this on the `content`-type fixes returned by the AEO/GEO Improvement Bot, or on any raw list of buyer questions that need an AI-answer-shaped page written.4---56# AEO Content Brief Generator78Third piece of the AEO/GEO loop. [AEO / LLM Visibility Audit](../aeo-llm-visibility-audit) finds the gap questions. [AEO / GEO Improvement Bot](../aeo-geo-improvement-bot) diagnoses which ones need net-new content. This skill turns each of those into a brief a writer can execute today, without inventing the facts that make the answer citable.910## When to use1112- On the `content`-type fixes from the improvement bot's `fixes[]`.13- Any time the ask is "write a page that answers X the way an AI assistant would quote it" -- direct answer first, structure after.1415## When NOT to use1617- For `schema`, `citation`, or `authority` fixes -- those need markup, outreach, or backlinks, not a new page. Route them to a schema-audit or outreach skill instead.18- As a final draft -- this produces a brief and an opener grounded in supplied facts, not the full article. A writer (human or a long-form content skill) still builds it out.1920## Method21221. Classify the question's shape from its wording -- "how to" → how-to, "best/top/tools" → best-of/listicle, "vs/compare" → comparison, "what is/why" → definition, else general.232. Match the shape to the schema type an AI crawler parses most reliably for that shape (HowTo, ItemList, FAQPage).243. Draft the direct-answer opener strictly from the `facts` supplied for that question. If none are supplied, emit an explicit `[INSERT: ...]` placeholder rather than a fabricated claim -- ship-blocking on purpose.254. Return a section outline and word-count target sized to the shape, so the brief is handoff-ready.2627## Inputs2829- `brand` -- the brand name30- `questions[]` -- each `{question, facts[]}`. `facts` are real, verifiable proof points about the brand relevant to that question; leave empty if none exist yet.3132## Output (JSON)3334`briefs[]` (each with `question`, `shape`, `recommended_schema`, `title_suggestion`, `opener_draft`, `sections[]`, `word_count_target`, `needs_real_data`), `questions_missing_data[]`, and a one-line `summary`.3536## Run it3738```bash39python scripts/content_brief.py # built-in sample40python scripts/content_brief.py in.json # your own brand + questions + facts41```4243Zero dependencies, no API keys. Feed its `briefs[]` to whatever writes the full page; feed `questions_missing_data[]` back to the brand team as "we need real proof points before this can publish."