fix(desktop): the voice and call windows are sent no planning conversation, as they are sent no planning work
Found by the PRIVACY.md worker: #2437 added planning.conversation (the planner's raw journals, run_on_mac and repository command output included) to the planning view, but voiceWindowState (apps/desktop/src/main/app-state.ts) strips only planning.work. So the new key reached the hidden voice window and the call window. AGENTS.md's Never rule keeps that out of the voice window, and that's why work was stripped in the first place.
What
-
voiceWindowStatenow stripsconversationas well aswork. Its doc says why: neither window draws them, and both carry command output from the repository and the Mac. -
First read too (Devin's finding): a voice or call window's first read of the document (the bridge's
requestAppState, answered bysnapshotFor) was unfiltered, forworkas well. The bridge host now answers it throughwindowAppState, which appliesvoiceWindowStatefor a voice or call sender and leaves a panel's whole.
Other new state from B/C: checked. planning.conversation is the only state key #2437 or #2453 added. The two new acts, PLANNING_CONVERSATION_EARLIER and PLANNING_MESSAGES, already refuseUnlessPanel (planning-acts.ts), so the voice window can't ask for the conversation or a worker's session either.
Tests
apps/desktop/src/main/app-state.test.ts: the voice-window test, throughvoiceWindowState's public export, now also holds a conversation carrying arun_on_maccall's output. It asserts the sent state has neitherworknorconversation, and no trace of that output anywhere. It fails without the change. It also asserts the first-read answer (windowAppState) for both windows, and that a panel's read keeps the conversation. The fixture is synthetic (git statuson a made-up branch)../scripts/check.shexits 0.
Mac UI
CI could not verify the Mac, and ./scripts/verify.sh was not run (LUKE-159). Nothing visible changes: the voice and call windows never drew either key.
š¤ Generated with Claude Code
Summary by cubic
Prevents the hidden voice and call windows from receiving planning.work and planning.conversation, which can contain command output. Their initial state read now uses the same filtering, while panels still receive the full planning state.
- Tests verify both windows exclude the data and panels retain it.