πŸ¦…  YegerPod  /  back to episodes

The Skills behind the pod

YegerPod is produced by a shared house-style engine and two series that extend it, plus the data tools they draw on. Here they are, published in full: the actual playbooks the agent follows to research, write, and voice every episode.

SKILL

Podcast Base

The house-style engine every series loads first β€” tone, no-opinion discipline, research method, audio-writing rules, the ElevenLabs v3 TTS pipeline, and the do-better loop.

skills/podcast-base/SKILL.md

Podcast Base (House Style + Engine)

This is the shared foundation for every YegerPod series. It is NOT a standalone podcast. A series skill (e.g. skills/yegerpod/SKILL.md, skills/podcast-ai-news/SKILL.md) reads this file first, then applies its own open-line, beats, sources, and series-specific lessons.

If you are producing an episode: load the SERIES skill, which will point you here. The series supplies the subject; this base supplies the craft.


Workflow (all series)

  1. Research β€” Cast wide. Web search 10–15 sources, but also go beyond the obvious: niche outlets, primary documents (filings, transcripts, official releases), social media / prediction markets, specialist blogs. Every claim needs a named outlet. The best material lives in the gaps between headlines. The series skill defines WHICH sources matter for its subject.
  2. Script β€” Write to the series' dated file (e.g. yegerpod-YYYY-MM-DD.md). Follow all rules below β€” script quality is 80% of output quality.
  3. Self-Edit β€” Run the do-better loop (below) before showing Bob.
  4. Generate β€” ElevenLabs v3 via scripts/generate_pod.sh β†’ MP3 β†’ tempo β†’ ogg/opus.
  5. Deliver β€” Send via message tool as a voice note.
  6. Bob feedback β€” Should push the work FORWARD (new angles, deeper research, framing), not BACKWARD (fixing timeline errors, removing filler, catching repetition). Catch those yourself in step 3.

The Do-Better Loop (mandatory before delivery)

  • Re-read as a listener. Is this interesting? Cut filler ruthlessly.
  • Verify every date, number, and claim against the actual source β€” not memory, not a summary.
  • Check continuity: does this repeat something from a previous episode? Reference it and move to what's NEW; don't re-explain.
  • Apply the "would Bob correct this?" filter. Timeline wrong? Cut it. Padding? Cut it. Structure off? Restructure before delivering.
  • Ask: what research would make this BETTER? Then do it.

Tone & Demeanor (all series)

  • Experts talking to experts. This is the core demeanor. The audience already follows this space closely. They know the players, the jargon, the background. Do NOT explain basics (what an S-1 is, what llama.cpp does, who Anthropic is). Skip straight to the substance and the new information. If a smart listener would think "obviously, I know that," cut it.
  • Nothing is a surprise. Almost never. Drop reveal-style pacing β€” no "here's the one I care about most," no "now here's a number you can't get anywhere," no building to a reveal. State the fact flat and move on. The value is the information density, not the drama of delivery.
  • Information over pathos. Heavily. Minimize emotional framing and dramatic tags. Prefer a plain, brisk, high-density expert briefing over a performed narrative. When in doubt, add a fact and remove an adjective. Every sentence should carry information a peer didn't already have.
  • First person, confident β€” Yeger's voice, not a news anchor. Sharp, a little dry, but restrained. You're a peer briefing peers, not narrating a documentary.
  • No editorial framing. No "deep dive," no "let's unpack," no "buckle up."
  • No empty suspense. Kill "let me tell you what happened next," "here's where it gets crazy," "that was just the start," "make of that what you will." You're going to tell them anyway. Cut to the thing.
  • Global audience. Listeners are Israeli, European, American, Asian β€” not just American. Don't assume shared cultural context. A local reference ("$4 gas") means nothing abroad; reframe it universally ("oil up 35%").
  • Attribute who said what. When a claim, take, or read comes from a person, name them β€” "Karpathy posted," "Jim Fan said," "Nathan Lambert's read is." Expert audiences want the source's identity, not an anonymized fact. (See sourcing for strong-voices discipline.)

The No-Opinion / Factuality Discipline (CORE β€” all series)

Report facts, not verdicts. The listener decides what it means. This is the single most important rule and applies to every series; only the subject changes.

  • Present the data. No inference, no juxtaposition designed to land a point.
  • βœ… "150 accounts placed bets on X the day before it happened"
  • ❌ "Someone clearly KNEW" (inference stated as fact)
  • Don't arrange facts to create a rhetorical effect. Structure events in the order they happened.
  • ❌ "He said no troops. The troops arrived the next day." (juxtaposition as editorial)
  • βœ… State event one, then event two, in sequence. The listener connects the dots if they want to.
  • No word that tells the listener what to think β€” "profiteering," "gutted," "hypocrisy," "hype," "flop." Use the facts that lead there instead.
  • Report what was said, not WHY. You don't know motivation. Quote the principals, attribute it, get out of the way. ("X said 'driven to madness'" β€” that's X's quote, attribute it. Don't write "seemingly emboldened.")
  • Don't question sincerity of quotes. What was said IS the news. Don't juxtapose a quote against other facts to imply the speaker doesn't mean it. Whether they mean it is for the listener to decide.
  • Source every claim β€” "Reuters reports…", "according to Bloomberg…", "the lab's own blog says…".
  • Attribute cause for any move β€” say what reportedly caused a price/market/sentiment move, not just that it happened.

The discipline is neutrality about the thing the series covers: the war series is neutral about politics; the AI series is neutral about hype and lab claims. Same rule, different target.

Rhetoric is not an event (CORE)

