uspraveen/Jevify

Turn Any Open-LLM into a System-one Jev model

Python

4

126 commits

updated Sep 25, 2026

See the code

README

Jevify

Turn any open LLM into a calibrated, Jev-style System One decision model.

Try it · Findings · jev-bench on the Hub · Models · Leaderboard · Jev baseline + label audit · Jev API contract · Dataset rationale

every model on jev-bench: accuracy vs calibration

A System One model doesn't write text. It reads a state, answers typed questions, and returns probability distributions your code can branch on:

primitivequestionanswer
choicewhich of these K options?probabilities over the options + confidence
scorewhere on these K ordered levels?probabilities over levels, expected score, confidence
noulis this true?a single P(yes)

TypeSafe's Jev made this a product category: fast, cheap, and — the actual claim — calibrated: an answer given 0.8 should be right about 80% of the time. Jev ships no paper, weights or data. Jevify is the open version: a benchmark that can measure the claim, an engine that gives any Hugging Face checkpoint the same interface, and a training recipe that optimizes the same objective.

Jev 1.13.0 (TypeSafe API)0.733 accuracy, ECE 0.113 on jev-bench — calibrated on crisp questions, over-confident where people disagree
Best open model hereQwen3.5-9B, readout fine-tuned + coherence: 0.763 accuracy, ECE 0.056, TVD to human labels 0.301 (Jev 0.432)
Where Jev still leadsthe six held-out sources (0.835 vs 0.804), and applying a rule stated in the question (0.924 vs 0.80)
Speeda readout is one forward pass: 45–100 ms per question with up to ~27 options on one A40 (2B–9B), under Jev's 180–220 ms round trip

Contents — Quickstart · Published models · Highlights · Leaderboard · What's here · Why tiers · Roadmap · License

Quickstart

Playground: https://uspraveenraj--jevify-playground.modal.run — ask a Jevified open model typed questions and watch the distributions. Scales to zero, so the first question waits ~30 s for a cold start.

Hosted API, same wire format as TypeSafe's:

curl -X POST https://uspraveenraj--jevify-playground.modal.run/api/v1/systemone   -H 'Content-Type: application/json'   -d '{"state": "I was charged twice, please refund.", "model": "jevify-latest",
       "questions": {"refund": {"type": "noul", "instructions": "Is this a refund request?"}}}'

The official typesafe-sdk works against it unchanged:

# TYPESAFE_BASE_URL=https://uspraveenraj--jevify-playground.modal.run/api
from typesafe_sdk import Noul, TypeSafeClient
with TypeSafeClient() as client:
    r = client.system_one(state="I was charged twice, please refund.", model="jevify-latest",
                          questions={"refund": Noul(instructions="Is this a refund request?")})

From source — build the benchmark, score Jev on it, serve a Jevified checkpoint, run the probes:

pip install -e ".[bench,engine,serve,dev]"

# the benchmark
jevify-bench list
jevify-bench build --out data/jev-bench                     # or load Praveenrajus/jev-bench from the Hub

# score Jev (or any /v1/systemone server) on it
TYPESAFE_API_KEY=... jevify-run api --records data/jev-bench --out preds/jev.jsonl
jevify-run report --records data/jev-bench --preds preds/jev.jsonl --md report.md --figures figures/

# Jevify a checkpoint and serve it
jevify-serve --model Qwen/Qwen3.5-0.8B --port 8000
TYPESAFE_BASE_URL=http://localhost:8000 python -c "from typesafe_sdk import *; print(TypeSafeClient().system_one('Refund please', {'r': Noul(instructions='Is this a refund request?')}))"

# behavioral probes
jevify-bench probe --records data/jev-bench --out data/jev-probes --n 200
jevify-run api --records data/jev-probes --out preds/probes.jsonl
jevify-bench probe-report --records data/jev-probes --preds preds/probes.jsonl --out results/probes

Tests: pytest (engine and server tests download a 135M model and run on CPU).

Published models

Load with load_jevified("<repo>"), or serve as a TypeSafe drop-in with jevify-serve --model <repo>. The backbone is pulled from its own repo, so nothing is duplicated; every readout fine-tune ships a reproduction check.

familyreposnote
Readout fine-tuned + coherenceqwen3.5-4b-coh · qwen3.5-2b-coh · gemma-4-e4b-it-coh4B: 0.751 accuracy, ECE 0.058, sure loss 0.029 (FINDINGS 18)
Readout fine-tuned, supervisedqwen3.5-9b · qwen3.5-4b · qwen3.5-2b · gemma-4-e4b-it9B: 0.759 accuracy, ECE 0.052; the 4B repos carry seed 1 on a seed1 branch
From base checkpointsqwen3.5-4b-base / -coh · qwen3.5-2b-base / -coh · gemma-4-e4bthe starting checkpoint matters little after readout fine-tuning
Full fine-tunesqwen3.5-2b-full · qwen3.5-2b-full-cohweights in the repo (3.8 GB); lr 1e-6 selected on validation, other learning rates as branches
Tier 2 (LoRA + heads)qwen3.5-4b-t2-lowlr · qwen3.5-4b-t2lowlr: accuracy 0.734 = Jev, ECE 0.096, TVD 0.337
Tier 1 (decision heads, backbone frozen)qwen3.5-4b · qwen3.5-2b~11 MB each
Visionqwen3-vl-2b · qwen3-vl-2b-t2Tier 0 recipe; decoder LoRA merged at load

Highlights

Jev, measured

  • Excellent and calibrated on crisp, grounded questions (ARC 0.979 at ECE 0.010, FEVER 0.972) — and over-confident exactly where humans disagree: on ChaosNLI its confidence stays at 0.81–0.88 while its accuracy runs 0.47 → 0.96 (r = 0.046).
  • Applies a rule written into the question at 0.924 — its largest lead over every open model (results/b).
  • ~75 ms + 5.5 µs per input token, flat in the number of options: the answer is read, not decoded (FINDINGS §1).

Open models, no training (Tier 0)

  • A readout plus a validation-fitted temperature matches Jev's calibration, not its accuracy: Gemma-4-12B-it 0.716 / ECE 0.086, Qwen3.5-9B 0.689 / 0.092. Instruction tuning distorts the confidence scale; one temperature per primitive repairs it.
  • On a phishing benchmark written by someone else, untrained Gemma-4-12B beats Jev by twenty points (0.825 vs 0.628) (results/community).

Training on the decision itself (FINDINGS 18, results/post-training)

  • Readout fine-tuning puts open models above Jev overall: 9B 0.763 / ECE 0.056, 4B 0.751 / 0.058, Gemma-4-E4B 0.742 / 0.053, with TVD to human labels ~0.30 against Jev's 0.43.
  • Trained alone, answers to related questions drift apart (sure loss 0.15 → 0.28 at 4B); a coherence penalty cuts that tenfold, to 0.02–0.03 — below Jev's 0.081 — at no accuracy cost, at every size, in both families and under full fine-tuning.
  • Held-out sources keep us honest: a head that replaces the model's scorer loses −0.098 on sources it never saw; a residual keeps Tier 0's accuracy there (FINDINGS 6).

What post-training does to a decision readout (FINDINGS 17)

  • Base checkpoints range from under- to over-confident (fitted temperature 0.6–1.7). Where the SFT checkpoint is published, SFT leaves the readout close to calibrated, and preference optimisation (Tülu DPO, SmolLM3 APO) then makes it over-confident at flat accuracy. The first post-training step makes decisions more invariant in all eight pairs tested.

Vision and speed (FINDINGS 9–10)

  • The same primitives about an image: recipe-fitted Qwen3-VL-8B reaches ECE 0.025–0.038 on POPE, A-OKVQA and AI2D, and answers an image question in 120 ms on one A40.
The fifteen headline findings in full (with figures)

1 · Jev is calibrated right up until humans disagree — which is when calibration matters. On ChaosNLI, where 100 annotators label every item, Jev's confidence is essentially flat no matter how much the annotators agree — 0.81 / 0.84 / 0.83 / 0.88 as agreement goes from a split (< 50%, n = 191) through contested (50–70%, n = 828) and clear (70–90%, n = 523) to consensus (≥ 90%, n = 57), Pearson r = 0.046 — while its accuracy on those same bands runs 0.47 / 0.55 / 0.73 / 0.96. It is more confident than the human majority on 80% of items; its distributions sit TVD 0.33 from the human ones, and 0.43 on hate-speech vote shares. Meanwhile it is excellent and well calibrated on crisp, grounded questions (ARC 0.979, FEVER 0.972, ECE ≤ 0.06).

Jev: confidence vs human agreement on ChaosNLI

2 · Evaluating on held-out records instead of held-out sources would have shipped the wrong architecture — and the head tells you itself when it has stopped generalizing. A trained head that replaces the model's own scorer gains +0.077 accuracy on sources it trained on and loses −0.098 on sources it never saw. Making it a zero-initialized residual on that scorer — so training provably starts at Tier 0 — keeps the gain (+0.080). The first version of this README said it also "erased the regression (−0.000)". Five seeds say otherwise: held-out accuracy is 0.579 ± 0.049, bimodal — two seeds match Tier 0 (0.628), three regress by ~0.09 — while trained-source accuracy is stable at 0.635 ± 0.007. What separates the basins is the weight the head learns on the model's own log-score: 0.95 for the seeds that held up, 0.92–0.93 for the ones that collapsed, and the same ordering at 4B (ρ = 0.90 and 0.97 within each backbone). Every extra epoch on the trained sources erodes that trust, early stopping on trained-source loss cannot see it — and capping the schedule at six epochs collapses the spread to 0.621 ± 0.004 with the weight at 0.965 for every seed and the trained gain intact. So Tier 1 is "+0.08 where it trained, Tier 0 where it did not, if it stops early", and the LM weight is the diagnostic. At 4B, five seeds: trained +0.047 every time, held-out 0.715 ± 0.025 against Tier 0's 0.714 — the +0.035 first reported was one seed at the top of the spread. At 9B, three seeds with the cap from the start: held-out 0.743 ± 0.002, and on the sources it trained on it beats Jev on accuracy and calibration (0.703 / ECE 0.064 vs 0.694 / 0.122) with the backbone frozen.

