Show the voice and the backend separately on the Plans tab

Merged
CH
18d ago
+869-518

Replaces the single "Thinking" word from #1766 with two lines in the Plans microphone row, each saying only what its part of Luke is doing. Supersedes #1769, which stretched "Thinking" over the voice's waits.

Voice line: the call's status, except while listening or muted it shows the wait the service reports:

  • Handing off: GPT-Live delegated, the planning model hasn't taken the ask yet.
  • About to answer: words are queued for Luke, his voice hasn't started.

Backend line (hidden when idle):

  • Planning model · grep -rn invite src: the command of its pending tool call, read off the turn journal the live brain already polls. Input only, never output, cut to 120 characters. Thinking when no call is pending.
  • Notetaker · Writing notes: while the notetaker's model call runs.

The service sends this as one plan.activity snapshot, replacing plan.busy (unreleased, this branch only). The host stores it as-is. The Plans row's elapsed count and its clock are removed; the Conversation tab's own label is unchanged. The activity event stays in-process: the turn-event wire and SSE stream are untouched.

Golden: live-contract-planBusyFrameSchema.json is replaced by live-contract-planActivityFrameSchema.json (the new frame's schema). iOS decodes the frame as unreadable, as before.

CI could not verify this. It's a Mac UI change and CI builds nothing for the Mac. It hasn't had a ./scripts/verify.sh run. ./scripts/check.sh is green.

🤖 Generated with Claude Code


Open workspace in Conductor