This skill requires running shell commands (Phase 5 link verification, Phase 6 QA runner). It must be executed in a context with full exec permissions.
Always spawn the writing subagent with security: "full":
text
sessions_spawn(
task: "[full article brief]",
runtime: "subagent",
security: "full" ← REQUIRED — without this, exec approval gates block Phase 5 & 6
)
If running in main session directly (fallback only), exec permissions are already sufficient — proceed normally.
Never spawn without security: "full" — the subagent will silently skip QA and deliver an unverified draft.
product/context.md) for current product factsbrand/voice.md) for voice and red linesblog/plan/internal-links-map.md) for internal linking targetsblog/plan/content-plan.md) for where this article fits in the topic clusterFor the primary keyword, search Google and analyze top 5 results:
Run the QA runner to analyze SERP gaps during research:
bash
python3 skills/seo-geo-qa/scripts/seo_qa_runner.py path/to/draft.md --keyword "best email apps for mac"
Use the lower-level analyzer only when debugging SERP gaps in isolation:
bash
python3 skills/seo-geo-qa/scripts/serp_gap_analyzer.py "best email apps for mac" path/to/draft.md
python3 skills/seo-geo-qa/scripts/serp_gap_analyzer.py "best email apps for mac" path/to/draft.md --urls https://competitor1.com https://competitor2.com
Intent TypeSignalArticle ApproachInformational"what is", "how to"Definitive guide, answer-firstComparison"best", "vs", "alternatives"Structured comparison, table-heavyCommercial"review", "pricing"Detailed evaluation, honest pros/consNavigationalbrand nameProduct-focused, feature deep-dive
Save to your blog plan directory (e.g. blog/plan/) before writing:
markdown
## Research Brief: [Title]
- Primary keyword:
- Secondary keywords:
- Search intent:
- Target word count:
- Top 5 competitor URLs + word counts
- Content gaps to exploit
- Internal links to include
- External authority sources identified
text
# H1 — Contains primary keyword, under 60 chars
Opening hook (150-200 words)
- Define the problem/question
- Why this matters now
- What this article covers
## Quick Comparison Table (for comparison articles)
## Detailed Reviews / Sections (bulk of article)
### H3 subsections as needed
## How We Tested / Methodology
## How to Choose / Decision Framework
## FAQ (4-6 questions, schema-markup ready)
## Further Reading (internal + external links)
Word Count by Type:
TypeMinimumTargetComparison / Listicle2,5003,000-3,500How-to Guide1,5002,000-2,500Thought Piece1,0001,500-2,000Product Comparison (vs)2,0002,500-3,000
Keyword Density:
Paragraph Structure:
Readability Target:
Word CountInternal Links MinTarget< 150023-51500-250035-82500-350058-123500+710-15
blog/plan/internal-links-map.md)Content TypeExternal Links MinRationaleComparison / Best-of (8+ products)16-24Each product: official site + 1 authority sourceComparison / Best-of (5-7 products)12-18Same ratioAlternatives page10-15Each alternative + authority sourcesHow-to guide5-10Claims need sources, fewer entitiesThought piece3-8Fewer claims, more perspective
The principle: Every entity mentioned gets a link. Every factual claim gets a source. Don't link for the sake of linking.
These boost visibility in AI search engines (ChatGPT, Perplexity, Google AI Overviews):
SignalImpactHowStatistics with sources+37%"According to [Source], X% of users..."Quotations (expert quotes)+30%"As [Name], [Title] at [Company], notes..."Authoritative tone+25%Write with demonstrated expertise, not hedge languageAuthoritative citations+40%Link to research, not just claimsClear definitions+20%Definition in first paragraph of each sectionFAQ with schema+30-40%Natural Q&A format at bottom"Last updated" date+freshnessInclude at bottom of article
Evidence sandwich pattern — Structure every major claim as: Claim → Evidence → Interpretation
"Most users prefer [X] [claim]. A 2024 study of 1,000 professionals found Y [evidence]. This means Z for your specific workflow [interpretation]."
Stats without interpretation are noise. Interpretation without evidence is opinion. The sandwich does both and is the format AI systems are most likely to excerpt.
AI systems extract passages, not pages. Each key point should work standalone:
Different AI systems cite differently. Write each major section to satisfy all four:
PlatformWhat it prefersFormat to useGoogle AI OverviewsDirect answers, tables, listsLead with 40-60 word direct answer. "X is [definition]. Key points: [numbered list]."PerplexityEvidence with methodology, attributed data"Research shows [finding] (N=size, method, year)." Front-load sample size and date.ChatGPTMultiple angles, acknowledged limitations"While X is generally true, Y also matters because..." Cover edge cases.ClaudeLogical cause-and-effect chains"Because X happens, Y results, leading to Z." Structure reasoning, not just conclusions.
In practice: One well-structured section satisfies all four. Lead with direct answer (Google), follow with sourced evidence (Perplexity), add nuance (ChatGPT), ensure logical flow throughout (Claude).
For "Best X" / "X Alternatives" / "X vs Y" articles:
After writing each H2 section, check these 4 things before moving to the next section. Fix inline. Do not save the check for Phase 4.
text
□ Banned words: delve, seamlessly, robust, leverage, revolutionize, holistic, tapestry,
navigate (metaphor), harness, paradigm, synergy, game-changer, elevate
□ Long sentences: any sentence > 35 words? Split it.
□ Throat-clearing opener: section starts with "It's important to..." / "When it comes to..."?
Cut it — start with the point.
□ Em-dash density: > 1 em-dash per 200 words? Rewrite as commas, semicolons, or split sentences.
If any box is checked: rewrite only the flagged sentence(s). Then move on. This takes under 30 seconds per section and catches problems at the source rather than in a painful batch rewrite at the end.
CRITICAL: Content must not read like AI wrote it.
Common AI patterns to eliminate:
PatternExampleFixEm-dash overuse"The tool — which is powerful — works well"Use commas or periods instead. Max 3 em-dashes per article."Delve into""Let's delve into the features""Here's what it does" / "Let's look at""Landscape""In today's email landscape"Cut it. Be specific."Leverage""Leverage AI to improve""Use AI to improve""Tapestry/Mosaic""A rich tapestry of features"Just describe the features."Revolutionize""Revolutionizing how you email""Changes how you email""Game-changer""This is a game-changer"Say what it actually changes."Seamlessly""Seamlessly integrates""Integrates" or "works with""Robust""A robust set of features""A full set of features" or just list them."Elevate""Elevate your inbox experience""Improve" or describe the specific improvement."Navigate" (metaphor)"Navigate your inbox challenges""Deal with" / "Handle" / "Manage""Harness""Harness the power of AI""Use AI to...""Paradigm""A paradigm shift"Describe the actual change."Synergy""Create synergy between...""Works well with" or describe specifically."Holistic""A holistic approach""A complete approach" or be specific."At the end of the day"FillerCut it."Without further ado""Without further ado, here's..."Just start.Triple-adjective stacking"Powerful, intuitive, and elegant"Pick one. Prove it.Rhetorical questions"But what if there was a better way?"State the better way."In conclusion" / "In summary""In conclusion, [Product] is the best"Just make your point.
Self-check: Read the article out loud. If any sentence sounds like a press release, rewrite it.
Never deliver content without verifying every link.
web_fetch or curl -sIFor external sources that are not obviously authoritative, check whether they are worth citing:
https://aitdk.com/traffic/<domain> for traffic / keyword / domain-age hints when accessiblesite:domain.com, branded query, and recent indexed pages if third-party tools are blockedDo not require perfect metrics. The goal is to catch weak, stale, spammy, or irrelevant sources before they land in the article.
markdown
**Original:** https://broken-link.com (404)
**Replacement:** https://working-link.com
**Reason:** Original returned 404
**Verified:** ✅ Same data confirmed
If citing a review → verify the quote exists AND the article's overall tone matches your framing
Tone match test: Read the first 3 paragraphs of the source article. Is it positive, negative, or neutral?
Don't pull positive fragments from negative reviews — readers click through and lose trust
Statistics must match their cited source exactly (number, date, methodology)
"According to [Source]" → verify Source actually says that
After completing Phase 5, ALWAYS run the QA runner before spawning a review agent or delivering the draft. Do not skip this. Do not ask whether to run it.
bash
python3 skills/seo-geo-qa/scripts/seo_qa_runner.py path/to/article.md --keyword "primary keyword"
qa-reports/{slug}/ next to the articleAlways spawn a review agent after Phase 6 passes. The review agent checks:
Review must check:
blog/plan/brief-{slug}.mdblog/seo/{slug}.md (SEO) or blog/{slug}.md (general)/blog/{slug}文章类型标题带年份?原因比较类 (best X, X alternatives)✅ 是年份是搜索关键词的一部分("best email app 2026")教育型 / How-to❌ 否搜索意图是常青的,年份反而限制文章寿命场景痛点❌ 否同上功能发布❌ 否功能不按年份搜索思想 / 署名文章❌ 否同上
content-production — Mandatory produce → review → revise workflowcontent-qa — QA checklist and review agentseo-audit — Technical SEO checks for the whole siteseo-geo — GEO optimization for AI search enginescompetitor-alternatives — Comparison page structureschema-markup — JSON-LD implementationcopy-editing — Multi-pass editing framework