From podcast
Read a spec, execute every testable step, collect real results, then generate a podcast grounded in actual data — real API responses, real errors, real costs. Investigation first, narration second. Triggers: "investigate", "investigate this spec", "run and podcast", "investigate and podcast"
How this skill is triggered — by the user, by Claude, or both
Slash command
/podcast:investigateThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Read a spec, identify every testable claim, actually run the steps, collect artifacts, then
Read a spec, identify every testable claim, actually run the steps, collect artifacts, then
generate a podcast where two hosts narrate a completed investigation using real data. This is
NOT /podcast — that skill comments on docs. This skill executes them.
investigate <filepath>
The argument is a path to a spec, plan, or design doc with executable steps.
This is a hard gate. Nothing proceeds until every credential is confirmed.
TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID.env files in the project directory and repo rootecho $VAR_NAMEwhich <tool> or <tool> --versionDo NOT proceed to Phase 1 until the user explicitly confirms.
Credential safety: Never log, print, or include API keys in any output, transcript, report, or dialogue. When capturing stdout/stderr, redact any strings that look like API keys or tokens.
Parse the spec and extract an ordered list of testable steps. Look for:
Each step becomes a task:
Before executing any command, check for:
rm -rf, rm -r, or any recursive deletionDROP TABLE, DELETE FROM, or destructive SQLgit push --force, git reset --hard, or destructive git operationsIf a command looks destructive, skip it, log why, and continue.
For each step, in dependency order:
Failure handling:
Surprise handling — branch and explore: When a step produces a surprising result (unexpected failure, large divergence between expected and actual, two approaches disagreeing wildly), don't just log it and move on. Investigate WHY.
Total timeout: 30 minutes for the entire investigation. If hit, stop execution, generate the report with whatever has completed so far.
Create this structure at podcasts/<name>-investigation/:
<name>-investigation/
report.md # Structured summary (generated after all steps)
cost-summary.json # Total cost breakdown by service
steps/
01-<step-slug>/
command.sh # What was run
stdout.txt # Standard output
stderr.txt # Standard error (redacted of credentials)
artifacts/ # Any generated files
02-<step-slug>/
...
The <name> is derived from the input filename (strip path and extension).
After all steps complete (or total timeout), generate report.md:
# Investigation Report: <spec name>
**Date:** <today>
**Spec:** <filepath>
**Duration:** <total wall-clock time>
## Summary
- Steps attempted: N
- Succeeded: N
- Failed: N
- Skipped: N
- Timed out: N
## Steps
### 1. <step name>
- **Status:** success | failure | skipped | timeout
- **Duration:** Xs
- **Command:** `<what was run>`
- **Result:** <what happened>
- **Key finding:** <the interesting part>
### 2. <step name>
...
## Surprises
<anything that contradicted the spec's expectations>
## Cost Breakdown
| Service | Calls | Est. Cost |
|---------|-------|-----------|
| ... | ... | ... |
| **Total** | | **$X.XX** |
## Artifacts Index
| File | Description |
|------|-------------|
| ... | ... |
Also generate cost-summary.json:
{
"total_usd": 0.00,
"by_service": {
"service_name": { "calls": 0, "cost_usd": 0.00 }
},
"duration_seconds": 0
}
Before generating narration, check for prior investigation reports and podcasts for the same spec:
podcasts/ for existing *-investigation/report.md files matching this specIf prior investigations exist:
The goal: someone receiving this ONE file gets the full story. No "part 1 of 3." No "as we discussed in the previous episode." One standalone episode with everything.
Generate podcast dialogue from ALL investigation results (current run + any prior runs).
Person A — The investigator. Ran the whole thing, has the results, walks through what happened. Practitioner energy: "when I ran this" and "look at what came back." Gets excited about surprising results. Defends the spec when it was right, roasts it when it was wrong.
Person B — The skeptic. Didn't run it but is reacting to real data. Asks the hard questions: "okay but what about..." and "wait, that error means..." B is NOT a prompt machine — B has opinions, makes connections, sometimes takes over the conversation. B draws on experience to challenge or build on findings. Give B multi-sentence responses, their own observations, moments where they riff unprompted.
Lead with the most interesting finding, not step 1. If step 7 had a spectacular failure or step 3 returned something nobody expected, open with that. The investigation order is not the narrative order.
Reference ACTUAL results. Use real numbers, real coordinates, real confidence scores, real error messages, real file sizes, real durations. "We got back 14.6510, 121.0325" not "we got coordinates." "It timed out after 4 minutes 38 seconds" not "it took a while."
Failures are the best content. A timeout, a wrong answer, an unexpected error — these make for better stories than everything working perfectly. Dig into why it failed. Speculate. Argue about it.
When results match the spec: confirm with specifics ("the spec said 40% hit rate, we got 43% — not bad").
When results diverge: that is the interesting part. Why? What does it mean? Is the spec wrong or is the test wrong?
Tone: Same rules as /podcast:
Never use: "honestly", "genuinely", or "literally" — these are AI-dialogue crutches.
Balance rule: A and B have roughly equal airtime. If A has spoken for 3+ lines in a row, B takes over with a real thought, not a short reaction. Count the words: if A has 2x the total words as B, the dialogue is too lopsided. Rewrite.
Length: Target ~1 minute of audio per 3-4 investigation steps. A 10-step investigation gets a ~3 minute episode. Each minute is roughly 150 words of dialogue. Adjust based on how interesting the results are — boring results get shorter coverage, spectacular failures get more airtime.
Do NOT:
Reuse the existing podcast audio pipeline:
[
{"speaker": "a", "text": "Dude, so I actually ran the whole pipeline..."},
{"speaker": "b", "text": "Wait you ran it? Like, for real? What happened?"}
]
podcasts/ in the current working directory by defaultpodcasts/<name>-transcript.md
bash "${CLAUDE_PLUGIN_ROOT}/scripts/generate.sh" <temp-json> podcasts/<name>.mp3
TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID are available, upload the MP3:
curl -s -X POST \
"https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendAudio" \
-F chat_id=${TELEGRAM_CHAT_ID} \
-F audio=@"<output.mp3>" \
-F title="<spec name> — Investigation" \
-F caption="<one-line summary of what the hosts discovered>"
All files go to podcasts/ in the current working directory:
<name>.mp3 — the podcast audio<name>-transcript.md — readable dialogue with speaker labels<name>-investigation/report.md — structured investigation summary<name>-investigation/cost-summary.json — cost breakdown<name>-investigation/steps/ — per-step artifacts, logs, and outputsELEVENLABS_API_KEY not set: tell the user to set it and stop (same as /podcast)ffmpeg, jq, or curl missing: tell the user to install and stopThe investigation artifacts, podcast, and transcript are generated output. Do not commit them. Tell the user the file paths and let them decide.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub clsandoval/claude-podcast-plugin