Claude Media
CLAUDE_CODE_THRIFTY_SONICとは — Bash編集で/rewindが効かない問題の止め方

CLAUDE_CODE_THRIFTY_SONICとは — Bash編集で/rewindが効かない問題の止め方

Auto ModeがファイルをBashのsedやheredocで書き換え、/rewindが静かに失敗する挙動と、CLAUDE_CODE_THRIFTY_SONICでの止め方をGitHub issueの一次情報でまとめます。

CLAUDE_CODE_THRIFTY_SONICは、Auto ModeがファイルをBashのsedやheredocで編集する挙動を止めるための、公式ドキュメントに載っていない環境変数です。GitHub issue #88041と#87575によると、この挙動下で行われた編集はチェックポイントに記録されず、/rewindが成功と表示されながら実際には何も戻さないケースが報告されています。

Auto ModeがファイルをBash経由で書き換える仕組み

Auto Modeが有効なセッションでは、条件がそろうとシステムプロンプトに次の指示が追加で挿入されます。issueのコメントで複数人が独立に確認した文面です。

Do your work through the Bash tool wherever it can accomplish the job: read files with cat, head, or sed -n, search with grep and find, and make file changes with sed, heredocs, or short scripts, rather than using the dedicated Read, Edit, or Write tools. Fall back to a dedicated tool only when Bash genuinely cannot do the job.

この指示自体はsedgrepを使うなという普段のBashツール説明を上書きするもので、Claude Codeのauto modeが公式に説明している分類器(classifier)によるアクション審査とは別物です。分類器は危険な操作を止める仕組みですが、この指示はそもそもどのツールで編集するかを誘導するだけなので、分類器が承認した後の話として動きます。

挿入を制御しているのはbashFirstという内部フラグで、セッションにBashとEdit・Writeの両方があり、かつautoモードかbypassPermissionsモードのときに条件を満たします。フラグの実体はCLAUDE_CODE_THRIFTY_SONICという環境変数で、値は3状態です。"forced"なら常にオン、"none"なら常にオフ、"cohort"ならA/Bテストの割り当てに従います。環境変数が未設定の場合はこのcohort判定にフォールバックするため、何も設定していないこと自体が「オフ」を意味しません。値を明示的に"0"にしたときだけ、判定はcohortより先に返り、確実にオフになります。

どのモデル・権限モードの組み合わせで起こるか

この指示が付くバージョンは、issueのコメント群が独立に計測しています。バイナリ内の文字列はv2.1.219には存在せず、v2.1.234で確認されました。以後v2.1.241v2.1.247v2.1.251でもゲートの構造は変わらず残り続けています。

付くかどうかはモデルと権限モードの組み合わせにも左右されます。v2.1.247で実際にセッションへ送られるプロンプトを傍受した計測では、次の結果が出ています。

モデルpermission-mode削除防止の安全指示Bash優先の指示
Sonnet 5permission-modeauto削除防止の安全指示残るBash優先の指示cohort次第
Opus 5permission-modeauto削除防止の安全指示消えるBash優先の指示付く
Opus 5permission-modebypassPermissions削除防止の安全指示消えるBash優先の指示付く
いずれもpermission-modedefault削除防止の安全指示残る(注入なし)Bash優先の指示付かない

Opus 5をautoまたはbypassPermissionsで使うと、rm -rfgit resetの前にgit statusを確認するよう促す安全指示ごと欠落し、その代わりにBash優先の指示だけが残ります。安全側の指示と危険側への誘導が同じ分岐で入れ替わっている点は、この計測の中でも懸念点として指摘されています。

Fable 5.1では条件がさらに広がりました。v2.1.257以降、Fable 5.1に割り当てられる内部バンドルは、Bash優先フラグを"forced"にする条件の一つになっています。Auto modeかbypassPermissionsで、BashとEdit・Writeがあり、環境変数が未設定なら、cohort判定を待たずに指示が付きます。Opus 5向けの別バンドルも同じバージョンで同様に"forced"扱いになるため、Fable 5.1だけが原因ではありません。

