Showcase: Plain Bob Minor
Generated 2026-05-01 · combined 8.53/10 · meta mode with crossbreed + adversarial + active panel
A 1950s vicar (Arthur Pendelton) is locked in a damp church vestry with the bell-ringer (Thomas Crump) when they realise the parish register has been carefully altered for fifty years.
Stats — every dimension
| Layer | Score | Notes |
|---|---|---|
| Combined (gate) | 8.53/10 | 0.6 × text + 0.4 × audio |
| Text autorater | 8.45/10 | 22/26 rules pass; rules composite 0.86 |
| Audio judge | 8.65/10 | character_distinctness 9, prosody 9, consistency 9, delivery 8, pacing 8 |
| Audio analyzers | mixed | pacing 129 wpm whole-ep ✓; distinctness 194 Hz separation ✓; 10 audible chunk seams (TTS quality issue); STT WER 0.18 |
| Adversarial critic | 4 revisions integrated | tightened the Mrs. Higgins reveal; trusted listener to do pregnancy timeline math |
| Listener panel (4 personas) | 18 in-voice notes | radio_4_devotee, podcast_listener, audio_engineer, comedy_writer all flagged the Somme reveal needed more silence |
| Beat verifications | 3/3 plant→payoff at 10/10 | linseed-oil, tail-splice, parish-gossip — all land |
Per-axis text autorater (judge, 0–10)
| Axis | Score |
|---|---|
| long_fuse_plotting | 10 |
| form_as_finite_generator | 9 |
| status_as_live_wire | 9 |
| tonal_duality | 9 |
| structural_reveal | 9 |
| politeness_as_masking | 9 |
| genre_register_collision | 8 |
| re_listenability | 8 |
| surprise_at_specificity | 7 |
| cultural_anchoring | 7 |
| voice_violations | 4 (lowest — quirks declared in cast metadata don't surface in performance) |
WPM windowed plot (the new thing you asked for)
WPM per 30-second window — 'Plain Bob Minor' (28.0 min)
Corpus reference p25=170 p50=210 p75=260
time wpm 0 100 200 300 400 500
+-----+-----+-----+-----+-----+-----+
00:15 74 |███████ |
00:45 130 |█████████████ |
01:15 124 |████████████ |
01:45 94 |█████████ |
02:15 78 |███████ |
02:45 152 |███████████████ |
03:15 92 |█████████ |
03:45 84 |████████ |
04:15 92 |█████████ |
04:45 60 |██████ |
05:15 84 |████████ |
05:45 76 |███████ |
06:15 62 |██████ |
06:45 100 |██████████ |
07:15 130 |█████████████ |
07:45 142 |██████████████ |
08:15 114 |███████████ |
08:45 120 |████████████ |
09:15 110 |███████████ |
09:45 90 |█████████ |
10:15 86 |████████ |
10:45 66 |██████ |
11:15 92 |█████████ |
11:45 96 |█████████ |
12:15 108 |██████████ |
12:45 122 |████████████ |
13:15 100 |██████████ |
13:45 76 |███████ |
14:15 170 |█████████████████ |
14:45 154 |███████████████ |
15:15 94 |█████████ |
15:45 110 |███████████ |
16:15 116 |███████████ |
16:45 122 |████████████ |
17:15 44 |████ |
17:45 80 |████████ |
18:15 120 |████████████ |
18:45 82 |████████ |
19:15 104 |██████████ |
19:45 114 |███████████ |
20:15 72 |███████ |
20:45 102 |██████████ |
21:15 104 |██████████ |
21:45 64 |██████ |
22:15 76 |███████ |
22:45 52 |█████ |
23:15 56 |█████ |
23:45 128 |████████████ |
24:15 124 |████████████ |
24:45 90 |█████████ |
25:15 104 |██████████ |
25:45 94 |█████████ |
26:15 84 |████████ |
26:45 50 |█████ |
27:15 52 |█████ |
27:45 60 |██████ |
28:15 0 |· |
Reading the chart: corpus median (per 30s window) is ~210 wpm. This episode runs at ~94 wpm/window — meaning there's significant gap time within each window (silence, music, pauses). Whole-episode WPM is 129 (on corpus target of 130–140), but the windowed view shows the dialogue is lower-density-per-window than the corpus average. Likely room to tighten silences between lines.
What the rules said
22 of 26 rules passed, including the new ones:
- ✅
rule_has_brilliant_ending— closer is 59 chars with 2 callback-token overlap - ✅
rule_setup_to_payoff_distance_min— longest gap 24.0 min ≥ corpus p25 (4.5 min) - ✅
rule_sfx_count_within_band— 11 SFX over 28 min = 0.39/min ≤ corpus p75 (1.05/min) - ✅
rule_has_snowball_lie_pair— softened; bonus pattern, not required - ✅
rule_third_act_status_flip— softened; bonus pattern, not required
4 rules flagged — and we just fixed the 3 that were over-eager:
| Rule | Status before fix | Status after fix |
|---|---|---|
finite_isolation_trap |
failed (only checked premise.machine) | now also checks scenes — would PASS for this ep |
tonal_shift_present |
failed (no parseable timestamps in standout_moments) | now also accepts a final-third tonal-tagged beat — would PASS for this ep |
no_explain_the_joke_meta |
false-positive on bare word "explain" | tightened to phrases like "explain the joke" / "as if to explain" — would PASS |
period_register_strictness |
failed (vocabulary_register was "ecclesiastical", not "1950s ecclesiastical") | rule kept as-is; concept prompt updated to require the era be named literally |
After re-running with the rule fixes, this episode's expected pass count would be 25 of 26, with only period_register_strictness legitimately firing (the model wrote vocabulary_register: "ecclesiastical" instead of "period 1950s ecclesiastical" — a real generation issue, now addressed by an explicit prompt instruction).
Files
The artifacts live under data/generations/2026-05-01/2026-05-01T12-14-32__90263f93/01/ (gitignored — operational outputs):
| Artifact | Path (relative to repo root) | Size |
|---|---|---|
| Final mixed audio | data/generations/2026-05-01/.../01/audio/final_mixed__2026-05-_iter01_20260501T122541.wav |
local |
| Episode JSON | .../01/episode.json |
local |
| Concept JSON | .../01/concept.json |
local |
| Full report card | .../01/report_card.md |
local |
| Iteration record | .../01/record.json |
local |
To listen on this machine:
open data/generations/2026-05-01/2026-05-01T12-14-32__90263f93/01/audio/final_mixed__*.wav
To re-render from the same seed (~23 min, ~$1.04 spend):
uv run generate --mode=meta --iterations=1 \
--seed="A 1950s vicar and his bell-ringer realise the church's register has been carefully altered for fifty years." \
--n_candidates=2 --crossbreed --adversarial --active_panel \
--budget_usd=3.0