World Model MCP

Coding agents remain blind to the codebase they operate on. They infer structure late, reduce it to prompts, and ignore it when decisions are made in real time — repeating the same mistakes, hallucinating APIs that don't exist, and forgetting learned constraints the moment context compacts.

World Model MCP is the memory-graph infrastructure that closes that gap. A temporal knowledge graph that validates code changes against learned constraints at the edit boundary, re-injects relevant context after compaction, tracks contradictions with confidence-weighted resolution, adversarially verifies retrievals via an independent Coach LLM, and runs across Claude Code, Cursor, Codex, pi, OpenClaw, Hermes Agent, Continue, GitHub Copilot Chat, Cline, and Windsurf.

Status: v0.14.0 — telemetry sink migration + right-to-erasure. Opt-in anonymous telemetry (off by default) now ships to https://etch.systems/api/telemetry/ingest — unauthenticated, rate-limited server-side by install_id, source IP stripped from access logs, 8 KB payload ceiling. Previous v0.7.3–v0.13 series shipped an empty PAT stub into every PyPI wheel, so opt-in telemetry silently no-op'd for the entire two-month interval; v0.14 is the first release where it actually works. New world-model telemetry --forget-me command DELETEs every server-side row for your install_id AND wipes local state, honouring GDPR right-to-erasure regardless of server reachability. Server-side 90-day auto-TTL enforces data-minimisation. Companion hosted service: Etch — cryptographic notary + governance plane for AI agent decisions, built on this OSS memory layer. v0.13.0 (2026-07-12) shipped 30 MCP tools, 27 CLI subcommands, 847 tests, pre-registered SWE-bench Verified repeat-mistake benchmark with a multi-seed replication appendix, a v0.8.1 contradiction-resolution benchmark at 100.0% on the auto strategy, AND a v0.12.12 Coach-Player benchmark at 100.0% across 12 hand-labeled pairs. v0.13.0 (2026-07-12) ships an opt-in tamper-evident audit log: every fact / constraint / event / decision write chains into an append-only log; every 1024 entries a Merkle epoch closes with a hybrid Ed25519 + SLH-DSA-SHA2-128f (FIPS 205) signature so external compliance auditors can independently verify no history rewriting has occurred. Two new MCP tools — prove_entry_inclusion and get_audit_log_head — expose the read-side proof APIs. Enable with WORLD_MODEL_AUDIT_LOG=on. Full threat model, key management, and auditor workflow in docs/AUDIT_LOG.md. Reference verifier ships in Python (this repo) and TypeScript (world-model-mcp-verifier). Ed25519 via cryptography, SLH-DSA via pyspx (pure Python, no C dependencies). Storage overhead ~3 MB per project per year for a median deployment. v0.12.14 (2026-07-11) shipped an FTS5 metacharacter sanitizer in knowledge_graph.py — raw-then-sanitized retry so intentional FTS5 operator syntax (Legacy OR async) that internal callers use still works while user queries containing ?, *, and other metacharacters no longer crash query_fact or find_contradictions. Bug found via the new TypeScript SDK's first integration test on 2026-07-10. Same release shipped a Contributor License Agreement workflow (CLA.md + contributor-assistant/github-action) to preserve future relicensing options — the project stays MIT. v0.12.13 (2026-07-07) adds two follow-ups sourced from prior threads: an OpenAI-compatible Coach backend (WORLD_MODEL_VERIFICATION_BACKEND=openai-compatible — points Coach at OpenRouter / Ollama / vLLM / any OpenAI-shape endpoint without a proxy) and a doctor extension that scans ~/.copilot/logs/*.log for the two silent-failure signatures documented in copilot-cli #4001. v0.12.12 (2026-07-07) shipped Coach-Player adversarial verification (verify_retrieval tool + 12-pair hand-labeled benchmark), a pattern ported from the maintainer's earlier y=c project. v0.12.0 (2026-07-06) was the breadth+depth umbrella release: nine substantive changes across new adapter coverage (Copilot / Cline / Windsurf / Continue --global), consumer wiring for the v0.11.1 content-type schema plus governance schema additions (influence_state / expires_at), and a diagnostic + spec-readiness pass (world-model doctor, MCP 2026-07-28 audit). Adapter roster now covers ten runtimes. v0.11.0 (2026-07-02) is a depth release. v0.10 (2026-07-01) extended the harness-neutral memory story from four runtimes to seven with the OpenClaw / Hermes / Continue adapters; v0.11.0 solves real problems for the users we now have rather than adding more runtimes. Four things ship: (A) auto contradiction-resolution strategy rewrite — folds in confirmer awareness, per-evidence-type decay, distinct-source-tool counting, and tie-detection; benchmark jumps from 77.1% to 100.0% on the same 105-pair × 19-category dataset. (B) Hermes native MemoryProvider plugin — intercepts writes at Hermes' routing layer rather than only surfacing tools, closing the architectural gap the v0.10 MCP adapter could not, motivated by Hermes #47349. (C) content-type routing schema field (rule / fact / procedure) — nullable and additive, enables MemoryProvider implementations to route writes by content shape, not just by tool call. (D) dogfooding case study — publishes what the fact graph captured about the world-model-mcp codebase itself (3 learned constraints with real violation counts, 1 real bug_fix reflection, 608 facts, 600 entities) AND what it did not capture (empty events / decisions / sessions tables). Pushing on that anomaly surfaced the actual root cause: setup_command wrote unquoted $CLAUDE_PROJECT_DIR in every generated hook command, so any user whose project path contains a space silently got zero hook captures. The bug was shipped since v0.7.3; the fix ships in this release with a regression test. Reproducibility contract: python scripts/dogfooding_snapshot.py regenerates the cited numbers byte-for-byte from the shipped DB. v0.10.1 was a doc-honesty patch (stale Zenodo DOI reference corrected). v0.9.2 shipped the multi-seed replication appendix per pre-registered SEED_PLAN.md: on the 17-instance subset, load-bearing replication count is 0 of 7, mean paired delta across two seeds is +0.24 per instance with bootstrap 95 percent CI [0.00, 0.47]. The v0.9 +10.2 pts headline reads as a single-trial upper bound; the wedge claims (lifecycle-hook capture, per-fact provenance, per-evidence-type decay, PreToolUse defer) survive the multi-seed update because they are architectural, not empirical. Full appendix and per-instance results in benchmarks/repeat-mistake/RESULTS.md. v0.9.1 restored the embedded telemetry token after a release-mechanics miss in v0.9.0. v0.9.0 shipped the empirical wedge proof. v0.8.1 expanded the contradiction-resolution benchmark to 105 pairs across 19 categories. v0.8.0 added domain-aware confidence decay with per-evidence-type TTL, per-item provenance fields source_tool and confirmer, slash command write operations, and a confirmer parameter on resolve_contradiction. Antigravity adapter held pending a TransformCompactionHook in the SDK. v0.7.6 added the /world-model slash command and status-watch TUI widget. v0.7.5 added the Codex CLI adapter. v0.7.0 introduced PostCompact auto-injection, the defer enforcement tier, confidence-weighted contradiction resolution, and a compaction audit log. Contributions welcome.