回避策として--permission-mode bypassPermissionsを明示すれば安全という報告がv2.1.238ではありましたが、v2.1.251ではこの条件が反転し、同じフラグがむしろ指示を発動させる側に変わっています。バージョン間でトリガーの向きが入れ替わるため、特定バージョンで確認した回避策を別バージョンでそのまま信用しない方が安全です。

Bash経由の編集で失われる保護機能

/rewindが効かなくなる点は後述するとして、issueのコメント群が挙げている副作用はそれだけではありません。PreToolUsePostToolUseフックのうち、EditWrite限定のマッチャーを指定したものは一切発火しません。ある報告では、lintと型チェックとテストと重複検出をまとめたプリコミットのバッテリーがEdit|Writeのフックから変更ファイル一覧を受け取る設計になっており、Bash経由の編集はこのバッテリーに「採点対象ファイルゼロ」として素通りしていました。バッテリー自体はエラーなく終了するため、対象ゼロと全件合格の区別がつかず、11日間気づかれなかったと報告されています。

同じ理屈で、EditWriteのパスを対象にしたallowdenyの権限ルールも素通りします。さらにsedが対象箇所にマッチしなければコマンドは正常終了(exit 0)するため、実際には何も変わっていないのに編集は成功したとClaudeが報告するケースもあります。

サブディレクトリのCLAUDE.mdが読み込まれる条件も同じ理屈で崩れます。読み込みはパスベースで、ReadEditWriteがそのパスに触れたときだけ発火し、Bashでcatしただけでは登録されません。ネストした.claude/rulesについても同様の報告があり、Bash経由の編集が続くセッションではサブディレクトリのルールが静かに無視されます。

視覚的な影響も無視できません。差分表示と読み取り済みチェックによる上書き防止は、いずれもEdit・Writeツールの機能で、heredocやcat > fileはどちらも経由しません。全盲のユーザーからは、差分こそが変更内容を知る唯一の手段であり、これが失われると変更に気づく手段そのものがなくなるという報告が上がっています。

計測されたコスト影響もあります。同じジャッジング用エージェントを比較した報告では、指示が付く前後でターン数・キャッシュ読み取りトークン数がおよそ倍増しました。

期間ターン数Readコールキャッシュ読み取り
2026年8月18日より前ターン数33〜69Readコール1〜11回キャッシュ読み取り300万〜1,000万トークン
2026年8月18日以降ターン数50〜133Readコール0〜2回キャッシュ読み取り700万〜2,700万トークン

原因はファイルを一度にReadせず、headsed -nで少しずつ読み返す振る舞いに切り替わったことです。出力結果は変わらないままターン数だけが増えるため、エラーは出ずに課金だけが積み上がります。

もう一つ、heredocを使う編集は別のバグと組み合わさると安全性が下がるという報告もあります。Bashツールには、コマンド文字列を正規表現で判定して標準入力のガードを外す既知の不具合があり、heredocの<<は毎回この判定に一致します。ガードが外れた状態で標準入力を読むコマンドが混じると、そのプロセスは120秒のタイムアウトまで固まります。ある利用者の計測では、Bash経由のファイル書き込みの割合が7月の21%から9月に74%まで上がるのに合わせて、ガードが外れた呼び出しの割合も20.4%から28.6%まで上昇しました。

/rewindが「成功」と表示されるのに戻らない理由

Claude Codeのrewindコマンドが記録しているのは、Claudeのファイル編集ツールによる変更だけです。rmmvのような単純なbash操作が対象外なのはもともと知られていましたが、Auto ModeがEdit・Write自体をBash経由に振り替えると、普通のファイル編集までこの対象外の側に落ちてしまいます。

issue #87575の報告では、複数ファイルを編集させたあと/rewindで戻したにもかかわらず、git statusを確認すると変更がそのまま残っていたと記録されています。/rewindのメニュー自体はエラーを出さず、「コードを復元しました」という表示だけが進みます。ユーザーが変更は取り消されたと信じて作業を続け、後から古いコードの上に新しい変更を積み重ねていた、という実害も報告されました。

編集手段が混在したセッションではさらに紛らわしいことが起きます。1ファイルをEditで、別の1ファイルをsed -iで編集したセッションで/rewindを試した報告では、メニューはコード復元の選択肢を通常どおり表示し、実行後も「成功」と出ました。ところが実際に戻っていたのはEditで編集したファイルだけで、sed -i側の変更は残ったままでした。1回でもEditを呼んでいると、メニューは正常に見えてしまいます。この挙動はv2.1.221の時点で報告されています。

