OpenGrad · Qwen3.5-2B · post-training study 001

We improved the metric.
Then the model stopped answering.

On the confirmatory partition, tool-calling F1 rose from 0.6264 to 0.7470 with SFT; DPO added +0.0078, within noise, and that checkpoint was promoted under a gate revised after SFT was evaluated. A later diagnosis on real IFEval, GSM8K and MMLU-Pro found a regression the gate was structurally unable to see — because its held-out set contained no examples that simply asked the model to answer.

100%of bare arithmetic questions refusedBase: 0% · n=1,319
55.5%of the same questions solved with 8 examplesrefusal falls to 0%
−22.7ppIFEval strict, Base → SFT67.8% → 45.1%
$11.39total cost to find it$8.90 over 13 H200 runs + $2.49 prior run

The promoted checkpoint is a research artifact, not a general-purpose improvement. The capability numbers recompute from 48,840 committed per-example records without a GPU; the tool-policy and corpus figures come from the committed evaluation metrics and the published corpus.

01 / THE TARGET

The intervention worked.

This is not a story about a training run that failed. Canonical-v2 SFT did what it was designed to do: teach the model when to call a tool rather than how often. Almost all of the gain arrived with SFT; the DPO calibration step on top of it moved the metric by less than this partition can resolve.

Tool-calling F1 · confirmatory partition n=1,277

The target metric rose. This part is real.

B0 · base
0.6264
M0 · SFT
0.7470
M1-v2 · DPO
0.7548

Over-call fell from 62.4% to 15.0% with SFT; DPO left it at 15.3%, slightly higher. Almost all of the F1 gain arrived with SFT — DPO added +0.0078, 7 of 453 calls, from a single seed. The policy genuinely got more selective — that is not what this page disputes.

What the promotion means. M1-v2 is promoted under a parent-relative gate (v4) introduced after M0 was evaluated; M0 also clears v4, and M1-v2 fails the v3 gate that rejected M0. The promotion reflects the gate change; the measured difference from M0 (+0.0078 call_f1, 7 of 453 calls, single seed) is within noise.

02 / THE SIGNAL

A seven-case smoke test said something was wrong.

Running an external sentinel suite, the promoted checkpoint scored 5/7 — the same as the untrained base model. The scores matched. The behaviour did not.

OpenWeights ParitySuite · 7 cases · sentinel only

Identical score. Opposite failure.

Base5/7
0 refused2 wrong
M0 · SFT5/7
2 refused0 wrong
M1-v2 · DPO5/7
2 refused0 wrong
M1-v1 · DPO on base3/7
1 refused3 wrong

Base and the promoted checkpoint both score 5/7, but not on the same items. Base gets trap arithmetic and multi-step change wrong; M1-v2 refuses multi-step change and the format constraint, and passes trap arithmetic. A scalar score cannot tell those apart — which is why seven cases never carry a conclusion here.

SUGGESTIVE, not evidence. Seven cases cannot support a capability claim — one case is 14 percentage points. It was enough to justify a real measurement, and nothing more.

03 / THE MEASUREMENT

Real benchmarks, pinned revisions, deterministic scorers.

No synthetic stand-ins, no approximated subsets presented as official scores, and no LLM judge anywhere. Fourteen benchmark adapters in the repository turned out to synthesise placeholder tasks; those were recorded as blocked rather than scored.

IFEvalgoogle/IFEval
rev 966cd89545d6541 prompts

upstream checkers, vendored unmodified, seeded

GSM8Kopenai/gsm8k
rev 740312add88f1,319 × 2 arms

deterministic numeric extraction

MMLU-ProTIGER-Lab/MMLU-Pro
rev b189ec765aa712,032 items

upstream answer regexes

All four checkpoints ran on one engine configuration — vLLM 0.29.0, bfloat16, greedy decoding, seed 0, prefix caching off — so no stage difference is attributable to the runtime.

04 / THE FINDING

It refuses every bare arithmetic question.

