claudekit / updates / claude-code-2-1-269
[ PATCH · ]

Claude Code 2.1.269

`claude plugin eval` runs a plugin's eval suite against Claude Code and returns scored, reproducible results as a JSON and HTML report, and `/output-style [name]` lists and switches output styles, including over Remote Control and in cloud and other headless sessions. 18 improvements and changes cover the `/diff` panel opening fully rendered in one step, transcript updates in long sessions no longer re-processing the whole conversation, and prompt suggestion filtering for Japanese, Chinese and Korean text. 66 fixes cover the prompt cache being partially invalidated on the turn after a response was cut off at the output-token limit and automatically resumed, the keyboard regression in 2.1.247, a deny or ask rule starting with `!` applying beyond the settings source that wrote it, and `Edit()` deny rules not applying to the file a Bash `tee` command writes.

Official announcement →

This article is a summary based on official documentation.

What changed

Claude Code 2.1.269 shipped on September 11, 2026. It is mostly fixes (66 of them), in two distinct groups. One is the prompt cache: partial invalidation on the turn after a response was cut off at the output-token limit and automatically resumed, changed re-sending of earlier context after resuming a session interrupted mid-thought, and cache misses on a cloud session’s first request are all closed off. The other is permission rules: a deny or ask rule starting with ! applying beyond the settings source that wrote it, and Edit() deny rules and the write-path check not applying to the file a Bash tee command writes. The keyboard regression introduced in 2.1.247 (F1/F2/F4 in kitty-protocol terminals and more) is fixed too. Fourteen things are new, led by claude plugin eval and /output-style [name].

New features

  • claude plugin eval

    There was no standard way to check whether a plugin behaves as intended; authors ran scenarios by hand and judged for themselves. The command now runs a plugin’s eval suite against Claude Code and returns scored, reproducible results as a JSON and HTML report. See claude plugin eval --help.

  • /output-style [name]

    Listing and switching output styles needed an interactive terminal. The command now lists and switches them, including over Remote Control and in cloud and other headless sessions.

  • A diff of the files a Bash command changed (bashEditDiffEnabled)

    When the Bash tool handled file edits, the result did not show what changed. With this setting, a diff of the files the Bash command changed is added to the Bash tool result.

  • OTEL_METRICS_INCLUDE_REPOSITORY

    OpenTelemetry metrics and events could not be broken down per repository. This variable tags metrics and events with vcs.* repository attributes; with OTEL_LOG_TOOL_DETAILS, commit events also get vcs.ref.head.*.

  • CLAUDE_CODE_GATEWAY_MODEL_DISCOVERY_TIMEOUT_MS

    An LLM gateway that did not answer /v1/models within the default 3s yielded no model list. This variable extends the discovery timeout.

  • A spinner tip for /focus

    A view that strips the tool calls out of a turn existed, but was easy to miss. The spinner now suggests /focus, a view with just your prompt, a one-line work summary, and the response.

  • CLAUDE_CODE_WORKFLOW_MAX_CONCURRENT_AGENTS

    The Workflow tool’s per-run concurrent agent limit was fixed, which capped inference-bound fan-outs. This variable (1–256) raises that limit.

  • [VSCode] An agent map

    The state of a session’s sub-agents was hard to take in at a glance. The “N agents” footer pill now opens a map of the session’s sub-agents with per-agent cards, Stop agent, and read-only transcripts.

  • [VSCode] A Hooks dialog

    Viewing or editing hooks meant opening settings files. The command menu now has a Hooks dialog for viewing hooks and adding, editing, or removing them in user, project, and local settings; managed, plugin, and session hooks stay read-only.

  • [VSCode] Live progress rows for running subagents

    Focus view gave no sign that a subagent was running. Live progress rows for running subagents now appear under the tool-call groups in Focus view.

  • [VSCode] A Permission rules dialog

    Reviewing and editing permission rules meant handling settings files directly. The dialog lists permission rules and adds or removes them in user, project, and local settings; startup-option, session-only, and managed rules stay read-only.

  • [VSCode] A Cancel button on the Switch account screen

    There was no clean way out of the account switch screen. Cancel now returns to your session as the current account.

  • [Claude Code on the web] Taking back a queued message

    A message queued in a cloud session could not be pulled back, even before Claude read it. You can now remove it from the queue, or press Esc or Up, and the text returns to the message box.

  • [Claude Tag] A confirmation dialog before Connect all or Disconnect

    A misclick on Connect all or Disconnect on a GitHub installation in admin settings applied organization-wide immediately. A confirmation dialog now guards against accidental organization-wide changes.

