GEODEの公式ピクセルキャラクター、Geodi
展示室へ戻る

GEODE

Autonomous Agent Harness

観測から、次の行動へ。

調査、ファイル作業、予約タスクを任せられる、ローカルの自律エージェント・ハーネスです。

2026.02.21 — present

設計・判断・検証: Author · 実装: Claude · レビュー: Codex

  • CLI一般公開 · PyPI
  • MCPサーバー実装済み

モデルの終了提案を完了に変えるのは、検証だけ。

引き渡し可能な終了では、モデルが停止を求めても完了検証を経ます。結果は完了、予算内での継続、レビュー待ちのいずれかで、実行上限・キャンセル・エラーは別の停止状態で終わります。

完了判定構成図 · 固定コミット9e2c041のコードパスから作図
GEODE完了判定構成図モデルの終了提案が完了になるまでの経路です。引き渡し可能な終了(natural、forced_text、actionable_partial)だけが、PreVerifyフック、構造検査と選択された判定エンジン(既定はLLM judge、選択した場合はJev)、PostVerifyフックとStopフックを通ります。通過すればcompletedとして保存され、修正可能な失敗は既定2回の予算内で同じリクエストを続行します。使えない判定、失敗を通過に変えようとする試み、予算の枯渇のいずれかがあれば、候補を差し止めてセッションをpausedにします。キャンセル・上限・インフラによる終了とcontrol workflowの実行は、検証なしで保存されます。IPC · CLIの呼び出し元応答 · セッション状態外部のレビュアーpending · 自動連絡なし判定モデルLLM judge · Jev Choiceipc_server/poller.pycontrol workflow · 公開検証を省略loop/agent_loop.pyarun · モデルのターン_arun_once · 修正の継続loop/_guards.py · models.py引き渡し可能な終了 · naturalなど失敗 · 上限 · キャンセルによる終了loop/_lifecycle.pyfinalize_and_return_asyncpolicy_action · 判定の解釈継続の予算 · 既定2回core/hooks/public.pyPreVerify · STRENGTHENPostVerify · ACCEPT · REVISE · ESCALATEStop · CONTINUEmemory · observabilityチェックポイント · セッション状態タイムライン · ledgerの判定行core/agent/verify.py構造検査 · empty_turn意味判定 · LLMまたはJevverification_error · フェイルクローズGEODEランタイムプロセスAgenticLoopの1ターンの終わりループ · 終了候補finalization · 判定1 終了提案 · arun · モデルのターン → 引き渡し可能な終了 · naturalなど12完了候補3 PreVerify · finalize_and_return_async → PreVerify · STRENGTHEN34verify_turn_async5判定要求6passed · rubric_misses7 PostVerifyの決定 · policy_action · 判定の解釈 → PostVerify · ACCEPT · REVISE · ESCALATE78Stop · CONTINUE9completed · 保存10応答1passed · rubric_misses2 PostVerifyの決定 · policy_action · 判定の解釈 → PostVerify · ACCEPT · REVISE · ESCALATE23Stop · CONTINUE4修正 · 試行+11verification_error2 PostVerifyの決定 · policy_action · 判定の解釈 → PostVerify · ACCEPT · REVISE · ESCALATE23ESCALATE · pending4判定 · 証拠行1 ガード · 上限 · arun · モデルのターン → 失敗 · 上限 · キャンセルによる終了12失敗 · キャンセルによる終了3公開検証を省略4保存のみ · 検証なし5応答

検証 → 完了