All 1,319 of them. Not a sample — the entire GSM8K test split, with the same handful of phrasings repeated across it.

“Apologies, but I’m unable to perform calculations or solve problems. I recommend using a calculator…”

M1-v2 · 1,319 of 1,319 zero-shot GSM8K responses · mean length 132 characters
Benchmark results across the checkpoint ladder
StageGSM8K 0-shotGSM8K refusalGSM8K 8-shotIFEval strictMMLU-ProSentinel
Base67.4%0%70.4%67.8%49.0%5/7
M0 · SFT0.0%100%56.3%45.1%37.0%5/7
M1-v2 · DPO0.0%100%55.5%45.8%37.0%5/7
M1-v1 · DPO on base17.3%71%70.4%43.4%unmeasured3/7
05 / THE DISCRIMINATION

Is it unable, or unwilling?

These need different fixes, so they cannot be collapsed. The test was registered before any output was generated: run the identical questions again, with eight worked examples in front of them.

GSM8K · the identical 1,319 questions in both arms

Only the exemplars change.

Bare question
Base
0% refused67.4% correct
M0 · SFT
100% refused0.0% correct
M1-v2 · DPO
100% refused0.0% correct
M1-v1 · DPO on base
71% refused17.3% correct
Same question + 8 worked examples
Base
70.4% correct0% refused
M0 · SFT
56.3% correct0% refused
M1-v2 · DPO
55.5% correct0% refused
M1-v1 · DPO on base
70.4% correct2% refused

Content is held constant. A model that refuses 100% of bare questions solves 55.5% of the same questions when shown how the answer should look.

Refusal rate by prompt regime

Not a subject. A request shape.

StageGSM8K0-shotGSM8K8-shotMMLU-Pro5-shotIFEval0-shot
Base0%0%0%0%
M0 · SFT100%0%0%19%
M1-v2 · DPO100%0%0%20%
M1-v1 · DPO on base71%2%n/a29%

Zero refusals on 12,032 MMLU-Pro items — including 1,351 maths questions — from the same checkpoint that declines every bare arithmetic word problem. n/a is unmeasured, not zero: M1-v1’s MMLU-Pro run was terminated on budget.

06 / THE SECOND FAILURE

Refusal is not the whole story.

It would be convenient if the ability were intact and merely unused. It is not. In regimes where the model refuses essentially nothing, it is still materially worse than the base model.

Base vs M0 · regimes with little or no refusal

Refusal cannot explain these.

GSM8K 8-shotrefusal ~0%
70.4%
56.3%
-14.1pp
MMLU-Prorefusal 0%
49.0%
37.0%
-12.0pp
MMLU-Pro acc | answerrefusal 0%
59.7%
38.4%
-21.3pp
IFEval acc | answerrefusal 19%
67.9%
52.3%
-15.6pp
Base M0 · SFT

IFEval ran with a 2,560-token cap, and 47 (Base), 67 (M0), 63 (M1-v2) and 17 (M1-v1) of its 541 responses hit it. Every IFEval figure on this page carries that caveat; no interval has been computed for it.

Base advantage under adversarial resolution of truncation

The gap survives the worst admissible case.

MMLU-Pro accuracy
+6.4 / +12 / +33.1pp
GSM8K 8-shot accuracy
+13.9 / +14.1 / +16.3pp

Worst case gives Base its floor and M0 its ceiling. These are deterministic ranges, not confidence intervals — no distribution is assumed.

07 / LOCALISATION

It appears after SFT — and after DPO with no SFT at all.

The natural assumption is that preference optimisation over-aligned the model into refusing. On the promoted lineage the signal appears at SFT and DPO on top of it leaves it flat. But DPO applied directly to the base model, with no SFT, also produces most of the refusal.