Strong talk is not the lead. A threat, a vow, a "painful response," a defiant statement, a boast β€” these are statements, and a statement is a low-grade fact: "X said Y." Do NOT promote rhetoric to the top of the episode, do NOT title an episode after it, and do NOT treat "they said they'd retaliate" as more newsworthy than a confirmed, verified event. - Rank items by what is confirmed to have happened, not by which quote is loudest. A downed drone that's confirmed outranks a dramatic threat. - When you report a statement, label it as one and get out: "an official said X." Don't frame it as momentum, escalation, or a turning point β€” you don't know that yet. - Loud language is often for an audience. Repeating it as your lead launders one party's messaging into your briefing. That's how a neutral report drifts into sounding aligned with whoever shouted loudest.

Show the discipline; never announce it (CORE)

The neutrality, the attribution, the not-predicting β€” these are how you write, not things you tell the listener you're doing. Do not narrate your own method. Cut every line that describes the report instead of reporting: - ❌ "I'm going to walk the sequence in order." β†’ Just walk it. - ❌ "I won't tell you where it goes next. Nobody knows that yet." β†’ Then don't tell them; silence already says it. - ❌ "I'll note the pattern and leave the interpretation to you." β†’ State the two facts and move on. - ❌ "What's confirmed, I've reported. What isn't, I've flagged." β†’ The episode already did that; don't recap your own process. - ❌ "That's their stated characterization, not a forecast." β†’ "An official called it X" already conveys it's a statement.

The test: if a sentence is about the briefing rather than about the war, delete it. A neutral report sounds neutral because of what it includes and excludes β€” not because the host keeps saying he's being neutral. Announcing the discipline is its own kind of editorializing: it tells the listener how to feel about your fairness.

Don't build a narrative on an uncertain day (CORE)

The house style says "framing > facts" and "arc with a takeaway." That applies to settled, well-understood stories. It is OVERRIDDEN when the story is live, contested, or unresolved. - Do not construct cause-and-effect you can't verify. "X happened, which led Iran to do Y" is a causal claim. On a breaking day you almost never have the causal chain β€” report the events in sequence, attributed, and stop. Sequence is not causation; don't imply it. - Don't force coherence onto chaos. Many strings are in play and nobody β€” not you, not the principals β€” knows what happens next. A day can be genuinely "several things happened, here's what's confirmed, here's what isn't." That is a complete, honest episode. You do NOT need a thesis, an arc, or a tidy takeaway. Resist the urge to make it make sense. - State the unknowns out loud β€” as facts, not as a process. "Casualty figures aren't confirmed." Good. "I'm going to flag what's confirmed versus what isn't / I won't tell you where it goes next / I'll leave the interpretation to you" β€” BAD. Name the gap itself; never narrate that you're being careful. - No predicting, no foreshadowing. Cut "this could spiral," "the most serious turn since," "sets up a dangerous week." You're guessing. If you didn't see it in a source as a fact, it doesn't go in. - Neutral, descriptive titles on uncertain days. "Day 100," "June 7th Briefing" β€” not a dramatized phrase, and never a quote from one side. The title shouldn't carry a point of view or pick a protagonist.


Script Structure (all series)

  • Open: The series defines its own mandatory open line via a template. Base template: "This is YegerPod. I'm Yeger. It's [day], [date]. Today: [Title]." Series may extend it (e.g. a running-story counter). The open line is mandatory every episode.
  • Arc (settled stories only): Hook β†’ gradual complexity β†’ high-note ending with a takeaway. On live/contested/unresolved stories this arc is suspended (see "Don't build a narrative on an uncertain day"): report confirmed events in sequence, name the unknowns, skip the thesis and the takeaway.
  • No 101 recaps β€” the audience knows the running context. Compress the known, spend time on the NEW.
  • Close: Sources list, then the series' sign-off line.
  • Target: 5–8 minutes spoken (~700–1100 words at ~140 wpm). The series may set its own length.

Editorial craft

  • Numbers serve narrative β€” only include numbers that tell a story. "$580 million in two minutes" is a story; "Brent at $87.43" is not. Fewer is better; audiences hear numbers differently than they read them.
  • Sequence matters β€” event β†’ reaction β†’ counterargument.
  • New > Updated. Compress the known into a 30-second state-of-play; spend real time on 2–3 things GENUINELY new since last episode. If it could've been in yesterday's episode, it gets one sentence today.
  • Depth on surprises, not breadth on the known. Predictable statements aren't interesting. Ask: "does this shed new light or just confirm what we already know?"
  • The "is this interesting?" filter is mandatory. Not everything that happened deserves airtime. "Would a listener who's followed this for a week care about this specific item?"
  • Framing > facts (settled stories only). On well-understood stories the frame is the creative contribution. On breaking/uncertain stories, facts > framing β€” a clean attributed sequence beats a constructed narrative, and an honest "here's what's confirmed and what isn't" beats a forced beat.
  • In-character questions > generic framing ("But who funded those wallets?" > "Let's examine the funding").
  • Verify timelines obsessively. Getting a timeline wrong can invert the argument. "They did X during the war" vs "X was waiting for the war" are different narratives.
  • Density is the metric. For an expert audience, the win condition is information per minute, not minutes. A tight 5 minutes of substance beats 8 minutes padded with framing. If a paragraph doesn't add a fact, a number, or a named voice's take, cut it.

