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

Claude Code 2.1.280

Claude Opus 5.5 (`claude-opus-5-5`) arrives as the default Opus model, and the default model on Pro and Team Standard plans changes from Sonnet to Opus. A stray `y` or `n` no longer confirms or closes dialogs, and `CLAUDE_CODE_MAX_MCP_DESCRIPTION_LENGTH` changes the 2,048-character cap on MCP tool descriptions. Fixes include writes through a symlinked path being judged by their in-tree spelling, auto mode retrying or denying actions over and over, and Ctrl+C or Ctrl+D pressed twice in most dialogs quitting Claude Code.

Official announcement →

This article is a summary based on official documentation.

What changed

Claude Code 2.1.280 shipped on September 22, 2026. The headline is Claude Opus 5.5, now the default Opus model, alongside a switch of the default model on Pro and Team Standard plans from Sonnet to Opus. On the permissions side, writes through symlinked paths are now judged by where they land, and auto mode stops looping when a safety check declines or gives no answer. The rest of the fixes cover dialog keys and mouse handling, session resume, background subagents, and plugin management.

New features

  • Claude Opus 5.5 (claude-opus-5-5)

    Now the default Opus model, with 1M context, at $4/$20 per Mtok with $0.20/Mtok cache reads.

  • CLAUDE_CODE_MAX_MCP_DESCRIPTION_LENGTH

    MCP tool descriptions and server instructions were capped at 2,048 characters with no way to change it. This variable changes the cap for every MCP server in the session.

  • Mouse support in more fullscreen lists

    The wheel scrolls the /skills list, and a skill’s state options in /plugin can be clicked.

  • Hook output sizes in hook_execution_complete

    The OpenTelemetry event now includes hook output sizes and the number of oversized outputs saved to a file.

  • [VSCode] New dialogs and commands

    A Status dialog (typed /status) with the session’s version, account, model and server details. A Sandbox dialog (panel menu or /sandbox) for the sandbox mode, the unsandboxed fallback and excluded commands. A Claude in Chrome dialog (panel menu or /chrome) with extension status, the install, reconnect and permissions pages, and the enabled-by-default setting. Export conversation (typed /export) to copy or save the conversation as plain text. The Slash commands dialog now shows each skill’s source, token estimate and on/off state, with a click to change the state, and a typed /skills opens it. A typed /plan switches to plan mode, sends a first planning prompt, or shows the session’s plan.

  • [Claude Tag] Slack’s native Working indicator and Stop button

    Claude’s threads in channels get Slack’s native Working indicator, Stop button and thread title; the indicator stays up until Claude finishes, and Stop interrupts the task. A short notice also appears in the channel when a guest joining, or the last guest leaving, changes how Claude responds there under a Restrict or Channel only guest setting.

Key improvements

Lists & dialogs

  • /permissions navigation

    Focus returns to the rule list after viewing, adding or deleting a rule, and the delete-rule and remove-directory confirmations now default to No. ←/→ and Tab pressed in a rule list switch tabs without moving focus to the tab bar.

  • Scrollbars on long lists

    In /artifacts and /workflows, a scrollbar at the right edge shows how much of a long list is hidden and where you are in it.

  • Visual cleanup

    Running agents and phases in the workflow progress tree show a dim dot instead of ⟳. In fullscreen, /plugin’s Add Marketplace form no longer draws a box inside the pane, and the /workflows detail view no longer draws a second horizontal rule. /autocompact’s footer names ←/→, and /fast’s footer names Space as the toggle key.

  • Code blocks without a language

    They are now colored like inline code, so commands stand out from the surrounding text.

  • @ file suggestions

    A file whose name contains the query now ranks above one that only matches across its folder names.

Diagnostics & messages

  • /cost cache-miss causes

    Thinking mode and thinking display changes are now named as causes.

  • UserPromptSubmit hook timeouts

    The timeout notice and the debug log name which hook command timed out.

  • /btw while a tool is running

    The side question now knows that call is in progress instead of reading it as a failed one.

  • Other messages

    /install-github-app shows “Esc to cancel” on the GitHub CLI check and repository selection steps. The cross-session messaging startup warning explains that --debug-file writes a debug log to a path you choose.

