Claude Opus 5.5のエージェントが途中で止まるのを防ぐ設定
Claude Opus 5.5は長時間タスク中もテキストのみのend_turnで応答を終えることがあります。無人実行のハーネスがそれを完了と誤判定しないための実装パターンをまとめます。
複数の手順からなるタスクをClaude Opus 5.5に無人実行させていると、残りの作業があるのに途中でぴたりと止まることがあります。原因は、Opus 5.5が長いタスクの途中でも進捗をテキストだけの応答で返すことがあり、それが完了時と同じstop_reason: "end_turn"で返ってくる点にあります。対処は、この応答をタスク完了の証拠として扱わないハーネス設計と、早期終了そのものを減らすプロンプト設計の2方向に分かれます。以下では、それぞれを具体的な指示文の例つきで紹介します。
Opus 5.5が「完了しました」と言って実は終わっていない理由
Claude Opus 5.5は複数の手順からなる長いタスクを進めるとき、作業の合間にユーザー向けの進捗更新を返します。無人実行(unattended agentic run)とは、人が都度確認や指示を返さずにエージェントを動かす運用です。
その進捗更新の一部は、ツール呼び出しを伴わないテキストだけの応答として終わり、通常の完了時と同じstop_reason: "end_turn"で返ってきます。end_turnは「モデルの応答がひと区切りついた」ことを示すだけで、タスクが完了したことの証拠ではありません(stop_reasonの種類とエラーとの違いはstop_reasonとエラーの違いにまとめています)。無人実行のループが「end_turn=タスク完了」と単純に判定していると、モデルが途中経過を報告しただけのターンでループが止まり、残りの手順が実行されないまま終わります。
テキストだけで終わるend_turnを「報告」として扱う
最初に直すのは判定です。テキストだけで終わるターンを「タスク完了の証拠」ではなく「進捗の報告」として扱います。
この見直し単体では止まる頻度は変わりません。後述のチェックリスト管理・継続メッセージ・自動継続の上限と組み合わせて初めて機能します。ハーネス側の判定ロジックを変えるだけで実装でき、モデル自体やプロンプトの変更を必要としない点が、最初に手を付けやすい理由です。
タスクの残項目をチェックリストで管理する
end_turnを報告として扱うには、タスクの構成要素をハーネス側で把握しておく必要があります。タスクの各部分は、to-doツールかファイルでモデル自身に更新させます。
ターンが終わった時点でチェックリストに未完了の項目が残っていて、かつモデルがブロッカーを述べていなければ、次のような短いユーザーメッセージを送り返して続行を促します。
Your task list still has open items: migrate the remaining two endpoints and update their tests. Continue with them. If one is blocked, say what is blocking it.この例はエンドポイントの移行作業を想定したものですが、汎用パターンとしては「残っている項目を名指しする」「続行を指示する」「ブロッカーがあれば申告させる」の3点が要点です。
もう1つの方法として、完了条件をあらかじめ定義しておき、ターンが終わるたびに、別の小型モデルにその条件と会話を照合させ、条件を満たしていなければ理由を次のユーザーメッセージとして返す方法です。たとえば「指定した全エンドポイントのテストが通ること」のような条件を渡しておけば、小型モデルは会話履歴からその条件を満たしているかどうかだけを判定して返せます。チェックリストを更新させる方式より判定の自由度は上がりますが、判定用の追加リクエストが発生します。
自動継続は2〜3回で打ち切る
チェックリスト方式でも小型モデルによる判定方式でも、自動継続の回数には上限を設けます。目安は2〜3回です。
上限を設ける理由は、本当に行き詰まっているタスクを際限なく再試行させないためです。上限に達しても終わらないタスクはそこで止め、人が内容を確認する対象に回します。継続のたびに、それまでの会話全体が次のリクエストへ再送されるため、上限を設けずに続けると、行き詰まっているタスクほど会話が長くなり、1回あたりのコストも比例して増えていきます。
実行中のバックグラウンド処理は完了を待ってから続ける
end_turnで終わったターンの時点で、モデルが起動したバックグラウンドコマンドやサブエージェントがまだ動いている場合は、別の扱いが必要です。この場合はタスクを完了扱いにせず、処理が終わるのを待ってから、その出力を次のユーザーメッセージとしてモデルに返します。
チェックリストの残項目とは判断材料が異なる点に注意します。チェックリストは「モデルが未完了と申告した項目」を見ますが、こちらは「ハーネス側が実行状況を把握している処理」が判断材料になります。先に完了扱いにしてしまうと、バックグラウンド処理が実際に返す出力をハーネス側が拾いそこね、モデルもその結果を踏まえた次の判断ができなくなります。
システムプロンプトに終了条件を追加する
チェックリストと継続メッセージの組み合わせに加えて、早期終了そのものの頻度を減らす手段もあります。システムプロンプトに、避けたい終了パターンを具体的に名指しする指示を加える方法です。
Opus 5.5は「次の一手を予告する要約で終える」のような、避けたい終了の型を具体的に指示すると応答しやすい一方、「ユーザーの入力なしには前に進めない場合」のように許容してよい終了の型も併せて示すと効果が上がります。
公式ガイドは、完全放置のハーネス向けに書かれた指示文の例を1つ挙げています。そのまま使うのではなく、自分のアプリケーションに合わせて調整する出発点として示されたものです。
A standing instruction from the user, the person you are working for. It is about how your turns end. A message with no tool call in it ends your turn, and the work stops there until you are asked to continue. The user has seen you end turns in four ways while work they asked for was still owed, and does not want any of them. One: a long summary of what was done that closes by announcing the next step and has no tool call, so the next thing never starts. Two: an offer to carry on with something unless the user would prefer otherwise, which stops to wait for an answer the user was not going to give. Three: a list of decisions for the user when, by your own account, none of them blocks the rest of the work. Four: deciding that this is a good place to report, because the turn has been long or a milestone is done. Status notes are welcome, and so are your recommendations on open decisions, but put them in the same message as your next tool call and carry on with whatever does not depend on the user's answer. If you notice yourself inviting the user to redirect you or offering to wait, delete it and do the next thing. The stops the user does want are the ones where nothing can move without them, or where the thing blocking you is deliberately protected from you. This does not override the need for confirmation on risky or destructive actions.この追加指示を使うときは、次の点を押さえておく必要があります。
- セッションの最初のリクエストから、システムプロンプトの末尾に加えます。会話の途中から追加すると
systemプロンプトが変わり、それ以前のthinkingブロックが無効になります。 - この指示は状況報告をツール呼び出しと同じメッセージに含めるよう求めるため、状況報告はテキストブロックではなくprogress-updateのthinkingブロックとして返ってきます。既定の
thinking.displayではこのブロックの本文は空になるため、内容を受け取るにはdisplay: "updates"(ベータ機能。リクエストにthinking-display-updates-2026-08-18のbetaヘッダーが必要)を指定します。
"thinking": {
"type": "enabled",
"display": "updates"
}- クライアント側でこのブロックをどう描画するかは、移行ガイドのテキスト間表示の章にサンプルがあります。
- ツール呼び出しと出力トークンがやや増える傾向があります。継続1回あたりのコスト目安はOpus 5.5のタスクコストを試算する方法のターン数の考え方が参考になります。
早期停止対策の使い分け早見表
4つの対処は役割が異なり、どれか1つだけでは対応できない終了パターンが残ります。
| 対策 | 何をするか | 向く場面 |
|---|---|---|
| 継続メッセージ | 何をするか未完了項目を名指しして送り返す | 向く場面チェックリストで残項目が明確なとき |
| 小型モデルによる判定 | 何をするか完了条件と会話を照合し理由を返す | 向く場面完了条件を事前に言語化できるとき |
| システムプロンプトの追加指示 | 何をするか早期終了の型を名指しして避けさせる | 向く場面完全放置のハーネス全体。人間参加型には使わない |
| バックグラウンド処理の完了待ち | 何をするか実行中のコマンド・サブエージェントの出力を待つ | 向く場面ハーネス側が実行中の処理を把握しているとき |
継続メッセージと自動継続の上限、システムプロンプトへの追加指示は組み合わせて使う前提の対処です。
Claude Codeで無人実行を組むときの関連設定
Claude CodeをCLIで無人実行する場合、Messages APIを直接呼ぶハーネスとは実装の層が異なりますが、狙いは重なります。実行中のバックグラウンドエージェントやワークフローがある間、セッションの状態をrunningと報告し続けるかどうかはCLAUDE_CODE_BG_TASKS_REPORT_RUNNINGで非対話セッションの状態報告を切り替えるで扱っている設定が対応します。バックグラウンドで走るサブエージェントの様子を定期的に確認させたい場合はClaude Codeでサブエージェントの確認間隔を設定する、実行中・完了直後の項目を後からまとめて確認したい場合はClaude Codeの/tasksコマンドでサブエージェントの完了を確認するが対応する機能です。サブエージェントに何をどう報告させるかという設計自体はClaude Codeのエージェント設計パターンの報告フォーマットの章が参考になります。
まとめ
Opus 5.5を無人実行のハーネスで動かすときは、テキストだけで終わるend_turnをタスク完了の証拠にしないことが起点になります。チェックリストで残項目を追い、未完了なら継続メッセージを送り、自動継続は2〜3回で打ち切る。バックグラウンド処理が動いている間は完了扱いにしません。ここまでがハーネス側の実装です。
早期終了の頻度自体を減らしたいなら、システムプロンプトへの追加指示も組み合わせます。ただし人間参加型のアプリケーションには入れず、リスクのある操作への確認ステップは別に維持します。無人実行で同じ早期終了に繰り返し遭遇している場合は、上の早見表でどの対処がまだ入っていないかを確認するところから切り分けられます。