
Claude Code v2.1.280 Major Updates - The Arrival of Fable 5.1 and Opus 5.5, the Latest Model Surpassing GPT-6 Astra
This page has been translated by machine translation. View original
This is Ishikawa from the Cloud Business Division. Claude Code v2.1.280 (released 2026-09-22) has been released. Today, Fable 5.1 and the latest model Opus 5.5, which surpasses GPT-6 Astra, have arrived. I tried out Claude Opus 5.5, which has become the default Opus model.
The previous update article is here.
Update Summary
v2.1.280 includes 114 changes. The breakdown is 66 fixes, 24 improvements, 12 new features, 7 breaking changes, and 5 security updates, of which 29 are changes for the VS Code extension, Claude Code on the web, Claude Tag, and Code Review. Changes that alter default behavior span models, effort, key bindings, hooks, and self-hosted runners. Note that v2.1.279 was not published to npm, so v2.1.280 is the version that follows v2.1.278.
Notable Updates
Claude Opus 5.5 Becomes the Default Opus Model
Claude Opus 5.5 (claude-opus-5-5) has been added and becomes the default Opus model. The context window is 1M, and pricing is $4 input / $20 output per million tokens, with cache reads at $0.20. This means Opus costs have been reduced by 20%.
According to the official documentation, the opus alias resolves to Opus 5.5 on the Anthropic API, Claude Platform on AWS, Amazon Bedrock, and Google Cloud's Agent Platform (Opus 4.6 on Microsoft Foundry). Opus 5.5 requires v2.1.280 or later.
If you are using the opus alias or the default Opus model, simply updating will switch you to Opus 5.5, so it seems worthwhile to check the changes in pricing and behavior once.
Default Model for Pro and Team Standard Plans Changes to Opus
The default model for Pro and Team Standard plans has changed from Sonnet to Opus, making them the same as Max, Team Premium, and Enterprise. The official documentation states that the default for Pro and Team Standard prior to v2.1.280 was Sonnet 5.
If you are on Pro or Team Standard and have been relying on Sonnet, it seems prudent to check the current model with /model after updating.
y/n Keys Removed from Default Dialog Bindings
The issue where accidentally pressing n would close a dialog and y would confirm it has been fixed. Confirmation and cancellation are now done with Enter and Esc. If you want to use y/n, assign confirm:yes/confirm:no in keybindings.json.
According to the official documentation, keybindings.json files created with /keybindings before v2.1.280 include these two assignments, and they remain active until those two lines are deleted.
This feels like a change that will initially confuse those accustomed to answering quickly with y/n.
Symlink Write Target Evaluated at Actual Destination
The issue where writes via symbolic links were evaluated based on the path representation within the tree has been fixed. The permission prompt now shows the actual write destination, and acceptEdits, allow rules, and auto mode will no longer approve operations that write outside the tree.
This fix will have the most impact on those working with repositories containing symbolic links pointing outside the working directory using acceptEdits or auto mode.
Marketplaces Impersonating Reserved Names Are Rejected
Plugin marketplaces with names that impersonate reserved marketplace names will now be rejected when added. If already added, they will no longer be loaded.
This change will most affect those who have been adding marketplaces using names as a guide.
Update Details
New Features
CLAUDE_CODE_MAX_MCP_DESCRIPTION_LENGTHhas been added. It allows changing the 2,048-character limit on MCP tool descriptions and server instructions for all MCP servers within a session- The OpenTelemetry
hook_execution_completeevent now includes the size of hook output and the number of outputs saved to a file due to size overflow - More lists in fullscreen mode now support mouse interaction. You can scroll through the
/skillslist with the wheel, and in/pluginyou can click to select skill state options - [VS Code] A Status dialog has been added. It displays session version, account, model, and server details, and can also be opened by typing
/status - [VS Code] A Sandbox dialog has been added. It handles sandbox mode, fallback outside the sandbox, and excluded commands, and can be opened from the panel menu or by typing
/sandbox - [VS Code] A Claude in Chrome dialog has been added (extension status, install/reconnect/permissions pages, setting to enable by default). It can be opened from the panel menu or by typing
/chrome - [VS Code] Additionally, the following have been added: Export conversation, which copies/saves conversations as plain text (
/export); display of skill source, token estimates, and on/off state in the Slash commands dialog (/skills); and/planfor switching to plan mode and displaying the session's plan - [Claude Tag] Slack-native Working indicator, Stop button, and thread title have been added to Claude's threads in channels. You can interrupt a task with Stop
- [Claude Tag] When guest participation or the departure of the last guest under Restrict or Channel only guest settings would change how Claude responds, a short notification is now displayed in the Slack channel
Improvements
- In
/permissions, focus now returns to the rule list after viewing, adding, or deleting rules, and confirmations for deleting rules and directories now default to No. Pressing ←/→ or Tab in the rule list switches tabs without moving focus to the tab bar /costnow cites thinking mode and thinking display changes as causes of cache misses- Code blocks without a specified language name are now displayed in the same color as inline code
- In
@file suggestions, files whose names contain the query now rank higher than files that only match on folder name - Timeout notifications and debug logs for the UserPromptSubmit hook now indicate which hook command timed out
- When a question is asked via
/btwwhile a tool is running, the in-progress call is now treated as ongoing rather than failed - The Artifact tool now informs the user when it cannot read a passed artifact link before proceeding. The artifact page also no longer uses print buttons, confirmation dialogs, or device features that are blocked in the viewer, email addresses and phone numbers are displayed as text, and dark mode is now applied to form controls and scrollbars
- Scrollbars indicating hidden content and current position have been added to the
/artifactsand/workflowslists. Additionally, improvements have been made to the workflow progress tree, the/pluginAdd Marketplace form,/workflowsdetail view,/install-github-app, and the footers of/autocompactand/fast - The startup warning for inter-session messaging now explains that
--debug-filewrites debug logs to the specified path - [VS Code] Pasting text longer than 800 characters or containing more than 2 line breaks into the chat field now marks the text to distinguish it from typed input. "Open in New Tab" now opens Claude beside the currently active editor group
- [Claude Code on the web] The admin toggle for Routines has been moved to Admin settings → Capabilities → Remote sessions. Additionally, the save location for files in cloud sessions displayed in the Claude app and the session start screen for self-hosted environments in organizations with GitHub disabled have been improved
- [Claude Tag] The GitHub banner in admin settings now indicates why GitHub is not connected (not signed in, app not linked or not installed, sign-in expired, SSO not authorized)
- [Code Review] When REVIEW.md instructions are truncated or excluded from a review due to exceeding the size limit, the check run now shows the file name and the limit
Security
- In
/ultrareviewuploads, copies of key files with variant names such asid_rsa copyorkubeconfig (1).yamlare now kept on the local machine and not uploaded - In artifact republishing, the issue where resending a capability without access rule or viewer profile scope would reset the stored database access rules or remove the viewer profile scope has been fixed. Such republishing is now rejected
- [VS Code] Invisible Unicode formatting characters and tag characters in pasted text in the chat field are now removed with a notification, and they are also removed from all other input before sending
Fixes (Major)
- Fixed repeated operations in auto mode: The issue where operations declined by the safety check were retried multiple times has been fixed, and they are now rejected on the first attempt. The issue where rejections were repeated without a pause when the safety check returned no response has also been fixed; retries now back off, and after 10 consecutive rejections a message is displayed and the turn is stopped
- Fixed Write validation failures: The issue where Write calls failed validation when the model sent
path,file_text,file_content, or an extradescriptioninstead offile_pathandcontenthas been fixed - Fixed prompt cache misses: The issue where prompt cache misses occurred when the host app (Claude Desktop, VS Code, SDK) switched models while Claude was working, and when a resumed fork subagent rebuilt the tool list, has been fixed
- Fixed skills being moved to
.trash: The issue where skills listed by name inmanifest.jsonunder~/.claude/skills/were being moved to~/.claude/skills/.trash/has been fixed - Fixed API errors that failed every turn: The issue where conversations failed every turn due to the API error "role 'system' must precede an 'assistant' message", and the issue where conversations with an advisor enabled failed every turn with API Error 400 "Input tag 'advisor_20260301'" behind proxies or gateways that do not support it, have been fixed. The latter is retried without the advisor
- Fixed failures and crashes in saved sessions: The issue where sessions failed every turn and on
/compactwhen the saved history contained malformed notifications about unloadable MCP tools has been fixed. Additionally, the crash that occurred when resuming sessions whose saved transcripts contained malformed system messages or memory save notifications without a file list has been fixed - Fixed turns starting on their own when resuming sessions: The issue where a model turn would begin without any input when resuming a session that had incomplete background agents, shells, or workflows has been fixed
- Fixed disappearing subagent messages and reports: The issues where messages sent to a background subagent that was trying to end its turn were lost in headless and SDK sessions, and where completed subagent reports were lost if the conversation was compacted before the reports were read, have been fixed
- Fixed incorrect failure reports for background shell tasks: The issue where non-zero exits that are not actually problems (e.g., grep with no matches) were reported as failures has been fixed
- Fixed auto-update for private repository marketplaces: The issue where background auto-update ignored the git credential helper, causing private repository marketplaces to be re-cloned every time or never updated, has been fixed
- Fixed Windows cleanup deleting links: The issue where background cleanup was deleting the directory symbolic links and junctions used to move folders such as
~/.claude/session-envandimage-cachehas been fixed - A quietly appreciated fix: The issue where pressing Ctrl+C or Ctrl+D twice in many dialogs (
/model,/effort,/config,/permissions, etc.) would exit Claude Code instead of closing the dialog has been fixed. Since this was the kind of issue where an operation intended to close a dialog would end the entire session, it feels like a quietly helpful fix - In addition, numerous minor bugs have been fixed in
/configcrashes, fullscreen display and key handling,/plugin//skills//mcpdisplay, voice input, self-hosted runners, the VS Code extension, Claude Code on the web, Claude Tag, and more
Breaking Changes and Deprecations
Default Model Change for Pro and Team Standard Plans
The default model for Pro and Team Standard plans has changed from Sonnet to Opus. According to the official documentation, the resolution when no model is configured is as follows.
Before (up to v2.1.278):
Pro/Team Standard with no model configured → Sonnet 5
After (v2.1.280 and later):
Pro/Team Standard with no model configured → Opus 5.5
The following is a configuration example for continuing to use Sonnet.
// ~/.claude/settings.json
{
"model": "sonnet"
}
Legacy effortLevel Not Applied to Opus 5.5
Effort levels saved before /effort became per-model are no longer applied to newly released models like Opus 5.5. Such models will start with the default value until a level is selected.
According to the official documentation, this applies to the top-level effortLevel in the user settings file, and it continues to apply to older models such as Opus 5 and Fable 5.1. Top-level effortLevel specified in project, local, managed settings, or --settings applies to all models. The default effort for Opus 5.5 is medium.
Before (up to v2.1.278):
// ~/.claude/settings.json (legacy format, applied to all models)
{
"effortLevel": "xhigh"
}
After (v2.1.280 and later):
// ~/.claude/settings.json
// Top-level effortLevel is not applied to Opus 5.5; Opus 5.5 starts with medium
// To fix the level for Opus 5.5, write it under modelSettings
{
"modelSettings": {
"claude-opus-5-5": {
"effortLevel": "high"
}
}
}
When you save a level via the /effort or /model picker, Claude Code writes it per model under this modelSettings. I have created a diagram of the official documentation's effort resolution order for Opus 5.5 (exceptions for ultracode or organization default effort are omitted).
Opus 4.7, Opus 4.8, and Fable 5 Now Follow Configured Effort
Opus 4.7, Opus 4.8, and Fable 5 no longer prioritize the release-time default effort over /effort in -p or Agent SDK, effortLevel in project/managed/--settings, or per-model levels. If you have configured a level different from the default for these models, that configuration will now be applied from v2.1.280.
The following is a configuration example.
Before (up to v2.1.278):
// .claude/settings.json (project settings)
// For Opus 4.7, Opus 4.8, and Fable 5, the release-time default effort took priority over this setting
{
"effortLevel": "medium"
}
After (v2.1.280 and later):
// .claude/settings.json (project settings)
// medium is now applied for Opus 4.7, Opus 4.8, and Fable 5 as well
{
"effortLevel": "medium"
}
Removal of Default y/n Key Bindings in Dialogs
Dialog confirmation and cancellation are now done with Enter and Esc, and y/n have been removed from the default bindings.
Before (up to v2.1.278):
Confirm: Enter or y (confirm:yes)
Cancel: Esc or n (confirm:no)
After (v2.1.280 and later):
Confirm: Enter (confirm:yes)
Cancel: Esc (confirm:no)
If you want to use y/n, assign them in keybindings.json as shown in the official documentation example.
{
"bindings": [
{
"context": "Confirmation",
"bindings": {
"y": "confirm:yes",
"n": "confirm:no"
}
}
]
}
If you created keybindings.json with /keybindings before v2.1.280, these two lines are already included and y/n will remain active until they are deleted. The official documentation also states that dialogs that display y and n as keys will accept those characters even without a binding.
Agent-type Hooks No Longer Work in PermissionRequest Hooks
Agent-type hooks are no longer executed in PermissionRequest hooks, as their responses could neither allow nor deny requests. An error is displayed guiding the user to use command-type or http-type hooks instead. The official documentation states that allowing or denying is done by command-type or http-type hooks returning a decision object.
The following is a configuration example.
Before (up to v2.1.278):
{
"hooks": {
"PermissionRequest": [
{
"matcher": "Bash",
"hooks": [
{
"type": "agent",
"prompt": "Please check whether this command should be allowed. $ARGUMENTS"
}
]
}
]
}
}
After (v2.1.280 and later):
{
"hooks": {
"PermissionRequest": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "/path/to/check-permission.sh"
}
]
}
]
}
}
git in Self-Hosted Runner Lifecycle Hooks
In self-hosted runners, git inside lifecycle hooks now ignores hook folders and programs specified in the runner's shared git files. Using local paths or git:// remotes there now requires GIT_ALLOW_PROTOCOL.
Before (up to v2.1.278):
git inside lifecycle hooks could use local paths and git:// remotes without additional configuration
After (v2.1.280 and later):
# Example for using local paths or git:// remotes in git inside lifecycle hooks
GIT_ALLOW_PROTOCOL=file:git:https:ssh
GIT_ALLOW_PROTOCOL is a git environment variable. According to the git manual (git(1), protocol.allow in git-config(1)), protocols are specified colon-separated, and protocols not listed become unavailable. file includes local paths. Therefore, https and ssh are also listed in the example above. Since the official Claude Code documentation does not appear to describe how to pass this to the runner, please configure it according to your environment.
Reversion of ctrl+l/cmd+k in Fullscreen Mode
The behavior of ctrl+l/cmd+k clearing the transcript display in fullscreen mode (added in v2.1.260) has been reverted, and it once again redraws the screen.
Before (v2.1.260 to v2.1.278):
ctrl+l / cmd+k → Clear transcript display
After (v2.1.280 and later):
ctrl+l / cmd+k → Redraw screen
Trying Out Opus 5.5
I verified that Opus 5.5, which has become the default Opus model, is actually used by checking the JSON output of claude -p. I tested two cases: specifying --model opus and not specifying a model. In the test environment, no model is specified in the user settings and no model-related environment variables are set. Both were run in an empty working directory.
% claude --version
2.1.280 (Claude Code)
When specifying --model opus:
% claude -p --max-turns 1 --model opus --output-format json "What is 1 + 1? Answer briefly." > out1.json
% jq '.modelUsage | keys' out1.json
[
"claude-opus-5-5"
]
When no model is specified:
% claude -p --max-turns 1 --output-format json "What is 1 + 1? Answer briefly." > out2.json
% jq '.modelUsage | keys' out2.json
[
"claude-opus-5-5[1m]"
]
Opus 5.5 was used in both cases. I also checked the contents of modelUsage.
% jq '{result, is_error, num_turns, total_cost_usd, modelUsage}' out1.json
{
"result": "2",
"is_error": false,
"num_turns": 1,
"total_cost_usd": 0.1703666,
"modelUsage": {
"claude-opus-5-5": {
"inputTokens": 2,
"outputTokens": 91,
"cacheReadInputTokens": 10813,
"cacheCreationInputTokens": 20797,
"webSearchRequests": 0,
"costUSD": 0.1703666,
"contextWindow": 1000000,
"maxOutputTokens": 128000,
"thinkingTokens": 88,
"canonicalModel": "claude-opus-5-5",
"provider": "firstParty",
"costBasis": "list"
}
}
}
% jq '{result, is_error, num_turns, total_cost_usd, modelUsage}' out2.json
{
"result": "2",
"is_error": false,
"num_turns": 1,
"total_cost_usd": 0.1564074,
"modelUsage": {
"claude-opus-5-5[1m]": {
"inputTokens": 2,
"outputTokens": 3,
"cacheReadInputTokens": 12377,
"cacheCreationInputTokens": 19233,
"webSearchRequests": 0,
"costUSD": 0.1564074,
"contextWindow": 1000000,
"maxOutputTokens": 128000,
"thinkingTokens": 0,
"canonicalModel": "claude-opus-5-5",
"provider": "firstParty",
"costBasis": "list"
}
}
}
In both cases, canonicalModel was claude-opus-5-5, contextWindow was 1000000, and maxOutputTokens was 128000.
The modelUsage key notation differed: claude-opus-5-5[1m] for the default launch and claude-opus-5-5 for --model opus. Since canonicalModel is claude-opus-5-5 in both cases, it seems safer to aggregate by canonicalModel rather than the modelUsage key when aggregating logs or costs.
Recalculating costUSD from Unit Prices
When costUSD is calculated from the unit prices in the CHANGELOG (input $4, output $20, cache read $0.20) and the 1-hour cache write unit price for Opus 5.5 on the official pricing page ($8), both results matched costUSD. All unit prices are per million tokens.
| Category | Unit Price | --model opus |
No model specified |
|---|---|---|---|
| Input | $4 | 2 | 2 |
| Output | $20 | 91 | 3 |
| Cache read | $0.20 | 10,813 | 12,377 |
| Cache write (1 hour) | $8 | 20,797 | 19,233 |
| Calculated result | $0.1703666 | $0.1564074 | |
costUSD |
$0.1703666 | $0.1564074 |
Calculating with the 5-minute cache write unit price ($5) gives $0.1079756 and $0.0987084, which do not match. This suggests that the 1-hour cache write was used in these requests.
Closing Thoughts
This update was primarily centered on the addition of Opus 5.5 and the accompanying changes to default model and effort handling. While most of the 114 changes are fixes, there are also 7 breaking changes that alter default behavior—in particular, the dialog y/n keys and the legacy effortLevel format are easy to be affected by without noticing. It might be worth checking your current settings with /model and /effort once after updating.
Whether you want to try Opus 5.5 or you're on Pro or Team Standard where the default model is changing, why not update and give it a try?
References
