Claude Media
thinking block mismatchエラーの原因とrewindでの直し方

thinking block mismatchエラーの原因とrewindでの直し方

Claude Codeで会話履歴が壊れると出るtool use / thinking blockの不整合エラー。3つの表示パターンと原因、rewindでの復旧手順をまとめます。

Claude Codeの拡張思考モードでツール呼び出し中に会話が中断すると、次のターンで API Error: 400 が返り作業が止まることがあります。原因は会話履歴に含まれる tool_use / tool_result / thinking ブロックの並び順がAPIの想定と食い違う状態です。3種類の表示パターンと、/rewind を使った復旧手順をまとめます。

thinking block mismatchとはどんなエラーか

Claude Codeはツール呼び出しの結果と拡張思考の内容を、会話履歴の中に tool_usetool_resultthinking という3種類のブロックとして保持しています。ツール呼び出しの途中でセッションを中断したり、ターンを編集して巻き戻したりすると、この並び順がAPIの期待する形と一致しなくなります。結果として、次のリクエストが 400 エラーで即座に拒否されます。

公式エラーリファレンスは次の3つの表示を同じ原因として扱います。

  • API Error: 400 due to tool use concurrency issues. Run /rewind to recover the conversation.
  • API Error: 400 ... unexpected \tool_use_id` found in `tool_result` blocks`
  • API Error: 400 ... thinking blocks ... cannot be modified

文言は違っても意味は同じです。履歴の中の tool_usetool_resultthinking の並びが、APIが期待する形式と噛み合わなくなっている状態を指します。

なぜ会話履歴が壊れるのか

典型的なきっかけは2つあります。ひとつはツール呼び出しの途中でのセッション中断です。Claude Codeがツールを実行してその結果を受け取る前に接続が切れたり、ユーザーが強制終了したりすることがあります。すると tool_use だけが残り、対応する tool_result が欠けた状態で履歴が保存されます。もうひとつはターンの編集です。過去のプロンプトを書き換えて再送すると、その後に続いていたツール呼び出しや思考ブロックの連鎖が宙に浮きます。

拡張思考を使っているセッションでは thinking ブロックも履歴に含まれるため、影響を受ける対象がさらに広がります。APIは思考ブロックの内容を後から書き換えられない仕様なので、途中で会話が分岐すると thinking blocks ... cannot be modified という形でエラーが表面化します。この制約は拡張思考の仕組み上の前提であり、Claude Code側の不具合ではありません。

Opus 4.7 / 4.8ではバージョンが原因のこともある

Opus 4.7またはOpus 4.8を使っている場合、Claude CodeのバージョンがV2.1.156より前だと、通常のツール利用中にもこのエラーが発生することがあります。この場合は /rewind を実行しても状態がクリアされません。会話履歴自体は壊れていないのに、Claude Code側のバグでAPIとのやり取りが不整合を起こしてしまうためです。まず次のコマンドで更新してから、改めて /rewind を試します。

bash claude update ​

v2.1.156以降ではこの経路の不具合は解消されており、通常のツール利用でこのエラーが出ることはなくなりました。それでも遭遇した場合は、以下の復旧手順だけで対応できます。

復旧手順 — /rewindで壊れた地点まで戻る

対処は一貫して同じです。壊れたターンより前のチェックポイントまで会話を巻き戻し、そこから再開します。

text /rewind ​

プロンプト入力欄が空の状態で Esc を2回押しても同じメニューが開きます。Claude Codeはユーザーの各プロンプト送信時点を自動的にチェックポイントとして記録しているため、/rewind のメニューにはセッション内で送った各プロンプトの一覧が並びます。壊れる直前のプロンプトを選び、次のいずれかを選択します。

選択肢効果使うタイミング
Restore code and conversation効果コードと会話の両方を巻き戻す使うタイミングツール呼び出しの結果ごと状態を戻したいとき
Restore conversation効果会話だけ巻き戻し、コードは現状維持使うタイミングファイル変更は保持したまま履歴だけ直したいとき
Restore code効果ファイル変更だけ取り消し、会話は維持使うタイミング会話の流れは壊れておらずコード変更だけ戻したいとき

セッションを一度終了して --continue--resume で再開した場合も、チェックポイントは会話と一緒に保存されているため /rewind は引き続き使えます。巻き戻した地点のプロンプトは入力欄に復元されるので、そのまま送り直すか内容を調整してから再送します。

元のセッションを残したまま試したいときは/branch

/rewind は同じセッションの中で過去のチェックポイントに戻る操作です。一方で「壊れる前の状態は残しつつ、そこから別のアプローチを試したい」場合は /branch が向いています。

text /branch ​

/branch はその時点までの会話をコピーして新しいセッションに切り替え、元のセッションはディスク上でそのまま残ります。名前を省略すると会話の最初のプロンプトから自動的に名付けられます。コマンドラインからは claude --continue --fork-sessionclaude --resume --fork-session でも同じことができます。

