Claude Code v2.1.301 Major Updates - Auto Mode Determination Now Distinguishable with OpenTelemetry

Claude Code v2.1.301 Major Updates - Auto Mode Determination Now Distinguishable with OpenTelemetry

Claude Code v2.1.301 released. 51 changes including enhanced OpenTelemetry support and binary file detection fixes. Today I tested the Read binary detection fix.
2026.10.16

This page has been translated by machine translation. View original

This is Ishikawa from the Cloud Business Division. Claude Code v2.1.301 (released October 15, 2026) has been released. I feel this is a release that includes changes relevant to those monitoring Claude Code with OpenTelemetry and those creating mods. Today, I tried out the Read binary detection fix.

The previous update article is here.

https://dev.classmethod.jp/articles/20261015-cc-updates-v2-1-300/

Update Summary

v2.1.301 includes 51 changes. In the official documentation changelog, these are divided into 8 Added, 2 Changed, 4 Improved, and 37 Bug fixes. In this article, I reclassify them by content as 36 fixes, 8 new features, 3 improvements, 2 breaking changes, 1 security, and 1 performance.

New features relate to OpenTelemetry tool_decision event attributes, vim mode, mod API, and VS Code extension. Fixes include many related to vim mode, Self-hosted runner, VS Code extension, and model switching and compaction. The 2 breaking changes are both behavioral changes to the mods API.

Additionally, two major updates were announced on the official X account. First, Claude Platform's Opus 5.5 fast mode has exited research preview, is up to 2.5x faster, and is available at $8 / $40 per million tokens. Second, Code Preview has become generally available for Claude Team and Enterprise plans.

https://x.com/ClaudeDevs/status/2110825294655562048

https://x.com/ClaudeDevs/status/2110866210573386065

Notable Updates

Recording auto mode classifier decisions in tool_decision events (New Feature)

classifier_verdict and permission_mode have been added to the OpenTelemetry tool_decision event. This allows distinguishing between decisions made by the auto mode classifier and decisions made by permission rules.

classifier_category has also been added. When OTEL_LOG_TOOL_DETAILS=1 is set, the name of the built-in rule matched when the classifier blocks an action is recorded.

Note that as of October 16, 2026, these three attributes are not yet listed in the tool_decision event attribute list on the official documentation's Monitoring page. This article is based on the CHANGELOG entries.

For administrators operating in auto mode while collecting tool allow/deny decisions via OpenTelemetry, I feel this adds useful information for rule review and auditing, as classifier decisions and permission rule decisions can now be aggregated separately.

Deletion confirmation for worktrees with unpushed commits (Bug Fix)

A bug was fixed where worktrees created by WorktreeCreate hooks were being deleted without confirmation on exit, even when there was a possibility of unpushed commits remaining.

For those operating with worktrees created by WorktreeCreate hooks, I feel this is a fix worth applying promptly, as it prevents the situation of losing unpushed commits without confirmation.

Handling of Grep / Glob search failures (Bug Fix)

A bug was fixed where Grep and Glob were reporting "no matches" when the search program unexpectedly failed before returning results. It now returns an error indicating that the search failed.

I view this as a fix related to the reliability of work results, as treating a search failure as "no matches" could cause Claude to proceed as if existing code doesn't exist.

Read tool handling of binary files (Bug Fix)

A bug was fixed where the Read tool was reading binary files such as .xlsm, .parquet, .epub, and .heic as text. The behavior is verified in the "Tried It Out" section below.

I feel this is a fix closely relevant to those using Claude Code in repositories that contain data files such as .parquet and .xlsm.

Displaying hook plugin/skill in permission prompts (Security)

A bug was fixed where the permission prompt shown when a plugin or skill hook returns ask did not display which plugin or skill the hook belonged to.

In environments with multiple plugins and skills installed, I feel it becomes easier to decide whether to grant permission when you can see which hook is requesting confirmation.

Update Details