Tier 1: trained vs held-out sources

3 · An open 4B now matches or beats Jev on every macro number — and Jev still wins where it counts most. Qwen3.5-4B with LoRA and residual heads (Tier 2) at LoRA lr 3e-5: macro accuracy 0.734 vs Jev's 0.733, macro ECE 0.096 vs 0.113, TVD to human label distributions 0.337 vs 0.432, ChaosNLI ECE 0.211 vs 0.222. At lr 1e-4 the same model reaches 0.747 accuracy for a worse ECE (0.110). The qualifier is the split: it wins 9 of 22 configs on accuracy and 12 on ECE, not all 22, and on the six sources it never trained on Jev leads 0.835 to 0.765 — the open model's overall edge comes from the sixteen it did train on (0.722 vs 0.694). One seed each. Praveenrajus/jevify-qwen3.5-4b-t2-lowlr. Without touching the backbone, Qwen3.5-4B with residual heads alone reaches 0.698 / ECE 0.089 / TVD 0.360; the 2B head's ECE of 0.069 is the best of anything tested but, per (2), seed-dependent on unseen sources.

4 · Structure generalizes; knowledge does not. Heads trained with ≤16 options transfer unchanged to K=151 (clinc150 moves −0.008). What collapses under replacement is knowledge (arc_challenge −0.199, mmlu −0.119 even when trained) and ordinal scales never seen (measuring_hate_speech −0.482).

5 · LoRA buys the accuracy a frozen backbone cannot, and at 4B it buys calibration too. Tier 2 (rank-16 LoRA trained jointly with the residual heads, one A40) lifts Qwen3.5-2B from 0.632 to 0.690 macro accuracy and Qwen3.5-4B from 0.698 to 0.747, and fixes the Tier 1 weak spot outright: the held-out ordinal scale gains +0.17 accuracy and gets better calibrated. The learning rate decides the calibration, and three seeds per arm agree: at 3e-5 the 2B model is better than at 1e-4 on the sources it never trained on — accuracy 0.716 ± 0.003 vs 0.700 ± 0.002, ECE 0.083 ± 0.004 vs 0.104 ± 0.014 — at the same trained-source accuracy, and its agreement with human label distributions (TVD 0.339) is the best of any model tested (Jev 0.432). Two things the seeds took away: training on human label distributions did not help (TVD 0.433), and the low learning rate does not rescue the ambiguous-question calibration the LoRA costs — ChaosNLI ECE ranges 0.16–0.33 across seeds in both arms, at Jev's level (0.222) and far from the Tier 1 residual's 0.077. One thing they added: Tier 2's held-out accuracy is seed-stable (±0.003) where Tier 1's was bimodal (±0.049) — partly because every LoRA run stops after one or two passes, the regime in which (2) showed the head is stable too. At 4B the same learning-rate trade holds: 3e-5 gives held-out 0.765 / ECE 0.098 against 0.769 / 0.107 at 1e-4. And soft labels fail at the low learning rate as well (TVD 0.364 vs 0.332 for hard labels): the loss, not the schedule, is what makes them worse at matching human distributions. · detail

6 · Instruction tuning does hurt calibration — 1.3–2.1× worse raw ECE — but it is almost entirely a temperature problem. Gemma-4-E2B-it starts at ECE 0.370 and lands at 0.123 after one scalar per primitive; its accuracy is +0.195 over its base checkpoint for +0.008 ECE. Take the instruct checkpoint and always fit the temperature — on the exact distribution: our own fitter read the 4-decimal wire format, which zeroed real high-K probabilities and cost the Gemma models 0.03–0.06 ECE until it was fixed. · detail · detail

7 · What hurts Jev is ambiguity, not option count. Controlled within-item probes: with the gold answer always present, clinc150 goes 0.995 → 0.910 from K=2 to K=151, while GoEmotions is 0.850 at K=2 and 0.300 by K=25. Option order flips 0–13% of answers, scaling with ambiguity rather than K; opaque option keys cost nothing as long as descriptions remain; nonsense options attract ≤3.3% of the mass.

8 · The primitives are different instruments. The same yes/no question is ~2× better calibrated asked as a Noul than as a two-option Choice (ECE 0.028 vs 0.054); Score beats an unordered Choice over the same levels. This is why Tier 1 gives Noul its own absolute head instead of a softmax over {yes, no}.

9 · Two of our own benchmark bugs, found by reading the model's errors. HelpSteer2 verbosity levels contradicted NVIDIA's verbatim scale, and GoEmotions' single-label subset hid rater disagreement (rebuilt from raw votes; plurality agreement is only 0.66, which is the accuracy ceiling). Low benchmark scores deserve an audit before they become claims.

10 · It transfers to vision — and a picture question answers in under 80 ms. Qwen3-VL-2B, no training, on POPE / A-OKVQA / AI2D (4,244 records): a recipe fitted on validation splits takes macro ECE from 0.128 to 0.047 (POPE 0.046, A-OKVQA 0.037, AI2D 0.059) at unchanged accuracy. The raw readout shows the text ordering — Noul better calibrated than Choice — and the recipe erases it: the raw gap measured what a temperature could fix, not which primitive is easier. Starving the vision encoder costs accuracy and calibration together (42 → 187 image tokens: +0.048 accuracy, −0.037 ECE); the dangerous regime — losing accuracy while keeping confidence — never appears, and the budget saturates silently (512 and 1024 patches both give 280 tokens). Served through the same ask path as the text models, an image question takes 68–79 ms on one A40 (~350 input tokens, 85% of them image), four questions about one image 221 ms, 12.6 records/s batched — under Jev's 180–220 ms text round trip, and Jev takes no images. And the vision tower was the wrong place to look: a LoRA trained on the readout over 2,000 A-OKVQA records transfers to science diagrams it never saw when it lives in the decoder (AI2D 0.652 → 0.707, macro ECE 0.047 → 0.035) and barely when confined to the tower (0.669); after the decoder LoRA the fitted Choice temperature is 1.001 — training on a proper scoring rule made the recipe redundant on the trained primitive. Published: Praveenrajus/jevify-qwen3-vl-2b (Tier 0) · Praveenrajus/jevify-qwen3-vl-2b-t2 (decoder LoRA). · detail

Three LoRA scopes against the untrained readout

What the vision encoder's budget buys

11 · Jev's flat latency curve is arithmetic, not architecture — and a serving path gives our engine the same shape. Jev's round trip barely moves with the number of options (186 ms at K=4, 219 ms at K=151). Controlled probes with the server's own clock say why: ~75 ms fixed + ~5.5 µs per input token, linear to 27,000 tokens, with option tokens costing exactly what state tokens cost — no cache, no fixed window, no batching wait. 151 options are ~1,300 tokens, ~7 ms. The answer is a template filled in one pass (2,570 "output" tokens in 128 ms), not a decode. Our research path paid ~120 µs per token on an A40, so the same options cost it 150 ms; the same model on the same GPU through vLLM pays ~48 µs, halves the fixed floor and runs 4–5× more records per second. Below K≈60 a 2B on our A40 now answers in ~46 ms — 4× under Jev's round trip. · probes · detail

Same model, same GPU: research path vs serving path

The original ladder (research path, four sizes, three tiers) is kept as results/latency/latency_ladder.png; Jev's server-time fit is results/jev-latency-probe/server_time_vs_tokens.png.

12 · At 8–12B the picture holds, and the speed claim gets its honest form. Qwen3-VL-8B, Qwen3.5-9B and Gemma-4-12B on the vision configs, no training: macro accuracy 0.84 (2B: 0.78), AI2D 0.75–0.77 (2B: 0.65), macro ECE 0.032 for the 8B after a recipe — and Qwen3.5-9B's raw readout is already calibrated (ECE 0.045 before any temperature), the only checkpoint tested for which that is true. An image question answers in 120 ms (Qwen3-VL-8B) to 175 ms (Gemma-4-12B) on one A40, still under Jev's 180–220 ms text round trip; through vLLM the 9B text model sits at 56–70 ms for K ≤ 27. The comparison that matters: on the same model and prompt, the readout costs the prefill (85–180 ms) while decoding the answer as text costs 52–106 ms per token on top — an eight-token answer is 4–7× the readout, a 32-token one 13–27×. Generation pays for tokens a typed decision never asked for; that is the saving, at 2B or 12B. · detail

Reading the answer against decoding it