PyPI Downloads License: MIT Python 3.11+ world-model-mcp MCP server DOI

mcp-name: io.github.SaravananJaichandar/world-model-mcp

Numbers

Benchmark Score Details
SWE-bench Verified repeat-mistake +10.2 pts (67.3% → 77.6% on 49 paired instances) Pre-registered, Claude Code 2.1.177 headless, Zenodo DOI 10.5281/zenodo.21076824. Within-domain +15.0 pts, cross-domain +6.9 pts with zero regressions. Multi-seed appendix documents single-trial upper bound honestly.
Contradiction-resolution 100.0% on auto strategy 105 pairs × 19 categories, deterministic (no LLM). Shipped since v0.11.0.
Coach-Player verification 100.0% exact match 12 hand-labeled pairs (4 grounded, 4 partial, 4 hallucinated). Layer 3 adversarial verification via independent Coach LLM. Shipped since v0.12.12.

The SWE-bench number is the load-bearing empirical claim. The other two are internal correctness benchmarks for shipped components. Reproducibility scripts in each benchmark directory or the linked repo.

Tamper-evident audit log (v0.13, opt-in)

For compliance-track deployments where the audit trail must be cryptographically verifiable (SOC2, HIPAA, FISMA):

export WORLD_MODEL_AUDIT_LOG=on
world-model  # start server as usual

