2.1.83 untested · changelog-derived

Claude Code 2.1.83

`managed-settings.d/` drop-in directory for policy fragments. This matters because it decouples multi-team policy authoring from a single `managed-settings.json` file — teams can now deploy, update, or remove their own fragments independently without merge conflicts, which is the enabling primitive for org-scale Claude Code governance.

16 new primitives 3 workflow recipes 61 fixes

New primitives

managed-settings.d/setting

Drop-in directory alongside `managed-settings.json`, letting separate teams deploy independent policy fragments that merge alphabetically

Added `managed-settings.d/` drop-in directory alongside `managed-settings.json`, letting separate teams deploy independent policy fragments that merge alphabetically
CwdChanged hook eventhook

Fires when the working directory changes, enabling reactive environment management (e.g., direnv)

Added `CwdChanged` and `FileChanged` hook events for reactive environment management (e.g., direnv)
FileChanged hook eventhook

Fires when a tracked file changes, enabling reactive environment management

Added `CwdChanged` and `FileChanged` hook events for reactive environment management (e.g., direnv)
sandbox.failIfUnavailablesetting

Exit with an error when sandbox is enabled but cannot start, instead of running unsandboxed

Added `sandbox.failIfUnavailable` setting to exit with an error when sandbox is enabled but cannot start, instead of running unsandboxed
disableDeepLinkRegistrationsetting

Prevent `claude-cli://` protocol handler registration

Added `disableDeepLinkRegistration` setting to prevent `claude-cli://` protocol handler registration
CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1env-var

Strip Anthropic and cloud provider credentials from subprocess environments (Bash tool, hooks, MCP stdio servers)

Added `CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1` to strip Anthropic and cloud provider credentials from subprocess environments (Bash tool, hooks, MCP stdio servers)
Transcript search (/ in Ctrl+O mode)capability

Press `/` in transcript mode to search, `n`/`N` to step through matches

Added transcript search — press `/` in transcript mode (`Ctrl+O`) to search, `n`/`N` to step through matches
Ctrl+X Ctrl+E keybindingflag

Alias for opening the external editor (readline-native binding; `Ctrl+G` still works)

