# Claude Code v2.1.172

> Claude Code v2.1.172, released 10 Jun 2026 (2026-06-10). 22 entries read out of the shipped bundle. Unofficial, and not affiliated with Anthropic.

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

Version 2.1.172 ships the Artifact tool — a new capability letting Claude publish HTML and Markdown files to private claude.ai web pages — alongside improved ultra (cloud review) error messages that guide users through auth requirements. The release also renames "Remote Control" status labels to `/rc`, improves Chrome browser tool loading instructions to emphasize batching, and overhauled the team memory prompt with a clearer two-step save process.

## New Features

### Artifact Tool

**What**

Claude can now render an HTML or Markdown file to a private, shareable web page hosted on claude.ai. The resulting URL can be shared with teammates.

**Usage**

`Artifact(file_path="report.html", favicon="📊") Artifact(file_path="notes.md", favicon="📝", label="v2")` **Details** - Accepts `.html`, `.htm`, and `.md` files; Markdown is converted to styled HTML automatically - The `favicon` parameter (required) sets the browser-tab emoji icon — use one or two emoji, no markup - The optional `label` parameter provides a human-readable version label shown in the version picker - The optional `url` parameter lets Claude redeploy to an existing artifact URL the user provides - A strict CSP blocks all external resources — inline all CSS/JS and embed assets as data: URIs - Same file path → same URL on redeploy; different file path → new URL - Controlled by the `CLAUDE_CODE_DISABLE_ARTIFACT` environment variable and the `disableArtifact` setting - Gated by feature flag `tengu_cobalt_plinth`; enabled for eligible claude.ai accounts **Evidence** Artifact tool implementation (search for `"Render an HTML or Markdown file to an Artifact"` and `uAH = "Artifact"`)

- Flag `tengu_cobalt_plinth`: On for this account, and not off by default (read for one account on one subscription tier against v2.1.172; this account: on, anonymous baseline: on, compiled default: on) 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.

### --plugin-dir-no-mcp Flag

**What**

A new `--plugin-dir-no-mcp` flag that loads a plugin directory without also reading its `.mcp.json` file. Useful when the SDK host already owns and manages the plugin's MCP connections.

**Usage**

`claude --plugin-dir-no-mcp <path>` **Details** - Behaves exactly like `--plugin-dir` except the engine skips `.mcp.json` / `mcpServers` discovery for that plugin - Equivalent behavior is also available as a setting: `noMcp: true` in the plugin frontmatter - Intended for SDK hosts that register MCP servers themselves rather than delegating to the engine **Evidence** New flag definition and help text (search for `"Like --plugin-dir but the engine will not read this plugin's .mcp.json"`)

### Ultra (Cloud Review) — Improved Auth Error Messages

**What**

When ultra (cloud review) is unavailable, Claude Code now surfaces specific, actionable error messages depending on the exact auth state rather than a single generic message.

**Details**

- API key auth → "ultra (cloud review) requires claude.ai account auth. Unset ANTHROPIC_API_KEY … to use ultra."
- Missing profile scope → "ultra (cloud review) requires a full-scope login token — run `claude auth login` to use it"
- Not yet in rollout → "ultra (cloud review) isn't enabled for your account yet — run `claude auth login` to refresh your entitlements"
- Unauthenticated entirely → "ultra (cloud review) requires a claude.ai account — sign in to claude.ai to use it"
- All error messages include a link to `https://code.claude.com/docs/en/ultrareview`

**Evidence**

Error routing function (search for `"ultra (cloud review) requires claude.ai account auth"`)

### URL Provenance Check for web_fetch

**What**

`web_fetch` now enforces a provenance check — it can only retrieve URLs that appeared in a user message or a prior `web_fetch` result. Attempts to fetch URLs outside this set present a permission prompt asking the user to approve.

**Details**

- If the user approves, the fetch proceeds; if denied or timed out, Claude receives an error
- Timeout message: "The permission request for this URL was not answered in time. Ask the user to approve the fetch or include the URL in a message, then try again."
- The error type is `PROVENANCE_REQUIRED`
- Suppressed in bypassPermissions and dontAsk modes

**Evidence**

Provenance enforcement and prompt (search for `"URL not in provenance set. web_fetch can only retrieve URLs that appeared in a user message"`)

### /memories/export Route

**What**

A new internal `/memories/export` route has been registered, enabling memory export functionality.

**Evidence**

New constant (search for `"/memories/export"`)

### ShowOnboardingRolePicker Tool (Cowork)

**What**

