# Claude Code v2.1.252

> Claude Code v2.1.252, released 31 Aug 2026 (2026-08-31). 23 entries read out of the shipped bundle. Unofficial, and not affiliated with Anthropic.

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

Four features sit in this build without a way to reach them yet. A new "instructionFiles" context channel exists behind the carved-slate flag, part of a static system-prompt rework, and stays off by default. Claude may eventually be told to use a per-session scratchpad directory for temp files instead of /tmp, and the groundwork for announcing that location alongside platform and shell info is already wired in. A new appendSubagentSystemPrompt option is threaded through session and agent config, letting a subagent's system-prompt append diverge from the main session's once exposed.

Claude Code now diffs CLAUDE.md and tool-description context incrementally, resending only changed instruction files each turn instead of the whole block, which cuts token spend. The session context refresh message now states why your context was refreshed, such as after compaction or a settings sync, and handles the empty-state case cleanly. The poll-event queue enforces a hard cap of 1000 pending events and rejects reserved event kinds by default.

Task notifications are now truncated to 100,000 characters before being queued, instead of growing unbounded. Pinned-tmpdir write-target verification on macOS is hardened against symlink aliasing tricks, with new recovery guidance surfaced when it trips. Task output swap refusal errors now carry a "To recover" hint, and task-output pinning errors on macOS explain how to recover while tolerating aliased directories that previously triggered false alarms.

## What probably matters to you

Anything you can use today, anything that visibly changes, and anything worth poking at. One line each, open for detail.

### New "instructionFiles" context channel, gated behind carved-slate flag

A separate instruction-files context channel exists but is off by default, part of a static system prompt rework.

The per-session context builder (`vJt`) now returns a separate `instructionFiles` field alongside `memoryFiles`, tracked via new `userContextInstructionFiles` state and a new accessor `j2e`. This path only runs when the `Ml()` gate returns true, gated by `CLAUDE_CODE_CARVED_SLATE` or the `tengu_carved_slate` remote flag (default off), as part of an in-progress "static system prompt" rework that keeps CLAUDE.md/instructions as stable, always-present blocks.

- Flag `tengu_carved_slate`: Off in both readings (read for one account on one subscription tier against v2.1.252; this account: off, anonymous baseline: off, compiled default: not a boolean we can read)
- Area: System Prompt
- Names: `CLAUDE_CODE_CARVED_SLATE`
- Tier: Nothing to try yet
- Useful: 2/5
- Signal: 4/5
- Present in the build but not switched on

### New 'scratchpad directory' context-change announcement

A new scratchpad directory location can now be announced to Claude alongside platform and shell info.

Context-change messages sent to the model now support a `scratchpadDirectory` case, announcing the location of a scratchpad directory or, if it becomes unavailable, telling the model it 'is no longer available; use it no further.' This also appears in the initial environment info block alongside Platform, Shell, and OS Version.

- Area: Scratchpad
- Tier: Nothing to try yet
- Useful: 2/5
- Signal: 3/5
- Present in the build but not switched on

### New appendSubagentSystemPrompt option threaded through session/agent config

A new appendSubagentSystemPrompt option lets a subagent's system-prompt append differ from the main session's.

Agent and session configuration now accepts a new `appendSubagentSystemPrompt` option, passed alongside the existing `appendSystemPrompt`. This lets a subagent-specific system-prompt append be configured separately from the append used for the main session.

- Area: Subagents
- Names: `appendSubagentSystemPrompt`
- Tier: Nothing to try yet
- Useful: 2/5
- Signal: 3/5
- Present in the build but not switched on

### Scratchpad directory: a new per-session temp-file location announced to the model

Claude may soon be told to use a per-session scratchpad directory for temp files instead of /tmp.

A new `scratchpadDirectory` field has been added to the environment-context schema alongside `workingDirectory`, `platform`, and `shell`. When present, the system prompt gains a line: 'Scratchpad directory: — always use it for temporary files... instead of `/tmp`'. There's a corresponding removal notice, 'The scratchpad directory announced earlier is no longer available; use it no further.' The directory itself is computed as `<tmpdir>/<sessionId>/scratchpad`.

- Flag `tengu_scratch`: Off in both readings (read for one account on one subscription tier against v2.1.252; this account: off, anonymous baseline: off, compiled default: on)
- Flag `tengu_carved_slate`: Off in both readings (read for one account on one subscription tier against v2.1.252; this account: off, anonymous baseline: off, compiled default: not a boolean we can read)
- Area: Scratchpad
- Tier: Nothing to try yet
- Useful: 2/5
- Signal: 3/5
- Present in the build but not switched on

## Improvements

### Incremental CLAUDE.md / tool-description context diffing ('instructions' attachments)

Claude Code now only re-sends changed CLAUDE.md/instruction files instead of the whole block each turn, saving tokens.

