ReferenceReference

Frontier comparison

What GEODE borrows from Claude Code, Codex CLI, OpenClaw, and Hermes, and where it differs. The reference entry point for GEODE's position in the lineage.

On this page
  1. System-level positioning
  2. Prompt definition layer
  3. Hashing and integrity
  4. Prompt caching
  5. Async runtime discipline
  6. Observability
  7. Security
  8. Why GEODE was the only one to ratchet

System-level positioning

GEODE is a synthesis: each row below borrows from at least one frontier system. Patterns explicitly cited in source: Claude Code's while(tool_use), Codex CLI's sandbox-default, OpenClaw's Policy Chain and Lane Queue, and Karpathy's P1-P10.

AxisClaude CodeCodex CLIOpenClawHermesautoresearchGEODE
PurposeCoding assistCode automationMulti-channel gatewaySelf-learning agentAutonomous ML loopLong-running autonomous execution
Domaincodecodechat routingopen-domainML loopGeneral purpose: research, analysis, automation, schedules
Main primitivewhile(tool_use)sandbox + approvegateway + laneskill loopbranchless dumb platformwhile(tool_use) AgenticLoop + LaneQueue
Layeringsingle CLIsingle CLIgateway-centricagent + skills3-file contract5 layers: Model / Runtime / Harness / Agent / Self-Improving
MemoryCLAUDE.md hierarchy + auto memory (~/.claude)hierarchical AGENTS.md + memories pipelineper-channel storepersistent + skill catalogprogram.md5-tier: Identity / User Profile / Org / Project / Session (core/memory/context.py)
Self-verificationnonesandboxpolicy chainnoneratchetPetri adversarial audit + margin gate + prompt-hash ratchet
Automation triggerhooks + scheduled cloud agentslifecycle hooks (no cron)cron + standing ordersskill auto-generateovernight loophook events + scheduler + the auto-trigger sidecar
Multi-LLMAnthropic models only (API/Bedrock/Vertex backends)OpenAI-first + model_providers extension (incl. Bedrock)9 model API familiesAnthropic-centric(single)Four explicit routes (Anthropic / OpenAI+Codex / OpenRouter / GLM), separating direct paths from inference-router identity
Sub-agentTask toolthread fork (spawn_subagent)spawn + announceparallel delegate spawnnoneBorrowed: Task tool + OpenClaw Spawn+Announce (core/agent/sub_agent.py)
Sandboxbash sandbox (opt-in)OS-levelgateway isolationnoneconstraint loop6-layer PolicyChain (core/tools/policy.py)

The combination only GEODE ships

  • An explicit self-improving layer. The fifth layer mutates a scaffold of seven behaviour kinds, selects via Petri 22-dim audits and a margin gate, and preserves lineage as a git champion chain (evolve/scaffold_search/). No weight or parameter updates anywhere; the mechanism is selection.
  • MCP in both directions. core/mcp/ is the client that attaches external MCP servers, and geode-mcp (core/mcp_server.py) is the first-class server that exposes GEODE itself as a tool to external hosts. Codex CLI also ships both directions (mcp-server plus mcp_servers); the difference is that GEODE additionally exposes self-improving loop state (self_improving_*) as tools.
  • No-fallback default. [model.fallbacks] ships empty: a primary failure surfaces as an honest error, and cross-provider chains are opt-in via ~/.geode/routing.toml (core/llm/router/calls/_failover.py).
  • ChatGPT Plus JWT verification. The chatgpt_plan_type claim is extracted from the access token at OAuth time and embedded in the plan record (core/auth/oauth_login.py); no separate API call for the entitlement check.

Prompt definition layer

