cert-machine · audit · Weight-Space Programming (MIT CSAIL) · found 2026-11-02 at RikiyaT/Qwen3.5-0.8B-weight-space-programming d1671a17

Weight-Space Programming: the edit decided from its bytes, the scores re-graded

On 2 November 2026 Rikiya Takehi, Teoh, Zhang and Khattab (MIT CSAIL) published “Sparks of Weight-Space Programming”: a frontier model, GPT-6 Astra, edited Qwen3.5-0.8B’s weights directly, with no training, and MATH-500 went from 7.9% to 48.1%, “131,072 weights, 0.016% of the model”. They released the edited checkpoint, a bit-exact diff, their logs and their graded outputs. Here the edit is decided from the bytes of the two checkpoints by two implementations that share no code, and every released MATH-500 answer is re-graded by an exact three-valued grader against their flags. The edit is exactly what the diff says; two printed numbers are not what the bytes say; and the exact grading agrees with theirs on every decided answer.

Published as a blog post, an X thread and a model card, not peer-reviewed. The checkpoints (Qwen/Qwen3.5-0.8B @ 2fc06364, the edited release @ d1671a17), the logs repository (RikiyaT/lm_understand-logs @ 4d09ba6d), MATH-500 (HuggingFaceH4 @ 6e4ed1a2) and Qwen’s model card were fetched 2026-11-02 and every file is pinned by sha256 in corpus/wsp/PINS.json. The claimants’ scripts (make_edit_diff.py, apply_edit.py, mathqa.py) were read as text and never run. What is decided: the tensor diff, its counts, its columns, the printed hashes, the first-sample answers. What is read: the benchmark scores themselves (no model was run here), the mechanism, the baseline’s settings.

tl;dr
  • The finding. The edit is real and exactly as released; the two printed sizes are off; the scores re-grade identically. Exactly two of 488 tensors differ, the two the card names, and their sha256 are the printed ones. The entries whose bits differ number 130,188, not 131,072 (that is the 131,072 entries of the 64 columns the edit addressed, of which 884 round back to the original value — their own manifest says so). The “0.016% of the model” is 131,072 over the round number 0.8 B: over the release’s actual 873,438,784 parameters it is 0.015%, over the language model’s 752,393,024 it is 0.017%. The edit is not “the direction subtracted” but six times its projection removed — the component along it reversed and amplified five-fold (the run’s own formula; the bytes show the ratio 6.000 and 6.000). Of the post’s 500 unedited first samples only 35 end in a closed box, and every one of them is correct; of the edited run’s, 303 do, 241 correct. The gain is termination. Whether a looping baseline under the post’s settings is the right denominator for “6×” is the open question (§1, G5): Qwen’s own card warns the 0.8B loops under those settings and recommends others.
  • The mechanism. Two checkpoints, parsed from their safetensors headers, compared tensor by tensor as bytes and — where a dtype could differ — as exact rationals; the changed entries counted, their rows and columns listed, the parameter counts summed from the shapes, every fraction kept as an exact rational and rounded once to three decimals; a rank-1 witness (u, α) proposed by an SVD and an interval search, then checked entry by entry in binary32 arithmetic with round-to-nearest-even to bfloat16; a three-valued grader that canonicalises an answer to an exact object (rationals, radicals, multiples of π, complex numbers, tuples, degrees, base-n literals, words) or refuses it, run on every released answer string and text.
  • Check it. node tools/wsp-weights.js --check re-derives every fact and both red controls from the cached checkpoints (26.8 s to record; the 2.5 GB of inputs are fetched by the pins, not kept in git); python3 -I tools/wsp-regrade.py --check re-grades every released answer (seconds).
tensors that differ
2 of 488
layers 15 and 19, mlp.down_proj; sha256 as printed on the card and in the diff manifest.
entries whose bits differ
130,188
of the 131,072 entries in 64 columns × 1,024 rows × 2 tensors the edit addressed; the post prints 131,072.
“0.016% of the model”
0.015% / 0.017%
over the release’s 873,438,784 parameters / the language model’s 752,393,024; 0.016% only over a round 0.8 B.
first-sample answers re-graded
1,000
980 decided, 20 refused by the exact grader; 0 disagreements with math-verify on the decided ones.
§1 · the gaps