引き渡し可能な終了だけが、PreVerify → 判定 → PostVerify → Stopを通ります。モデルの終了提案もフックの指示も、それだけでは完了になりません。

  1. arun · モデルのターンloop/agent_loop.pyデータ: 終了提案引き渡し可能な終了 · naturalなどloop/_guards.py · models.py

    モデルがツール呼び出しなしにテキストで答えると、そのターンはnatural(最後に許可されたラウンドではforced_text)の終了候補になります。モデルの終了提案は、まだ完了ではありません。

  2. 引き渡し可能な終了 · naturalなどloop/_guards.py · models.pyデータ: 完了候補finalize_and_return_asyncloop/_lifecycle.py

    natural、forced_text、actionable_partialだけが引き渡し可能な終了で、これらだけが公開検証へ進みます。

  3. finalize_and_return_asyncloop/_lifecycle.py実行 · 判定: PreVerifyPreVerify · STRENGTHENcore/hooks/public.py

    STRENGTHENでは、PreVerifyフックは要件と欠落コードを加えることしかできません。判定を厳しくすることはできても、通過させることはできません。

  4. finalize_and_return_asyncloop/_lifecycle.py実行 · 判定: verify_turn_async構造検査 · empty_turncore/agent/verify.py

    最初に構造検査(空のターン、model_action_required)を行い、修正できない構造上の失敗なら意味判定を省きます。offやrule_basedなどの古い設定値はllm_judgeとして解釈され、判定をオフにすることはできません。

  5. 意味判定 · LLMまたはJevcore/agent/verify.pyデータ: 判定要求判定モデル

    選択された判定エンジン(既定はLLM judge、選択した場合はJev Choice)を、ツールなしで1回呼び出します。最大120秒で、残りの時間予算を超えることはありません。個人情報を含みうる候補は、補助の判定モデルには送りません。

  6. 意味判定 · LLMまたはJevcore/agent/verify.pyデータ: passed · rubric_missespolicy_action · 判定の解釈loop/_lifecycle.py

    判定には、合否、欠落コード、次の試行に渡すリフレクション、再試行が有効かどうかが含まれます。意味判定の通過が、失敗した構造検査を覆すことはありません。

  7. policy_action · 判定の解釈loop/_lifecycle.py実行 · 判定: PostVerifyの決定PostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.py

    PostVerifyフックがACCEPT・REVISE・ESCALATEを決めます。検証に失敗した候補へのACCEPTはescalateになります。決定がない場合は、ランタイムの既定(通過 → accept、再試行可能 → revise、それ以外 → escalate)が適用されます。

  8. policy_action · 判定の解釈loop/_lifecycle.py実行 · 判定: Stop · CONTINUEStop · CONTINUEcore/hooks/public.py

    escalateでない場合に限り、StopフックのCONTINUE指示が修正の継続を求めることができます。フックの指示は権限ではなく、次の試行への入力です。

  9. policy_action · 判定の解釈loop/_lifecycle.pyデータ: completed · 保存チェックポイント · セッション状態memory · observability

    通過してacceptになると、続行した試行も統合して結果を保存し、セッションをcompletedとして記録します。

  10. finalize_and_return_asyncloop/_lifecycle.pyデータ: 応答IPC · CLIの呼び出し元

    完了時は最終回答を、レビュー待ちのときは空の回答とEXTERNAL_VERIFICATION_REQUIREDを、検証なしの終了ではその終了理由を返します。

予算内の修正

修正可能な失敗は、同じリクエストを続行します。既定の予算は2回で、使い切ると候補はレビュー待ちになります。

  1. 意味判定 · LLMまたはJevcore/agent/verify.pyデータ: passed · rubric_missespolicy_action · 判定の解釈loop/_lifecycle.py

    判定には、合否、欠落コード、次の試行に渡すリフレクション、再試行が有効かどうかが含まれます。意味判定の通過が、失敗した構造検査を覆すことはありません。

  2. policy_action · 判定の解釈loop/_lifecycle.py実行 · 判定: PostVerifyの決定PostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.py

    PostVerifyフックがACCEPT・REVISE・ESCALATEを決めます。検証に失敗した候補へのACCEPTはescalateになります。決定がない場合は、ランタイムの既定(通過 → accept、再試行可能 → revise、それ以外 → escalate)が適用されます。

  3. policy_action · 判定の解釈loop/_lifecycle.py実行 · 判定: Stop · CONTINUEStop · CONTINUEcore/hooks/public.py

    escalateでない場合に限り、StopフックのCONTINUE指示が修正の継続を求めることができます。フックの指示は権限ではなく、次の試行への入力です。

  4. 継続の予算 · 既定2回loop/_lifecycle.py実行 · 判定: 修正 · 試行+1_arun_once · 修正の継続loop/agent_loop.py

    修正指示があり、かつ今回の試行番号が予算(既定で2回)より小さい場合に限り、同じリクエストを続行します。予算に達するとescalate_budget_exhaustedとなり、レビュー待ちになります。

レビュー待ち