Key improvements

UI & responsiveness

  • The /diff panel

    The panel showed a loading state before filling in. It now opens fully rendered in one step.

  • Responsiveness in long sessions

    Every transcript update re-processed the whole conversation to build the collapsed tool-use summaries. It no longer does.

  • Prompt suggestion filtering for Japanese, Chinese and Korean text

    Filtering worked poorly for languages written without spaces between words. Mixed-script and single-word suggestions are now kept, and meta or evaluative text is dropped as it is for English.

  • Keyboard support over SSH and in unrecognized terminals

    An unknown terminal meant a narrower set of shortcuts. Terminals that answer the kitty keyboard query (such as foot and Alacritty 0.16+) now get Shift+Enter and Ctrl+Shift shortcuts.

Tools & messages

  • The Skill tool’s “Unknown skill” error

    Calling a plugin skill by a bare name did not say which name to use. When a bare name matches exactly one plugin skill, the error now names that skill’s full name.

  • alwaysLoad MCP servers in first-party sessions with telemetry disabled

    An alwaysLoad MCP server that finished connecting mid-conversation was not usable right away. It is now usable on the next turn without a tool-search round trip.

  • /ultrareview --post

    Posting the findings started a second cloud session. It now posts the PR comment directly when the findings arrive and prints the comment link.

  • Artifact database reads that save into the session scratchpad

    They stopped for working-folder approval. They no longer do.

  • Skills synced from claude.ai in cloud sessions

    The same skill was addressed differently across environments. They are now named anthropic-skills:<name>, matching Claude Desktop; the bare name still works when nothing else uses it.

[VSCode]

  • Documents and messages written for someone other than the user

    A document or message meant for someone else was still written as if addressed to you. Claude now writes them for that audience and names it at the top of its reply.

  • Screen reader and keyboard accessibility

    Improved in the slash-command menu, @-mention menu, output-style picker, Send/Stop button, permission and question cards, and onboarding checklist.

  • The current-file chip in the message box

    Clearing it meant using the Hide toggle. An X now removes it, replacing the Hide toggle.

  • Session tab menus

    The Claude Code items in a session tab’s right-click menu and the editor title bar’s ”…” menu could not act on the tab the menu was opened on. They have been removed.

[Claude Code on the web]

  • The Cloud environments admin page

    Each table capped at five rows behind a Show more control that could be unreachable. The page now lists every environment.

  • claude.ai/code for Free-plan users

    A “Disabled by org admin” page left no way forward. It now opens the plans page with a path to upgrade.

[Claude Tag]

  • Admin settings page load time

    Most noticeably for organizations with many channels or several connected workspaces, the admin settings page and its Slack channel picker now load faster.

  • Scheduled routines in Slack channels

    A routine run always posted a new top-level channel message. It can now reply in an existing thread instead.

  • Timestamps on live progress checklists

    A fixed UTC time left each reader to convert it. They now show each reader’s local time and how long ago it was updated.

Bug fixes

Prompt cache & resuming

  • The prompt cache being partially invalidated on the turn after a response was cut off at the output-token limit and automatically resumed.
  • Resuming a session after interrupting Claude mid-thought could change how earlier context was re-sent, hurting prompt-cache reuse.
  • Prompt cache misses in cloud sessions; the session now waits briefly for server configuration before the first request.
  • Resumed headless sessions losing a turn’s replies when the model was switched or a request was retried mid-turn.
  • The git status Claude is told after a compaction: it is now the current status, not the one from the start of the session.
  • Sessions getting permanently stuck on “Prompt is too long” when auto-compaction had no complete earlier exchange to summarize (mostly Agent SDK sessions with very large prompts).
  • CLAUDE_CODE_RESUME_INTERRUPTED_TURN re-running a turn that had failed with an API error over 6 hours earlier, or longer ago than CLAUDE_CODE_RESUME_INTERRUPTED_TURN_MAX_AGE_MS when set.

