Content retro
Open-source AI CMO for Claude Code: marketing agent skills for SEO, content, email, ads, launches, CRO, AEO/GEO, and AI-search visibility.
npx -y skills add cgallic/kai-cmo-harness --skill content-retroAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
Analyze content performance patterns. Extract what works (hook types, formats, personas). Auto-update learned defaults so future content improves.
SKILL.md
4.6 KB, as published. Nobody here has run it
/content-retro — The CMO's Feedback Loop
Analyze what's working across your published content. Extract winner patterns and auto-update the system's learned defaults so future content improves without manual tuning.
This is the skill that closes the loop. Everything upstream — /content-brief, /content-write, /content-gate — reads the defaults this skill updates.
Preamble
source "$(dirname "$0")/../lib/preamble.sh"
The Skill
Step 1: Load Performance Data
Read ~/.kai-marketing/content-log.jsonl and filter for pieces with performance_30d set (not null).
If fewer than 5 graded pieces exist, tell user: "Need 5+ graded pieces for reliable pattern extraction. You have {N}. Run /content-report to grade pending pieces, or publish more content."
Step 2: Pattern Analysis
Analyze the graded pieces for statistical patterns. For each dimension, compare winner rates:
Dimensions to analyze:
- Hook type: Which hook types (curiosity gap, social proof, pain agitate, contrarian, data-led) produce more winners?
- Format: Which formats (blog, linkedin, email, etc.) perform best?
- Persona: Which personas produce winners?
- Word count range: Is there a sweet spot?
- Publish day of week: Does timing matter?
- Quality gate score: What score range correlates with winners?
Statistical threshold: A pattern is significant only when:
- n >= 5 samples for that dimension value
- Winner rate delta >= 15% above baseline
Step 3: Display Findings
CONTENT RETRO — Pattern Analysis
══════════════════════════════════════════
Data: {N} pieces analyzed ({winners} winners, {avg} average, {under} underperformers)
SIGNIFICANT PATTERNS (n≥5, delta≥15%):
Hook Type:
curiosity_gap: 72% winner rate (n=7) ← +22% above baseline
social_proof: 40% winner rate (n=5) ← baseline
pain_agitate: 33% winner rate (n=6) ← -17% below baseline
Persona:
Shock Absorber: 80% winner rate (n=5) ← +30% above baseline
Competent Cog: 50% winner rate (n=8) ← baseline
Format:
blog: 65% winner rate (n=12) ← +15% above baseline
NOT ENOUGH DATA:
- Publish day: need 5+ per day (max is 3 for Tuesday)
- Word count: need 5+ per range
Step 4: Update Learned Defaults
For each significant pattern, propose updating the learned defaults:
"Found {N} significant patterns. Update learned defaults?"
If user approves:
-
Backup the current defaults: copy
~/.kai-marketing/marketing-defaults.mdto~/.kai-marketing/marketing-defaults.md.bak -
Write updated defaults to
~/.kai-marketing/marketing-defaults.md:
# Learned Defaults — Auto-Generated by /content-retro
# Last updated: {date}
# Based on: {N} pieces analyzed
## Hook Preferences
- Prefer curiosity_gap hooks (72% winner rate, n=7)
- Avoid pain_agitate hooks when alternatives exist (33% winner rate, n=6)
## Persona Preferences
- Shock Absorber persona produces strongest results (80% winner rate, n=5)
## Format Preferences
- Blog format outperforms others (65% winner rate, n=12)
## Quality Floor
- Winners average gate score: {avg_winner_score}/100
- Minimum gate score for publish: {recommended_threshold}
- Also write findings to
~/.kai-marketing/what-works.md(backup first):
# What Works — Pattern Archive
# Auto-updated by /content-retro
## {date} Analysis ({N} pieces)
{summary of findings}
Step 5: Confirm the Loop
Tell user: "Defaults updated. Next /content-brief and /content-write will use these patterns automatically."
Show the chain:
/content-retro just updated → marketing-defaults.md
└→ /content-brief reads defaults → better briefs
└→ /content-write reads defaults → better content
└→ /content-gate scores → better pass rate
└→ /content-report grades → more winners
└→ /content-retro analyzes → loop continues
Error Handling
- Not enough data (n<5): Show what data exists, suggest publishing more
- what-works.md corrupted: Restore from
.bakif available, otherwise start fresh - No performance data: Direct to
/content-reportfirst
Chain State
Reads from: ~/.kai-marketing/content-log.jsonl (graded entries)
Writes to: ~/.kai-marketing/marketing-defaults.md, ~/.kai-marketing/what-works.md
Read by: /content-brief, /content-write (next cycle)