A new internal tool for Cowork onboarding that renders an interactive role-picker chip row. Users can tap a chip (e.g. "Legal", "Engineering") to select their role and trigger automatic plugin installation.

**Details**

- Blocks until the user responds: chip click, free-form text entry, or dismissal
- Returns `{"role": "..."}` on selection, `{"dismissed": true}` on cancel, `{}` on confirm-without-role
- Only enabled in Cowork sessions; not available in normal conversations
- Gated via `KOf` (Cowork environment check)

**Evidence**

Tool definition (search for `"Render a clickable role-picker chip row during Cowork onboarding"`)

### CLAUDE_CODE_CHILD_SESSION Environment Variable

**What**

A new `CLAUDE_CODE_CHILD_SESSION` environment variable that marks a session as a child session, suppressing certain persistence behaviors (e.g. session data is not persisted when this is set alongside other child-session conditions).

**Evidence**

New env var check (search for `"CLAUDE_CODE_CHILD_SESSION"`)

### CLAUDE_CODE_SKIP_PLUGIN_MCP_SERVERS

**What**

A new environment variable that, when set, skips MCP server discovery for plugin directories during startup.

**Evidence**

Log message (search for `"CLAUDE_CODE_SKIP_PLUGIN_MCP_SERVERS is set"`)

## Improvements

### Remote Control Status Labels Renamed to /rc

**What**

The status-bar labels for the Remote Control / remote session feature have been shortened from "Remote Control active / connecting / failed / reconnecting" to `/rc active`, `/rc connecting…`, `/rc failed`, `/rc reconnecting`.

**Evidence**

Status label function (search for `"/rc active"` and `"/rc failed"`)

### Chrome Browser Tools: Batch ToolSearch Loading

**What**

The Chrome browser automation system prompt now explicitly instructs Claude to load all needed tools in a single `ToolSearch` call using a comma-separated `select:` query, rather than one call per tool.

**Details**

- New guidance: "Do NOT load tools one at a time; each separate ToolSearch call wastes a full round-trip"
- The recommended starter set covers `tabs_context_mcp`, `navigate`, `computer`, `read_page`, and `tabs_create_mcp` in one call
- Task-specific extras (recording, forms, console debugging) should be added to that same call when the task obviously needs them

**Evidence**

Updated browser automation prompt (search for `"batch every tool you expect to need into ONE ToolSearch call"`)

### Team Memory: Two-Step Save Process Instructions

**What**

The team memory system prompt has been overhauled with clearer, step-by-step guidance for saving memories. When using indexed memory, the instructions now explicitly describe a two-step process (write the memory file, then add a pointer to the index).

**Details**

- Step 1: Write memory to its own file using the frontmatter format
- Step 2: Add a pointer entry (`- [Title](file.md) — one-line hook`) to the index file
- Index entries are capped at ~150 characters
- Clarified that team memory directories already exist — no need to run `mkdir`
- Read-only sessions now receive: "If the user asks you to remember something, explain that memory is read-only in this session."

**Evidence**

New team memory prompt builder (search for `"**Step 1** — write the memory to its own file in"`)

### AWS Region Display Shows Configuration Source

**What**

The AWS region display in Bedrock configuration now shows where the region came from — environment variable, AWS shared config file, or the built-in default — rather than just the region name.

**Details**

- `us-east-1` (from environment) → shown as-is
- From `~/.aws/config` → shown as `us-east-1 (from AWS config)`
- Default fallback → shown as `us-east-1 (default — set AWS_REGION or add a region to your AWS config)`

**Evidence**

Region source display function (search for `"(from AWS config)"` and `"(default — set AWS_REGION or add a region to your AWS config)"`)

### --bg / --pool Conflict Error Message Improved

**What**

The error shown when combining `--bg` with another backend flag now distinguishes between `--pool` and `--cloud`.

**Details**

- Using `--bg` with `--pool`: "Use `claude -p '<task>' --pool <pool_id>` directly to start a session on the pool."
- Using `--bg` with `--cloud`: "Use `claude --cloud '<task>'` directly to start a cloud session."

**Evidence**

Updated error message function (search for `"--bg and --pool are different backends"`)

### "Help improve our AI models" Renamed

**What**

The consent UI string "Help improve Claude" has been renamed to "Help improve our AI models" across all display states (ON, OFF, OFF for domain emails).

**Evidence**

String changes (search for `"Help improve our AI models"` — previously `"Help improve Claude"`)

### Plugin Disuse Tracking

**What**

