Claude Desktop (macOS): main process hard-wedges when free RAM is low; WarmLifecycle keeps spawning session children with no memory backpressure
Environment
- Claude Desktop 1.25927.0 (all freezes below; machine has since auto-updated to 1.26832.0)
- Bundled Claude Code CLI 2.1.221
- macOS Darwin 25.5.0, Apple Silicon, 48 GB RAM
- Heavy multi-session use: several concurrent Code sessions + scheduled tasks + claude.ai connectors (9 remote MCP servers / 68 tools per session) + 5 local desktop extensions
Symptom
The app stops accepting chat input entirely; the whole UI is unresponsive and only force-quit works. This happened ~6 times on 2026-08-06 and twice on 2026-08-08. No crash reports are generated (nothing crashes — the main process stalls).
Evidence from ~/Library/Logs/Claude/main.log
The main process logs [ScheduledTasks] lines every 60 s, so log silence >150 s indicates the Electron main process stopped executing (not just a renderer). Confirmed silent gaps, with the last [process-memory] reading before each:
| Date | Silence | tree_rss_sum | children | sys_free_raw |
|---|---|---|---|---|
| 08-06 | 5.5 min | ~4.7 GB | 25 | 616–706 MB |
| 08-06 | 33.1 min | 4.6 GB | 20 | ~1.4 GB falling |
| 08-06 | 3.5 min | 5.2 GB | 24 | 706 MB |
| 08-08 | 4.5 min | 8.7 GB | 52 | 1020 MB |
| 08-08 | 4.0 min | 5.2 GB | 27 | 1092 MB |
Every freeze occurred with sys_free_raw ≈ 0.6–1.1 GB. (Note sys_free — which includes reclaimable cache — stayed at 11–28 GB throughout; it is not the operative number.)
The immediate trigger in each case was session lifecycle work at that floor:
11:15:02 [WarmLifecycle:preview] Warming up session local_6bab6417-…
11:15:09 Sending message to session local_6bab6417-…
11:15:17 [process-memory] … sys_free_raw=1092MB
11:15:19 [CCD] LocalSessions.setFocusedSession: sessionId=null
[ 4.0 minutes of total log silence — user force-quits ]
and on 08-06:
13:15:47 [CCD] Warming session local_a97cdd68-… (sys_free_raw ≈ 1.4 GB and falling)
[ 33.1 minutes of silence ]
Analysis
- Each warm session holds a ~500 MB CLI child plus local MCP server processes. Children accumulated to 52 (5.4 GB) on 08-08;
electron_mainitself was at 1285 MB RSS. - Archiving a session does not release its child:
LocalSessions.archiveis immediately followed by[WarmLifecycle:session] Starting idle timeout: 900s— the child stays warm 15–30 min after explicit archive. WarmLifecyclewarms new sessions even whensys_free_rawis ~1 GB — the subsystem that logs the memory number applies no backpressure from it.- When macOS starts aggressive reclaim at that floor, the (very large) main process pages and its event loop stalls minutes at a time → user force-quits.
Requests
- Backpressure: don't warm additional sessions (and start shedding idle warm children) when
sys_free_rawdrops below a threshold. - Release the CLI child on explicit archive, or expose a "close session now" that does.
- Expose warm-pool size / idle-timeout as settings (none exist in the bundle today).
- Consider trimming
electron_mainRSS growth (1.3 GB after a morning of use).
Also observed (separate, minor)
- With the Claude browser extension installed in two Chromium browsers (Chrome + Comet), the bridge rejects tool calls with
Multiple Chrome extensions connected — target_device_id required(674 log occurrences) whileensureConnectedreportsconnected=true— sessions bind to a dead browser connection. [ScheduledTasks]looks for task files at~/Claude/Scheduled/<name>/SKILL.mdwhile the scheduler MCP keeps them at~/.claude/scheduled-tasks/<name>/SKILL.md, producing ENOENT warn-spam every 60 s for ~40 tasks that exist and fire correctly.
---
🤖 Drafted with Claude Code from local main.log forensics; filed by the account owner.