anthropics / anthropics/claude-code
[BUG] Desktop app: Remote Control session is paused by idle timeout ~15 min after a stealth-update relaunch (RC hold not restored)
- Langage dominant
- Python
- Étoiles
- 145k
- Forks
- 23.1k
- Métriques de merge des PR
- Métriques de PR en attente
Description
### Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet (closest is #91717 — also triggered by a desktop app update, but a different symptom: HTTP 403 on connect)
- [x] This is a single bug report
- [x] I am using the latest version of Claude Code
### What's Wrong?
**Summary**
A local Code-tab session with Remote Control active is normally protected from the 900 s idle pause — the log shows `Skipping pause … remote control is active (explicit bridge)` every 15 min. After the app performs a stealth update and relaunches itself, that protection is not restored: the first idle timeout after the relaunch pauses the session, which kills its Remote Control connection. From the phone the session shows as disconnected and can only be recovered by reaching the Mac (remote desktop) and resuming it there.
**Evidence** (`~/Library/Logs/Claude/main.log`)
Before the update, every 15 minutes:
```
2026-09-04 06:46:54 [info] [WarmLifecycle:session] Idle timeout reached, disconnecting local_
2026-09-04 06:46:54 [info] [CCD] Skipping pause for session local_ - remote control is active (explicit bridge)
```
Update and relaunch:
```
2026-09-04 06:56:59 [info] [stealth-update] Triggering stealth update after idle timeout
2026-09-04 06:56:59 [info] beforeQuitForUpdate handler fired, going down for update
2026-09-04 06:57:10 [info] [updater] Version changed since last launch: 1.44121.4 → 1.46388.1
2026-09-04 06:57:12 [info] [sessions-bridge] Reconnecting persisted session cse_
2026-09-04 06:57:13 [info] [sessions-bridge] Session cse_ reconnected successfully
2026-09-04 06:57:12 [info] [WarmLifecycle:session] Starting idle timeout for local_: 900s
```
First idle timeout after the relaunch — no "Skipping pause" this time:
```
2026-09-04 07:12:13 [info] [WarmLifecycle:session] Idle timeout reached, disconnecting local_
2026-09-04 07:12:13 [info] [CCD] Pausing session local_ (idle_timeout)
```
**It is deterministic.** Every `Pausing session … (idle_timeout)` in the whole log follows a stealth update by ~15 min, and there are none at any other time:
| stealth update | pause | session |
|----------------------|----------|----------------|
| 2026-09-02 01:13:50 | 01:29:03 | local_ |
| 2026-09-02 16:24:37 | 16:39:50 | local_ |
| 2026-09-02 23:35:24 | 23:50:37 | local_ |
| 2026-09-03 08:46:12 | 09:01:26 | local_ |
| 2026-09-04 06:56:59 | 07:12:13 | local_ |
**Also:** resuming the paused session in the app afterwards (2026-09-04 09:07:03) did not re-enable Remote Control. The log shows `[rcAutoEnable] verdict: enable=true source=explicit_pref` only on a send (`trigger=first_turn` / `warm_send` / `cold_resume`), so a session that was paused while Remote Control was active comes back without it until the user sends a turn from the desktop — which is precisely what they cannot do from the phone.
### What Should Happen?
After a stealth-update relaunch, sessions that had Remote Control active keep the idle-pause hold (or get Remote Control re-enabled), and resuming a session honours "Enable remote control by default".
### Error Messages/Logs
No error is logged. The pause is recorded as an ordinary idle timeout — the only difference from the healthy case is the missing `Skipping pause … remote control is active (explicit bridge)` line after the relaunch (see excerpts above).
### Steps to Reproduce
1. On macOS, start a local Code-tab session in the Claude desktop app with Remote Control on; drive it from the Claude mobile app; leave it idle.
2. Let the app stage an update and perform its stealth update (`[stealth-update] Triggering stealth update after idle timeout` → relaunch).
3. About 15 minutes after the relaunch, observe `[CCD] Pausing session … (idle_timeout)` in `main.log`. The session is gone from the phone; the app never logged "Skipping pause" again after the relaunch.
### Claude Model
claude-fable-5-1 (not model-related)
### Is this a regression?
Unknown — first observed 2026-09-02; reproduced on every stealth update since (5/5).
### Claude Code Version
2.1.260, bundled in Claude desktop app 1.46388.1 (the previous app build 1.44121.4 showed the same behaviour)
### Platform
Anthropic API (claude.ai subscription)
### Operating System
macOS (Darwin 25.6.0), Apple Silicon
### Terminal/Shell
Claude desktop app (Code tab); sessions driven from the Claude iOS app via Remote Control
### Additional Information
**Environment**
- Claude desktop app for macOS, stealth-updated 1.44121.4 → 1.46388.1; bundled Claude Code 2.1.260
- macOS (Darwin 25.6.0), Apple Silicon Mac. Machine awake throughout (caffeinate assertion held), wired network unchanged
- "Enable remote control by default" on (`ccRemoteControlDefaultEnabled: true`); session driven from the Claude iOS app
**Control case:** A session spawned on the same machine by the CLI server (`claude remote-control --spawn worktree`) at 04:59 survived the same relaunch and is still connected.
Guide de contribution
Aucun guide de contribution indexé pour ce dépôt
Piste de recherche
Start by tracing the desktop lifecycle entries named in main.log: stealth-update, beforeQuitForUpdate, sessions-bridge, WarmLifecycle:session, CCD, and rcAutoEnable. Reproduce a relaunch with Remote Control enabled and verify that the persisted session retains its idle-pause hold after relaunch, that resume honors the default setting, and that no desktop action is needed to restore the phone connection.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- ios, macos
- Domaine
- desktop, mobile
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- Active
- Clarté
- Plutôt claire
- Accessibilité débutants
- 48/100