New machinery (`RTt`, `PTt`, `dEt`, `pEt`, `yjt`) diffs the currently-announced set of CLAUDE.md/instruction files against what was last sent, emitting a smaller 'instructions' attachment describing only what changed plus a list of removed files, instead of re-sending the full instructions block every turn. Messages include lines like 'Instruction files were re-read ...; these differ from their earlier copies' and 'Instructions no longer present: ...'.

A companion 'prompt_snapshot' attachment type records the exact system prompt and tool descriptions sent, reused via `Use()`/`BUn()` so unchanged tool descriptions don't need to be recomputed or re-sent (`recordedDescription` passed into `dA`/`oie`).

- Flag `tengu_carved_slate`: Off in both readings (read for one account on one subscription tier against v2.1.252; this account: off, anonymous baseline: off, compiled default: not a boolean we can read)
- Area: Context Management
- Tier: You'll notice
- Useful: 3/5
- Signal: 3/5

### Session context refresh message now states the reason and handles empty state

Claude now explains why your session context was refreshed, like after compaction or a settings sync.

The system message injected when session context (`userEmail`, `attachedProject`, `gitStatus`, `perforceMode`) changes now states the specific reason it was regenerated, such as "after the conversation was compacted", "after the organization's managed settings changed", "after a working directory was added", "after settings were synced onto this machine", "after the account changed", or "when this session started" — replacing the previous generic "The session context has changed; these values replace the earlier ones". If none of the context fields are present anymore, Claude Code now emits an explicit notice that the previously announced values no longer apply, instead of emitting nothing.

- Area: Session Context
- Tier: You'll notice
- Useful: 3/5
- Signal: 1/5

### Poll-event queue depth cap enforced at 1000 events

Poll-event queue now hard-caps at 1000 pending events and rejects reserved event kinds by default.

The poll-event queue now enforces a hard cap of 1000 pending events; once reached, further poll events are rejected with a `poll_event_delivery`/`queue_cap` telemetry event and an error. Poll events whose `kind` falls in a reserved set are also rejected unless `allowReservedKind` is `true`.

- Area: Elsewhere
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

## Bug Fixes

### Task-notification payloads now hard-capped in length before being queued

Very long task notifications are now truncated to 100,000 characters instead of growing unbounded.

Pending notifications of mode `task-notification` are now truncated to a fixed cap of 100,000 characters before being pushed onto the notification queue, with a warning logged when truncation occurs.

- Area: Elsewhere
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Hardened pinned-tmpdir write-target verification on macOS, with new recovery guidance

macOS path verification for task output is now more robust against symlink aliasing tricks.

On macOS, resolving a write target against the pinned tasks directory is now more robust: a new check walks up each segment of the resolved path, confirms it's a directory, and compares device/inode against the pinned file descriptor to verify the path is a safe, link-free alias of the pinned directory. Refusals are now logged at warn level, and failures during task-output swaps include actionable recovery text.

- Area: Task Output
- Tier: You'll notice
- Useful: 2/5
- Signal: 1/5

### Task output pinning gains recovery guidance and macOS alias tolerance

Task-output errors on macOS now explain how to recover and avoid false alarms from aliased directories.

When task-output directory pinning detects that the tasks directory has moved or is a symlink, the error now includes concrete recovery steps instead of a bare message. A new helper `Lt` also lets macOS treat a directory as the 'same' target when it resolves to the same device/inode via realpath, reducing false-positive refusals caused by macOS aliasing.

- Area: Task Output
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Task output swap refusal errors now carry a 'To recover' hint

Task output swap error messages now include a recovery hint when available.

The internal `task output swap refused` error now appends a 'To recover' hint when one is supplied by the caller, in addition to naming the reason for the refusal.

- Area: Task Output
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

## Internal Changes

### Context/cost breakdown now counts tool descriptions from a recorded prompt snapshot

Context/cost breakdowns like /context now reuse the exact tool description text actually sent, for accuracy.

The token-counting helpers for MCP tools, built-in tools, skills, and slash commands (`dA`, formerly `TA`) now accept a `recordedDescription` map sourced from the last prompt snapshot, so re-analysis of context usage (e.g. `/context`) reuses the exact tool description text actually sent to the model instead of recomputing it.

- Flag `tengu_carved_slate`: Off in both readings (read for one account on one subscription tier against v2.1.252; this account: off, anonymous baseline: off, compiled default: not a boolean we can read)
- Area: Elsewhere
- Names: `/context`
- Tier: Under the hood
- Useful: 2/5
- Signal: 2/5

### System-context instructions filtering keyed on tengu_paper_halyard, now per-item rather than category-wide

Internal rewrite of how instruction files get filtered from context, no visible change.

The instructions-block builder was rewritten into `z9n`/`qge`/`clr`/`oFe`. The filtering logic that drops Project/Local instructions files, keyed on the `tengu_paper_halyard` flag, is now expressed as a per-file predicate `clr` rather than a single top-of-function early skip, composing with new diffing/removed-file tracking.