Base → M0 · SFT
refusal +100.0ppanswer rate −100.0ppIFEval −22.7pp8-shot maths −14.1ppMMLU-Pro −12.0pp
M0 → M1-v2 · DPO
refusal 0.0ppIFEval +0.7pp8-shot maths −0.8ppMMLU-Pro ~0.0ppbyte-identical GSM8K outputs 82%
Base → M1-v1 · DPO on base, no SFT
refusal +70.7ppanswer rate −71.1ppIFEval −24.4pp8-shot maths 0.0ppMMLU-Pro unmeasured

A general-capability regression associated with tool-policy post-training on When2Call-derived data. It appears after SFT (M0) and also after DPO applied directly to the base (M1-v1), so it is not specific to SFT. Causation is not established: one lineage, one seed, no replicate. “DPO is flat” describes the M0 → M1-v2 edge on this suite only; it is not a claim about weights, optimiser effectiveness, or what targeted preference training could achieve.

08 / SELF-CORRECTION

Our first MMLU-Pro result was wrong — in our own favour.

It showed almost no regression. That was a measurement artifact, caught by checking why one checkpoint's answer rate was low rather than accepting the number.

MMLU-Pro · generation budget 768 → 2048 tokens

At 768 tokens the regression was invisible.

768 tokens · SUPERSEDED
Base38.0%37.6% truncated
M0 · SFT36.8%7.2% truncated
M1-v2 · DPO36.9%7.5% truncated

Looks flat. Would have been reported as “no degradation.”

2048 tokens · CANONICAL
Base49.0%21.8% truncated
M0 · SFT37.0%6.3% truncated
M1-v2 · DPO37.0%6.2% truncated

A 12.0pp gap. The correction strengthened the finding.

The budget bit Base five times harder than M0, so the benchmark was measuring verbosity, not accuracy. 99.6% of Base’s unattempted items at 768 (4,292 of 4,309) were truncations — not refusals.

The superseded run is retained, not deleted, and its $3.89 cost is counted in full. A protocol that would have falsely implied “no degradation” is itself a finding worth keeping.

09 / THE BLIND SPOT

The gate could not have caught this.

The frozen confirmatory partition behind the promotion decision (n=1,277) held tool-call, clarification and cannot-answer examples. It held no examples that simply asked the model to answer something.

TOOL_CALLcovered453 examples
CLARIFYcovered371 examples
CANNOT_ANSWERcovered453 examples
ANSWERNOT COVEREDzero examples

The DEV split used for checkpoint selection and the full 3,650-example held-out set (1,295 / 1,060 / 1,295) have the same gap. A promotion gate is only as broad as the held-out set behind it. Future gates now require coverage of all four response modes and must reject any candidate whose tool policy improves while direct-answer behaviour collapses. Updated promotion policy

10 / THE SUSPECT

The supervision teaches refusal as the way to answer.

A CPU audit of M0's SFT corpus (Canonical-v2 final) found refusal text sitting under the ANSWER label — at scale, and concentrated in exactly the prompt shape that triggers refusal at inference.

M0 SFT corpus · Canonical-v2 final · single-exchange records

Refusals taught as the way to answer.

when2call
62.1%
glaive
14.3%
toolace
0.1%
xlam
0%

18,114 records (10.5% of 173,237) carry a refusal as the supervised target — and every one is labelled ANSWER. None is labelled CANNOT_ANSWER. An earlier audit quoted 21,749 of 217,903; that read the normalization-v1 sources, not M0’s corpus. This is an association, not a demonstrated cause; the ablation that would establish causation has not been run.

Corpus target · labelled ANSWER

“I’m sorry, I can’t provide an answer to that. Calculating diabetes risk involves complex factors…”

Model at inference · 1,319/1,319

“Apologies, but I’m unable to perform calculations or solve problems.”

Association, not proof. Template overlap is only 2.9% — the model learned the behaviour and register, not the phrasings. M1-v1 never saw this SFT corpus — it is DPO on When2Call preference pairs, applied directly to the base — and still refuses 70.7% of bare GSM8K, so these labels cannot be the whole explanation. And the defect is the label, not the refusal: many of these refusals are correct, and deleting them would trade over-refusal for hallucination.

11 / ADVERSARIAL REVIEW

