---
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

```bash
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:

1. **Backup** the current defaults: copy `~/.kai-marketing/marketing-defaults.md` to `~/.kai-marketing/marketing-defaults.md.bak`

2. **Write** updated defaults to `~/.kai-marketing/marketing-defaults.md`:

```markdown
# 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}
```

3. Also write findings to `~/.kai-marketing/what-works.md` (backup first):
```markdown
# 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)
