# Claude Code v2.1.120

> Claude Code v2.1.120, released 24 Apr 2026 (2026-04-24). 27 entries read out of the shipped bundle. Unofficial, and not affiliated with Anthropic.

Web version: https://changelogs.core-directive.com/v/2.1.120

This release introduces a condensed "lean prompt" system for reduced token usage on capable models, a new `claude ultrareview` CLI command for cloud-hosted code reviews, interactive daemon service installation prompts, a memory write confirmation dialog, and expanded Windows PowerShell support. It also adds the `tabs_close_mcp` Chrome extension tool, a `hideVimModeIndicator` setting for custom status lines, and several improvements to how deny rules, autocompact notifications, and explore agent descriptions are handled.

## Changes

### `claude ultrareview` CLI Subcommand

**What**

Run a cloud-hosted multi-agent code review directly from the command line, without entering an interactive session.

**Usage**

`claude ultrareview # review current branch claude ultrareview 42 # review PR #42 claude ultrareview main # review against a base branch claude ultrareview --json # print raw bugs.json payload claude ultrareview --timeout 45 # wait up to 45 minutes (default: 30)` **Details** - Launches a remote multi-agent session that finds and verifies bugs in your branch - Prints live progress (found, verified, refuted counts) to stderr while waiting - Outputs formatted findings with file paths, line numbers, and severity (🔴 normal, 🟡 nit, 🟣 pre-existing) - Ctrl-C cancels the wait but leaves the remote review running — a URL is printed so you can view it in the browser - The `/ultrareview` slash command existed previously; this adds it as a top-level CLI entry point **Evidence** CLI command registered via `.command("ultrareview [target]")` with `.description("Run a cloud-hosted multi-agent code review...")` — search for `"ultrareview [target]"`

### Lean Prompt Mode (Condensed Tool Descriptions)

**What**

A new prompt optimization mode that significantly reduces system prompt token usage by sending shorter, denser tool descriptions to capable models.

**Usage**

`CLAUDE_CODE_LEAN_PROMPT=1 claude # force enable via env var` **Details** - When active, tool descriptions for Grep, Glob, WebFetch, Write, Edit, WebSearch, TodoWrite, Bash, and the Task/Explore agent are replaced with much shorter versions - Example: the Grep tool description goes from a multi-paragraph usage guide to a compact 4-line summary - The Explore agent description is refined to emphasize it is a "read-only search agent" not suitable for code review or cross-file analysis - Activated by the `CLAUDE_CODE_LEAN_PROMPT` environment variable, or gradually rolled out via the `tengu_vellum_lantern` feature flag - Currently limited to Opus 4.6+ and Opus 4.7 models **Evidence** Lean prompt gate function checks `CLAUDE_CODE_LEAN_PROMPT` and `tengu_vellum_lantern` — search for `"CLAUDE_CODE_LEAN_PROMPT"`

- Flag `tengu_vellum_lantern`: Off in both readings (read for one account on one subscription tier against v2.1.120; this account: off, anonymous baseline: off, compiled default: no gate table built for this version) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.

### Memory Write Confirmation Dialog

**What**

When Claude writes or edits a memory file, a confirmation dialog now appears showing what was saved, with the option to approve or reject the change.

**Details**

- Shows "Memory written" or "Memory updated" with a preview of the content (or a one-sentence AI-generated summary for large memories)
- For edits, displays a diff view; for new memories, displays the body text
- Auto-hides after a configurable timeout (default 8 seconds) with a countdown indicator
- Rejecting a memory write undoes the file change (restores the previous content or deletes the file)
- The summary is generated by Sonnet 4.6 for memories exceeding a line threshold (default: 5 lines)
- Controlled by the `tengu_slate_siskin` feature flag (disabled by default)

**Evidence**

Memory write survey infrastructure with approve/reject dialog — search for `"memoryWriteSurvey"` and `"tengu_slate_siskin"`

- Flag `tengu_slate_siskin`: Not enough to say (read for one account on one subscription tier against v2.1.120; this account: no value returned, anonymous baseline: no value returned, compiled default: no gate table built for this version) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.

### `memory-types` Skill

**What**

A new internal skill that provides a full reference for the memory type taxonomy — what each type captures, when to save it, and how to structure the body.

**Details**