Artifacts & /ultrareview

  • Unreadable artifact links

    When Claude cannot read an artifact link it was given, it tells the user before continuing.

  • Artifact pages

    No Print buttons, confirm dialogs or device features the viewer blocks; email and phone details are shown as text, and dark mode reaches form controls and scrollbars.

  • /ultrareview uploads

    Renamed copies of key files, such as id_rsa copy or kubeconfig (1).yaml, now also stay on your machine.

Changed behavior

  • Default model on Pro and Team Standard (changed)

    Changed from Sonnet to Opus, matching Max, Team Premium, and Enterprise.

  • Effort levels on newly released models (changed)

    An effort level saved before /effort became per-model no longer applies to new models such as Opus 5.5; they start at their default until you pick a level.

  • Launch-default effort on Opus 4.7, Opus 4.8 and Fable 5 (changed)

    These models no longer hold their launch-default effort over /effort in -p or the Agent SDK, a project, managed or --settings effortLevel, or a per-model level.

  • y and n in dialogs (changed)

    A stray n no longer closes dialogs and a stray y no longer confirms them; Enter and Esc accept and cancel. To restore, bind y/n to confirm:yes/confirm:no in keybindings.json.

  • ctrl+l / cmd+k in fullscreen reverted (changed)

    The change in 2.1.260 that made them clear the transcript view is reverted; they redraw the screen again.

  • Marketplaces imitating reserved names (changed)

    A plugin marketplace whose name imitates a reserved marketplace name is refused when added, and stops loading if one was already added.

  • Agent-type PermissionRequest hooks (changed)

    An agent-type hook no longer runs there, since its answer could never allow or deny the request; it now shows an error pointing to command or http hooks.

  • Self-hosted runner: git in lifecycle hooks (changed)

    Git in lifecycle hooks ignores hook folders and programs named in the runner’s shared git files; local-path and git:// remotes there now need GIT_ALLOW_PROTOCOL.

  • [VSCode] Pasted text and prompt handling (changed)

    A paste over 800 characters or over 2 line breaks is marked so Claude can tell it from what you typed. Invisible Unicode formatting and tag characters are removed from pasted text with a notice, and from anything else before it is sent. “Open in New Tab” opens Claude beside the editor group you are working in rather than after the last group.

  • [Claude Code on the web] Admin settings and cloud sessions (changed)

    The admin Routines on/off setting now lives under Admin settings → Capabilities → Remote sessions, linked from the Claude Code admin page. Cloud sessions viewed in the Claude app save files meant for you where the app can open them. The empty repository picker on self-hosted environments, in organizations where an admin has turned GitHub off, is removed.

  • [Claude Tag] GitHub banner (changed)

    The banner in admin settings says why GitHub isn’t connected: not signed in, app not linked or not installed, sign-in expired, or SSO not authorized.

  • [Code Review] REVIEW.md size limits (changed)

    The Code Review check run says when REVIEW.md instructions were cut or left out for exceeding a size limit, naming the file and the limit.

Bug fixes

Permissions & auto mode

  • Writes through a symlinked path being judged by their in-tree spelling; the prompt names where the write lands, and acceptEdits, allow rules and auto mode no longer approve one landing outside.
  • Auto mode retrying an action over and over when a safety check declined to review it; the action is now denied once, noting that retrying won’t help.
  • Auto mode denying actions over and over without pause when a safety check gave no answer; retries now back off, and the turn stops with a message after ten in a row.
  • Write calls failing validation when a model sends path, file_text, file_content or a stray description instead of file_path and content.