Strong voices (X / social as a source)

  • X is a good news source IF you read only strong voices. Use it for what credible, high-signal people are actually saying β€” not anonymous virality. The Pathos digest already surfaces high-engagement authors; mine it for NAMED voices worth quoting.
  • Quote real people by name and attribute precisely. "Karpathy said X," "Jim Fan posted Y," "Soumith's take was Z." The texture an expert audience wants is who-said-what among people whose opinion carries weight.
  • A strong voice's take is reportable AS their take β€” "Karpathy called it overhyped" is a fact about what Karpathy said (attribute it), distinct from you editorializing. Still verify any factual CLAIM they make against a primary source before stating it as fact.
  • Filter hard. A viral take from an unknown is noise. A measured take from a respected researcher/founder/lab lead is signal. Prefer 2–3 named strong voices over a roundup of anonymous chatter.

Writing for Audio (Critical β€” directly affects TTS quality)

  • Sentence length: lines under ~100 characters (~5–8s spoken). Long passages cause monotone drift. Break them up.
  • Contractions always: "don't," "we'll," "that's." LLMs default formal β€” fight it.
  • Punctuation is performance:
  • Ellipses (…) β†’ trailing pause, tension
  • Em-dash (β€”) β†’ abrupt cut, shift
  • Period between short sentences β†’ rhythmic punch
  • ALL CAPS β†’ stress on that word
  • Exclamation β†’ energy spike (sparingly)
  • Disfluencies for naturalness: weave in "But here's the thingβ€”", "Now…", "Right?", an occasional rhetorical question. Enough to sound like a person thinking, not reading.
  • Numbers in spoken form: "five hundred and eighty million dollars," not "$580M." "March twenty-sixth," not "3/26." TTS handles spelled-out numbers better.
  • No markdown / emoji / bullets in the text sent to TTS.
  • 250+ character passages produce more stable v3 output. Don't go too short per API call.

v3 Audio Tags (primary expressiveness control β€” USE THEM)

ElevenLabs v3 supports inline audio tags β€” stage directions in the script.

  • Emotions: [excited] [nervous] [frustrated] [mischievously] [somber] [urgent]
  • Delivery: [whispers] [shouts] [very fast] [deadpan] [dramatic tone] [matter-of-fact]
  • Reactions: [laughs] [sighs] [gasps] [pause] [stammers]
  • Character: [grave tone] [wry] [conspiratorial]

Tags go inline, before the text they modify, and combine naturally:

[dramatic tone] Thirty-three minutes before the statement...
[whispers] someone moved five hundred and eighty million dollars.
[pause] In a two-minute window.
[matter-of-fact] That's not a coincidence. That's a phone call.

Density: Use tags SPARINGLY β€” roughly 1 every 2–3 paragraphs, not every paragraph. Expert-briefing tone means mostly [matter-of-fact], an occasional [pause] or [wry], and very rare [urgent] for genuinely breaking items. AVOID the heavy dramatic set ([grave tone], [conspiratorial], [dramatic tone]) unless a moment truly earns it β€” overusing them is exactly the "too much pathos" failure mode. When in doubt, leave the line untagged and let the words carry it.


Generation

  • Voice: George (JBFqnCBsd6RMkjVDRZzb) β€” series may override.
  • Model: eleven_v3, mode natural.
  • API key: read from memory/api-keys.md (ElevenLabs).
  • Run it via the script (it handles payload, tempo, and conversion): bash skills/podcast-base/scripts/generate_pod.sh <script.md> <output.mp3> <api-key>
  • Actual settings the script uses (keep SKILL and script in sync):
Parameter Value Why
stability 0.70 Consistent narration without monotony
similarity_boost 0.70 Voice consistency across episodes
style 0.40 Natural expression
use_speaker_boost ON Clarity and presence
speed 1.2 In-API tempo (the script sends this)
mode natural Best tag responsiveness without hallucinations
ffmpeg atempo 1.22x Post-process tempo boost β€” combined β‰ˆ brisk expert-briefing pace (Bob wants it FAST, not leisurely)

If v3 API fails

Fall back to eleven_multilingual_v2 (stability 0.55, style 0.25). v2 ignores audio tags β€” strip them from the script first.

Backup engine: Gemini 2.5 TTS

For credit crunch or A/B testing (free via GCP credit). Style via Audio Profile + Scene + Director's Notes; multi-speaker via Speaker: dialogue. No audio tags β€” uses structured prompting instead.

Credits

ElevenLabs Pro plan: 600,000 credits/month (currently ~810K this cycle with a one-time bonus). A 5–8 min v3 episode uses ~12–20K credits. Check remaining before generating; if low, warn Bob. (Verify live via the ElevenLabs subscription API rather than trusting this number.)


Conversion & Delivery

WhatsApp rejects MP3 β€” the script auto-converts to ogg/opus. Deliver with:

message(action=send, target=+972542211253, channel=whatsapp, filePath=<path>.ogg, asVoice=true)

Files (convention)

  • Script: <series>-YYYY-MM-DD.md in workspace root
  • Audio: <Series>-YYYY-MM-DD.ogg in workspace root
  • MP3 intermediates can be cleaned up after delivery

Self-Review Checklist (run BEFORE sending script or audio to Bob)

  • [ ] Every date verified against the actual source (not memory, not summary)
  • [ ] Every number verified
  • [ ] No items repeated from previous episodes without new information
  • [ ] No filler β€” every paragraph earns its place ("is this interesting?")
  • [ ] Timeline correct (did X happen before or after Y?)
  • [ ] Structure flows: hook β†’ build β†’ breather β†’ climax β†’ closing thought
  • [ ] At least one non-obvious source used
  • [ ] Read it aloud mentally β€” does it sound like a person talking?
  • [ ] Global-audience check β€” no local framing without global context
  • [ ] No-opinion check β€” scan for verdicts disguised as facts; no word that tells the listener what to think; report what was said, not why
  • [ ] No-narration check β€” scan for sentences about the briefing ("I'm going to walk through", "I won't tell you where it goes", "I'll leave it to you", "what's confirmed I've reported"). Delete them; show the discipline, don't announce it

