The lineup fix and the new characters both land in main.py, so they share a
commit rather than being split artificially.
Lineup fix — populate_backgrounds() was reachable only through
POST /api/session/reset, so taking calls without hitting reset left
session.caller_backgrounds empty for a whole show. Every caller got a hollow
prompt, collapsed into generic relationship filler, and Silas lost his lore.
Now start_call populates on demand, get_caller_prompt raises
EmptyCallerBackgroundError instead of emitting an empty prompt, /api/callers
reports lineup readiness to a header badge, and cross-episode topic dedup
widened from 2 shows to 10.
Wellspring callers — Doyle as the anchor defector plus a six-member pool,
grouped by new frontmatter fields (group, group_lead, group_weight, register,
explicitness). A faction is capped at one caller per show, with a 15% roll for
two pairing the lead with one other member. group_weight lets an anchor carrying
an arc get slots faster than texture characters.
Also detects model refusals, which arrive as ordinary 200s and previously
reached air as broken-character text or dead silence.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Runtime state written by the app: session checkpoint, used-topics history,
regulars, intern lookups, voicemails, publish state through episode 58, and the
website clips index.
Also ignores what should never enter history: clips/, music/, mlx_models/,
remotion-demo/ and social_posts/ come to roughly 13 GB of media and model
weights, and data/costs.db is a binary SQLite database that cost_tracker
rewrites on every LLM call — committing it would attach a multi-megabyte delta
to future commits. cost_reports/ and avatars/ are regenerable, and reaper/peaks/
is a waveform cache.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Fix TTS text pipeline: new caps handling (spell out unknown acronyms, lowercase
emphasis words), action-word lookahead for parenthetical stripping, abbreviation
expansions (US→United States, NM→New Mexico), pronunciation fixes
- Inworld TTS: camelCase API fields, speakingRate per-voice overrides, retry logic
with exponential backoff (3 attempts)
- Footer redesign: SVG icons for social/podcast links across all pages
- Stats page: show "Rate us on Spotify" instead of "not public" placeholder
- New voices, expanded caller prompts and problem scenarios
- Social posting via Postiz, YouTube upload in publish pipeline
- Episode transcripts 15-25, terms page, sitemap updates
- Fix invoice script: match Timing totals using merged Task+App intervals
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>