What the post states and the bytes do not, dated at the pin

G1 · count · found 2026-11-02

“131,072 weights” is the addressed count, not the changed count. The post and the card say the edit “directly changed only 0.016% of weights”, 131,072 of them. Both deciders count 130,188 bfloat16 entries whose bits differ (65,260 in layer 15, 64,928 in layer 19); 131,072 is 64 columns × 1,024 rows × 2, the entries the edit touched, of which 884 round back to their original bfloat16 value. The claimants’ own edit manifest counts 130,188 and says why in a note; the post rounds the other way. A reading, not a refutation of substance: the edit is what it says.

What would close it. One clause in the post: “131,072 weights addressed, 130,188 changed”.

G2 · fraction · found 2026-11-02

“0.016% of the model” divides by the model’s name, not its parameter count. 131,072 over 800,000,000 is 0.016%. The release is image-text-to-text and holds 873,438,784 parameters (100,592,896 in the vision tower, 752,393,024 in the language model, of which 254,279,680 are the tied embedding): the fraction is 0.015% of the release, 0.017% of the language model the post evaluated, 0.026% of its non-embedding weights. Every one of these is an exact rational in the record (2048/11756141 for the language model), rounded once.

What would close it. Name the denominator.

G3 · dose · found 2026-11-02

The direction is not subtracted; six times its projection is. The post says Astra “subtracted that direction from 64 output columns in each” layer. The run’s own notes state the formula, W = W₀ − 6·u(uᵀW₀) on the 64 columns, and the bytes agree: the ratio of the witness’s per-column coefficient to the column’s projection on u is 6.000 ± 0.00015 in layer 15 and 6.000 ± 0.00016 in layer 19. So the component of each edited column along the “loop direction” is not removed: it is reversed and amplified five-fold. Astra reached that dose by trials (strength 1, 2, 3, 4, 6 in its history) and the post does not say so. The relative change of the two tensors is about a tenth (their manifest: 0.106 and 0.081).

What would close it. The formula in the post, with its dose.

G4 · evidence · found 2026-11-02

The texts behind most of the 2,000 graded answers are not released. The post’s MATH-500 score is the mean over 4 samples of 500 problems. The logs hold every sample’s correctness flag and, for the first sample only, the extracted answer string (500 per run) and the full text for 20 problems per shard (200 per run). The model card’s independent re-run (51.0%) releases its 2,000 flags and 20 texts. So what can be re-graded is 1,000 first-sample answers and 440 texts; the flags re-sum to the printed accuracies exactly (0.4810 against the printed 0.481).

What would close it. The 2,000 generations per run, as the card’s re-run released its flags.

G5 · baseline · a reading, not decided

The 7.9% baseline is a looping regime that the base model’s own card warns about. Under the post’s settings (temperature 0.6, 32,768 tokens) 93.0% of the unedited MATH-500 answers hit the token limit (their merged.json). Qwen’s model card for Qwen3.5-0.8B, pinned at the same revision, says: “In thinking mode, we have observed that when using the recommended sampling parameters, Qwen3.5-0.8B is more prone to entering thinking loops compared to other Qwen3.5 models”; its recommended thinking-mode text settings are temperature 1.0 with 81,920 output tokens for competition math, and its own table reports IFEval 44.0 (thinking) / 52.1 (non-thinking) for the base model against the post’s 21.0. The multipliers in the post (“6×”, “3×”) are measured against that baseline. The edited IFEval 62.3 is above the card’s numbers, so the edit does something real; how much of 7.9 → 48.1 a no-edit configuration recovers is not decided here. It would be by one GPU run (§4), pre-registered and not yet made.

What would close it. The unedited model under the card’s settings, on the same grader, beside the post’s table.

G6 · selection · a reading

48.1 is one run of several. The logs’ results table lists the three prompt-v3 runs the post reports (10, 25, 50 passes: 12.3, 14.1, 48.1 on MATH-500), two prompt-v4 runs (7.9 with no edit submitted; 14.1), earlier runs that submitted no edit, and prompt-v5 runs still pending. No variance across runs of the same budget is reported. The same table records the follow-up on Gemma 3 270M, a model that does not loop (8.5% of answers at the limit): fifty passes moved MATH-500 from 6.8 to 7.0 under lenient grading, within noise. Read together with §3: where there is no loop to break, the method found nothing to gain.