Permissions & security

  • A deny or ask permission rule starting with ! applying beyond the settings source that wrote it; such a rule now applies only within its own source, and a bare ! negation is ignored.
  • Edit() deny rules and the write-path check not applying to the file a Bash tee command writes; a Bash(tee:*) allow rule no longer covers destinations outside the working directories.
  • permission_denials in --output-format stream-json results omitting Read, Edit and Write calls blocked by a path-scoped deny rule.
  • Plugin archives extracted for a session being readable by other local users, extracted files keeping world-writable bits from the archive, and stale files surviving re-extraction.
  • Plugin headersHelper consent prompts showing a URL path that could be misread as a different host.
  • The managed settings approval dialog not naming the collector for a gRPC telemetry endpoint set without a scheme.
  • The attribution reminder overriding a CLAUDE.md or memory rule against commit and pull request attribution; lines set by managed settings still apply.

Terminals & keyboard

  • The keyboard regression in 2.1.247: F1/F2/F4 not working in kitty-protocol terminals and Delete in st, Alt+arrows acting as Escape in rxvt-unicode, and Shift+punctuation typing the unshifted key in WezTerm.
  • The terminal’s replies to capability queries (^[[?1;2c) appearing as stray text at startup in some terminals.
  • Stray characters like 22c, or a terminal’s color or version reply, being typed into the prompt at startup over slow connections (ssh, browser terminals).
  • Rows at the top or bottom of the transcript going blank in fullscreen after resizing the terminal.
  • Synchronized output being assumed from the terminal’s name in GNOME Terminal and Konsole versions that do not support it.
  • The terminal’s block cursor showing under the interface in rxvt-unicode after leaving or re-entering fullscreen.
  • The cursor block staying visible after returning from an external editor in fullscreen mode on rxvt-unicode.
  • The interface being drawn twice after returning from an external editor (Ctrl+G) outside fullscreen mode, and the same in Konsole.
  • Missing cursor in the permission-rule, auto-mode-rule, add-directory, session-rename and feedback-review text fields when the terminal’s native cursor is enabled.
  • The prompt box’s top border splitting into extra lines when viewing a background agent whose name or description has line breaks or is wider than the terminal.

Background tasks & the agent list

  • Remote and headless sessions reporting “waiting for your input” while background agents were still running (set CLAUDE_CODE_BG_TASKS_REPORT_RUNNING=0 to restore the old behavior).
  • Terminal escape codes, line breaks and oversized text from a background task’s on-disk record reaching the task list and task notifications when work is resumed.
  • Repeated clicks on a /fork receipt, each under a second apart, never backgrounding the session right away while it waited for the current tool to finish.
  • Sessions run through the SDK or the desktop app showing an unknown status in other sessions’ agent list.

Plugins & MCP

  • Synced plugin MCP servers not connecting when a remote session resumes.
  • Organization plugins enabled through managed settings not loading in headless sessions and on Claude Desktop (once Desktop bundles this CLI version); they load from the next session.
  • Plugin LSP servers that reject shutdown params (e.g. rust-analyzer) being left running at session end; exit is now sent even if shutdown fails.
  • Plugin errors showing [redacted URL] in place of a relative Windows path with a folder name that starts with @.
  • MCP servers reconnecting when an updated config only changed the order of the server URL’s query parameters.

Models & providers

  • /insights failing on Bedrock, Vertex, Foundry, and gateway deployments whose account can’t reach the default Opus model; it now uses the session model there instead.
  • Organization policy limits not loading for the session when another Claude Code process refreshed the login at the same moment.
  • Claude Desktop sessions using Bedrock, Vertex, or a gateway not getting the contextual “what Claude needs” turn-end notification text.
  • CMYK JPEG images failing to attach with “cannot decode”; they are now converted and resized like other JPEGs.

Commands & replies

  • /goal runs silently stalling after API errors, network drops, or token limits: the goal now retries with backoff, or pauses and says why, including until a usage limit resets.
  • /btw answers that contained made-up tool calls and output: the side question is now told not to write them, and any that appear are flagged as not executed.
  • Prompt suggestions being dropped for text in Japanese, Chinese, Thai and other languages written without spaces between words.
  • Windows: PowerShell tool commands sent to the background stopping when Claude Code exits.

[VSCode]

  • Focus view showing a turn started by a delivered plain-text prompt, such as a scheduled task’s, as part of the previous turn.
  • The footer’s prompt cache clock hiding its minutes when the panel is narrow.
  • The session list keeping sessions from the default folder when CLAUDE_CONFIG_DIR is set in a settings file or the environmentVariables setting.
  • A plan preview that finished loading late sometimes hiding its comment box or showing an older plan.
  • A plan preview accepting comments that went nowhere after its Claude tab closed.
  • The prompt cache clock and reopen notice for a session compacted after its last reply and then closed, which now reads as cold when reopened.
  • A session renamed in the extension while Remote Control is on keeping its old name on claude.ai/code.
  • The “Enable Remote Control for all sessions” toggle keeping its last position after the setting was reset to default from a terminal.
  • Restored Claude tabs not counting as open in the session list after a window reload until clicked, and their row opening a second tab.
  • Switch account making a tab forget its dismissed usage-limit warnings when you sign back in as the same account.
  • A session rename being replaced by the generated name after a window reload when the session was renamed during a long turn.
  • The sidebar usage meter keeping a stale per-model weekly limit row after the account loses that limit.
  • A rare case where an @-mention sent with the keyboard shortcut while a new chat view was still starting could be inserted into the input long after the keystroke.
  • The session list jumping down when the Account & usage header appeared a moment after opening the Claude side bar.

[Claude Code on the web]

  • /model default in a cloud session leaving every later message failing in organizations that restrict which models Claude Code can use.
  • One-off scheduled routines occasionally running a second time after a transient server error.
  • Routine runs that use subagents sometimes being treated as finished too early, which could skip the retry after a real failure or start a duplicate run.
  • File links in cloud session transcripts opening a GitHub 404 when Claude was working from a subfolder of the repository.

[Claude Tag]

  • Threads occasionally going silent after a failed turn because the failure notice was dropped when Slack briefly rate-limited it; the notice is now retried.
  • Claude accepting a switch to a model your organization hasn’t enabled and then quietly answering with a fallback model; it now declines and says an admin can enable it.
  • A table posting as raw pipe text when Claude attached files to the same message; the table now posts as a normal reply and the files follow with a plain caption.
  • @Claude !restart at the top level of a channel where Claude isn’t active starting an unrelated conversation; it now privately says there is nothing to restart.
  • Plugin rows in Slack access settings showing an unlabeled raw ID with no way to turn the plugin off; they now show its name and link to the bundle that manages it.
  • The shared-session banner and Share dialog on sessions started from Slack claiming the whole organization could open the link; they now name the Slack channel’s audience.

Notes

  • A deny or ask rule starting with ! is now scoped to its own settings source — such a rule applies only within the source that wrote it, and a bare ! negation is ignored. If you relied on such a rule reaching rules in another settings source, check your settings.
  • A Bash(tee:*) allow rule no longer covers destinations outside the working directories — Edit() deny rules and the write-path check now apply to the file a tee command writes, so commands that used to pass may now be blocked.
  • Keyboard handling is back to its pre-2.1.247 behavior — upgrade if you use F1/F2/F4 in a kitty-protocol terminal, or st, rxvt-unicode or WezTerm.
  • The Bash tool’s diff is opt-in — set bashEditDiffEnabled to get a diff of the files a Bash command changed in the tool result.
  • Remote and headless sessions no longer report “waiting for your input” while background agents run — if automation keys off that signal, set CLAUDE_CODE_BG_TASKS_REPORT_RUNNING=0 to restore the old behavior.
  • Skills synced from claude.ai in cloud sessions are renamed — they are now anthropic-skills:<name>; the bare name still works when nothing else uses it.
  • A CLAUDE.md rule against commit attribution is respected again — if you asked for no commit or pull request attribution, that holds; lines set by managed settings still apply.
  • CLAUDE_CODE_RESUME_INTERRUPTED_TURN now has an age cap — a turn that failed with an API error over 6 hours earlier is not re-run. Override the cap with CLAUDE_CODE_RESUME_INTERRUPTED_TURN_MAX_AGE_MS.
  • /ultrareview --post no longer starts a second cloud session — it posts the PR comment directly when the findings arrive and prints the comment link.
  • Organization plugins enabled through managed settings load from the next session — on Claude Desktop, once Desktop bundles this CLI version.