[BUG] Cowork dispatches macOS-only extensions to Linux remote → retry loop causes remote OOM and local renderer leak

Resolved 💬 2 comments Opened Apr 24, 2026 by TakeOver Closed Jun 2, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

What's Wrong?

When a Cowork session is attached to a Linux SSH host, macOS-only Claude Desktop extensions are still dispatched as RemoteProcesses on the remote. Their manifests declare platforms: ["darwin"] (or use macOS-only APIs like AppleScript / Chrome AppleScript). The remote has no node in $PATH, so every spawn fails with exec: "node": executable file not found in $PATH. The app retries indefinitely on a ~15 s cadence per server.

What Should Happen?

  • Desktop respects extension platforms compatibility field and does not dispatch macOS-only extensions to Linux remotes.
  • At minimum, failed spawns use exponential backoff and eventually disable the extension for that session rather than retrying forever.

Error Messages/Logs

[RemoteProcess:…] Spawn failed: exec: "node": executable file not found in $PATH
[RemoteStdioTransport:Control Chrome] process error: …
[SshMcpServerManager] Failed to connect Control Chrome: connect timeout
[RemoteProcess:…] kill called with signal: SIGTERM

Steps to Reproduce

Reproduction

  1. Install Control Chrome, Control your Mac, and PDF (By Anthropic) extensions on macOS.
  2. Configure a Cowork SSH host (Linux) without node on the remote $PATH.
  3. Open Claude Desktop with a Cowork session on that host.
  4. Leave running for ~60 min.

Claude Model

Not sure / Multiple models

Is this a regression?

Yes, this worked in a previous version

Last Working Version

_No response_

Claude Code Version

1.3883.0

Platform

Anthropic API

Operating System

macOS

Terminal/Shell

Terminal.app (macOS)

Additional Information

Environment

  • Claude Desktop: 1.3883.0 (macOS arm64)
  • Claude Code CLI (local embedded): 2.1.111
  • Remote CLI (cowork): 2.1.111 on Linux arm64 (NVIDIA DGX Spark / GB10)
  • claude-ssh server: 9a871e263f5ad97516c97c8c8129f94990635ae7

Summary

When a Cowork session is attached to a Linux SSH host, macOS-only Claude Desktop extensions are still dispatched as RemoteProcesses on the remote. Their manifests declare platforms: ["darwin"] (or use macOS-only APIs like AppleScript / Chrome AppleScript). The remote has no node in $PATH, so every spawn fails with exec: "node": executable file not found in $PATH. The app retries indefinitely on a ~15 s cadence per server.

Affected extensions observed

  • ant.dir.ant.anthropic.chrome-control (manifest: platforms: ["darwin"])
  • ant.dir.gh.k6l3.osascript ("Control your Mac" — AppleScript, macOS-only in practice)
  • ant.dir.gh.anthropic.pdf-server-mcp (darwin/win32/linux manifest, but node wasn't provisioned on remote)

Reproduction

  1. Install Control Chrome, Control your Mac, and PDF (By Anthropic) extensions on macOS.
  2. Configure a Cowork SSH host (Linux) without node on the remote $PATH.
  3. Open Claude Desktop with a Cowork session on that host.
  4. Leave running for ~60 min.

Expected

  • Desktop respects extension platforms compatibility field and does not dispatch macOS-only extensions to Linux remotes.
  • At minimum, failed spawns use exponential backoff and eventually disable the extension for that session rather than retrying forever.

Actual

  • ~/Library/Logs/Claude/ssh.log fills with, every ~15 s per server:

``
[RemoteProcess:…] Spawn failed: exec: "node": executable file not found in $PATH
[RemoteStdioTransport:Control Chrome] process error: …
[SshMcpServerManager] Failed to connect Control Chrome: connect timeout
[RemoteProcess:…] kill called with signal: SIGTERM
``

  • On the remote, each retry opens and closes an SSH session. loginctl list-sessions shows session IDs climbing 600+ per hour. snapd-desktop-i / systemd-logind accumulate memory per session.
  • After 55–60 min, the OOM killer fires on the remote:

``
wireplumber.service: killed by the OOM killer (code=killed, status=9/KILL)
``

  • Remote kernel eventually panics / hangs. I observed 14 hard reboots over ~72 hours on a 119 GB RAM box.
  • On macOS, the renderer (Claude Helper (Renderer)) grows handles/heap continuously and crashes every ~40 min.

Impact

Users with any macOS-only extension installed + Cowork on Linux get periodic desktop crashes and — more seriously — hourly hard-crashes of their remote development box.

Workaround

Disable the macOS-only extensions by editing

~/Library/Application Support/Claude/Claude Extensions Settings/<extension-id>.json

to {"isEnabled": false} and restart the app. This immediately stops the loop (verified: SSH disconnects/min dropped from ~60 to ~4, no further OOMs on remote).

Suggested fixes

  1. Honor manifest.compatibility.platforms when picking dispatch target. If target platform isn't in the list, run the extension locally (or surface a UI warning and skip).
  2. Apply exponential backoff to remote RemoteProcess spawn failures; stop retrying after N failures per session.
  3. In the error message, hint at the platform mismatch when it's likely (e.g. macOS node-based extension + Linux remote).

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