Dialogs & keys

  • Ctrl+C or Ctrl+D pressed twice in most dialogs quitting Claude Code instead of closing the dialog, including /model, /effort, /config, /status, /usage, /plugin, /sandbox, /permissions, /artifacts, /mobile, /login, /upgrade, /usage-credits, /install-github-app, /setup-bedrock and /setup-vertex.
  • A click that only brought the terminal window to the front also triggering the item under the pointer in search pickers, tab bars, agent/workflow rows, slash-command links and suggestion dropdowns.
  • Text fields in dialogs losing a typed letter, digit or Space to a keybinding on that key.
  • Home and End doing nothing in the /config settings list and selection lists such as /model, /memory and permission prompts; PgUp/PgDn in /skills wrapping past the first or last skill; and Tab silently changing the selected setting’s value in the /config list.
  • The mouse wheel not scrolling selection lists with hidden options (such as /model and /permissions) in fullscreen mode.
  • Voice dictation not stopping on Ctrl+C (the prompt cleared but the microphone kept recording), Esc not cancelling while a transcript was processing, and held Space starting dictation from the transcript view and vim NORMAL mode.
  • A ! shell-mode prompt stashed with Ctrl+S coming back as a plain prompt when restored, and / listing file paths right after stashing one.
  • Ctrl+C needing three or four presses to exit while background subagents are running; two presses now exit.

Invisible-character cleanup

  • The prompt line staying scrambled on Windows terminals after invisible characters were removed on Enter; the screen is now repainted so you review the exact text that will be sent.
  • The cleanup removing the zero-width non-joiner that Persian and Arabic text uses to attach a suffix to a Latin word or number, such as the plural of “PDF”.

Sessions & API errors

  • Conversations failing on every turn with a “role ‘system’ must precede an ‘assistant’ message” API error.
  • Conversations with the advisor on failing every turn with API Error 400 “Input tag ‘advisor_20260301’” behind a proxy or gateway that doesn’t support it; the request now retries without it.
  • A session failing on every turn and /compact when its saved history held a malformed notice about MCP tools that could not be loaded, and a crash when resuming a session whose saved transcript holds a malformed system message or a memory-saved notice without its file list.
  • One cause of long-running fullscreen sessions exiting with “Claude Code exited after an unrecoverable interface error”: a damaged cached message list is now rebuilt.
  • Claude Code hanging when a settings file, or a file it re-reads after an edit, is replaced by a named pipe mid-read.
  • /config crashing and some on/off preferences being misread when a preference that has moved to settings.json still holds a value like null or "false" in ~/.claude.json.
  • A model switch from a host app (Claude Desktop, VS Code, SDK) while Claude is working causing a prompt-cache miss on the next prompt.
  • IDE selection being dropped when a sent prompt comes back into the input, such as pressing Esc to edit it, rewinding to it, or pressing Esc while startup hooks run.

Subagents & background work

  • Resuming a session with unfinished background agents, shells or workflows starting a model turn on its own before you typed anything.
  • Messages sent to a background subagent being silently lost in headless and SDK sessions when the subagent was finishing its turn.
  • A finished subagent’s report being lost when the conversation that launched it was compacted before the report was read.
  • Resumed fork subagents rebuilding their tool list instead of re-sending the one they first used, which broke prompt caching, and subagent hand-back messages showing an internal provenance preamble when expanded outside verbose mode.
  • Background subagents being unable to use the LSP tool when an LSP plugin is active.
  • Background shell tasks reporting benign non-zero exits (e.g. grep with no matches) as failures.
  • Background sessions (claude --bg) being unable to run git, hooks, plugins and other helper programs when an environment variable handed to the session contained a NUL character.
  • claude agents showing a blank, unresponsive screen instead of an error when the temp directory is full, not writable or owned by another user.

Plugins, skills & MCP

  • Skills in ~/.claude/skills/ being moved to ~/.claude/skills/.trash/ when a manifest.json in that folder listed their names.
  • installed_plugins.json keeping the install-time commit after updating a plugin from a GitHub repository or git URL that tracks a branch or tag, and claude plugin update clearing a plugin’s recorded commit and moving it to version “unknown” when the official marketplace’s snapshot file is a link or too large.
  • Background plugin marketplace auto-update ignoring git credential helpers, so private-repo marketplaces were re-cloned every run or never updated.
  • An MCP server re-added under the same name after claude mcp remove still showing as needing authentication instead of reconnecting.
  • A skill you switched off showing the same red ✘ as a plugin that failed to load in /plugin and /skills; off now shows a dim ◯.
  • /mcp showing △ in the server list but ⚠ in the detail view for the same server; the list, detail views and /plugin now all show ⚠.
  • The search box in /plugin, /skills and /mcp losing its right border in fullscreen mode, and multi-select option descriptions being indented under the option number instead of under the label.

