UPDATE: This is not a single stale session. After registering a brand-new environment,
the 404 returned on the next launch with a DIFFERENT session ID (cse_<REDACTED_2> vs the
original cse_<REDACTED_1>), on the same fresh environment. Sessions appear to be created
and then not found at worker-attach time, seconds later. Abandoning the environment does
not fix it — the new environment reproduces the failure and leaves an undeletable duplicate
row in the picker.
Remote Control: a ghost session can permanently 404 an environment, and stale environments can't be removed or told apart
Preflight Checklist
What's Wrong?
Two problems that compound each other: a stale session can permanently break an environment, and there is no way to remove the environment you're then forced to abandon.
1. A ghost session 404s on every launch
Every claude remote-control start printed:
Error: CCR v2 worker registration failed for session cse_<REDACTED>:
Request failed with status code 404
Same session ID each time, reproducible across restarts, on the latest build, with claude doctor clean and no ANTHROPIC_* variables set. The environment's server-side session list contained a session that no longer existed, so the bridge tried to attach a worker to it on every start and failed.
The session ID is not stored locally — grep -rl "cse_<id>" ~/.claude ~/.claude.json returned nothing. Only the environment pin is local:
~/.claude/projects/<mangled-project-path>/bridge-pointer.json
Workaround: move bridge-pointer.json aside, forcing registration of a fresh environment. This clears the 404 — but the only escape from a bad environment is to abandon it, which strands the old one in the picker forever. Which leads to:
2. Stale environments cannot be removed or told apart
The picker now shows two identical, dead rows:
Remote Control
<Folder> 0 of 32 <Hostname>
<Folder> 0 of 32 <Hostname>
- No delete affordance in the CLI, web, or mobile app.
- Confirmed server-side: the rows appear at
claude.ai/code in a browser, not just in Desktop. Signing out and relaunching does not clear them. Nothing local references them.
- Environments cannot be renamed. The label is derived from folder name + hostname, so two environments registered from the same directory are visually indistinguishable. The only tell between live and dead is the capacity count.
Contributing factor: Claude Desktop Code sessions also register Remote Control environments (via Settings → Claude Code → Enable remote control by default). This made the source hard to trace — ps aux | grep "claude remote-control" returned nothing while the rows persisted, because the registering processes were Desktop Code sessions, not a remote-control server.
Steps to Reproduce
- Run
claude remote-control in a project directory. Note the environment ID.
- Get the environment into a state where a session in its list no longer exists server-side. (In my case this happened on its own; I don't have a deterministic trigger.)
- Observe the 404 on every subsequent launch. It survives restarts and
claude update.
- Move
~/.claude/projects/<project>/bridge-pointer.json aside and relaunch.
- The 404 is gone, but the picker now permanently shows two identical rows for the same folder — one live, one dead — with no way to remove either.
Expected Behavior
- Orphaned sessions are reaped server-side, so a dead session ID cannot permanently 404 an otherwise healthy environment.
- The CLI can drop a bad session without abandoning the whole environment.
- Remote Control environments can be deleted from the web, mobile, and CLI.
- Environments can be named, or the picker surfaces the working directory, so two entries from the same folder are distinguishable.
- Sessions deregister gracefully on shutdown so rows don't strand.
Impact
The current best workaround is to ignore the environment picker entirely and navigate by environment URL. For anyone using Remote Control regularly, the picker fills with dead, identically-named entries and stops being usable.
Environment
- Claude Code: 2.1.208 (native install)
- Platform: macOS, darwin-arm64
- Shell: zsh
- Also installed: Claude Desktop (Code tab), remote control on by default//
UPDATE: This is not a single stale session. After registering a brand-new environment,
the 404 returned on the next launch with a DIFFERENT session ID (cse_<REDACTED_2> vs the
original cse_<REDACTED_1>), on the same fresh environment. Sessions appear to be created
and then not found at worker-attach time, seconds later. Abandoning the environment does
not fix it — the new environment reproduces the failure and leaves an undeletable duplicate
row in the picker.
Remote Control: a ghost session can permanently 404 an environment, and stale environments can't be removed or told apart
Preflight Checklist
What's Wrong?
Two problems that compound each other: a stale session can permanently break an environment, and there is no way to remove the environment you're then forced to abandon.
1. A ghost session 404s on every launch
Every
claude remote-controlstart printed:Same session ID each time, reproducible across restarts, on the latest build, with
claude doctorclean and noANTHROPIC_*variables set. The environment's server-side session list contained a session that no longer existed, so the bridge tried to attach a worker to it on every start and failed.The session ID is not stored locally —
grep -rl "cse_<id>" ~/.claude ~/.claude.jsonreturned nothing. Only the environment pin is local:Workaround: move
bridge-pointer.jsonaside, forcing registration of a fresh environment. This clears the 404 — but the only escape from a bad environment is to abandon it, which strands the old one in the picker forever. Which leads to:2. Stale environments cannot be removed or told apart
The picker now shows two identical, dead rows:
claude.ai/codein a browser, not just in Desktop. Signing out and relaunching does not clear them. Nothing local references them.Contributing factor: Claude Desktop Code sessions also register Remote Control environments (via Settings → Claude Code → Enable remote control by default). This made the source hard to trace —
ps aux | grep "claude remote-control"returned nothing while the rows persisted, because the registering processes were Desktop Code sessions, not aremote-controlserver.Steps to Reproduce
claude remote-controlin a project directory. Note the environment ID.claude update.~/.claude/projects/<project>/bridge-pointer.jsonaside and relaunch.Expected Behavior
Impact
The current best workaround is to ignore the environment picker entirely and navigate by environment URL. For anyone using Remote Control regularly, the picker fills with dead, identically-named entries and stops being usable.
Environment