モデルの終了提案を完了に変えるのは、検証だけ。
引き渡し可能な終了では、モデルが停止を求めても完了検証を経ます。結果は完了、予算内での継続、レビュー待ちのいずれかで、実行上限・キャンセル・エラーは別の停止状態で終わります。
検証 → 完了
引き渡し可能な終了だけが、PreVerify → 判定 → PostVerify → Stopを通ります。モデルの終了提案もフックの指示も、それだけでは完了になりません。
arun · モデルのターン
loop/agent_loop.pyデータ: 終了提案引き渡し可能な終了 · naturalなどloop/_guards.py · models.pyモデルがツール呼び出しなしにテキストで答えると、そのターンはnatural(最後に許可されたラウンドではforced_text)の終了候補になります。モデルの終了提案は、まだ完了ではありません。
引き渡し可能な終了 · naturalなど
loop/_guards.py · models.pyデータ: 完了候補finalize_and_return_asyncloop/_lifecycle.pynatural、forced_text、actionable_partialだけが引き渡し可能な終了で、これらだけが公開検証へ進みます。
finalize_and_return_async
loop/_lifecycle.py実行 · 判定: PreVerifyPreVerify · STRENGTHENcore/hooks/public.pySTRENGTHENでは、PreVerifyフックは要件と欠落コードを加えることしかできません。判定を厳しくすることはできても、通過させることはできません。
finalize_and_return_async
loop/_lifecycle.py実行 · 判定: verify_turn_async構造検査 · empty_turncore/agent/verify.py最初に構造検査(空のターン、model_action_required)を行い、修正できない構造上の失敗なら意味判定を省きます。offやrule_basedなどの古い設定値はllm_judgeとして解釈され、判定をオフにすることはできません。
意味判定 · LLMまたはJev
core/agent/verify.pyデータ: 判定要求判定モデル選択された判定エンジン(既定はLLM judge、選択した場合はJev Choice)を、ツールなしで1回呼び出します。最大120秒で、残りの時間予算を超えることはありません。個人情報を含みうる候補は、補助の判定モデルには送りません。
意味判定 · LLMまたはJev
core/agent/verify.pyデータ: passed · rubric_missespolicy_action · 判定の解釈loop/_lifecycle.py判定には、合否、欠落コード、次の試行に渡すリフレクション、再試行が有効かどうかが含まれます。意味判定の通過が、失敗した構造検査を覆すことはありません。
policy_action · 判定の解釈
loop/_lifecycle.py実行 · 判定: PostVerifyの決定PostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.pyPostVerifyフックがACCEPT・REVISE・ESCALATEを決めます。検証に失敗した候補へのACCEPTはescalateになります。決定がない場合は、ランタイムの既定(通過 → accept、再試行可能 → revise、それ以外 → escalate)が適用されます。
policy_action · 判定の解釈
loop/_lifecycle.py実行 · 判定: Stop · CONTINUEStop · CONTINUEcore/hooks/public.pyescalateでない場合に限り、StopフックのCONTINUE指示が修正の継続を求めることができます。フックの指示は権限ではなく、次の試行への入力です。
policy_action · 判定の解釈
loop/_lifecycle.pyデータ: completed · 保存チェックポイント · セッション状態memory · observability通過してacceptになると、続行した試行も統合して結果を保存し、セッションをcompletedとして記録します。
finalize_and_return_async
loop/_lifecycle.pyデータ: 応答IPC · CLIの呼び出し元完了時は最終回答を、レビュー待ちのときは空の回答とEXTERNAL_VERIFICATION_REQUIREDを、検証なしの終了ではその終了理由を返します。
予算内の修正
修正可能な失敗は、同じリクエストを続行します。既定の予算は2回で、使い切ると候補はレビュー待ちになります。
意味判定 · LLMまたはJev
core/agent/verify.pyデータ: passed · rubric_missespolicy_action · 判定の解釈loop/_lifecycle.py判定には、合否、欠落コード、次の試行に渡すリフレクション、再試行が有効かどうかが含まれます。意味判定の通過が、失敗した構造検査を覆すことはありません。
policy_action · 判定の解釈
loop/_lifecycle.py実行 · 判定: PostVerifyの決定PostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.pyPostVerifyフックがACCEPT・REVISE・ESCALATEを決めます。検証に失敗した候補へのACCEPTはescalateになります。決定がない場合は、ランタイムの既定(通過 → accept、再試行可能 → revise、それ以外 → escalate)が適用されます。
policy_action · 判定の解釈
loop/_lifecycle.py実行 · 判定: Stop · CONTINUEStop · CONTINUEcore/hooks/public.pyescalateでない場合に限り、StopフックのCONTINUE指示が修正の継続を求めることができます。フックの指示は権限ではなく、次の試行への入力です。
継続の予算 · 既定2回
loop/_lifecycle.py実行 · 判定: 修正 · 試行+1_arun_once · 修正の継続loop/agent_loop.py修正指示があり、かつ今回の試行番号が予算(既定で2回)より小さい場合に限り、同じリクエストを続行します。予算に達するとescalate_budget_exhaustedとなり、レビュー待ちになります。
レビュー待ち
使えない判定、失敗を通過に変えようとする試み、予算の枯渇のいずれかがあれば、候補を差し止めてセッションを一時停止します。
verification_error · フェイルクローズ
core/agent/verify.py失敗 · 判定なし: verification_errorpolicy_action · 判定の解釈loop/_lifecycle.py判定モデルがない、タイムアウトした、応答が無効だった場合は、通過でも修正のシグナルでもないverification_errorになります。使えない判定が成功の代わりになることはありません。
policy_action · 判定の解釈
loop/_lifecycle.py実行 · 判定: PostVerifyの決定PostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.pyPostVerifyフックがACCEPT・REVISE・ESCALATEを決めます。検証に失敗した候補へのACCEPTはescalateになります。決定がない場合は、ランタイムの既定(通過 → accept、再試行可能 → revise、それ以外 → escalate)が適用されます。
policy_action · 判定の解釈
loop/_lifecycle.py実行 · 判定: ESCALATE · pending外部のレビュアー候補はpending_textとして保持され、通常の応答からは差し止められます。チェックポイントを保存し、セッションをpausedにします。外部のレビュアーに自動で連絡することはありません。
policy_action · 判定の解釈
loop/_lifecycle.py記録 · 観測: 判定 · 証拠行タイムライン · ledgerの判定行memory · observabilityタイムラインには判定・証拠・pendingの行が、evidence ledgerにはverification_policyの行が書き込まれます。これらはベストエフォートの記録であり、外部の副作用の証明ではありません。
検証なしの終了
キャンセル・上限・インフラによる終了とcontrol workflowの実行は、公開検証なしで保存されます。
arun · モデルのターン
loop/agent_loop.py実行 · 判定: ガード · 上限失敗 · 上限 · キャンセルによる終了loop/_guards.py · models.pyラウンド・時間・コスト・コンテキストの上限、キャンセル、繰り返す失敗の検出などのガードが、閉じたTerminationReason集合のいずれか1つでターンを終了します。設定で無効にした上限まで常に強制されるわけではありません。
失敗 · 上限 · キャンセルによる終了
loop/_guards.py · models.py失敗 · 判定なし: 失敗 · キャンセルによる終了finalize_and_return_asyncloop/_lifecycle.pyキャンセル・インフラ・上限による終了には検証する候補がないため、公開検証なしで保存されます。
control workflow · 公開検証を省略
ipc_server/poller.py実行 · 判定: 公開検証を省略finalize_and_return_asyncloop/_lifecycle.pyIPC呼び出しが公開検証の省略を求めた場合、またはcontrol workflowが有効な場合は、その実行に限って公開検証をオフにし、終了後に元の値へ戻します。
finalize_and_return_async
loop/_lifecycle.pyデータ: 保存のみ · 検証なしチェックポイント · セッション状態memory · observability検証なしの終了でも、結果とチェックポイントを保存し、セッション終了のイベントを発行します。
finalize_and_return_async
loop/_lifecycle.pyデータ: 応答IPC · CLIの呼び出し元完了時は最終回答を、レビュー待ちのときは空の回答とEXTERNAL_VERIFICATION_REQUIREDを、検証なしの終了ではその終了理由を返します。
すべての接続を同じ太さで表示します。フローを選ぶと、その経路だけを番号付きで強調します。
- 実線 · リクエスト・候補・結果が流れる方向
- 破線 · 実行・判定・認可・設定
- 長い一点鎖線 · 記録と観測、判定とは別
- 短い破線 · 失敗、または使えない判定
- 太い黒線 · 選んだフロー。番号は順序
- ボックス · コードまたは記録の境界、見出しにパス
- 内側のチップ · その境界内の構成要素
- 破線ボックス · その境界の外
- ループ · finalization
- 終了 · フック · 判定
- 保存 · 記録
- IPCの入口
固定コミット9e2c041の呼び出し経路だけを描いています。判定モデルの通過は外部ベンチマークの検証器の成功とは別物で、ここでの完了はランタイム内の判定です。
- 判定エンジン
- 既定はLLM judgeで、judgment_engineをjevに設定した場合に限りJev Choiceが判定します。いずれの場合も、使えない判定モデルはverification_errorとなり、成功にはなりません。
- フックにできること
- PreVerifyは判定を厳しくすることしかできず、PostVerifyは失敗した候補を通過させられず、Stopはescalateでない場合にのみ続行を求められます。
- レビュー待ち
- レビュー待ちは、外部の判断が必要であることを記録する状態です。誰かに通知するものでも、結果が承認されたことを意味するものでもありません。