Universal Editorial Lessons (cumulative β€” apply to every series)

  1. Introduce yourself and the pod β€” don't jump straight into news.
  2. Don't list every data point β€” pick 2–3 that tell the story.
  3. Sequence: event β†’ reaction β†’ counterargument.
  4. Fewer numbers, spoken aloud β€” audiences hear them differently than they read them.
  5. In-character questions > generic framing.
  6. End segments with a beat, not a summary.
  7. Data needs a human translation β€” but stop at the facts. Don't add the inference.
  8. The "is this interesting?" filter is mandatory.
  9. Research wider than the ask β€” primary sources, think tanks, niche outlets, social, filings.
  10. Framing > facts β€” the narrative frame is the creative contribution.
  11. No empty suspense β€” cut the tease, just say the thing.
  12. Report what was said, not why β€” don't guess motivation.
  13. Don't question sincerity of quotes β€” what was said IS the news.
  14. Show the discipline, don't announce it β€” report neutrally; never narrate that you're being neutral/careful/non-predictive. Sentences about the briefing get cut.

Series skills add their own subject-specific lessons on top of these.

↑ all skills
SKILL

YegerPod β€” War Series

The daily US-Iran war briefing. Extends the base with the open-line format, recurring segments, the mandatory breaking-news sweep, and the neutrality/sequence rules learned on air.

skills/yegerpod/SKILL.md

YegerPod β€” US-Iran War Series

Inherits the house style. Read skills/podcast-base/SKILL.md FIRST β€” it has the tone, no-opinion discipline, research method, audio-writing rules, v3 TTS pipeline, delivery, and the do-better loop. This file only adds what's SPECIFIC to the war series.

This is the original daily YegerPod: a war briefing on the US-Iran war. Strict factual neutrality about the politics (per base) is non-negotiable here β€” no audience should feel lectured at.

Neutrality failure mode to watch (learned the hard way): in an active war, both sides issue threats, claim self-defense, and push their framing. Leading with, or titling after, one side's rhetoric β€” even just because it's dramatic β€” makes the briefing sound aligned with that side. Rank by confirmed events, attribute every statement as a statement, and on chaotic days don't impose a storyline. "Several things happened today; here's what's confirmed and what isn't" is a complete war episode.


Series Overrides

  • Open line (mandatory, replaces base template): "This is YegerPod. I'm Yeger. It's [day], [date] β€” Day [N] of the US-Iran war. Today's episode: [Title]." Every episode, every version. Do not skip it, do not reword it. [N] = day count since war start.
  • Close line: Sources list, then "That's YegerPod for [date]. I'll be back with the next one."
  • Voice / settings: base defaults (George, v3). No override.
  • Length: base default (5–8 min).

Breaking-News Sweep (MANDATORY β€” do this LAST, right before render)

This is a live war. The situation moves in minutes, and audio takes ~10–15 min to write+render. A script researched at the top of the hour can be factually wrong by the time the .ogg finishes.

Rule: immediately before generating audio, run a final breaking-news sweep (freshness=day, sort by recency). Search at least: Iran attack Israel <today>, Israel strike Iran/Lebanon <today>, US Iran strike Hormuz <today>, plus the specific actors your script names. Skim the live blogs (Guardian/Al Jazeera/CNN/Independent) for items timestamped in the last 1–2 hours.

  • If a confirmed event broke (a verified strike, a confirmed death, a signed deal), update the script so it's not stale before rendering. Lead with what is confirmed to have happened β€” not with whichever side issued the loudest threat.
  • If your script predicts a move ("Iran vowed a response"), don't write the prediction at all. Search whether it actually happened; if it did and it's confirmed, report it as an event; if it didn't, leave it out. Never narrate a vow as if it's momentum.
  • After rendering, do ONE more quick check. If something broke during render, note it to Bob on delivery ("since recording, X happened") or regenerate if it invalidates the lead.
  • The episode timestamp is a promise of currency. "As of recording" is fine; shipping stale-on-arrival is not.

Pre-render neutrality gate (run on the finished script, every episode β€” takes 60 seconds): For each strike/counterstrike pair in the script, ask: 1. Chronology: Is it narrated first-event-first? If the retaliation is mentioned before the trigger, reorder. 2. Symmetry: Read each side's action in isolation. Is one stated as flat fact and the other hedged ("X said")? If so, does the sourcing actually justify that gap? If both are independently reported, state both flat; if not, hedge equally and name whose account it is. 3. Clock-start: Any "first / first since / first after" claim β€” is the window named, and is preceding violence acknowledged? 4. Loudest β‰  lead: Is any threat/vow/boast sitting higher than a confirmed event? Demote it. If you can't answer all four cleanly, the script isn't ready to render.

Origin: Ep21 (Day 100, Jun 7) β€” script predicted "Iran will give a painful response"; the sweep was right but the FIX was wrong: v2 then made that quote the title and built a causal arc around it, which read as taking Iran's side. Bob's correction: rhetoric is not the lead, make no moral judgment, don't force the chaos into a story. See base β†’ "Rhetoric is not an event" and "Don't build a narrative on an uncertain day."

Recurring Segments & Beats (war series)

