| name | curate-episode |
| description | Extract verified quotes from Lenny's Podcast episode transcripts to populate the PM Philosophy Recommendations with real, grounded content. Triggered when asked to curate episodes, extract quotes, or enrich the PM Philosophy Recommendations with transcript data. |
Episode Curation Skill
Purpose
Extract verified quotes from Lenny's Podcast episode transcripts to power the PM Philosophy Recommendations with real, grounded content.
When to Use This Skill
- User asks to "curate an episode"
- User wants to "extract quotes from transcript"
- User requests to "enrich the PM Philosophy Recommendations"
- User asks to "continue curating" or "scale episode coverage"
Context
- Project: PM Philosophy Recommendations - interactive product philosophy discovery experience
- Data Source: Episode transcripts in
episodes/{slug}/transcript.md
- Output: Verified JSON files in
data/verified/{slug}.json
- Validation:
scripts/build-verified.ts ensures all content is valid
The 8 Philosophy Zones
- velocity: Ship fast, iterate constantly, speed compounds
- perfection: Details matter, craft excellence, leaders in the details
- discovery: User research, validation first, talk to customers
- data: Metrics-driven, experiment everything, numbers reveal truth
- intuition: Trust gut, vision over data, taste beats metrics
- alignment: Stakeholder buy-in, consensus, bring everyone along
- chaos: Embrace uncertainty, adapt constantly, plans are fiction
- focus: Do one thing perfectly, ruthless prioritization, constraints breed creativity
Pre-Flight Checks (REQUIRED before any curation)
Before curating any episode, you MUST perform these checks:
1. Verify Transcript Has REAL Content (not just frontmatter)
lines=$(wc -l < episodes/{slug}/transcript.md 2>/dev/null || echo 0)
if [ "$lines" -lt 50 ]; then
echo "SKIP: ${slug} - no real transcript (only ${lines} lines)"
fi
If the transcript file has fewer than 50 lines, SKIP this episode. Files with ~30-40 lines contain only YAML frontmatter metadata and a "Transcript not yet available" placeholder. An episode cannot be curated without actual transcript content - there is no workaround.
2. Check If Already Curated
ls data/verified/{slug}.json
If the JSON file already exists, SKIP this episode unless the user explicitly asks to re-curate it.
3. Batch Curation: Use the Curation Tracker
When asked to "curate more episodes" or "scale to N episodes", consult CURATION_TRACKER.md in the project root. It contains:
- Current curation count and milestones
- Pre-sorted lists of uncurated episodes organized into batches of 25
- Line counts for each episode's transcript
- Possible duplicates to investigate
cat CURATION_TRACKER.md
If the tracker is outdated or you need to verify programmatically:
for dir in episodes/*/; do
slug=$(basename "$dir")
file="${dir}transcript.md"
if [ -f "$file" ]; then
lines=$(wc -l < "$file")
if [ "$lines" -gt 50 ]; then
echo "$slug"
fi
fi
done
ls data/verified/*.json | grep -v verified-content.json | sed 's|data/verified/||;s|.json||'
Never assume an episode has a transcript. Always verify the file has 50+ lines of real content. Out of ~294 episode slugs, many have only frontmatter placeholders.
After batch curation, update CURATION_TRACKER.md to mark the batch complete and adjust counts.
4. NEVER Modify Existing Curated Files
When curating new episodes:
- ONLY create new JSON files - never edit/overwrite existing
data/verified/*.json files
- NEVER run
npx tsx scripts/build-verified.ts from within a sub-agent - this modifies verified-content.json and lib/verifiedContent.ts which are shared files. Only the main orchestrator should run the build script ONCE after all curations are complete
- NEVER modify
data/verified/verified-content.json or lib/verifiedContent.ts directly
- If you see a file already exists at the target path, STOP and report it rather than overwriting
5. Log Skipped Episodes
If any episodes are skipped (no real transcript, already curated), report them clearly to the user so they know what was excluded and why.
Quote Extraction Process
Step 1: Read the Transcript
Step 2: Select 10-12 Best Quotes
Quality Criteria:
- ✅ 120-500 characters (substantive but standalone)
- ✅ From the guest speaker (not Lenny)
- ✅ Actionable insight, strong opinion, or memorable wisdom
- ✅ CRITICAL: NOT from first 5 minutes (00:00:00 to 00:05:00) - These are episode highlights/duplicates that appear later in full form
- ✅ If you see a great quote in the first 5 minutes, find the FULL version later in the transcript
- ✅ NOT from sponsor segments or intro/outro
- ✅ NOT generic platitudes - must be specific and distinctive
What Makes a Great Quote:
- Strong opinions backed by experience
- Contrarian or counterintuitive insights
- Specific frameworks or mental models
- Memorable one-liners that crystallize ideas
- Trade-offs and tensions (not just "best practices")
AI-Related Insights (IMPORTANT FOR 2024-2026 EPISODES):
Many recent episodes discuss AI extensively. When extracting AI-related quotes, capture:
- AI adoption strategy: Fast vs cautious, leading edge vs proven, experimentation mindset
- AI vs human judgment: When to trust AI, when to override, role of taste/intuition
- AI in workflows: How teams actually use AI tools, productivity gains, integration challenges
- AI product strategy: Building AI products, AI-first vs AI-enhanced, competitive moats
- AI risks/trade-offs: What gets lost with AI, quality concerns, human skills atrophy
- Contrarian AI takes: Skepticism of hype, areas where AI fails, human superiority
Zone Mapping for AI Insights:
- velocity: AI enables faster shipping, rapid iteration, speed of adoption
- perfection: AI quality concerns, craftsmanship with AI, when to slow down
- discovery: AI in user research, AI-assisted validation, synthetic users
- data: AI-driven insights, ML experimentation, AI analytics
- intuition: AI vs human taste, trusting gut over AI recommendations
- alignment: AI governance, stakeholder AI concerns, change management
- chaos: AI-induced uncertainty, rapid AI landscape changes, adaptability
- focus: AI for one thing vs AI everywhere, constraints in AI era
Step 3: Tag Each Quote
For each quote, identify:
- Themes (2-4 tags): Be specific and descriptive
- AI themes: "ai-adoption", "ai-product-strategy", "ai-workflows", "ai-vs-human", "ai-risk", "ai-velocity", "ai-quality"
- Product themes: "product-market-fit", "user-research", "roadmap", "prioritization", "launch-strategy"
- Execution themes: "velocity", "quality", "team-structure", "decision-making", "metrics"
- Leadership themes: "founder-mode", "delegation", "communication", "culture", "hiring"
- Growth themes: "growth-loops", "retention", "acquisition", "monetization"
- Zones (1-3 zones): Which philosophy zones does this quote exemplify?
- Line numbers: Exact lineStart and lineEnd from transcript (camelCase)
- Timestamp: Speaker timestamp (e.g., "00:15:30")
- Contrarian?: Mark candidates that are spicy/opinionated or counter-narrative (for use in insightsData contrarianViews)
Step 4: Write Takeaways (REQUIRED)
Extract 5 key takeaways that:
- Synthesize the guest's main insights
- Are actionable and specific (not vague)
- Represent different aspects of their philosophy
- Could stand alone as tweet-worthy wisdom
- Should be memorable and shareable
Step 5: Calculate Zone Influence (REQUIRED)
Distribute 1.0 total across all 8 zones based on:
- Which zones the guest's quotes most align with
- The guest's overall product philosophy
- Balance - most guests touch 3-5 zones meaningfully
- Example:
{"discovery": 0.30, "focus": 0.20, "data": 0.15, ...}
- Must sum to exactly 1.0
Step 6: Add Guest Metadata (REQUIRED)
Capture guest metadata for diversity scoring in recommendations:
guest_type (required - pick one):
founder - Started/co-founded a company (Brian Chesky, Dylan Field, Tobi Lutke)
operator - Executive/VP at companies they didn't found (Shreyas Doshi, Julie Zhuo, Boz)
investor - VC, angel, or fund partner (Ben Horowitz, Dalton Caldwell)
advisor - Consultant, author, or domain expert (Marty Cagan, April Dunford, Annie Duke)
academic - Professor, researcher (rare in Lenny's podcast)
company_stage (required - pick one):
pre-seed - Very early stage, pre-product
seed - Early product, finding PMF (Nikita Bier's companies)
series-a - Post-PMF, early growth
growth - Series B+ private company (Figma pre-acquisition, Superhuman)
public - Public company (Airbnb, Shopify, Meta, Slack)
mixed - Guest has experience across multiple stages (advisors, investors)
primary_topics (required - 3-5 tags):
- Core themes this guest is known for
- Should be specific and searchable
- Examples: "product-market-fit", "growth-loops", "founder-mode", "ai", "design"
Step 7: Regenerate Registry (CRITICAL - DO NOT SKIP)
After saving the JSON file, you MUST run the build script to update the registry:
npx tsx scripts/build-verified.ts
This script:
- Validates all JSON files in
data/verified/
- Regenerates
data/verified/verified-content.json (master registry)
- Regenerates
lib/verifiedContent.ts (TypeScript constants)
- Checks for duplicate quotes, missing zones, and invalid references
If you skip this step:
- The new episode will NOT appear in episode pages
- The quotes will NOT be available for recommendations
- The episode will NOT count toward coverage statistics
The build script output should show:
✅ Registry built: data/verified/verified-content.json
X episodes, Y quotes
Where X and Y increase by the number of episodes and quotes you just added.
What Gets Used Where
Philosophy Quiz Flow (Quiz → Contradictions → Results):
- Uses
zone_influence to determine guest's philosophy profile
- Uses verified
quotes (via quoteId) in contradictions debate
- Uses
takeaways to show guest wisdom
Individual Episode Pages:
- Uses
quotes for verified quotes section (shows with themes/zones)
- Uses
takeaways for key insights summary
- Uses
insightsData.ts (separate file) for:
- Contrarian views - spicy takes displayed with 🔥 icon
- Quotable moments - memorable one-liners
- Frameworks - named concepts/mental models
- Philosophy alignment - zone distribution
Note: insightsData.ts is auto-generated separately and NOT part of this curation skill. This skill focuses on verified quotes, takeaways, and zone_influence.
Output Format
{
"slug": "guest-name",
"quotes": [
{
"id": "guest-name-q001",
"speaker": "Guest Name",
"text": "Direct quote from speaker...",
"timestamp": "00:15:30",
"source": {
"slug": "guest-name",
"path": "episodes/guest-name/transcript.md",
"lineStart": 123,
"lineEnd": 125
},
"themes": ["theme1", "theme2", "theme3"],
"zones": ["zone1", "zone2"]
}
],
"themes": ["theme1", "theme2", "theme3"],
"takeaways": [
"First key insight that synthesizes their philosophy",
"Second actionable takeaway",
"Third memorable wisdom",
"Fourth contrarian point",
"Fifth practical framework"
],
"zone_influence": {
"velocity": 0.15,
"perfection": 0.20,
"discovery": 0.10,
"data": 0.15,
"intuition": 0.15,
"alignment": 0.10,
"chaos": 0.05,
"focus": 0.10
},
"contrarian_candidates": [
{
"quoteId": "guest-name-q001",
"why": "Why this take is provocative/contrarian",
"related_zones": ["zone1", "zone2"]
}
],
"guest_metadata": {
"guest_type": "founder",
"company_stage": "public",
"primary_topics": ["topic1", "topic2", "topic3"]
}
}
Validation Checklist
Before saving, verify:
Common Mistakes to Avoid
❌ Don't:
- Attempt to curate an episode without first verifying the transcript exists - not all episodes have transcripts
- Assume episode slugs have transcripts - always check
episodes/{slug}/transcript.md exists before starting
- Skip the pre-flight checks when batch curating - programmatically find eligible episodes
- Include Lenny's questions as quotes
- Extract generic advice ("talk to users", "ship fast")
- Use quotes from sponsor segments
- CRITICAL: Include episode highlights from the first 5 minutes (00:00:00 to 00:05:00) - These are condensed versions that appear in full later
- Extract from timestamps 00:00:00 to 00:05:00 - always search for the full version later in the episode
- Tag every quote with "product-management" theme
- Assign equal zone influence to all zones
- Forget to verify line numbers AND timestamps match the actual transcript location
✅ Do:
- Focus on the guest's unique perspective
- Capture specific frameworks and mental models
- Include contrarian or spicy takes
- Show trade-offs and nuance
- Tag themes specifically (e.g., "product-market-fit" not just "product")
- Weight zone influence based on actual content
- Verify timestamps and line numbers are accurate
Example Workflow
- Read transcript for
marty-cagan
- Scan for strong quotes - found his "product manager is a creator, not facilitator" insight
- Verify line number - line 168 in transcript
- Tag appropriately - themes: ["product-management", "empowerment", "creator"], zones: ["focus", "perfection"]
- Extract 11 more quotes following same process
- Write 5 takeaways synthesizing his philosophy
- Calculate zone influence - discovery (0.30), focus (0.20), alignment (0.15)...
- Add guest_metadata - guest_type: "advisor", company_stage: "mixed", primary_topics: ["product-discovery", "empowerment"]
- Save to
data/verified/marty-cagan.json
- Run build script -
npx tsx scripts/build-verified.ts to update registry (CRITICAL!)
Example: AI-Heavy Episode
For a 2024-2026 episode with significant AI discussion:
- Read transcript and identify AI segments
- Extract AI-specific quotes:
- "AI lets us ship 10x faster but we still need human taste to know what's worth shipping"
→ themes: ["ai-velocity", "intuition", "velocity"], zones: ["velocity", "intuition"]
- "We moved from 30 customer interviews to 300 AI-simulated users, quality dropped 20% but speed increased 10x"
→ themes: ["ai-workflows", "user-research", "trade-offs"], zones: ["velocity", "discovery", "chaos"]
- Balance AI with non-AI quotes - don't make it 100% AI unless guest's primary focus
- Zone influence should reflect AI's role:
- Heavy AI adoption → higher velocity/chaos scores
- Cautious AI approach → higher perfection/discovery scores
- AI+data emphasis → higher data scores
- Takeaways should synthesize AI perspective among other insights
After Curation
Run the build validator once after all episodes are curated (not per-episode):
npx tsx scripts/build-verified.ts
IMPORTANT: When batch curating with parallel agents, do NOT run this script from within each agent. Run it ONCE from the main context after all JSON files are written. Running it from multiple agents simultaneously will cause race conditions and corrupt shared files (verified-content.json, lib/verifiedContent.ts).
This will:
- Validate all quote IDs are unique
- Check line numbers exist in transcripts
- Verify zone references are valid
- Detect duplicate quotes
- Show coverage statistics
- Generate registry files
Coverage Stats
Run npx tsx scripts/curation-stats.ts to see:
- Current progress and episode coverage
- Which zones need more coverage
- Recommended episodes to curate next
- Theme distribution
Tips for Speed
- Read efficiently - skim for the guest's strongest moments
- Look for frameworks - named concepts, mental models, processes
- Capture tensions - when guest discusses trade-offs
- Trust your judgment - if a quote resonates, it's likely good
- Batch similar work - extract all quotes first, then tag themes
- Use patterns - guests often repeat key ideas, find the best articulation
Quality Over Quantity
Better to have 8 exceptional quotes than 12 mediocre ones. Each quote should make someone think "I need to remember this" or "That's a contrarian take I haven't heard."