A typed-decision model: Qwen/Qwen3.5-2B-Base with its tower fine-tuned and a
trained option-scoring head. It answers choice / noul / score questions about a
document in one forward pass, and speaks the
Jev HTTP API.
This checkpoint is seed 17, fixed in advance as primary rather than chosen for scoring best:
| typed-decisions | reversed order | MMLU-Pro 1k | reproduces its training run |
|---|---|---|---|
| 0.7905 | 0.7935 | 0.383 | 1.0000 |
Re-computed from these exact files after upload-time reload. Kernel stack fla-0.5.2/torch-2.7.1+cu128; full recipe in meta.json.
import sys; sys.path.insert(0, 'code') # after snapshot_download of this repo
from load_release import load_release
model, tok, enc, meta = load_release('.', device='cuda')
print(meta['calibration']) # the fitted calibration this checkpoint ships, or 'none'
load_release applies calibration.safetensors when the checkpoint carries one, so the probabilities are the calibrated ones this card reports. A loader that skips those files returns the raw distribution instead: the same chosen option, different numbers.
Everything below is the version record from the project repository, unchanged.
Describes release v2.1 Β· updated 2026-09-27
One typed-decision model, 2B. Given a document and a set of typed questions β yes/no, pick-one-of-k, rate-on-a-rubric β it returns a calibrated probability for every option in one forward pass, with no generated text. The task, the architecture and the confidence head are v2.0's, unchanged.
v2.0 had to be published with a caveat: its suite gain came very largely from training on the suite's own train splits, and on three benchmarks frozen before the search began it did not beat v1.0. v2.1 is the version where that caveat goes away. It is ahead of v1.0 on all three of those held-out benchmarks, significantly so on two, and it recovers the general knowledge v2.0 lost.
Unchanged from v1.0 and v2.0: a document (the
state) plus one or more typed questions β noul, choice, score β and a probability
per option, returned in one forward pass. Pooled top-1 is the fraction of decisions
whose highest-probability option matches the teacher's modal label; ECE is expected
calibration error, the average gap between the confidence a model reports and how often it
is right at that confidence, weighted by bin size, lower being better.
The architecture is v1.0's and the confidence head is v2.0's, both unchanged; see v2.0 Β§2. Three things changed, all in the data and the optimiser, and none of them in how inference works.
The third is the one worth reading twice. v2.0's single real regression was general knowledge: MMLU-Pro fell from v1.0's 0.355 to 0.305 while every decision benchmark rose. Five things were tried against it:
| the repair | MMLU-Pro | what it cost |
|---|---|---|
| a retention KL against the base model's next-token distribution | 0.3085 | nothing, and it did not work |
| more replay, weighted to science, half recast to ten options | 0.3307 | nothing |
| the whole tower at half the learning rate | 0.3273 | nothing, and inside the noise |
| freeze the tower's lower third | 0.3390 | three benchmarks regressed |
| the bottom 8 layers at one tenth the learning rate | 0.3590 | nothing |
The first is the interesting failure. Holding the tower's language modelling close to the base model works as an objective β the retention KL stayed near 0.02 nats per token β and MMLU-Pro eroded anyway. What the decision readout uses is not what next-token prediction preserves, so protecting the latter does not protect the former.
The rest say that this was never a data problem. More and better-shaped replay moves MMLU-Pro by +0.008. A uniformly smaller learning rate moves it by nothing. Freezing the lower layers moves it by +0.016 and breaks three decision benchmarks, because those layers do need to adapt. Letting them adapt slowly gets more of the knowledge back than freezing them does and costs nothing at all: +0.054 on the recipe, and past v1.0. Fitting a decision objective through the whole tower at one rate was overwriting the representation the knowledge sat in.
| model | base | typed-decisions | MMLU-Pro 1k | suite ECE | download |
|---|---|---|---|---|---|
| RSI-Jev-v2.1-2B | Qwen3.5-2B-Base | 0.7905 | 0.383 | 0.0556 | π€ download |
| RSI-Jev-v2.0-2B | Qwen3.5-2B-Base | 0.7925 | 0.305 | 0.0546 | π€ download |
| RSI-Jev-v1.0-2B | Qwen3.5-2B-Base | 0.6525 | 0.3550 | 0.0921 | π€ download |
As with v2.0, the typed-decisions figure is not comparable to v1.0's, because both v2.0 and v2.1 trained on that benchmark's train split. Against v2.0, which trained on the same split, v2.1 is flat there (β0.002) and its gains are elsewhere.
2B only, one seed's checkpoint. There is no v2.1 at 0.8B.
Reproducing its training run. Re-scored from disk with this repo's code, the checkpoint
reproduces the training run's per-question predictions at 1.0000 on all three
verification targets β typed-decisions in both option orders, and MMLU-Pro. verify.json
is that re-scoring, run on an H100.
The same check on a second GPU architecture returns 0.9990 on MMLU-Pro β one question in
a thousand β and that is the more useful fact. verify_blackwell.json is that run, shipped
beside the first rather than discarded, because it is the evidence for the Β±0.001 below.
Neither figure was chosen over the other; both are what the published code returned on the
machine it ran on.
verify_bf16.json is the bf16 tower, roundtrip_200.json the reload check with the
calibration applied, cached_agreement.json the check that the two serving paths β with and
without the prefix cache β return identical probabilities (162 questions, 0 flips,
largest difference 0.0), and MANIFEST.json the sha256 of every file so a download can be
checked.
MMLU-Pro on this checkpoint should be read as Β±0.001. Three of its thousand questions have
a top-2 logit margin below 0.001 β the narrowest 0.00004 β and eighteen are below 0.01,
against a median of 0.534. (Those margins are a property of the predictions, so
load_release.py --ckpt DIR --verify regenerates them and you can recount.) Reordering an fp32 sum across GPU architectures moves a logit by
about that much, so a handful of MMLU-Pro answers are decided by summation order rather than
by the model. v2.0 Β§3 works the effect through in full.
The checkpoint ships calibration.safetensors and calibration.json; load_release.py
applies them automatically. Without them the model loads uncalibrated and its
probabilities are the raw ones, which match no number in this card.
Apache-2.0, following the base model, as v1.0 and v2.0 are.
Three benchmarks were frozen before any of this work started, and are read once per release. Neither v1.0 nor v2.1 trained on them, so this is the only place the two are measured on equal terms. All three models were scored in one job, on one code path.
| held out from the whole search | n | v1.0 | v2.0 | v2.1 | v2.1 β v1.0 | paired p |
|---|---|---|---|---|---|---|
| tasksource | 979 | 0.5771 | 0.5761 | 0.6159 | +0.0388 | 0.011 |
| SemIf external | 252 | 0.8492 | 0.8492 | 0.8849 | +0.0357 | 0.18 |
| scienthoon OOD | 873 | 0.7148 | 0.6907 | 0.7743 | +0.0596 | 2.0eβ05 |
p is an exact two-sided McNemar test on the decisions where the two models disagree. Against v2.0 rather than v1.0 the same test gives +0.0398 (p=0.0033), +0.0357 (p=0.078) and +0.0836 (p=5.4eβ10).
v2.1 is a better decision model than v1.0, not only a better suite score. SemIf is positive but 252 questions give it little power, so read it as consistent with the other two rather than as evidence on its own.
| benchmark | weight | v1.0 recipe | v2.0 recipe | v2.1 recipe | v2.1 checkpoint | v2.1 ECE |
|---|---|---|---|---|---|---|
| typed-decisions | 0.20 | 0.659 | 0.794 | 0.794 | 0.7905 | 0.063 |
| Nimble public | 0.15 | 0.677 | 0.792 | 0.806 | 0.8068 | 0.017 |
| MMLU-Pro 1k | 0.10 | 0.351 | 0.323 | 0.359 | 0.383 | 0.065 |
| Jev-Style panel | 0.10 | 0.734 | 0.736 | 0.752 | 0.7493 | 0.052 |
| Kev transfer | 0.08 | 0.665 | 0.721 | 0.730 | 0.7546 | 0.068 |
| Kev hard | 0.08 | 0.393 | 0.697 | 0.711 | 0.6976 | 0.040 |
| JevBench | 0.06 | 0.663 | 0.716 | 0.722 | 0.7217 | 0.062 |
| Kev documents | 0.05 | 0.714 | 0.865 | 0.868 | 0.8632 | 0.069 |
| Kev devtools | 0.05 | 0.579 | 0.708 | 0.704 | 0.7151 | 0.079 |
| Nimble holdout | 0.05 | 0.565 | 0.751 | 0.744 | 0.7469 | 0.088 |
| procedural | 0.04 | 0.647 | 0.606 | 0.858 | 0.8728 | 0.032 |
| Open-Jev OOD | 0.04 | 0.600 | 0.619 | 0.658 | 0.6513 | 0.085 |
| suite mean | 0.609 | 0.705 | 0.726 | 0.7291 | ||
| suite ECE | 0.0921 | 0.0893 | β | 0.0556 |
The recipe columns are seed means: v1.0's and v2.0's over four seeds as published in v2.0 Β§4.1, v2.1's over seeds 17 and 29, with a fresh seed 97 run afterwards as confirmation (suite 0.7286, MMLU-Pro 0.360). The paired gain over the v2.0 recipe is +0.0219 on seeds 17 and 29 and +0.0257 on seed 97 β same sign, and larger on the seed the recipe had never been run on.
Checkpoint against checkpoint, on the same suite and the same evaluator, v2.1's is 0.7291 against v2.0's 0.7056.
Where that +0.024 comes from, weighted: procedural +0.0100, MMLU-Pro +0.0078, the other ten benchmarks +0.0057 net. So three quarters of it is two benchmarks, and the two are different in kind. Procedural's +0.25 is what training on a benchmark's own train split buys β the same effect as v2.0's headline, and it should be read that way and not as a capability gain. MMLU-Pro's +0.078 is not: its train data is in no corpus here, so that one is transfer, and it is the change Β§4.1 measures.
The confidence head is v2.0's, fitted the same way and in the same mode
(oof_head_scorefloor); see v2.0 Β§2.1. Suite ECE is flat
against v2.0 (0.0556 against 0.0546) β v2.1's improvement is accuracy, not calibration.
On typed-decisions' 2,000 test decisions, binned by the confidence v2.1 reported
(python scripts/calibration.py --model v2.1-2b prints this table):
| the model says | decisions | actually right |
|---|---|---|
| β₯ 0.9 | 519 | 0.981 |
| 0.7 β 0.9 | 542 | 0.852 |
| 0.5 β 0.7 | 719 | 0.688 |
| < 0.5 | 220 | 0.523 |
Acting on the most confident x% of those decisions and deferring the rest: 100% β 0.790,
80% β 0.853, 60% β 0.893, 40% β 0.950, 20% β 0.993 β scripts/routing.py is the same
measurement, and ../BENCHMARKS.md says how to
run both.
On the held-out benchmarks calibration travels unevenly. ECE is the best of the three models on scienthoon (0.0824 β 0.0599 β 0.0542) and recovers most of v2.0's tasksource regression (0.0460 β 0.0888 β 0.0614), but on SemIf it is worse than either (0.0943 β 0.0916 β 0.1193) β there v2.1 is under-confident, reporting a mean 0.770 against 0.885 accuracy, which is the conservative direction but is still error.
confidence meansAll unchanged from v2.0, which is unchanged from v1.0: one tower pass per question, the calibration is a division inside the readout, and nothing generates text. 52 ms to read the document and 11.5 ms per decision on an NVIDIA GB10, bf16; reading the document dominates, so a batch of questions about one document is the shape to ask in. See v2.0 Β§5 and Β§7; the weights are the same size and the calibration files add 140 KB.
The API returns a probability and a confidence, and they are different numbers. The
probability is the model's mass on an option. confidence is the peak statistic Jev
documents, (K * p_max - 1) / (K - 1) β 0 at uniform, 1 at one-hot, absent from noul
answers. Route on the probability of the option you intend to act on, as
Β§4.3 does; reach for confidence when what you want to know is whether
the model is spread across options.
../BENCHMARKS.md.The chain from v2.0 to here, out of the arms run after it:
| arm | headline | what it established |
|---|---|---|
mmlu-keep-1a-retention-kl | MMLU-Pro 0.3085 | keeping the tower's next-token distribution near the base model's does not keep the decision readout's general knowledge |
suite-train-2-cap3k-rep15stem10 | MMLU-Pro 0.3307 | science-weighted replay, half of it recast to ten options: +0.008, and nothing on the suite. The best MMLU-Pro of any data arm |
mmlu-keep-1b-st-tower-half | MMLU-Pro 0.3273 | halving the learning rate of the whole tower does nothing |
mmlu-keep-1c-freeze-lower-third | MMLU-Pro 0.3390 | freezing the lower third recovers +0.016 but regresses three benchmarks. A trade, not a keeper |
cand-2b-1b-freeze4-stem-proc | MMLU-Pro 0.327, suite 0.7185 | freezing only 4 layers, with the new corpus, is weaker still |
cand-2b-1a-lowerlr01-stem-proc | MMLU-Pro 0.359, suite 0.7258 | the bottom 8 at lr Γ0.1 beats freezing them, and costs nothing. v2.1's recipe |
cand-2b-1a-...-confirm | suite 0.7286, MMLU-Pro 0.360 | confirmed on a fresh seed, and larger there than on the two it was selected on |
rc-B-cand1a-cal4b | suite 0.7291, ECE 0.0556 | the recipe plus v2.0's confidence head, seed 17. This checkpoint |
Rejected along the way, and worth knowing because each closes a direction: a 4B tower on
v2.0's recipe (failed to train at all), the lr Γ0.1 treatment at 0.8B (0.6834, discarded β
the 0.8B line's own keeper is a different recipe at 0.6791, well below 2B),
recasting all of the replay to ten options rather than half, raising the replay dose to
30%, eleven extra coverage sources, two round-2 data-selection policies head to head (no
difference), and eleven more reinforcement-learning arms β four of them against a matched
supervised control for the first time, and every one of those landed at or below its control.
Counting every arm whose training signal was a reward rather than the teacher's target
distribution, this project has now run eighteen and kept none. The full record is
../EXPLORE.md.
A rule was changed mid-search, and this release should be read with it in mind. The
number of seeds required to confirm a candidate was changed from a fixed four to scaling
with the effect size: one seed by default, a gap of about +0.015 or more confirmed by one
fresh seed, smaller gaps by up to three plus a confirmation seed. v2.1's recipe was
confirmed under the new rule β two seeds plus fresh seed 97 β not the old one. The
reasoning and the original rule are in ../BENCHMARKS.md.
A typed-decision model: Qwen/Qwen3.5-2B-Base with its tower fine-tuned and a
trained option-scoring head. It answers choice / noul / score questions about a
document in one forward pass, and speaks the
Jev HTTP API.
This checkpoint is seed 17, fixed in advance as primary rather than chosen for scoring best:
| typed-decisions | reversed order | MMLU-Pro 1k | reproduces its training run |
|---|---|---|---|
| 0.7905 | 0.7935 | 0.383 | 1.0000 |
Re-computed from these exact files after upload-time reload. Kernel stack fla-0.5.2/torch-2.7.1+cu128; full recipe in meta.json.
import sys; sys.path.insert(0, 'code') # after snapshot_download of this repo
from load_release import load_release
model, tok, enc, meta = load_release('.', device='cuda')
print(meta['calibration']) # the fitted calibration this checkpoint ships, or 'none'
load_release applies calibration.safetensors when the checkpoint carries one, so the probabilities are the calibrated ones this card reports. A loader that skips those files returns the raw distribution instead: the same chosen option, different numbers.
Everything below is the version record from the project repository, unchanged.
Describes release v2.1 Β· updated 2026-09-27
One typed-decision model, 2B. Given a document and a set of typed questions β yes/no, pick-one-of-k, rate-on-a-rubric β it returns a calibrated probability for every option in one forward pass, with no generated text. The task, the architecture and the confidence head are v2.0's, unchanged.
v2.0 had to be published with a caveat: its suite gain came very largely from training on the suite's own train splits, and on three benchmarks frozen before the search began it did not beat v1.0. v2.1 is the version where that caveat goes away. It is ahead of v1.0 on all three of those held-out benchmarks, significantly so on two, and it recovers the general knowledge v2.0 lost.
Unchanged from v1.0 and v2.0: a document (the
state) plus one or more typed questions β noul, choice, score β and a probability
per option, returned in one forward pass. Pooled top-1 is the fraction of decisions
whose highest-probability option matches the teacher's modal label; ECE is expected
calibration error, the average gap between the confidence a model reports and how often it
is right at that confidence, weighted by bin size, lower being better.
The architecture is v1.0's and the confidence head is v2.0's, both unchanged; see v2.0 Β§2. Three things changed, all in the data and the optimiser, and none of them in how inference works.
The third is the one worth reading twice. v2.0's single real regression was general knowledge: MMLU-Pro fell from v1.0's 0.355 to 0.305 while every decision benchmark rose. Five things were tried against it:
| the repair | MMLU-Pro | what it cost |
|---|---|---|
| a retention KL against the base model's next-token distribution | 0.3085 | nothing, and it did not work |
| more replay, weighted to science, half recast to ten options | 0.3307 | nothing |
| the whole tower at half the learning rate | 0.3273 | nothing, and inside the noise |
| freeze the tower's lower third | 0.3390 | three benchmarks regressed |
| the bottom 8 layers at one tenth the learning rate | 0.3590 | nothing |
The first is the interesting failure. Holding the tower's language modelling close to the base model works as an objective β the retention KL stayed near 0.02 nats per token β and MMLU-Pro eroded anyway. What the decision readout uses is not what next-token prediction preserves, so protecting the latter does not protect the former.
The rest say that this was never a data problem. More and better-shaped replay moves MMLU-Pro by +0.008. A uniformly smaller learning rate moves it by nothing. Freezing the lower layers moves it by +0.016 and breaks three decision benchmarks, because those layers do need to adapt. Letting them adapt slowly gets more of the knowledge back than freezing them does and costs nothing at all: +0.054 on the recipe, and past v1.0. Fitting a decision objective through the whole tower at one rate was overwriting the representation the knowledge sat in.
| model | base | typed-decisions | MMLU-Pro 1k | suite ECE | download |
|---|---|---|---|---|---|
| RSI-Jev-v2.1-2B | Qwen3.5-2B-Base | 0.7905 | 0.383 | 0.0556 | π€ download |
| RSI-Jev-v2.0-2B | Qwen3.5-2B-Base | 0.7925 | 0.305 | 0.0546 | π€ download |
| RSI-Jev-v1.0-2B | Qwen3.5-2B-Base | 0.6525 | 0.3550 | 0.0921 | π€ download |
As with v2.0, the typed-decisions figure is not comparable to v1.0's, because both v2.0 and v2.1 trained on that benchmark's train split. Against v2.0, which trained on the same split, v2.1 is flat there (β0.002) and its gains are elsewhere.
2B only, one seed's checkpoint. There is no v2.1 at 0.8B.
Reproducing its training run. Re-scored from disk with this repo's code, the checkpoint
reproduces the training run's per-question predictions at 1.0000 on all three
verification targets β typed-decisions in both option orders, and MMLU-Pro. verify.json
is that re-scoring, run on an H100.
The same check on a second GPU architecture returns 0.9990 on MMLU-Pro β one question in
a thousand β and that is the more useful fact. verify_blackwell.json is that run, shipped
beside the first rather than discarded, because it is the evidence for the Β±0.001 below.
Neither figure was chosen over the other; both are what the published code returned on the
machine it ran on.
verify_bf16.json is the bf16 tower, roundtrip_200.json the reload check with the
calibration applied, cached_agreement.json the check that the two serving paths β with and
without the prefix cache β return identical probabilities (162 questions, 0 flips,
largest difference 0.0), and MANIFEST.json the sha256 of every file so a download can be
checked.
MMLU-Pro on this checkpoint should be read as Β±0.001. Three of its thousand questions have
a top-2 logit margin below 0.001 β the narrowest 0.00004 β and eighteen are below 0.01,
against a median of 0.534. (Those margins are a property of the predictions, so
load_release.py --ckpt DIR --verify regenerates them and you can recount.) Reordering an fp32 sum across GPU architectures moves a logit by
about that much, so a handful of MMLU-Pro answers are decided by summation order rather than
by the model. v2.0 Β§3 works the effect through in full.
The checkpoint ships calibration.safetensors and calibration.json; load_release.py
applies them automatically. Without them the model loads uncalibrated and its
probabilities are the raw ones, which match no number in this card.
Apache-2.0, following the base model, as v1.0 and v2.0 are.
Three benchmarks were frozen before any of this work started, and are read once per release. Neither v1.0 nor v2.1 trained on them, so this is the only place the two are measured on equal terms. All three models were scored in one job, on one code path.
| held out from the whole search | n | v1.0 | v2.0 | v2.1 | v2.1 β v1.0 | paired p |
|---|---|---|---|---|---|---|
| tasksource | 979 | 0.5771 | 0.5761 | 0.6159 | +0.0388 | 0.011 |
| SemIf external | 252 | 0.8492 | 0.8492 | 0.8849 | +0.0357 | 0.18 |
| scienthoon OOD | 873 | 0.7148 | 0.6907 | 0.7743 | +0.0596 | 2.0eβ05 |
p is an exact two-sided McNemar test on the decisions where the two models disagree. Against v2.0 rather than v1.0 the same test gives +0.0398 (p=0.0033), +0.0357 (p=0.078) and +0.0836 (p=5.4eβ10).
v2.1 is a better decision model than v1.0, not only a better suite score. SemIf is positive but 252 questions give it little power, so read it as consistent with the other two rather than as evidence on its own.
| benchmark | weight | v1.0 recipe | v2.0 recipe | v2.1 recipe | v2.1 checkpoint | v2.1 ECE |
|---|---|---|---|---|---|---|
| typed-decisions | 0.20 | 0.659 | 0.794 | 0.794 | 0.7905 | 0.063 |
| Nimble public | 0.15 | 0.677 | 0.792 | 0.806 | 0.8068 | 0.017 |
| MMLU-Pro 1k | 0.10 | 0.351 | 0.323 | 0.359 | 0.383 | 0.065 |
| Jev-Style panel | 0.10 | 0.734 | 0.736 | 0.752 | 0.7493 | 0.052 |
| Kev transfer | 0.08 | 0.665 | 0.721 | 0.730 | 0.7546 | 0.068 |
| Kev hard | 0.08 | 0.393 | 0.697 | 0.711 | 0.6976 | 0.040 |
| JevBench | 0.06 | 0.663 | 0.716 | 0.722 | 0.7217 | 0.062 |
| Kev documents | 0.05 | 0.714 | 0.865 | 0.868 | 0.8632 | 0.069 |
| Kev devtools | 0.05 | 0.579 | 0.708 | 0.704 | 0.7151 | 0.079 |
| Nimble holdout | 0.05 | 0.565 | 0.751 | 0.744 | 0.7469 | 0.088 |
| procedural | 0.04 | 0.647 | 0.606 | 0.858 | 0.8728 | 0.032 |
| Open-Jev OOD | 0.04 | 0.600 | 0.619 | 0.658 | 0.6513 | 0.085 |
| suite mean | 0.609 | 0.705 | 0.726 | 0.7291 | ||
| suite ECE | 0.0921 | 0.0893 | β | 0.0556 |
The recipe columns are seed means: v1.0's and v2.0's over four seeds as published in v2.0 Β§4.1, v2.1's over seeds 17 and 29, with a fresh seed 97 run afterwards as confirmation (suite 0.7286, MMLU-Pro 0.360). The paired gain over the v2.0 recipe is +0.0219 on seeds 17 and 29 and +0.0257 on seed 97 β same sign, and larger on the seed the recipe had never been run on.
Checkpoint against checkpoint, on the same suite and the same evaluator, v2.1's is 0.7291 against v2.0's 0.7056.
Where that +0.024 comes from, weighted: procedural +0.0100, MMLU-Pro +0.0078, the other ten benchmarks +0.0057 net. So three quarters of it is two benchmarks, and the two are different in kind. Procedural's +0.25 is what training on a benchmark's own train split buys β the same effect as v2.0's headline, and it should be read that way and not as a capability gain. MMLU-Pro's +0.078 is not: its train data is in no corpus here, so that one is transfer, and it is the change Β§4.1 measures.
The confidence head is v2.0's, fitted the same way and in the same mode
(oof_head_scorefloor); see v2.0 Β§2.1. Suite ECE is flat
against v2.0 (0.0556 against 0.0546) β v2.1's improvement is accuracy, not calibration.
On typed-decisions' 2,000 test decisions, binned by the confidence v2.1 reported
(python scripts/calibration.py --model v2.1-2b prints this table):
| the model says | decisions | actually right |
|---|---|---|
| β₯ 0.9 | 519 | 0.981 |
| 0.7 β 0.9 | 542 | 0.852 |
| 0.5 β 0.7 | 719 | 0.688 |
| < 0.5 | 220 | 0.523 |
Acting on the most confident x% of those decisions and deferring the rest: 100% β 0.790,
80% β 0.853, 60% β 0.893, 40% β 0.950, 20% β 0.993 β scripts/routing.py is the same
measurement, and ../BENCHMARKS.md says how to
run both.
On the held-out benchmarks calibration travels unevenly. ECE is the best of the three models on scienthoon (0.0824 β 0.0599 β 0.0542) and recovers most of v2.0's tasksource regression (0.0460 β 0.0888 β 0.0614), but on SemIf it is worse than either (0.0943 β 0.0916 β 0.1193) β there v2.1 is under-confident, reporting a mean 0.770 against 0.885 accuracy, which is the conservative direction but is still error.
confidence meansAll unchanged from v2.0, which is unchanged from v1.0: one tower pass per question, the calibration is a division inside the readout, and nothing generates text. 52 ms to read the document and 11.5 ms per decision on an NVIDIA GB10, bf16; reading the document dominates, so a batch of questions about one document is the shape to ask in. See v2.0 Β§5 and Β§7; the weights are the same size and the calibration files add 140 KB.
The API returns a probability and a confidence, and they are different numbers. The
probability is the model's mass on an option. confidence is the peak statistic Jev
documents, (K * p_max - 1) / (K - 1) β 0 at uniform, 1 at one-hot, absent from noul
answers. Route on the probability of the option you intend to act on, as
Β§4.3 does; reach for confidence when what you want to know is whether
the model is spread across options.
../BENCHMARKS.md.The chain from v2.0 to here, out of the arms run after it:
| arm | headline | what it established |
|---|---|---|
mmlu-keep-1a-retention-kl | MMLU-Pro 0.3085 | keeping the tower's next-token distribution near the base model's does not keep the decision readout's general knowledge |
suite-train-2-cap3k-rep15stem10 | MMLU-Pro 0.3307 | science-weighted replay, half of it recast to ten options: +0.008, and nothing on the suite. The best MMLU-Pro of any data arm |
mmlu-keep-1b-st-tower-half | MMLU-Pro 0.3273 | halving the learning rate of the whole tower does nothing |
mmlu-keep-1c-freeze-lower-third | MMLU-Pro 0.3390 | freezing the lower third recovers +0.016 but regresses three benchmarks. A trade, not a keeper |
cand-2b-1b-freeze4-stem-proc | MMLU-Pro 0.327, suite 0.7185 | freezing only 4 layers, with the new corpus, is weaker still |
cand-2b-1a-lowerlr01-stem-proc | MMLU-Pro 0.359, suite 0.7258 | the bottom 8 at lr Γ0.1 beats freezing them, and costs nothing. v2.1's recipe |
cand-2b-1a-...-confirm | suite 0.7286, MMLU-Pro 0.360 | confirmed on a fresh seed, and larger there than on the two it was selected on |
rc-B-cand1a-cal4b | suite 0.7291, ECE 0.0556 | the recipe plus v2.0's confidence head, seed 17. This checkpoint |
Rejected along the way, and worth knowing because each closes a direction: a 4B tower on
v2.0's recipe (failed to train at all), the lr Γ0.1 treatment at 0.8B (0.6834, discarded β
the 0.8B line's own keeper is a different recipe at 0.6791, well below 2B),
recasting all of the replay to ten options rather than half, raising the replay dose to
30%, eleven extra coverage sources, two round-2 data-selection policies head to head (no
difference), and eleven more reinforcement-learning arms β four of them against a matched
supervised control for the first time, and every one of those landed at or below its control.
Counting every arm whose training signal was a reward rather than the teacher's target
distribution, this project has now run eighteen and kept none. The full record is
../EXPLORE.md.
A rule was changed mid-search, and this release should be read with it in mind. The
number of seeds required to confirm a candidate was changed from a fixed four to scaling
with the effect size: one seed by default, a gap of about +0.015 or more confirmed by one
fresh seed, smaller gaps by up to three plus a confirmation seed. v2.1's recipe was
confirmed under the new rule β two seeds plus fresh seed 97 β not the old one. The
reasoning and the original rule are in ../BENCHMARKS.md.