shgao/rsi-jev-v2.1-qwen3.5-2b

Model

rsi-jev-v2.1-qwen3.5-2b

0

2 commits

1 linked in READMEs

updated Sep 27, 2026

See the code

README

rsi-jev-v2.1-qwen3.5-2b

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-decisionsreversed orderMMLU-Pro 1kreproduces its training run
0.79050.79350.3831.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.


RSI-Jev v2.1

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.


1. The task

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.

2. How the model is built and trained

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.

  1. The procedural benchmark's train split joined the corpus (3k cases). v2.0's corpus did not have it, and procedural was one of the two benchmarks v2.0 got worse at.
  2. The general-knowledge replay was weighted toward science, and half of it recast to ten options so its shape matches MMLU-Pro's.
  3. The bottom 8 of the tower's 24 layers train at one tenth the learning rate.

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 repairMMLU-Prowhat it cost
a retention KL against the base model's next-token distribution0.3085nothing, and it did not work
more replay, weighted to science, half recast to ten options0.3307nothing
the whole tower at half the learning rate0.3273nothing, and inside the noise
freeze the tower's lower third0.3390three benchmarks regressed
the bottom 8 layers at one tenth the learning rate0.3590nothing

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.

3. Checkpoints

modelbasetyped-decisionsMMLU-Pro 1ksuite ECEdownload
RSI-Jev-v2.1-2BQwen3.5-2B-Base0.79050.3830.0556πŸ€— download
RSI-Jev-v2.0-2BQwen3.5-2B-Base0.79250.3050.0546πŸ€— download
RSI-Jev-v1.0-2BQwen3.5-2B-Base0.65250.35500.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.

4. Results

4.1 The held-out comparison β€” read this first

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 searchnv1.0v2.0v2.1v2.1 βˆ’ v1.0paired p
tasksource9790.57710.57610.6159+0.03880.011
SemIf external2520.84920.84920.8849+0.03570.18
scienthoon OOD8730.71480.69070.7743+0.05962.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.

4.2 The twelve-benchmark suite

benchmarkweightv1.0 recipev2.0 recipev2.1 recipev2.1 checkpointv2.1 ECE
typed-decisions0.200.6590.7940.7940.79050.063
Nimble public0.150.6770.7920.8060.80680.017
MMLU-Pro 1k0.100.3510.3230.3590.3830.065
Jev-Style panel0.100.7340.7360.7520.74930.052
Kev transfer0.080.6650.7210.7300.75460.068
Kev hard0.080.3930.6970.7110.69760.040
JevBench0.060.6630.7160.7220.72170.062
Kev documents0.050.7140.8650.8680.86320.069
Kev devtools0.050.5790.7080.7040.71510.079
Nimble holdout0.050.5650.7510.7440.74690.088
procedural0.040.6470.6060.8580.87280.032
Open-Jev OOD0.040.6000.6190.6580.65130.085
suite mean0.6090.7050.7260.7291
suite ECE0.09210.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.

4.3 Calibration

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 saysdecisionsactually right
β‰₯ 0.95190.981
0.7 – 0.95420.852
0.5 – 0.77190.688
< 0.52200.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.

5. Speed, the wire format, and what confidence means

All 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.

6. Limitations

  • Its benchmark scores are not zero-shot. Eleven of the twelve suite benchmarks now contribute train-split data β€” procedural joined the list this release. Do not compare those numbers with any model's zero-shot numbers, including v1.0's. The held-out three in Β§4.1 are the comparison that is fair.
  • procedural's +0.25 is in-domain. It is the largest single number in this release and the least interesting one.
  • General knowledge is recovered, not proven intact. 0.383 beats v1.0's 0.355 and v2.0's 0.305 on MMLU-Pro, and that is one benchmark of general knowledge measured as a typed decision. Fine-tuning a tower for a single-position decision objective destroys its language modelling outright β€” the tuned tower emits whitespace β€” so "does not forget" is a claim about this benchmark and nothing wider.
  • SemIf calibration got worse, in the under-confident direction. Β§4.3.
  • The corpus gate failed and was overridden. Adding procedural shifts the corpus's label mix away from the reference profile: first-option rate 0.278 against 0.507, and the score-level histogram moves (total variation 0.150), because procedural's rubrics have more levels than the rest of the corpus. The mix is the experiment here, so the gate was overridden deliberately and the failure recorded rather than tuned away.
  • The held-out set is spent. Those three benchmarks have now been read for two releases. A held-out set is consumable, so v2.2 needs a freshly frozen one; see ../BENCHMARKS.md.
  • Reproducing the suite needs upstream checkouts, and two of its corpus inputs are not downloadable yet. Unchanged from v2.0 Β§9.
  • One model, one size, one seed.