CLAUDE_CODE_THRIFTY_SONICで止める方法

止める方法は環境変数CLAUDE_CODE_THRIFTY_SONIC"0"に固定することです。シェルのexportは自分の対話セッションにしか効かないため、チーム全体やヘッドレス実行にも効かせたい場合はsettings.jsonenvに書きます。

{
  "env": {
    "CLAUDE_CODE_THRIFTY_SONIC": "0"
  }
}

この設定はv2.1.237v2.1.241v2.1.247v2.1.257のそれぞれで有効と確認されています。注意点が2つあります。まず、環境変数はセッション開始時にしか読まれません。実行中のセッション内で気づいて設定しても、その回のセッションには反映されません。実行中にShift+Tabでauto modeから抜けても、すでに挿入されたBash優先の指示はそのセッションに残ったままです。次に、値は文字列の"0"である必要があります。"disabled"のような未登録の文字列は判定不能として扱われ、結局cohort判定に落ちてしまいます。

一時的に1回だけ確認したい場合は、次のようにコマンドの直前に付けても同じ効果です。

CLAUDE_CODE_THRIFTY_SONIC=0 claude

disableAutoMode設定でauto mode自体を無効化しても、この指示は止まりません。~/.claude/settings.json・プロジェクトのローカル設定・--settings引数のいずれにdisableAutoModeを置いても、Opus 5とbypassPermissionsの組み合わせでは指示が挿入され続けたという報告があります。auto modeという選択肢を消す設定と、auto mode内でのツール選択を誘導する指示は、別の仕組みで動いています。

環境変数を触れない管理環境では、acceptEditsモードに切り替えたうえでpermissions.allowBashSkillを許可する運用が、指示が付かない代替として報告されています。効果範囲はauto modeとほぼ同じままコストは基準値に戻るとされていますが、PermissionDenied hookでauto mode拒否時の再試行を制御するような、auto mode固有のフック連携は使えなくなる点はトレードオフです。CLAUDE.mdへの注意書きだけで上書きしようとする対処法は、効いたという報告と効かなかったという報告の両方があり、システムプロンプトの指示に対する優先度が不安定なため、単独の対策では効果が安定しません。

v2.1.269で追加されたbashEditDiffEnabledはどこまで直すか

v2.1.269(2026年9月11日リリース)のchangelogには、「Bashツールがファイル編集を担ったとき、変更内容の差分をBashツールの結果に追加する(bashEditDiffEnabled設定)」という項目が入りました。Bash経由の編集がそのまま起きても、少なくとも差分は見えるようになる変更です。

ただしchangelogの記述はこの1行だけで、/rewindのチェックポイント追跡やEdit|Write限定のフックが発火するようになったとは書かれていません。GitHub issue自体も、2026年9月9日に投稿された最後のコメント以降、解決を報告する投稿はありません。差分表示という見える化と、チェックポイント・フックという裏側の記録は別の仕組みなので、bashEditDiffEnabledが入った後もこの記事で扱った/rewindの失敗は解消されていないと見るのが妥当です。同じ理屈で発火しなくなるEdit|Write限定のフックと権限ルールについても、チェックポイントの制約で解説しているBashによる変更が復元対象外になる仕様と根は共通しています。

まとめ

Auto Modeは条件がそろうと、ファイル編集をEdit・WriteでなくBashのsedやheredocへ誘導する指示をシステムプロンプトに追加します。この指示下で行われた編集は/rewindのチェックポイントに記録されず、Edit|Write限定のフックも発火しません。止めるにはCLAUDE_CODE_THRIFTY_SONIC"0"にしたsettings.jsonをセッション開始前に用意しておく必要があり、disableAutoModeやCLAUDE.mdへの注意書きでは代用できません。v2.1.269で差分表示は改善されましたが、チェックポイント側の追跡が直ったとはchangelogに書かれておらず、破壊的な操作の前にgit statusとコミットを挟んでおくと、戻らなかったときに気づけます。

この記事を共有:XはてブLinkedIn