Preflight Checklist
What's Wrong?
Claude Desktop on macOS 26.3.1 hangs indefinitely when starting a Remote (SSH) Claude Code session.
The hang occurs immediately after Desktop logs [CCD] Passing N plugin(s) to SDK. After that line the SDK never proceeds to spawn the remote CLI — no server.spawn RPC is ever sent to the remote server --bridge. All worker threads sit idle in mach_msg, so it is not a CPU hang but an async await that never resolves.
Reproducible every time, including with:
- a completely fresh
~/Library/Application Support/Claude/ (full re-login),
- zero remote MCP connectors (single plugin: skills),
- empty session persistence.
A direct SSH + claude CLI workflow on the same remote host works normally, which isolates the bug to the Desktop-side SDK → CLI spawn path (not the remote host and not the network itself).
What Should Happen?
After [CCD] Passing N plugin(s) to SDK, the Desktop SDK should either:
- issue a
server.spawn RPC over the bridge and start ccd-cli on the remote within a few seconds, OR
- fail with a clear timeout / error surfaced in the UI so the user can act on it.
An indefinite, silent hang with no error, no timeout, and no UI feedback is the worst failure mode — the user cannot tell whether work is progressing, queued, or dead.
Error Messages/Logs
# Mac side main.log — the hang point (reproduces every attempt)
[info] Starting local session local_XXXXXX in /home/tama/ai-agent-team
[info] [SSH] Using remote spawn function for session ... (cli: /home/tama/.claude/remote/ccd-cli/2.1.111)
[info] [CCD] Using skills plugin at: .../local-agent-mode-sessions/skills-plugin/...
[info] [CCD] Passing 1 plugin(s) to SDK (skills: 1, remote: 0, local: 0)
[info] [EventLogging] Flushing N events ← periodic flush continues, but no more real progress
[info] LocalSessions.checkGhAvailable: cwd=... ← periodic repeat only; no session ever starts
# Mac side ssh.log — network-interface flap correlates with hangs
[info] [remote] network-interface change detected; probing SSH controllers
[info] [remote] network-interface change detected; probing SSH controllers
...
# Earlier incident showed a 15-minute handshake timeout from the same cause:
[error] [SSH2Connection] Connection error: Timed out while waiting for handshake
[error] [RemoteServerController] Connection failed (899990ms, trigger: warm_up)
# Remote side bridge RPC log — shows Desktop connects fine, then goes silent:
[Server] RPC request: method=server.capabilities, id=1 → ok
[Server] RPC request: method=server.ping, id=2 → ok
[Server] RPC request: method=files.list, id=3-5 → ok
[Server] RPC request: method=files.read, id=6-7 → ok
(silence — no server.spawn RPC ever arrives)
Steps to Reproduce
-
macOS 26.3.1 (arm64 Apple Silicon) with Claude Desktop 1.3883.0.
-
Configure a Remote SSH host for Claude Code (Hetzner VPS, Linux amd64, ~300ms RTT).
-
Launch Desktop. SSH handshake + bridge channel open in ~15s (logs [BinaryDeployment] Bridge channel opened, Connected to remote server). So far, so good.
-
Send any prompt (even an empty ping) to kick off a session. Desktop logs:
Starting local session local_XXXXXX in <cwd>
[SSH] Using remote spawn function for session ... (cli: ~/.claude/remote/ccd-cli/2.1.111)
[CCD] Using skills plugin at: ...
[CCD] Passing 1 plugin(s) to SDK (skills: 1, remote: 0, local: 0)
-
UI spins forever. No error. No further real log entries — only periodic EventLogging Flushing and checkGhAvailable repeats. On the remote, remote-server.log confirms no server.spawn RPC ever arrives.
Persists after each of the following, tried in isolation:
- clearing
~/Library/Application Support/Claude/local-agent-mode-sessions/
- clearing
claude-code-sessions/
- clearing
claude-code/ and claude-code-vm/ CLI caches
- clearing
local-agent-mode-sessions/skills-plugin/
- moving the entire
~/Library/Application Support/Claude/ aside and re-logging in
- disabling every Connector on claude.ai/settings/connectors (plugin load = skills only, remote: 0)
- swapping the Desktop-deployed binary at
~/.claude/remote/ccd-cli/2.1.111 with the content of the user's native ~/.local/share/claude/versions/2.1.119 (still hangs — rules out "version-specific to 2.1.111")
Claude Model
Not sure / Multiple models
Is this a regression?
Yes, this worked in a previous version
Last Working Version
Unknown — Desktop 1.3883.0 initially worked for Remote SSH sessions to the same host earlier today (and in previous days/weeks); the hang started appearing without an obvious trigger, possibly correlated with a macOS network-interface flap event.
Claude Code Version
2.1.119 (Claude Code) — user's native install used by direct SSH, which works fine 2.1.111 — Desktop-deployed CLI at ~/.claude/remote/ccd-cli/2.1.111, which hangs
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Other
Additional Information
sample(1) of hung Desktop process
All threads idle in mach_msg — no stuck CPU loop, consistent with an unresolved async await:
- Main thread —
[NSApplication run] → _nextEventMatchingEventMask → _CFRunLoopRun → mach_msg2_trap (100% idle).
- libuv-worker × 4 — all in
mach_msg.
- tokio-runtime-worker × 8 — all in
mach_msg.
- V8Worker × 3 — all in
mach_msg.
Experiment: CLI version swap rules out version specificity
Replaced the Desktop-deployed ccd-cli/2.1.111 binary with the content of the user's working versions/2.1.119 (filename kept as 2.1.111 so Desktop's [BinaryDeployment] CLI v2.1.111 cached path accepts it). Still hangs identically. This rules out "older CLI version" as the root cause and points at the Desktop → CLI spawn bridge, or at state/handshake happening before the child process is actually invoked — consistent with the fact that no server.spawn RPC is ever sent.
Correlated signal: network-interface flapping
Mac ssh.log shows [remote] network-interface change detected; probing SSH controllers events in the same window as hangs, including during an earlier separate 15-minute SSH handshake timeout (Connection failed (899990ms, trigger: warm_up)). Hypothesis: in-flight SSH/HTTP calls spawned by the SDK are orphaned on interface flap and lack a watchdog timeout, so the SDK's internal await never settles.
Related (but distinct) issues
Common thread across all three: Desktop 1.3883 + remote-spawn pipeline on macOS, different phases of the pipeline stuck.
Full logs and diagnostics
Complete main.log, ssh.log, sample output, and remote remote-server.log are available in a private GitHub repo. Happy to share directly with Anthropic engineers — please comment or DM for access.
The logs contain per-account identifiers so are not included inline here.
Environment (extended)
| Component |
Version |
| Claude Desktop |
1.3883.0 |
| CCD / Claude Code CLI (Desktop-deployed) |
2.1.111 |
| Claude Code CLI (native, working via direct SSH) |
2.1.119 |
| macOS |
26.3.1 (25D2128), arm64 Apple Silicon (MacBook Air) |
| Node (bundled in Electron) |
24.14.0 |
| Remote host |
Linux amd64, ~300ms RTT from client |
Remote claude-ssh binary |
9a871e263f5ad97516c97c8c8129f94990635ae7 (built 2026-04-21) |
Preflight Checklist
What's Wrong?
Claude Desktop on macOS 26.3.1 hangs indefinitely when starting a Remote (SSH) Claude Code session.
The hang occurs immediately after Desktop logs
[CCD] Passing N plugin(s) to SDK. After that line the SDK never proceeds to spawn the remote CLI — noserver.spawnRPC is ever sent to the remoteserver --bridge. All worker threads sit idle inmach_msg, so it is not a CPU hang but an asyncawaitthat never resolves.Reproducible every time, including with:
~/Library/Application Support/Claude/(full re-login),A direct SSH +
claudeCLI workflow on the same remote host works normally, which isolates the bug to the Desktop-side SDK → CLI spawn path (not the remote host and not the network itself).What Should Happen?
After
[CCD] Passing N plugin(s) to SDK, the Desktop SDK should either:server.spawnRPC over the bridge and startccd-clion the remote within a few seconds, ORAn indefinite, silent hang with no error, no timeout, and no UI feedback is the worst failure mode — the user cannot tell whether work is progressing, queued, or dead.
Error Messages/Logs
Steps to Reproduce
macOS 26.3.1 (arm64 Apple Silicon) with Claude Desktop 1.3883.0.
Configure a Remote SSH host for Claude Code (Hetzner VPS, Linux amd64, ~300ms RTT).
Launch Desktop. SSH handshake + bridge channel open in ~15s (logs
[BinaryDeployment] Bridge channel opened,Connected to remote server). So far, so good.Send any prompt (even an empty
ping) to kick off a session. Desktop logs:UI spins forever. No error. No further real log entries — only periodic
EventLogging FlushingandcheckGhAvailablerepeats. On the remote,remote-server.logconfirms noserver.spawnRPC ever arrives.Persists after each of the following, tried in isolation:
~/Library/Application Support/Claude/local-agent-mode-sessions/claude-code-sessions/claude-code/andclaude-code-vm/CLI cacheslocal-agent-mode-sessions/skills-plugin/~/Library/Application Support/Claude/aside and re-logging in~/.claude/remote/ccd-cli/2.1.111with the content of the user's native~/.local/share/claude/versions/2.1.119(still hangs — rules out "version-specific to 2.1.111")Claude Model
Not sure / Multiple models
Is this a regression?
Yes, this worked in a previous version
Last Working Version
Unknown — Desktop 1.3883.0 initially worked for Remote SSH sessions to the same host earlier today (and in previous days/weeks); the hang started appearing without an obvious trigger, possibly correlated with a macOS network-interface flap event.
Claude Code Version
2.1.119 (Claude Code) — user's native install used by direct SSH, which works fine 2.1.111 — Desktop-deployed CLI at ~/.claude/remote/ccd-cli/2.1.111, which hangs
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Other
Additional Information
sample(1) of hung Desktop process
All threads idle in
mach_msg— no stuck CPU loop, consistent with an unresolved asyncawait:[NSApplication run] → _nextEventMatchingEventMask → _CFRunLoopRun → mach_msg2_trap(100% idle).mach_msg.mach_msg.mach_msg.Experiment: CLI version swap rules out version specificity
Replaced the Desktop-deployed
ccd-cli/2.1.111binary with the content of the user's workingversions/2.1.119(filename kept as2.1.111so Desktop's[BinaryDeployment] CLI v2.1.111 cachedpath accepts it). Still hangs identically. This rules out "older CLI version" as the root cause and points at the Desktop → CLI spawn bridge, or at state/handshake happening before the child process is actually invoked — consistent with the fact that noserver.spawnRPC is ever sent.Correlated signal: network-interface flapping
Mac
ssh.logshows[remote] network-interface change detected; probing SSH controllersevents in the same window as hangs, including during an earlier separate 15-minute SSH handshake timeout (Connection failed (899990ms, trigger: warm_up)). Hypothesis: in-flight SSH/HTTP calls spawned by the SDK are orphaned on interface flap and lack a watchdog timeout, so the SDK's internalawaitnever settles.Related (but distinct) issues
utunnetwork-interface flap. Same Desktop 1.3883 and same deployedccd-cli/2.1.111, but the hang is beforePassing plugin(s) to SDK(in[remote] probing SSH controllers) and recovers on its own after a few minutes. This report is different: hang is afterPassing plugin(s) to SDK, noserver.spawnRPC is ever issued, and it never recovers.Common thread across all three: Desktop 1.3883 + remote-spawn pipeline on macOS, different phases of the pipeline stuck.
Full logs and diagnostics
Complete
main.log,ssh.log,sampleoutput, and remoteremote-server.logare available in a private GitHub repo. Happy to share directly with Anthropic engineers — please comment or DM for access.The logs contain per-account identifiers so are not included inline here.
Environment (extended)
claude-sshbinary9a871e263f5ad97516c97c8c8129f94990635ae7(built 2026-04-21)