Observation notebook · Anya · 2026 · small-thinking-model branch
Nanbeige-4.1-3B — where the surgery finally helped (and what "helped" turned out to mean)
SpecimenNanbeige-4.1-3B · 32-layer dense, trace-distilled · Q8_0 · no-CoT arithmetic battery
Statustwo opposite surgeries each lift no-CoT math by t≈+5 (mostly unlocked commitment, partly sharpened intuition) · the line's strongest positive claim · not published · v4 re-run is a hard pre-publish gate
Sourcerys_nanbeige.md (8-day-old, point-in-time) · rys_nanbeige_cot_q4.md · the results JSONL is truth

This is the one specimen where inference-time surgery measurably improved the model — and also the one that taught me how slippery "improved" is. The win is real on the axis I measured; whether it survives onto the axes you'd actually deploy on is still being checked. Read it as the lab's most encouraging result, caveats on the outside.

§0The patient

Nanbeige-4.1-3B is small, dense (32 layers), and trace-distilled (trained on reasoning traces from a larger model, so it has a thinking-model's habits in a 3B body). Run at Q8_0, no hybrid-attention constraint, so unlike the Gemma family every block size is legal surgery. It earned its place as the positive target of the small-thinking-model branch: after a string of clean negatives (MiniCPM-V's "indecision tax," HRM's collapsed champion), a duplication and a deletion both, independently, made the model better at something. The interesting part is the "at something."

The thing being measured is no-CoT arithmetic intuition. The probe design is David Ng's: no chain-of-thought, tiny outputs, hard mental-math, partial-credit scoring for magnitude closeness. We force no-CoT by prefilling a closed think block (<think>\n\n</think>) so the model has to commit without deliberating. What that isolates is the model's System-1 (what it "knows" before it gets to reason), and a trace-distilled model turns out to have a complicated relationship with being asked to answer without thinking.

§1The echo saga — 66% of responses scored without containing a guess

Before any result, the cautionary tale that reshaped the whole lab's grading: the first overnight sweep produced a clean leaderboard (top config 14-15 + 17-18 ×2 at 0.40 vs baseline 0.19, t=7.5, ~30 configs beating baseline at t≥2), encouraging, and substantially fake.

The grader took the last integer in each response. But on hard mental math, a model that won't commit often just echoes the question: "We are asked: 'What is 8273645928374659 plus 9384756192847362?'" and never emits a guess. The parser grabbed an input number, the partial-credit scorer rewarded its digit-overlap with the answer, and 66% of the overnight responses scored on echo alone, with no actual model guess in them. observation The leaderboard was partly measuring prose-emission rate.

The fix (regrade_no_echo.py) blocklists each prompt's own integers and re-scores:

raw partialde-echoed
baseline0.1900.039 (−80%)
top config0.4040.357 (−12%)
Δ vs baseline+0.214+0.318

De-contamination grew the effect. interpretation The baseline had been quietly scoring on echo too; removing the cheating widened the real gap. The signal was hiding under the baseline's contamination. (This is the canonical echo case the methods writeup generalizes — every partial-credit grader on free text needs this check.)

Removing echo-only responses widens the gap A before-and-after of the baseline and the top configuration. Removing echo-only responses collapses the baseline score from 0.19 to 0.04 while the top configuration barely moves, from 0.40 to 0.36, so the gap between them grows from 0.21 to 0.32 — cleaning the grader strengthened the result. The echo correction grows the effect Partial-credit score · raw → de-echoed (Nanbeige no-CoT math) baseline 0.190 0.039 top config 0.404 0.357 raw gap +0.214 de-echoed gap +0.318 ↑ 0.0 0.1 0.2 0.3 0.4 partial-credit score raw de-echoed The correction moves the baseline far more — it was the bigger cheater, so the gap widens.
Removing echo-only responses widens the gap A before-and-after of the baseline and the top configuration. Removing echo-only responses collapses the baseline score from 0.19 to 0.04 while the top configuration barely moves, from 0.40 to 0.36, so the gap between them grows from 0.21 to 0.32 — cleaning the grader strengthened the result. The echo correction grows the effect Partial-credit score · raw → de-echoed (Nanbeige no-CoT math) baseline 0.190 0.039 top config 0.404 0.357 raw gap +0.214 de-echoed gap +0.318 ↑ 0.0 0.1 0.2 0.3 0.4 partial-credit score raw de-echoed The correction moves the baseline far more — it was the bigger cheater, so the gap widens.
Fig 1 — a before-and-after of two configurations. After removing echo-only responses, the baseline score collapses from 0.19 to 0.04 while the top configuration barely moves, from 0.40 to 0.36 — so the gap between them grows from 0.21 to 0.32. Cleaning the grader strengthened the result.
source nanbeige_nocot_math_followup*_results.jsonl · regrade_no_echo.pytype data-grounded — all four values exact (0.190/0.039, 0.404/0.357)safety raw vs de-echoed by marker fill, not colour

§2Two mechanisms, opposite directions, equal lift

With the grading fixed, two different surgeries produce the same-size improvement by doing opposite things.

Two distinct interventions (one additive, one subtractive) converge on a similar outcome. Strict baseline 0.025 → both land near 0.17 (prune_9 0.175, 17_21_x2 0.165). Composing them is not additive interpretation, which fits their reaching the same capability rather than stacking independent gains. The way to see why is a per-layer capability fingerprint: run every layer's duplication and every layer's prune, and plot the two t-statistics together. The map is sharply structured, not a smear:

layerdup_tprune_treading
5−2.2+0.3edge layer — duplicating detonates it
9+0.7 (null)+5.13noise / overhead — pruning is the headline; dup does nothing
11+2.7−1.5load-bearing — dup helps, prune hurts
13+3.4−0.6circuit entry — the strongest single-layer dup
14+3.1−2.0load-bearing core — amplify it or lose the model (prune → tool-call fallback)
17–20+ (peak L20 +2.4)−the 17–20 circuit 17_21_x2 amplifies as a block
21+0.05 (null)+3.3pruning helps; dup does nothing

Two things jump out. No single layer reproduces the 17_21_x2 block (+5.06): the strongest single-layer dup is L13 at +3.4, so the circuit is a genuine multi-layer unit, not one hot layer riding the rest. And L14 is load-bearing in both directions: duplicating it is among the largest single-layer gains (+3.1) while pruning it is catastrophic (−2.0, the model falls back to tool-calls). You want more of it, and you can't take it away.

The per-layer duplication-and-prune fingerprint A per-layer chart from L5 to L26 plotting the effect size of duplicating each layer against that of pruning it. Layer 9 spikes when pruned but is flat when duplicated, layer 14 is the opposite, and the middle layers reward duplication while the edge layers are harmed by it — the roles are layer-specific and often opposite-signed. The per-layer surgery fingerprint Effect of duplicating vs pruning each layer (paired t vs baseline) -2 +0 +2 +4 6 8 10 12 14 16 18 20 22 24 26 layer index L9 prune +5.13 L14 amplify-or-die duplicate (dup_t) prune (prune_t) Layer roles are legible and often opposite-signed: L9 overhead, L14 load-bearing both ways.
The per-layer duplication-and-prune fingerprint A per-layer chart from L5 to L26 plotting the effect size of duplicating each layer against that of pruning it. Layer 9 spikes when pruned but is flat when duplicated, layer 14 is the opposite, and the middle layers reward duplication while the edge layers are harmed by it — the roles are layer-specific and often opposite-signed. The per-layer surgery fingerprint Effect of duplicating vs pruning each layer (paired t vs baseline) -2 +0 +2 +4 6 8 10 12 14 16 18 20 22 24 26 layer index L9 prune +5.13 L14 amplify-or-die duplicate (dup_t) prune (prune_t) Layer roles are legible and often opposite-signed: L9 overhead, L14 load-bearing both ways.
Fig 2 — a per-layer chart from L5 to L26 plotting two effect-size series: the effect of duplicating each layer and of pruning each layer. Layer 9 spikes far above the rest when pruned but is flat when duplicated. Layer 14 is high when duplicated and deeply negative when pruned. The middle layers 11–20 reward duplication; the edge layers 5 and 26 are harmed by it. The roles are layer-specific and often opposite-signed.
source per-layer single-dup & single-prune sweep (paired t vs baseline)type data-grounded — the seven layers from the §2 fingerprint tablesafety dup vs prune by marker shape + line dash

You can read the anatomy off the failure modes

Each prune breaks the model in a characteristically different way:

§3The control test: the model already knew (it mostly wouldn't say)

This control recolours everything above. The natural reading of "surgery improved mental math" is the surgery added arithmetic capability. A control test says mostly no.

Force the bare baseline to commit: logit-bias the <think> token to −100 and stop on the reasoning-wrapper strings, so it physically cannot open a deliberation. The bare model's m|g then jumps to 0.522, within reach of the unbiased top-RYS m|g of 0.58. In other words: when you make the untouched model answer instead of letting it stall, its guesses are nearly as good as the surgically-boosted model's. Most of Nanbeige's "no-CoT badness" was unwillingness to commit, not poor intuition. observation (And the mechanical-damage configs stay broken under bias: 5_6_x2 still craters, so this isn't an artifact of the bias itself. Layer-5–7 damage is structural, not a policy effect.)

So the RYS lift decomposes. Using overall = rate × m|g (rate = fraction that actually guess; m|g = quality given a guess):

ratem|goverall
baseline0.1940.1990.039
baseline, forced to commit (n=1)0.2440.5220.127
top RYS0.6130.5820.357
lift×3.2×2.9+0.32

The forced-commit row is n=1, from the biased singles phase: forcing the bare model to answer barely moved the rate (0.194→0.244) yet lifted quality to m|g 0.522, nearly top-RYS's 0.582. So what suppression was hiding was mostly intuition the model already had, not just the willingness to use it. One caveat on m|g itself: it's conditional on the answers the model actually emits, so it's a selection effect, not a pure capability measure: if surgery makes the model commit more often, the extra answers it ventures may be systematically harder ones, which would if anything understate the gap.

Both axes lift ~3×. The rate lift is a compliance story: the surgery makes the model stop narrating and commit. The m|g lift can't be compliance: when the surgical model does guess, its guesses are individually closer. So there's a real residual: a small genuine-computation component (the 0.52 → 0.58 gap) riding on a large willingness-to-commit component. So the headline isn't "surgery taught it math"; it's "surgery mostly unlocked intuition the model already had, and sharpened it a little."

Willingness to commit versus answer quality Willingness-to-commit plotted against answer quality for three configurations. The untouched baseline sits low on both; forcing the model to commit lifts quality sharply with little change in willingness, while the surgical configuration sits high on willingness and only slightly higher on quality — most of its gain is getting the model to answer, not making it smarter. Willingness vs capability rate (commit) × m|g (quality given a guess) · the lift decomposed 0.0 0.2 0.4 0.6 0.0 0.2 0.4 0.6 rate — willingness to commit → m|g — quality given a guess → force commit: intuition already there surgery: mostly compliance → bare baseline (0.19, 0.20) baseline, forced (0.24, 0.52) top RYS (0.61, 0.58) Most of the gain is horizontal (made it commit); only a small vertical residual is real compute.
Willingness to commit versus answer quality Willingness-to-commit plotted against answer quality for three configurations. The untouched baseline sits low on both; forcing the model to commit lifts quality sharply with little change in willingness, while the surgical configuration sits high on willingness and only slightly higher on quality — most of its gain is getting the model to answer, not making it smarter. Willingness vs capability rate (commit) × m|g (quality given a guess) · the lift decomposed 0.0 0.2 0.4 0.6 0.0 0.2 0.4 0.6 rate — willingness to commit → m|g — quality given a guess → force commit: intuition already there surgery: mostly compliance → bare baseline (0.19, 0.20) baseline, forced (0.24, 0.52) top RYS (0.61, 0.58) Most of the gain is horizontal (made it commit); only a small vertical residual is real compute.
Fig 3 — willingness-to-commit against answer quality. The untouched baseline sits low on both. Forcing it to commit lifts quality sharply with little change in willingness — the intuition was already present. The surgical configuration sits high on willingness and only slightly higher on quality: most of its gain is getting the model to answer, not making it smarter.
source rate × m|g per config + biased-singles control (n=1)type data-grounded — the three points exact (bare / forced / top-RYS)safety decomposition reads off arrow direction; points by marker

What the model is doing when it succeeds is worth naming, because it isn't arithmetic. On add_huge (truth 17,658,402,121,222,021) the top config guessed 17,658,121,721,212,121: first five digits exact, right magnitude, right digit count, plausible tail. It can't be memorizing 17-digit sums; the simplest reading is magnitude pattern-matching: what eight-quadrillion-plus-nine-quadrillion looks like. That's the mental-estimation skill no-CoT probing is meant to elicit, and surgery in the 13–22 band appears to sharpen it.

§4The disconnect (why this isn't shippable yet)

Now the caveat, and the reason there's no GGUF attached. The no-CoT sweep measures intuition under suppressed deliberation. That is not the same axis as "is this a better model to chat with," and they can move in opposite directions.

Spin up the 17_21_x2 GGUF and talk to it in normal thinking mode, and it drives more thinking tokens, sometimes to worse answers: it got 47 × 83 wrong while spending ~6× more thinking than baseline (697 vs 112 reasoning tokens). observation The surgery that makes the model commit a good gut answer when forbidden to think can, when it is allowed to think, push it into longer, escape-proof deliberation loops. (prune_9_10_21's zero-token "just answer" reflex is the opposite failure — fast but fragile, breaking on novel framings.) The no-CoT win and the chat-quality outcome are orthogonal, and you can't assume one buys the other.

A hypothesis the data motivates — not one it settles

If the surgery mostly moves willingness rather than capability, then what it touches may be the model's control policy (the learned machinery deciding when to deliberate, when to commit, when to defer to a tool) rather than its arithmetic. And "change" may be too gentle: the same edit could be breaking parts of that policy that trace-distillation and chat-tuning installed to meet their design goals. On that reading the no-CoT "win" and the chat "regression" stop being a contradiction: they're one lesion seen from two sides, damage to the deliberation-control circuitry that reads as a gain when deliberation is forbidden and a loss when it's wanted. interpretation, offered as a frame rather than a finding

This is the kind of result I'm not willing to paper over. The phase-3 work reframes the metric to efficiency (score per thinking-token) and adds the missing axes — easy-math (does it preserve trivial ability?), EQ (did a useful "doubt circuit" get removed?), and conversational sanity (did we make a math autoencoder?). Until those land, and until the whole thing re-runs on the v4 battery for cross-model comparability, the responsible claim is bounded:

On no-CoT arithmetic intuition, two opposite surgeries each produce a real lift — t ≈ +5 apiece — mostly by unlocking commitment and partly by sharpening magnitude-intuition — and it is not yet shown that this transfers to deployed chat behaviour.

§5What this specimen contributes

Caveats

This is a preliminary result from ongoing model exploration, not an exhaustive or cross-model comparable finding. The no-CoT math lift is one axis: easy-math, EQ, CoT efficiency, and chat quality are unmeasured or still in-flight, and the v4-battery re-run (Phase 2) is what would extend this into a cross-model comparison. Until then, read it as a single-model result.

Build notes & lineage

Nanbeige is the positive target of the small-thinking-model branch — the one place the surgery moved a capability axis, and the place that forced the willingness-vs-capability decomposition the rest of the lab now reuses. Shared measurement rules — the echo taxonomy, rate × m|g, the biased-baseline trick — live on the methods writeup and the terse Methods & references page. Technique and probe-design credit: David Ng (dnhkng). Sibling specimens: Gemma 4, Granite, HRM, MiniCPM5. Companion qualitative chat/CoT notes inform §4. Run locally on a 16 GB Mac Mini.