What it does
Jev is TypeSafe AI's evaluation model. It does not generate or explain. It judges. Put everything the decision depends on into state, ask one or more typed questions, and act on the numbers.
$ echo "Card charged twice" | node jev.mjs --bool "Is the customer asking for a refund?"
{ "q1": { "type": "boolean", "probability": 0.31 } }
A yes/no with stated truth conditions. Returns a probability from 0 to 1.
One of a small named set you describe. Returns the pick, the full distribution, and confidence.
A position on a rubric you label rung by rung. Returns the rung and how peaked the distribution is.
Why a plugin
With the plugin loaded, Claude Code stops deciding by intuition. A session hook installs a protocol: every judgement call that is not mechanically determined by the evidence goes through Jev. Which option to pick. Whether an action is safe. Whether the diff does what was asked and nothing more. Whether the task is actually done.
state.Install
Inside Claude Code:
/plugin marketplace add jukkatupamaki/better-call-jev
/plugin install better-call-jev@better-call-jev
Then set JEV_API_KEY. Requests are served through Vercel AI Gateway, so the key is an AI Gateway key from your Vercel account. Put it in your shell profile or in the project's gitignored .claude/settings.local.json. Never commit it.
Node 18 or newer. No npm install, no dependencies. The skill is invoked as /jev.
Or call it directly
node skills/jev/scripts/jev.mjs <<'EOF'
{
"state": { "spec": "<the request>", "artifact": "<the diff>" },
"questions": {
"satisfies": { "type": "boolean", "instructions": "Does the artifact fully satisfy the spec?" },
"overreaches": { "type": "boolean", "instructions": "Does it do things the spec did not ask for?" },
"quality": {
"type": "score",
"instructions": "Overall quality against the spec",
"criteria": ["unusable", "needs major rework", "needs minor fixes", "ready"]
}
}
}
EOF
Or from Node:
import { ask, choose, score } from './scripts/jev.mjs';
await ask(state, "Is it safe to run this command?"); // 0.93
await choose(state, "Which team?", { billing: "...", infra: "..." });
await score(state, "Severity", ["cosmetic", "low", "moderate", "high"]);
Patterns
| Shape | Ask |
|---|---|
| Gate | One boolean before a risky action. Act only above threshold. |
| Verify | satisfies, overreaches, omits over a spec and an artifact. |
| Compare | A choice between a and b. The probabilities tell you how close the race is. |
| Rank | One score with the same rubric per item, then sort. |
| Classify | A choice with one option per category, plus other. |
| Detect | Secrets in a diff, PII in a record, an unsupported claim in a summary. |
| Self-check | Before delivering, ask whether the output answers the task and stays in scope. |
The full reference, per-domain recipes, and the CLI flags live in the skill file in the repo.