ただし /branch は会話履歴をコピーするだけです。コピー元の履歴がすでに tool_use / thinking ブロックの不整合を抱えている場合、新しいブランチにも同じ不整合が引き継がれます。壊れたターンより前で分岐しない限りエラーは再発するため、/rewind でチェックポイントを選ぶときと同様に、フラグが立つ前の地点を選ぶ必要があります。元のセッションへは /resume <元の名前> でいつでも戻れます。

セッションを再開したときにこのエラーが再発する理由

--continue--resume でセッションを再開すると、ツール呼び出しとその結果を含む会話履歴が丸ごと復元されます。壊れた tool_use / tool_result / thinking の並びもそのまま復元対象に含まれます。そのため何もせずに再開しただけでは、同じ400エラーが再びリクエスト時に返ってきます。再開後にまず行うべきは通常のプロンプト送信ではなく、/rewind で壊れる前のチェックポイントまで戻る操作です。

この対処はCLI・Desktop・Web版のどれでも共通か

/rewind を含むエラー対処のコマンドは、CLI・Desktop app・Claude Code on the webのいずれでも共通です。3つの利用形態はいずれも同じClaude Code CLIをラップしているため、表示されるエラーメッセージと復旧コマンドは変わりません。ラッパー固有のエラー(起動プロセス自体が異常終了する場合など)は別扱いです。tool_use / thinking ブロックの不整合はモデルとのやり取りの層で起きるため、どの利用形態でも同じ /rewind 操作で復旧します。

非対話モード(-p)では別の対処が必要

/rewind は対話セッション専用のメニュー操作で、非対話モード(-p フラグ)では使えません。スクリプトやCIから -p でClaude Codeを呼び出している場合にこのエラーに遭遇したら、--continue を付けずに新しいセッションから実行し直します。壊れた tool_use / tool_result / thinking の並びが残った履歴をそのまま引き継がないことが重要です。

チェックポイントには限界もある

/rewind はClaude Codeのファイル編集ツールが加えた変更だけを追跡します。rmmv のようなbashコマンドでのファイル操作は記録の対象外なので、巻き戻しても復元されません。また、Claude Codeが保持するファイルスナップショットは1セッションあたり直近100件のチェックポイントまでです。それより古いチェックポイントを破棄すると、他のチェックポイントから参照されなくなったスナップショットは削除されます。ただし各ファイルの最初のスナップショットだけは、VS Code拡張がセッション内差分の基準として使うため例外的に残ります。チェックポイントはセッションと一緒に保存され、既定では30日で削除されます(cleanupPeriodDays 設定で変更可能)。長期保存が前提の作業では、この期限も踏まえて履歴に頼りすぎない運用が安全です。

よくある質問

/rewindを実行しても直らないときは何を確認すればよいか

まずClaude Codeのバージョンを確認します。Opus 4.7 / 4.8でv2.1.156より前のバージョンを使っている場合はこのエラー自体を引き起こしうるバグが残っているため、claude update で更新してから再試行します。更新済みでも解消しない場合は、/rewind で選ぶチェックポイントをさらに前に戻すか、/clear で会話を打ち切って新しいセッションから作業をやり直します。

エラーメッセージの3パターンに対処の違いはあるか

ありません。3つの文言はいずれも、履歴内のブロック不整合という同じ根本原因の別表現です。どの文言が出ても /rewind での巻き戻しが共通の対処になります。

エラーが出た直後にそのままメッセージを送り直すとどうなるか

改善しません。会話履歴に残っている tool_use / tool_result / thinking の並びの不整合そのものは、新しいメッセージを送っただけでは解消されないためです。同じリクエストが再びAPI側で400エラーとして拒否されます。まず /rewind で壊れる前のチェックポイントまで戻ってから送り直す必要があります。

/rewindと/branchはどちらを使うべきか

同じセッションの中で壊れる前の状態に戻して作業を続けたいだけなら /rewind で十分です。一方、壊れる前の会話は保存したまま別の切り口も試したい場合や、複数の対処法を並行して検証したい場合は /branch で新しいセッションに分岐させます。どちらもコピー元・巻き戻し先が壊れたターンより前である必要がある点は共通です。

拡張思考を使っていないセッションでも起きるか

起きます。tool_usetool_result の不整合だけでも同じ400エラーになります。ただし拡張思考を有効にしているセッションでは thinking ブロックの制約が加わる分、ターンの編集やセッション中断による影響を受けやすくなります。エラーメッセージに thinking blocks ... cannot be modified が含まれているかどうかで、拡張思考のブロックが原因かどうかを見分けられます。

まとめ

thinking block mismatchは、会話履歴内の tool_use / tool_result / thinking ブロックの並びがAPIの想定と食い違うことで起きるエラーです。/rewind で壊れる前のチェックポイントまで戻れば復旧でき、元のセッションを残したいときは /branch が使えます。Claude Codeの他のエラー全般を切り分ける手順はClaude Codeインストールエラーの切り分けチェックリストにまとめています。/rewind の操作自体を詳しく知りたい場合はClaude Code rewindコマンドで/clear前まで戻るを、チェックポイントを含むワークフロー全体を知りたい場合はClaude Codeワークフロー — Ultraplan/Ultrareview/Checkpointingを参照してください。

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