You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Real DJs do this constantly: rather than hunt for a track short enough to land on the hour, the outgoing DJ signs off in the lead-in to a track they know will run over the top, the track crosses the boundary, and the incoming DJ picks up on the far side — back-announcing that track, usually thanking the DJ who just left.
Dean's framing, and the reason this is an issue rather than a redesign: it isn't the default handoff. It's the escape hatch a DJ reaches for when the rotation has them trapped — "I can't find a track small enough to fit."
The bottom rung is only ever reached because a PREVIOUS unit overshot; it minimizes the harm rather than fixing it. This issue's rung is what keeps the station off that bottom rung in the first place.
🚧 What blocks it today
SignOff is due at boundary - SignOffLeadTime and SignOn at the boundary, and both drain in a singleTryDequeueDue call at the same unit seam — deliberately, per SignOffLeadTime's own remarks ("both pieces drain together… the overwhelmingly common case"). They land in the buffer back-to-back.
So there is no way to express "sign off, play a track, sign on". The two halves are glued.
🔑 Why the invariant needs both halves separated
The rule this has to satisfy decomposes into two, not one:
SignOff — must air BEFORE the hour; a full track early is fine
SignOn — should land AT or AFTER the hour, because it's the new show's first words ("it's Thursday two o'clock")
Glued together, the pair can only satisfy both by landing near the boundary — which is exactly the needle gh-#254 has been trying to thread. Separated, the straddling track absorbs the slack and both halves are correct by construction: sign-off early, sign-on just past the hour.
This is also why simply raising gh-#300's MusicUnitFloor does not work as a shortcut — it converts a late sign-on into an early one ("it's two o'clock" at 1:57) rather than fixing anything.
🛠️ Sketch
Split the ceremony's arming so SignOn's due is expressed as "after the straddling unit" rather than a wall-clock instant, or arm it at the moment the straddling track is planned.
Selection inverts on this rung: instead of the candidate whose end lands NEAREST the boundary, prefer one that comfortably CROSSES it (a track ending 5s past the hour is the worst possible pick — it strands the sign-on in a 5s gap).
Thanking the departing DJ — SignOn already carries CounterpartName (F92.2).
Back-announcing the straddling track — falls out naturally: the back-announce refers to previousTrack and the persona resolves fresh, so whoever is on air does it in their own voice.
Relates: gh-#300 (the bottom rung + the fit logging that will measure this band), gh-#254 (the fit), gh-#253/#288 (the estimates it reasons from).
Real DJs do this constantly: rather than hunt for a track short enough to land on the hour, the outgoing DJ signs off in the lead-in to a track they know will run over the top, the track crosses the boundary, and the incoming DJ picks up on the far side — back-announcing that track, usually thanking the DJ who just left.
Dean's framing, and the reason this is an issue rather than a redesign: it isn't the default handoff. It's the escape hatch a DJ reaches for when the rotation has them trapped — "I can't find a track small enough to fit."
🎚️ The rung it belongs on
The bottom rung is only ever reached because a PREVIOUS unit overshot; it minimizes the harm rather than fixing it. This issue's rung is what keeps the station off that bottom rung in the first place.
🚧 What blocks it today
SignOffis due atboundary - SignOffLeadTimeandSignOnat the boundary, and both drain in a singleTryDequeueDuecall at the same unit seam — deliberately, perSignOffLeadTime's own remarks ("both pieces drain together… the overwhelmingly common case"). They land in the buffer back-to-back.So there is no way to express "sign off, play a track, sign on". The two halves are glued.
🔑 Why the invariant needs both halves separated
The rule this has to satisfy decomposes into two, not one:
Glued together, the pair can only satisfy both by landing near the boundary — which is exactly the needle gh-#254 has been trying to thread. Separated, the straddling track absorbs the slack and both halves are correct by construction: sign-off early, sign-on just past the hour.
This is also why simply raising gh-#300's
MusicUnitFloordoes not work as a shortcut — it converts a late sign-on into an early one ("it's two o'clock" at 1:57) rather than fixing anything.🛠️ Sketch
SignOn's due is expressed as "after the straddling unit" rather than a wall-clock instant, or arm it at the moment the straddling track is planned.✅ Already in place, no work needed
SignOnalready carriesCounterpartName(F92.2).previousTrackand the persona resolves fresh, so whoever is on air does it in their own voice.Relates: gh-#300 (the bottom rung + the fit logging that will measure this band), gh-#254 (the fit), gh-#253/#288 (the estimates it reasons from).