New Features

  • classifier_verdict, permission_mode, and classifier_category have been added to the OpenTelemetry tool_decision event (see Notable Updates).
  • CLAUDE_CODE_RETRY_WATCHDOG_MAX_USAGE_LIMIT_WAIT_MS has been added for unattended retry mode (CLAUDE_CODE_RETRY_WATCHDOG). When usage limits are reached, if the time until the limit resets is too long, the request will terminate without waiting.
  • The % motion has been added to vim mode. It allows jumping to matching brackets and can be used alone or combined with d/c/y.
  • rows has been added to mod Input. This enables displaying multi-line text fields in the terminal; Enter submits, and Shift+Enter or a backslash immediately before Enter creates a new line.
  • OpenTelemetry tracing guidance has been added to the claude-api skill. This includes how to configure trace destinations via the ant CLI.
  • [VSCode] LaTeX math expressions can now be displayed in Claude's responses. Supports $$ blocks, multi-line \[ … \] blocks, and inline $…$ and \(…\).
  • [VSCode] A "Get more usage" link has been added to the usage limit banner for Pro and Max plans in VS Code and JetBrains panels.

Improvements & Performance

  • Improved switching to models with smaller context windows. Conversations that are too long for the new model are now summarized by the previous model before switching.
  • Improved rendering performance during long-running subagent work. Progress display now updates incrementally rather than reprocessing everything on each render.
  • In artifacts, the band above sticky headers on pages created by Claude is now filled in. On mobile apps, scrolled text will no longer appear there.
  • In mods, for VS Code, desktop apps, and mobile apps, trees rendered above question dialogs can now include Markdown and display up to 48 lines. Terminal remains plain text with 12 lines.

Security

  • A bug was fixed where the permission prompt shown when a plugin or skill hook returns ask did not display which plugin or skill the hook belonged to (see Notable Updates).

Fixes (Major Items)

  • Fixed issue where worktrees created by WorktreeCreate hooks were deleted without confirmation: They were being deleted on exit without confirmation even when there was a possibility of unpushed commits remaining (see Notable Updates).
  • Fixed issue where Grep / Glob reported search failures as "no matches": When the search program failed before returning results, it now returns an error indicating the search failed (see Notable Updates).
  • Fixed issue where the Read tool read binary files as text: This affects .xlsm, .parquet, .epub, .heic, and similar files (see Notable Updates).
  • Fixed issue where fable / best model aliases resulted in errors: When the latest Fable model was not available in the organization, an error occurred with the Anthropic API. It now retries once with the previous Fable model.
  • Fixed issue where users were signed out after short-duration commands: Short-duration commands such as claude auth status and claude plugin list that terminated mid-token-refresh were causing sign-in refresh timeouts and unexpected sign-outs.
  • Fixed issue where workflow agents reported success even when skipping steps: Workflow agents that read harness notes saying "the task text does not have user permissions" were skipping their own steps, yet execution was still reported as successful.
  • Fixed issue where invoking skills/commands with many argument names would stall: Invoking skills or commands with a very large number of or very long argument names would stall for several seconds. Argument names are now embedded up to the first 64, with each limited to 64 characters.
  • Fixed issue where tool calls interrupted by mid-turn messages were treated as denials: When a tool call was interrupted by a message sent mid-turn during a permission check, it was being reported to the model as user-denied.
  • Fixed issue where credits were consumed without confirmation when switching models: When switching to a model with a smaller context window, usage credits were sometimes consumed for summarization by the previous model without prior confirmation.
  • Fixed issue where conversations were repeatedly compacted via LLM gateway: When using an LLM gateway that returns a different model name in the response than the requested model, conversations were being repeatedly compacted using an unselected model.
  • Fixed issue where skills were no longer passed to the model after /rewind: After using /rewind, the list of skills was no longer being passed to the model.
  • Fixed issue where problematic conversations in VS Code extension were reopened on every reload: Conversations that caused the panel to crash or freeze were being reopened every time it reloaded.
  • In addition, numerous minor bugs have been fixed in vim mode, Self-hosted runner, VS Code extension, terminal display, compaction display, and more.

Breaking Changes (For Those Using the mods API)

Two behavioral changes have been made to the mods API. These affect those creating mods.

When mod hook .catch handlers are called

A mod hook's .catch handler will now only be executed when the hook throws an exception or times out. Events that occur within the scope of the hook's own invocation will skip that hook without calling .catch.

Below is an example of .catch from the official documentation's "Handle a hook that fails" section. guard is the hook function.

// on returns a registration, and .catch attaches a handler to that one hook
on('tool.call', { tool: 'Bash' }, guard).catch(async ($, e, next) => {
  // guard had already called next, so return what came back
  if (next.called) return next(e)
  // next.error.kind says why the handler was asked, such as 'throw' or 'timeout'
  return { deny: 'The command guard failed, so this command was not run: ' + next.error.kind }
})