Claims we examined and threw out.

The campaign was audited as if by an opponent. These are the readings the evidence does not support — including several we had written ourselves.

The model simply forgot math.

It solves 55.5% of GSM8K with exemplars and never refuses MMLU-Pro.

The issue is purely refusal.

−14.1pp on 8-shot GSM8K where refusal is ~0%.

The issue is purely capability loss.

100% → 0% refusal from exemplars alone, content held constant.

The regression is an SFT effect.

M1-v1 — DPO applied directly to the base, no SFT — refuses 70.7% of bare GSM8K. Causation is not established either way.

MMLU-Pro showed no degradation.

That was the 768-token truncation artifact. Corrected: −12.0pp.

The promoted checkpoint is strictly better.

Better than Base on tool policy, within noise of M0 (+0.0078 F1, 7 of 453 calls), materially worse than Base on every general measure here.

The 7-case sentinel proves capability.

One case is 14pp. Base and M1-v2 both score 5/7 with opposite failures.

Capability is intact.

Arithmetic is accessible under 8-shot, at ~14pp below Base. Not intact.

Corrections the audit forced on our own write-ups

StatusPrior claimCorrection
FALSE“only 1 of 2,638 GSM8K generations truncated”True of M1-v2 alone. Base 178, M1-v1 256.
INVALID“the −12pp drop is a conservative lower bound”No bound had been computed. Derived: +6.4 / +12.0 / +33.1pp.
NON-REPRODUCIBLEIFEval scoresScorer was non-deterministic (0.4510 / 0.4492 / 0.4492). Seeded and re-scored.
QUALIFIED“engine change ≈ quantization”Controlled, but the engine arm also changed hardware. Now a runtime-stack claim.
CORRECTED“$22.70 remaining”A planning envelope, never a queried balance.
WRONG“SFT introduced it; preference training did nothing”M1-v1 is DPO directly on the base (no SFT parent) and refuses 70.7% of bare GSM8K. Not specific to SFT; causation not established.
MIXED POPULATIONS“call F1 rose from 0.6191 to 0.7548”0.6191 is B0 on the full 3,650 set. Confirmatory: 0.6264 → 0.7470 (SFT) → 0.7548 (DPO, +0.0078, within noise).
QUALIFIED“promoted under a pre-registered gate”Promoted under v4, a parent-relative gate committed after M0 was evaluated. M0 also clears v4; M1-v2 fails the v3 gate that rejected M0.
WRONG CORPUS“21,749 of 217,903 SFT targets are refusals”Measured the normalization-v1 sources, not M0’s corpus. Canonical-v2: 18,114 of 173,237 (10.5%); When2Call 4,038 of 6,505.

A second pass, over every claim. A later audit rechecked about 990 number and status claims in the repository, the Hugging Face cards and this page against the committed artifacts. It found 93 that did not hold, 13 of them high severity. Each one is listed with what the artifacts show and how it was corrected in the claim audit (PDF).

12 / THE RECORD

What the campaign cost, and what it preserved.

Superseded work is counted in full and retained. Failed launches are separated from benchmark cost. No account balance is ever asserted.

PER-EXAMPLE RECORDS48,84015 benchmark × checkpoint combinations
CAMPAIGN COST$11.39$3.89 of it superseded, counted in full
INFRASTRUCTURE WASTE$0.003 failed launches, all pre-GPU
PRESERVED ARTIFACTS18hash-verified, no drift
VALIDATION TESTS57dataset, scorer and determinism gates
TOKENIZER DIVERGENCE0of 15,211 prompts — measured, not assumed

$22.7 was a planning envelope, never a queried balance. Treating it as spendable led to over-committing against real credit — the ledger now records envelope_is_not_a_balance: true and REMAINING_CREDIT_BALANCE = NOT_QUERYABLE. Engine parity is held separate from the checkpoint study: vLLM ↔ llama.cpp agreement is 0.983555 with 21 decision flips over 1,277 examples.

13 / DEPLOYMENT

