Claude Code でエージェントを長時間・並列で動かしていると、短いセッションでは起きない問題に遭遇する。v2.1.72〜76(2026年3月リリース)では、こうした問題への対策が複数入った。問題カテゴリごとに整理する。
Compaction で失われるものへの対策
Compaction とは
Claude Code は会話が長くなると、古いメッセージを要約してコンテキストウィンドウに収める処理を自動で行う。これを compaction(文脈圧縮)と呼ぶ。
短いセッションでは意識する必要がないが、長時間セッションでは compaction が繰り返し走ることになる。そして、この圧縮処理にはいくつかの副作用があった。
Deferred Tools スキーマ消失問題の修正(v2.1.76)
Claude Code には deferred tools という仕組みがある。すべてのツールのスキーマ(パラメータ定義)を起動時に読み込むのではなく、エージェントがそのツールを実際に使おうとしたタイミングで初めてスキーマを取得するツール群だ。起動を軽くするための遅延読み込みとして導入されている。
この deferred tools に、compaction との相性問題があった。compaction が走ると、一度読み込んだスキーマ情報が失われていたのだ。compaction 後にこれらのツールを呼び出すと、配列や数値のパラメータが「型が違う」というエラーで拒否される。ツール自体は認識されているのにパラメータの定義だけが消えている、という見つけにくい不具合だった。
v2.1.76 でこの問題が修正され、compaction 後もスキーマが保持されるようになった。長時間セッションで突然ツールが動かなくなる、という現象の原因のひとつが解消された。
Auto-compaction 失敗時のフリーズ問題の修正(v2.1.76)
Auto-compaction は、コンテキストが上限に近づくと自動で走る。だが、compaction 自体が何らかの理由で失敗するケースがある。以前はこの場合、失敗と再試行を無限に繰り返し、セッションが応答しなくなっていた。
v2.1.76 で circuit breaker(回路遮断器)が追加された。3回連続で compaction が失敗したら自動的に停止する。「壊れたまま回り続ける」という状態を避ける、定番のパターンだ。
PostCompact Hook:compaction 後に処理を注入可能に(v2.1.76)
Claude Code の hook は、特定のイベントが発生したときにシェルコマンドを実行する仕組みだ。テストで言う before/after フック、Git で言う pre-commit/post-commit フックに相当する。ツール実行の前後(PreToolUse / PostToolUse)やセッション開始時(SessionStart)など、さまざまなイベントに処理を差し込める。
v2.1.76 で新たに PostCompact イベントが追加された。compaction が完了した直後に発火する。
設定ファイル(.claude/settings.json またはユーザー設定 ~/.claude/settings.json)で有効にできる。たとえば、compaction が走るたびにプロジェクトの前提情報を再注入する設定はこうなる:
{
"hooks": {
"PostCompact": [
{
"type": "command",
"command": "cat .claude/project-context.md"
}
]
}
}
この設定では、.claude/project-context.md にステークホルダー情報やビジネス上の制約などを書いておくと、compaction 後に自動でコンテキストに注入される。
この hook の最大の用途は、compaction で失われがちなプロジェクト固有のコンテキストを再注入することだ。
長時間セッションでは、会話の初期に共有したステークホルダーの情報、ビジネス上の制約、長期的な計画といった「どのタスクでも忘れてほしくない前提」が、compaction によって要約の過程で薄まっていく。直近の会話に含まれる情報は残りやすいが、セッション冒頭で共有した背景情報ほど消えやすい。
PostCompact hook を使えば、compaction が走るたびにこうしたプロジェクト固有の前提をコンテキストに差し戻すことができる。hook の stdout に出力した内容がコンテキストに注入されるので、プロジェクトの前提情報をファイルに書いておき、PostCompact でそれを cat するだけでよい。
ログや通知への活用ももちろん可能だが、compaction 後のコンテキスト補完が実用上は最も大きな価値になるだろう。
Worktree 周りの運用改善
Claude Code の --worktree フラグは、git worktree を使ってエージェントごとに独立した作業ディレクトリを作る機能だ。メインの作業ディレクトリを汚さずに並列でエージェントを動かせる。(詳しくは以前の記事を参照。)
v2.1.72〜76 では、この worktree 機能の実用性を上げる改善が4つ入った。
worktree.sparsePaths:必要なディレクトリだけのチェックアウト(v2.1.76)
複数のサービスやパッケージが同居する大規模な monorepo で --worktree を使うと、リポジトリ全体がチェックアウトされる。数百のパッケージを含むような monorepo では、エージェントが触る必要のないコードまで含めて大量のディスクを消費し、worktree の作成にも時間がかかる。
v2.1.76 で追加された worktree.sparsePaths は、git sparse-checkout を利用して worktree に含めるディレクトリを指定する設定だ。
設定ファイルで対象ディレクトリを指定する。たとえば、worktree に src/my-service/、packages/shared-utils/、configs/ の3ディレクトリだけをチェックアウトする設定はこうなる:
{
"worktree": {
"sparsePaths": [
"src/my-service/",
"packages/shared-utils/",
"configs/"
]
}
}
この設定で claude --worktree を実行すると、指定したディレクトリだけが worktree に展開される。他のディレクトリはファイルシステム上に存在しない。
メリットは3つある:
- ディスク消費の削減。必要なディレクトリだけなので、worktree のサイズが大幅に小さくなる
- 作成速度の向上。チェックアウトするファイルが少ないぶん速い
- エージェントのスコープ制限。エージェントが関係のないコードを読んだり変更したりするリスクが減る
個人的には3番目が最も大きいと感じる。monorepo では無関係なコードがコンテキストに入り込みやすく、エージェントの判断精度に影響する。物理的にファイルが存在しなければ、そもそも読めない──これが最も確実なスコープ制限だ。
なお、git sparse-checkout 自体は Git 2.25 以降で使える機能で、worktree.sparsePaths はそのフロントエンドとして機能している。
Worktree 起動の高速化(v2.1.76)
--worktree の起動時、以前は毎回 git fetch を実行してリモートの最新状態を取得していた。v2.1.76 ではローカルの Git 参照情報を直接読むようになり、リモートブランチがすでにローカルにある場合はネットワークアクセス自体をスキップする。
単体では小さな改善だが、エージェントを複数並列で起動するときには効いてくる。
中断された Worktree 残骸の自動クリーンアップ(v2.1.76)
並列でエージェントを動かしていると、プロセスの強制終了、ネットワーク切断、マシンのスリープなどで中断されることがある。以前はこのとき worktree の残骸がディスクに残り続け、git worktree list で確認して git worktree remove で手動削除する必要があった。
v2.1.76 で、stale worktree(使われていない古い worktree)が次回の --worktree 起動時に自動的にクリーンアップされるようになった。手動で掃除する手間がなくなった。
ExitWorktree:エージェントによる自律的な Worktree 終了(v2.1.72)
v2.1.72 で ExitWorktree というツールが追加された。エージェントが自分自身で worktree セッションを終了するためのツールだ。
以前は、エージェントが worktree 内での作業を終えても worktree 自体は残り続け、外側(親プロセスやユーザー)が片付ける必要があった。ExitWorktree により、「作業が終わったら worktree を閉じて」と指示するだけで、エージェントが自律的にクリーンアップまで完了するようになった。
Background Agent 中断時の作業結果保持(v2.1.76)
Claude Code では、エージェントをバックグラウンドで動かせる。「このテストの修正を裏でやっておいて」のように指示すると、メインの会話を続けながら別のタスクを並行処理できる。
このバックグラウンドエージェントを途中で止めたくなることがある(Ctrl+F で停止)。以前は、停止した瞬間にそれまでの作業結果がすべて消えていた。途中まで調べた内容も、部分的に書いたコードも、中断と同時に会話から消滅していた。
v2.1.76 では、中断されたバックグラウンドエージェントの部分的な結果が会話コンテキストに保持されるようになった。中断しても途中経過が残るので、その結果をもとに続きを進められる。
まとめ
v2.1.72〜76 の改善を問題カテゴリ別に整理する:
| カテゴリ | 改善内容 | バージョン |
|---|---|---|
| Compaction | Deferred tools のスキーマ保持 | v2.1.76 |
| Compaction | Auto-compaction の circuit breaker(3回で停止) | v2.1.76 |
| Compaction | PostCompact hook の追加 | v2.1.76 |
| Worktree | sparsePaths で sparse checkout 対応 | v2.1.76 |
| Worktree | 起動速度の改善(冗長な git fetch スキップ) | v2.1.76 |
| Worktree | Stale worktree の自動クリーンアップ | v2.1.76 |
| Worktree | ExitWorktree ツールの追加 | v2.1.72 |
| Background Agent | 中断時の部分結果保持 | v2.1.76 |
短いセッションで Claude Code を使うぶんには、どれも気にならない改善だ。だが、エージェントを並列で長時間動かすような使い方をしていると、こうした耐障害機能の有無が安定性に直結する。
特に PostCompact hook と worktree.sparsePaths は、自分のワークフローに合わせてカスタマイズできる拡張ポイントだ。長時間のエージェント運用をしている人は、まずこの2つの設定から試してみるのがよいだろう。
今回の改善を並べてみると、Anthropic が「エージェントを数分使って終わり」ではなく「長時間・並列で回し続ける」使い方を意識しているように感じる。hook の拡張ポイントや worktree の運用改善は、そうした使い方をするユーザーからのフィードバックがなければ生まれにくい種類の機能だ。Codex CLI や Gemini CLI でも並列エージェントや worktree 対応が進んでおり、このあたりが各ツールの差別化ポイントになりつつある。