Skip to content

[BUG] VS Code/Cursor extension: UI wedges after a settings.json config reconciliation; agent keeps running but /usage, Show Logs, and input become unresponsive #79747

Description

@brian-jones-grindwork

Preflight Checklist

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

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)

  1. 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).
  2. While a background task is in flight, cause a ~/.claude/settings.json (or .claude/settings.local.json) change that triggers a permission-rule reconciliation.
  3. 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:

  1. 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.
  2. 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.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions