Preflight Checklist
What's Wrong?
VS Code/Cursor extension: UI wedges after a settings.json config reconciliation; agent keeps running but /usage, Show Logs, and all input become unresponsive
Summary
In the VS Code/Cursor extension, the UI stops responding to all user interaction — /usage, Claude Code: Show Logs, typing a new message — while the underlying agent keeps running autonomously (it continues to process background-task completions and advances the session transcript). Recovery requires reloading/cycling the window.
The extension's own debug output channel (Claude VSCode.log, with /debug enabled) shows the last thing the extension ever logged was a permission-rule reconciliation triggered by a change to ~/.claude/settings.json. After that line it emits nothing further — including failing to log a background-task-completion wake-up that the CLI transcript proves happened ~5 minutes later.
Observed vs expected
- Observed: UI dead (
/usage, Show Logs, new input all unresponsive), while the agent silently continues its plan in the background. The user has no way to see progress or regain control except cycling the window. Because Show Logs is itself a UI→extension command, the user cannot open the debug log of the very extension that's wedged — the log is only recoverable by reading the file on disk.
- Expected: UI stays responsive; or if the extension's event pump dies, it should surface an error / auto-recover rather than silently continue running the agent headless.
Suspected root cause
The freeze coincides exactly with a settings/permission config reconciliation (Detected change to settings.json → "Replacing all … rules" → "Applying permission update"). The extension survived ~7 minutes of the background Bash without issue, then wedged on the very next thing it did: reconciling permission rules after a settings.json change. This points at the config-watch / permission-reconciliation path (possibly interacting with an in-flight background task and/or the settings.local.json "broken symlink or missing file" condition noted one line earlier), not at background-Bash launch itself.
Note: the extension already carries [Stall] instrumentation and emits Slow permission decision: 2342ms around permission classification — this hang may be an unbounded version of the same stall class.
Repro (hypothesized — not yet reduced to a minimal case)
- In Cursor, run a self-paced agent plan where each step launches a
run_in_background Bash and ends the turn (so the session advances only via background-completion wake-ups).
- While a background task is in flight, cause a
~/.claude/settings.json (or .claude/settings.local.json) change that triggers a permission-rule reconciliation.
- Observe: UI stops responding; agent keeps advancing the transcript; extension output channel goes silent after the reconciliation log lines.
Artifacts available on request
- Full
Claude VSCode.log (debug-enabled) for the wedged window.
- The corresponding session transcript showing agent activity continuing past the extension's last log line.
- Both are timestamp-aligned around the
11:12:18 freeze point.
What Should Happen?
What should happen?
The extension UI should stay responsive, or fail loudly. Specifically:
- A settings.json / permission-rule reconciliation must not be able to wedge
the extension's event loop — it should complete (or error) without blocking
the UI thread.
- If the extension's event pump to the CLI does die, the extension should
surface an error and/or auto-recover, not silently keep the agent running
headless while /usage, "Show Logs", and new input are all dead.
- The user should never end up with an agent that is still executing its plan
(launching background tasks, editing files, rebasing) with no way to see it
or intervene short of reloading the window.
Error Messages/Logs
## Environment
- Extension: `anthropic.claude-code` **2.1.215** (`cc_version=2.1.215.c5e; cc_entrypoint=claude-vscode`)
- Host: **Cursor 3.12.17** (Electron)
- OS: **macOS 26.5.2 (25F84), arm64**
- Permission mode: `auto` (classifier `claude-sonnet-5[1m]`); main-loop model `claude-fable-5`
- Session was driving a long, self-paced plan: each step launches a **background Bash** (`run_in_background`) and ends its turn, relying on the background-completion wake-up to continue.
## What happened (timeline from the extension output channel)
Session had launched a long background Bash (a ~15-min test run) and correctly ended its turn:
11:05:05.372 [Stall] tool_dispatch_start tool=Bash toolUseId=... (background run spawned)
11:05:05.374 [Stall] tool_dispatch_end tool=Bash outcome=ok durationMs=3
11:05:10.907 Stream started - received first chunk (agent streams "run is going", turn ends)
--- ~7 minutes idle, waiting on the background task (expected) ---
11:12:18.937 [DEBUG] Detected change to /Users/<user>/.claude/settings.json
11:12:18.939 [DEBUG] Broken symlink or missing file encountered for settings.json at path: <project>/.claude/settings.local.json
11:12:18.941 [DEBUG] Replacing all allow rules for destination 'userSettings' with 9 rule(s): [...]
11:12:18.941 [DEBUG] Replacing all allow rules for destination 'projectSettings' with 35 rule(s): [...]
11:12:18.941 [DEBUG] Ignoring dangerous permission Bash(node:*) from .../.claude/settings.json (bypasses classifier)
11:12:18.941 [DEBUG] Applying permission update: Removing 1 allow rule(s) from source 'userSettings': ["Bash(node:*)"]
11:12:18.943 [DEBUG] Applying permission update: Removing 1 allow rule(s) from source 'projectSettings': ["Bash(node --check:*)"]
<<< LAST LINE THE EXTENSION EVER WROTE >>>
The extension emitted **nothing** after `11:12:18.943` (verified: zero log lines matching `T11:1[6-9]:`). It was silent for 19+ minutes until the window was cycled.
**Crucially, the CLI/agent kept working.** The session transcript (`<session>.jsonl`, written by the CLI) shows, after the freeze point:
11:17:43 background task completed -> agent re-invoked
11:17:48 agent greps the run summary
11:18:04 agent runs a multi-repo git rebase
11:18:17 agent updates its todo list
11:18:21 agent launches the NEXT background Bash
11:18:29 agent streams a status message
None of this appears in the extension log. So the agent processed the **11:17:43 background-completion wake-up** and several more tool calls, while the extension had already gone dark at **11:12:18**.
Steps to Reproduce
Environment
- Extension:
anthropic.claude-code 2.1.215 (cc_version=2.1.215.c5e; cc_entrypoint=claude-vscode)
- Host: Cursor 3.12.17 (Electron)
- OS: macOS 26.5.2 (25F84), arm64
- Permission mode:
auto (classifier claude-sonnet-5[1m]); main-loop model claude-fable-5
- Session was driving a long, self-paced plan: each step launches a background Bash (
run_in_background) and ends its turn, relying on the background-completion wake-up to continue.
What happened (timeline from the extension output channel)
Session had launched a long background Bash (a ~15-min test run) and correctly ended its turn:
11:05:05.372 [Stall] tool_dispatch_start tool=Bash toolUseId=... (background run spawned)
11:05:05.374 [Stall] tool_dispatch_end tool=Bash outcome=ok durationMs=3
11:05:10.907 Stream started - received first chunk (agent streams "run is going", turn ends)
--- ~7 minutes idle, waiting on the background task (expected) ---
11:12:18.937 [DEBUG] Detected change to /Users/<user>/.claude/settings.json
11:12:18.939 [DEBUG] Broken symlink or missing file encountered for settings.json at path: <project>/.claude/settings.local.json
11:12:18.941 [DEBUG] Replacing all allow rules for destination 'userSettings' with 9 rule(s): [...]
11:12:18.941 [DEBUG] Replacing all allow rules for destination 'projectSettings' with 35 rule(s): [...]
11:12:18.941 [DEBUG] Ignoring dangerous permission Bash(node:*) from .../.claude/settings.json (bypasses classifier)
11:12:18.941 [DEBUG] Applying permission update: Removing 1 allow rule(s) from source 'userSettings': ["Bash(node:*)"]
11:12:18.943 [DEBUG] Applying permission update: Removing 1 allow rule(s) from source 'projectSettings': ["Bash(node --check:*)"]
<<< LAST LINE THE EXTENSION EVER WROTE >>>
The extension emitted nothing after 11:12:18.943 (verified: zero log lines matching T11:1[6-9]:). It was silent for 19+ minutes until the window was cycled.
Crucially, the CLI/agent kept working. The session transcript (<session>.jsonl, written by the CLI) shows, after the freeze point:
11:17:43 background task completed -> agent re-invoked
11:17:48 agent greps the run summary
11:18:04 agent runs a multi-repo git rebase
11:18:17 agent updates its todo list
11:18:21 agent launches the NEXT background Bash
11:18:29 agent streams a status message
None of this appears in the extension log. So the agent processed the 11:17:43 background-completion wake-up and several more tool calls, while the extension had already gone dark at 11:12:18.
Claude Model
Other
Is this a regression?
Yes, this worked in a previous version
Last Working Version
No response
Claude Code Version
2.1.216 (Claude Code)
Platform
Other
Operating System
macOS
Terminal/Shell
Other
Additional Information
THis is all from Cursor running the VS Code extension.
You can reach me for more details if needed.
Preflight Checklist
What's Wrong?
VS Code/Cursor extension: UI wedges after a settings.json config reconciliation; agent keeps running but
/usage, Show Logs, and all input become unresponsiveSummary
In the VS Code/Cursor extension, the UI stops responding to all user interaction —
/usage,Claude Code: Show Logs, typing a new message — while the underlying agent keeps running autonomously (it continues to process background-task completions and advances the session transcript). Recovery requires reloading/cycling the window.The extension's own debug output channel (
Claude VSCode.log, with/debugenabled) shows the last thing the extension ever logged was a permission-rule reconciliation triggered by a change to~/.claude/settings.json. After that line it emits nothing further — including failing to log a background-task-completion wake-up that the CLI transcript proves happened ~5 minutes later.Observed vs expected
/usage,Show Logs, new input all unresponsive), while the agent silently continues its plan in the background. The user has no way to see progress or regain control except cycling the window. BecauseShow Logsis itself a UI→extension command, the user cannot open the debug log of the very extension that's wedged — the log is only recoverable by reading the file on disk.Suspected root cause
The freeze coincides exactly with a settings/permission config reconciliation (
Detected change to settings.json→ "Replacing all … rules" → "Applying permission update"). The extension survived ~7 minutes of the background Bash without issue, then wedged on the very next thing it did: reconciling permission rules after asettings.jsonchange. This points at the config-watch / permission-reconciliation path (possibly interacting with an in-flight background task and/or thesettings.local.json"broken symlink or missing file" condition noted one line earlier), not at background-Bash launch itself.Note: the extension already carries
[Stall]instrumentation and emitsSlow permission decision: 2342msaround permission classification — this hang may be an unbounded version of the same stall class.Repro (hypothesized — not yet reduced to a minimal case)
run_in_backgroundBash and ends the turn (so the session advances only via background-completion wake-ups).~/.claude/settings.json(or.claude/settings.local.json) change that triggers a permission-rule reconciliation.Artifacts available on request
Claude VSCode.log(debug-enabled) for the wedged window.11:12:18freeze point.What Should Happen?
What should happen?
The extension UI should stay responsive, or fail loudly. Specifically:
the extension's event loop — it should complete (or error) without blocking
the UI thread.
surface an error and/or auto-recover, not silently keep the agent running
headless while /usage, "Show Logs", and new input are all dead.
(launching background tasks, editing files, rebasing) with no way to see it
or intervene short of reloading the window.
Error Messages/Logs
Steps to Reproduce
Environment
anthropic.claude-code2.1.215 (cc_version=2.1.215.c5e; cc_entrypoint=claude-vscode)auto(classifierclaude-sonnet-5[1m]); main-loop modelclaude-fable-5run_in_background) and ends its turn, relying on the background-completion wake-up to continue.What happened (timeline from the extension output channel)
Session had launched a long background Bash (a ~15-min test run) and correctly ended its turn:
The extension emitted nothing after
11:12:18.943(verified: zero log lines matchingT11:1[6-9]:). It was silent for 19+ minutes until the window was cycled.Crucially, the CLI/agent kept working. The session transcript (
<session>.jsonl, written by the CLI) shows, after the freeze point:None of this appears in the extension log. So the agent processed the 11:17:43 background-completion wake-up and several more tool calls, while the extension had already gone dark at 11:12:18.
Claude Model
Other
Is this a regression?
Yes, this worked in a previous version
Last Working Version
No response
Claude Code Version
2.1.216 (Claude Code)
Platform
Other
Operating System
macOS
Terminal/Shell
Other
Additional Information
THis is all from Cursor running the VS Code extension.
You can reach me for more details if needed.