13 · On benchmarks we did not write, an untrained 12B beats Jev by twenty points — and fine-tuning broke both fine-tuned 4Bs, ours included. Three public Jev benchmarks written by other people, scored unchanged (identical, all 2,087 records, to the inputs Together AI used): on 2,000 phishing emails, Gemma-4-12B with zero training is 0.825 against Jev's 0.628 (McNemar p = 10⁻⁸⁷), and the untrained Qwen3.5-4B readout is 0.700 at ECE 0.023. Together's Tev1 and our own Jevify Tier 2 — two independent fine-tunes of that same Qwen3.5-4B — flag 0.6% and 6.1% of the emails where their base flags 23.6%, and land near chance. On jev-bench, Tev1 (read in its own prompt, answers identical to Together's hosted model on 2,086 of 2,087 items) is 0.703 macro, ECE 0.086 with a recipe; its fine-tune adds +0.030 at equal prompt, all on tasks it trained on, while its prompt format alone lifts the untrained base +0.044 on the held-out sources — +0.129 on the held-out hate-speech scale. CLM-v0.1-8B, served by its own code, is 0.340. · Tev1 · community benchmarks · CLM

Three Jev benchmarks written by other people

14 · Given a rule, Jev applies it; no open model does yet — and retraining ours the Tev1 way does not change that. Three new tests: 885 human-written legal fact patterns with the rule written into the question, "none of the above" with the right option removed, and instructions planted inside the input. Jev applies a stated rule at 0.924; every open model — untrained, Tev1, our Tier 2 — sits at 0.62–0.70, its largest lead anywhere in this project. Fine-tuning did make both 4Bs notice a missing answer (0.48 → 0.66–0.70) and resist planted instructions (hijack rate 0.40 → 0.14–0.16). Retraining our 4B Tier 2 with Together's generated data and shuffled options moved held-out accuracy by −0.003 to −0.015, left the phishing collapse in place, and showed that a fine-tune's behaviour outside jev-bench varies between identical runs far more than its jev-bench score does. That collapse is a moved threshold: one shift fitted on sixteen labelled emails takes Tev1 from 0.51 to 0.76 and our Tier 2 from 0.56 to 0.70 on the emails it never saw. · new tests · retraining · the phishing threshold

15 · Post-training shapes a decision readout stage by stage — and a coherence penalty removes the incoherence that fine-tuning adds. Scored at every published stage of five families, base checkpoints range from under- to over-confident, SFT leaves the readout close to calibrated, and preference optimisation (Tülu DPO, SmolLM3 APO — two labs, two algorithms) then makes it over-confident at flat accuracy (fitted temperatures up 1.3–2.4×). The first post-training step makes decisions more invariant in all eight base → post-trained pairs, and Gemma-4's instruct models score below their bases without their chat template. Readout fine-tuning — training a model on its own decision distribution — takes Qwen3.5 2B/4B/9B and Gemma-4-E4B to 0.70–0.76 accuracy at ECE 0.05–0.06 (Jev 0.733 / 0.113), but makes their answers to related questions contradict each other more (sure loss 0.15 → 0.28 at 4B). Adding that sure loss as a penalty cuts it tenfold, to 0.02–0.03 — below Jev's 0.081 — at no accuracy cost and with closer agreement to human label distributions at every size. Starting from the base checkpoint ends in the same place in Qwen3.5 (4B: 0.741 vs 0.743; Gemma-4 closes most of its wider gap), and full fine-tuning matches LoRA at 2B. · results · FINDINGS 17–18

Full catalogue with evidence and caveats: docs/FINDINGS.md. Further reading: behavioral probes · Tier 1 write-up · training-data plan · benchmarks we did not write · results index.

Leaderboard

Every model on the same 22,773 test records. Tier 0 = no training (prompt + logit readout + a recipe fitted on validation splits only, with the corrected fitter of FINDINGS 4.5). Tier 1 = trained decision heads, six sources held out of training. TVD→human is the mean distance to human label distributions on the four calibration-gold configs — lower is better, and it is the number Jev's own claim rests on. External = another team's model: Together AI's Tev1 fine-tune, read through our Tier 0 readout in its own prompt format (FINDINGS §11), and CLM-v0.1-8B, served by its authors' code with nothing fitted (§13). The bracket names the prompt a checkpoint was read in when it is not simply ours: Tev1's own format, or — for Tev1 — Jevify's. Readout FT = readout fine-tuning (FINDINGS 18): the published LoRA and full fine-tunes, trained on the model's own decision distribution, with or without the coherence penalty; the map draws the coherence arm of each backbone as a star.

modeltiermacro accmacro ECEmacro Briersel@90choice accscore accnoul accTVD→humanGPUtest cost
Jev 1.13.0 (TypeSafe API)API0.7330.1130.3490.7600.7700.5030.8810.432
Qwen/Qwen3.5-9B (readout LoRA + coherence)Readout FT0.7630.0560.2990.7910.7910.5540.9060.301
Qwen/Qwen3.5-4B (readout LoRA + coherence)Readout FT0.7510.0580.3160.7790.7710.5550.8930.303
google/gemma-4-E4B-it (readout LoRA + coherence)Readout FT0.7420.0530.3220.7720.7590.5460.8890.297
Qwen/Qwen3.5-4B (Tier 2 residual, lr 3e-05)Tier 2 residual0.7340.0960.3420.7620.7610.5180.8840.337A40
google/gemma-4-12B-itTier 00.7160.0860.3590.7400.7490.5070.8550.405A40
Qwen/Qwen3.5-9B (Tier 1 residual, 6-epoch cap, mean of 3 seeds)Tier 1 residual0.7140.0710.3620.7400.7250.5070.8780.376A40
togethercomputer/Tev1-4B-experimental (Tev1 prompt)External0.7030.0860.3610.7320.7170.5120.8500.394A40
Qwen/Qwen3.5-9BTier 00.6890.0920.3790.7170.7160.5030.8150.423A40
All 43 rows, and accuracy / ECE per config
modeltiermacro accmacro ECEmacro Briersel@90choice accscore accnoul accTVD→humanGPUtest cost
Jev 1.13.0 (TypeSafe API)API0.7330.1130.3490.7600.7700.5030.8810.432
Qwen/Qwen3.5-9B (readout LoRA + coherence)Readout FT0.7630.0560.2990.7910.7910.5540.9060.301
Qwen/Qwen3.5-9B (readout LoRA)Readout FT0.7590.0520.3020.7870.7900.5410.9050.314
Qwen/Qwen3.5-4B (readout LoRA + coherence)Readout FT0.7510.0580.3160.7790.7710.5550.8930.303
Qwen/Qwen3.5-4B-Base (readout LoRA + coherence)Readout FT0.7470.0580.3180.7770.7710.5350.8970.314
Qwen/Qwen3.5-4B (Tier 2 residual)Tier 2 residual0.7470.1100.3420.7740.7700.5290.9030.347A40
Qwen/Qwen3.5-4B (readout LoRA)Readout FT0.7430.0590.3210.7720.7660.5300.8960.326
google/gemma-4-E4B-it (readout LoRA + coherence)Readout FT0.7420.0530.3220.7720.7590.5460.8890.297
Qwen/Qwen3.5-4B-Base (readout LoRA)Readout FT0.7410.0640.3240.7700.7680.5220.8930.324
google/gemma-4-E4B-it (readout LoRA)Readout FT0.7370.0570.3300.7660.7540.5310.8920.316
Qwen/Qwen3.5-4B (Tier 2 residual, lr 3e-05)Tier 2 residual0.7340.0960.3420.7620.7610.5180.8840.337A40
google/gemma-4-12B-itTier 00.7160.0860.3590.7400.7490.5070.8550.405A40
Qwen/Qwen3.5-9B (Tier 1 residual, 6-epoch cap, mean of 3 seeds)Tier 1 residual0.7140.0710.3620.7400.7250.5070.8780.376A40
google/gemma-4-E4B (readout LoRA)Readout FT0.7080.0610.3590.7360.7170.5020.8740.335
Qwen/Qwen3.5-2B (readout full fine-tune + coherence)Readout FT0.7040.0560.3580.7350.7180.5100.8530.307
togethercomputer/Tev1-4B-experimental (Tev1 prompt)External0.7030.0860.3610.7320.7170.5120.8500.394A40
Qwen/Qwen3.5-2B (readout full fine-tune)Readout FT0.7030.0560.3580.7340.7150.5090.8550.315
Qwen/Qwen3.5-2B-Base (readout LoRA + coherence)Readout FT0.7020.0510.3650.7310.7140.5090.8520.320
Qwen/Qwen3.5-2B (readout LoRA + coherence)Readout FT0.7020.0540.3640.7290.7180.4960.8580.315
Qwen/Qwen3.5-2B (readout LoRA)Readout FT0.7010.0510.3620.7300.7130.5080.8490.324
Qwen/Qwen3.5-4B (Tier 1 residual)Tier 1 residual0.6980.0890.3780.7290.6990.5070.8620.360A100-80GB$1.28
Qwen/Qwen3.5-2B-Base (readout LoRA)Readout FT0.6960.0530.3650.7250.7140.4870.8520.342
Qwen/Qwen3.5-2B (Tier 2 residual, lr 3e-05, soft labels)Tier 2 residual0.6940.1050.3900.7240.6970.4970.8590.364A40
togethercomputer/Tev1-4B-experimental (Jevify prompt)External0.6900.0880.3690.7180.7140.4870.8340.408A40
Qwen/Qwen3.5-2B (Tier 2 residual, lr 3e-05)Tier 2 residual0.6900.1030.3890.7200.6930.5100.8400.332A40
Qwen/Qwen3.5-9BTier 00.6890.0920.3790.7170.7160.5030.8150.423A40
Qwen/Qwen3.5-2B (Tier 2 residual)Tier 2 residual0.6850.1160.4100.7130.6710.5080.8540.370A40
Qwen/Qwen3.5-2B (Tier 2 residual, soft labels)Tier 2 residual0.6740.1160.4120.7030.6820.4710.8370.433A40
Qwen/Qwen3.5-4B (Tev1 prompt)Tier 00.6730.1040.4020.7020.6870.4990.8050.421A40
Qwen/Qwen3.5-4BTier 00.6620.0900.4010.6890.6870.4680.7960.438A100-80GB$0.96
google/gemma-4-E4B-itTier 00.6580.0920.3980.6820.7000.4320.7980.434A100-80GB$1.00
Qwen/Qwen3.5-2B (Tier 1 residual)Tier 1 residual0.6320.0690.4450.6570.5960.4490.8350.374A100-80GB$0.67
Qwen/Qwen3.5-2B (Tier 1 residual, 6-epoch cap, mean of 5 seeds)Tier 1 residual0.6310.0780.4500.6550.6030.4450.8270.373A40
IFM/K2-Horizon-7BTier 00.6230.0930.4360.6470.6170.4090.8130.434A40
Qwen/Qwen3.5-2B (Tier 1 replace)Tier 1 replace0.5990.0830.4750.6210.5670.3780.8280.416A100-80GB$0.62
google/gemma-4-E2B-itTier 00.5910.1230.4840.6120.5940.4400.7160.492L4$0.75
Qwen/Qwen3.5-2BTier 00.5770.0890.4850.5990.5450.4240.7500.458A100-80GB$0.66
HuggingFaceTB/SmolLM3-3BTier 00.5520.1110.5190.5700.5040.4010.7440.460A100-80GB$0.64
Qwen/Qwen3.5-0.8BTier 00.5260.1120.5420.5440.4360.3880.7590.440L4$0.55
Qwen/Qwen3.5-0.8B-BaseTier 00.4660.1050.5820.4780.3260.4120.6920.452L4$0.50
IFM/K2-Horizon-0.9BTier 00.4480.1190.5890.4610.3440.3430.6700.479L4$0.35
google/gemma-4-E2BTier 00.3960.1150.6090.4040.2470.3820.6000.496L4$0.69
CLM-v0.1-8B (Contrastive-LM, self-hosted)External0.3400.3380.8140.3490.2130.2340.5930.669

accuracy per config

ECE per config

models

Per config, for every model at once — the dark cells are Jev on Score and CLM almost everywhere:

ECE per config, every model

Refresh with python scripts/leaderboard.py; every row has results/<run>/ with its predictions, per-config metrics, recipe and figures.

What's here

jev-bench — 22 configs, 166k rows of real human-labeled data reformatted into System One questions in Jev's exact wire format, with human label distributions on four configs (ChaosNLI, Civil Comments, Measuring Hate Speech, GoEmotions) so calibration is measured against how humans actually split. Natural base rates everywhere. → jevify/bench, jevify-bench build.

Metrics and figures — ECE, Brier, NLL, RPS, selective accuracy, AURC, AUROC, TVD/KL to human distributions; reliability diagrams, calibration maps with bootstrap CIs, risk–coverage curves, model-vs-human plots. → jevify/bench/metrics.py, jevify/bench/figures.py.

Behavioral probes — within-item experiments that isolate one factor: decision-set size (same items, gold kept, K distractors), option order, opaque option keys, distractor injection, and the same question asked through a different primitive. → jevify/bench/probes.py.

The engine (Tier 0) — render state + question, score every allowed answer by teacher-forcing against a shared prefix (KV cache expanded across candidates, so 151-option Choice is one prefix pass), then calibrate. Raw log-scores are stored on every prediction, so temperature scaling, permutation averaging and contextual-prior correction are offline CPU experiments; nothing is tuned on test. → jevify/engine.

A drop-in server — jevify-serve --model <hf-id> exposes /v1/systemone and /v1/models. The official typesafe-sdk works against it by setting TYPESAFE_BASE_URL; that is a test in this repo. → jevify/server.py.

A Jev runner — score the real API on the same records, same metrics, same figures. → jevify-run api|report|recipe|compare.

Training that runs anywhere — Tier 1, Tier 2 and the vision pass with no cloud dependency: python -m jevify.train tier1|tier2|vision --model-id … --run-id …. The Modal app calls the same functions. → jevify/train.py.

Vision — images ride on state (PIL, path, URL, data URI or bytes); the question and answer set are unchanged, and so is the serving path: load_jevified("Praveenrajus/jevify-qwen3-vl-2b") or jevify-serve --model Praveenrajus/jevify-qwen3-vl-2b (or --vision with any VLM checkpoint). The vision tower is addressable, not opaque: describe() it, set a pixel budget and measure the tokens it actually produced, freeze it, or train a LoRA confined to it — python -m jevify.train vision --lora vision|decoder|both adapts the readout itself, since a VLM prompt has no per-option slot positions that survive image-token expansion. Scoping uses a full-path regex because suffix names like q_proj exist on both halves of a VLM, so a suffix list silently adapts everything. Tower swapping is deliberately not offered — the projector is trained against one encoder's geometry. → jevify/engine/vision.py, jevify/engine/vision_tier2.py, jevify/engine/vision_backbone.py, scripts/vision_budget.py, scripts/latency_vision.py.

Readout fine-tuning and the post-training battery — train a model on its own decision readout (LoRA or every weight, optionally with a coherence penalty), and measure any checkpoint with one battery: jev-bench, coherence families, the probe suite, the identifier (tag) test, the new tests and the community benchmarks. Every fine-tune ships as a loadable repo whose card is generated from the study table and which passes a reproduction check before upload. → scripts/publish_readout.py, scripts/tag_invariance.py, results/post-training/, FINDINGS 17–18.

Why tiers, and why no RL

Calibration comes from optimizing a strictly proper scoring rule against real outcomes. TypeSafe calls their version RLCD. When the model emits a decision you need RL to push that objective through a sampling step; when the decision is read from a differentiable head on the backbone's hidden states, the same objective is just a loss. Jevify trains heads (and optionally LoRA) by gradient descent on log/Brier/ranked-probability losses — no reward model, no rollouts — and each tier has to earn its place on jev-bench.

Roadmap
  • jev-bench v0.1.1, Jev 1.13.0 baseline, figures, label audit, behavioral probes
  • Tier 0 engine + server + offline recipe search
  • Tier 0 sweep: 9 open checkpoints scored on all 22,773 test records against Jev
  • Tier 1 residual decision heads, with held-out-source generalization measured
  • Findings, figures and reports published (docs/FINDINGS.md)
  • Published models + hosted playground and API
  • Tier 1 replicated on a second backbone (Qwen3.5-4B)
  • Training portable off Modal (python -m jevify.train)
  • VLM backbones: Tier 0 on POPE / A-OKVQA / AI2D; vision tower inspectable, budgetable, freezable, LoRA-scopable
  • Vision-encoder budget sweep: accuracy and calibration degrade together, budget saturation measured
  • Tier 2: LoRA jointly with residual heads — +0.058 macro accuracy at 2B; at lr 3e-5 the best held-out ECE and human-agreement of any model; overfits after one pass
  • Tier 2 ablation: learning rate vs hard-label loss — the learning rate was the cause of the overconfidence; soft-label training is a negative result on human agreement
  • Latency: Jev's server-time law measured; vLLM serving path with the same numbers, 4-5x throughput
  • Five-seed error bars on Tier 1: held-out generalization is seed-dependent (0.579 ± 0.049); README corrected
  • The LM-weight diagnostic and the epoch-cap intervention (0.621 ± 0.004); 4B replicated over five seeds
  • Tier 2 at 4B: macro 0.747, above Jev's 0.733; Jev still leads on held-out sources — published as jevify-qwen3.5-4b-t2
  • Vision served at Jev speed: recipe-fitted Qwen3-VL-2B published; 68–79 ms per image question on one A40
  • Seeds on the Tier 2 arms: the learning-rate result holds (3 seeds each); LoRA held-out accuracy is seed-stable
  • Soft labels at the low learning rate; the low learning rate at 4B
  • Vision Tier 2: LoRA on the readout, tower vs decoder vs both — the decoder is where transfer lives (AI2D +0.055 held out)
  • 8B-class study: Qwen3-VL-8B, Qwen3.5-9B, Gemma-4-12B — vision Tier 0, latency, readout vs generation on one A40
  • Gemma-4-12B text Tier 0 (0.716, closest to Jev without training); Tier 1 at 9B (seed-stable, beats Jev on trained sources)
  • Recipe fitter fixed (it read the rounded wire format); every Tier 0 run refitted; T(K) measured and left opt-in
  • Tier 2 at the low learning rate on 4B (matches Jev's accuracy, better ECE and human agreement); soft labels fail at both rates
  • Post-training study: five families at every published stage, one battery (FINDINGS 17)
  • Readout fine-tuning + coherence penalty at 2B/4B/9B and on Gemma-4; full fine-tuning at 2B (LR swept on validation); 15 model repos published with reproduction checks
  • Full fine-tuning at 4B (two GPUs per run, in progress)
  • More ordinal scales; Decision 1.0 (vLLM Semantic Router) on jev-bench; synthetic structure data
  • Label-first synthetic data pipeline; HF Space; model zoo

License

Apache-2.0 for the code. Benchmark rows carry their upstream licenses (see the manifest and docs/DATASETS.md).

uspraveen/Jevify

Turn Any Open-LLM into a System-one Jev model

Python

4

126 commits

updated Sep 25, 2026

See the code

README

Jevify

Turn any open LLM into a calibrated, Jev-style System One decision model.

Try it · Findings · jev-bench on the Hub · Models · Leaderboard · Jev baseline + label audit · Jev API contract · Dataset rationale

every model on jev-bench: accuracy vs calibration

A System One model doesn't write text. It reads a state, answers typed questions, and returns probability distributions your code can branch on:

primitivequestionanswer
choicewhich of these K options?probabilities over the options + confidence
scorewhere on these K ordered levels?probabilities over levels, expected score, confidence
noulis this true?a single P(yes)

TypeSafe's Jev made this a product category: fast, cheap, and — the actual claim — calibrated: an answer given 0.8 should be right about 80% of the time. Jev ships no paper, weights or data. Jevify is the open version: a benchmark that can measure the claim, an engine that gives any Hugging Face checkpoint the same interface, and a training recipe that optimizes the same objective.

Jev 1.13.0 (TypeSafe API)0.733 accuracy, ECE 0.113 on jev-bench — calibrated on crisp questions, over-confident where people disagree
Best open model hereQwen3.5-9B, readout fine-tuned + coherence: 0.763 accuracy, ECE 0.056, TVD to human labels 0.301 (Jev 0.432)
Where Jev still leadsthe six held-out sources (0.835 vs 0.804), and applying a rule stated in the question (0.924 vs 0.80)
Speeda readout is one forward pass: 45–100 ms per question with up to ~27 options on one A40 (2B–9B), under Jev's 180–220 ms round trip

Contents — Quickstart · Published models · Highlights · Leaderboard · What's here · Why tiers · Roadmap · License

Quickstart

Playground: https://uspraveenraj--jevify-playground.modal.run — ask a Jevified open model typed questions and watch the distributions. Scales to zero, so the first question waits ~30 s for a cold start.

Hosted API, same wire format as TypeSafe's:

curl -X POST https://uspraveenraj--jevify-playground.modal.run/api/v1/systemone   -H 'Content-Type: application/json'   -d '{"state": "I was charged twice, please refund.", "model": "jevify-latest",
       "questions": {"refund": {"type": "noul", "instructions": "Is this a refund request?"}}}'

The official typesafe-sdk works against it unchanged:

# TYPESAFE_BASE_URL=https://uspraveenraj--jevify-playground.modal.run/api
from typesafe_sdk import Noul, TypeSafeClient
with TypeSafeClient() as client:
    r = client.system_one(state="I was charged twice, please refund.", model="jevify-latest",
                          questions={"refund": Noul(instructions="Is this a refund request?")})

From source — build the benchmark, score Jev on it, serve a Jevified checkpoint, run the probes:

pip install -e ".[bench,engine,serve,dev]"

# the benchmark
jevify-bench list
jevify-bench build --out data/jev-bench                     # or load Praveenrajus/jev-bench from the Hub

# score Jev (or any /v1/systemone server) on it
TYPESAFE_API_KEY=... jevify-run api --records data/jev-bench --out preds/jev.jsonl
jevify-run report --records data/jev-bench --preds preds/jev.jsonl --md report.md --figures figures/

# Jevify a checkpoint and serve it
jevify-serve --model Qwen/Qwen3.5-0.8B --port 8000
TYPESAFE_BASE_URL=http://localhost:8000 python -c "from typesafe_sdk import *; print(TypeSafeClient().system_one('Refund please', {'r': Noul(instructions='Is this a refund request?')}))"

# behavioral probes
jevify-bench probe --records data/jev-bench --out data/jev-probes --n 200
jevify-run api --records data/jev-probes --out preds/probes.jsonl
jevify-bench probe-report --records data/jev-probes --preds preds/probes.jsonl --out results/probes

Tests: pytest (engine and server tests download a 135M model and run on CPU).

Published models

Load with load_jevified("<repo>"), or serve as a TypeSafe drop-in with jevify-serve --model <repo>. The backbone is pulled from its own repo, so nothing is duplicated; every readout fine-tune ships a reproduction check.

familyreposnote
Readout fine-tuned + coherenceqwen3.5-4b-coh · qwen3.5-2b-coh · gemma-4-e4b-it-coh4B: 0.751 accuracy, ECE 0.058, sure loss 0.029 (FINDINGS 18)
Readout fine-tuned, supervisedqwen3.5-9b · qwen3.5-4b · qwen3.5-2b · gemma-4-e4b-it9B: 0.759 accuracy, ECE 0.052; the 4B repos carry seed 1 on a seed1 branch
From base checkpointsqwen3.5-4b-base / -coh · qwen3.5-2b-base / -coh · gemma-4-e4bthe starting checkpoint matters little after readout fine-tuning
Full fine-tunesqwen3.5-2b-full · qwen3.5-2b-full-cohweights in the repo (3.8 GB); lr 1e-6 selected on validation, other learning rates as branches
Tier 2 (LoRA + heads)qwen3.5-4b-t2-lowlr · qwen3.5-4b-t2lowlr: accuracy 0.734 = Jev, ECE 0.096, TVD 0.337
Tier 1 (decision heads, backbone frozen)qwen3.5-4b · qwen3.5-2b~11 MB each
Visionqwen3-vl-2b · qwen3-vl-2b-t2Tier 0 recipe; decoder LoRA merged at load

Highlights

Jev, measured

  • Excellent and calibrated on crisp, grounded questions (ARC 0.979 at ECE 0.010, FEVER 0.972) — and over-confident exactly where humans disagree: on ChaosNLI its confidence stays at 0.81–0.88 while its accuracy runs 0.47 → 0.96 (r = 0.046).
  • Applies a rule written into the question at 0.924 — its largest lead over every open model (results/b).
  • ~75 ms + 5.5 µs per input token, flat in the number of options: the answer is read, not decoded (FINDINGS §1).

Open models, no training (Tier 0)

  • A readout plus a validation-fitted temperature matches Jev's calibration, not its accuracy: Gemma-4-12B-it 0.716 / ECE 0.086, Qwen3.5-9B 0.689 / 0.092. Instruction tuning distorts the confidence scale; one temperature per primitive repairs it.
  • On a phishing benchmark written by someone else, untrained Gemma-4-12B beats Jev by twenty points (0.825 vs 0.628) (results/community).

Training on the decision itself (FINDINGS 18, results/post-training)

  • Readout fine-tuning puts open models above Jev overall: 9B 0.763 / ECE 0.056, 4B 0.751 / 0.058, Gemma-4-E4B 0.742 / 0.053, with TVD to human labels ~0.30 against Jev's 0.43.
  • Trained alone, answers to related questions drift apart (sure loss 0.15 → 0.28 at 4B); a coherence penalty cuts that tenfold, to 0.02–0.03 — below Jev's 0.081 — at no accuracy cost, at every size, in both families and under full fine-tuning.
  • Held-out sources keep us honest: a head that replaces the model's scorer loses −0.098 on sources it never saw; a residual keeps Tier 0's accuracy there (FINDINGS 6).

What post-training does to a decision readout (FINDINGS 17)

  • Base checkpoints range from under- to over-confident (fitted temperature 0.6–1.7). Where the SFT checkpoint is published, SFT leaves the readout close to calibrated, and preference optimisation (Tülu DPO, SmolLM3 APO) then makes it over-confident at flat accuracy. The first post-training step makes decisions more invariant in all eight pairs tested.

Vision and speed (FINDINGS 9–10)

  • The same primitives about an image: recipe-fitted Qwen3-VL-8B reaches ECE 0.025–0.038 on POPE, A-OKVQA and AI2D, and answers an image question in 120 ms on one A40.
The fifteen headline findings in full (with figures)

1 · Jev is calibrated right up until humans disagree — which is when calibration matters. On ChaosNLI, where 100 annotators label every item, Jev's confidence is essentially flat no matter how much the annotators agree — 0.81 / 0.84 / 0.83 / 0.88 as agreement goes from a split (< 50%, n = 191) through contested (50–70%, n = 828) and clear (70–90%, n = 523) to consensus (≥ 90%, n = 57), Pearson r = 0.046 — while its accuracy on those same bands runs 0.47 / 0.55 / 0.73 / 0.96. It is more confident than the human majority on 80% of items; its distributions sit TVD 0.33 from the human ones, and 0.43 on hate-speech vote shares. Meanwhile it is excellent and well calibrated on crisp, grounded questions (ARC 0.979, FEVER 0.972, ECE ≤ 0.06).

Jev: confidence vs human agreement on ChaosNLI

2 · Evaluating on held-out records instead of held-out sources would have shipped the wrong architecture — and the head tells you itself when it has stopped generalizing. A trained head that replaces the model's own scorer gains +0.077 accuracy on sources it trained on and loses −0.098 on sources it never saw. Making it a zero-initialized residual on that scorer — so training provably starts at Tier 0 — keeps the gain (+0.080). The first version of this README said it also "erased the regression (−0.000)". Five seeds say otherwise: held-out accuracy is 0.579 ± 0.049, bimodal — two seeds match Tier 0 (0.628), three regress by ~0.09 — while trained-source accuracy is stable at 0.635 ± 0.007. What separates the basins is the weight the head learns on the model's own log-score: 0.95 for the seeds that held up, 0.92–0.93 for the ones that collapsed, and the same ordering at 4B (ρ = 0.90 and 0.97 within each backbone). Every extra epoch on the trained sources erodes that trust, early stopping on trained-source loss cannot see it — and capping the schedule at six epochs collapses the spread to 0.621 ± 0.004 with the weight at 0.965 for every seed and the trained gain intact. So Tier 1 is "+0.08 where it trained, Tier 0 where it did not, if it stops early", and the LM weight is the diagnostic. At 4B, five seeds: trained +0.047 every time, held-out 0.715 ± 0.025 against Tier 0's 0.714 — the +0.035 first reported was one seed at the top of the spread. At 9B, three seeds with the cap from the start: held-out 0.743 ± 0.002, and on the sources it trained on it beats Jev on accuracy and calibration (0.703 / ECE 0.064 vs 0.694 / 0.122) with the backbone frozen.

Tier 1: trained vs held-out sources

3 · An open 4B now matches or beats Jev on every macro number — and Jev still wins where it counts most. Qwen3.5-4B with LoRA and residual heads (Tier 2) at LoRA lr 3e-5: macro accuracy 0.734 vs Jev's 0.733, macro ECE 0.096 vs 0.113, TVD to human label distributions 0.337 vs 0.432, ChaosNLI ECE 0.211 vs 0.222. At lr 1e-4 the same model reaches 0.747 accuracy for a worse ECE (0.110). The qualifier is the split: it wins 9 of 22 configs on accuracy and 12 on ECE, not all 22, and on the six sources it never trained on Jev leads 0.835 to 0.765 — the open model's overall edge comes from the sixteen it did train on (0.722 vs 0.694). One seed each. Praveenrajus/jevify-qwen3.5-4b-t2-lowlr. Without touching the backbone, Qwen3.5-4B with residual heads alone reaches 0.698 / ECE 0.089 / TVD 0.360; the 2B head's ECE of 0.069 is the best of anything tested but, per (2), seed-dependent on unseen sources.

4 · Structure generalizes; knowledge does not. Heads trained with ≤16 options transfer unchanged to K=151 (clinc150 moves −0.008). What collapses under replacement is knowledge (arc_challenge −0.199, mmlu −0.119 even when trained) and ordinal scales never seen (measuring_hate_speech −0.482).

5 · LoRA buys the accuracy a frozen backbone cannot, and at 4B it buys calibration too. Tier 2 (rank-16 LoRA trained jointly with the residual heads, one A40) lifts Qwen3.5-2B from 0.632 to 0.690 macro accuracy and Qwen3.5-4B from 0.698 to 0.747, and fixes the Tier 1 weak spot outright: the held-out ordinal scale gains +0.17 accuracy and gets better calibrated. The learning rate decides the calibration, and three seeds per arm agree: at 3e-5 the 2B model is better than at 1e-4 on the sources it never trained on — accuracy 0.716 ± 0.003 vs 0.700 ± 0.002, ECE 0.083 ± 0.004 vs 0.104 ± 0.014 — at the same trained-source accuracy, and its agreement with human label distributions (TVD 0.339) is the best of any model tested (Jev 0.432). Two things the seeds took away: training on human label distributions did not help (TVD 0.433), and the low learning rate does not rescue the ambiguous-question calibration the LoRA costs — ChaosNLI ECE ranges 0.16–0.33 across seeds in both arms, at Jev's level (0.222) and far from the Tier 1 residual's 0.077. One thing they added: Tier 2's held-out accuracy is seed-stable (±0.003) where Tier 1's was bimodal (±0.049) — partly because every LoRA run stops after one or two passes, the regime in which (2) showed the head is stable too. At 4B the same learning-rate trade holds: 3e-5 gives held-out 0.765 / ECE 0.098 against 0.769 / 0.107 at 1e-4. And soft labels fail at the low learning rate as well (TVD 0.364 vs 0.332 for hard labels): the loss, not the schedule, is what makes them worse at matching human distributions. · detail

6 · Instruction tuning does hurt calibration — 1.3–2.1× worse raw ECE — but it is almost entirely a temperature problem. Gemma-4-E2B-it starts at ECE 0.370 and lands at 0.123 after one scalar per primitive; its accuracy is +0.195 over its base checkpoint for +0.008 ECE. Take the instruct checkpoint and always fit the temperature — on the exact distribution: our own fitter read the 4-decimal wire format, which zeroed real high-K probabilities and cost the Gemma models 0.03–0.06 ECE until it was fixed. · detail · detail

7 · What hurts Jev is ambiguity, not option count. Controlled within-item probes: with the gold answer always present, clinc150 goes 0.995 → 0.910 from K=2 to K=151, while GoEmotions is 0.850 at K=2 and 0.300 by K=25. Option order flips 0–13% of answers, scaling with ambiguity rather than K; opaque option keys cost nothing as long as descriptions remain; nonsense options attract ≤3.3% of the mass.

8 · The primitives are different instruments. The same yes/no question is ~2× better calibrated asked as a Noul than as a two-option Choice (ECE 0.028 vs 0.054); Score beats an unordered Choice over the same levels. This is why Tier 1 gives Noul its own absolute head instead of a softmax over {yes, no}.

9 · Two of our own benchmark bugs, found by reading the model's errors. HelpSteer2 verbosity levels contradicted NVIDIA's verbatim scale, and GoEmotions' single-label subset hid rater disagreement (rebuilt from raw votes; plurality agreement is only 0.66, which is the accuracy ceiling). Low benchmark scores deserve an audit before they become claims.

10 · It transfers to vision — and a picture question answers in under 80 ms. Qwen3-VL-2B, no training, on POPE / A-OKVQA / AI2D (4,244 records): a recipe fitted on validation splits takes macro ECE from 0.128 to 0.047 (POPE 0.046, A-OKVQA 0.037, AI2D 0.059) at unchanged accuracy. The raw readout shows the text ordering — Noul better calibrated than Choice — and the recipe erases it: the raw gap measured what a temperature could fix, not which primitive is easier. Starving the vision encoder costs accuracy and calibration together (42 → 187 image tokens: +0.048 accuracy, −0.037 ECE); the dangerous regime — losing accuracy while keeping confidence — never appears, and the budget saturates silently (512 and 1024 patches both give 280 tokens). Served through the same ask path as the text models, an image question takes 68–79 ms on one A40 (~350 input tokens, 85% of them image), four questions about one image 221 ms, 12.6 records/s batched — under Jev's 180–220 ms text round trip, and Jev takes no images. And the vision tower was the wrong place to look: a LoRA trained on the readout over 2,000 A-OKVQA records transfers to science diagrams it never saw when it lives in the decoder (AI2D 0.652 → 0.707, macro ECE 0.047 → 0.035) and barely when confined to the tower (0.669); after the decoder LoRA the fitted Choice temperature is 1.001 — training on a proper scoring rule made the recipe redundant on the trained primitive. Published: Praveenrajus/jevify-qwen3-vl-2b (Tier 0) · Praveenrajus/jevify-qwen3-vl-2b-t2 (decoder LoRA). · detail

Three LoRA scopes against the untrained readout

What the vision encoder's budget buys

11 · Jev's flat latency curve is arithmetic, not architecture — and a serving path gives our engine the same shape. Jev's round trip barely moves with the number of options (186 ms at K=4, 219 ms at K=151). Controlled probes with the server's own clock say why: ~75 ms fixed + ~5.5 µs per input token, linear to 27,000 tokens, with option tokens costing exactly what state tokens cost — no cache, no fixed window, no batching wait. 151 options are ~1,300 tokens, ~7 ms. The answer is a template filled in one pass (2,570 "output" tokens in 128 ms), not a decode. Our research path paid ~120 µs per token on an A40, so the same options cost it 150 ms; the same model on the same GPU through vLLM pays ~48 µs, halves the fixed floor and runs 4–5× more records per second. Below K≈60 a 2B on our A40 now answers in ~46 ms — 4× under Jev's round trip. · probes · detail

Same model, same GPU: research path vs serving path

The original ladder (research path, four sizes, three tiers) is kept as results/latency/latency_ladder.png; Jev's server-time fit is results/jev-latency-probe/server_time_vs_tokens.png.

12 · At 8–12B the picture holds, and the speed claim gets its honest form. Qwen3-VL-8B, Qwen3.5-9B and Gemma-4-12B on the vision configs, no training: macro accuracy 0.84 (2B: 0.78), AI2D 0.75–0.77 (2B: 0.65), macro ECE 0.032 for the 8B after a recipe — and Qwen3.5-9B's raw readout is already calibrated (ECE 0.045 before any temperature), the only checkpoint tested for which that is true. An image question answers in 120 ms (Qwen3-VL-8B) to 175 ms (Gemma-4-12B) on one A40, still under Jev's 180–220 ms text round trip; through vLLM the 9B text model sits at 56–70 ms for K ≤ 27. The comparison that matters: on the same model and prompt, the readout costs the prefill (85–180 ms) while decoding the answer as text costs 52–106 ms per token on top — an eight-token answer is 4–7× the readout, a 32-token one 13–27×. Generation pays for tokens a typed decision never asked for; that is the saving, at 2B or 12B. · detail

Reading the answer against decoding it

13 · On benchmarks we did not write, an untrained 12B beats Jev by twenty points — and fine-tuning broke both fine-tuned 4Bs, ours included. Three public Jev benchmarks written by other people, scored unchanged (identical, all 2,087 records, to the inputs Together AI used): on 2,000 phishing emails, Gemma-4-12B with zero training is 0.825 against Jev's 0.628 (McNemar p = 10⁻⁸⁷), and the untrained Qwen3.5-4B readout is 0.700 at ECE 0.023. Together's Tev1 and our own Jevify Tier 2 — two independent fine-tunes of that same Qwen3.5-4B — flag 0.6% and 6.1% of the emails where their base flags 23.6%, and land near chance. On jev-bench, Tev1 (read in its own prompt, answers identical to Together's hosted model on 2,086 of 2,087 items) is 0.703 macro, ECE 0.086 with a recipe; its fine-tune adds +0.030 at equal prompt, all on tasks it trained on, while its prompt format alone lifts the untrained base +0.044 on the held-out sources — +0.129 on the held-out hate-speech scale. CLM-v0.1-8B, served by its own code, is 0.340. · Tev1 · community benchmarks · CLM

Three Jev benchmarks written by other people

14 · Given a rule, Jev applies it; no open model does yet — and retraining ours the Tev1 way does not change that. Three new tests: 885 human-written legal fact patterns with the rule written into the question, "none of the above" with the right option removed, and instructions planted inside the input. Jev applies a stated rule at 0.924; every open model — untrained, Tev1, our Tier 2 — sits at 0.62–0.70, its largest lead anywhere in this project. Fine-tuning did make both 4Bs notice a missing answer (0.48 → 0.66–0.70) and resist planted instructions (hijack rate 0.40 → 0.14–0.16). Retraining our 4B Tier 2 with Together's generated data and shuffled options moved held-out accuracy by −0.003 to −0.015, left the phishing collapse in place, and showed that a fine-tune's behaviour outside jev-bench varies between identical runs far more than its jev-bench score does. That collapse is a moved threshold: one shift fitted on sixteen labelled emails takes Tev1 from 0.51 to 0.76 and our Tier 2 from 0.56 to 0.70 on the emails it never saw. · new tests · retraining · the phishing threshold

15 · Post-training shapes a decision readout stage by stage — and a coherence penalty removes the incoherence that fine-tuning adds. Scored at every published stage of five families, base checkpoints range from under- to over-confident, SFT leaves the readout close to calibrated, and preference optimisation (Tülu DPO, SmolLM3 APO — two labs, two algorithms) then makes it over-confident at flat accuracy (fitted temperatures up 1.3–2.4×). The first post-training step makes decisions more invariant in all eight base → post-trained pairs, and Gemma-4's instruct models score below their bases without their chat template. Readout fine-tuning — training a model on its own decision distribution — takes Qwen3.5 2B/4B/9B and Gemma-4-E4B to 0.70–0.76 accuracy at ECE 0.05–0.06 (Jev 0.733 / 0.113), but makes their answers to related questions contradict each other more (sure loss 0.15 → 0.28 at 4B). Adding that sure loss as a penalty cuts it tenfold, to 0.02–0.03 — below Jev's 0.081 — at no accuracy cost and with closer agreement to human label distributions at every size. Starting from the base checkpoint ends in the same place in Qwen3.5 (4B: 0.741 vs 0.743; Gemma-4 closes most of its wider gap), and full fine-tuning matches LoRA at 2B. · results · FINDINGS 17–18

Full catalogue with evidence and caveats: docs/FINDINGS.md. Further reading: behavioral probes · Tier 1 write-up · training-data plan · benchmarks we did not write · results index.

Leaderboard

Every model on the same 22,773 test records. Tier 0 = no training (prompt + logit readout + a recipe fitted on validation splits only, with the corrected fitter of FINDINGS 4.5). Tier 1 = trained decision heads, six sources held out of training. TVD→human is the mean distance to human label distributions on the four calibration-gold configs — lower is better, and it is the number Jev's own claim rests on. External = another team's model: Together AI's Tev1 fine-tune, read through our Tier 0 readout in its own prompt format (FINDINGS §11), and CLM-v0.1-8B, served by its authors' code with nothing fitted (§13). The bracket names the prompt a checkpoint was read in when it is not simply ours: Tev1's own format, or — for Tev1 — Jevify's. Readout FT = readout fine-tuning (FINDINGS 18): the published LoRA and full fine-tunes, trained on the model's own decision distribution, with or without the coherence penalty; the map draws the coherence arm of each backbone as a star.

modeltiermacro accmacro ECEmacro Briersel@90choice accscore accnoul accTVD→humanGPUtest cost
Jev 1.13.0 (TypeSafe API)API0.7330.1130.3490.7600.7700.5030.8810.432
Qwen/Qwen3.5-9B (readout LoRA + coherence)Readout FT0.7630.0560.2990.7910.7910.5540.9060.301
Qwen/Qwen3.5-4B (readout LoRA + coherence)Readout FT0.7510.0580.3160.7790.7710.5550.8930.303
google/gemma-4-E4B-it (readout LoRA + coherence)Readout FT0.7420.0530.3220.7720.7590.5460.8890.297
Qwen/Qwen3.5-4B (Tier 2 residual, lr 3e-05)Tier 2 residual0.7340.0960.3420.7620.7610.5180.8840.337A40
google/gemma-4-12B-itTier 00.7160.0860.3590.7400.7490.5070.8550.405A40
Qwen/Qwen3.5-9B (Tier 1 residual, 6-epoch cap, mean of 3 seeds)Tier 1 residual0.7140.0710.3620.7400.7250.5070.8780.376A40
togethercomputer/Tev1-4B-experimental (Tev1 prompt)External0.7030.0860.3610.7320.7170.5120.8500.394A40
Qwen/Qwen3.5-9BTier 00.6890.0920.3790.7170.7160.5030.8150.423A40
All 43 rows, and accuracy / ECE per config
modeltiermacro accmacro ECEmacro Briersel@90choice accscore accnoul accTVD→humanGPUtest cost
Jev 1.13.0 (TypeSafe API)API0.7330.1130.3490.7600.7700.5030.8810.432
Qwen/Qwen3.5-9B (readout LoRA + coherence)Readout FT0.7630.0560.2990.7910.7910.5540.9060.301
Qwen/Qwen3.5-9B (readout LoRA)Readout FT0.7590.0520.3020.7870.7900.5410.9050.314
Qwen/Qwen3.5-4B (readout LoRA + coherence)Readout FT0.7510.0580.3160.7790.7710.5550.8930.303
Qwen/Qwen3.5-4B-Base (readout LoRA + coherence)Readout FT0.7470.0580.3180.7770.7710.5350.8970.314
Qwen/Qwen3.5-4B (Tier 2 residual)Tier 2 residual0.7470.1100.3420.7740.7700.5290.9030.347A40
Qwen/Qwen3.5-4B (readout LoRA)Readout FT0.7430.0590.3210.7720.7660.5300.8960.326
google/gemma-4-E4B-it (readout LoRA + coherence)Readout FT0.7420.0530.3220.7720.7590.5460.8890.297
Qwen/Qwen3.5-4B-Base (readout LoRA)Readout FT0.7410.0640.3240.7700.7680.5220.8930.324
google/gemma-4-E4B-it (readout LoRA)Readout FT0.7370.0570.3300.7660.7540.5310.8920.316
Qwen/Qwen3.5-4B (Tier 2 residual, lr 3e-05)Tier 2 residual0.7340.0960.3420.7620.7610.5180.8840.337A40
google/gemma-4-12B-itTier 00.7160.0860.3590.7400.7490.5070.8550.405A40
Qwen/Qwen3.5-9B (Tier 1 residual, 6-epoch cap, mean of 3 seeds)Tier 1 residual0.7140.0710.3620.7400.7250.5070.8780.376A40
google/gemma-4-E4B (readout LoRA)Readout FT0.7080.0610.3590.7360.7170.5020.8740.335
Qwen/Qwen3.5-2B (readout full fine-tune + coherence)Readout FT0.7040.0560.3580.7350.7180.5100.8530.307
togethercomputer/Tev1-4B-experimental (Tev1 prompt)External0.7030.0860.3610.7320.7170.5120.8500.394A40
Qwen/Qwen3.5-2B (readout full fine-tune)Readout FT0.7030.0560.3580.7340.7150.5090.8550.315
Qwen/Qwen3.5-2B-Base (readout LoRA + coherence)Readout FT0.7020.0510.3650.7310.7140.5090.8520.320
Qwen/Qwen3.5-2B (readout LoRA + coherence)Readout FT0.7020.0540.3640.7290.7180.4960.8580.315
Qwen/Qwen3.5-2B (readout LoRA)Readout FT0.7010.0510.3620.7300.7130.5080.8490.324
Qwen/Qwen3.5-4B (Tier 1 residual)Tier 1 residual0.6980.0890.3780.7290.6990.5070.8620.360A100-80GB$1.28
Qwen/Qwen3.5-2B-Base (readout LoRA)Readout FT0.6960.0530.3650.7250.7140.4870.8520.342
Qwen/Qwen3.5-2B (Tier 2 residual, lr 3e-05, soft labels)Tier 2 residual0.6940.1050.3900.7240.6970.4970.8590.364A40
togethercomputer/Tev1-4B-experimental (Jevify prompt)External0.6900.0880.3690.7180.7140.4870.8340.408A40
Qwen/Qwen3.5-2B (Tier 2 residual, lr 3e-05)Tier 2 residual0.6900.1030.3890.7200.6930.5100.8400.332A40
Qwen/Qwen3.5-9BTier 00.6890.0920.3790.7170.7160.5030.8150.423A40
Qwen/Qwen3.5-2B (Tier 2 residual)Tier 2 residual0.6850.1160.4100.7130.6710.5080.8540.370A40
Qwen/Qwen3.5-2B (Tier 2 residual, soft labels)Tier 2 residual0.6740.1160.4120.7030.6820.4710.8370.433A40
Qwen/Qwen3.5-4B (Tev1 prompt)Tier 00.6730.1040.4020.7020.6870.4990.8050.421A40
Qwen/Qwen3.5-4BTier 00.6620.0900.4010.6890.6870.4680.7960.438A100-80GB$0.96
google/gemma-4-E4B-itTier 00.6580.0920.3980.6820.7000.4320.7980.434A100-80GB$1.00
Qwen/Qwen3.5-2B (Tier 1 residual)Tier 1 residual0.6320.0690.4450.6570.5960.4490.8350.374A100-80GB$0.67
Qwen/Qwen3.5-2B (Tier 1 residual, 6-epoch cap, mean of 5 seeds)Tier 1 residual0.6310.0780.4500.6550.6030.4450.8270.373A40
IFM/K2-Horizon-7BTier 00.6230.0930.4360.6470.6170.4090.8130.434A40
Qwen/Qwen3.5-2B (Tier 1 replace)Tier 1 replace0.5990.0830.4750.6210.5670.3780.8280.416A100-80GB$0.62
google/gemma-4-E2B-itTier 00.5910.1230.4840.6120.5940.4400.7160.492L4$0.75
Qwen/Qwen3.5-2BTier 00.5770.0890.4850.5990.5450.4240.7500.458A100-80GB$0.66
HuggingFaceTB/SmolLM3-3BTier 00.5520.1110.5190.5700.5040.4010.7440.460A100-80GB$0.64
Qwen/Qwen3.5-0.8BTier 00.5260.1120.5420.5440.4360.3880.7590.440L4$0.55
Qwen/Qwen3.5-0.8B-BaseTier 00.4660.1050.5820.4780.3260.4120.6920.452L4$0.50
IFM/K2-Horizon-0.9BTier 00.4480.1190.5890.4610.3440.3430.6700.479L4$0.35
google/gemma-4-E2BTier 00.3960.1150.6090.4040.2470.3820.6000.496L4$0.69
CLM-v0.1-8B (Contrastive-LM, self-hosted)External0.3400.3380.8140.3490.2130.2340.5930.669

accuracy per config

ECE per config

models

Per config, for every model at once — the dark cells are Jev on Score and CLM almost everywhere:

ECE per config, every model

Refresh with python scripts/leaderboard.py; every row has results/<run>/ with its predictions, per-config metrics, recipe and figures.

What's here

jev-bench — 22 configs, 166k rows of real human-labeled data reformatted into System One questions in Jev's exact wire format, with human label distributions on four configs (ChaosNLI, Civil Comments, Measuring Hate Speech, GoEmotions) so calibration is measured against how humans actually split. Natural base rates everywhere. → jevify/bench, jevify-bench build.

Metrics and figures — ECE, Brier, NLL, RPS, selective accuracy, AURC, AUROC, TVD/KL to human distributions; reliability diagrams, calibration maps with bootstrap CIs, risk–coverage curves, model-vs-human plots. → jevify/bench/metrics.py, jevify/bench/figures.py.

Behavioral probes — within-item experiments that isolate one factor: decision-set size (same items, gold kept, K distractors), option order, opaque option keys, distractor injection, and the same question asked through a different primitive. → jevify/bench/probes.py.

The engine (Tier 0) — render state + question, score every allowed answer by teacher-forcing against a shared prefix (KV cache expanded across candidates, so 151-option Choice is one prefix pass), then calibrate. Raw log-scores are stored on every prediction, so temperature scaling, permutation averaging and contextual-prior correction are offline CPU experiments; nothing is tuned on test. → jevify/engine.

A drop-in server — jevify-serve --model <hf-id> exposes /v1/systemone and /v1/models. The official typesafe-sdk works against it by setting TYPESAFE_BASE_URL; that is a test in this repo. → jevify/server.py.

A Jev runner — score the real API on the same records, same metrics, same figures. → jevify-run api|report|recipe|compare.

Training that runs anywhere — Tier 1, Tier 2 and the vision pass with no cloud dependency: python -m jevify.train tier1|tier2|vision --model-id … --run-id …. The Modal app calls the same functions. → jevify/train.py.

Vision — images ride on state (PIL, path, URL, data URI or bytes); the question and answer set are unchanged, and so is the serving path: load_jevified("Praveenrajus/jevify-qwen3-vl-2b") or jevify-serve --model Praveenrajus/jevify-qwen3-vl-2b (or --vision with any VLM checkpoint). The vision tower is addressable, not opaque: describe() it, set a pixel budget and measure the tokens it actually produced, freeze it, or train a LoRA confined to it — python -m jevify.train vision --lora vision|decoder|both adapts the readout itself, since a VLM prompt has no per-option slot positions that survive image-token expansion. Scoping uses a full-path regex because suffix names like q_proj exist on both halves of a VLM, so a suffix list silently adapts everything. Tower swapping is deliberately not offered — the projector is trained against one encoder's geometry. → jevify/engine/vision.py, jevify/engine/vision_tier2.py, jevify/engine/vision_backbone.py, scripts/vision_budget.py, scripts/latency_vision.py.

Readout fine-tuning and the post-training battery — train a model on its own decision readout (LoRA or every weight, optionally with a coherence penalty), and measure any checkpoint with one battery: jev-bench, coherence families, the probe suite, the identifier (tag) test, the new tests and the community benchmarks. Every fine-tune ships as a loadable repo whose card is generated from the study table and which passes a reproduction check before upload. → scripts/publish_readout.py, scripts/tag_invariance.py, results/post-training/, FINDINGS 17–18.

Why tiers, and why no RL

Calibration comes from optimizing a strictly proper scoring rule against real outcomes. TypeSafe calls their version RLCD. When the model emits a decision you need RL to push that objective through a sampling step; when the decision is read from a differentiable head on the backbone's hidden states, the same objective is just a loss. Jevify trains heads (and optionally LoRA) by gradient descent on log/Brier/ranked-probability losses — no reward model, no rollouts — and each tier has to earn its place on jev-bench.

Roadmap
  • jev-bench v0.1.1, Jev 1.13.0 baseline, figures, label audit, behavioral probes
  • Tier 0 engine + server + offline recipe search
  • Tier 0 sweep: 9 open checkpoints scored on all 22,773 test records against Jev
  • Tier 1 residual decision heads, with held-out-source generalization measured
  • Findings, figures and reports published (docs/FINDINGS.md)
  • Published models + hosted playground and API
  • Tier 1 replicated on a second backbone (Qwen3.5-4B)
  • Training portable off Modal (python -m jevify.train)
  • VLM backbones: Tier 0 on POPE / A-OKVQA / AI2D; vision tower inspectable, budgetable, freezable, LoRA-scopable
  • Vision-encoder budget sweep: accuracy and calibration degrade together, budget saturation measured
  • Tier 2: LoRA jointly with residual heads — +0.058 macro accuracy at 2B; at lr 3e-5 the best held-out ECE and human-agreement of any model; overfits after one pass
  • Tier 2 ablation: learning rate vs hard-label loss — the learning rate was the cause of the overconfidence; soft-label training is a negative result on human agreement
  • Latency: Jev's server-time law measured; vLLM serving path with the same numbers, 4-5x throughput
  • Five-seed error bars on Tier 1: held-out generalization is seed-dependent (0.579 ± 0.049); README corrected
  • The LM-weight diagnostic and the epoch-cap intervention (0.621 ± 0.004); 4B replicated over five seeds
  • Tier 2 at 4B: macro 0.747, above Jev's 0.733; Jev still leads on held-out sources — published as jevify-qwen3.5-4b-t2
  • Vision served at Jev speed: recipe-fitted Qwen3-VL-2B published; 68–79 ms per image question on one A40
  • Seeds on the Tier 2 arms: the learning-rate result holds (3 seeds each); LoRA held-out accuracy is seed-stable
  • Soft labels at the low learning rate; the low learning rate at 4B
  • Vision Tier 2: LoRA on the readout, tower vs decoder vs both — the decoder is where transfer lives (AI2D +0.055 held out)
  • 8B-class study: Qwen3-VL-8B, Qwen3.5-9B, Gemma-4-12B — vision Tier 0, latency, readout vs generation on one A40
  • Gemma-4-12B text Tier 0 (0.716, closest to Jev without training); Tier 1 at 9B (seed-stable, beats Jev on trained sources)
  • Recipe fitter fixed (it read the rounded wire format); every Tier 0 run refitted; T(K) measured and left opt-in
  • Tier 2 at the low learning rate on 4B (matches Jev's accuracy, better ECE and human agreement); soft labels fail at both rates
  • Post-training study: five families at every published stage, one battery (FINDINGS 17)
  • Readout fine-tuning + coherence penalty at 2B/4B/9B and on Gemma-4; full fine-tuning at 2B (LR swept on validation); 15 model repos published with reproduction checks
  • Full fine-tuning at 4B (two GPUs per run, in progress)
  • More ordinal scales; Decision 1.0 (vLLM Semantic Router) on jev-bench; synthetic structure data
  • Label-first synthetic data pipeline; HF Space; model zoo

License

Apache-2.0 for the code. Benchmark rows carry their upstream licenses (see the manifest and docs/DATASETS.md).