jevmory
September 19, 2026 · View on GitHub
Local, zero-dependency Python CLI. Turns session transcripts into a
jevmory.md memory file where every fact is a verbatim quote graded by
TypeSafe Jev's calibrated confidence, with redaction
at rest.
The viral one-liner:
jevmory audit MEMORY.md
your agent's memory has 1 stale line, 1 wrong one, and 1 unsupported one; here are the receipts.
What it does
Your coding agent (Claude Code, Codex CLI) writes session transcripts to disk. jevmory watches, ingests, and grades them:
- Hooks ingest locally — a
SessionEndhook (Claude Code) ornotifyhook (Codex CLI) streams transcript events into a per-project SQLite store at~/.jevmory/projects/<slug>.db. Secrets are redacted at rest, before storage. Hooks always exit 0; they can never break a session. jevmory dreamgrades while you sleep — sentence candidates are extracted, deduped, and (only with your opt-in) sent to the Jev API for calibrated judgment: durability, category, significance, support, contradiction. Raw judgments are stored — every fact has receipts.jevmory audit MEMORY.mdchecks any memory file — each line is graded against the evidence in the store and printed as a screenshot-shaped report:STALE / WRONG / UNSUPPORTED / KEEP, with confidence, support, contradiction, and the run receipt.jevmory.mdlands at your project root — grouped by category, confidence-ordered, every line a verbatim quote with provenance. Sentinel-guarded: never overwritten without your say-so.
No LLM generation anywhere: Jev judges; code selects and composes. Facts are quotes, not summaries — the memory can't hallucinate.
Quickstart
Requires Python ≥3.10 and nothing else — stdlib only, no pip deps.
git clone https://github.com/romiluz13/jevmory && cd jevmory
# in your project:
jevmory init # setup; the store appears on first ingest
jevmory install --agent claude # prints the Claude Code SessionEnd hook JSON
jevmory install --agent codex # prints the Codex notify snippet (--yes patches config)
# stay fully local (nothing ever leaves):
jevmory ingest --scan # finds this project's transcripts and ingests
jevmory status # queued candidates, last ingest, errors
# or opt in to grading (needs $TYPESAFE_API_KEY):
jevmory init --enable-grading # per-project opt-in marker
jevmory dream # grade queued candidates
jevmory audit MEMORY.md # receipts for every memory line
jevmory resolve <id> # answer a contradiction question
Add jevmory.md to your project's .gitignore if you don't want agent
memory in version control — it's yours, not the repo's.
Fully offline? Just never run init --enable-grading. Everything else —
ingest, status, scan — is local by architecture (see Privacy).
Demo (offline, deterministic, zero cost)
python3 demo/run_demo.py
A planted-error fixture: demo/MEMORY.md has 5 memory lines — 3 with
planted errors (stale, wrong, unsupported) contradicted by the evidence in
demo/transcript.jsonl. Judgments are pinned offline, so the errors are
guaranteed present and the demo costs nothing:
jevmory audit — demo/MEMORY.md
your memory has 1 stale line, 1 wrong line, 1 unsupported line; 2 keep
LINE VERDICT CONF SUPP CONTRA CLAIM
5 STALE 0.82 0.34 0.71 The build runs on Bun; bun run build is the…
6 WRONG 0.93 0.07 0.93 The test suite runs with pytest.
7 UNSUPPORTED 0.74 0.06 0.05 Failed API requests retry up to five times…
receipts: run 1 · 1 api calls · 838 tokens · evidence: 0 facts, 6 statements
The live jevmory audit produces exactly this shape, with real Jev
judgments behind the numbers.
Privacy
- What leaves: redacted candidate quotes (≤600 chars) + verbatim
context (≤800 chars) + minimal project context — only during
dream/auditwith$TYPESAFE_API_KEYset and the project opted in (jevmory init --enable-grading). - Never: whole transcripts, transcript metadata (the project context
is just the project name — no file paths), or secrets (redacted at
rest, before any storage —
sk-*, AWS keys, GitHub tokens, JWTs, PEM blocks,password=/token=/api_key=assignments, high-entropy hex/base64, bearer tokens →[redacted:<kind>]). - Honest caveat: quotes are verbatim conversation text. Anything
non-secret you typed in chat — a file path like
/Users/you/proj/main.py, an internal hostname, a person's name — stays inside the quote that leaves. The redactor scrubs secrets, not paths; if that matters for your project, stay in local mode. - Fully local mode:
--offline/ no key / no opt-in — events queue, nothing leaves. No marker → candidates queue;jevmory statussays so.
Design decisions (non-negotiable)
- Python 3 stdlib only. No pip deps, ever. Runs anywhere python3 runs.
- Zero LLM generation. Facts are verbatim quotes with verbatim context. Jev judges; code selects and composes.
- Per-project SQLite store, WAL + busy_timeout,
schema_versionmigrations, FTS retrieval with re-rank. - Privacy by architecture. Hooks only ingest locally; grading requires an explicit per-project opt-in marker; redaction at rest before any storage.
- Hooks never break sessions and never die silently. Ingest is
synchronous, always exits 0, and errors surface in
jevmory status. - Receipts for everything. Raw judgments and usage are stored —
runs/judgmentstables — so any number in the report can be traced to the API call that produced it.
Live smoke (lead-run)
The one network path is pinned by a budget-capped smoke script:
TYPESAFE_API_KEY=… python3 scripts/live_smoke.py --probe # 3 synthetic candidates, 1 request
TYPESAFE_API_KEY=… python3 scripts/live_smoke.py --dream # 1 real dream run, capped
Hard cap on requests (--cap, default 40, PLAN's smoke ceiling);
BudgetExhausted is a JevError, so the run row closes and events stay
queued — the smoke cannot overspend. Live-verified against the real API:
probe (auth, envelope, strict parse, usage accounting), a capped dream
over real transcripts, and a live audit that caught a planted wrong line
with receipts in the store's runs/judgments tables.
Status
508 offline tests (python3 -m unittest discover) — no network, no API
key, FakeJev including adversarial mode. Modules M0–M7 complete;
pipeline live-verified against the real Jev API (probe, capped dream,
audit).
License
MIT — see LICENSE.