All Bash tool calls execute asynchronously with no opt-out (v2.1.x)

Resolved 💬 2 comments Opened Apr 11, 2026 by TTPerotti Closed May 24, 2026

Description

Starting with Claude Code 2.1.x, all Bash tool calls execute asynchronously (background mode) regardless of whether run_in_background is set. There is no way to opt out of this behavior via settings.

Environment

  • Version: 2.1.101
  • OS: Linux (Ubuntu, ThinkPad)
  • Install method: npm via Linuxbrew Node (/home/linuxbrew/.linuxbrew/bin/npm)

Behavior

Every Bash tool call returns a background task ID instead of blocking for output:

Command running in background with ID: bXXXXX. Output is being written to: /tmp/claude-1000/.../tasks/bXXXXX.output

This happens even for trivial commands like echo "test" && date where run_in_background was NOT requested.

Impact

  1. Massive latency: Simple commands like git reset HEAD~1 (which takes milliseconds) appeared to run for 3+ minutes in the task runner before the completion notification arrived.
  2. Broken workflow: Results arrive as async notifications requiring a separate file read, instead of inline. This makes iterative shell work very slow.
  3. Cannot be disabled: remote-settings.json repeatedly resets to {"channelsEnabled": true} on every startup, overriding any local edit.

What was tried

  • Setting channelsEnabled: false in ~/.claude/settings.json — no effect
  • Editing remote-settings.json to false — reverts on restart
  • Making remote-settings.json read-only — async behavior persists regardless
  • Disabling voiceEnabled — no effect
  • Downgrading to 2.1.98 via npm — auto-updater immediately reverts to 2.1.101
  • Uninstalling JetBrains PyCharm Claude plugin — no effect

Expected behavior

Bash tool calls without run_in_background: true should block and return output inline, as in Claude Code 2.0.x.

Notes

The remote-settings.json file (at ~/.claude/remote-settings.json) appears to be written by the server/infrastructure layer on every startup and cannot be overridden by local user settings. The channelsEnabled schema description says "Default off. Set true to allow" — but it is being forced on without user consent.

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