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

Claude Code 2.1.261

`/skill-doctor` shows which loaded skills go unused and what they cost in context, so you can prune them, and new `bashOutputMaxChars` and `taskOutputMaxChars` settings raise how much command and background-task output Claude receives inline before it is saved to a file, up to 128K characters. `/status` and `claude doctor` gained an "Organization policy" line saying why your organization's policy could not be loaded, and the prompt's word-editing keys now match Bash, so `keybindingFlavor` no longer has any effect. 47 fixes cover typed or pasted characters landing out of order during fast input, resuming a session losing hook output around parallel tool calls, Remote Control's stale permission mode and stuck spinners, and sustained high CPU when a background agent could not be resumed.

Official announcement →

This article is a summary based on official documentation.

What changed

Claude Code 2.1.261 shipped on September 4, 2026. What is new is mostly about surfacing why something did not work or what is being wasted: an “Organization policy” line explaining a policy that could not be loaded, and /skill-doctor listing loaded skills that go unused along with what they cost in context. Settings were added to keep more command output inline instead of spilling it to a file. The rest is fixes, weighted toward the VS Code extension (20 of them); on the CLI side, Remote Control and remote sessions, session resume, and corporate proxies account for most of the rest.

New features

  • /skill-doctor

    Every loaded skill puts its description in context on each request, with no way to tell which ones are earning that space. /skill-doctor now shows which loaded skills go unused and what they cost in context, so you can prune them.

  • bashOutputMaxChars and taskOutputMaxChars settings

    Past a fixed point, long command and background-task output was saved to a file that Claude did not see inline. These two settings raise how much output Claude receives inline before it is saved to a file, up to 128K characters.

  • An “Organization policy” line in /status and claude doctor

    When an organization’s policy did not apply, there was nothing to explain why. Both now say why your organization’s policy could not be loaded — for example, a proxy not passing the endpoint through.

  • --append-subagent-system-prompt-file

    The subagent system prompt could only be passed on the command line, which does not work once it gets large. It can now be read from a file.

  • [VSCode] A “Build a custom style” walkthrough, and adding or removing MCP servers in the IDE

    Writing a custom output style meant creating the file yourself, and MCP servers could only be added or removed outside the IDE. The Output styles menu now has a walkthrough that writes a custom output style file and lists it right away, and the MCP servers dialog gained an Add server form and a Remove action.

  • [VSCode] Open-elsewhere indicator, Archive session, and a fold button on prompts

    Sessions open in a terminal, another VS Code window, or Claude Desktop looked closed in the session list, and a permission or question prompt hid the conversation behind it. Those sessions now get a hollow ring, prompts have a fold button so the conversation can be read without dismissing them (and the space beside the prompt scrolls the conversation), and the session list’s right-click menu gained “Archive session”, with Unarchive getting its own icon.

