Corpus deep-research takeaways
Source: data/reports/corpus_research_20260430T064850.md — 40 KB report from Gemini Deep Research Max (deep-research-max-preview-04-2026) listening to all 12 corpus MP3s + the taste profile.
This file is the distilled durable record of operationalizable findings from that report. Items marked ✅ have shipped; items marked ⏳ are still on the list.
Operationalized
| # | Takeaway | Where it shipped |
|---|---|---|
| ✅ | The Snowball Lie — polite minor falsehood that compounds because the other character believes it. Most under-exploited Finnemore device, the one LLMs miss most. Programmable: line 3 lie → line 4 belief → escalation. | concept prompt section + per-scene prompt block + rule_has_snowball_lie_pair lint + RULE_SUGGESTIONS (commit 4dcfffa) |
| ✅ | Pacing 135 wpm (corpus is 130-140, theatrical Radio 4 — not 155 television-fast we'd been prompting) | build_full_prompt + produce_audio._PACING_PREAMBLE (4dcfffa) |
| ✅ | All planted details must pay off — every setup/runner beat has a matching payoff/callback later, no decorative plants |
concept prompt section + rule_all_plants_pay_off lint |
| ✅ | Mandatory third-act status flip — apparently low-status character revealed to be driving | concept prompt section + rule_third_act_status_flip lint |
| ✅ | Pause taxonomy as schema field — DeliveryNote.pause_kind ∈ {realisation, absurdity, tonal_weight, none} mapping to [short pause]/[medium pause]/[long pause] audio tags |
schemas.DeliveryNote + produce_audio._PAUSE_KIND_TO_AUDIO_TAG |
| ✅ | SFX is sparse — scene-setter only, drops away for dialogue. ≤4 SFX for short episodes, ≤8 for full-length | concept prompt section + rule_sfx_count_within_band lint |
| ✅ | Anti-pattern table (Finnemore vs generic sketch) — pacing, escalation vector, character power, callbacks, emotional core | concept prompt verbatim table |
Still gold — operationalize next
1. The "finite isolation trap" framing
Section 1: more concrete than form_as_finite_generator. Two characters in a space they cannot easily exit. Train carriage, hostage scenario, 4-minute desk swap window. "The dialogue itself becomes the action — there is no external action to cut away to."
→ Operationalize: add a hard prompt constraint requiring the concept's premise.machine to literally name the trap (a confined location AND/OR a strict deadline preventing exit). Could become rule_premise_names_finite_trap checking that premise.machine contains location/duration/cannot-leave language.
2. Cross-corpus world continuity (Willard & Son)
Section 5: the corpus shares a fictional bathtub manufacturer "Willard & Son" across 4 episodes (Tigers 1934, Wysinnwyg, Hot Desk, Red-Handed). It's lived-in world-building that rewards long-term listeners.
→ Operationalize: seed our generations with a recurring fictional anchor (e.g. a fake employer, a fake regional newspaper, a fake society) we plant in every concept. Track in a small registry file. After N generations the registry becomes its own continuity.
3. The 3 deep-research seed concepts
Section 8 invented these from first principles. Use them as live seeds:
- The Royal Fitting — Savile Row tailor measures a Queen's Guard who can't break composure to speak; turns out he's a non-English-speaking imposter
- The Lighthouse Log — Two keepers painting the lantern room glass on opposite sides; the waves drown out their voices, forcing lip-reading + condensation messages; one realizes the other forged the logbook
- Turing's Waiting Room — Elderly woman trapped in an automated banking helpline loop; the "AI" is actually a hungover human pretending to be a bot
→ Operationalize: add to a data/seeds/deep_research_seeds.txt and run them through the meta-iterate to compare against the new prompt.
4. The "Listener's complicit imagination" doctrine
Section 3: "Once the scene is set, the sound effects drop away so the dialogue can perform the heavy lifting of characterization." Plus the Announcer (Finnemore narrating "Two days later...") as time-compression device.
→ Operationalize:
- Already partly addressed by sparse-SFX cap.
- Concept prompt could require ≥1 announcer line in episodes ≥15 min (time-compression beat).
- Could add a rule: SFX events should cluster in scene-opening time bands, not be distributed evenly across the episode.
5. State-Variable Document framing for state tracking
Section 11: explicit JSON {"Plant_1": "Letter sent to father", "Status": "Unresolved"} pattern fed into chunk prompts to survive context window degradation.
→ Operationalize: we already have _RunningState with unpaid_plants. Could:
- Make it richer:
Plant.label, Plant.first_planted_at, Plant.expected_payoff_scene, Plant.status. - Render as JSON in the per-scene prompt so the model sees structured plant state, not a comma-joined string.
- Verify post-stitch that every
Plant.status="Unresolved"either resolved or got carried forward intentionally.
6. The 10 Load-Bearing Imperatives
Section 7: the report wrote them explicitly. We've shipped some (status flip, all plants pay off) but a few aren't yet first-class:
- Imperative #1: "Trap exactly two characters in a confined physical location or strict temporal deadline from which they cannot escape." (related to #1 above)
- Imperative #7: "Engineer a genre collision — assign a high-stakes dramatic register (military strategy, philosophical debate) to a mundane situation (office politics, painting a window)." — could be a lint check on the concept's
style.vocabulary_registeragainst the situation inpremise.logline. - Imperative #10: "Write a late-stage structural reveal that forces the listener to redraw their mental image of the characters." — distinct from status flip; this is identity/relationship reveal.
7. Specific pause-event examples to teach via few-shot
Section 3 gave concrete examples we could drop verbatim into the per-scene prompt as exemplars:
- "Mark explains his amputated phantom limb is making a rude gesture; Luke takes a sharp irritated breath before deadpanning, 'Really? Is it this one, or this one?'" — half-second pause + sarcastic deflection.
- "Joel realizes the intruder has just politely offered to make him a cup of tea — agonizingly brilliant silence." — full-second pause weaponising absurdity.
8. The status flip is asymmetric, not balanced
Section 4: "Adele seems to hold power... should hold the moral high ground over the criminal Henry." Then the genius is the flip. We have asymmetric_status as a concept axis but the report frames it as: ALWAYS start with the EXPECTED hierarchy (host > burglar, expert > novice, boss > new hire), then flip in act 3. This is structural, not optional.
→ Operationalize: the cast.function fields could be required to name BOTH the surface status AND the actual status (e.g., function: "appears to be subordinate / actually drives the scene").
9. Period-accuracy strictness for period episodes
Section 6: "Episodes like *The Goliath Window (1820) or A Flock of Tigers (1934) require strict adherence to historical vernacular."* We have rule_no_modern_slang_in_period_episode already, but the report's framing is sharper — period episodes should source vocabulary from the actual era, not just avoid modern slang.
→ Operationalize: when a generated concept has a style.vocabulary_register containing a year/era keyword, the per-scene generation prompt should embed period vocabulary samples or a one-line "you are writing in [year], use [era] register" anchor.
10. Tonal-duality location is fixed (final third)
Section 5: tonal duality lands in act 3 — "the comedic premise falls away to reveal a genuine, grounded human vulnerability or tragedy." Currently rule_tonal_shift_present checks that one exists; could tighten to require it lives in the final third, like the status flip.
→ Operationalize: modify rule_tonal_shift_present to require the standout-moment timestamp be in the final third of episode duration.
Reference seeds from section 8 (verbatim)
The Royal Fitting
- Logline: A highly anxious Savile Row tailor attempts to measure a Queen's Guard for a new uniform while the guard is actively on duty outside the palace.
- Machine: The Guard is forbidden by military protocol from speaking or breaking physical composure, forcing the tailor into a panicked, one-way interrogation interpreting blinks and micro-expressions.
- Hook: The Guard is not remaining silent out of duty, but because he is an imposter who doesn't speak English, and the tailor slowly realizes he is outfitting a spy.
The Lighthouse Log
- Logline: Two lighthouse keepers, assigned to paint the exterior glass, are suspended on opposite sides of the massive lantern room.
- Machine: They can see each other perfectly but the crashing waves prevent them from hearing each other, forcing them to argue via exaggerated lip-reading and wiping messages in the condensation.
- Hook: One keeper realizes through lip-reading that the other keeper has been forging the official logbook to cover up a maritime disaster they caused weeks ago.
Turing's Waiting Room
- Logline: An elderly, technologically illiterate woman calls a banking helpline and becomes trapped in an endless loop with an infuriatingly polite automated AI voice system.
- Machine: The caller is constrained by her lack of technical vocabulary, while the AI is constrained by a rigid, unyielding decision-tree script.
- Hook: The "AI" is actually a deeply hungover, human customer service representative pretending to be a robot to avoid having to process complex transactions.
Notes for future deep-research calls
The Interactions API (client.interactions.create(agent=..., input=..., background=True)) currently does NOT accept multimodal inputs (audio attachments). The agent runs against external sources (web grounding) plus the text input, then returns. Future deep-research calls should:
- Send the taste profile + corpus titles in text
- Skip Episode JSONs unless compacted aggressively (they blow the 131k token cap as full transcripts)
- Plan for ~9 minutes of agent time for max-tier
- Cost ~$15-25 per call (varies by depth)