Every fact, constraint, event, and decision write chains into an append-only log. Every 1024 entries (env-tunable), an epoch closes with a Merkle root signed by a hybrid Ed25519 + SLH-DSA-SHA2-128f signature (both FIPS-approved; both required for verification). Compliance auditors call prove_entry_inclusion(row_id) via MCP, load the operator's public keys from <db_path>/keys/public_keys.json, and run the reference verifier locally — no round trip needed for verification.

  • Full threat model, key management, auditor workflow: docs/AUDIT_LOG.md
  • Reference verifier (Python + TypeScript): world-model-mcp-verifier repo
  • Storage overhead: ~3 MB per project per year for a median deployment
  • Non-opt-in path is unchanged: no schema, no keys, no crypto imports if WORLD_MODEL_AUDIT_LOG is unset

The audit log is deliberately opt-in. If your deployment does not have a cryptographic-audit requirement, leave it off — the log adds storage, one hash per write, and crypto dependencies. None of that is worth paying for if nobody in your stack is going to audit the log.

If world-model-mcp helped you, star the repo or open an issue with what worked or didn't. I read every one and the feedback shapes what ships next.


What It Does

World Model MCP creates a temporal knowledge graph of your codebase that learns from every coding session to:

  • Prevent Hallucinations -- Validates API/function references against known entities before use
  • Stop Repeated Mistakes -- Learns constraints from corrections, applies them in future sessions
  • Reduce Regressions -- Tracks bug fixes and warns when changes touch critical regions
  • Survive Compaction -- Re-injects top constraints and recent facts after the agent's context window resets
  • Resolve Contradictions -- Picks a winner between conflicting facts using confidence, recency, or source count

Think of it as a long-term memory layer that runs alongside Claude Code, Cursor, Codex, pi, OpenClaw, Hermes Agent, Continue, GitHub Copilot Chat, Cline, Windsurf, or any MCP-aware coding agent.


See it working

Three cloneable starter repos show world-model-mcp wired into a real Python (FastAPI + SQLAlchemy) project across the three highest-adoption MCP runtimes. Each ships 5 seeded constraints, 1 bug-fix reflection, and a WHAT_TO_TRY.md with concrete workflows. Fork one, pip install, and see the memory layer catch a constraint violation on the first edit.

Starter Runtime Config shape Automatic enforcement
world-model-mcp-claude-code-starter Claude Code CLI .mcp.json + .claude/settings.json Yes (4 lifecycle hook events)
world-model-mcp-cursor-starter Cursor Editor .cursor/mcp.json + .cursor/hooks.json Yes (3 lifecycle hook events)
world-model-mcp-copilot-chat-starter VS Code + Copilot Chat .vscode/mcp.json ("servers" key, not "mcpServers") No — Copilot Chat lacks lifecycle hooks; memory queryable via MCP tool calls only

All three point at the same .claude/world-model/ DB path, so installing multiple starters (or all three) on one repo produces a shared fact graph across runtimes.


Hosted companion: Etch

world-model-mcp is the OSS memory + tamper-evident audit layer. Etch (etch.systems) is the hosted companion — cryptographic notary + governance plane for AI agent decisions, built on this OSS core. Same crypto primitives (hybrid Ed25519 + SLH-DSA-SHA2-128f Merkle chain), same audit-log schema, additional hosted-only features: PII scan, secret detection, session narrative overlays, client-answer PDF export, and multi-tenant per-project stores.

You can run world-model-mcp entirely offline. Etch is optional and only used if you opt into the hosted service (signup gated) or opt into anonymous telemetry (off by default, inspectable payload, right-to-erasure supported).


What's new in v0.14.0

  • Opt-in telemetry sink migration. Client now POSTs to https://etch.systems/api/telemetry/ingest. Previous v0.7.3–v0.13 series shipped an empty PAT stub, so opt-in telemetry silently no-op'd for two months — this is the first release where it actually delivers events. Endpoint is unauthenticated (rate-limited server-side by install_id), 8 KB payload ceiling, source IP stripped from access logs. Payload schema: event / install_id / version / ts / os_family / python_version / adapters / fields. Everything on that list, nothing off it — enforced by strict server-side whitelist validation.
  • Daily heartbeat. Once per 24h per opted-in install, the CLI fires a heartbeat event carrying the installed-adapter list. Enables an MAU-of-OSS-users number without touching content.
  • world-model telemetry --forget-me (GDPR right-to-erasure). DELETEs every server-side row for your install_id and wipes local telemetry state (install_id + consent + last-heartbeat). Works even when the server is unreachable — local state is wiped regardless, so consent revocation is honored offline.
  • 90-day server-side auto-TTL. Data minimisation enforced automatically. See docs/PRIVACY_TELEMETRY.md for the full retention + IP-strip + rate-limit spec.
  • Dead code removed. world_model_server/_embedded_token.py and scripts/embed_token.py deleted along with six now-obsolete tests. No PAT dance in the release process anymore.