Key improvements

  • The prompt’s word-editing keys now match Bash

    Ctrl+W, Alt+F, and Alt+D covered different ranges than they do in Bash. Ctrl+W now deletes back to whitespace, Alt+F and Alt+D stop at word end, and punctuation separates words. As a result, keybindingFlavor no longer has any effect.

  • Model names in the /model picker and the VS Code model pill

    On Bedrock, Vertex AI, or an LLM gateway, the list showed the raw provider ID rather than something recognizable. Both now show a model’s name instead of its raw ID when Claude Code recognizes it.

  • Retry handling when the API sends no response headers

    The retry waited another 3 minutes and the messages did not say what to change. It now waits up to API_TIMEOUT_MS (10 minutes by default), and the messages say what to change.

  • Wider coverage in the dangerous-rm safety prompt

    rm -rf on positional parameters, and inside double-quoted sh -c scripts, slipped past the prompt. Both are now caught.

  • Auto mode treats diagram-renderer links as uploads

    A link that packs content into a public diagram renderer’s URL is effectively an upload to that site, but auto mode approved it automatically. It is no longer auto-approved unless you asked for it.

  • forceLoginMethod: "gateway" takes precedence over leftover credentials

    A machine pinned to gateway login could still fall back to an old API key or claude.ai login. Such machines now ignore a leftover API key or claude.ai login and ask for /login; Bedrock, Vertex AI, and Foundry sessions are unaffected.

  • /context falls back to a local token estimate

    When the token-counting API was unavailable, counting meant extra small-model requests. /context now uses a local estimate instead.

  • Startup on Google Vertex AI

    With GOOGLE_APPLICATION_CREDENTIALS set, creating an API client re-ran Google Cloud project discovery and spawned extra gcloud processes. It no longer does.

  • Streaming performance

    Layout re-checked already-rendered blocks on each update. They are now skipped.

  • A clearer message when the managed settings load returns 403

    A Claude apps gateway 403 at startup or after /login advised a new sign-in. It now says Claude Code may not be enabled for the organization instead.

  • [VSCode] The model picker is one flat list

    Models were split up, which made them harder to find. The picker is now one flat list of every model, with rows kept for older model spellings listed last.

Bug fixes