7. How it got here

The chain from v2.0 to here, out of the arms run after it:

armheadlinewhat it established
mmlu-keep-1a-retention-klMMLU-Pro 0.3085keeping the tower's next-token distribution near the base model's does not keep the decision readout's general knowledge
suite-train-2-cap3k-rep15stem10MMLU-Pro 0.3307science-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-halfMMLU-Pro 0.3273halving the learning rate of the whole tower does nothing
mmlu-keep-1c-freeze-lower-thirdMMLU-Pro 0.3390freezing the lower third recovers +0.016 but regresses three benchmarks. A trade, not a keeper
cand-2b-1b-freeze4-stem-procMMLU-Pro 0.327, suite 0.7185freezing only 4 layers, with the new corpus, is weaker still
cand-2b-1a-lowerlr01-stem-procMMLU-Pro 0.359, suite 0.7258the bottom 8 at lr Γ—0.1 beats freezing them, and costs nothing. v2.1's recipe
cand-2b-1a-...-confirmsuite 0.7286, MMLU-Pro 0.360confirmed on a fresh seed, and larger there than on the two it was selected on
rc-B-cand1a-cal4bsuite 0.7291, ECE 0.0556the 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.

decision-model
rsi-jev
text-classification
typed-decisions

shgao/rsi-jev-v2.1-qwen3.5-2b

Model

rsi-jev-v2.1-qwen3.5-2b

0

2 commits

1 linked in READMEs

updated Sep 27, 2026

See the code

README

rsi-jev-v2.1-qwen3.5-2b

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-decisionsreversed orderMMLU-Pro 1kreproduces its training run
0.79050.79350.3831.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.


RSI-Jev v2.1

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.


1. The task

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.

2. How the model is built and trained

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.

  1. The procedural benchmark's train split joined the corpus (3k cases). v2.0's corpus did not have it, and procedural was one of the two benchmarks v2.0 got worse at.
  2. The general-knowledge replay was weighted toward science, and half of it recast to ten options so its shape matches MMLU-Pro's.
  3. The bottom 8 of the tower's 24 layers train at one tenth the learning rate.

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 repairMMLU-Prowhat it cost
a retention KL against the base model's next-token distribution0.3085nothing, and it did not work
more replay, weighted to science, half recast to ten options0.3307nothing
the whole tower at half the learning rate0.3273nothing, and inside the noise
freeze the tower's lower third0.3390three benchmarks regressed
the bottom 8 layers at one tenth the learning rate0.3590nothing

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.

3. Checkpoints

modelbasetyped-decisionsMMLU-Pro 1ksuite ECEdownload
RSI-Jev-v2.1-2BQwen3.5-2B-Base0.79050.3830.0556πŸ€— download
RSI-Jev-v2.0-2BQwen3.5-2B-Base0.79250.3050.0546πŸ€— download
RSI-Jev-v1.0-2BQwen3.5-2B-Base0.65250.35500.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.

4. Results

4.1 The held-out comparison β€” read this first

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 searchnv1.0v2.0v2.1v2.1 βˆ’ v1.0paired p
tasksource9790.57710.57610.6159+0.03880.011
SemIf external2520.84920.84920.8849+0.03570.18
scienthoon OOD8730.71480.69070.7743+0.05962.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.

