JEBADIAH

JDE, the Jeb Decision Engine

Your AI agent says it finished. Did it?

JDE is the layer that answers the questions your agent cannot settle with an if, gives you one place to decide how much confidence is enough, and writes down every judgment it made.

One place for judgments

Typed questions

Ask for a choice, a yes-or-no, or a score. Get a calibrated probability back, not a paragraph to parse.

Policy as data

How confident is confident enough, and what happens otherwise, lives in a JSON file. Not scattered through your code.

One ledger

Every judgment, its confidence, and what your software did about it. Auditable, and the training set for owning the judge later.

Swappable judge

An open decision model on your own machine by default. A hosted one if you prefer. Your code where the answer turned out to be a fact.

Ask small questions

On JDE's first, private blind set, with the hosted judge, asking one question about a whole task scored in the seventies. Splitting the same judgment into one question per part of the task, settling the parts that are facts in code, and adding them up in code, scored 100 percent.

Give the model the semantic step in the middle. Keep the arithmetic.

Whether a file exists at a path, whether a count exceeds a budget, whether every part passed: none of those need a model. The judge answers one thing at a time and never sees how the answers combine.

The proof

The first decision shipped: did the agent actually do the work? The public blind set has 36 cases, written by an independent author who never saw JDE's questions or any result. It was frozen by sha256 and pushed before any judge saw a case.

Completion check, public blind set
JudgeVerdict rightParts judged rightEcho caughtMedian latency
Jeb 4B v2, Q8_031 of 3666 of 7433 of 36421 ms
Jeb 9B v2, Q8_031 of 3665 of 7432 of 36707 ms
Jeb 27B, Q8_031 of 3667 of 7435 of 362.3 s
For comparison: TypeSafe's hosted Jev 1.13.034 of 3668 of 7435 of 36143 ms

Latency is one completion check at a time on a Mac Studio (M3 Ultra). It is a property of the machine, not the judge.

Every local result records the GGUF's sha256, the runtime and its version, and the commit that ran it. npm run eval:verify reruns a committed result and fails on any difference. Read the results · Method and case-by-case table

Where the judges disagree

Each local size misses five verdicts; two misses shared by all three take a receipt that looks like the work for the work: search results counted as pages read, and tests run against the wrong service. Some polished restatements were judged partial rather than not done, including two that hosted Jev also judged that way.

JDE's first measurement, 30 of 30 verdicts with hosted Jev, was on a private blind set that stays private. The public set exists so that nobody has to take that number on trust.

Jeb on your own machine

The default judge is Jeb, the open Jebadiah decision model, running on your machine. jeb serve serves it at http://localhost:8100/v1/systemone, which is where JDE looks by default. No key, no account, nothing leaves the machine.

If nothing answers there, every decision takes its policy's on_error action. JDE never falls back to a hosted service on its own.

The hosted judge is opt in: name "judge": "jev" in a policy entry, or pass jevJudge(), and set a TypeSafe key in TYPESAFE_API_KEY. The key never reaches the ledger.

Judge Jeb is coming, and isn't released yet. It's a Jeb tuned on JDE's own judging questions. Until then the default judge is Jeb, the general model.

Run Jeb locally

Install and use

shell
npm i @titanium-devops/jde
pip install jebadiah-decide && jeb serve     # the judge, on your own machine
TypeScript
import { completionCheck } from "@titanium-devops/jde";
const { verdict } = await completionCheck({ task, task_parts, claimed_result, receipts });
if (verdict === "partial" || verdict === "not_done") redo();   // null: the judge did not answer

task_parts is the task split into its parts, and receipts is what the run's own tool log shows it did. Read the shapes.

Use it from an agent

No code: give the agent JDE as an MCP server.

shell
claude mcp add jde -- npx -y -p @titanium-devops/jde jde-mcp

The agent gets check_completion, which its description tells it to call before it reports a task done, and ask for typed questions. Cursor and other clients.

What JDE does not do

  • It does not generate text.
  • It does not decide what code can compute.
  • It does not retry a judgment: one call, a timeout, a fallback.
  • It does not hold your credentials.
  • It does not call a paid service unless you name one.

Where it came from

JDE was extracted from Titanium Bot, a hosted AI agent product where these decisions run against real customer work every day: whether a research answer is supported by what was actually read, whether a request is about local stores or national prices, whether a background worker delivered or only reported.

MIT licensed · Built by Titanium Computing · JDE on GitHub