Skip to content

Hosts coordinate on the greeting turn too, not only after it - #53

Merged
ralyodio merged 1 commit into
mainfrom
fix/coordinate-on-the-greeting-turn
Nov 5, 2026
Merged

ralyodio merged 1 commit into
mainfrom
fix/coordinate-on-the-greeting-turn

Conversation

@ralyodio

@ralyodio ralyodio commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

What happened

Off The Record episode 9 ended twenty seconds after the guest picked up. He said "Hello? This is Anthony." and got two introductions on top of each other:

17:35:22.882  cha0spunk: Hello, I'm here, nice to have you on the show, Anthony.
17:35:24.665  riotcoder: Hey Anthony, glad you're here...      (played until 17:35:43)

Attribution was perfect by then (#50–#52): each host correctly logged the guest as the guest and its partner as (other agent). They simply both spoke.

Why — deterministic, not a race

The co-host block does three things: never answer what the co-host was asked, let the lead go first while the co-host waits a beat, and reserve the floor before thinking. It was gated on !firstTurn:

const firstTurn = join && shouldIntroduce(agent, transcript, Date.now());
...
if (join && a.interview && !firstTurn) {
  if (partnerSpokeLast && !mine) return;
  if (!mine) await new Promise((r) => setTimeout(r, agent === 'riotcoder' ? 700 : 2600));
  ...
  if (ended || !takeFloor(a.pin, agent, '', 45_000)) return;
  reservedQuestionFloor = true;
}

And shouldIntroduce() is true whenever the agent has not spoken for three minutes:

return !Number.isFinite(at) || now - at > recentMs;   // recentMs = 3 * 60_000

Both hosts dial in, say their opening line to an empty room, and then wait while the show rings the guest. That wait is always longer than three minutes (ep9: hosts spoke at 17:31:2x, guest joined 17:35:21 — 3 min 49 s). So on the guest's very first words both hosts counted as introducing themselves and skipped the stagger, the reservation and the one-voice rule — in the ten seconds that decide whether he stays on the line. Episode 8's two hosts asking the same bare-metal question four seconds apart was this same hole.

The fix

  • Coordination runs on every interview turn. shouldIntroduce() goes back to being only what it says: whether the prompt should ask for a hello. With the stagger restored, the lead greets and partnerSpokeLast keeps the co-host from doubling it — and the lead's greeting already introduces both hosts by name.
  • The same staleness switched off the guards that stop two hosts answering one line (introduced && …), so any three-minute lull re-enabled double answers — and a long answer from the guest is exactly what The Deep End asks for. introduced now means "has spoken on this call at all", not "spoke recently".

A reservation that leads nowhere is still released: finally { if (reservedQuestionFloor && !speaking) releaseFloor(...) }, so a model that returns nothing does not hold the floor for 45 s.

bun test 110 pass / 0 fail, tsc --noEmit clean.

🤖 Generated with Claude Code

Episode 9 ended twenty seconds after Anthony picked up. He said "Hello? This
is Anthony." and got two introductions on top of each other:

  17:35:22.882  cha0spunk: Hello, I'm here, nice to have you on the show, Anthony.
  17:35:24.665  riotcoder: Hey Anthony, glad you're here... (played until :43)

Not a race: deterministic. The co-host block - do not answer what your co-host
was asked, lead first and co-host waits a beat, reserve the floor - was gated on
`!firstTurn`, and firstTurn is `shouldIntroduce()`, true whenever the agent has
not spoken for three minutes. Both hosts dial in and then wait in an empty room
while the guest is rung, which is always longer than three minutes. So on the
guest's very first words both hosts counted as introducing themselves and
skipped the stagger, the reservation and the one-voice rule entirely - in the
ten seconds that decide whether he stays on the line. Episode 8's duplicate
bare-metal question was the same hole.

Coordination now runs on every interview turn. shouldIntroduce() goes back to
being only what it says: whether the PROMPT should ask for a hello.

The same staleness also switched off the guards that stop two hosts answering
one line (`introduced && ...`), so any three-minute lull re-enabled double
answers - and a long answer from the guest is exactly what the deep format asks
for. Those now test whether the agent has spoken on this call at all.

110 pass, 0 fail; tsc clean.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ralyodio
ralyodio merged commit d17d6ce into main Nov 5, 2026
3 checks passed
@ralyodio
ralyodio deleted the fix/coordinate-on-the-greeting-turn branch November 5, 2026 17:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant