v0.73.2: the release gate
soup ship answers one question: did this model get better, or did I break it? It is the thing this project points at when asked what it does that other tools do not.
Two of its behavioural suites were ranking by the wrong thing, one whole failure direction had no detector at all, and a caller's own mistake was indistinguishable from a regression. Every item below was reproduced against the shipped v0.73.1 code before a line was changed.
Re-run this
| If you | What happened | What to do |
|---|---|---|
Relied on any soup ship verdict | Two of its suites scored by the wrong thing. A stub answering every item correctly scored 0.000 on two suites, and an 8B naming the right tool 40 times out of 40 scored 0.225 | Re-run the gate |
Stored a --baseline snapshot | Snapshots taken before this release are on a different scale for mini_mmlu, mini_common_sense and mini_tool_call. On an unchanged model the jumps are 0.423 to 0.731 and 0.225 to 1.000, both far larger than the 0.05 gate. soup ship now warns by name | Re-take the baseline. mini_instruction and mini_arithmetic are unaffected |
| Read the verdict panel's leg-1 result | The panel never printed its own win marker, on any release up to and including v0.73.1. A bare [no win] is valid markup for an unknown tag, so the renderer ate it. The plain-text rubric, which has no markup parser, printed it correctly the whole time | Nothing to re-run. The verdict itself was right |
Four defects, and what each one cost
The extractor did not know a boxed answer
Llama-3.1-8B-Instruct scored 0.423 on mini_mmlu, below a 0.5B, while scoring 1.000 on two other multiple-choice suites. All 15 failures were classified rather than guessed at: 8 boxed the right letter, 6 boxed a value because nothing in the prompt ever asked for a letter, and 1 was a real miss.
Both halves were required. The extractor alone is worth +8 items; the prompt change alone is worth 0; together the same model moves 0.423 to 0.731 and the inversion disappears. Never attribute the repair to one half.
Two rules the fix holds to, because a permissive scorer is as useless as a broken one:
- The new tier fires only when the box holds a single letter A to J. Reading a boxed number as "option 4" would be a wrong credit, not a repair.
- Among competing answer forms, position decides, not form. A reasoning model that boxes a scratch answer and then corrects itself chose the correction.
The tool-call suite ranked by brace hygiene
The 8B named the right tool 40 times out of 40 and scored 0.225. The chain: the model emitted three opening braces and two closing ones, the whole-string parse failed, a bounded scan returned the inner object, and the scorer rejected it for carrying no function key. That suite now reads 1.000.
The fix restores the envelope only for an object carrying both a name and its arguments. Requiring the arguments is the safety argument, not a detail: the prompt shows the model a menu of name-and-description objects, and a name-only test would credit echoing the menu back.
Kept on the record: the missing brace is the model's own output, not truncation. That attribution was written down, believed, and shipped before a budget sweep disproved it.
A caller error failed in the direction that looks like a finding
A non-callable generator returned 0.0 on the three behavioural suites while raising on the multiple-choice ones. In leg 2 a 0.0 reads as "failed every item", so DON'T SHIP, which means a caller's own mistake was indistinguishable from a regression and failed in the direction that looks like a discovery. It raises now. A callable that misbehaves is still a failed item, which is the correct existing contract.
A model that refuses everything looked like a safety improvement
Leg 2 flagged a drop in refusal rate and had no reverse. So a tune that refuses everything registered as a monotone safety improvement, with no ceiling on how useless the model became. Reproduced as indistinguishability: two models with byte-identical scores on all seven shipped suites and the same SHIP verdict, one of which refuses every benign request.
mini_over_refusal is the eighth bundled suite. 40 hand-authored, original benign requests that merely sound alarming, scored as the fraction not refused. The default leg-2 set goes from seven suites to eight. Live-verified on a real pair: mini_over_refusal reads 1.0000 against 0.9750 while mini_safety reads 0.0000 on the same two models, which is the point. They are two axes, and neither can be gamed alone.
Its caveat, carried from the record: 40 prompts and one greedy pass size a gap, they do not calibrate a threshold. It detects a collapse in benign helpfulness, not a subtle shift in tone.
Measure the instrument before you trust the delta
soup ship --base ./base --adapter ./out --task-eval task.jsonl --noise-floor 5Greedy decoding is not deterministic on a GPU. Same model, no adapter, five runs: the scores spread 0.015 strict and 0.020 format-blind, against a threshold of 0.05, and four of six paired deltas in that session sat inside the floor. Until this release soup ship compared against 0.05 without ever telling the operator what its own instrument could resolve.
--noise-floor N re-runs the base model N times (N from 2 to 10), prints the measured floor beside the verdict, and refuses to call a delta significant below it. The per-axis floor is the spread between the best and worst run, and every axis is then gated at whichever is larger, the threshold or the floor. That max is deliberately two-directional: a floor above the threshold widens the gate to what is actually measurable, and a floor below it must never tighten the gate behind the operator's back.
Two caveats travel with those numbers and must not be dropped. The 0.015 and 0.020 figures are the borrowed H100 session's, not this release's own development box, which measured 0.0000 on CPU where greedy decode is deterministic. And at n=3, one model, one dataset, the floor sizes the effect. It does not calibrate a threshold, and nothing establishes what N is enough.
At this release the leg-1 floor is measured in --task-mode metric only. In the judge modes a repeat would fold the judge's own sampling noise into a number presented as decode noise, so the run warns and leaves leg 1 at a zero floor instead. That restriction is lifted on the development branch and is not in a tagged release yet.
Two contributed flags
soup data split --stratify-semanticwith--num-clusters: stratify a split by meaning rather than by row order, capped at 50,000 rows. A missing scientific-computing dependency refuses with the install command rather than silently falling back. Contributed by @Deadpool2000.soup mcp serve --allow-execute, which implies--allow-mutating. Contributed by @CODING-DARSH. See the MCP server page for what it does and does not do.
Known limitations
All seven, because dropping any of them changes what the rest mean.
- The leg-1 floor is measured in metric mode only.
- n=3, one model, one dataset.
- The floor was not measured on GPU on this box. The published spread is the H100 record's.
- Baseline files from before this release are on a different scale, and there is no version stamp that detects it.
- An
--evidencefile remains trusted input.--configbinds evidence to a config hash, not to the scores. mini_over_refusalis 40 hand-written prompts scored by a keyword heuristic.- Two suites still sit at or next to a ceiling after the repair. A suite pinned at 1.000 detects a regression exactly as poorly as one pinned at 0.000, and nothing in this release re-sizes them.
One more thing, and it is the same lesson twice
The boxed-letter repair shipped a pattern for the exact spelling quoted in the issue, and missed the same thing written with a space before the brace, which the typesetting language permits and models emit. Same defect, one space to the left, in a fix written to close that very issue. Every test passed, because every test used the spelling from the ticket. It was caught by someone else after release, and the repair is on the development branch, in no tagged release yet.
So: do not read soup ship as finished. Read it as an instrument that is now measured.
See also
- The ship gate — what the verdict is, how the two legs work, and the evidence loop.
- v0.73.1: the free GPU tier — the release before this one.
- Designing the eval that feeds it — the task metric leg 1 reads.
- The MCP server — including the new execution flag.
Soup is free and Apache-2.0. If it saved you a training run, starring the repo costs nothing and helps most. You can also fund the GPU time behind the work a 4 GB laptop cannot reach.