Added `Ctrl+X Ctrl+E` as an alias for opening the external editor (readline-native binding; `Ctrl+G` still works)
[Image #N] chip on pastecapability

Pasted images insert a positional chip at the cursor so you can reference them by number in your prompt

Pasted images now insert an `[Image #N]` chip at the cursor so you can reference them positionally in your prompt
initialPrompt frontmattercapability

Agents can declare `initialPrompt` in frontmatter to auto-submit a first turn

Agents can now declare `initialPrompt` in frontmatter to auto-submit a first turn
chat:killAgents / chat:fastMode rebindablecapability

Both are now rebindable via `~/.claude/keybindings.json`

`chat:killAgents` and `chat:fastMode` are now rebindable via `~/.claude/keybindings.json`
CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACKenv-var

Disable the non-streaming fallback when streaming fails

Added `CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK` env var to disable the non-streaming fallback when streaming fails
Plugin manifest.userConfig / sensitive: truecapability

Plugins can prompt for configuration at enable time, with `sensitive: true` values stored in keychain (macOS) or protected credentials file

Plugin options (`manifest.userConfig`) now available externally — plugins can prompt for configuration at enable time, with `sensitive: true` values stored in keychain (macOS) or protected credentials file (other platforms)
Clipboard-pasted image on-disk path referencecapability

Claude can reference the on-disk path of clipboard-pasted images for file operations

Claude can now reference the on-disk path of clipboard-pasted images for file operations
Ctrl+L full redrawflag

Clears the screen and forces a full redraw — use to recover when Cmd+K leaves the UI partially blank

`Ctrl+L` now clears the screen and forces a full redraw — use this to recover when Cmd+K leaves the UI partially blank. Use `Ctrl+U` or double-Esc to clear prompt input.
[VSCode] /rewind pickercommand

Esc-twice or `/rewind` opens a keyboard-navigable rewind picker

[VSCode] Added Esc-twice (or `/rewind`) to open a keyboard-navigable rewind picker

Workflow recipes

Reactive Monorepo Environment Switcher
CwdChanged hook event + FileChanged hook event + CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1

CwdChanged fires when the agent navigates between packages in a monorepo; combined with FileChanged watching .envrc or package.json, a hook can automatically run direnv, reload tool configs, and scrub stale credentials from subprocess envs — making multi-package agentic sessions self-configuring rather than requiring the user to manually reset context.

Register a CwdChanged hook that runs direnv export json and injects the resulting vars into subsequent subprocess calls. Register a FileChanged hook on .envrc to re-export when the env definition changes. Set CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1 so the baseline subprocess env never carries over cloud credentials from the parent shell, letting the hook be the authoritative credential source per directory.

Self-Bootstrapping Agent with Credential-Safe Subprocess Isolation
initialPrompt frontmatter + CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1 + sandbox.failIfUnavailable

An agent that declares its own initialPrompt is fully self-contained — no wrapper script needed to seed it. Pairing that with CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1 ensures the agent's Bash tool and MCP stdio servers never inherit ambient credentials from the launch shell. Adding sandbox.failIfUnavailable: true prevents silent sandbox bypass, so the agent either runs in a known-safe environment or fails loudly rather than executing unsandboxed in CI.

Define a security-audit agent in a skill frontmatter with initialPrompt: "Begin audit of the repository. Report findings to stdout.". Set CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1 in the CI environment and sandbox.failIfUnavailable: true in managed-settings.json. The agent launches, auto-submits its first turn, and every subprocess it spawns is credential-clean and sandboxed — or the job fails before any mutation occurs.

Multi-Team Policy Layering with Per-Team Credential Isolation
managed-settings.d/ drop-in directory + Plugin manifest.userConfig / sensitive: true

managed-settings.d/ lets a platform team ship a baseline policy fragment while individual product teams overlay their own fragments without editing shared files. Plugin manifest.userConfig with sensitive: true lets each team's plugins prompt for their own secrets at enable time and store them in the OS keychain — so team-specific credentials never appear in any shared config fragment.

Platform team ships managed-settings.d/00-baseline.json with org-wide allowedTools and deniedMcpServers. Team A ships managed-settings.d/10-team-a.json with their approved MCP servers. Team A's plugin uses manifest.userConfig with sensitive: true to capture their API key at enable time, storing it in keychain. Each team's fragment merges alphabetically; credentials never appear in any JSON file checked into the policy repo.

Agentic relevance

The `initialPrompt` frontmatter capability removes the need for external orchestration to seed an agent's first turn, enabling fully self-contained agent definitions that auto-bootstrap. The `CwdChanged`/`FileChanged` hook events open a reactive event bus between the filesystem and Claude Code's hook system, allowing agents to detect environment transitions (e.g., entering a monorepo sub-package) and reconfigure without polling. The `CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1` env-var closes a credential-leak surface that affects every agentic pipeline that spawns subprocesses.

Hardening & fixes (61)

  • Fixed mouse tracking escape sequences leaking to shell prompt after exit
  • Fixed Claude Code hanging on exit on macOS
  • Fixed screen flashing blank after being idle for a few seconds
  • Fixed a hang when diffing very large files with few common lines — diffs now time out after 5 seconds and fall back gracefully
  • Fixed a 1–8 second UI freeze on startup when voice input was enabled, caused by eagerly loading the native audio module
  • Fixed a startup regression where Claude Code would wait ~3s for claude.ai MCP config fetch before proceeding
  • Fixed `--mcp-config` CLI flag bypassing `allowedMcpServers`/`deniedMcpServers` managed policy enforcement
  • Fixed claude.ai MCP connectors (Slack, Gmail, etc.) not being available in single-turn `--print` mode
  • Fixed `caffeinate` process not properly terminating when Claude Code exits, preventing Mac from sleeping
  • Fixed bash mode not activating when tab-accepting `!`-prefixed command suggestions
  • Fixed stale slash command selection showing wrong highlighted command after navigating suggestions
  • Fixed `/config` menu showing both the search cursor and list selection at the same time
  • Fixed background subagents becoming invisible after context compaction, which could cause duplicate agents to be spawned
  • Fixed background agent tasks staying stuck in "running" state when git or API calls hang during cleanup
  • Fixed `--channels` showing "Channels are not currently available" on first launch after upgrade
  • Fixed uninstalled plugin hooks continuing to fire until the next session
  • Fixed queued commands flickering during streaming responses
  • Fixed slash commands being sent to the model as text when submitted while a message is processing
  • Fixed scrollback jumping when collapsed read/search groups finish after scrolling offscreen
  • Fixed scrollback jumping to top when the model starts or stops thinking
  • Fixed SDK session history loss on resume caused by hook progress/attachment messages forking the parentUuid chain
  • Fixed copy-on-select not firing when you release the mouse outside the terminal window
  • Fixed ghost characters appearing in height-constrained lists when items overflow
  • Fixed `Ctrl+B` interfering with readline backward-char at an idle prompt
  • Fixed tool result files never being cleaned up, ignoring the `cleanupPeriodDays` setting
  • Fixed space key being swallowed for up to 3 seconds after releasing voice hold-to-talk
  • Fixed ALSA library errors corrupting the terminal UI when using voice mode on Linux without audio hardware (Docker, headless, WSL1)
  • Fixed voice mode SoX detection on Termux/Android where spawning `which` is kernel-restricted
  • Fixed Remote Control sessions showing as Idle in the web session list while actively running
  • Fixed footer navigation selecting an invisible Remote Control pill in config-driven mode
  • Fixed memory leak in remote sessions where tool use IDs accumulate indefinitely
  • Improved Bedrock SDK cold-start latency by overlapping profile fetch with other boot work
  • Improved `--resume` memory usage and startup latency on large sessions
  • Improved plugin startup — commands, skills, and agents now load from disk cache without re-fetching
  • Improved Remote Control session titles: AI-generated titles now appear within seconds of the first message
  • Improved `WebFetch` to identify as `Claude-User` so site operators can recognize and allowlist Claude Code traffic via `robots.txt`
  • Reduced `WebFetch` peak memory usage for large pages
  • Reduced scrollback resets in long sessions from once per turn to once per ~50 messages
  • Faster `claude -p` startup with unauthenticated HTTP/SSE MCP servers (~600ms saved)
  • Bash ghost-text suggestions now include just-submitted commands immediately
  • Increased non-streaming fallback token cap (21k → 64k) and timeout (120s → 300s local)
  • Interrupting a prompt before any response now automatically restores your input so you can edit and resubmit
  • `/status` now works while Claude is responding, instead of being queued until the turn finishes
  • Plugin MCP servers that duplicate an org-managed connector are now suppressed instead of running a second connection
  • Linux: respect `XDG_DATA_HOME` when registering the `claude-cli://` protocol handler
  • Changed "stop all background agents" keybinding from `Ctrl+F` to `Ctrl+X Ctrl+K`
  • Deprecated `TaskOutput` tool in favor of using `Read` on the background task's output file path
  • Memory: `MEMORY.md` index now truncates at 25KB as well as 200 lines
  • Disabled `AskUserQuestion` and plan-mode tools when `--channels` is active
  • `--bare -p` (SDK pattern) is ~14% faster to the API request
  • Fixed API 400 error when a pasted image was queued during a failing tool call
  • Fixed MCP tool calls hanging indefinitely when an SSE connection drops mid-call and exhausts its reconnection attempts
  • Fixed Remote Control session titles showing raw XML when a background agent completed before the first user message
  • Fixed remote sessions forgetting conversation history after a container restart
  • Fixed remote sessions requiring re-login on transient auth errors instead of retrying automatically
  • Fixed `rg ... | wc -l` and similar piped commands hanging and returning `0` in sandbox mode on Linux
  • Fixed voice input hold-to-talk not activating when a CJK IME inserts a full-width space
  • Fixed `--worktree` hanging silently when the worktree name contained a forward slash
  • [VSCode] Spinner now turns red with "Not responding" when the backend hasn't responded for 60 seconds
  • [VSCode] Fixed session history not loading correctly when reopening a session via URL or after restart
  • [VSCode] Fixed "Fork conversation from here" and rewind actions failing silently after the session cache goes stale

Raw changelog

## 2.1.83

- Added `managed-settings.d/` drop-in directory alongside `managed-settings.json`, letting separate teams deploy independent policy fragments that merge alphabetically
- Added `CwdChanged` and `FileChanged` hook events for reactive environment management (e.g., direnv)
- Added `sandbox.failIfUnavailable` setting to exit with an error when sandbox is enabled but cannot start, instead of running unsandboxed
- Added `disableDeepLinkRegistration` setting to prevent `claude-cli://` protocol handler registration
- Added `CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1` to strip Anthropic and cloud provider credentials from subprocess environments (Bash tool, hooks, MCP stdio servers)
- Added transcript search — press `/` in transcript mode (`Ctrl+O`) to search, `n`/`N` to step through matches
- Added `Ctrl+X Ctrl+E` as an alias for opening the external editor (readline-native binding; `Ctrl+G` still works)
- Pasted images now insert an `[Image #N]` chip at the cursor so you can reference them positionally in your prompt
- Agents can now declare `initialPrompt` in frontmatter to auto-submit a first turn
- `chat:killAgents` and `chat:fastMode` are now rebindable via `~/.claude/keybindings.json`
- Fixed mouse tracking escape sequences leaking to shell prompt after exit
- Fixed Claude Code hanging on exit on macOS
- Fixed screen flashing blank after being idle for a few seconds
- Fixed a hang when diffing very large files with few common lines — diffs now time out after 5 seconds and fall back gracefully
- Fixed a 1–8 second UI freeze on startup when voice input was enabled, caused by eagerly loading the native audio module
- Fixed a startup regression where Claude Code would wait ~3s for claude.ai MCP config fetch before proceeding
- Fixed `--mcp-config` CLI flag bypassing `allowedMcpServers`/`deniedMcpServers` managed policy enforcement
- Fixed claude.ai MCP connectors (Slack, Gmail, etc.) not being available in single-turn `--print` mode
- Fixed `caffeinate` process not properly terminating when Claude Code exits, preventing Mac from sleeping
- Fixed bash mode not activating when tab-accepting `!`-prefixed command suggestions
- Fixed stale slash command selection showing wrong highlighted command after navigating suggestions
- Fixed `/config` menu showing both the search cursor and list selection at the same time
- Fixed background subagents becoming invisible after context compaction, which could cause duplicate agents to be spawned
- Fixed background agent tasks staying stuck in "running" state when git or API calls hang during cleanup
- Fixed `--channels` showing "Channels are not currently available" on first launch after upgrade
- Fixed uninstalled plugin hooks continuing to fire until the next session
- Fixed queued commands flickering during streaming responses
- Fixed slash commands being sent to the model as text when submitted while a message is processing
- Fixed scrollback jumping when collapsed read/search groups finish after scrolling offscreen
- Fixed scrollback jumping to top when the model starts or stops thinking
- Fixed SDK session history loss on resume caused by hook progress/attachment messages forking the parentUuid chain
- Fixed copy-on-select not firing when you release the mouse outside the terminal window
- Fixed ghost characters appearing in height-constrained lists when items overflow
- Fixed `Ctrl+B` interfering with readline backward-char at an idle prompt — it now only fires when a foreground task can be backgrounded
- Fixed tool result files never being cleaned up, ignoring the `cleanupPeriodDays` setting
- Fixed space key being swallowed for up to 3 seconds after releasing voice hold-to-talk
- Fixed ALSA library errors corrupting the terminal UI when using voice mode on Linux without audio hardware (Docker, headless, WSL1)
- Fixed voice mode SoX detection on Termux/Android where spawning `which` is kernel-restricted
- Fixed Remote Control sessions showing as Idle in the web session list while actively running
- Fixed footer navigation selecting an invisible Remote Control pill in config-driven mode
- Fixed memory leak in remote sessions where tool use IDs accumulate indefinitely
- Improved Bedrock SDK cold-start latency by overlapping profile fetch with other boot work
- Improved `--resume` memory usage and startup latency on large sessions
- Improved plugin startup — commands, skills, and agents now load from disk cache without re-fetching
- Improved Remote Control session titles: AI-generated titles now appear within seconds of the first message
- Improved `WebFetch` to identify as `Claude-User` so site operators can recognize and allowlist Claude Code traffic via `robots.txt`
- Reduced `WebFetch` peak memory usage for large pages
- Reduced scrollback resets in long sessions from once per turn to once per ~50 messages
- Faster `claude -p` startup with unauthenticated HTTP/SSE MCP servers (~600ms saved)
- Bash ghost-text suggestions now include just-submitted commands immediately
- Increased non-streaming fallback token cap (21k → 64k) and timeout (120s → 300s local) so fallback requests are less likely to be truncated
- Interrupting a prompt before any response now automatically restores your input so you can edit and resubmit
- `/status` now works while Claude is responding, instead of being queued until the turn finishes
- Plugin MCP servers that duplicate an org-managed connector are now suppressed instead of running a second connection
- Linux: respect `XDG_DATA_HOME` when registering the `claude-cli://` protocol handler
- Changed "stop all background agents" keybinding from `Ctrl+F` to `Ctrl+X Ctrl+K` to stop shadowing readline forward-char
- Deprecated `TaskOutput` tool in favor of using `Read` on the background task's output file path
- Added `CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK` env var to disable the non-streaming fallback when streaming fails
- Plugin options (`manifest.userConfig`) now available externally — plugins can prompt for configuration at enable time, with `sensitive: true` values stored in keychain (macOS) or protected credentials file (other platforms)
- Claude can now reference the on-disk path of clipboard-pasted images for file operations
- `Ctrl+L` now clears the screen and forces a full redraw — use this to recover when Cmd+K leaves the UI partially blank. Use `Ctrl+U` or double-Esc to clear prompt input.
- `--bare -p` (SDK pattern) is ~14% faster to the API request
- Memory: `MEMORY.md` index now truncates at 25KB as well as 200 lines
- Disabled `AskUserQuestion` and plan-mode tools when `--channels` is active
- Fixed API 400 error when a pasted image was queued during a failing tool call
- Fixed MCP tool calls hanging indefinitely when an SSE connection drops mid-call and exhausts its reconnection attempts
- Fixed Remote Control session titles showing raw XML when a background agent completed before the first user message
- Fixed remote sessions forgetting conversation history after a container restart due to progress-message gaps in the resumed transcript chain
- Fixed remote sessions requiring re-login on transient auth errors instead of retrying automatically
- Fixed `rg ... | wc -l` and similar piped commands hanging and returning `0` in sandbox mode on Linux
- Fixed voice input hold-to-talk not activating when a CJK IME inserts a full-width space
- Fixed `--worktree` hanging silently when the worktree name contained a forward slash
- [VSCode] Spinner now turns red with "Not responding" when the backend hasn't responded for 60 seconds
- [VSCode] Fixed session history not loading correctly when reopening a session via URL or after restart
- [VSCode] Added Esc-twice (or `/rewind`) to open a keyboard-navigable rewind picker
- [VSCode] Fixed "Fork conversation from here" and rewind actions failing silently after the session cache goes stale