使えない判定、失敗を通過に変えようとする試み、予算の枯渇のいずれかがあれば、候補を差し止めてセッションを一時停止します。

  1. verification_error · フェイルクローズcore/agent/verify.py失敗 · 判定なし: verification_errorpolicy_action · 判定の解釈loop/_lifecycle.py

    判定モデルがない、タイムアウトした、応答が無効だった場合は、通過でも修正のシグナルでもないverification_errorになります。使えない判定が成功の代わりになることはありません。

  2. policy_action · 判定の解釈loop/_lifecycle.py実行 · 判定: PostVerifyの決定PostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.py

    PostVerifyフックがACCEPT・REVISE・ESCALATEを決めます。検証に失敗した候補へのACCEPTはescalateになります。決定がない場合は、ランタイムの既定(通過 → accept、再試行可能 → revise、それ以外 → escalate)が適用されます。

  3. policy_action · 判定の解釈loop/_lifecycle.py実行 · 判定: ESCALATE · pending外部のレビュアー

    候補はpending_textとして保持され、通常の応答からは差し止められます。チェックポイントを保存し、セッションをpausedにします。外部のレビュアーに自動で連絡することはありません。

  4. policy_action · 判定の解釈loop/_lifecycle.py記録 · 観測: 判定 · 証拠行タイムライン · ledgerの判定行memory · observability

    タイムラインには判定・証拠・pendingの行が、evidence ledgerにはverification_policyの行が書き込まれます。これらはベストエフォートの記録であり、外部の副作用の証明ではありません。

検証なしの終了

キャンセル・上限・インフラによる終了とcontrol workflowの実行は、公開検証なしで保存されます。

  1. arun · モデルのターンloop/agent_loop.py実行 · 判定: ガード · 上限失敗 · 上限 · キャンセルによる終了loop/_guards.py · models.py

    ラウンド・時間・コスト・コンテキストの上限、キャンセル、繰り返す失敗の検出などのガードが、閉じたTerminationReason集合のいずれか1つでターンを終了します。設定で無効にした上限まで常に強制されるわけではありません。

  2. 失敗 · 上限 · キャンセルによる終了loop/_guards.py · models.py失敗 · 判定なし: 失敗 · キャンセルによる終了finalize_and_return_asyncloop/_lifecycle.py

    キャンセル・インフラ・上限による終了には検証する候補がないため、公開検証なしで保存されます。

  3. control workflow · 公開検証を省略ipc_server/poller.py実行 · 判定: 公開検証を省略finalize_and_return_asyncloop/_lifecycle.py

    IPC呼び出しが公開検証の省略を求めた場合、またはcontrol workflowが有効な場合は、その実行に限って公開検証をオフにし、終了後に元の値へ戻します。

  4. finalize_and_return_asyncloop/_lifecycle.pyデータ: 保存のみ · 検証なしチェックポイント · セッション状態memory · observability

    検証なしの終了でも、結果とチェックポイントを保存し、セッション終了のイベントを発行します。

  5. finalize_and_return_asyncloop/_lifecycle.pyデータ: 応答IPC · CLIの呼び出し元

    完了時は最終回答を、レビュー待ちのときは空の回答とEXTERNAL_VERIFICATION_REQUIREDを、検証なしの終了ではその終了理由を返します。

すべての接続を同じ太さで表示します。フローを選ぶと、その経路だけを番号付きで強調します。

  • 実線 · リクエスト・候補・結果が流れる方向
  • 破線 · 実行・判定・認可・設定
  • 長い一点鎖線 · 記録と観測、判定とは別
  • 短い破線 · 失敗、または使えない判定
  • 太い黒線 · 選んだフロー。番号は順序
  • ボックス · コードまたは記録の境界、見出しにパス
  • 内側のチップ · その境界内の構成要素
  • 破線ボックス · その境界の外
  • ループ · finalization
  • 終了 · フック · 判定
  • 保存 · 記録
  • IPCの入口

固定コミット9e2c041の呼び出し経路だけを描いています。判定モデルの通過は外部ベンチマークの検証器の成功とは別物で、ここでの完了はランタイム内の判定です。

判定エンジン
既定はLLM judgeで、judgment_engineをjevに設定した場合に限りJev Choiceが判定します。いずれの場合も、使えない判定モデルはverification_errorとなり、成功にはなりません。
フックにできること
PreVerifyは判定を厳しくすることしかできず、PostVerifyは失敗した候補を通過させられず、Stopはescalateでない場合にのみ続行を求められます。
レビュー待ち
レビュー待ちは、外部の判断が必要であることを記録する状態です。誰かに通知するものでも、結果が承認されたことを意味するものでもありません。