As of October 16, 2026, the Mods reference lists next.error.kind values inside .catch handlers as throw and timeout, plus re-entry (since v2.1.292) for cases where the hook is skipped because an event occurred from inside a mods API call within the hook itself. The v2.1.301 change can be read as making .catch not be called in this re-entry scenario (my interpretation).

When .catch is called ~v2.1.300 v2.1.301~
Hook threw an exception (throw) Called Called
Hook timed out (timeout) Called Called
Event occurred within the hook's own invocation scope Called (next.error.kind is re-entry. My interpretation) Not called; hook is skipped

Resolved value of mod's $.env.set

Mod $.env.set now resolves with {} when a variable has been successfully set or deleted, and with { deny } indicating the reason when no write was performed. $.env.set is a method that sets environment variables for Claude Code and the commands and MCP servers that Claude Code launches afterward (as described in the official documentation).

Below is a usage example (arguments omitted).

// Usage example: checking the resolved value in v2.1.301 and later
const result = await $.env.set(/* ... */)
if (result.deny) {
  // Contains the reason the write was not performed
}
$.env.set result ~v2.1.300 v2.1.301~
Variable was successfully set or deleted Not documented in CHANGELOG Resolves with {}
No write was performed Not documented in CHANGELOG Resolves with { deny } indicating reason

Tried Out the Read Binary Detection Fix

The Read tool now returns an error instead of reading binary files such as .xlsm, .parquet, .epub, and .heic as text. This means meaningless character strings will no longer enter the context, and the risk of Claude misreading data content is also reduced. Since the error message instructs using a skill or shell command, I expect the flow will naturally lead to re-reading with DuckDB or similar tools.

I feel this is a fix closely relevant to those using Claude Code in repositories that contain data files such as .parquet and .xlsm.

Today, I will confirm that the Read tool does not read .parquet files as text. First, I create a working directory and create a .parquet file with DuckDB.

% mkdir binary_read && cd binary_read

% duckdb -c "COPY (SELECT range AS id, 'row_' || range AS name FROM range(5)) TO 'sample.parquet' (FORMAT parquet)"
file sample.parquet
sample.parquet: Apache Parquet

Next, I use claude -p to request reading this file with the Read tool. The output is in stream-json format, and I use jq to extract only the tool call (tool_use) and result (tool_result) lines.

% claude -p --max-turns 1 --output-format stream-json --verbose "Please read sample.parquet with the Read tool" | jq -c '.message.content[]? | select(.type=="tool_use" or .type=="tool_result") | {type, name, is_error, content}'
{"type":"tool_use","name":"Read","is_error":null,"content":null}
{"type":"tool_result","name":null,"is_error":true,"content":"<tool_use_error>This tool cannot read binary files. The file appears to be a binary .parquet file. Use a skill for this file type if one is available, or a shell command or script that can read the format.</tool_use_error>"}

Claude called the Read tool, and the result was an error with is_error: true. The error message states that binary files cannot be read, that the file was determined to be a binary .parquet file, and that a skill, shell command, or script capable of handling the format should be used.\

In data analysis repositories, .parquet and .xlsm files are often placed in the same directory as code, and if these were read as text, meaningless character strings would enter the context. In v2.1.301, they are returned as errors with suggestions for alternative reading methods such as skills or shell commands, making it easier for Claude to choose its next course of action.

In Closing

For organizations running with auto mode as the default, I feel the ability to distinguish classifier and permission rule decisions in OpenTelemetry tool_decision events is a significant change from an auditing perspective. Among the fixes, notable ones related to the reliability of work results stood out, such as worktree deletion with unpushed commits and handling of Grep / Glob failures.

For those monitoring Claude Code with OpenTelemetry, those using WorktreeCreate hooks, and those creating mods, I encourage you to update and try it out.

References

https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md

https://code.claude.com/docs/en/changelog

https://dev.classmethod.jp/articles/20261015-cc-updates-v2-1-300/


Claudeならクラスメソッドにお任せください

クラスメソッドは、Anthropic社とリセラー契約を締結しています。各種製品ガイドから、業種別の活用法、フェーズごとのお悩み解決などサービス支援ページにまとめております。まずはご覧いただき、お気軽にご相談ください。

サービス詳細を見る

Share this article

AI白書