4.2 The twelve-benchmark suite

benchmarkweightv1.0 recipev2.0 recipev2.1 recipev2.1 checkpointv2.1 ECE
typed-decisions0.200.6590.7940.7940.79050.063
Nimble public0.150.6770.7920.8060.80680.017
MMLU-Pro 1k0.100.3510.3230.3590.3830.065
Jev-Style panel0.100.7340.7360.7520.74930.052
Kev transfer0.080.6650.7210.7300.75460.068
Kev hard0.080.3930.6970.7110.69760.040
JevBench0.060.6630.7160.7220.72170.062
Kev documents0.050.7140.8650.8680.86320.069
Kev devtools0.050.5790.7080.7040.71510.079
Nimble holdout0.050.5650.7510.7440.74690.088
procedural0.040.6470.6060.8580.87280.032
Open-Jev OOD0.040.6000.6190.6580.65130.085
suite mean0.6090.7050.7260.7291
suite ECE0.09210.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.

4.3 Calibration

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 saysdecisionsactually right
β‰₯ 0.95190.981
0.7 – 0.95420.852
0.5 – 0.77190.688
< 0.52200.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.

5. Speed, the wire format, and what confidence means

All 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.

6. Limitations

  • Its benchmark scores are not zero-shot. Eleven of the twelve suite benchmarks now contribute train-split data β€” procedural joined the list this release. Do not compare those numbers with any model's zero-shot numbers, including v1.0's. The held-out three in Β§4.1 are the comparison that is fair.
  • procedural's +0.25 is in-domain. It is the largest single number in this release and the least interesting one.
  • General knowledge is recovered, not proven intact. 0.383 beats v1.0's 0.355 and v2.0's 0.305 on MMLU-Pro, and that is one benchmark of general knowledge measured as a typed decision. Fine-tuning a tower for a single-position decision objective destroys its language modelling outright β€” the tuned tower emits whitespace β€” so "does not forget" is a claim about this benchmark and nothing wider.
  • SemIf calibration got worse, in the under-confident direction. Β§4.3.
  • The corpus gate failed and was overridden. Adding procedural shifts the corpus's label mix away from the reference profile: first-option rate 0.278 against 0.507, and the score-level histogram moves (total variation 0.150), because procedural's rubrics have more levels than the rest of the corpus. The mix is the experiment here, so the gate was overridden deliberately and the failure recorded rather than tuned away.
  • The held-out set is spent. Those three benchmarks have now been read for two releases. A held-out set is consumable, so v2.2 needs a freshly frozen one; see ../BENCHMARKS.md.
  • Reproducing the suite needs upstream checkouts, and two of its corpus inputs are not downloadable yet. Unchanged from v2.0 Β§9.
  • One model, one size, one seed.

7. How it got here

The chain from v2.0 to here, out of the arms run after it:

armheadlinewhat it established
mmlu-keep-1a-retention-klMMLU-Pro 0.3085keeping the tower's next-token distribution near the base model's does not keep the decision readout's general knowledge
suite-train-2-cap3k-rep15stem10MMLU-Pro 0.3307science-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-halfMMLU-Pro 0.3273halving the learning rate of the whole tower does nothing
mmlu-keep-1c-freeze-lower-thirdMMLU-Pro 0.3390freezing the lower third recovers +0.016 but regresses three benchmarks. A trade, not a keeper
cand-2b-1b-freeze4-stem-procMMLU-Pro 0.327, suite 0.7185freezing only 4 layers, with the new corpus, is weaker still
cand-2b-1a-lowerlr01-stem-procMMLU-Pro 0.359, suite 0.7258the bottom 8 at lr Γ—0.1 beats freezing them, and costs nothing. v2.1's recipe
cand-2b-1a-...-confirmsuite 0.7286, MMLU-Pro 0.360confirmed on a fresh seed, and larger there than on the two it was selected on
rc-B-cand1a-cal4bsuite 0.7291, ECE 0.0556the 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.

decision-model
rsi-jev
text-classification
typed-decisions