What's new in v0.12.13

  • OpenAI-compatible Coach backend. verify_retrieval (v0.12.12's adversarial verification tool) can now route Coach calls through any OpenAI-shape endpoint — OpenRouter, Ollama, vLLM, LiteLLM, or a self-hosted deployment — without going through a proxy. Set WORLD_MODEL_VERIFICATION_BACKEND=openai-compatible and WORLD_MODEL_VERIFICATION_BASE_URL=https://openrouter.ai/api/v1 (or your endpoint of choice); the Coach client is built via AsyncOpenAI(base_url=...) and dispatches through chat.completions.create with the system prompt in the messages list (OpenAI convention). API key priority: explicit WORLD_MODEL_VERIFICATION_API_KEYOPENROUTER_API_KEYOPENAI_API_KEY → a placeholder for local endpoints that don't authenticate. New optional [openai] extra ships openai>=1.0. Backward compat: default backend stays anthropic; existing installs and the v0.12.12 baseline are unaffected.
  • doctor Copilot log-signature scan. New check_copilot_hook_signatures check parses ~/.copilot/logs/*.log for the two documented failure modes from copilot-cli #4001: PowerShell ParserError (Copilot running bash-shaped commands through PowerShell on Windows) and /.claude/... path resolution (Copilot not exporting $CLAUDE_PROJECT_DIR; hooks run from cwd /). SKIPs gracefully when Copilot isn't installed. Reports the two signature counts separately so users can tell which of the two Copilot-side bugs is affecting them. Does NOT fix them — the fix has to come from Copilot — but separates "my hook wrapper is broken" from "the runtime is running my hook wrong."

What's new in v0.12.12

  • Coach-Player adversarial verification (verify_retrieval). New MCP tool that runs an independent Coach LLM call against a candidate answer plus supplied source facts and returns a confidence band (HIGH / MEDIUM / LOW) with itemized verified + unverified claim lists and per-claim source pointers. Coach lives in its own module (world_model_server/verification.py) with its own prompt — no state shared with extraction or reasoning models. That's the adversarial part: Coach doesn't know how the answer was produced, only what the facts say. Contract: never raises. Every failure mode (no API key, empty answer, no facts, Coach LLM error, malformed Coach response) returns a LOW-confidence result with error populated. Cheap default: verification_model defaults to Haiku 4.5 (~$0.001 per verify call), env-configurable via WORLD_MODEL_VERIFICATION_MODEL.
  • 12-pair hand-labeled benchmark (benchmarks/coach-player/). 4 grounded, 4 partial, 4 hallucinated pairs plus a runner that reports hallucination catch rate, false positive rate, MEDIUM band correctness, and overall exact match. Ship-floor policy: false positive rate ≤10% is enforced (non-zero exit); hallucination catch ≥95% is aspirational at N=12 and gets enforced once pairs.json expands to ≥30 pairs. Full run costs ~$0.03 at Haiku 4.5 pricing.
  • Exposed on both MCP + Hermes surfaces. MCP list_tools gains verify_retrieval (27 → 28 tools); Hermes surfaced tool count 7 → 8 with the same tool schema.
  • Pattern origin. Ported from the maintainer's earlier y=c project (Coach-Player adversarial cooperation between a Player synthesizer and a Coach verifier). world-model-mcp is the first MCP server to ship it as a first-class tool with a benchmark harness.

What's new in v0.12.0

  • world-model doctor command (v0.12.1). Eight diagnostic checks including .claude/settings.json shell-quoting (the pre-v0.11.0 unquoted-$CLAUDE_PROJECT_DIR bug pattern the dogfooding investigation surfaced), hook script presence, .mcp.json registration, world-model DB directory + stale events_queue.jsonl, and Claude Code hook-error history filtered by settings.json mtime. --json for machine-readable output; --fix for safe auto-rewrites. Would have caught the v0.11.0 shell-quoting bug automatically instead of via manual investigation.
  • influence_state + expires_at on Fact (v0.12.2). Two nullable additive fields. influence_state (observed / pending_review / approved / blocked) separates two decisions made at different times: storage is an ingest question (do we keep this fact at all), influence is a per-turn question (do we surface it to the planner right now). Conflating them forces you to re-evaluate storage every time your planning threshold changes; splitting them lets you block a high-confidence fact from influencing a plan without deleting it — the disputed-entity-update-pending-review case that comes up often in graph work. A single trust-score is simpler until the first time you need that separation, which in practice happens fast. expires_at complements the continuous last_decay_at erosion with hard drop-dead timestamps for compliance retention and ephemeral credentials. Migration mirrors the v0.11.1 pattern: NULL-default ALTER, index, no backfill, idempotent.
  • Universal content-type routing consumers (v0.12.3). Closes the write- and consumer-side loop opened by v0.11.1. That patch added content_type to the model and table but never wired a consumer — worse, create_fact silently dropped the field on write. v0.12.3 fixes both: create_fact persists all three v0.11.1/v0.12.2 new fields, query_facts hydrates them on read, and query_facts accepts a content_type filter. get_injection_context is now routing-aware: rules always inject at PostCompact / UserPromptSubmit / SessionStart under a dedicated "## Rules (always active)" section; facts (or NULL) fill remaining slots; procedures are excluded from auto-injection entirely and reachable only via explicit query_fact(content_type='procedure').
  • GitHub Copilot Chat adapter (v0.12.4, install-copilot). Merges into .vscode/mcp.json per workspace. Copilot Chat uses top-level "servers" (not "mcpServers" like every other adapter world-model ships — silently registers nothing if wrong). Merge semantics: absent → write; existing → preserve other servers; existing world-model → skip unless --force; malformed / wrong-shape JSON → refuse and leave the file untouched.
  • install-continue --global config-merge path (v0.12.5). Merges into ~/.continue/config.yaml's mcpServers LIST (Continue's schema — distinct from Hermes' mcp_servers-mapping and from Claude Code / Cursor / Copilot / Cline / Windsurf's mcpServers-mapping). ruamel.yaml round-trip preserves comments, blank lines, and key ordering.
  • Cline adapter (v0.12.6, install-cline). Merges into ~/.cline/mcp.json. Cline uses the mcpServers mapping shape — same as Cursor / Claude Code.
  • Windsurf adapter (v0.12.7, install-windsurf). Merges into ~/.codeium/windsurf/mcp_config.json. Same mcpServers mapping shape as Cline; only the default path differs.
  • Hermes lifecycle hooks (v0.12.9). Layers the five optional hooks (sync_turn, on_pre_compress, prefetch, on_session_end, on_memory_write) on top of the v0.11.0 MemoryProvider ABC. on_pre_compress returns a compact injection bundle that honors the v0.12.3 content-type routing — rules always inject, procedures never do. Best-effort contract: exceptions caught, safe default returned; a broken hook must never crash the Hermes loop.
  • MCP 2026-07-28 spec readiness scaffolding (v0.12.11). Non-behavior-changing observability + public audit against the MCP 2026-07-28 specification (Release Candidate). Ships world_model_server.spec_readiness.READINESS_STATE (machine-readable audit matrix locked to five row states), extract_meta / log_meta_if_present observability helpers wired into server.py:call_tool, and docs/MCP_2026_SPEC_READINESS.md public audit doc. Backward compatibility with the 2025-03-26 spec preserved unconditionally.
  • Adapter matrix now covers ten runtimes: Claude Code, Cursor, Codex, Hermes, Continue (per-project + --global), OpenClaw, pi, GitHub Copilot Chat, Cline, Windsurf.
  • Deferred per roadmap-gated conditionals: OpenClaw TypeScript plugin (v0.12.8, no adoption signal within 5 days of v0.10) and Antigravity CLI adapter (v0.12.10, SDK still lacks TransformCompactionHook through v1.0.16).

What's new in v0.11.0

  • auto contradiction-resolution strategy rewrite (v0.11.0 A). Folds in confirmer awareness, per-evidence-type decay, distinct-source-tool counting, and tie-detection. Lifts the v0.8.1 contradiction-resolution benchmark's auto score from 77.1% → 100.0% on the same 105-pair × 19-category dataset. Overall benchmark accuracy across four canonical strategies + the decayed strategy rises from 78.2% to 83.7%. Non-auto strategies unchanged. The keep_higher_confidence_decayed strategy is promoted from benchmark-only to a first-class option in pick_winner. Full detail in benchmarks/contradictions-200/.

  • Hermes native MemoryProvider plugin + install-hermes-provider CLI (v0.11.0 B). Python plugin implementing Hermes' agent/memory_provider.py ABC (initialize, get_tool_schemas, handle_tool_call, get_config_schema, save_config). Intercepts writes at Hermes' routing layer rather than only surfacing tools — the architectural distinction the v0.10 MCP adapter could not close. Motivated by the Hermes #47349 exchange where @TechFlipsi surfaced that adding another MCP-registered store doesn't fix "the agent still defaults to writing MEMORY.md" — only a MemoryProvider does. Ships as world_model_server/hermes_memory_provider/ in the wheel; install-hermes-provider copies the plugin to <hermes_home>/plugins/memory/world-model/. Seven surfaced tools (query_fact, get_constraints, get_injection_context, record_event, record_correction, find_contradictions, resolve_contradiction) — trimmed from the 27 exposed via MCP to keep Hermes' tool namespace focused. Optional Hermes lifecycle hooks (sync_turn, on_pre_compress, prefetch, on_session_end) tracked as v0.12.

  • Content-type routing schema field (v0.11.1). Nullable content_type: Optional[Literal["rule", "fact", "procedure"]] on the Fact model and the facts table. Additive-only migration; existing rows keep NULL and continue to work. Distinct from evidence_type (which describes where the fact came from) — content_type describes what shape of content the fact carries, so a MemoryProvider can route writes intelligently (rules → always-inject, facts → search-on-demand, procedures → skills store) instead of dumping everything into one destination. Sourced from the Hermes #47349 architectural framing. Consumers (query filters, MemoryProvider write routing) are v0.11.x follow-ups; this ships the schema, tests, and migration only.

  • Dogfooding case study (v0.11.2) — surfaced a real shipped bug that was fixed in the same release. Publishes what the fact graph actually captured about the world-model-mcp codebase in .claude/world-model/: 3 learned constraints with real violation counts (including check-twine-before-tag and tag-before-upload, both derived from real release-mechanics incidents matching the v0.9.1 telemetry-token miss and the v0.10.1 tagging lesson), 1 bug_fix reflection citing a real bug in world_model_server/knowledge_graph.py:120-135, 608 facts (607 from the seeder + the one bug_fix), 600 entities. Honest about what was NOT captured (empty events / decisions / sessions tables). Pushing on that anomaly hard enough surfaced the actual root cause: setup_command wrote unquoted $CLAUDE_PROJECT_DIR in every generated hook command, so any user whose project path contains a space (macOS defaults like ~/Documents/, corporate paths, or the maintainer's own claude context graph/world-model-mcp) has been silently failing every hook invocation since v0.7.3 shipped hooks. The fix ships in this release — two-line shell-quoting change in setup_command + regression test. This is the exact kind of latent bug that dogfooding is supposed to catch, and it did. Reproducibility contract: python scripts/dogfooding_snapshot.py --db-path .claude/world-model regenerates the committed JSON byte-for-byte, and drift-protection tests fail if the writeup and the snapshot diverge. See case-studies/v011-dogfooding/.

  • What is unchanged. All v0.10.x code paths: the 27 MCP tools reported by adapters (no new server-side tools in v0.11), the SWE-bench Verified benchmark and its multi-seed appendix, the seven-runtime adapter coverage (Claude Code + Cursor + Codex + pi + OpenClaw + Hermes Agent + Continue), the Zenodo preprint (paper unchanged since v0.9.2; no new Zenodo version). v0.11 is a depth release — better contradiction-resolution intelligence, a second Hermes integration path, a schema axis for future routing work, and honest evidence for the dogfooding claim. Test count grew from 417 (v0.10) to 457 (+21 for the Hermes MemoryProvider plugin, +10 for the content-type schema, +9 for the case-study drift protection).

What's new in v0.10.0

  • Three new adapters in one release: OpenClaw, Hermes Agent, Continue. All three verified end-to-end against real installations of the target runtime:

    • OpenClawinstall-openclaw merges into ~/.openclaw/openclaw.json. Verified against OpenClaw 2026.6.11 (e085fa1) on macOS: openclaw mcp probe world-model reports 27 tools discovered. Root cause of the first-attempt "MCP error -32000: Connection closed" surfaced and fixed during E2E: OpenClaw's process spawn does not inherit shell PATH, so --command python3 fails while an absolute path works. The CLI now defaults command to sys.executable (absolute) and rejects relative --python overrides as a hard error. Documented as an install-time gotcha in the adapter README.
    • Hermes Agentinstall-hermes merges into ~/.hermes/config.yaml under mcp_servers.world-model. Uses ruamel.yaml round-trip mode to preserve every comment and blank line in Hermes' heavily-commented 1327-line reference config. A regression test (test_f2_install_hermes_preserves_comments_and_blank_lines) locks this down after a pre-E2E pyyaml.safe_dump implementation stripped ~1170 lines of documentation. Verified against Hermes Agent v0.17.0 (2026.6.19) on macOS: hermes mcp test world-model reports 27 tools discovered. Hermes' built-in memory (character-capped, no auto-decay per Hermes docs) is complemented additively by world-model-mcp's provenance + decay schema. Requires the [hermes] optional extra (pip install "world-model-mcp[hermes]") so ruamel.yaml is available.
    • Continueinstall-continue writes a standalone <project>/.continue/mcpServers/world-model.yaml following Continue's documented per-server-file pattern. No config merge needed. CLI-side E2E: the exact stdio spawn Continue would perform returns 27 tools via a live tools/list roundtrip. Last-mile "does Continue's LLM see them in agent mode" verification requires a live VS Code / JetBrains session. Reprioritized after the SpaceX/Cursor acquisition to serve teams standardizing on OSS-neutral coding-agent workflows.
  • Absolute-path posture across all v0.10 adapters. OpenClaw's PATH-spawn issue was caught first, but the same absolute-path default applies to Hermes and Continue as a precaution. Every new install command defaults command to sys.executable and rejects relative --python overrides. Users who hand-edit config files are directed to $(which python3) in both READMEs.

  • Cross-runtime shared memory. All v0.10 adapters (and every prior adapter) default WORLD_MODEL_DB_PATH to .claude/world-model — a relative path resolved against the client's working directory. This means a project that runs in multiple clients (e.g., Claude Code + Continue + OpenClaw) shares one SQLite fact graph across all of them. For user-wide shared memory regardless of CWD, override with an absolute --db-path. The differentiator against ClawMem (which does cross-runtime memory with a plain key-value SQLite vault) is depth: per-fact provenance, per-evidence-type decay half-lives, PreToolUse defer enforcement.

  • What is unchanged. All v0.9.2 code paths: the 26 base MCP tools (v0.10 adds no new server-side tools; the "27 tools" count reported by adapters includes resolve_contradiction which shipped in v0.8.0), the SWE-bench Verified benchmark, the multi-seed replication appendix, the wedge claims. v0.10 is an adapter-surface release, not a schema-or-benchmark release. Test count grew from 375 (v0.9.2) to 417 with the three new adapter test suites; every baseline test still passes.

  • Test breakdown. 375 baseline + 14 OpenClaw + 16 Hermes + 12 Continue = 417 tests. Every adapter's test suite includes: bundled-file validity, dry-run behavior, first-install writes with absolute-path defaults, idempotence (refuse to overwrite without --force), --force overwrite, relative---python rejection, parent-directory creation, malformed-config-file handling, and subparser-registration regression coverage.

What's new in v0.9.2

  • Multi-seed replication appendix shipped per SEED_PLAN.md. The v0.9 paper's primary limitation was single-trial design. v0.9.2 ships the multi-seed test that SEED_PLAN.md (locked 2026-06-25) committed to running. The result is published verbatim per the pre-registered acceptance criteria.

  • Honest update to the v0.9 headline. On the 17-instance pre-registered subset, baseline pass rate swung +41 percentage points between seed 1 and seed 2 with no methodology change. Load-bearing replication is 0 of 7 instances. Mean paired delta across both seeds is +0.24 per instance with bootstrap 95 percent CI [0.00, 0.47]. The v0.9 +10.2 pts paired delta should be read as a single-trial upper bound; the replicated effect size is small, possibly nonzero.

  • What is unchanged: all v0.9.1 code, the 26 MCP tools, the 19 CLI subcommands, the 375 tests, the wedge claims at the architectural level (lifecycle-hook capture, per-fact provenance, per-evidence-type decay, PreToolUse defer). Architectural claims do not depend on the empirical effect size and survive the multi-seed update.

  • Documentation diffs: benchmarks/repeat-mistake/RESULTS.md adds a "Multi-seed replication appendix (v0.9.2 update)". benchmarks/repeat-mistake/paper.md adds Appendix A with the same content. benchmarks/repeat-mistake/paper.pdf is regenerated. benchmarks/repeat-mistake/SEED_PLAN.md adds a status update (the locked plan above is unchanged). Raw seed-2 artifacts (baseline_progress_seed2.jsonl, treatment_progress_seed2_treatment.jsonl, predictions, results, and the multi_seed_summary_seed2.json from multi_seed_aggregate.py) committed.

  • The methodology discipline held. Pre-registration prevented goalpost-moving. The honest update is published per the locked SEED_PLAN.md acceptance criteria. This is what pre-registration is for.

What's new in v0.9.0

  • Repeat-mistake benchmark on SWE-bench Verified — the central wedge proof. 50 SWE-bench Verified tasks across django, sympy, matplotlib, scikit-learn, and sphinx, run as a paired baseline-vs-treatment comparison. Methodology was locked at benchmarks/repeat-mistake/DESIGN.md on 2026-06-17 (before the data existed) so the result cannot be accused of goalpost-moving.

  • Headline results — Subset 1 (within-domain: django + sympy) baseline 15/20 = 75.0 percent, treatment 18/20 = 90.0 percent, delta +15.0 pts with 4 FAIL to PASS flips and 1 regression. Subset 2 (cross-domain: matplotlib + scikit-learn + sphinx) baseline 18/29 = 62.1 percent, treatment 20/29 = 69.0 percent, delta +6.9 pts with 2 flips and zero regressions. Combined paired result across 49 instances: 33/49 to 38/49, delta +10.2 pts.

  • Cross-domain transfer isolated cleanly — the Subset 2 treatment arm loaded ONLY the 4 Subset 1 constraints (django and sympy directives), holding out the 11 Subset 2 constraints to test whether learning from one repo family generalizes to a different one. Two cross-domain flips with plausible mechanistic explanations grounded in the loaded constraints. Sphinx-9461 is the strongest case: a sympy classmethod constraint transferred to a sphinx classmethod-wrapper unwrapping bug.

  • Honest caveats embedded in RESULTS.md — seven explicit limitations including single-trial design, constraint-failure overlap on Subset 1, the small cross-domain transfer rate, one dropped instance due to an upstream SWE-bench pip flag issue, and judge-model self-reference risk. Stated verbatim rather than hidden in an appendix.

  • Full reproducibility artifacts — every progress JSONL, predictions JSON, results JSONL, classification JSONL, constraints JSON, and harness report JSON committed in benchmarks/repeat-mistake/. Locked judge prompts in failure_classifier.py and learning_hook.py. Total agent cost across both arms was approximately 90 USD on a Claude Code subscription.

What's new in v0.8.1

  • Contradiction-resolution benchmark expansion -- the v0.7.4 24-pair benchmark grew to 105 hand-curated pairs across 19 categories. Six new categories exercise the v0.8.0 schema specifically: source_tool_corroboration, confirmer_overrides_pending, decay_advantage_session_vs_source, decay_advantage_stale_session, evidence_type_user_correction, settled_beats_higher_confidence. Deterministic runner at benchmarks/contradictions-200/run.py; full per-strategy + per-category breakdown at benchmarks/contradictions-200/RESULTS.md.

  • Honest framing on the numbers: the new dataset is harder than v0.7.4's 24-pair set because the new categories deliberately test schema awareness (confirmer, evidence_type, decay) rather than raw confidence ranking. Headline numbers: keep_most_sources 99.0%, keep_higher_confidence 81.0%, auto 77.1%, keep_higher_confidence_decayed 90.5% (on the 21 pairs where evidence_type is present), overall 78.2% across all strategies. The original 24-pair v0.7.4 93.5% number is preserved unchanged at benchmarks/contradictions/ and is not invalidated; it tested a different (smaller, easier) corpus.

  • The wedge benchmark is v0.9: "does the learning loop measurably reduce repeated coding-agent mistakes on a public task corpus?" The contradiction-resolution work in this release is internal schema-correctness validation. The empirical artifact that maps to the published essay framing — the learning loop is the durable layer — lands in v0.9 with a SWE-bench-style repeat-mistake benchmark.

What's new in v0.8.0

  • Domain-aware confidence decay -- new world_model_server/decay.py module with exponential half-life decay per evidence_type. Half-lives: source_code 365d, test 180d, session 14d, user_correction 730d, bug_fix 365d. Decay applies on read (no background task), so the next query_fact call returns the time-corrected confidence. Settled facts (canonical status, or any fact with confirmer != NULL) never auto-transition. Synthesized facts that decay below 0.2 confidence and corroborated facts that decay below 0.1 confidence auto-supersede on read, surfacing rot to the next compaction injection.

  • Per-item provenance fields on facts -- three additive columns (source_tool TEXT, confirmer TEXT, last_decay_at TIMESTAMP), all N