Skip to content

orchestration: the straddle handoff — sign off into a track that crosses the hour, sign on after it #320

Description

@genwave-radio

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

room left before the boundary move status
enough for a track to fit plan it — ceremony lands at the seam ✅ shipped (gh-#254 fit)
positive, but nothing in rotation fits straddle — sign off now, plan a track that crosses, sign on after it ❌ this issue
already negative (queued audio runs past the boundary) ceremony now, no music — least-late damage control ✅ shipped (gh-#300, PR #319)

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 single TryDequeueDue 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).
  • The gh-orchestration: boundary-fit selection — land the last pre-handoff track near the top of the hour #254 tolerance probably wants to go asymmetric while we're here: generous on the early side, tight on the late side. Symmetric ±30s encodes "late and early are equally bad", which is not the rule.

✅ Already in place, no work needed

  • Thanking the departing DJSignOn 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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions