[Desktop] Governor eviction silently drops a session from cross-session messaging; on resume it re-registers under a different name and ref
Status Open
Reported on v2.1.271
Maintainer reply None cached
Activity 0 comments · opened Sep 18, 2026
Environment
- Claude Desktop 2.110.0 (macOS), embedded Claude Code 2.1.271
- Several local Code-tab sessions open at the same time (memory-pressure evictions are routine on this machine)
What happened
- Session A (title set in the desktop sidebar since the morning) ran
ListAgentsat 22:37 local time. It reported:This session is tmp-52 [41dcb0]. So the peer name was an auto-generated one, not the desktop title. - Session A spawned several sessions with
spawn_task. It expected to be reachable by them viaSendMessage. - Main log, 11 minutes after A's last turn:
````
22:49:08 [CliGovernor] pressure evicting local_7bebc33c-… (idle 286s)
22:49:08 [CCD] Pausing session local_7bebc33c-… (governor_evict)
22:49:09 Session local_7bebc33c-… query iterator completed
- For the next 9.5 hours A had no process, so it had no inbox socket. It was absent from every peer's
ListAgents. The sidebar still showed it as an ordinary open session. - When the user typed in A the next morning, the app logged
Resuming session local_7bebc33c-…and started a new process.ListAgentsthen reportedThis session is <desktop title> [6915af]. The name and the ref had both changed. The session ID, the transcript and the conversation were unchanged.
Why it matters
SendMessageaddresses the process, not the session. A peer that saved A's name or ref, or was told it in a brief, cannot reach A once A is evicted. After A resumes, the saved name is also wrong. Nothing tells either side.notify_when_idlein either direction dies with the evicted process. The docs promise a 12-hour expiry notice for a subscription that never fires. When the subscriber itself is evicted, there is no process left to receive that notice.- The desktop channel handles the same case well.
mcp__ccd_session_mgmt__send_messagewith thelocal_…session ID wakes an evicted session and starts a turn. It queues the message when the target is busy. We verified both today.get_session("self").parentSessionIdalso gives a spawned session a stable pointer to its parent. The two messaging surfaces therefore behave very differently for the same target. - The peer name is inconsistent. The first start used an auto-generated name, the resume used the desktop title.
Expected
Pick one of these, in order of preference:
SendMessageto a paused (evicted) desktop session routes through the app and resumes it, asccd_session_mgmt.send_messagealready does.ListAgentslists such sessions aspaused, similar to howofflineis shown for Remote Control sessions.- At minimum:
- A desktop session gets the same peer name on first start and on resume, preferably its sidebar title.
- The cross-session-messaging docs say that desktop sessions can be evicted and are then unreachable by name.
- The docs point to the session-ID channel as the durable option.
Related
- #82663 (CliGovernor hard cap)
- #85160 (SendMessage: accept a session ID as address; closed as stale)
- #71773 (parent observes spawned children; closed as stale, now partly covered by
parentSessionId)