| name | content-retro |
| description | Analyze content performance patterns. Extract what works (hook types, formats, personas). Auto-update learned defaults so future content improves. |
/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.md to ~/.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
.bak if available, otherwise start fresh
- No performance data: Direct to
/content-report first
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)