feat(daily): open on a fourth-wall line instead of the host's name - #231
Merged
Merged
Conversation
The cold open credited a person - "I'm <host_name>" - and nobody is there: a scheduled job pulls the feeds, ranks them and writes the script, and a model speaks it. #223 retired that claim from the sign-off and left it standing at the top of the episode, where it started. Every cold open now carries one sentence saying the show is machine-made, built exactly like the sign-off's button: FOURTH_WALL_ANGLES names the ANGLE and never a phrase to say, the wording is written fresh each run, and FALLBACK_FOURTH_WALLS - the literals the no-model path needs - are the same three SKILL.md holds up as the register and burns, so a line is never both the example every writer sees and the day's opening. Four angles against INTRO_MODES' five, so the open's mode and its disclosure cycle together over twenty days instead of pairing off forever. The line is dry and explicitly NOT a joke: the button already carries the machine gag at the other end, and the same joke twice is a bit. host_name stays in config.json as the written credit only - it still matches the public show's <itunes:author> - and no part of the daily script speaks it now. SKILL.md is the production path, so its cold-open section carries the bank and the rules; the old "if the COLD OPEN names the host" rule is gone rather than narrowed. Frontier Commits' open never named a host and is untouched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RmUbYqCEQjMsi4jgWo2GQg
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The cold open credited a person —
"I'm <host_name>"— and nobody is there: a scheduled job pulls the feeds, ranks them and writes the script, and a model speaks it. #223 retired that claim from the sign-off and replaced it with the button, but left the same fiction standing at the top of the episode, where it started.Every cold open now carries one sentence saying the show is machine-made, built exactly like the button so there is one pattern rather than two:
FOURTH_WALL_ANGLESnames the ANGLE, never a phrase to say (theTRANSITION_MOVESposture) and the wording is written fresh each run — a stock disclosure read every morning stops being information and becomes a jingle.INTRO_MODES' five, so the open's mode and its disclosure cycle together over twenty days instead of pairing off forever (classicwould otherwise carry the same disclosure in every episode ever made).FALLBACK_FOURTH_WALLS— the three literals the no-model path needs — are the same three SKILL.md holds up as the register and burns, so a line is never both the example every writer sees and the day's opening.host_namestays inconfig.jsonas the written credit only — it still matches the public show's<itunes:author>— and no part of the daily script speaks it now. The old "if the COLD OPEN names the host, take the name fromhost_name" rule is gone rather than narrowed, since narrowing it is what left the name in the open last time. Frontier Commits' cold open never named a host, so it is untouched.SKILL.md is the production path (the scheduled run follows it, not
orchestrate.py), so the bank, the placement rule and the burned examples live there too, pinned by drift tests.The angles:
machine-bylinepipelinesynthetic-voiceno-one-hereRelated issue
Refs #223 (this finishes at the top of the episode what that change did at the bottom).
Acceptance criteria
"I'm <name>"is retired at both ends of the episodehost_nameis documented as a written credit that no line of script reads aloudTesting
ruff check .is green (andruff format --check ., with the CI-pinned ruff 0.14.10)pytestis green — 1536 passed, 10 skipped. One pre-existing failure is excluded:test_the_sandbox_exercises_the_music_layer_against_the_bundled_assetneedsffprobe, which this container has noffmpegfor; it fails identically on a stashed (unmodified) tree, and CI installs ffmpeg.render.pyis untouched.classic+pipeline, day 1theme-first+pipeline, day 2lead-first+synthetic-voice; the fallback intro readsToday's digest for September 14, 2026. 9 stories today. <line> Here's the rundown.with the disclosure as a beat of the open rather than its end.New tests:
test_fourth_wall_angle_is_not_locked_to_the_intro_mode,test_intro_prompt_carries_the_days_angle_and_hands_over_no_line_to_copy,test_intro_prompt_retires_the_hosts_name_at_the_TOP_of_the_episode_too,test_fallback_fourth_wall_lines_fit_the_cap,test_fallback_intro_still_says_what_is_speaking,test_skill_md_burns_the_fallback_fourth_wall_lines_it_shows_as_examples. Rewritten:test_skill_md_keeps_the_hosts_name_out_of_the_whole_script(was..._out_of_the_sign_off) andtest_skill_md_keeps_the_host_name_out_of_the_narration(was..._routes_the_spoken_host_name_through_config, which asserted the opposite of what is now true).test_skill_md_documents_every_shape_and_modenow covers the new bank, and the button's burned-example test is scoped to its own section — two sections now carry a burned bank, and an unscoped search would let one pass on the other's rule.Risk / blast radius
Small, and confined to script text. No renderer invariant is touched — no change to the 1:1 segment ↔ source mapping, chapter math,
covered.jsonwrite ordering, last-chapter silence, or mono 44.1k. The cold open stays one segment withrole: "intro"andsource_url: null; only its wording changes.Two things worth knowing: the cold open's ~350-400 char band now has to carry one more sentence (capped at 90 chars, and the rule says it sits inside the band rather than extending it), and
host_namebecomes a config key nothing speaks — it is deliberately kept, not removed, because it is still the written credit the public feed carries.Docs kept in sync
skills/daily-podcast/SKILL.md— new The fourth-wall line section, the host-credit rule replaced, the config-block comment and the Unattended daily run seed step updated. The procedure is not re-inlined anywhere;prompts/daily.mdstays a stub.CLAUDE.md— new bullet under Script variety is assigned, not requested, and the button bullet's now-false claim thathost_namestill reaches the cold open is corrected.🤖 Generated with Claude Code
https://claude.ai/code/session_01RmUbYqCEQjMsi4jgWo2GQg
Generated by Claude Code