What it is
The two seams between talk and music were reworked because both sounded abrupt
by ear (user report, 2026-09-03). Everything deterministic about that rework is
unit-tested — the gain envelope on an offline render, the prompt contract text,
the Director's duck/lift call order. None of what the change was actually for
is assertable: whether the song now arrives out of the talk instead of beside
it, and whether the envelope reads as a room settling rather than a switch
flipping. That is this pass.
The knobs under test are module constants with one home each, listed in
specs/spec03/03-02-ducking.md §6.1 — an audition changes one number in one
place and re-runs:
| Knob |
Home |
Shipped value |
UNDUCK_RAMP_S |
src/engine.ts |
2.5 s (against the duck's RAMP_S 0.3 s) |
| announce length |
FIND_MUSIC_CONTRACT, src/prompts.ts |
2-4 sentences, ~10-20 s spoken |
CODA_RIDE_P |
src/director.ts |
0.5 |
CODA_LEAD_MIN_S / CODA_LEAD_MAX_S |
src/director.ts |
8 s / 12 s |
How to run it: make dev with real voice and music (not STUB=1), and stay
through at least three songs — the first song of a session is aired on the
startup-primed pick, which has no prior line to hand over from, so the
hand-over criterion can only be judged from the second song on.
Spec
specs/spec03/03-02-ducking.md §1 #6 (the way into a track), §3.2 (the two
ramps), §5 #8 (acceptance), §6.1 (the by-ear constants table).
Done when
The user has listened and answered each box. A "no" becomes its own follow-up
issue (or a new value for the constant); it does not reopen the contract.
The way out of a song (the coda beat, spec 04 §3.3-C):
Also worth listening for: MUSIC_OUTLASTS_RULE is dropped for the coda cue
only, so the coda is the one beat allowed to speak about the song ending. If
any OTHER beat starts narrating songs starting or ending, that is a defect, not
a tuning question — file it separately.
What it is
The two seams between talk and music were reworked because both sounded abrupt
by ear (user report, 2026-09-03). Everything deterministic about that rework is
unit-tested — the gain envelope on an offline render, the prompt contract text,
the Director's duck/lift call order. None of what the change was actually for
is assertable: whether the song now arrives out of the talk instead of beside
it, and whether the envelope reads as a room settling rather than a switch
flipping. That is this pass.
The knobs under test are module constants with one home each, listed in
specs/spec03/03-02-ducking.md§6.1 — an audition changes one number in oneplace and re-runs:
UNDUCK_RAMP_Ssrc/engine.tsRAMP_S0.3 s)FIND_MUSIC_CONTRACT,src/prompts.tsCODA_RIDE_Psrc/director.tsCODA_LEAD_MIN_S/CODA_LEAD_MAX_Ssrc/director.tsHow to run it:
make devwith real voice and music (notSTUB=1), and staythrough at least three songs — the first song of a session is aired on the
startup-primed pick, which has no prior line to hand over from, so the
hand-over criterion can only be judged from the second song on.
Spec
specs/spec03/03-02-ducking.md§1 #6 (the way into a track), §3.2 (the tworamps), §5 #8 (acceptance), §6.1 (the by-ear constants table).
Done when
The user has listened and answered each box. A "no" becomes its own follow-up
issue (or a new value for the constant); it does not reopen the contract.
into a song — not a paragraph to sit through, not back to a label.
of the line that was on air when the pick was fired, where there is one —
and simply brings the song in where there is not. No "up next" formula,
no title/artist/year rundown.
reads as settling, not as a switch. Also judged after a typed reply
over a song, which rides the same lift.
before the announce opens.
The way out of a song (the coda beat, spec 04 §3.3-C):
song happened — without turning into a review. Saying nothing about the
track and simply carrying on is a pass, not a miss.
half of tracks, 8-12 s before the end), it lands as a DJ talking over a
fade — not as an interruption, and not so early it sits on the song.
the outro" and "waits for the song to end" reads as variety rather than
inconsistency. If it reads as inconsistency,
CODA_RIDE_Pis the knob.Also worth listening for:
MUSIC_OUTLASTS_RULEis dropped for the coda cueonly, so the coda is the one beat allowed to speak about the song ending. If
any OTHER beat starts narrating songs starting or ending, that is a defect, not
a tuning question — file it separately.