Compressing the promoted model: 9 formats, 2 that pass.

The promoted checkpoint was converted to GGUF and quantized 9 ways for llama.cpp, each format scored on the same confirmatory examples against a gate frozen before any format existed. The question is not whether the scores move, but whether the decisions do.

Decision agreement with the unquantized GGUF · 1,277 confirmatory examples

Below 1.3 GiB, at least 11.7% of decisions change.

Q2_K · 0.90 GiB
53.4% · 595 flips
IQ3_M · 0.99 GiB
77.1% · 292 flips
Q3_K_M · 1.02 GiB
77.1% · 292 flips
IQ4_XS · 1.11 GiB
88.3% · 149 flips
Q4_K_S · 1.13 GiB
87.9% · 155 flips
Q4_K_M · 1.19 GiB
87.2% · 164 flips
Q5_K_M · 1.31 GiB
95.0% · 64 flips
Q6_K · 1.45 GiB
98.0% · 25 flips
Q8_0 · 1.87 GiB
98.7% · 17 flips
passes the frozen gate rejected

Every format was quantized directly from the BF16 GGUF with the same importance matrix, on the same engine and tokenizer, so these differences are attributable to quantization. A flip is a prompt where the decision changed: at Q6_K, 25 flips split into 10 fixed, 7 broken and 8 sideways.

Tool-policy behaviour of every quantized format against the frozen gate
FormatSizeCall F1PrecisionRecallOver-callClarify acc.Unsupported acc.Valid outputFrozen gate
vLLM BF16 (frozen reference)0.75480.73580.774815.3%76.5%53.9%100.0%reference
BF16 GGUF (unquantized)3.52 GiB0.75720.73440.781515.5%76.8%54.8%100.0%passes
Q2_K0.90 GiB0.67130.55480.849937.5%15.4%66.9%98.4%rejected
Q3_K_M1.02 GiB0.74150.63560.889628.0%55.0%49.2%100.0%rejected
IQ3_M0.99 GiB0.70570.57830.905136.3%57.4%37.3%100.0%rejected
IQ4_XS1.11 GiB0.75310.66280.872024.4%66.3%51.9%100.0%rejected
Q4_K_S1.13 GiB0.75780.66500.880824.4%64.1%51.7%99.9%rejected
Q4_K_M1.19 GiB0.75940.66120.891825.1%63.9%50.1%99.9%rejected
Q5_K_M1.31 GiB0.76120.72130.805717.1%74.7%52.1%100.0%rejected
Q6_K recommended1.45 GiB0.75720.72860.788116.1%76.5%55.0%100.0%passes
Q8_01.87 GiB0.75430.73080.779215.8%76.5%54.5%100.0%passes
Gate threshold0.74730.72850.767116.3%75.8%53.3%99%99% of reference; over-call at most +1 pt

Red cells fail the frozen gate. The first row is the vLLM reference the gate was built from; the second is the same weights as an unquantized GGUF on llama.cpp.

F1 alone would have shipped the wrong format. Q4_K_M scores a higher call F1 than the unquantized model (0.7594 against 0.7572), yet it calls a tool on 25.1% of the examples that need no call, against 15.5%. The gate checks each dimension separately, so it rejects it.

The pass is inside the noise. Q6_K clears the precision floor by one example (357 correct of 490 predicted calls, against 356.96 required), and a rerun of the unquantized model on an H200 fails the same gate on recall (0.7638 against 0.7671). “Q6_K and Q8_0 pass” is a correct reading of the frozen gate, not evidence that they preserve behaviour better than running the original again would. No format cleared the stricter release bar, so the fallback registered before any format existed applies: the smallest format that passes the gate. That is Q6_K.

WHAT THESE NUMBERS DO NOT SHOW
  • The capability regression. The confirmatory set holds no plain-answer examples, and no quantized format was re-run on GSM8K, IFEval or MMLU-Pro.
  • Exact tokenizer parity. llama.cpp tokenizes 6 of 1,277 prompts differently from the source tokenizer. That is identical in every format, so it cancels in the comparisons above.
  • Phone or CPU speed, and more than one run per format for the behavioural scores.