Claude Code now tracks the last time each plugin was used (`lastUsedAt` and `lastUsedNumStartups`). This data enables the tip system to surface a warning when a plugin hasn't been used in a while.

**Details**

- Tip shown: "You haven't used the [plugin] in a while. It still adds startup and context cost — review it with…"
- Tracks both calendar days and session count since last use

**Evidence**

Plugin usage tracking functions (search for `"plugin in a while. It still adds startup and context cost"`)

### MCP OAuth Token Clearing: Preserve Client Registration

**What**

When clearing MCP OAuth tokens, Claude Code can now optionally preserve the client registration (client ID) while discarding only the access/refresh tokens. This avoids a full re-registration flow when tokens simply need refreshing.

**Details**

- When `preserveClientRegistration: true` is passed, only `accessToken`, `refreshToken`, `expiresAt`, and `scope` are cleared
- Log message: "Cleared stored tokens (preserved client registration)"

**Evidence**

Updated token-clear function (search for `"Cleared stored tokens (preserved client registration)"`)

### Fullscreen Feedback Prompt Simplified

**What**

The fullscreen mode exit survey prompt has been simplified. The old prompt included the parenthetical "(optional, Enter to skip)"; the new prompt is more direct.

**Evidence**

String change (old: `"To help us make fullscreen mode better, what made you switch back? (optional, Enter to skip)"` → new: `"To help us make fullscreen mode better, what made you switch back?"`)

### Structured Output Retraction Error Messages

**What**

When a model fallback causes structured output to be retracted and no retry succeeds, Claude Code now surfaces a more specific error message instead of the previous "the cloud agent called StructuredOutput but every attempt failed schema validation."

New message: "the cloud agent called StructuredOutput but no attempt produced a surviving valid output (failed schema validation, or retracted by a model fallback)"

**Evidence**

Updated error string (search for `"retracted by a model fallback and no retry produced a valid result"`)

### Subagent Model Allowlist Warning Improved

**What**

When a subagent is configured with a model that is not in the `availableModels` allowlist, the warning message now distinguishes between inheriting the parent model vs. using the default teammate model.

**Details**

- Subagent case: "Subagent model `X` is not in the availableModels allowlist; inheriting the parent model instead"
- Teammate case: "Teammate model `X` is not in the availableModels allowlist; using the default teammate model instead"

**Evidence**

New warning functions (search for `"Subagent model"` and `"Teammate model"` with allowlist messages)

### Trusted Device Error Message Centralized

**What**

The "not enrolled as a trusted device" error message is now generated from a single function, ensuring consistent text: "this device is not enrolled as a trusted device; run /login to enroll".

**Evidence**

Centralized message function (search for `"this device is not enrolled as a trusted device; run /login to enroll"`)

### Session Status Update Timestamps

**What**

When a session's status changes, a separate `statusUpdatedAt` timestamp is now recorded alongside the general `updatedAt` timestamp, enabling more precise tracking of status transition times.

**Evidence**

Updated session state function (search for `"statusUpdatedAt"` alongside `"updatedAt"`)

## Bug Fixes

- Deep-link injection guard: `--handle-uri` invocations with extra arguments after the URI are now rejected with an explanatory message, blocking URI-based argument injection. (search for `"claude: rejected deep-link invocation — unexpected arguments after the URI"`)

- Artifact upload precondition retry: Uploading an artifact now detects HTTP 412 (create-only precondition failed) and returns a clear message: "upload 412: this version was already written (create-only precondition). Re-run publish to mint a fresh version." (search for `"this version was already written (create-only precondition)"`)

- Transcript third-party marker filtering: When sharing session history, transcripts containing third-party markers are now silently excluded rather than included verbatim. The raw transcript and recent sessions lists are independently filtered. (search for `"rawTranscriptJsonl withheld from session history: contains_3p_transcript_markers"`)

- Model `[1m]` suffix handling made case-insensitive: Functions that strip or normalize the `[1m]` model suffix now use case-insensitive matching (`/\[1m\]/i`), preventing edge cases where mixed-case suffixes were not recognized. (search for `"/\\[1m\\]/i"`)

- Interactive command detection message updated: The message shown when a command appears blocked on an interactive prompt now says "Stop this task" instead of "Kill this task", matching the updated UI terminology. (search for `"The command is likely blocked on an interactive prompt. Stop this task"`)

- tmux session cleanup label corrected: The worktree cleanup option now reads "Keep worktree, end tmux session" instead of the previous "Keep worktree, kill tmux session". (search for `"Keep worktree, end tmux session"`)