why these numbers stand as they do
  • decided — the addressed entries less those whose bits differ
  • computed — the proposer’s reading of the witness it found: α_c over uᵀW[:, c] per column, numpy float64; computed, not decided (the witness itself is REFUSED)
  • decided — the first-sample answer strings of the two runs
  • decided — the released full texts
  • decided — the mean of the 2,000 released flags, to four decimals
  • computed — the claimants’ own flag or count, as released; read, not decided
  • computed — the claimants’ own cut share, as printed in their merged.json; read, not decided
§2 · the weights

Seven sub-claims, each decided by two implementations

claimwhat the bytes sayverdict
W1the same tensors in both checkpoints (names, shapes, dtypes)488 tensors each; no name, shape or dtype differsCERTIFIED
W2exactly two tensors differ: layers 15 and 19 mlp.down_projlayers.15.mlp.down_proj.weight, layers.19.mlp.down_proj.weight; every other tensor byte-identicalCERTIFIED
W3“131,072 weights” as the entries whose bits differ130,188 differ (65,260 + 64,928); their manifest’s 130,188 CERTIFIEDREFUTED
W3′131,072 as the entries of the 64 addressed columns64 × 1,024 × 2 = 131,072CERTIFIED
W4“0.016%” over the release / the language model / its non-embedding weights0.015% / 0.017% / 0.026%REFUTED
W4′“0.016%” over a round 0.8 B0.016%CERTIFIED
W5the changed entries lie in exactly 64 columns per tensor, the ones the run’s manifest names64 and 64 columns; 1,024 and 1,023 of 1,024 rowsCERTIFIED
W6one direction: a witness (u, α) with bf16(W − u·α_c) = W′ on every changed columnthe best witness found reproduces all but 42 and 65 of 65,536 entries per tensor (each within 6.3e-5 in absolute value, at entries where the subtraction nearly cancels); a failed search refutes nothingREFUSED
W7the printed sha256 of both edited tensors (the card) and both base tensors (the manifest)all four equal the bytesCERTIFIED

The sub-claims were written to corpus/wsp/claims.json before either decider ran. The Python decider (standard library: struct, mmap, array, Fraction) and the JavaScript one (Buffer, Uint16Array, Math.fround, BigInt) read the safetensors headers and the raw bytes themselves and agree on every count, column, hash and verdict. Two red controls must come out wrong and do: one bit flipped in a third tensor (W2 REFUTED with three tensors differing) and the layer-15 delta doubled (W6 REFUSED (the witness fails) and W3/W7 REFUTED on layer 15).

W6, in words. Astra’s own float32 submission was rank-1 to float32 precision (its manifest reports a directional residual of 2.5·10⁻⁷); the released checkpoint is that submission rounded to bfloat16, which adds a relative noise of about 2⁻⁹ to every entry. An SVD of the delta recovers the direction to that noise, and an interval search (every edited entry fixes the binary32 interval that rounds to it) brings the witness to within 42 + 65 entries of exact. The claim is CERTIFIED only with a witness that reproduces every entry; none was found, so it is REFUSED — which is a limit of the search, stated as such, not a finding against the edit.

§3 · the scores

Every released answer re-graded: the gain is termination

The grader here (instruments/wsp/grade.py) reads the last closed \boxed{} itself, canonicalises both the prediction and MATH-500’s answer to an exact object, and says CORRECT, WRONG or REFUSED. It refuses what it will not canonicalise — an expression, an interval, a unit, a percentage against a bare number, a base-n literal against a bare number, the same elements in another order — rather than guess; 447 of the 500 gold answers are in its reach. The claimants graded with math-verify 0.9.0 on the same box.