- Not user-invocable directly; Claude uses it automatically before writing a memory file when lean prompts are active
- Enabled when `tengu_ochre_finch` flag is active or `CLAUDE_CODE_LEAN_PROMPT` is set
- Replaces the longer inline memory documentation in the system prompt with a shorter summary plus a skill reference
- The system prompt now lists memory types as a compact bulleted list and says "Invoke the `memory-types` skill for scope, body structure and examples"

**Evidence**

Skill registered as `"memory-types"` with `userInvocable: !1` — search for `"memory-types"`

### Daemon Cold-Start Service Installation Prompt

**What**

When no background daemon is running and one is needed, Claude Code now interactively asks whether to install it as a persistent system service.

**Usage**

`No background daemon is running. Installing it as a service keeps scheduled and remote-control workers running across reboot. Install as a service now? [Y/n/never, or 'once' for this login session]` **Details** - `Y` (default): installs a launchd (macOS) or systemd (Linux) service that persists across reboot - `once`: spawns a transient daemon for the current login session only - `never`: remembers the dismissal and won't ask again (spawns transient) - `n`: does nothing — the command fails with the original "no daemon running" error - Controlled by the `tengu_quiet_harbor` feature flag (determines whether mode is "ask" or "transient") - Also configurable via `CLAUDE_CODE_DAEMON_COLD_START` environment variable or `settings.daemonColdStart` - The daemon auto-uninstalls stale service files that were not created by the current version (tagged with `claude-managed: v1`) **Evidence** Interactive prompt with `"Install as a service now? [Y/n/never, or 'once' for this login session]"` — search for that string, gated by `tengu_quiet_harbor`

- Flag `tengu_quiet_harbor`: Off in both readings (read for one account on one subscription tier against v2.1.120; this account: off, anonymous baseline: off, compiled default: no gate table built for this version) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.

### Chrome Extension: `tabs_close_mcp` Tool

**What**

A new MCP tool that lets Claude close individual tabs in the Chrome tab group by ID.

**Details**

- Only tabs in the current session's tab group are closable
- Call `tabs_context_mcp` first to get valid tab IDs
- If you close the group's last tab, Chrome auto-removes the group — the next `tabs_context_mcp` with `createIfEmpty` starts fresh
- Replaces the previous `update_plan` tool that was used in the Chrome extension's plan-approval flow

**Evidence**

Tool registered as `"tabs_close_mcp"` with title `"Tabs Close"` — search for `"tabs_close_mcp"`

### User Deny Rules Awareness in System Prompt

**What**

Claude is now informed about the user's configured permission deny rules and instructed to block circumvention attempts.

**Details**

- The system prompt now includes a section listing all active deny rules
- Claude is instructed to block actions that achieve the same effect via a different tool — e.g., using `python -c`, `sed -i`, `cat >`, heredocs, or similar to write a file that an Edit/Write deny rule covers
- Only non-internal deny rules are surfaced (rules starting with a specific internal prefix are filtered out)

**Evidence**

New function builds deny rule text: `"User Deny Rules: The user has configured these permission deny rules..."` — search for `"User Deny Rules"`

### `hideVimModeIndicator` Status Line Setting

**What**

A new boolean setting to suppress the built-in `-- INSERT --` / `-- VISUAL --` vim mode indicator below the prompt.

Usage (in settings):

`{ "statusLine": { "hideVimModeIndicator": true } }` **Details** - Use this when your custom status line script already renders `vim.mode` itself - Prevents duplicate mode indicators when using a custom status line **Evidence** New setting `hideVimModeIndicator` with `.describe("Hide the built-in...")` — search for `"hideVimModeIndicator"`

### `CLAUDE_EFFORT` System Prompt Substitution

**What**

A new `${CLAUDE_EFFORT}` template variable is now available in system prompts, dynamically resolved from the session's effort setting.

**Details**

- The variable is interpolated during session initialization
- Allows system prompts to adapt behavior based on the current effort level

**Evidence**

Template variable `${CLAUDE_EFFORT}` appears in system prompt processing — search for `"CLAUDE_EFFORT"`

### Renamed "Bash Mode" to "Shell Mode"

The `!` prefix hint has been renamed from "bash mode" to "shell mode" to reflect the broader shell support now available (bash, zsh, sh, and PowerShell on Windows).

**Evidence**

String changed from `"! for bash mode"` to `"! for shell mode"` — search for `"! for shell mode"`

### Expanded Windows PowerShell Integration

PowerShell support on Windows has been improved with smarter shell selection and better error handling:

- Shell selection now falls back gracefully: if `defaultShell` is set to "bash" but Git Bash isn't installed, PowerShell is used instead, and vice versa
- The shell setting description now reads "Defaults to bash (powershell on Windows without Git Bash)"
- Clipboard operations on Windows now use proper argument arrays instead of concatenated strings for safer command execution
- Clear error messages guide users when neither Git Bash nor PowerShell is available:
- "Claude Code on Windows requires either Git for Windows (for bash) or PowerShell"
- Hook errors now suggest "Install Git for Windows, or add `shell: powershell` to this hook's config"

**Evidence**

Shell fallback logic in `g24()` function — search for `"Git Bash not found"` and `"CLAUDE_CODE_USE_POWERSHELL_TOOL"`

### Improved Scroll Wheel Notification

The scroll wheel arrow-key detection now suggests a simpler fix. The notification has been changed from "run /terminal-setup to fix" to "use PgUp/PgDn to scroll", removing the need for users to run a separate command.

**Evidence**

String changed from `"run /terminal-setup to fix"` to `"use PgUp/PgDn to scroll"` — search for `"PgUp/PgDn to scroll"`

### Improved Autocompact Notification

The autocompact notification has been refined:

- Message changed from `"compacted at the auto window (N tokens)"` to `"compacting at the auto N window · configure with /autocompact"`
- Notification priority changed from "medium" to "immediate" for better visibility
- Now uses the "suggestion" color theme and a 12-second timeout

**Evidence**

Notification text updated — search for `"compacting at the auto"` and `"configure with /autocompact"`

### Better Exit/Detach Labels for Remote Sessions

When running as a background/remote session with active tasks, the Escape exit message now shows "detach (session keeps running)" instead of "stop session", making it clearer that background work continues after detaching.

**Evidence**

Dynamic label logic — search for `"detach (session keeps running)"` and `"stop session"`

### Richer Tool-Call Labels in Status Display

AskUserQuestion prompts and Plan-mode submissions now show descriptive labels in the status display:

- Questions show the header/question text (e.g., "Question: Which library?" or "Tap to answer")
- Plan submissions show "Plan ready for review"

**Evidence**

Label rendering logic — search for `"Tap to answer"` and `"Plan ready for review"`

### Hidden Message Count in Focused Mode

When messages are hidden due to `/focus` mode, the prompt now displays a count like "3 messages hidden (/focus to show)" to help users know when context has been abbreviated.

**Evidence**

New label format — search for `"hidden (/focus to show)"`

### Graceful Marketplace Plugin Degradation

Plugins with unrecognized source types are now stubbed rather than dropped entirely:

- If a marketplace plugin entry uses a source type not supported by the current Claude Code version, it is preserved as an "unsupported" placeholder
- Installation attempts fail with a clear "update Claude Code and try again" message
- This prevents `detectDelistedPlugins` from incorrectly treating it as removed

**Evidence**

Plugin stubbing logic — search for `"Stubbing unparseable marketplace plugin entry"` and `"source.source: 'unsupported'"`

### Daemon CLI Enhancements

The `claude daemon` subcommand has been reorganized with new operations:

- New `hub` subcommand for interactive daemon management (requires TTY)
- New `list` subcommand for a flat view across all worker kinds
- New `scheduled`, `assistant`, `remote-control` subcommands for per-kind listing and mutation
- `start` and `restart` subcommands are now explicitly disabled with a clear message: "the daemon runs on demand and exits when the last client disconnects"
- `stop --any` can now stop transient (non-service) daemons
- Better status output including `pid`, `version`, `uptime`, `origin`, and `config` path
- Auto-uninstalls stale service files from previous Claude Code versions

**Evidence**

Help text registered as `"Usage: claude daemon [subcommand] [options]..."` — search for that string

### Improved Explore Agent Description

The Explore (search) agent description has been rewritten to be more precise about its limitations: it is now described as a "read-only search agent" that should NOT be used for "code review, design-doc auditing, cross-file consistency checks, or open-ended analysis" since it "reads excerpts rather than whole files and will miss content past its read window."

**Evidence**

New description string — search for `"read-only search agent"`

### Feedback Submission Now Tracks Surface Origin

The `/feedback` submission now records the `surface` field (e.g., "cli") to distinguish reports from different Claude Code surfaces (terminal, CCD, CCW). This helps the triage pipeline route reports correctly.

**Evidence**

`surface` parameter in feedback payload — search for `"Where the feedback flow was initiated"`

### File Watcher Error Handling

