Keep the Plans tab on Thinking until Luke starts answering

Closed
CH
8d ago
+84-19

Live testing of #1766 found moments where Luke was working but the row read "Listening". Busy ran only from the brain accepting an ask to the exchange's finalize. That missed two waits: the one before the brain takes the ask (record write, submitAsk round trip), and, on every answer, the second or two after a hosted turn hands back its whole reply and before GPT-Live starts saying it.

LiveSessionService now also holds the session busy while Luke owes words he hasn't begun. It's set when a delegation is claimed and when words are queued for him to say, and cleared by his next spoken fragment. Once the brain accepts, the exchange takes over from the delegation's wait, so a completed run with nothing to say still drops busy at finalize. A refusal or a failed-run note keeps busy until Luke starts saying it. One file of logic; the Mac, the frame, and the renderer are unchanged.

Tests: busy before the brain takes the ask; busy past the exchange's end until an output transcript delta; a completed silent run drops at finalize; a failed run and a refusal hold until spoken. The end-to-end planning test now ends busy on Luke's first spoken words. ./scripts/check.sh is green.

No UI code changed, but CI builds nothing for the Mac, so the live behaviour hasn't been checked on one.

šŸ¤– Generated with Claude Code


Open workspace in Conductor