Input & UI

  • Typed or pasted characters occasionally landing out of order or being dropped during fast input or key repeat.
  • Being unable to delete the character immediately before an inline [Image #N] chip in the prompt input.
  • The terminal progress indicator (iTerm2, Ghostty, ConEmu) showing the session as finished while a background workflow or agent was still running.
  • A rare layout glitch where a box could render with the wrong height after its container switched between row and column direction.

Remote Control & remote sessions

  • Remote Control showing a stale permission mode when a phone, browser, or claude.ai app attaches to a terminal session, or after the mode changes in the terminal.
  • Remote Control sessions showing as still working (stuck spinner and Stop button) after stopping a turn from a connected phone or browser, or after a local slash command like /clear.
  • SDK and cloud sessions ignoring a Stop or interrupt sent just after the first prompt, before the turn had started; the turn now stops instead of running to completion.
  • Remote Control uploading a session pulled with /teleport into the connected session, which appeared appended to the original on phone and web.
  • Remote Control’s inbound event stream failing behind TLS-inspecting corporate proxies on native Windows.
  • Remote Control sessions showing the default effort level on claude.ai when the effort comes from settings.
  • SendMessage to an offline Remote Control session on another machine reading as delivered; the result now says delivery is queued until that machine reconnects.

Resuming sessions & background work

  • Resuming a session losing hook output and other context around parallel tool calls, which changed the resumed request.
  • claude -p --resume <file> adopting a malformed session ID recorded in the transcript; it now resumes under a fresh session ID instead.
  • Sustained high CPU usage when a background agent could not be resumed and its wake-up was retried in a tight loop.
  • In-process agent-team teammates re-sending their first-turn tool and skill announcements on the second turn, which changed the request prefix and missed the prompt cache.
  • Desktop and web showing a session as busy while it only watches an artifact for updates.

Enterprise environments & the gateway

  • The Bedrock setup wizard hanging when AWS or an AWS credential helper never responds — it now times out with a clear error — and its model checks failing behind a TLS-inspecting proxy.
  • gcpAuthRefresh opening a browser at startup when the Google credential check was slow, even though the credential was still valid.
  • claude.ai connectors staying absent for the whole session when the startup connector fetch timed out; the CLI now retries in the background.
  • Claude apps gateway client IP when a trusted proxy appends a port to X-Forwarded-For; with an access list set, an unreadable entry now gets 403.
  • Claude apps gateway telling Claude Desktop to export OpenTelemetry as JSON even when the terminal CLI uses protobuf, so protobuf-only collectors rejected Desktop’s data.
  • Feature flags gated to a newer version occasionally applying to an older Claude Code version running on the same machine.

Plugins, connectors & usage

  • Cloud sessions discarding a plugin synced from claude.ai when managed settings force-enable it in enabledPlugins, then falling back to a marketplace clone that could fail.
  • Plugin install hints from CLIs run in background Bash commands: they are now detected, and the raw <claude-code-hint> tag no longer leaks into the conversation.
  • Claude in Chrome file_upload failing with “paths: expected array, received undefined” in local Cowork sessions run from the Claude Desktop app.
  • /usage and the VS Code usage panel dropping a model-specific weekly limit row when the usage endpoint is rate limited, or when opened right after startup.
  • /add-dir <subdirectory> printing a false “couldn’t be resolved” error when the working directory is on a /net automount.

[VSCode]

  • A session teleported from Claude Code on the web treating a question that was cut off when the cloud session shut down as declined.
  • The session tab’s Rename box opening empty for a tab restored with the window; it now starts with the current name.
  • Collapsed sections in the session list panel briefly showing expanded each time the panel loaded.
  • Focus view showing a tool call as still running after Claude had moved on, such as while a question waited for your answer.
  • The session list’s active-row highlight going stale when an unfocused Claude tab’s session ID is corrected.
  • Cmd/Ctrl+Shift+T reopen and deep-link opens placing the Claude tab outside the Claude editor group when a Claude tab has focus.
  • The session tab’s “Add to group” putting a session opened from Claude Code on the Web in two groups; it now moves the entry the session list shows.
  • The model picker showing models an organization has since disabled until the window was reloaded twice.
  • A tab opened from the session list jumping back to that session, and a tab opened from a Web session restarting its teleport or staying empty, after VS Code reloads the tab’s view.
  • /btw side-question history from earlier sessions being overwritten when a question is asked right after a window reload or while a settings file has errors.
  • The pending question card not reappearing after the Claude panel reloads when signed in with a Claude.ai or Console account.
  • claude.ai-only features staying visible in a window’s other Claude panels after one panel picked up a third-party provider from a settings file.
  • The sign-in screen appearing despite the Disable Login Prompt setting when Claude Code reports no login or a request fails for lack of one.
  • The next queued permission prompt keeping text typed on the previous prompt and accepting an immediate second click.
  • Install-plugin links opening the Claude sidebar without the install dialog in a window where only the session list had been shown.
  • The sidebar usage meter staying empty on a new window until the Account & usage dialog was opened, and a 0% usage limit being left out of the meter.
  • “Start new session in this group” losing the group after New conversation, and a missing unread dot for a session that finished before the sidebar’s unread list loaded.
  • The editor tab badge showing unread during a running turn or missing on a tab opened from the session list, and “Add Session Tab to Group” doing nothing for an archived session.
  • “Enable Remote Control for all sessions” not applying right away to sessions open in other VS Code windows when the toggle is flipped.
  • The session list’s Open filter missing sessions continued from claude.ai whose tab was still recorded under the web session; the filter menu’s sections are now labeled for screen readers.

Notes

  • keybindingFlavor no longer has any effect — the prompt’s word-editing keys now follow Bash. If you used the setting for different behavior, Ctrl+W, Alt+F, and Alt+D will cover different ranges after upgrading.
  • Machines pinned to forceLoginMethod: "gateway" ignore leftover credentials — a stale API key or claude.ai login is no longer used, so you may need to run /login after upgrading. Bedrock, Vertex AI, and Foundry sessions are unaffected.
  • Auto mode no longer auto-approves public diagram-renderer links — a link that packs content into the URL counts as an upload to that site, so it prompts unless you asked for it.
  • bashOutputMaxChars and taskOutputMaxChars cap at 128K characters — output beyond that is still saved to a file for Claude to read when needed.
  • Retries can now wait longer when the API sends no response headers — up to API_TIMEOUT_MS (10 minutes by default) instead of 3 minutes. Lower that value if you want to fail faster.
  • /context numbers may be estimates — when the token-counting API is unavailable, it uses a local estimate rather than extra small-model requests.