[ v0.1.0 · open source · rust · apache-2.0 ]
Agent memory that is checked, not trusted.
memprove binds every fact your coding agent records to a commit, the worktree and a passing test run. When the code moves, the fact turns stale — decided by a rule, not a model.
Works with Claude Code · Codex · Cursor
-
parse() returns an empty document for empty or whitespace-only input
-
input of only comments is an empty document
-
keys before the first section header go into the default section
-
a duplicate key keeps the last value
- › memprove run · r1 PASS · 8 test cases at 5ebf8ad58118
- › git commit 558cb252ae87 · "parser: strip inline comments from values"
- › 4 facts stale · Rerun: 「python3 -m pytest -q」
- › memprove run · r1 PASS · 10 test cases · reaffirmed 4 (verified 4), skipped 0
Recorded with memprove 0.1.0 and pytest by demo/record.sh. Nobody edits a fact: a commit moves HEAD, the rule re-judges each one, a passing rerun brings them back. The full output →
[ 01 · the problem ]
Notes don't know when they stop being true.
A line in CLAUDE.md says the parser handles empty input. Three commits later it doesn't, and your agent still believes it. Memory files, auto-memory and hosted memory layers merge and expire text by timestamps and wording. None of them checks whether the code still passes.
[ 02 · how it works ]
Three steps. No model in the loop.
memprove run --test-format pytest -- python3 -m pytest -q
Runs the tests in your shell and records the exit code, the case count and the exact repository state: HEAD, the index, the worktree.
memprove checkpoint create --fact "…" --evidence r1
Binds the fact to that run. A fact needs a passed test run; a failure can only be recorded as an open item.
memprove resume --pack
Each read compares the run's state with the repository now. A fixed rule decides; no model is asked.
A passed run of the current state backs the fact.
The repository moved since that run. The Pack names the command to run again.
The evidence can't answer for this state, for example a later run of the same command failed.
The ledger changed behind the daemon's back. The word "verified" appears nowhere.
[ 03 · no integration project ]
Your agent does the integration.
Enterprise platforms send a solutions architect to wire memory into your stack. memprove ships instructions instead: memprove.dev/llms.txt tells a coding agent how to install it, run memprove init and record a first test run. Setup happens in the session you already work in, and you review what it changed.
- ■ one prompt, in the agent you already use
- ■ no account to create, no SDK to call
- ■ run init again and nothing changes
A mock-up: the setup through llms.txt is being recorded in Claude Code, Codex and Cursor. Read llms.txt →
[ 04 · context pack ]
What the next session reads.
In Claude Code, a hook puts a Context Pack at the start of every session: the Task, who worked on it, the last passed run, every active fact with its verdict and commit, the open items and the next action. Same ledger, same repository, same budget: same bytes.
- — fits a budget, 9,000 UTF-16 units by default; the next action is never cut
- — agent-written text is quoted, so a statement can't forge a line
- — the last line is a SHA-256 digest of everything above it
[ 05 · hand-offs ]
Built for more than one agent.
Sessions end, crash, or get handed to sub-agents. A Pack lists every Session that hasn't ended, memprove records who ended whom, and a sub-agent can't record a Decision, complete the Task or overrule another agent's facts.
How a takeover works →- A
- ■ Its agent is not you.
- B
- ■ It looks gone: no write for 15 minutes, or the Session that dispatched it has ended.
- C
- ■ It is not your own parent.
otherwise → it stays open, and the first checkpoint records that another Session may still be working
[ 06 · integrations ]
One command per repository.
memprove init finds the clients you use and writes what each needs. Running it again changes nothing.
A SessionStart hook injects the Pack; the MCP server does what the commands do.
.claude/settings.local.json · .mcp.json
An MCP server entry, plus a short note in AGENTS.md.
~/.codex/config.toml · AGENTS.md
An MCP server entry, plus a rule.
.cursor/mcp.json · .cursor/rules/memprove.mdc
[ 07 · local by design ]
Nothing leaves your machine.
The daemon, the ledger and the tokens all live on your computer. There is no hosted service to sign up for and nothing to send home.
- — the daemon talks over a Unix socket and has no network access
- — every record is hash-chained; memprove ledger verify recomputes the chain
- — tokens stay in ~/.memprove/config, never in your repository
- — nothing is deleted: superseded statements stay, each naming its Session
[ 08 · compare ]
What decides whether a memory is still true?
| # | approach | who decides |
|---|---|---|
| 01 | CLAUDE.md, AGENTS.md | You, when you remember to edit it |
| 02 | Claude Code auto-memory, hosted memory layers | A model reading wording and timestamps |
| 03 | stalebrain, true-memory-fragments | Checks of sentences against paths, symbol hashes or commits |
| ■ | memprove | A passed test run in the repository state you have now |
From these projects' own docs and READMEs, November 2026. Tell us if something here is out of date.
███╗ ███╗███████╗███╗ ███╗██████╗ ██████╗ ██████╗ ██╗ ██╗███████╗████╗ ████║██╔════╝████╗ ████║██╔══██╗██╔══██╗██╔═══██╗██║ ██║██╔════╝██╔████╔██║█████╗ ██╔████╔██║██████╔╝██████╔╝██║ ██║██║ ██║█████╗ ██║╚██╔╝██║██╔══╝ ██║╚██╔╝██║██╔═══╝ ██╔══██╗██║ ██║╚██╗ ██╔╝██╔══╝ ██║ ╚═╝ ██║███████╗██║ ╚═╝ ██║██║ ██║ ██║╚██████╔╝ ╚████╔╝ ███████╗╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═══╝ ╚══════╝