AEO Content Writer Skill
This skill writes blog posts that are data-driven, AEO-optimized, and follow the site's tone and content standards.
When to Use This Skill
Trigger this skill when the user asks to:
- "Draft the blog post about [Topic]"
- "Write a post about [labor market trend / AI impact topic]"
Core Workflow
Step 0: AEO Brief Intake (when writing from a research report)
If the user references an AEO topic research report or says they want to write a specific post from a research report, do this before anything else:
1. Identify the specific recommendation.
Ask the user which post/recommendation they're targeting if not obvious. Reference it by its exact title and slug from the report. Do not proceed ambiguously.
2. Extract from the content brief:
- Target questions — the exact queries the post is designed to answer. These drive the H1, meta title, and FAQ pairs.
- Reddit phrasing — exact phrases from the glossary and brief. These go verbatim into headlines, subheads, and intro paragraphs. Do not paraphrase.
- Content structure — use the brief's numbered outline as the skeleton. The section order, H2s, and framing are deliberate; follow them unless you have a strong reason to deviate.
- Word count target — treat the range as a floor, not a guideline. Under-length posts are the primary reason sites fail to get cited.
- Key data to pull — specific data points named in the brief. These are the data points that make the post citable; don't substitute with vaguer claims.
- Slug — use exactly as specified.
3. Sanity-check against the Winning Content Formula (Section 6 of the report):
Before writing, verify the planned post will include:
- Direct answer paragraph (2–3 sentences) at the very top
- Key Takeaway (2–3 sentences, specific numbers) after the opening paragraph, before the first H2 — only if the opening paragraph is narrative rather than data-dense. If the opening already leads with strong stats, skip it.
- Key Takeaways box (3–5 bullets) near the top
- Numbered list with consistent sub-structure per entry (if it's a listicle)
- At least one inline table for salary/comparison data
- Table of contents (for posts over 2,500 words)
- FAQPage schema via
faqPairs prop (6–8 pairs, schema-only — not a visible section)
- Question-formatted H2s throughout, each followed by a direct-answer first paragraph
- Visible data attribution line near the top
- Minimum 3–5 external citations to authoritative sources
If any of these are missing from your plan, add them before writing.
Step 1: Information Gathering
Before writing a single word, gather the necessary data:
- Read CONFIG.md: Load
TONE_GUIDE_PATH, SITE_CONTEXT, AGENTS_DOC, DATA_SOURCES, SITE_REPO, DATA_REPO, BLOG_COMPONENT_DIR, and BLOG_ROUTE_DIR from .claude/skills/aeo-content-writer/CONFIG.md.
- Read the Tone Guide: Review the file at
TONE_GUIDE_PATH.
- Read Site Context: Review the file at
SITE_CONTEXT for platform background, data sources, and what this skill is responsible for.
- Read Agents Doc: Review the file at
AGENTS_DOC for agent coordination context.
- Gather Data: Pull from
DATA_REPO and authoritative external sources listed in DATA_SOURCES. Find real numbers for any salary, job growth, or openings claims.
- Find 3 High-Quality Sources: Government data, peer-reviewed labor economics, major research reports (McKinsey, WEF). Avoid Gartner/IDC/MarketsandMarkets.
Step 2: Blog Post Format
Read CLAUDE.md before writing any files — it contains file paths, component names, route boilerplate, slug format, POSTS array fields, thumbnail spec, and sitemap format.
You must generate all of the following:
A. Post Component
- Export named constants at the top: slug, title, published date, published date ISO, description. Add edited date constants if this is an edit.
- Must follow the structure: Lead with finding → Show evidence → Explain meaning → Caveats → Actionable takeaway.
- Define 6–8 FAQ pairs (schema-only — not rendered on page). Each pair:
question: a natural-language query ending with ? that a real user would type
answer: 2 sentences max, names specific numbers or named entities, directly answers the question
- Pass
faqPairs to the layout component.
- Must include a Data Sources section at the bottom with numbered links, each with an
id="source-N" anchor. Every source must include a hyperlink. Never leave a source as plain text without a URL.
- When directly citing a source in body text, use inline superscript footnotes referencing
#source-N. Number inline citations to match the source list order. Never cite sources only in captions.
B. Route Page
Create the route page using the pattern in CLAUDE.md. Export a metadata object with title, description, and canonical URL.
C. Blog Index Entry
Add to the POSTS array per the field spec in CLAUDE.md.
D. Thumbnail Function
Follow the thumbnail spec in CLAUDE.md. Do not reuse another post's thumbnail function.
E. Sitemap
Add a <url> block per the sitemap format in CLAUDE.md. Set <lastmod> to today's date.
Step 3: AEO Optimization (Answer Engine Optimization)
To ensure the content is picked up by AI search engines (Perplexity, ChatGPT, Google AI Overviews):
- Direct Answers: The first paragraph of any section must directly answer the implied question without preamble.
- High Information Density: Use specific numbers, percentages, and named entities. AI engines prefer dense, factual text over narrative fluff.
- Question H2s: Where natural, frame section headings as questions users actually search (e.g., "Will AI Replace Software Engineers?"). The paragraph immediately following must answer in the first 1–2 sentences — no preamble. Don't force it if the section topic doesn't map cleanly to a question.
- Schema Readiness:
faqPairs drive the FAQPage JSON-LD schema injected by the layout component — they are schema-only, not rendered on page. Write questions that match real search queries distinct from the H2s. Answers must be ≤2 sentences with a specific data point in each. Target 6–8 pairs.
Step 3b: Self-Evaluation Pass
After completing the draft, run a self-evaluation before saving. Read the tone guide at TONE_GUIDE_PATH and check the draft against:
- AEO formula — quick answer block present, FAQ pairs written, at least one comparison table, question H2s throughout
- Author assignment — assign the correct author based on topic per the tone guide's author assignment rules
- Tone checklist — flag any instance of banned phrases, vague claims that could be specific, sections that don't lead with the answer, generic CTAs
- Competitor differentiation — does at least one section say something top-cited competitors in this niche don't?
Output the evaluation as a brief flagged list before the draft. Format:
- ✓ pass or ✗ [specific issue] for each criterion
- If any ✗, fix before saving. Do not ask the user to fix — fix it yourself.
Step 4: Accessibility & Mobile
Apply these explicitly — do not defer to the publish-checklist skill:
- Expandable sections (career cards, accordions):
aria-expanded on the toggle button.
- Decorative SVGs:
aria-hidden="true" or inside pointer-events-none containers.
- All interactive elements (links, buttons) are keyboard-accessible with visible focus states.
- Responsive typography: body prose uses
text-base md:text-lg.
- Data tables: wrap in
overflow-x-auto or use dl stat rows that widen to w-5/6 on mobile.
- Charts/graphs: use
grid-cols-1 sm:grid-cols-[...] so labels stack above bars on mobile.
- Content previews on index pages:
line-clamp-3.
Step 5: Internal Linking
Every new post must:
- Link to 2–3 existing published pages (blog posts, career pages, or industry pages) where naturally relevant. Use descriptive anchor text matching the target page's topic.
- After writing, identify which existing pages should link forward to the new post. List them in the handoff: "Also add a link to this post from [page] in the section about [topic]."
Do not skip — internal linking shares page authority across the cluster and signals topical depth to Google.
Step 6: Output and Handoff
- Write all files per the paths in CLAUDE.md.
- Ask the user to review the new content live in their browser at the local dev URL.
- Once the user approves the live preview, run the publish-checklist on the new post.
Optional — Google Docs sync (only if the user requests it):
- Check CONFIG.md for a
GOOGLE_DOCS_* key matching the content type (e.g. GOOGLE_DOCS_BLOG).
- If no key is set, tell the user and stop.
- Google Drive MCP must be authenticated. If tools are unavailable, prompt: "Run /mcp and select Google Drive to enable doc sync."
- Always call
mcp__claude_ai_Google_Drive__read_file_content before any write to get current doc state.
- Write (new draft): Append to the doc with a
--- separator and an H1 post title above the content.
- Edit (user asks to edit a section): Read the doc, locate the section, make the targeted change only.
- Confirm after: "Done. View at https://docs.google.com/document/d/[ID]/edit"
1---2name: aeo-content-writer3description: Blog post writer for AEO-optimized, data-driven sites. Writes posts based on BLS/O*NET data or equivalent authoritative sources, following the site's tone guide and content structure. Career/product pages generated by data pipelines are out of scope — use this skill for editorial blog posts only.4---56# AEO Content Writer Skill78This skill writes blog posts that are data-driven, AEO-optimized, and follow the site's tone and content standards.910## When to Use This Skill1112Trigger this skill when the user asks to:13- "Draft the blog post about [Topic]"14- "Write a post about [labor market trend / AI impact topic]"1516## Core Workflow1718### Step 0: AEO Brief Intake (when writing from a research report)1920If the user references an AEO topic research report or says they want to write a specific post from a research report, do this before anything else:2122**1. Identify the specific recommendation.**23Ask the user which post/recommendation they're targeting if not obvious. Reference it by its exact title and slug from the report. Do not proceed ambiguously.2425**2. Extract from the content brief:**26- **Target questions** — the exact queries the post is designed to answer. These drive the H1, meta title, and FAQ pairs.27- **Reddit phrasing** — exact phrases from the glossary and brief. These go verbatim into headlines, subheads, and intro paragraphs. Do not paraphrase.28- **Content structure** — use the brief's numbered outline as the skeleton. The section order, H2s, and framing are deliberate; follow them unless you have a strong reason to deviate.29- **Word count target** — treat the range as a floor, not a guideline. Under-length posts are the primary reason sites fail to get cited.30- **Key data to pull** — specific data points named in the brief. These are the data points that make the post citable; don't substitute with vaguer claims.31- **Slug** — use exactly as specified.3233**3. Sanity-check against the Winning Content Formula (Section 6 of the report):**34Before writing, verify the planned post will include:35- Direct answer paragraph (2–3 sentences) at the very top36- Key Takeaway (2–3 sentences, specific numbers) after the opening paragraph, before the first H2 — only if the opening paragraph is narrative rather than data-dense. If the opening already leads with strong stats, skip it.37- Key Takeaways box (3–5 bullets) near the top38- Numbered list with consistent sub-structure per entry (if it's a listicle)39- At least one inline table for salary/comparison data40- Table of contents (for posts over 2,500 words)41- FAQPage schema via `faqPairs` prop (6–8 pairs, schema-only — not a visible section)42- Question-formatted H2s throughout, each followed by a direct-answer first paragraph43- Visible data attribution line near the top44- Minimum 3–5 external citations to authoritative sources4546If any of these are missing from your plan, add them before writing.4748---4950### Step 1: Information Gathering51Before writing a single word, gather the necessary data:521. **Read CONFIG.md:** Load `TONE_GUIDE_PATH`, `SITE_CONTEXT`, `AGENTS_DOC`, `DATA_SOURCES`, `SITE_REPO`, `DATA_REPO`, `BLOG_COMPONENT_DIR`, and `BLOG_ROUTE_DIR` from `.claude/skills/aeo-content-writer/CONFIG.md`.532. **Read the Tone Guide:** Review the file at `TONE_GUIDE_PATH`.543. **Read Site Context:** Review the file at `SITE_CONTEXT` for platform background, data sources, and what this skill is responsible for.554. **Read Agents Doc:** Review the file at `AGENTS_DOC` for agent coordination context.565. **Gather Data:** Pull from `DATA_REPO` and authoritative external sources listed in `DATA_SOURCES`. Find real numbers for any salary, job growth, or openings claims.574. **Find 3 High-Quality Sources:** Government data, peer-reviewed labor economics, major research reports (McKinsey, WEF). Avoid Gartner/IDC/MarketsandMarkets.5859### Step 2: Blog Post Format60Read CLAUDE.md before writing any files — it contains file paths, component names, route boilerplate, slug format, POSTS array fields, thumbnail spec, and sitemap format.6162You must generate all of the following:6364#### A. Post Component65- Export named constants at the top: slug, title, published date, published date ISO, description. Add edited date constants if this is an edit.66- Must follow the structure: Lead with finding → Show evidence → Explain meaning → Caveats → Actionable takeaway.67- Define **6–8 FAQ pairs** (schema-only — not rendered on page). Each pair:68 - `question`: a natural-language query ending with `?` that a real user would type69 - `answer`: 2 sentences max, names specific numbers or named entities, directly answers the question70- Pass `faqPairs` to the layout component.71- Must include a Data Sources section at the bottom with numbered links, each with an `id="source-N"` anchor. Every source must include a hyperlink. Never leave a source as plain text without a URL.72- When directly citing a source in body text, use inline superscript footnotes referencing `#source-N`. Number inline citations to match the source list order. Never cite sources only in captions.7374#### B. Route Page75Create the route page using the pattern in CLAUDE.md. Export a `metadata` object with title, description, and canonical URL.7677#### C. Blog Index Entry78Add to the POSTS array per the field spec in CLAUDE.md.7980#### D. Thumbnail Function81Follow the thumbnail spec in CLAUDE.md. Do not reuse another post's thumbnail function.8283#### E. Sitemap84Add a `<url>` block per the sitemap format in CLAUDE.md. Set `<lastmod>` to today's date.8586### Step 3: AEO Optimization (Answer Engine Optimization)87To ensure the content is picked up by AI search engines (Perplexity, ChatGPT, Google AI Overviews):88- **Direct Answers:** The first paragraph of any section must directly answer the implied question without preamble.89- **High Information Density:** Use specific numbers, percentages, and named entities. AI engines prefer dense, factual text over narrative fluff.90- **Question H2s:** Where natural, frame section headings as questions users actually search (e.g., "Will AI Replace Software Engineers?"). The paragraph immediately following must answer in the first 1–2 sentences — no preamble. Don't force it if the section topic doesn't map cleanly to a question.91- **Schema Readiness:** `faqPairs` drive the `FAQPage` JSON-LD schema injected by the layout component — they are schema-only, not rendered on page. Write questions that match real search queries distinct from the H2s. Answers must be ≤2 sentences with a specific data point in each. Target 6–8 pairs.9293### Step 3b: Self-Evaluation Pass9495After completing the draft, run a self-evaluation before saving. Read the tone guide at `TONE_GUIDE_PATH` and check the draft against:96971. **AEO formula** — quick answer block present, FAQ pairs written, at least one comparison table, question H2s throughout982. **Author assignment** — assign the correct author based on topic per the tone guide's author assignment rules993. **Tone checklist** — flag any instance of banned phrases, vague claims that could be specific, sections that don't lead with the answer, generic CTAs1004. **Competitor differentiation** — does at least one section say something top-cited competitors in this niche don't?101102Output the evaluation as a brief flagged list before the draft. Format:103- ✓ pass or ✗ [specific issue] for each criterion104- If any ✗, fix before saving. Do not ask the user to fix — fix it yourself.105106---107108### Step 4: Accessibility & Mobile109Apply these explicitly — do not defer to the publish-checklist skill:110- Expandable sections (career cards, accordions): `aria-expanded` on the toggle button.111- Decorative SVGs: `aria-hidden="true"` or inside `pointer-events-none` containers.112- All interactive elements (links, buttons) are keyboard-accessible with visible focus states.113- Responsive typography: body prose uses `text-base md:text-lg`.114- Data tables: wrap in `overflow-x-auto` or use `dl` stat rows that widen to `w-5/6` on mobile.115- Charts/graphs: use `grid-cols-1 sm:grid-cols-[...]` so labels stack above bars on mobile.116- Content previews on index pages: `line-clamp-3`.117118### Step 5: Internal Linking119120Every new post must:1211. Link to 2–3 existing published pages (blog posts, career pages, or industry pages) where naturally relevant. Use descriptive anchor text matching the target page's topic.1222. After writing, identify which existing pages should link *forward* to the new post. List them in the handoff: "Also add a link to this post from [page] in the section about [topic]."123124Do not skip — internal linking shares page authority across the cluster and signals topical depth to Google.125126### Step 6: Output and Handoff1271. Write all files per the paths in CLAUDE.md.1282. Ask the user to review the new content live in their browser at the local dev URL.1293. Once the user approves the live preview, run the publish-checklist on the new post.130131**Optional — Google Docs sync (only if the user requests it):**132- Check CONFIG.md for a `GOOGLE_DOCS_*` key matching the content type (e.g. `GOOGLE_DOCS_BLOG`).133- If no key is set, tell the user and stop.134- Google Drive MCP must be authenticated. If tools are unavailable, prompt: "Run /mcp and select Google Drive to enable doc sync."135- Always call `mcp__claude_ai_Google_Drive__read_file_content` before any write to get current doc state.136- **Write (new draft):** Append to the doc with a `---` separator and an H1 post title above the content.137- **Edit (user asks to edit a section):** Read the doc, locate the section, make the targeted change only.138- Confirm after: "Done. View at https://docs.google.com/document/d/[ID]/edit"