Jev vs. the Frontier: method and full results
DW Daniel WipertThe overview gives the short version. This page documents everything needed to check or reproduce each number. All tables are generated from docs/data.json, which build_site_data.py builds from the committed decision logs.
Summary
We held a Python decision harness fixed (decide → gate → check → learn) and varied only the model in the "decide" seat: TypeSafe's Jev (typesafe/jev-1.13), Claude Sonnet 5 and Claude Haiku 4.5. The task was single-label, 77-way intent classification on Banking77. A four-check gate, deterministic checks first and model confidence last, decides which answers are auto-accepted.
Under a criterion written before any runs, Jev's accuracy on auto-accepted messages at the 70% auto-accept setting was 91.4%, against Sonnet 5's 91.0%, at $0.10 vs $5.25 per 1,000 decisions. Both pre-registered conditions (within 3 points; at least 10× cheaper) were met. A cheap-first cascade (Jev, falling back to Sonnet) reached 82.8% accuracy on all messages at $1.51 per 1,000, against Sonnet alone at 82.3% and $5.25.
Task and data
- Dataset: Banking77 (PolyAI), 13,083 short customer messages to a bank, each labeled with one of 77 intents. Loaded from PolyAI's source CSVs pinned to commit
57ec275. - Tuning set: 500 messages sampled from the train split (10,003) with
random_state=42. Used for description tuning, the keyword-check decision, and all threshold selection. - Test set: 1,000 messages sampled from the test split (3,080) with
random_state=42. Not run by any model until tuning was finished.run.pyrefuses--set testwithout an explicit--confirm-testflag. - All 77 intents appear in both samples. Tuning-set coverage is uneven (1 to 17 messages per intent), so confusion pairs involving thin intents rest on few examples.
- Both samples are committed as CSVs (
data/tuning.csv,data/test.csv) and every model reads the same files.
Models and access
- Jev, via OpenRouter's Decisions API using the official
typesafe-sdk(base URLhttps://openrouter.ai/api). Pinned totypesafe/jev-1.13; responses reporttypesafe/jev-1.13-20260917. OneChoicequestion with all 77 labels as criteria (label → description). Confidence is Jev's native score (0–1), multiplied by 100. - Claude Sonnet 5 (
anthropic/claude-sonnet-5) and Claude Haiku 4.5 (anthropic/claude-haiku-4.5), via OpenRouter's chat endpoint. Model slugs were copied from OpenRouter's model list. One call per message,response_format=json_object, extended thinking disabled, no sampling or ensembling. Confidence is self-reported. - Cost is OpenRouter's billed
usage.costfor each call, logged per message.
Jev question
Choice(instructions="Which category best describes this bank customer's message?",
criteria={category_name: description, ...77 entries})
Claude prompt (identical for Sonnet and Haiku)
Classify this bank customer's message into exactly one of the categories below.
Categories (name: description):
{77 lines of "- name: description"}
Message:
{message}
Reply with JSON only, in this form: {"category": "<exact category name>", "confidence": <0-100>}
"category" must be copied exactly from the list. "confidence" is how sure you are, 0 to 100.
Markdown code fences around the JSON (which Haiku sometimes adds) are stripped before parsing. Any reply that still can't be parsed is logged verbatim as the predicted category, so gate check 1 counts it as a hard hallucination.
Harness and gate
The gate (gate.py) runs four checks in order. The first failure sends the message to review, and the reason is logged.
- invalid_category: the prediction must exactly match one of the 77 names. Jev can't fail this by construction.
- empty_input: the message must be non-empty after stripping whitespace. It never fires on Banking77; it exists so the gate can be reused unchanged on email.
- keyword_miss: the message must contain at least one keyword of the predicted category, matched as lowercase whole words (
[a-z]+). - low_confidence: confidence (0–100) must be at or above the model's threshold for the chosen setting.
Keyword lists
Generated by build_categories.py: the words in the category name (minus filler such as "or", "not", "why"), plus the 10 most distinctive words per category. "Distinctive" means the highest ratio of in-category document frequency to overall document frequency, among words appearing in at least 5% of the category's messages, with ties broken alphabetically. The lists were learned from the 9,503 train messages not in the tuning set, so check 3 isn't graded on its own source data.
Check 3 ran as a logged flag during the first tuning run. It flagged 1.5% of correct answers and 14.3% of wrong ones, below the pre-stated 10% false-alarm rule of thumb, so it was switched to blocking before any other runs. Because analyze.py re-gates every logged answer, all results reflect the blocking gate.
Threshold procedure
A "90" from Jev and a "90" from Claude don't mean the same thing, so each model gets its own thresholds:
- Run the model on the 500-message tuning set and apply gate checks 1–3.
- Sort answers that pass checks 1–3 by confidence (descending, ties by
message_id). - The thresholds are the confidence values at which 50%, 70% and 85% of all tuning messages would be auto-accepted.
- Apply those thresholds unchanged to the test set, and report the realized auto-accept rate alongside accuracy.
Because a threshold can't split tied confidence values, realized rates overshoot the targets. This matters most for the Claude models, whose self-reported confidences cluster on round values (see robustness).
Description tuning (the Learn stage)
v1 descriptions were the category names with spaces. Each tuning round: analyze.py finds the top 8 confused pairs in Jev's tuning log, draft_rewrites.py sends the pairs and 3 example errors each to Claude Sonnet 5 in one call, a human approves or edits each draft, and the result is saved as a new version with a changelog row.
- v2: 15 categories rewritten; 14 drafts accepted as-is, 1 edited. Jev tuning accuracy on auto-accepted at 70%: 90.3% → 93.4%.
- v3: 15 categories rewritten; 11 accepted, 4 edited. No net gain on tuning (16 answers fixed, 18 broken; 93.4% → 93.8%, within noise) and new side effects between neighboring categories. v2 was chosen as final, and v3 is kept but unused.
All drafts, approved versions and prompts are committed under drafts/. Drafting costs are logged too, including an estimate for three early calls that failed before per-call logging existed. Disclosure: description drafts were written by Claude Sonnet 5 and approved by a human.
Pre-registered criterion
Copied verbatim from the project spec, written before the first run:
Jev wins if, at the 70% auto-accept row on the final test set: its accuracy on auto-accepted messages is within 3 points of Sonnet 5's, and its cost per 1,000 gated decisions is at least 10x lower than Sonnet 5's.
The 50% and 85% rows are supporting evidence: they show whether the gap widens or narrows as each model is pushed into its less-confident answers.
"Not yet" if Jev misses either condition. The headline then reads "not yet the right gate for this task," and the cascade (contender E) is reported alongside as the practical alternative.
Outcome: Sonnet − Jev = −0.4 points (pass); Sonnet costs 52.5× more (pass). Jev wins.
Results
All contenders, test set (1,000 messages)
A: Jev, v1 · B: Jev, v2 (final) · C: Sonnet 5, v2 · D: Haiku 4.5, v2 · F: Sonnet 5, v1 (tilt check) · J: DeepSeek V4 Flash, v2 (round 2) · K: DeepSeek V4 Flash, v1. Soft hallucination = 1 − accuracy on auto-accepted. Hard hallucination = share of all answers failing check 1. The highlighted rows decide the verdict.
Cascade (E): Jev if auto-accepted, otherwise Sonnet 5
Computed from the B and C logs, with no additional calls. Cost = Jev on all messages + Sonnet on the non-accepted share.
Calibration: accuracy within reported-confidence bands
Keyword check (check 3) behavior
Robustness and secondary checks
Sampling noise
With about 730 auto-accepted answers per model at the 70% setting, the standard error of each accuracy estimate is about 1.1 points (p ≈ 0.91). The 0.4-point difference between Jev and Sonnet is well inside it. We therefore describe the accuracy result as a tie, and the verdict rests on the pre-registered tolerance, not on Jev being ahead.
Unequal realized volume
At the 70% target, realized auto-accept rates were Jev 73.1%, Sonnet 75.3% and Haiku 81.4%, because Claude's confidences are coarse. As a check outside the pre-registered rule, we compared each model's 730 most confident answers that pass checks 1–3: Jev 91.4%, Sonnet 91.8%. The conclusion is unchanged.
Coarse confidence
Across all thresholds on the test set, Jev has 67 distinct achievable operating points, Sonnet 25, and Haiku 13. Haiku jumps from 0.8% to 45.7% auto-accepted between two adjacent settings.
Description tilt (contender F)
The v2 descriptions were tuned on Jev's errors and then given to Claude. To measure the resulting tilt, we ran Sonnet 5 on v1 descriptions (F). How F would be reported was committed to the changelog before it was run. Sonnet gained +2.4 / +0.9 / +0.8 points at the 50 / 70 / 85% rows from v1 to v2 (+1.9 on all answers), about the same as Jev's +0.9 at 70%. We found no measurable tilt toward Jev. Descriptions tuned on Sonnet's own errors were not tested.
Tuning vs test
On the tuning set, Jev led Sonnet by 3.6 points on all answers (83.0% vs 79.4%). On the test set, Sonnet was 0.7 points ahead (82.3% vs 81.6%). Part of the tuning-set lead was overfitting to the messages the descriptions were rewritten from, which is why thresholds and descriptions were fixed before the test set was opened.
Round 2: DeepSeek V4 Flash (contender J)
Pre-registered on 2026-10-02, before the full run. Model deepseek/deepseek-v4-flash via OpenRouter, provider pinned to streamlake/fp8 with no fallbacks, reasoning off, the same prompt as Claude. Confidence is the model's own probability for the category text it wrote (the product of that text's token probabilities, from log-probabilities) × 100. Its self-reported number was logged as a secondary score. Same sets, gate, keywords and threshold procedure; the win condition is the same 70% row, against Jev B.
- Result: accuracy on auto-accepted 91.6 / 88.0 / 80.9% at the 50 / 70 / 85% rows, against Jev's 97.0 / 91.4 / 87.4%. All answers 74.7% vs 81.6%. Cost $0.013 vs $0.10 per 1,000 (8× cheaper). Median latency 1,460 ms vs 219 ms. Jev wins.
- Same volume: each model's 731 most confident answers that pass checks 1–3: Jev 91.4%, DeepSeek 85.2%, about 45 more wrong auto-accepted answers per 1,000 messages.
- Calibration: 45% of DeepSeek's answers scored ≥ 99.9, and 93.8% of those were right.
- Shared mistakes: of Jev's 63 wrong auto-accepted answers at the 70% setting, DeepSeek picked the same wrong category on 56. Requiring both models to agree barely changes accuracy, so a second model doesn't work as a fact-checker here.
- Secondary: with v1 descriptions (K vs Jev A) DeepSeek trails by 4.2 / 3.7 / 5.3 points. With its self-reported confidence, it auto-accepted 83.9% at 81.4% accuracy at the 70% row. Total DeepSeek spend: $0.036.
Secondary: cleaned answer key
Pre-registered on 2026-10-13, before any cleaned score was computed. The official results above are unchanged.
- Candidates: the 206 test messages where at least 2 of the 4 v2 runs (Jev B, Sonnet C, Haiku D, DeepSeek J) picked the same category, different from the answer key. Ties between alternatives go to the alphabetically first.
- Blind review: each message shown with the key and the alternative as "label 1" and "label 2" in random order (seed 13), without saying which is official or which models picked what. Verdict: label 1, label 2, both fit, or unclear (unclear keeps the key).
- Who decided: Claude drafted every verdict; the author approved all 206 in bulk without overriding any. Outcome: key kept 55, other label 48, both fit 86, unclear 17.
- Scoring: thresholds unchanged. Cleaned accepts any accepted label (both, where both fit). Strict, added after the draft numbers were seen, treats "both fit" as the official key only, so only clear relabels count. It's a lower bound.
Jev minus DeepSeek, by answer key
Added 2026-10-14 after a reader's suggestion; exploratory, not pre-registered. Each model's n most confident answers that pass checks 1–3 (matched coverage). Ranges are paired 95% bootstrap intervals over the 1,000 test messages (2,000 resamples, seed 0) with each model's accepted set held fixed. They reflect which messages were sampled, not run-to-run model variation (one run per model).
Reading: fixing clear label errors leaves the gap essentially unchanged (6.2 → 5.9 points at Jev's 70% volume), because those errors cost both models about equally. Accepting either label where both fit narrows it (to 4.1 points, and about 2 points among the 500–600 most confident answers). The reason is confidence, not label choice: over all 86 both-fit messages the two models pick the alternative about equally often (Jev 64, DeepSeek 66), but DeepSeek is far more confident on them. Among each model's 500 most confident answers, 19 of DeepSeek's 39 original-key errors are both-fit messages, against 1 of Jev's 12. At Jev's 70% volume (731 answers), DeepSeek has 45 more original-key errors than Jev: 13 more on both-fit messages, 4 more on clearly mislabeled ones, and 28 more on messages nobody disputed (37 vs 9). The interval excludes zero on every key at every volume of 400 or more. Every reviewed label, with what each model said, is listed on the label audit page and in results/label_changes.csv (python label_audit.py).
Caveats: one reviewer (Claude, approved by the author); only messages where models agreed against the key were reviewed, which favors popular answers and can't catch errors no model disagreed with. The contenders' order is the same under all three keys. Files: review/, cleaned_scores.py, results/results_table_cleaned.csv.
Limitations
- Single task type (closed-set, 77-way intent classification) on short chat messages. Not evidence about email, open-ended generation or reasoning.
- One run per model, with no estimate of run-to-run variance.
- Claude confidence is a single self-reported number. Sampling-based agreement or log-probability methods might give finer, better-calibrated scores.
- Jev is a beta product (launched September 2026), and its benchmarks are vendor-run. Pricing, limits and versions may change.
- Descriptions were tuned only on Jev's errors, and Haiku was not given an F-style check.
- Banking77 has some label noise (for example, near-duplicate intents such as
card_arrivalandcard_delivery_estimate), which caps every model. The cleaned-key check estimates its size.
Reproducibility
pip install -r requirements.txt python test_gate.py # gate unit tests python analyze.py # recompute every table from the committed logs (no API calls) python cleaned_scores.py # secondary: re-score against the cleaned answer key python build_site_data.py # rebuild docs/data.json for this site # re-run a model (costs money; needs OPENROUTER_API_KEY) python run.py --model jev --set tuning --categories v2 python run.py --model sonnet --set test --categories v2 --confirm-test
- Decision logs (one row per message per run, with prediction, confidence, gate result, correctness, latency and cost):
logs/ - Description versions:
categories/; keyword lists:keywords/ - Decisions and pre-commitments:
CHANGELOG.md; original spec:planning/ - Total API spend for the whole project: $16.09 (Sonnet 5 $12.73, Haiku 4.5 $2.86, Jev $0.32, description drafting $0.14, DeepSeek V4 Flash $0.04).