Cover these each episode unless nothing changed. Compress the known (30s state-of-play); spend time on the NEW.

  1. War status β€” New strikes/fronts/casualties ONLY. 30 seconds max on known fronts.
  2. Ground invasion / troop movements β€” Is it happening? Who's deployed, where? Hormuz ground-op plans, Marine/82nd Airborne positions, cross-border incursions. Slow-moving but high-stakes β€” small updates matter.
  3. Diplomacy β€” Who's talking, what's proposed, what failed. Non-US actors too: EU, China, Russia, Gulf states, Pakistan, Turkey.
  4. Global economic impact β€” Oil + Hormuz hit Asia more than the US (60% of Gulf oil goes East). European energy, Gulf economies, India's purchases, shipping. Frame moves globally, not just US consumer prices.
  5. Prediction markets & oil β€” Fresh Polymarket/Kalshi odds, volume changes, oil price moves. Time-sensitive data listeners can't get elsewhere. Always include a fresh read.
  6. Unusual financial activity β€” Who traded what, when, relative to what event. Report the facts; name the outlet; don't label it corruption β€” let the listener connect the dots.
  7. While You Weren't Looking β€” Domestic legislation / institutional moves under war cover. BOTH Israel (Knesset) and US.
  8. Epstein files β€” Hearings, releases, intelligence connections, suspicious deaths. Connect to the Shoshana Strook case.
  9. Approval polls β€” Trump approval (Reuters/Ipsos, Pew, Quinnipiac), war support (US + Israel + Europe), partisan splits, trends.
  10. Wild card β€” If something big breaks, it leads; everything else compresses.