- Flag `tengu_paper_halyard`: Not enough to say (read for one account on one subscription tier against v2.1.252; this account: no value returned, anonymous baseline: no value returned, compiled default: on)
- Area: System Prompt
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### appendSubagentSystemPrompt threaded into more system-prompt construction call sites

Internal plumbing now threads a subagent-specific system prompt option through more call sites.

The internal helper that builds messages/tool-permission context for a session now also receives and forwards an `appendSubagentSystemPrompt` option alongside the existing `customSystemPrompt` and `appendSystemPrompt`, in the call that builds the session's tool permission context and original messages.

- Area: Elsewhere
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### User context (memory) refresh now carries a reason, with new instruction-files tracking

Internal memory-refresh function now records why it was invalidated and tracks instruction files too.

The internal function that clears/refreshes a session's cached user context (previously `H0`) now takes a `refreshReason` argument recording why the context was invalidated: `session_start`, `compaction`, `policy_refresh`, `directory_added`, `settings_sync`, or `account_change`, shown via human-readable strings like "after the conversation was compacted" or "after the organization's managed settings changed". A new `userContextInstructionFiles` field is tracked alongside the existing `userContextMemoryFiles`.

- Area: Session Context
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### New "instructions" and "prompt_snapshot" attachment/system-prompt-section types

Two new internal message types for instructions and prompt snapshots are excluded from history search.

Two new attachment/message types, "instructions" and "prompt_snapshot", were added to several allowlists/exclusion-lists used when building the conversation for the model and when computing embeddings, alongside existing types like "session_context" and "date". Both are filtered out of the message list used for similarity/history search.

- Area: Elsewhere
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### Tool description can now be overridden by a recorded description

Tool definitions can now be overridden by a previously recorded description instead of the live one.

When building a tool definition for the model, a tool's `recordedDescription`, if present, is now used in place of its live description. This allows a previously-recorded tool description to be reused instead of what the tool currently reports.

- Area: Elsewhere
- Tier: Under the hood
- Useful: 1/5
- Signal: 2/5

### New telemetry event for bridge session persistence write failures

Bridge session write failures now get logged and reported via telemetry instead of failing silently.

The remote-control/bridge session-persistence path now catches failures writing internal events and reports a `tengu_session_persistence_failed` telemetry event along with a `[bridge:repl] Internal event write failed` log line, instead of letting the write fail silently or crash.

- Area: Elsewhere
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### New reason codes for session-context re-reads

New internal reason codes back the session-context refresh messages.

A new set of reason codes for re-reading session context was added: `session_start`, `compaction`, `policy_refresh`, `directory_added`, `settings_sync`, and `account_change`, each mapping to a human-readable phrase used in the session-context refresh message.

- Area: Session Context
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Scratchpad directory tracked in environment-change diffs and telemetry schema

The scratchpad directory is now tracked in environment-change diffs and telemetry like other environment fields.

The environment-info object and its diff/change-detection logic gained a `scratchpadDirectory` field, and the schema for environment snapshots now includes an optional `scratchpadDirectory`, so changes to it are reported like other environment fields such as cwd, git repo, and worktree.

- Flag `tengu_carved_slate`: Off in both readings (read for one account on one subscription tier against v2.1.252; this account: off, anonymous baseline: off, compiled default: not a boolean we can read)
- Flag `tengu_scratch`: Off in both readings (read for one account on one subscription tier against v2.1.252; this account: off, anonymous baseline: off, compiled default: on)
- Area: Scratchpad
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### claudeMd now explicitly emitted as empty string under carved-slate mode

Under an experimental mode, empty CLAUDE.md content is now sent as an explicit empty string to keep prompt caching stable.

Under carved-slate mode, context blocks with no CLAUDE.md content now emit `claudeMd: ""` explicitly instead of omitting the key, keeping the block structure stable for prompt caching.

- Flag `tengu_carved_slate`: Off in both readings (read for one account on one subscription tier against v2.1.252; this account: off, anonymous baseline: off, compiled default: not a boolean we can read)
- Area: System Prompt
- Tier: Under the hood
- Useful: 1/5
- Signal: 1/5

### Poll-event queue depth cap / reserved-kind rejection renamed/refactored

Internal rename of poll-event queue functions with no behavior change.

The poll-event delivery path still enforces a queue depth cap and rejects reserved event kinds unless `allowReservedKind` is set, but the underlying function was renamed from `Sn` to `bn` and its reserved-kind check switched from `e8e` to `o8e`; behavior otherwise appears unchanged.

- Area: Elsewhere
- Tier: Under the hood
- Useful: 1/5
- Signal: 0/5

### Version bump to 2.1.252

Version bumped to 2.1.252 with no functional changes.

Version bumped to 2.1.252 (VERSION, BUILD_TIME, GIT_SHA metadata only; no functional changes in this group).

- Area: Elsewhere
- Tier: Under the hood
- Useful: 1/5
- Signal: 0/5