Artifacts & /ultrareview

  • The Artifact tool silently disappearing when your organization’s policy can’t be loaded (for example behind a web proxy); Claude now says what’s blocking it.
  • Artifact republishes silently resetting stored database access rules or dropping the viewer profile scope when that capability was re-sent without them; they are now refused.
  • /ultrareview reporting a stopped cloud review as completed or as an error to retry, and waiting out the full timeout when its session was deleted or the signed-in account changed.

Remote Control, cloud & self-hosted runner

  • The Claude app showing a missing or stale context usage figure for Remote Control and cloud sessions right after /compact or /clear, and its diff view dropping a branch’s committed files whenever there are also uncommitted changes.
  • Cloud and self-hosted runner sessions failing with “Authentication failed” after waiting out a long overload during which the session’s access token was rotated.
  • Memory write conflicts in Cowork sessions showing Claude only the start and end of a memory file over about 10,800 characters, so the retried write dropped the middle.
  • Self-hosted runner: lifecycle-hook commits failing to sign under --configure-git, and a turn that ended right at a --retire-at release losing its finished signal; the runner now briefly waits for the turn to be reported before stopping the session.
  • Windows: background cleanup deleting a directory symlink or junction used to relocate ~/.claude/session-env, image-cache or another cleaned-up folder.

Other display fixes

  • The session feedback survey showing no hover highlight on light and ANSI themes, and /workflows briefly showing a one-row list before opening the only run.

[VSCode]

  • The effort chip showing a stale saved effort level instead of the level the session runs at.
  • Claude Code never starting when the Python extension hangs while activating; it now starts after 60 seconds without the Python environment.
  • The plan approval card never offering auto mode; when auto mode is available, its first option is now “Yes, and use auto mode”, as in the terminal.
  • Arrow-key navigation in the session list stopping after archiving or unarchiving a session from the keyboard, and paste marker lines showing in your own messages after reopening a session.

[Claude Code on the web]

  • gh and GitHub API calls in a cloud session on a GitHub Enterprise Server repository failing after about eight hours; the token now renews automatically.
  • A routine that resumes an existing session running with its old prompt and name when it was edited moments before the scheduled run started.
  • File links pointing outside the session’s working directory opening a file card that never loads; they’re now disabled and say why.
  • Auto mode refusing to retry a tool call because an approval prompt that expired unanswered, or was superseded by a newer message, had been recorded as your rejection.

[Claude Tag]

  • Scheduled routines silently failing to run in Slack workspaces that were connected to Claude before the workspace joined its Enterprise Grid.
  • Claude asking you to re-upload a Slack file when a brief file-scanning outage was the problem; it now retries the scan and is told when the scanner is down.
  • A bullet whose text starts with +, - or * rendering as an empty bullet with a stray nested item; it now shows as one bullet with the character kept.
  • The Slack notice for a failed cloud environment setup script sometimes being a generic “mention me to retry”; it now names the setup script and says to fix it first.

Notes

  • Opus 5.5 is the default Opus model — and Pro and Team Standard plans now default to Opus instead of Sonnet. Pricing is $4/$20 per Mtok with $0.20/Mtok cache reads.
  • Check your effort level — a level saved before /effort became per-model doesn’t carry over to Opus 5.5, so pick one with /effort if you want something other than the default. Opus 4.7, Opus 4.8 and Fable 5 now honor the level you set.
  • y and n no longer answer dialogs — use Enter and Esc, or bind y/n to confirm:yes/confirm:no in keybindings.json to restore.
  • Agent-type PermissionRequest hooks no longer run — switch them to command or http hooks.
  • Truncated MCP tool descriptions — CLAUDE_CODE_MAX_MCP_DESCRIPTION_LENGTH changes the 2,048-character cap for every MCP server in the session.
  • Self-hosted runners — local-path and git:// remotes in the runner’s shared git files now need GIT_ALLOW_PROTOCOL.