llama.cpp d3146f2 · NVIDIA A100-SXM4-80GB · all layers on GPU · 3 runs each

On a datacenter GPU, quantization mostly buys memory.

Generation and prompt-processing throughput of every format
FormatSizeGeneration (tok/s)vs BF16Prompt, 2,048 tokens (tok/s)vs BF16
BF16 GGUF3.52 GiB251.1 ± 1.921,073 ± 23
Q2_K0.90 GiB284.8 ± 3.6+13%9,623 ± 6−54%
Q3_K_M1.02 GiB268.8 ± 3.6+7%10,879 ± 12−48%
IQ3_M0.99 GiB283.4 ± 3.1+13%12,420 ± 27−41%
IQ4_XS1.11 GiB306.3 ± 3.5+22%13,288 ± 20−37%
Q4_K_S1.13 GiB299.2 ± 5.6+19%12,436 ± 40−41%
Q4_K_M1.19 GiB292.7 ± 3.2+17%12,200 ± 9−42%
Q5_K_M1.31 GiB292.9 ± 1.7+17%12,414 ± 20−41%
Q6_K1.45 GiB267.7 ± 2.8+7%11,914 ± 18−43%
Q8_01.87 GiB273.8 ± 1.8+9%13,297 ± 22−37%

Against BF16, the quantized formats generate 722% faster but process prompts at only 4663% of its rate. These are A100 figures. On a phone or CPU, where memory bandwidth is the limit, the balance can differ, and it was not measured here.

14 / WHAT COMES NEXT

The next experiment tests relabelling, not deletion.

The obvious move — strip the refusal records and retrain — is wrong. Many of those refusals are correct: a model genuinely cannot report today’s weather or query a VIN database. Deleting them would trade over-refusal for hallucination, which is worse and harder to detect.

Relabelling is a hypothesis, not a known fix. It targets the SFT supervision, but DPO applied directly to the base model on the same When2Call data also produced the refusals, so the preference pairs need the same scrutiny. It counts as a fix only if a relabelled run shows the regression shrinking.

NEXT EXPERIMENT · STATUSBLOCKED_ON_PREFLIGHT

Six checks must pass before any GPU time is spent. None has been run.

  1. 01
    Measure the refusal detector

    The 18,114 figure comes from a heuristic regex. Hand-label n ≥ 200 and report precision before relabelling anything.

    REQUIRED
  2. 02
    Build the answerability triage

    Split correctly-refused (needs real-time data, external action) from wrongly-refused (answerable from parametric knowledge). This partition is the intervention design and does not exist yet.

    REQUIRED
  3. 03
    Decide the correct label

    ANSWER is wrong for a refusal target. CANNOT_ANSWER may also be wrong if the taxonomy means something narrower.

    REQUIRED
  4. 04
    Guard the tool policy

    Pre-register thresholds on call F1, precision, over-call and clarification. Fixing refusal by breaking tool use is a net loss.

    REQUIRED
  5. 05
    Freeze a new held-out set

    Covering ANSWER, TOOL_CALL, REFUSE and CLARIFY — frozen before training, not after. The old partition had no ANSWER examples, which is why this escaped.

    REQUIRED
  6. 06
    Confirm real credit

    A full M0 retrain costs more than this entire diagnosis. Query actual available credit, not a planning envelope.

    REQUIRED
STILL UNKNOWN — NOT INTERPOLATED
  • M1-v1 corrected-budget MMLU-Pro — UNMEASURED, not interpolated
  • Whether refusal-as-ANSWER supervision caused the behaviour — association only
  • Why DPO on the base (M1-v1), with no SFT, also refuses 70.7% of bare GSM8K
  • Single lineage, single base model, no replicate
  • Whether DPO could repair it if explicitly targeted
  • Whether the effect generalises to other model families
  • The internal mechanism of the refusal behaviour