GEODE
Autonomous Agent Harness
From observation to the next action.
A local autonomous-agent harness you can hand research, file work and scheduled tasks.
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.
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.
arun · model turn
loop/agent_loop.pydata: stop proposaldeliverable stop · natural etc.loop/_guards.py · models.pyWhen 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.
deliverable stop · natural etc.
loop/_guards.py · models.pydata: completion candidatefinalize_and_return_asyncloop/_lifecycle.pyOnly natural, forced_text and actionable_partial are deliverable stops, and only these go on to public verification.
finalize_and_return_async
loop/_lifecycle.pyrun · decide: PreVerifyPreVerify · STRENGTHENcore/hooks/public.pyWith STRENGTHEN, the PreVerify hook can only add requirements and miss codes. It can make the verdict stricter, never pass it.
finalize_and_return_async
loop/_lifecycle.pyrun · decide: verify_turn_asyncstructural check · empty_turncore/agent/verify.pyA 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.
semantic judgment · LLM or Jev
core/agent/verify.pydata: judgment requestJudge modelThe 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.
semantic judgment · LLM or Jev
core/agent/verify.pydata: passed · rubric_missespolicy_action · reading the verdictloop/_lifecycle.pyThe 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.
policy_action · reading the verdict
loop/_lifecycle.pyrun · decide: PostVerify decisionPostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.pyThe 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).
policy_action · reading the verdict
loop/_lifecycle.pyrun · decide: Stop · CONTINUEStop · CONTINUEcore/hooks/public.pyOnly 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.
policy_action · reading the verdict
loop/_lifecycle.pydata: completed · savedcheckpoint · session statememory · observabilityOn a pass and accept, continued attempts are merged, the result is saved and the session is recorded as completed.
finalize_and_return_async
loop/_lifecycle.pydata: responseIPC · CLI callerReturns 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.
semantic judgment · LLM or Jev
core/agent/verify.pydata: passed · rubric_missespolicy_action · reading the verdictloop/_lifecycle.pyThe 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.
policy_action · reading the verdict
loop/_lifecycle.pyrun · decide: PostVerify decisionPostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.pyThe 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).
policy_action · reading the verdict
loop/_lifecycle.pyrun · decide: Stop · CONTINUEStop · CONTINUEcore/hooks/public.pyOnly 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.
continuation budget · default 2
loop/_lifecycle.pyrun · decide: repair · attempt +1_arun_once · repair continuationloop/agent_loop.pyWith 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.
verification_error · fails closed
core/agent/verify.pyfailure · no verdict: verification_errorpolicy_action · reading the verdictloop/_lifecycle.pyA 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.
policy_action · reading the verdict
loop/_lifecycle.pyrun · decide: PostVerify decisionPostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.pyThe 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).
policy_action · reading the verdict
loop/_lifecycle.pyrun · decide: ESCALATE · pendingExternal reviewerThe 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.
policy_action · reading the verdict
loop/_lifecycle.pyrecord · observe: verdict · evidence rowstimeline · ledger decision rowsmemory · observabilityThe 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.
arun · model turn
loop/agent_loop.pyrun · decide: guards · limitsfailure · limit · cancel stoploop/_guards.py · models.pyGuards 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.
failure · limit · cancel stop
loop/_guards.py · models.pyfailure · no verdict: failure · cancel stopfinalize_and_return_asyncloop/_lifecycle.pyCancel, infrastructure and limit stops have no candidate to verify, so they are saved without public verification.
control workflow · skip public verify
ipc_server/poller.pyrun · decide: skip public verifyfinalize_and_return_asyncloop/_lifecycle.pyWhen 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.
finalize_and_return_async
loop/_lifecycle.pydata: save only · no verifycheckpoint · session statememory · observabilityA stop without verification still saves its result and checkpoint and emits the session-end events.
finalize_and_return_async
loop/_lifecycle.pydata: responseIPC · CLI callerReturns 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.