run (the post’s logs)MATH-500, printedthe 2,000 flags re-summedfirst samples ending in a boxof those, correct (theirs)of those, correct (exact)decided answers: agreement with theirs
unedited0.0790.079035 of 5003535 of 35 decided500 of 500; 0 refused
edited, 50 passes0.4810.4810303 of 500241230 of 283 decided480 of 480; 20 refused
0 100 200 300 400 500 unedited · answered (a closed box) 35 of 500 unedited · correct, their grader 35 unedited · correct, exact grader 35 of 35 decided edited, 50 passes · answered (a closed box) 303 of 500 edited, 50 passes · correct, their grader 241 edited, 50 passes · correct, exact grader 230 of 283 decided first-sample answers, of 500 MATH-500 problems
First samples of the 500 MATH-500 problems, per run. Answered: a closed box in the response. The unedited model answers 35 and is right 35 times; the edited one answers 303 and is right 241. The exact grader decides 283 of the edited boxed answers and agrees with math-verify on every one.Record: certs/wsp-regrade.json · sha256 b346efb4db9bThe build refuses this figure if a decided first-sample answer is graded differently by the exact grader and by math-verify.

Read exactly. The unedited model, when it finishes, is right: 35 first samples end in a box and all 35 are correct by both graders. The edited model finishes 303 times and is right 241 of them (79.5%). So the edit does not make the model better at the problems it already finishes; it makes it finish — which is exactly the mechanism the authors describe (a “loop direction” written by two MLPs) and exactly why a baseline that does not loop (§1, G5, G6) is the number the “6×” needs.

The card’s independent re-run. akhaliq’s re-run of the edited checkpoint prints 0.51; its 2,000 flags re-sum to 0.510. Its 20 released texts re-extract and re-grade as flagged (19 decided, 19 agree); the 25-problem base smoke test likewise (15 decided, all agree).

Extraction. On all 400 released texts of the post’s runs, the last box read here equals the answer string their pipeline extracted. The 20 refused edited answers are listed in the record with the reason each (a unit after the number, an equation for a number, a matrix, an interval, two multiple-choice letters, an order).

decided
exact arithmetic backs it
computed
float, or a number someone printed; nothing decided it
why these numbers stand as they do
  • computed — the claimants’ own flag or count, as released; read, not decided
  • decided — the mean of the 2,000 released flags, to four decimals
  • decided — the claimants’ own flag or count, as released; read, not decided
  • decided — their correct boxed first samples over their boxed first samples
  • decided — the mean of the released flags, to three decimals
  • decided — the released first-sample texts of the two runs
§4 · the baseline

What would decide the multiplier, and is not run

The question G5 leaves open has one answer: the unedited Qwen3.5-0.8B on MATH-500, four samples per problem, the grader of §3, under three conditions side by side — the post’s settings (a control that should reproduce about 7.9), the card’s thinking-mode text settings (temperature 1.0, 81,920 tokens), and the card’s non-thinking settings. It is pre-registered in notes/wsp-stage3-preregistration-2026-11-02.md with its stop rule and costs about US$15–30 of GPU time. It has not been run: a paid run is the operator’s word, and this page says so rather than guess the number. When it runs, its record (certs/wsp-baseline.json) is added here and the gaps above are re-dated.

What is not claimed. That the edit is small or large in effect beyond the released flags; that the mechanism is as described (read from the run’s notes, not probed here); anything about GSM8K, IFEval or the other benchmarks beyond re-reading their printed numbers; that math-verify is wrong anywhere (it agreed with the exact grader on every decided answer).

§5 · how it was done

Read, stated, decided

  1. assumed
    The released flags are the post’s evaluation merged.json is said to be recomputed from the parts by the claimants’ merge.py; the parts’ flags re-sum to the printed accuracies here; the generations behind 1,500 flags per run are not released
  2. assumed
    MATH-500’s answers are the gold HuggingFaceH4/MATH-500 at its pinned revision, as the claimants used; a gold answer is not re-derived
  3. assumed
    The degree sign and \text{} are decoration the two conventions the grader applies (90° = 90; \text{Evelyn} = Evelyn); every other convention is refused, not assumed

Re-run: node tools/wsp-weights.js (both deciders, the controls, the pins; needs the cached inputs) · python3 -I tools/wsp-regrade.py · node tools/build-report-wsp.js.

why these numbers stand as they do
  • decided — the tensors whose bytes differ, listed by both deciders
  • decided — the record’s own run time
contact

Write to Carlos

Sent by Web3Forms to Carlos’s inbox; nothing stored here.

Or write to carlos@carlostoledo.co, or open the public pilot form on GitHub.