Geodi, GEODE's official pixel character
Back to the hall

GEODE

Autonomous Agent Harness

From observation to the next action.

A local autonomous-agent harness you can hand research, file work and scheduled tasks.

2026.02.21 — present

Design, judgment, verification: Author · implementation: Claude · review: Codex

  • CLIPublished · PyPI
  • MCP serverImplemented

The model's stop proposal becomes completion only through verification.

For a deliverable stop, a model asking to stop still goes through completion verification. The outcome is done, continue within budget, or waiting for review; execution limits, cancellation and errors end in a separate stopped state.

Completion map · drawn from the code paths at pinned commit 9e2c041
GEODE completion mapHow a model’s stop proposal becomes a completion. Only deliverable stops (natural, forced_text, actionable_partial) pass through the PreVerify hook, a structural check and the selected judge (LLM judge by default, Jev when chosen), and the PostVerify and Stop hooks. A pass is saved as completed; a repairable failure continues the same request within a default budget of two attempts. An unusable verdict, an attempt to turn a failure into a pass, or an exhausted budget withholds the candidate and pauses the session. Cancel, limit and infrastructure stops and control-workflow runs are saved without verification.IPC · CLI callerresponse · session stateExternal reviewerpending · not contactedJudge modelLLM judge · Jev Choiceipc_server/poller.pycontrol workflow · skip public verifyloop/agent_loop.pyarun · model turn_arun_once · repair continuationloop/_guards.py · models.pydeliverable stop · natural etc.failure · limit · cancel stoploop/_lifecycle.pyfinalize_and_return_asyncpolicy_action · reading the verdictcontinuation budget · default 2core/hooks/public.pyPreVerify · STRENGTHENPostVerify · ACCEPT · REVISE · ESCALATEStop · CONTINUEmemory · observabilitycheckpoint · session statetimeline · ledger decision rowscore/agent/verify.pystructural check · empty_turnsemantic judgment · LLM or Jevverification_error · fails closedGEODE runtime processend of one AgenticLoop turnloop · stop candidatesfinalization · verdict1 stop proposal · arun · model turn → deliverable stop · natural etc.12completion candidate3 PreVerify · finalize_and_return_async → PreVerify · STRENGTHEN34verify_turn_async5judgment request6passed · rubric_misses7 PostVerify decision · policy_action · reading the verdict → PostVerify · ACCEPT · REVISE · ESCALATE78Stop · CONTINUE9completed · saved10response1passed · rubric_misses2 PostVerify decision · policy_action · reading the verdict → PostVerify · ACCEPT · REVISE · ESCALATE23Stop · CONTINUE4repair · attempt +11verification_error2 PostVerify decision · policy_action · reading the verdict → PostVerify · ACCEPT · REVISE · ESCALATE23ESCALATE · pending4verdict · evidence rows1 guards · limits · arun · model turn → failure · limit · cancel stop12failure · cancel stop3skip public verify4save only · no verify5response

Verify → complete

Only a deliverable stop goes through PreVerify → judgment → PostVerify → Stop. Neither the model’s stop proposal nor a hook instruction is a completion by itself.

  1. arun · model turnloop/agent_loop.pydata: stop proposaldeliverable stop · natural etc.loop/_guards.py · models.py

    When the model answers in text without a tool call, the turn becomes a natural stop candidate (forced_text on the last allowed round). A model’s stop proposal is not yet a completion.

  2. deliverable stop · natural etc.loop/_guards.py · models.pydata: completion candidatefinalize_and_return_asyncloop/_lifecycle.py

    Only natural, forced_text and actionable_partial are deliverable stops, and only these go on to public verification.

  3. finalize_and_return_asyncloop/_lifecycle.pyrun · decide: PreVerifyPreVerify · STRENGTHENcore/hooks/public.py

    With STRENGTHEN, the PreVerify hook can only add requirements and miss codes. It can make the verdict stricter, never pass it.

  4. finalize_and_return_asyncloop/_lifecycle.pyrun · decide: verify_turn_asyncstructural check · empty_turncore/agent/verify.py

    A structural check comes first (empty turn, model_action_required); an unrepairable structural failure skips the semantic judgment. Old settings such as off or rule_based resolve to llm_judge and cannot turn the verdict off.

  5. semantic judgment · LLM or Jevcore/agent/verify.pydata: judgment requestJudge model

    The selected judge (LLM judge by default, Jev Choice when chosen) is called once, without tools, for at most 120 seconds and never past the remaining time budget. A candidate that may carry personal observations is not sent to an auxiliary judge.

  6. semantic judgment · LLM or Jevcore/agent/verify.pydata: passed · rubric_missespolicy_action · reading the verdictloop/_lifecycle.py

    The verdict carries pass or fail, miss codes, a reflection for the next attempt, and whether a retry is useful. A semantic pass never covers a failed structural check.

  7. policy_action · reading the verdictloop/_lifecycle.pyrun · decide: PostVerify decisionPostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.py

    The PostVerify hook decides ACCEPT, REVISE or ESCALATE. An ACCEPT of a candidate that failed verification becomes escalate. With no decision, the runtime default applies (pass → accept, retryable → revise, otherwise escalate).

  8. policy_action · reading the verdictloop/_lifecycle.pyrun · decide: Stop · CONTINUEStop · CONTINUEcore/hooks/public.py

    Only when not escalating can the Stop hook’s CONTINUE instruction ask for a repair continuation. A hook instruction is an input to the next attempt, not an authority.

  9. policy_action · reading the verdictloop/_lifecycle.pydata: completed · savedcheckpoint · session statememory · observability

    On a pass and accept, continued attempts are merged, the result is saved and the session is recorded as completed.

  10. finalize_and_return_asyncloop/_lifecycle.pydata: responseIPC · CLI caller

    Returns the final answer when completed; an empty answer with EXTERNAL_VERIFICATION_REQUIRED when waiting for review; the stop reason for a stop without verification.