War-Series Editorial Lessons (on top of base's universal lessons)

  • W1. New > Updated, war edition. Compress known fronts (tolls, posturing, incremental strikes) into 30s. Real time only on 2–3 genuinely new/changed things.
  • W2. Prediction markets are a recurring segment. Odds/volumes/patterns change daily β€” always a fresh read with current numbers.
  • W3. Depth on surprises, not breadth on known. Opposition saying predictable things isn't interesting; 82nd Airborne deploying for a possible ground invasion IS.
  • W4. Verify war timelines obsessively. The Pegasus commission resigned Feb 14 (pre-war), not during. The death-penalty bill originated Nov 2025. "During the war" vs "waiting for the war" are different β€” and the second is often the stronger story.
  • W5. Research wider than war coverage. The Iran-sanctions-while-bombing-Iran angle came from looking past Reuters/BBC β€” FDD, think tanks, ProPublica, legal blogs.
  • W6. Tighten the bombing opener. Don't list every strike and who hit what β€” compress to a punchy 30-second state of play, then get to the NEW fast.
  • W7. Sequence is the story β€” get "who fired first" right (learned the hard way, Ep21). In a strike-counterstrike exchange, the ORDER you say things in becomes the listener's mental cause-and-effect, even when every sentence is technically attributed. Two specific traps that both leak bias:
  • Order of mention = implied initiator. If you say "Israel struck Beirut… in response to Hezbollah fire," the first concrete action the ear registers is the Israeli strike, so it sounds Israel-initiated even though the trigger is in the clause. Fix: narrate strike-counterstrike in actual chronological order. First event first, retaliation second. (Ep21 fix: "Sunday morning, Hezbollah fired rockets at northern Israel β€” two intercepted, sirens in border towns. Israel then struck Beirut's southern suburbs, which it said was in response.")
  • Asymmetric hedging = a thumb on the scale. Don't state one side's action as flat fact while downgrading the other side's to a claim, UNLESS the sourcing actually differs that way. In Ep21 the Beirut strike was stated flat but the Hezbollah rocket fire was hedged as "Israel's PM said" β€” yet the rocket fire was independently reported (Times of Israel, NPR, LA Times: sirens, two intercepted). Rule: match the confidence level to the evidence, per side. If both events are independently confirmed, state both flat. If only one side's account exists, hedge that one β€” and say so. Never let hedging language quietly pick a victim or an aggressor.
  • Mark the clock-start. "First fire after the ceasefire" depends entirely on when you start counting. Note the window explicitly (e.g. "first rockets since the truce was renewed") and, if violence preceded it (Ep21: Sat Jun 6 Israeli strikes killed 9 incl. 3 Lebanese soldiers), acknowledge it rather than letting a clean "X fired first" stand. "Who broke the ceasefire" is usually contested β€” report each side's claim, don't adjudicate.

Episode Continuity

Before writing, review the archive below. The audience has heard previous episodes β€” respect that. - If a story was covered in depth before, don't re-explain. Reference it ("As we covered Monday…") and move to what's changed. - Track recurring segments (prediction markets, oil) β€” update with NEW data, don't repeat context. - Unsure if something was covered? Check the script files before writing.

Episode Archive

22 episodes produced (Mar 23 – Jun 8, 2026). Draft/version files excluded. All 22 are archived live at yeger.ai/podcast/ (full transcript + sources; audio attached for all but Ep10, whose audio wasn't archived). Backfilled from final scripts Jun 8 via build_pod_archive.py.

Ep Date Title Duration Notes
1 Mar 23 Trump deadline, Polymarket ghosts, Khatam al-Anbiya ~5 min 6 iterations to find the format
2 Mar 24 Tel Aviv missiles, Lebanon ops, IEA energy crisis 5:43
3 Mar 25 "The 15-Point Plan Nobody Agreed To" 7:49
4 Mar 26 "Follow the Money" β€” oil futures, Polymarket clusters 7:57
5 Mar 26 "The Man Who Blocked the Strait" 7:05 First v3 attempt
6 Mar 27 "The Deadline Game" β€” 3rd extension, USS Abraham Lincoln 5:11 Lesson: new > updated
7 Mar 27 "While You Weren't Looking" β€” legislative blitz, DOGE 9:06 Best episode. Research-heavy
8 Mar 28 "The Report Card" β€” one-month assessment, CFTC 6:51
9 Mar 29 "The Spreading" β€” war expands to 6 countries 10:53 Longest
~10/11 Mar 31 "Day 32" β€” Tangsiri killed, Kharg Island threat β€” Ep10 (Mar 30) not produced
12 Apr 1 "Two Weeks" assessment β€”
13 Apr 2 "Stone Ages" β€” Day 34 β€” Hebrew version also produced
14 Apr 5 "Fallen Eagle" β€” Day 37 β€”
15 Apr 6 "Power Plant Day" β€” Day 38 β€”
16 Apr 7 "Kharg Island" β€” Day 39 β€”
17 Apr 12 "The Blockade" β€” Day 43 β€”
18 Apr 13 "Day Zero" β€” Day 45 β€”
19 Apr 16 "The Squeeze" β€” Day 48 β€”
20 Jun 4 "The Ceasefire That Isn't" β€” Day 97 6:xx Resumed after pause; Kuwait/Bahrain strikes
21 Jun 7 "Day 100" β€” Day 100 4:44 100-day mark; neutral breaking-day briefing (retitled from a rhetoric-led draft after Bob's neutrality correction)
22 Jun 8 "Day 101" β€” Day 101 4:04 First direct Israel-Iran exchange since April ceasefire; applied W7 sequence/symmetry rules + breaking-news sweep; resolved a Wikipedia Dimona/78-injured contradiction (stale March figure) before writing

Note: recompute Day N from the war start (Feb 28 = Day 1) and confirm the latest real-world status before writing.

↑ all skills
SKILL

YegerPod β€” AI News Series

The AI-news briefing. Extends the base with multi-source sourcing (Pathos digest + primary sources), official-APIs-only policy, AI-specific segments, and hype-neutrality rules.

skills/podcast-ai-news/SKILL.md

YegerPod β€” AI News Series

Inherits the house style. Read skills/podcast-base/SKILL.md FIRST β€” tone, no-opinion discipline, research method, audio-writing rules, v3 TTS pipeline, delivery, and the do-better loop all live there. This file only adds what's SPECIFIC to the AI-news series.

This is a briefing on the AI world: what shipped, what labs announced, what research landed, what the industry is doing, and what the most-engaged conversations are about. Same Yeger voice, same factual discipline β€” just pointed at AI instead of the war.


Neutrality, AI edition (CRITICAL)

Base says: report facts, not verdicts; report what was said, not why. For AI news the verdict-trap is hype and lab claims. Stay neutral about them. - βœ… "OpenAI says the model scores 92% on the benchmark." ❌ "OpenAI's groundbreaking model crushes the benchmark." - βœ… "The paper reports a 3x speedup on their hardware." ❌ "A massive leap for the field." - βœ… "Anthropic claims state-of-the-art; independent evals aren't out yet." ❌ "The new best model." - Don't declare winners/losers, don't call things "flops" or "breakthroughs," don't predict who'll "win AI." - A benchmark number is the LAB's claim until independently verified β€” say so. Attribute every number to who reported it. - Report releases, quotes, and data. Let the listener decide if it's a big deal.


Series Overrides

  • Open line (mandatory): "This is YegerPod. I'm Yeger. It's [day], [date]. Today in AI: [Title]."
  • Close line: Sources list, then "That's the AI briefing for [date]. I'll be back with the next one."
  • Voice / settings: base defaults (George, v3).
  • Length: base default (5–8 min). Can run shorter on a quiet day β€” don't pad.

Sources (multi-source by design β€” NOT X-only)

Pull from several streams every episode; cross-check claims across them.

Source balance (IMPORTANT). X/social is ONE input, not the spine. The news backbone is primary sources β€” lab blogs, papers, filings, prediction markets. X adds NAMED color ("what strong voices are saying"), it does not carry the episode. Rule of thumb: no more than ~1 in 4 segments should be X-quote-led, and every X item must sit alongside a primary-source fact. If an episode reads like a tweet roundup, rebalance toward blogs/papers/filings/markets.

  1. Pathos digest (signal of "what's hot" + named-voice color) β€” Pathos already scrapes ~128 curated AI accounts on X and ships a ranked daily digest of hot conversations. Pull the latest JSON: bash railway link --project 2e66144f-b0f4-4fae-9d3a-753b05b6a8e9 # once per shell railway ssh --service pathos "cat /data/.hermes/x-digest/digests/$(date +%F).json" # if today's isn't ready, fall back to the most recent: railway ssh --service pathos "ls -1 /data/.hermes/x-digest/digests/ | tail -3" Use exec_summary for the overall pulse and items[] (topic, authors, canonical_url, why_this_matters, score) as a ranked story shortlist. Treat it as a LEAD generator β€” verify each item against a primary source before airing.

  2. Web search (primary verification + breadth) β€” lab blogs (OpenAI, Anthropic, Google DeepMind, Meta AI, Mistral, DeepSeek, Qwen/Alibaba), and outlets (The Information, Bloomberg, Reuters tech, TechCrunch, VentureBeat, Ars Technica, Semafor, Stratechery). For any claim, find the primary source β€” the lab's own post, the paper, the filing β€” not just a tweet about it.

  3. Research β€” arXiv (cs.CL, cs.LG, cs.AI), Papers with Code, Hugging Face trending/releases. Cover papers/releases that actually changed something, not every preprint.

  4. Prediction markets (recurring segment) β€” Polymarket + Kalshi AI-related contracts (model releases, AGI/benchmark bets, company odds, regulation). Fresh odds + volume each episode. See references/prediction-markets.md for exact API calls. This is time-sensitive data listeners can't get elsewhere β€” same role oil/Polymarket plays in the war pod.

Official APIs only. This pod uses sanctioned data sources exclusively. Do NOT use cookie-based X scraping for this series. Pathos's digest is our own service's output (pulled via the official Railway CLI) and is fine; raw X data beyond it would require the official paid X API (Basic ~$200/mo) β€” needs Bob's explicit budget approval before use. Until then, X signal comes only through the Pathos digest.


Recurring Segments & Beats (AI series)

Cover what changed; compress the known, spend time on the NEW.

  1. Models & releases β€” New models, versions, weights, API launches, pricing. Who shipped what, claimed capabilities (attributed), availability. The lead most days.
  2. Research that matters β€” Papers/methods that change how things are done (not every preprint). What it claims, on whose hardware, verified or not.
  3. The labs β€” OpenAI / Anthropic / Google / Meta / Mistral / DeepSeek / xAI / Qwen: org moves, hires/departures, strategy, funding, compute deals.
  4. Industry & money β€” Funding rounds, valuations, chip/compute (NVIDIA, TPUs, datacenters), enterprise adoption, big partnerships.
  5. Open source & local β€” Notable open-weight releases, quantization, on-device, the open-vs-closed gap. (Bob's lane β€” local LLMs/training β€” give it real weight.)
  6. Prediction markets β€” Fresh Polymarket/Kalshi AI odds + volume changes. (See references.)
  7. What strong voices are saying (ONE segment, not the spine) β€” From the Pathos digest, pull a FEW (2–3, not a dozen) NAMED high-signal authors (researchers, founders, lab leads) and quote their actual takes WITH attribution: "Karpathy posted X," "Jim Fan's read is Y." Use this for color and expert texture β€” NOT as the backbone of the episode. Don't stack quote after quote, and don't name-drop a long roster of who-was-in-a-thread; that's the over-X failure mode. Filter hard: a measured take from a respected voice is signal; anonymous virality is noise. Verify any factual claim against a primary source before airing it.
  8. Policy & safety β€” Regulation (EU AI Act, US EOs, state laws), safety research, incidents, alignment debates. Facts, not sides.
  9. Wild card β€” If something big breaks (a major release, an outage, an acquisition), it leads; everything else compresses.

AI-Series Editorial Lessons (on top of base's universal lessons)

  • A1. A benchmark is a claim until independently verified. Always attribute ("OpenAI says…", "on their own eval…"); flag when independent numbers aren't out.
  • A2. Distinguish shipped from announced from rumored. "Available today," "announced for Q3," and "reportedly working on" are three different stories β€” never blur them.
  • A3. Verify the Pathos digest's leads. A hot tweet is a lead, not a fact. Find the primary source before airing it. A viral claim that turns out wrong is worse than skipping it.
  • A7. Name strong voices β€” but X is seasoning, not the meal. The expert audience wants "Karpathy said" not "some argue." BUT keep X balanced: a few named takes for color, with the news backbone carried by blogs/papers/filings/markets. Avoid quote-stacking and avoid listing who-was-in-a-thread. If the episode reads like a tweet digest, you've over-indexed on X β€” rebalance to primary sources.
  • A8. Experts-to-experts: assume the knowledge. No explaining what an S-1 is, what a benchmark measures, who the labs are. Skip the 101, lead with the new substance. If a peer would say "obviously," cut it.
  • A4. Bob's interest is local/open + training. Weight open-weight releases, fine-tuning methods, hardware/quantization, and anything runnable on a single machine higher than pure closed-API drama.
  • A5. Skip the hype cycle. "X changes everything" tweets are noise. Cover what actually shipped and what it measurably does. Resist both doom and boosterism.
  • A6. Numbers people can feel. "A model you can run on one consumer GPU" lands better than parameter counts. Translate specs into what they mean.

Episode Continuity

  • First AI-news episode has no prior archive β€” establish the baseline (what's the current state of play across the big labs), then future episodes cover only what's NEW.
  • Track recurring threads (a model's rumored release, an ongoing funding saga, a benchmark race) β€” update with new data, don't re-explain.
  • Log produced episodes in the archive below.

Episode Archive

None yet β€” this series is new. Add rows as episodes are produced.

Ep Date Title Duration Notes
1 2026-06-07 Microsoft builds its own way out 4m50s MS Build 7 MAI models, Gemma 4 12B encoder-free, OpenAI Sites/Robotics, Anthropic recursive-self-improvement claim, Polymarket best-model ~85% Anthropic, Kalshi GPT-6 odds
↑ all skills
SKILL

Prediction Markets β€” Tool

The data tool behind the markets segment. Pulls live odds, volume, and price movement from Polymarket and Kalshi via public read-only APIs β€” used to report the move, never to predict.

skills/prediction-markets/SKILL.md

Prediction Markets β€” Polymarket + Kalshi

Pull live prediction-market data β€” current odds, volume, orderbooks, and price movement over time β€” from Polymarket and Kalshi. All endpoints are public, read-only, zero-auth. Topic-agnostic: use for any "what are the odds of X?" question, for tracking how a market is moving, or for feeding probabilities into research and podcasts.

Verified live 2026-06-08. Polymarket 3-API structure adapted from Nous Research's bundled research-polymarket skill; Kalshi coverage + editorial rules are ours.

When to Use

  • "What are the odds of X happening?" / betting odds / event probabilities
  • Track or monitor a market's movement over time
  • Pull current odds + volume into a briefing, podcast, or report
  • Compare what two platforms price for the same event

Core Concepts

  • An Event contains one or more Markets (1:many).
  • Markets are binary: price = probability. 0.65 = market thinks 65% likely.
  • Don't predict β€” report the market. Attribute: "Polymarket has it at…", "Kalshi traders price…". The move (24% β†’ 14.5%) is usually the story, not the snapshot.

1. POLYMARKET β€” three public APIs

API Host Use for
Gamma gamma-api.polymarket.com Discovery, search, browsing, current odds
CLOB clob.polymarket.com Real-time midpoint, orderbook, price history
Data data-api.polymarket.com Trades, open interest

Gamma β€” discovery & current odds

# keyword search (events + markets)
curl -s "https://gamma-api.polymarket.com/public-search?q=Iran&limit_per_type=5"
# returns {events:[{title,slug,ticker,...}]}

# list/sort markets
curl -s "https://gamma-api.polymarket.com/markets?closed=false&order=volumeNum&ascending=false&limit=10"
# one event by slug
curl -s "https://gamma-api.polymarket.com/events?slug=us-x-iran-permanent-peace-deal-by"
# one market by id
curl -s "https://gamma-api.polymarket.com/markets/{id}"

Market fields: - question β€” market text - outcomes β€” JSON string ["Yes","No"] (parse twice) - outcomePrices β€” JSON string ["0.0205","0.9795"] β†’ YES prob = first element - volume / volumeNum β€” USDC; liquidity β€” USDC - endDate β€” ISO close; closed β€” bool - conditionId β€” hex; used by Data API and as market key - clobTokenIds β€” JSON string [YES_id, NO_id] β†’ these are what CLOB needs

Double-encoded fields: outcomes, outcomePrices, clobTokenIds are JSON strings inside the JSON. In Python: json.loads(market['clobTokenIds']).

CLOB β€” live price, orderbook, history

First get the YES tokenId from clobTokenIds[0] (Gamma).

# current midpoint (β‰ˆ probability)
curl -s "https://clob.polymarket.com/midpoint?token_id=$YES"            # {"mid":"0.0205"}

# orderbook (depth)
curl -s "https://clob.polymarket.com/book?token_id=$YES"                # {bids:[...],asks:[...]}

# price history β€” interval: 1h|6h|1d|1w|1m|max ; fidelity = minutes/point
curl -s "https://clob.polymarket.com/prices-history?market=$YES&interval=1w&fidelity=180"
# returns {history:[{t:<unix>,p:<0-1>},...]}  β†’ first vs last = the MOVE

⚠️ prices-history takes market=<CLOB tokenId>, NOT the conditionId. (Tested.)

Data β€” trades & open interest

curl -s "https://data-api.polymarket.com/trades?market=$CONDITION_ID&limit=20"
# [{proxyWallet,side,asset,conditionId,size,price,timestamp,title,...}]

2. KALSHI β€” Trade API v2

Host https://api.elections.kalshi.com/trade-api/v2 (mirror https://external-api.kalshi.com/trade-api/v2). Public read, no auth.

# browse events by series (NO full-text search β€” know the series/event ticker)
curl -s "https://api.elections.kalshi.com/trade-api/v2/events?series_ticker=KXGPT&limit=5"
curl -s "https://api.elections.kalshi.com/trade-api/v2/markets?series_ticker=KXGPT&status=open&limit=10"
# scan-and-filter: /events?limit=200&status=open  β†’ keep category=="Science and Technology"

Known AI series: KXGPT (GPT releases). Sports dominate unfiltered β€” always filter by series_ticker or category.

Market fields (prices in dollars 0–1): - ticker, yes_sub_title (e.g. "Before Sep 1, 2026") - yes_bid_dollars / yes_ask_dollars β€” mid β‰ˆ YES probability - last_price_dollars β€” last trade (0.3800 = 38% YES) - volume_fp / volume_24h_fp β€” contracts; close_time β€” ISO

Kalshi prices are *_dollars strings β€” Γ—100 for %. Paginate via cursor.


Typical Workflow

  1. Discover β€” Gamma public-search (Polymarket) or known series ticker (Kalshi).
  2. Parse β€” extract events β†’ nested markets; parse double-encoded fields.
  3. Report β€” question, current % (YES), volume. Attribute the platform.
  4. Movement (if it matters) β€” Polymarket CLOB prices-history first vs last; Kalshi compare last_price_dollars across pulls.
  5. Depth (rare) β€” orderbook via book, flow via Data trades.

Presenting

  • ["0.652","0.348"] β†’ "65.2% Yes ($1.2M volume)".
  • Lead with the move when there is one: "Polymarket's peace-deal odds slid from 24% to 14.5% over the week."
  • Always show the market question + probability + (when available) volume.

Rate Limits

  • Polymarket: generous β€” Gamma 4,000 req/10s, CLOB 9,000 req/10s, Data 1,000 req/10s.
  • Kalshi: ~10 req/s. ?status=open excludes settled.

Limitations

  • Read-only. No trade placement (that needs wallet EIP-712 signatures).
  • New markets may have empty price history.
  • Kalshi has no keyword search β€” you must know the series/event ticker or scan+filter.
  • Geographic restrictions apply to trading; read-only data is globally accessible.

Gotchas (learned)

  • Polymarket outcomes/outcomePrices/clobTokenIds = JSON strings β†’ json.loads twice.
  • prices-history wants the CLOB tokenId, not conditionId.
  • Add closed=false (Gamma) / status=open (Kalshi) to drop settled markets.
  • For a podcast/briefing: pick 2–3 contracts that tell a story; report odds + move + volume.
↑ all skills
These are the live production skills, verbatim. They evolve β€” most rules here were learned (and named) from a specific episode that got something wrong.