Multiple subsystems now log warnings on file watcher errors instead of crashing:

- `[settings] watcher error:` for settings file changes
- `[skills] watcher error:` for skill file changes
- `[theme] watcher error:` for theme file changes
- `[jobStateNameSync] watcher error:` for job state changes
- `[useBgSessionPr] watcher error:` for background session PR changes
- `FileChanged: watcher error:` for general file change detection

**Evidence**

Search for `"watcher error:"` in the string diff

### Agent Auto-Relaunch Tracking

A new `CLAUDE_AGENTS_AUTO_RELAUNCHED_AT` environment variable is set when an agent is automatically relaunched, allowing detection and prevention of relaunch loops.

**Evidence**

New env var — search for `"CLAUDE_AGENTS_AUTO_RELAUNCHED_AT"`

### Username Validation

The `getUsername()` function now validates the system username against a safe regex pattern and falls back to `"claude-code-user"` if it contains unexpected characters, preventing potential issues with unusual usernames.

**Evidence**

Username validation with regex test — function `xe()` at line ~104573

## Bug Fixes

- Fixed Chrome extension `ToolCallTimeoutError` and `ExtensionDisconnectedMidCallError` — new error types provide more specific messaging when the Chrome extension disconnects mid-operation or times out (search for `"ExtensionDisconnectedMidCallError"`)
- Fixed daemon stop on Windows: the error message now correctly advises using `taskkill /PID` instead of attempting signals that Windows doesn't support (search for `"taskkill /PID"`)
- Fixed worktree cleanup handling: uncommitted changes in agent worktrees are now preserved with a warning rather than silently lost (search for `"changed file(s) would be lost, kept"`)
- Fixed autocompact thrashing detection: the thrashing message now properly triggers on repeated rapid re-compactions (search for `"Autocompact is thrashing"`)
- Fixed auth token refresh: proactive token refresh failures are now logged and retried with a 60-second delay instead of failing silently (search for `"auth: proactive refresh failed"`)
- Fixed plan-mode blocking: the `post_turn_summary` now correctly maps `"blocked"` status to `"need_input"` for plan mode flows (search for `"status_category"`)

### Lean Prompt System [Gradual Rollout]

**What**

The full lean prompt system that compresses all tool descriptions and system prompt content for reduced token usage.

**Status**

Feature-flagged behind `tengu_vellum_lantern` (default false), overridable with `CLAUDE_CODE_LEAN_PROMPT=1`.

**Details**

- Currently restricted to Opus 4.6+ and Opus 4.7 models
- The `tengu_ochre_finch` flag controls lean memory prompts independently
- When fully enabled, tool descriptions are 60-80% shorter while preserving essential usage information
- Users can preview it now via the environment variable

- Flag `tengu_vellum_lantern`: Off in both readings (read for one account on one subscription tier against v2.1.120; this account: off, anonymous baseline: off, compiled default: no gate table built for this version) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.

### Memory Write Confirmation [Gradual Rollout]

**What**

The interactive approve/reject dialog for memory file writes.

**Status**

Feature-flagged behind `tengu_slate_siskin` (default false), with configurable timeout, throttle, and summary threshold.

**Details**

- Full UI infrastructure is in place including diff rendering, AI-powered summaries, and undo capability
- Configurable via the feature flag's schema: `enabled`, `timeoutMs` (1000-120000), `throttleMs` (0-3600000), `summaryLineThreshold` (1-50)
- When enabled, every memory write surfaces a brief confirmation with countdown timer

- Flag `tengu_slate_siskin`: Not enough to say (read for one account on one subscription tier against v2.1.120; this account: no value returned, anonymous baseline: no value returned, compiled default: no gate table built for this version) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.

### Daemon Service Cold-Start Prompt [Gradual Rollout]

**What**

Interactive prompt to install the daemon as a persistent system service.

**Status**

Feature-flagged behind `tengu_quiet_harbor` (default false — defaults to "transient" mode where daemon spawns on demand without asking).

**Details**

- When the flag is enabled (set to return `"ask"`), the interactive installation prompt appears
- Can be forced via `CLAUDE_CODE_DAEMON_COLD_START=ask` environment variable or `settings.daemonColdStart`

- Flag `tengu_quiet_harbor`: Off in both readings (read for one account on one subscription tier against v2.1.120; this account: off, anonymous baseline: off, compiled default: no gate table built for this version) These values were read against a different version of Claude Code, so treat them as the nearest reading available instead of one taken on this release.