Repair within budget

A repairable failure continues the same request. The default budget is two attempts; when it runs out, the candidate waits for review.

  1. semantic judgment · LLM or Jevcore/agent/verify.pydata: passed · rubric_missespolicy_action · reading the verdictloop/_lifecycle.py

    The verdict carries pass or fail, miss codes, a reflection for the next attempt, and whether a retry is useful. A semantic pass never covers a failed structural check.

  2. policy_action · reading the verdictloop/_lifecycle.pyrun · decide: PostVerify decisionPostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.py

    The PostVerify hook decides ACCEPT, REVISE or ESCALATE. An ACCEPT of a candidate that failed verification becomes escalate. With no decision, the runtime default applies (pass → accept, retryable → revise, otherwise escalate).

  3. policy_action · reading the verdictloop/_lifecycle.pyrun · decide: Stop · CONTINUEStop · CONTINUEcore/hooks/public.py

    Only when not escalating can the Stop hook’s CONTINUE instruction ask for a repair continuation. A hook instruction is an input to the next attempt, not an authority.

  4. continuation budget · default 2loop/_lifecycle.pyrun · decide: repair · attempt +1_arun_once · repair continuationloop/agent_loop.py

    With a repair instruction, and only while the attempt number is below the budget (two by default), the same request continues. At the budget it becomes escalate_budget_exhausted and waits for review.

Waiting for review

An unusable verdict, an attempt to turn a failure into a pass, or an exhausted budget withholds the candidate and pauses the session.

  1. verification_error · fails closedcore/agent/verify.pyfailure · no verdict: verification_errorpolicy_action · reading the verdictloop/_lifecycle.py

    A missing judge, a timeout or an invalid response becomes verification_error: neither a pass nor a repair signal. An unusable verdict never stands in for success.

  2. policy_action · reading the verdictloop/_lifecycle.pyrun · decide: PostVerify decisionPostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.py

    The PostVerify hook decides ACCEPT, REVISE or ESCALATE. An ACCEPT of a candidate that failed verification becomes escalate. With no decision, the runtime default applies (pass → accept, retryable → revise, otherwise escalate).

  3. policy_action · reading the verdictloop/_lifecycle.pyrun · decide: ESCALATE · pendingExternal reviewer

    The candidate is kept as pending_text and withheld from ordinary responses, the checkpoint is saved and the session is paused. No outside reviewer is contacted automatically.

  4. policy_action · reading the verdictloop/_lifecycle.pyrecord · observe: verdict · evidence rowstimeline · ledger decision rowsmemory · observability

    The timeline gets decision, evidence and pending rows, and the evidence ledger a verification_policy row. These are best-effort records, not proof of an outside effect.

Stops without verification

Cancel, limit and infrastructure stops and control-workflow runs are saved without public verification.

  1. arun · model turnloop/agent_loop.pyrun · decide: guards · limitsfailure · limit · cancel stoploop/_guards.py · models.py

    Guards such as round, time, cost and context limits, cancellation and repeated-failure detection end the turn with one member of the closed TerminationReason set. A limit disabled in configuration is not always enforced.

  2. failure · limit · cancel stoploop/_guards.py · models.pyfailure · no verdict: failure · cancel stopfinalize_and_return_asyncloop/_lifecycle.py

    Cancel, infrastructure and limit stops have no candidate to verify, so they are saved without public verification.

  3. control workflow · skip public verifyipc_server/poller.pyrun · decide: skip public verifyfinalize_and_return_asyncloop/_lifecycle.py

    When an IPC call asks to skip public verification or a control workflow is active, public verification is off for that run only and the previous value is restored afterwards.

  4. finalize_and_return_asyncloop/_lifecycle.pydata: save only · no verifycheckpoint · session statememory · observability

    A stop without verification still saves its result and checkpoint and emits the session-end events.

  5. finalize_and_return_asyncloop/_lifecycle.pydata: responseIPC · CLI caller

    Returns the final answer when completed; an empty answer with EXTERNAL_VERIFICATION_REQUIRED when waiting for review; the stop reason for a stop without verification.

Every connection at the same weight. Pick a flow to highlight only its path, with numbered steps.

  • Solid · the direction requests, candidates and results flow
  • Dashed · run, decide, authorize, configure
  • Long dash-dot · records and observation, separate from the verdict
  • Short dash · a failure or an unusable verdict
  • Heavy black line · the selected flow; numbers give the order
  • Box · a code or record boundary, its path in the header
  • Inner chip · a component in that boundary
  • Dashed box · outside that boundary
  • loop · finalization
  • stops · hooks · verdict
  • saving · records
  • IPC entry

Only call paths in pinned commit 9e2c041 are drawn. A judge’s pass is separate from an external benchmark verifier’s success; completion here is a decision inside the runtime.

Judge engine
The default is the LLM judge; Jev Choice judges only when judgment_engine is set to jev. Either way, an unusable judge gives verification_error, never success.
What hooks may do
PreVerify can only make the verdict stricter, PostVerify cannot pass a failed candidate, and Stop can ask for a continuation only when not escalating.
Waiting for review
Waiting for review records that an outside decision is needed. It does not notify anyone or mean the result was approved.