mirror of
https://github.com/block/buzz.git
synced 2026-08-18 06:50:31 +02:00
The kickoff scripted a closer and assumed it was the last word. It never could be: the teammate intros `@mention` Fizz, which is the mandatory delegator callback in base_prompt.md, so Fizz is guaranteed to wake and reply after them. The choreography and the base prompt were fighting, and the user got two CTAs. The scripted one was also the one that could be wrong. It raced the intros on an 18s stopwatch (15s wait + 3s beat) — well under a real agent turn, so it reliably announced "Honey and Bumble are taking longer than expected" seconds before both intros landed. Fizz's live reply was better: contextual, and right about the state of the world. So let the guaranteed message be the close, and keep the script for problems only: - buildWelcomeKickoffCloser returns null for a clean kickoff. Failure variants are unchanged and still carry the CTA, where the user needs both the bad news and a way forward. - Enforce the null inside sendWelcomeKickoffCloser rather than at the two call sites, so the delayed-teammate timer can't emit a bare CTA after the intros land and re-classify the kickoff as clean. - TEAMMATE_INTRO_WAIT_MS 15s -> 60s. This only covers a teammate that is alive but silent, where waiting is correct; a crashed teammate is read from agent status and still closes immediately. The closer marker was quietly doubling as the durable "kickoff finished" signal, and a marker requires a message to exist — so "success posts nothing" would have meant "success never latches", refetching the opener subtree forever and restarting the whole Welcome team on every revisit. welcomeKickoffAlreadyFinished now accepts a second piece of relay-side evidence: an intro from every teammate in the opener's thread. The marker still short-circuits first, so the failure paths and the solo opener are untouched. Verified live against Codex on 2026-07-18 with the base prompt as the only variable: the intro loop terminated on its own at four replies. Co-Authored-By: Claude <noreply@anthropic.com>