AxisGEODEHermesOpenClawClaude Code
Source locationcore/llm/prompts/*.md (external markdown)agent/prompt_builder.py (Python const)src/agents/system-prompt.ts (TS const)src/core/system-prompt.ts (TS assembly)
Build timeHashed at module import, assembled per turnSession start (cached)Per-call modularPer-turn dynamic
User memory5-tier ~/.geode/memory/Frozen JSON snapshotWorkspace HEARTBEAT.mdCLAUDE.md 4-tier + auto MEMORY.md
Skill formatXML <available_skills> (core/skills/skills.py, substituted via {skill_context})XML <available_skills>XML <available_skills>SKILL.md markdown + JSON manifest

Hashing and integrity

AxisGEODEHermesOpenClawClaude Code
AlgorithmSHA-256[:12]NoneSHA-256 (full)None (not found in source)
Pin / CI gateYes: _PINNED_HASHES + verify_prompt_integrity (core/llm/prompts/__init__.py)NoneDetection onlyNone
NormalizationUTF-8 / json sort_keysmtime + size manifestCRLF strip + sort + lowercasen/a

Prompt caching

AxisGEODEHermesOpenClawClaude Code
Anthropic ephemeralYes: static/dynamic boundary splitYes: system_and_3Yes: boundary markerYes
Boundary markerPROMPT_CACHE_BOUNDARY = <dynamic_context> (core/agent/system_prompt.py)None<!-- OPENCLAW_CACHE_BOUNDARY -->SYSTEM_PROMPT_DYNAMIC_BOUNDARY
Messages history cacheYes: rolling breakpoints on recent user messages (apply_messages_cache_control, core/llm/providers/anthropic.py)Yes: last 3Yes: last user messageYes: last user blocks

The other half of cache stability is omitting synthetic reminder messages. Date and runtime rules live in the dynamic system region in system_prompt.py, while message history appends only real turns and remains an exact prefix across calls.

Async runtime discipline

Measured directly from workspace sources after the 2026-06-12 event-loop pollution incident (v0.99.183~185). All three systems converge on one rule: never build a disposable event loop at runtime, and keep loop-bound resources (httpx connection pools) inside the loop that created them.

AxisGEODEHermesOpenClaw
Loop topologyMultiple persistent loops: main serve + CLI poller + per-channel pollers (asyncio.Runner threads)One gateway loop; channel adapters are async tasks on it (gateway/run.py)Single Node loop + lane concurrency (command-queue.ts)
Thread → loop bridgerun_coroutine_threadsafe: webhook thread marshals into the main serve loop (core/cli/typer_serve.py)run_coroutine_threadsafe: cron thread marshals into the main loopn/a (single loop)
Loops in sync bridgesZero disposable: asyncio.run only at true process edges; violations trip the run_process_coroutine canary WARNING (core/async_runtime.py)Persistent per-thread loop cache, never disposable (model_tools.py _run_async)n/a
SDK client scopePer-loop: LoopAffineClientCache keys clients by weakly-referenced loop (core/llm/loop_affinity.py)Bound to the creating loop, sharing its lifetimeGlobal (safe under a single loop)
Hang defenseTool/MCP wall-clock deadlines (asyncio.wait_for) + a timing-constant coherence inequality guardPer-tool timeoutsLane concurrency caps
Regression guard25-test guardrail suite (async handler pins, client-cache ratchets, deadline coherence) + runtime canaryNoneNone

GEODE is the only one keeping multiple loops. Per-channel thread isolation is a design choice; its cost, cross-loop sharing of loop-bound resources (the web_search instant-fail/eternal-hang incident: disposable loops per tool call × a global client cache), was closed in v0.99.183~185 with async-native handlers, per-loop clients, and deadlines. The disposable-loop residues (tool path, webhook, verify judge) are all gone, and the guardrail suite keeps them gone.

Observability

AxisGEODEHermesOpenClawClaude Code
Primary channelPROMPT_ASSEMBLED hook payload (core/agent/loop/agent_loop.py)per-tool preview log (variable length)cache-trace.ts JSONLlogEvent('tengu_*') telemetry
External tracingOptional OTLP (core/observability/otel_export.py)Langfuse pluginSelf JSONLSelf telemetry

Security

AxisGEODEHermesOpenClawClaude Code
Prompt-injection scanNone (open GAP)10 patterns + 10 invisible Unicode charsPath/URL sanitizationTrusts user intent
Override policyAppend-only (caller system_suffix)Append-onlyAppend-onlyPriority chain

Why GEODE was the only one to ratchet

GEODE's prompts live in markdown files. Hermes, OpenClaw, and Claude Code keep prompts as inline strings inside TypeScript or Python source. Inline strings fight a hash-based ratchet through autoformatter noise, IDE renames, and merge-conflict resolutions. External markdown makes the file the unit of change, and the hash becomes meaningful.

The cost is explicit too: every intentional prompt change pays one extra re-pin commit. In exchange, unintentional changes never ship, enforced by CI. The full shape is in Why ratchet discipline.

Moved from the GEODE repository’s documentation site. Source commit de077a4 · View the source on GitHub