GEODE
Autonomous Agent Harness
From observation to the next action.
A local autonomous-agent harness you can hand research, file work and scheduled tasks.
GEODE runtime vocabulary
- reasoning
- action
- observation
- plan
- memory
- tools
- hook
- reflexion
- rollouts
- data curation
- data governance
- evaluation
- scaffold search
- promotion
Reasoning: SYSTEM PROMPT · CONVERSATION · RUNTIME HINTS · MODEL · ADAPTER CALL · NEXT ACTION · TOOL SCHEMA · TEXT-ONLY TURN · CURRENT STEP · PROJECT MEMORY · RUNTIME RULES · EFFORT · thinking_budget · reasoning_effort · adaptive_thinking · effort_values · default_effort · binds_thinking · none · minimal · low · medium · high · xhigh · max · MODEL ROUTEAction: ACT · TOOL_USE · TOOLCALLPROCESSOR · DISPATCH · RESEARCH · BASH · COMPUTER USE · FILE · GIT · PROCESS · EFFECT RECEIPT · TOOLEXECUTORObservation: NEXT ACTION · RESEARCH · OBSERVE · TOOL_RESULT · RESULT · ERROR · CODE · DOCUMENT · SOURCE · EVIDENCE · EXCERPTPlan: CURRENT STEP · OBJECTIVE · PLANSTEP · EXPECTED OUTCOME · REMAINING STEPS · COMPLETED · ABANDONED · REVISION · UPDATE_PLAN · /PLAN · REPLAN · VERIFY FAILED · LOW CONFIDENCEMemory: SYSTEM PROMPT · CONVERSATION · PROJECT MEMORY · RUNTIME RULES · TOOL_RESULT · CONVERSATIONCONTEXT · MESSAGES · CONTEXT WINDOW · COMPACTION · CHECKPOINT · SESSION · RECOVERY · SQLITE · STATE.JSON · PreCompact · PostCompact · SessionStart · SessionEndTools: TOOL SCHEMA · TOOL_USE · TOOLCALLPROCESSOR · DISPATCH · BASH · COMPUTER USE · EFFECT RECEIPT · TOOL_RESULT · BOUNDTOOLPLAN · GENERATION · HASH · TOOLEXECUTOR · SCOPE · POLICY · HOOK · APPROVAL · HITL · PreToolUse · PostToolUse · MCP CLIENT · PermissionRequestHook: DISPATCH · HOOK · PreToolUse · PostToolUse · UserPromptSubmit · PermissionRequest · PreCompact · PostCompact · SessionStart · SessionEnd · SubagentStart · SubagentStop · PreVerify · tool_request · tool_execution · llm_request · llm_execution · REQUEST TRANSFORM · next_call · WRAPPER · REGISTRY · PostVerify · StopReflexion: NEXT ACTION · EVIDENCE · REPLAN · VERIFY FAILED · LOW CONFIDENCE · HOOK · PreVerify · HYPOTHESES · CONFIDENCE · NEXT_ACTION_HINT · RECORD_REFLECTION · CONTRADICTION · REPAIR · VERIFY · PostVerify · Stop · COMPLETION · CONTINUE · TIME · TOKEN BUDGET · CANCELLATIONRollouts: SESSION · ROLLOUT · EXAMPLE · SEED · REPETITION · ATTEMPT · TRAJECTORY · REWARD · OUTCOME · TRACE · RUN IDData Curation: TASK SYNTHESIS · SEED GENERATION · PROXIMITY · RANKING · META-REVIEW · ELO TOURNAMENT · PILOT · DEDUPLICATION · SURVIVOR SELECTION · FROZEN POOLData Governance: PROVENANCE · LINEAGE · SCHEMA VERSION · SOURCE DIGEST · PRIVACY REVIEW · ALLOWLIST · IMMUTABLE RELEASE · SPLIT ISOLATION · SEALED HOLDOUTEvaluation: TRAJECTORY · OUTCOME · TRACE · EVALUATION HARNESS · TASK · RUBRIC · GRADER · VERIFIER · VALIDITY · FITNESS · REPLICATION · TASK COVERAGEScaffold Search: RECOVERY · FITNESS · CANDIDATE · HYPOTHESIS · MUTATION POLICY · BASELINE · FROZEN EVALUATOR · POLICY INJECTION · SEARCH SPACE · PROMOTION GATEPromotion: SEALED HOLDOUT · PROMOTION GATE · CRUCIBLE · PAIRED TRIALS · BOOTSTRAP BOUND · FROZEN CONTRACT · TASK-PACK HASH · TRAIN · SEALED TEST · SAFETY VETO · KEEP · REJECT · INVALID
Recorded evaluation · MCPMark PostgreSQL · 2026-07-04
Before changing anything, it found what was already there.
The task: row-level security for a social service with five tables.
- ResearchRead the five tables, four helper functions already in place, RLS off on all five, and the policies, privileges and roles.
- ActOne transaction: 20 policies and RLS on, reusing 3 existing helpers and adding 3 functions.
- Verify18 passed, 0 failed. All 13 tool responses over 9 turns came back without an error.
Verifier output, 18 lines (verbatim)
- RLS enabled on users
- RLS enabled on channels
- RLS enabled on channel_moderators
- RLS enabled on posts
- RLS enabled on comments
- Users can update their own profile
- Users blocked from updating other users' profiles
- Channel owners can update their channels
- Non-owners blocked from updating channels
- Post authors can update their posts
- Channel moderators can update posts in their channels
- Unauthorized users blocked from updating posts
- Comment authors can update their comments
- Post authors can moderate comments on their posts
- Channel owners can add moderators
- Non-owners blocked from adding moderators
- Content visibility varies correctly based on user context
- Anonymous users can see 3 public user profiles (correct)
A past run in a configured evaluation sandbox, not a live database or a real security incident. Row counts before the policies are not in the record, so none are shown. Public run record (meta.json, commit 23e3428)
Reviewing a result and repairing it (Reflexion-inspired, within the same task) is a capability of the current GEODE runtime. No such repair appears in this record: every tool response came back without an error. Runtime documentation (hook-system.md)
The model picks the next action; the host keeps the execution boundary.
The runtime from a request entering a session, through the model call and the authority checks on each proposed tool call, to execution, results and records. Pick a flow to highlight only its path, with numbered steps.
The model chooses the next action; the runtime checks tool permissions and decides when the work is complete.
External Scaffold Search / SIL experiments began May 15, 2026
Install the geode-agent package from PyPI or the public repository and run it from your own terminal. It can also be reached as an MCP server.
Request → model call
A terminal request arrives over IPC, a session is composed, and the loop calls the model with the system prompt, conversation and tool schemas.
Terminal userdata flow: prompt · cli.sockCLIPoller · IPC socket
core/serverThe thin CLI sends the request to the serve daemon’s IPC socket (~/.geode/cli.sock). The REPL runs the same session composition in-process.
CLIPoller · IPC socket
core/serverauthority · composition: create_session(IPC)SharedServices.create_sessionsupervised/services.pyEach connection composes a session. The mode sets the HITL level, time budget and denied tools, and projects the BoundToolPlan onto the chosen provider.
CLIPoller · IPC socket
core/serverauthority · composition: lane per requestLaneQueue · session · globalsupervised/services.pyBefore running a request, the session lane and the global lane are both held, which limits concurrent runs.
SharedServices.create_session
supervised/services.pyauthority · composition: ToolExecutor · AgenticLoopAgenticLoop · six phasescore/agent/loopBuilds the executor and the loop as one pair that shares the hooks, MCP, skills and resource locks.
LaneQueue · session · global
supervised/services.pydata flow: arun(prompt)AgenticLoop · six phasescore/agent/loopRuns one user turn in six phases: prepare input, prepare the call, call the provider, process tools, observe and compact, terminate.
system prompt · declared sources
core/agent/loopdata flow: system promptadapter.acomplete · error classescore/llm/adaptersBuilt each turn from declared sources such as selected GEODE.md sections and rules. ContextAssembler’s five-tier facade is used only when called explicitly; it is not the default loop’s input.
messages · ConversationContext
core/agent/loopdata flow: messagesadapter.acomplete · error classescore/llm/adaptersThe conversation and earlier tool results travel separately from the system prompt.
BoundToolPlan · immutable
core/tools/plan.pyauthority · composition: tool schemasadapter.acomplete · error classescore/llm/adaptersOnly the tools of the BoundToolPlan bound to this step are visible to the model. It is an immutable snapshot with a generation and a content hash.
AgenticLoop · six phases
core/agent/loopdata flow: StepSnapshot · requestadapter.acomplete · error classescore/llm/adaptersThe StepSnapshot fixes this call’s model, tools and correlation IDs. LLM middleware cannot swap a bound adapter.
adapter.acomplete · error classes
core/llm/adaptersdata flow: HTTPSLLM providersA per-provider adapter makes the call. Failures are classified and retried only within a set limit, or end the turn with a termination reason.
adapter.acomplete · error classes
core/llm/adaptersdata flow: response · tool_useAgenticLoop · six phasescore/agent/loopText alone goes to termination; tool_use goes to tool processing.
Tool authority → effect → result
A tool_use proposal runs only after every check passes; denials, results and errors all return from the executor and become the next model input.
AgenticLoop · six phases
core/agent/loopdata flow: pending batch · round saveSQLite messages · state.jsonmemory/session_checkpoint.pyIn a session with checkpointing configured (a checkpoint and a session id), the proposed batch is saved before any tool runs, and the batch does not run if it cannot be saved. The completed batch is saved again. Callers without a checkpoint do not get this guarantee.
AgenticLoop · six phases
core/agent/loopdata flow: tool_use blocksToolCallProcessortool_executor/processor.pyA model proposal is not permission. Each call gets a ToolContext carrying the loop’s model and adapter identity.
ToolCallProcessor
tool_executor/processor.pydata flow: aexecutescope · policy · schematool_executor/executor.pyChecks session scope, request-middleware rewrites, policy and schema in turn. A rewrite that lowers the safety level or the personal-data class is denied.
BoundToolPlan · immutable
core/tools/plan.pyauthority · composition: allowed · safety levelscope · policy · schematool_executor/executor.pyExecutable handlers and safety levels come from the BoundToolPlan projected for the session.
PreToolUse · PostToolUse
tool_executor/executor.pyauthority · composition: PreToolUse · PostToolUseHookRegistry · decisionscore/hooksPublic hooks decide block, argument rewrite or permission request, and a rewrite is followed by scope, policy and schema checks again. After execution, a hook may add context or withhold the result.
approval · HITL
tool_executor/executor.pyauthority · composition: approval requestTerminal userIn an IPC session the approval request is relayed to the thin CLI. Modes without a person apply the deny policy by default; the one exception is DAEMON computer use, when an operator separately enables it (blocked otherwise).
tool_executor/executor.pydenial before execution: denied before executionToolCallProcessor
tool_executor/processor.pyA scope, policy or schema rejection, a PreToolUse block or a refused approval returns as an error result without dispatch. In that case no effect of this call began.
effect receipt
tool_executor/executor.pydata flow: effect admit · commitEffectReceiptStorememory/effect_receipts.pyEffects such as file changes, outbound messages or administrative actions are admitted before they run. An uncertain outcome is not run again; it asks for reconciliation.
resource lock · dispatch
tool_executor/executor.pydata flow: handler calltool handlers · bash · computercore/toolsDispatches to the bound handler after locking its resource keys. A call aborted at its deadline may still be running outside.
resource lock · dispatch
tool_executor/executor.pydata flow: MCP callMCPServerManagercore/mcp/manager.pyOnly MCP tools with a declared resource policy are called.
MCPServerManager
core/mcp/manager.pydata flow: tools/callMCP serversThe server catalog comes from global settings and from project settings that passed the trust check; that check applies to project entries only. The MCP manager applies its extension and resource policy.
tool handlers · bash · computer
core/toolsdata flow: file · git · process changesFiles · git · processesExecuted changes stay as outside state. The checkpoint recovers the conversation only and does not undo them.
tool_executor/executor.pydata flow: result · post-dispatch errorToolCallProcessor
tool_executor/processor.pyAfter dispatch, normal results and errors (including timeouts and uncertain outcomes) return through PostToolUse. An error or timeout does not mean the outside work stopped or was undone.
ToolCallProcessor
tool_executor/processor.pydata flow: tool_resultmessages · ConversationContextcore/agent/loopResults, denials and errors alike are serialized as tool_result and become messages in the next model input.
ToolCallProcessor
tool_executor/processor.pyrecord · observation: call · result observationSessionTimeline · append-onlyobservability/session_timeline.pyWrites the call and its result (ok or error) to the timeline, including calls denied before execution. The record is observation; it does not prove that an outside effect began or succeeded.
Records · recovery · completion
The checkpoint, timeline and evidence rows are written separately. There is no shared transaction, and the checkpoint recovers the conversation only.
AgenticLoop · six phases
core/agent/loopdata flow: pending batch · round saveSQLite messages · state.jsonmemory/session_checkpoint.pyIn a session with checkpointing configured (a checkpoint and a session id), the proposed batch is saved before any tool runs, and the batch does not run if it cannot be saved. The completed batch is saved again. Callers without a checkpoint do not get this guarantee.
SQLite messages · state.json
memory/session_checkpoint.pydata flow: resume restoreAgenticLoop · six phasescore/agent/loopOne restore path brings back messages, cognitive state and guard counters. The process-local TaskGraph is not recovered.
AgenticLoop · six phases
core/agent/looprecord · observation: turn recordSessionTimeline · append-onlyobservability/session_timeline.pyAn append-only execution history, never replayed as state.
AgenticLoop · six phases
core/agent/loopauthority · composition: completion checkverify_turn_asynccore/agent/verify.pyThe model’s proposal to stop becomes completion only through Verify.
verify_turn_async
core/agent/verify.pyauthority · composition: PostVerify · StopHookRegistry · decisionscore/hooksPublic hook decisions say whether to continue with a repair, and repairs happen only within a set budget (two by default).
AgenticLoop · six phases
core/agent/looprecord · observation: evidence rows · best-effortEvidenceLedger · JSONLagent/evidence_ledger.pyRedacted diagnostic rows. Hashes support correlation; a row does not prove an effect happened, and it is not written in one transaction with the timeline or checkpoint.
AgenticLoop · six phases
core/agent/looprecord · observation: cognitive · lifecycle eventsHookSystem · observationcore/hooksObservation hooks receive and record events; they do not decide execution.
Other entry paths
Messengers enter as DAEMON sessions of the serve daemon; an external MCP host’s run_agent enters a separately built headless one-shot loop.
Messenger channeldata flow: channel messagemessenger pollers
core/serverThe serve daemon’s pollers handle messages from bound channels only.
messenger pollers
core/serverauthority · composition: create_session(DAEMON)SharedServices.create_sessionsupervised/services.pyA mode with no person to approve: the default deny policy and a time budget apply. Only computer use can be separately enabled by an operator; without that it stays blocked.
messenger pollers
core/serverdata flow: arun(message)AgenticLoop · six phasescore/agent/loopA thread keeps one fixed session id and continues one checkpoint chain.
External MCP hostdata flow: run_agent(prompt)run_agent · one-shot
core/mcp_server.pyAn external MCP host calls GEODE as a tool.
run_agent · one-shot
core/mcp_server.pydata flow: headless one-shot loopAgenticLoop · six phasescore/agent/loopA separately built headless executor and loop that bypass SharedServices. The default denylist applies as is, so tools such as run_bash, delegate_task and computer are removed; the DAEMON computer-use exception does not exist here.
Every connection at the same weight. Pick a flow to highlight only its path, with numbered steps.
- Solid · the direction requests, messages and tool results flow
- Dashed · session composition, authority or verdict; not a data path
- Long dash-dot · records and observation; never replayed as state
- Short dash · denial before execution, no effect
- Heavy black line · the selected flow; numbers give the order
- Box · a code-owning boundary, its source path in the header
- Inner chip · a component inside that boundary
- Dashed box · outside the runtime process
- Orange outline · where a model decides
- Run loop
- Authority · verdicts
- Record stores
- Entry · connection · execution
Only connections whose calls were confirmed are drawn. ContextAssembler’s five-tier facade, the TaskGraph and research experiments such as Jev, SIL and Crucible are not on this runtime path. Async cancellation does not stop synchronous work already started or undo effects that happened.
Supported models · by provider
The code’s catalog choices and shipped defaults, not a list in which every model passed a live API call. Configured fallback chains are empty by default, and exact IDs are never upgraded to newer versions automatically.
Anthropic
API
- PrimaryClaude Opus 5.5
claude-opus-5-5Default - SecondaryClaude Sonnet 5
claude-sonnet-5Default - BudgetClaude Haiku 4.5
claude-haiku-4-5-20251001Default
Show all 12 catalog IDs
API
claude-fable-5-1claude-opus-5-5defaultclaude-opus-5claude-sonnet-5defaultclaude-haiku-4-5-20251001defaultclaude-fable-5claude-opus-4-8claude-opus-4-7claude-opus-4-6claude-opus-4-5claude-sonnet-4-6claude-sonnet-4-5-20250929
The code rejects the subscription OAuth route.
- PrimaryClaude Opus 5.5
OpenAI
API · Codex subscription
- API and Codex defaultGPT-6 Sol
gpt-6-solDefault
Show all 11 catalog IDs
API · Codex subscription
gpt-6-astragpt-6-soldefaultgpt-6-lunagpt-5.6-solgpt-5.6-terragpt-5.6-luna
API only
gpt-5.5gpt-5.3-codexgpt-5.4gpt-5.4-minigpt-5.4-nano
Two access routes to one provider; the catalog sets which routes each model allows.
- API and Codex defaultGPT-6 Sol
Z.ai / GLM
PAYG
- DefaultGLM-5.3
glm-5.3Default
Show all 9 catalog IDs
PAYG
glm-5.3defaultglm-5.3-flashglm-5.3-flashxglm-5.2glm-5.1glm-5glm-4.7glm-4.7-flashxglm-4.7-flash
The code does not admit the GLM Coding Plan route.
- DefaultGLM-5.3
OpenRouter
Routing service
- PickerFree (smoke)
openrouter/openrouter/freeRouter - PickerAuto (variable)
openrouter/openrouter/autoRouter
Router selections, not one fixed model. Explicitly configured IDs can also be kept.
- PickerFree (smoke)
TypeSafe / Jev
Decision-only · separate from text generation
- Direct
jev-1.13.0Decision-only - Through OpenRouter
typesafe/jev-1.13Decision-only
An optional adapter that only makes judgments; it is not a root text-generation model. The default judgment engine is llm, and Jev has to be selected. The Jev study’s own configurations follow the Jev view’s records.
- Direct
SourceGEODE main 373d420Public commit October 7, 2026 · checked October 8, 2026
Experiments
Models and routes as recorded at the time, not current defaults or a complete compatibility list.
GEODE benchmark report
July 31, 2026
- GEODEGPT-5.6 Sol
gpt-5.6-solOpenAI subscription · high
- GEODEGPT-5.6 Sol
Terminal-Bench 2.1 · Harbor 0.22.0 paired specification
August 27, 2026
- GEODE · native CodexGPT-5.6 Sol
gpt-5.6-solsubscription · max
A frozen specification; not every planned trial became a valid result.
- GEODE · native CodexGPT-5.6 Sol
Archived SIL run run-2606-broken-tool-use
- Target scaffoldGPT-5.5
gpt-5.5openai-codex - Auditor · judgeClaude Opus 4.8
claude-opus-4-8PAYG
A record of separate roles, not two interchangeable defaults.
- Target scaffoldGPT-5.5