What happened—and what to learn from it
Weight-Space Programming (WSP) is the authors’ name for using a general-purpose large language model (LLM) to inspect, repair, or construct a neural network’s numerical parameters directly, without an optimizer writing the numbers. Takehi, Teoh, Zhang and Khattab’s November 2 research post reports eight experiments, ranging from tiny game policies to a pretrained language model. [1]
The editor in every experiment is Astra: OpenAI’s gpt-6-astra, called through the Codex command-line tool with every built-in tool switched off. The harness audited all 1,125 released turns as free of built-in tool calls. Where code was allowed, Astra wrote a Python block and the authors’ sandbox ran it. [27] The headline target is Qwen3.5-0.8B, a 0.8-billion-weight open model that can write out its reasoning before it answers (“thinking mode”). MATH-500 is a 500-problem mathematics benchmark.
The video’s first practical rule is about method: before you read a benchmark jump as new intelligence, identify which failures disappeared. Here, 576 of the 579 rescued practice answers (99.5%) had been cut off at the output limit before the edit, after repetitive reasoning. The gain holds under the measured protocol. “Six times smarter” claims more than that measurement supports, because the protocol measures finished, graded answers. [22] [2] [3]
Write an algorithm into weights
With the architecture and game rules in hand, reason out a policy and encode its operations in neurons. This can start from an all-zero network.
Alter a learned computation
Inspect a pretrained model, find a recurring failure, propose a small intervention, and test whether it fixes that behavior without damaging useful behavior.
Three published responses to test against the data
Simon Willison separates two questions the post combines: what a model can do with raw weights and no tools, and what a model armed with code can do to another model. Willison then showed that a laptop model, Qwen 3.8 27B, named 3 of 4 games from the same prompts. [19] Matthew Honnibal calls the post misleading on this point: raw weights in the prompt appear only in Experiments 1, 2 and 4, on networks of 17,253 to 171,664 weights, and every experiment on a real language model uses Python. [20] Sean Goedecke argues that a competent human researcher could do the same tasks, and that the game test reduces to a three-line norm calculation. [21] Section 02 reruns that calculation on the released weights, and sections 04 to 08 check the other claims against the logs.
Evidence labels throughout: “reported” refers to the authors’ measurements; “real data” means this page computed the values from a released file; “derivation” is mathematical explanation; “illustration” denotes a teaching example, not a reconstruction of their model.
Weights are a program’s numerical machinery
A weight is a numerical parameter used in a network’s computation. A bias is an additive parameter; both belong to the parameter collection. An activation is an intermediate value produced for a particular input. Weights usually persist across inputs; activations change with the input. A multilayer perceptron (MLP) is a stack of layers of the kind defined next. A policy network maps a game observation to one score per action. PPO (proximal policy optimization) is a reinforcement-learning algorithm that trains such a policy from experience of playing.
Let x be an input vector, W a weight matrix, b a bias vector, h a hidden activation, and φ a nonlinear function such as ReLU, which replaces negative values with zero. One layer computes:
A forward pass evaluates this computation through the network. A gradient tells us how a loss—a numerical error measure—changes with each parameter. Let θ denote all model parameters, L the loss, η the step size, and ∇ the gradient operator. A basic training update is:
For a WSP edit, let Δ be the change designed by the LLM. Then the update is simply θ′ = θ + Δ. The difficult work is choosing a meaningful Δ: for instance, implementing a paddle controller or changing a particular direction written into a language model’s internal state.
| Method | What changes? | Where does the change come from? |
|---|---|---|
| Prompt engineering | Input text | Instructions and examples |
| Fine-tuning | Model parameters | Training loss and an optimizer |
| LoRA | A low-rank parameter update | Usually gradient-based training; LoRA means low-rank adaptation |
| Activation steering | Intermediate values during execution | A chosen intervention applied when the model runs |
| Weight-Space Programming | Persistent parameters | An LLM’s proposed numerical construction or repair, sometimes tested with feedback |
No gradients does not mean no optimization. The Qwen experiment iterates over candidate edits using practice results. At the system level, it is a feedback-driven search over interventions. “No training” means no target-model training procedure was allowed in this experiment. The editor’s own prior training, the target’s pretraining, evaluation compute, and human-designed tools still matter.
How can numbers reveal behavior?
Experiment 1. The authors trained PPO policies on their own 10 × 10 grid versions of four games. All four networks have the same shape (500 → 32 → 32 → 5, tanh, 17,253 weights), the same 5 input channels per cell (agent, moving objects, reward targets, obstacles, previous frame), and the same 5 actions. Astra received one network per conversation: the channel and action meanings, and all the weights as text rounded to 3 decimals. No game was named and no candidate list was given. It had no tools and one reply. It named a correct game for 4 of 4 networks. [4]
Three limits apply to that 4 of 4. The Freeway answer was “Frogger”, which the scorer maps to Freeway by keywords. Each network is the best of 3 seeds for its game. Four networks do not estimate an accuracy rate.
The prompt gives the numbers a coordinate system. Input i = (row × 10 + column) × 5 + channel. So input 405 is row 8, column 1, channel 0. Astra quoted weights of 4.066 and −4.013 for that input, and the released file holds those two values. If many strong connections read the player channel along the bottom row and the outputs separate left from right, a paddle controller is a plausible explanation. This is inference from structure, not a general decoder that translates arbitrary weights into English.
A symmetry that makes this difficult
Let W₁ and W₂ be the input and output matrices of a hidden layer, with biases omitted. Let P be a permutation matrix that reorders hidden neurons. For an elementwise activation φ, define new matrices W₁′ = PW₁ and W₂′ = W₂Pᵀ, where superscript T denotes transpose. Then:
The network’s function is unchanged even though many weight positions move. Raw coordinates are not a unique description of a learned function. Reliable interpretation must track relationships rather than attach permanent meanings to neuron numbers.
What survives the symmetry when inputs are labeled
Let ej be the vector with a one in position j and zeros elsewhere. Then W₁ej is the column of W₁ that holds every weight leaving input j. A permutation matrix only reorders entries, so it keeps Euclidean length: PᵀP = I. Therefore:
The total weight leaving a labeled input has the same size under every reordering of the hidden neurons. This is why Experiment 1 is tractable: each input already names a cell and a channel, so one number per input gives a map of the board. The argument requires labeled inputs. Experiment 3 removes the input layer, so this map does not exist there. The released files store inputs as rows (h1 = tanh(x @ W1 + b1)), so the code below computes the same quantity as a row norm.
Name the game from the first layer
Pick a network by its ID. Each square is one grid cell. Brightness is the length of the 32 weights leaving that input; the initialization-scale floor is about 0.37. The orange outline marks a cell Astra quoted. Form your guess, then open the reveal.
actor/dense1/kernel in the network’s .npz file. Rows 0–9 run top to bottom. Bright cells show where the first layer learned to read; they do not show what the game is called.Reveal the game and Astra’s answer
| Network | Largest row, agent channel | Largest column, agent channel | Reward cells with norm above 1.0 | Geometry a script can report |
|---|---|---|---|---|
Breakout a9f535cc | 95.9% (row 8) | 32.9% (column 8) | 23, all in rows 1–3 | Agent stays on one row; targets form a band above it |
Pong dfc6cb65 | 24.1% (row 2) | 94.5% (column 1) | 0 | Agent stays on one column at the left edge |
Pac-Man bdf99279 | 17.1% (row 4) | 16.4% (column 5) | 17, across rows 1–8 | Agent roams; the agent panel shows a symmetric corridor pattern |
Freeway 0bbcc3ea | 25.6% (row 6) | 28.6% (column 4) | 8, all in row 1 | Columns 3–5 hold 75.7% of the agent channel; targets form one row at the top |
Shares are of squared norm. An even spread over the 8 playable rows would give 12.5% per row.
Reproduce the table: the NumPy recipe
import numpy as np
d = np.load("a9f535cc.npz") # exp1_which_game/networks/ in the logs
W1 = d["actor/dense1/kernel"] # 500 x 32, inputs as rows
norms = np.linalg.norm(W1, axis=1).reshape(10, 10, 5)
agent = norms[:, :, 0] ** 2
print("share per row:", np.round(agent.sum(axis=1) / agent.sum(), 3))
print("share per col:", np.round(agent.sum(axis=0) / agent.sum(), 3))What this shows and does not show. Goedecke published this same norm calculation and its heatmaps as the case that the task is within a person’s reach. [21] The table supports part of that case: a script with no game knowledge finds a one-row agent, a one-column agent, and a band of targets. The script does not name a game. That final step needs knowledge of what small grid games look like, and Astra supplied it in 833 to 1,034 reasoning tokens. The logs do not establish how: the released reasoning summaries quote individual weights and patterns, and they do not show a norm calculation.
The same prompts on other models
Willison ran the released prompts unchanged on other models, one run per prompt. [19]
| Model | Breakout | Pong | Pac-Man | Freeway |
|---|---|---|---|---|
| GPT-6 Astra (hosted) | Correct, 99%, 107 s | Correct, 96%, 83 s | Correct, 96%, 71 s | “Frogger” (scored correct), 97%, 71 s |
| Qwen 3.8 27B (17 GB file, on a laptop) | Correct, 88%, 52 m 25 s | Correct, 75%, 1 h 4 m 54 s | Correct, 72%, 46 m 12 s | Wrong: “Pac-Man-like grid game” |
| Kimi K3.1 Pro (via OpenRouter) | Correct, 9 m 41 s | Not reported | Not reported | Not reported |
On Pac-Man, Qwen 3.8 used 43,506 reasoning tokens against Astra’s 1,034, about 42 times as many. Elapsed times are not comparable, because the hardware differs. So the ability to name these games from weights is not limited to one hosted frontier model, on this evidence of 3 correct answers in 4 runs. Two details of the Qwen answers need a check against the files. They describe an “8×8” board, which matches the playable interior of the 10 × 10 grid in the prompt. The Pong answer places the paddle on the right side, while column 1, at the left edge, holds 94.5% of the agent channel: the game name is right and that detail is wrong. Willison’s judgment is that a sufficiently experienced person with a notepad and a pencil could get there with enough effort.
Experiment 2: a diffusion model’s output layer
A diffusion model generates an image by removing noise step by step. The authors trained three such models (DDPM, MLP 160 → 64 → 64 → 144, ReLU, 23,824 weights) on filled circles, filled squares, and filled triangles at 12 × 12 pixels. Astra received all the weights as text and an instruction not to compute any forward pass. It named the right shape for 3 of 3 models at 84%, 77% and 88% confidence. It also described every shape as a hollow outline. A shape classifier sorted 99.4%, 98.4% and 100% of 1,000 generated samples into the intended shape, and those samples are filled. [5]
W3 as 12 × 12 images (teal positive, orange negative), Astra’s drawing from its answer, and one sample the model generates. Only the top 3 of 64 units per model are shown. Several pair an orange edge with a teal patch beside it. The generated shapes are solid.The post says each hidden unit’s output weights draw one piece of the shape’s edge. Fig. 2 supports the edge and adds a detail: a pixel value of −1 is black and +1 is white, so an orange edge writes dark pixels, and in several of these units a teal patch beside it writes bright ones. A patch next to an edge is compatible with a solid shape, which the outline drawings omit. This is a visual reading of 9 of the 192 output units, so treat it as a lead and not a measurement. The authors read the outline error as evidence that Astra reads weight geometry and does not simulate the network. That is their inference from one kind of mistake on three models.
Experiment 3: no labeled inputs, Python allowed
The third test removes the labels. Three character-level language models (4 layers, 6 attention heads per layer, 7.16 million weights) were trained on Python code, Japanese in Latin letters (romaji), or English Wikipedia. Astra received only the four middle blocks, 7,084,032 numbers, loaded in a Python sandbox rather than pasted into the prompt. It could compute linear algebra on the matrices, used 6 to 11 of 100 allowed runs, and could not run the network or any layer on any input. It was told the three candidate texts and asked which applied, and what each head does. [6]
A copying (induction) head is an attention head that finds an earlier occurrence of the current text and attends to what followed it. The authors measured each head by running the network on a random 40-character string repeated twice. Astra never saw this measurement.
eval/heads.json. Teal cells exceed the cutoff. Orange outlines mark the heads Astra labeled “copy” in both of its conversations, from eval/scores.json.Move the cutoff in Fig. 3 and read the match. At the post’s cutoff of 0.2, Astra named exactly the 5 measured copying heads, in both conversations for each network. The result does not depend on the exact cutoff: measured scores fall into two groups, at most 0.019 and at least 0.220, so any cutoff between them returns the same 5 heads. The logs’ own scoring field true_copy_heads uses 0.3 instead, which keeps only 2 of the 5 heads; the experiment’s README documents this difference. [6]
The language answer is weaker evidence than the heads. Astra was correct for all 3 networks, but this is a choice among 3 stated candidates, and its stated probabilities were 0.48 to 0.62. A uniform random guess would get all 3 right 3.7% of the time ((1/3)³), and the two conversations per network are not independent draws. The authors note that Astra’s method matches Elhage and colleagues’ framework, which the prompt did not mention. [25]
Experiment 7: the case where weights alone failed
The authors fine-tuned pairs of Gemma 3 270M, a 270-million-weight model, in the same way. One copy learned to give the correct answer. The other learned sycophancy: following the user’s suggested answer even when it is wrong. In four attempts with weights and Python, Astra could not tell them apart. Attempts 1–3 answered P = 0.5 for every pair, with “A” as a forced tie-break. The authors stopped attempt 4 after 29–30 runs per pair, with one pair finished. [10]
Astra then received a tool that runs both models on up to 16 texts of its choice and returns only the attention patterns, meaning how strongly each position attends to each other position. It picked the sycophant in all 3 pairs, at 90%, 97% and 55% confidence. In one measurement, from pair 2 over 8 texts, head 10.2 of the honest model puts 94.3% of its attention on the question’s numbers and 0.75% on the user’s answer; the sycophant puts 3.5% and 85.7%. One fact changes how to read this test: the unedited starting model already follows every wrong guess. So the sycophant keeps the starting behavior, and the honest fine-tune is the copy that learned something new (it follows 0.7% to 2.8% of wrong guesses). [10]
All eight experiments, sorted by what Astra could access
| Experiment | Weights | Weights in prompt? | Python? | Runs the target? | Reported outcome / limit |
|---|---|---|---|---|---|
| 1. Identify a game | 17,253 | Yes | No | No | 4/4 game identities; best seed per game; one “Frogger” mapped to Freeway [4] |
| 2. Identify generated shapes | 23,824 | Yes | No | No | 3/3 shape categories; described outlines although the models generate filled shapes [5] |
| 3. Identify training language | 7.16M | No | Yes | No | 3/3 from 3 stated candidates at 0.48–0.62; all 5 copying heads named [6] |
| 4. Repair a car policy | 171,664 | Yes | No | No; one recorded episode shown | 1,024/1,024 test episodes after changing 6,073 weights (3.54%) [7] |
| 5. Write game policies | 20,486 | All zero | No | No | Beats PPO at 100M steps in 3 of 3 games; beats PPO at 500M steps in 1 of 3 [8] |
| 6. Write a Go policy | 1,480,274 | All zero | Yes | 0–50 passes | 54.1% and 54.9% wins at 0 passes; 84.0% and 80.8% at 50 passes [9] |
| 7. Identify sycophancy | 270M | No | Yes | No, then attention only | Weights alone failed in 4 attempts; attention tool gave 3/3 [10] |
| 8. Improve math outputs | 0.8B | No | Yes | 10, 25, 50 passes | MATH-500 7.9% → 48.1% at 50 passes; Gemma follow-up 6.8% → at most 7.7% [2] [11] |
The access columns follow Honnibal’s table [20], checked here against each experiment’s README. Raw floats in the prompt with no tools occur in Experiments 1, 2 and 4 only. The larger the network, the more the result depends on code and on running the target. So the small-network results do not show that Astra read a 0.8-billion-weight model the same way.
Think “compile an algorithm into neurons”
In the writing experiment, Astra received MinAtar game source code and the input/output layout, then specified edits to an all-zero network. MinAtar is a set of small Atari-style games on a 10 × 10 grid. It had no opportunity to try the policy first. The network architecture was 600 → 32 → 32 → 6, with tanh hidden activations, totaling 20,486 parameters. The final reply used a compact weight-edit language, so Astra did not write out every entry: the Breakout reply has 92 statements and sets 815 of the 20,486 parameters (4.0%) to nonzero values, in 501 seconds. [8]
A tiny network you can understand completely
The following is our teaching example, not the authors’ policy. Let b be ball position, v horizontal velocity, p paddle position, and τ = 2 the prediction horizon. Ignore walls and collisions. Define the predicted target t = b + τv and error e = t − p. Two ReLU neurons encode leftward and rightward error:
For the input column vector x = (b, v, p)ᵀ, the first matrix has rows (−1, −2, 1) and (1, 2, −1). Its biases are zero. The output logits—unnormalized action scores—are 8hL for left, 0.2 for stay, and 8hR for right. Choose the largest logit.
Move the inputs. Watch the weights execute.
This deliberately simple controller does not play Breakout. It shows how an understood rule becomes matrix entries without any learning step.
Runnable NumPy version: the complete toy network
import numpy as np
# x = [ball position, horizontal velocity, paddle position]
W1 = np.array([[-1., -2., 1.], [1., 2., -1.]])
b1 = np.zeros(2)
W2 = np.array([[8., 0.], [0., 0.], [0., 8.]])
b2 = np.array([0., 0.2, 0.])
def policy(ball, velocity, paddle):
x = np.array([ball, velocity, paddle])
h = np.maximum(W1 @ x + b1, 0)
logits = W2 @ h + b2
return ["left", "stay", "right"][int(np.argmax(logits))]
assert policy(5, 1, 3) == "right"
assert policy(3, -1, 5) == "left"
assert policy(5, 0, 5) == "stay"
print("All three toy checks passed.")What the actual game scores establish
| Game | PPO, 100M steps | PPO, 500M steps | Astra, one reply |
|---|---|---|---|
| Breakout | 15.8 | 25.3 | 517.4 |
| Seaquest | 5.6 | 88.9 | 53.1 |
| Asterix | 25.8 | 55.2 | 53.2 |
Reported mean scores over 1,000 episodes per policy, with sampled actions and sticky actions at 0.1. The table uses the authors’ best trained seed for each baseline. [8]
Against 500M-step PPO, Astra’s network scores about 20 times as much in Breakout (517.4 against 25.3), 96% as much in Asterix, and 60% as much in Seaquest. So the video’s point stands that knowing the rules does not guarantee the better player. The result demonstrates useful neural program construction. It is not an equal-information contest: the editor has explicit source code and extensive prior knowledge, while PPO learns through interactions. An additional baseline would separate those effects: a human-written controller compiled into the same architecture under the same information access. Goedecke notes that people have already written small networks by hand, such as the AdderBoard challenge. [21] [28]
Experiment 4: a repair that adds a small program
Kinetix is a physics-control environment. The task is a car that must back up, then drive fast enough to jump a red strip. The trained policy (171,664 weights, PPO, about 1 billion steps) never succeeded in 256 episodes: it drives onto the ramp and stalls. Astra received all the weights as text, the scene, and one recorded episode, with no tools and one reply. It wrote 51 edit statements. The edited policy succeeded in 1,024 of 1,024 test episodes. [7]
The 3.54% figure describes a structural change. Astra took over a few units per layer, set their rows and columns to zero, and wired a separate path that reads position and speed, reverses from rest, switches to full drive at body x ≈ 3.8, and turns off once the green wheel passes x = 0.95. Most of the 6,073 changed entries are those zeroed rows and columns. The trained network keeps control after that point. So the repair is a short hand-written controller placed inside the weights. It does not retune what the policy learned.
Experiment 6: writing past the size of the prompt
A 9 × 9 Go network (243 → 512 × 6 → 82, ReLU, 1,480,274 weights) does not fit in a prompt. Astra wrote it through Python from all-zero tensors, with no training, no fitting to data, and no search. A pass let it play up to 128 games against practice opponents or inspect up to 256 positions. Each budget was run once. [9]
| Passes allowed | Python runs | Wins vs small PPO, seed 0 | Wins vs small PPO, seed 2 | Wins vs same-size PPO, seeds 0 / 1 / 2 |
|---|---|---|---|---|
| 0 | 1 | 54.1% | 54.9% | 42.6 / 26.3 / 36.3% |
| 10 | 17 | 72.9% | 60.0% | Not reported |
| 25 | 30 | 76.0% | 62.3% | Not reported |
| 50 | 39 | 84.0% | 80.8% | 74.2 / 70.0 / 78.5% |
Win rates over 2,000 games per opponent. The post’s chart shows only seed 0 of the same-size baseline; all three seeds are listed here.
The 50-pass run used 47 game passes, so it saw at most 47 × 128 = 6,016 games. The same-size PPO baseline trained on 20.5 million games, about 3,400 times as many. That ratio compares different things: Astra starts with general Go knowledge and writes rule code, and PPO starts from nothing. The zero-pass run shows what prior knowledge alone reached: a single 336-line Python run that won 54.1% and 54.9% against small PPO networks and lost to all three same-size PPO networks.
How a loop repair became a math-score jump
The target was the text component of Qwen3.5-0.8B, with 24 layers. Astra could inspect and change weight tensors in a persistent CPU Python session, with at most 300 code runs. A controlled tool executed generations or returned internal measurements. Gradient descent, any fitting of weights to a loss, and running the model in the kernel were forbidden. The editor did not read 0.8 billion decimal numbers in its prompt. It wrote code to inspect selected tensors and propose changes. [2]
- Diagnose the failure. Inspect representative generations. The initial batch had 85 of 96 answers reaching the 32,768-token output cap and 11 of 96 correct, and about 95% of the phrases at the end of cut-off answers were duplicates.
- Construct a contrast. Compare productive and repetitive continuations of matched contexts, from four matched pairs. A teacher-forced read evaluates supplied text instead of sampling a new continuation.
- Locate candidate writers. Find internal directions associated with repetition and MLP components that strongly write along them. Here the MLP is the feed-forward block within a model layer.
- Intervene and test. Try different strengths and sites. The records include layer-isolation tests and a norm-matched random-direction control, which test causation more directly than a correlation does.
- Freeze the candidate. Retain a sparse edit in the MLP output matrices of layers 15 and 19. Confirm it on practice problems excluded from edit selection, then evaluate separate benchmarks.
The sequence above summarizes the released p50c records; it is not a complete transcript of the search. Layer numbers follow the code’s zero-based indexing. [3] [12]
The editor’s kernel had no GPU, but target-model execution occurred through the forward tool. This does not establish that the whole experiment was CPU-only or computationally cheap. The recorded p50c wall time was 20.3 hours, including a 4.7-hour service interruption. That is historical run information, not an estimate for your machine.
The 17 edits of the 50-pass run, in order
| Turn | What Astra did |
|---|---|
| 10 | Switches off neuron 11 of layer 19, the strongest writer of the loop, as a probe |
| 13 | One neuron helped (+6 points); removes the loop direction from all of layer 19’s MLP |
| 26 | Removes the direction from the MLPs of layers 15 and 19 |
| 48 | Strength 1 gained 12.5 points on 256 answers; doubles the strength |
| 51 | Strength 2 gained 24.6 points; tries strength 3 |
| 60 | Generation will not start; tests two copying attention heads at half output |
| 64 | The head test never ran; restores strength 1 |
| 68 | Strength 1 makes looping text less likely on new examples; tries strength 2 |
| 72 | Strength 2 holds on new problems (8.2% → 43.0%); tries strength 3 |
| 76 | Strength 3 reaches 48.0% with no answers lost; tries strength 4 |
| 88 | Control: a random direction of the same size |
| 92 | The control gains +1.6 points; restores strength 4 |
| 94, 96 | Tests layer 15 alone, then layer 19 alone |
| 98 | Edits only the 64 neurons per layer that write the loop most |
| 103 | The 64 neurons gained 26.6 points; switches back to the full edit to compare |
| 105 | The full edit gained the same; keeps the 64 neurons at strength 6, its final edit |
Condensed from the post’s run viewer. [1] Two steps failed for harness reasons, which shows the search was not a straight line.
Dose and control
| Intervention | Change in log-probability of repetitive text, nats per token | Productive text |
|---|---|---|
| Full direction, strength 1 | −0.02410 | Reported as “barely changed” |
| Full direction, strength 2 | −0.04870 | |
| Full direction, strength 4 | −0.10372 | |
| Final edit: 64 columns per layer, strength 6 | −0.10311 | −0.00903 |
A nat is a unit of log-probability. Doubling the strength about doubled the effect (2.0 times from strength 1 to 2, 4.3 times from 1 to 4). The final edit lowers repetitive text about 11 times as much as productive text. The random-direction control gained 1.56 points with a standard error of 3.52, so it cannot be distinguished from zero. [12] These measurements come from a small set of matched contexts inside the run, and Astra chose them.
Three budgets, three different edits
| Passes | Final edit | Astra’s own held-out practice gain | MATH-500 | Cap rate |
|---|---|---|---|---|
| 10 | Rank-one removal of repetition directions from 30 attention and MLP matrices, layers 8–22, strength 1.5 | +3.71 ± 1.79 (n = 512) | 12.3% | 87.2% |
| 25 | Zeroes attention head 7 of layer 15 (256 columns) | +8.33 ± 1.43 (n = 768) | 14.1% | 86.4% |
| 50 | Direction removal from 64 MLP columns each in layers 15 and 19, strength 6 | +49.83 ± 1.50 (n = 1,152) | 48.1% | 33.1% |
Each budget is one run, and the three runs reached three different mechanisms. [29] [30] [12] So the table cannot separate the effect of more passes from run-to-run variation in the search, which matches the video’s point that one run reached 48% and each ran once. The results table in the logs adds other Qwen rows that the post does not report: two runs that submitted no edit under v2 and v3 prompts (0 and 5 passes), a v4 prompt at 10 passes (no edit, 7.9%) and at 25 passes (14.1%), and two candidates that were evaluated but not submitted (8.6% and 10.1%). Four v5 rows have no scores. No row other than the 50-pass run exceeds 14.1%, and the table holds no second 50-pass score. [26]
A sparse, rank-one intervention at each site
The residual stream is the running hidden-state vector to which model blocks add their outputs. For one edited MLP, let a be its 3,584-dimensional hidden activation and W its 1,024 × 3,584 output matrix. Its contribution is y = Wa. Column j of W says what direction hidden neuron j writes into that 1,024-dimensional state. [13]
What is a “repetition direction”?
It is a vector in internal activation space, not an English instruction and not necessarily one neuron. As a pedagogical construction, let μrep and μprod be the mean hidden states for repetitive and productive contexts. A normalized contrast direction u can be defined by:
Here ‖·‖₂ is Euclidean length. This equation explains a standard contrast idea; it is not a claim that this single line reconstructs the exact released edit. The final report says the run used four matched contexts and layer-specific unit directions measured at residual outputs 16 and 20. The intermediate activation files and direction files are not included. [12]
The actual final formula
Let m be a vector with 64 entries equal to one and all other entries zero, selecting MLP columns. Let ⊙ denote entrywise multiplication and α the edit strength. With a layer-specific u and m at each site, the logged final edit is:
The outer product of a column vector and a row vector has rank at most one: its changes all lie along one output direction. The mask makes the change sparse across columns. “Rank-one” describes the structure of the update, not the number of entries it touches. The formula applies before the evaluated checkpoint is rounded to bfloat16, a 16-bit numerical format. [12] [14]
Strength 6 reverses and amplifies; it does not erase
For a selected output column w, write w = w⊥ + cu, where w⊥ is perpendicular to the unit vector u and c = uᵀw. The edited column is:
At α = 1, the selected column’s component along u disappears. At α = 2, it reverses with equal magnitude. At the actual α = 6, it becomes −5cu: reversed and five times as large. The video says “remove” and the post says “subtracted”; both describe the operation, and neither states this end result. This is a derivation from the logged formula. It does not imply the entire model state is projected or globally reversed; unselected neurons, other blocks, and nonlinear dynamics remain.
See what the edit strength actually does
Choose coordinates with u vertical. The original column is w = (2, 1). Its perpendicular component is (2, 0). Values are illustrative.
The slider shows exact linear algebra for one column. It does not simulate Qwen’s output or predict benchmark accuracy.
How small is “0.016%”?
Two layers × 64 columns × 1,024 rows = 131,072 targeted scalar entries. Dividing by the model’s rounded 0.8-billion parameter label gives approximately 0.0164%. The exact released bfloat16 diff has 130,188 entries with changed bits; 884 targeted values round back to their originals. Thus “targeted entries” and “numerically changed entries” are slightly different counts. [14]
Count is also different from magnitude. The two edited matrices change by about 10.64% and 8.11% in relative Frobenius norm—the square-root-of-sum-of-squares measure of matrix size—while the edit touches 0.0164% of the parameters. The headline percentage uses an approximate denominator; it should not be treated as an exact universal parameter fraction. [13]
A real gain with a specific causal story
Different budgets are separate search runs. These bars are not a learning curve from repeated checkpoints of one run. [2]
| Qwen run | MATH-500 | GSM8K | IFEval | MATH-500 cap rate |
|---|---|---|---|---|
| Base | 7.9% | 13.8% | 21.0% | 93.0% |
| 10-pass edit | 12.3% | 25.7% | 49.0% | 87.2% |
| 25-pass edit | 14.1% | 25.1% | 39.9% | 86.4% |
| 50-pass edit | 48.1% | 67.1% | 62.3% | 33.1% |
MATH-500 is a 500-problem mathematics evaluation; GSM8K contains grade-school math word problems. IFEval tests compliance with verifiable instructions. MATH-500 values average four generations per problem; GSM8K and IFEval average two. These are mean accuracies, not “at least one successful answer out of four.” [2]
The MATH-500 increase is 40.2 percentage points, or approximately 6.09 times the baseline score. The ratio is sensitive to how badly the baseline fails: on MMLU-Pro, where the base model hits the cap on 28.9% of answers, the score moves from 40.3% to 45.5%, a ratio of 1.13. Both models used thinking mode, temperature 0.6, top-p 0.95, top-k 20, presence penalty 1.5, and a 32,768-new-token cap.
| Benchmark | Accuracy, base → 50-pass | Cap rate, base → 50-pass | Mean tokens, base → 50-pass |
|---|---|---|---|
| MATH-500 | 7.9 → 48.1% | 93.0 → 33.1% | 30,868 → 22,037 |
| GSM8K | 13.8 → 67.1% | 87.5 → 7.2% | 29,289 → 11,993 |
| IFEval | 21.0 → 62.3% | 74.9 → 2.2% | 25,296 → 4,241 |
| AMC23 | 0.5 → 23.4% | 99.5 → 50.5% | 32,680 → 27,465 |
| Minerva Math | 1.5 → 25.4% | 98.2 → 25.8% | 32,302 → 22,486 |
| OlympiadBench | 1.3 → 21.8% | 98.7 → 46.7% | 32,485 → 26,680 |
| MMLU-Pro (1,000 questions) | 40.3 → 45.5% | 28.9 → 0.5% | 13,706 → 7,559 |
| GPQA Diamond | 22.7 → 36.6% | 59.5 → 2.4% | 23,193 → 12,261 |
| AIME 2024 | 0.0 → 0.6% | 100 → 65.2% | 32,768 → 29,259 |
| AIME 2025 | 0.0 → 2.3% | 100 → 64.6% | 32,768 → 29,408 |
From the merged.json files. [31] The two AIME rows are not in the post. The post’s figure shows GPQA Diamond’s base score as 24.5, an interim value at 149 of 198 questions; the finished score is 22.7. [2]
The AIME rows test the claim directly. These harder competition problems saw about a third of answers finish that had not finished before, and accuracy reached only 0.6% and 2.3%. Finishing does not supply the ability to solve them. Across the table, the cap rate falls on all ten benchmarks, and the accuracy gain varies from 0.6 to 53.3 points.
An independent re-run of the frozen checkpoint. Ahsen Khaliq rebuilt the edit from the logs, verified its hashes, and ran the full MATH-500 protocol (500 problems × 4 samples, seed 0) on the public checkpoint. The edited model scored 51.0% with 31.6% of answers hitting the cap, against the post’s 48.1% and 33.1%: 2.9 points higher on accuracy. A 25-problem smoke test of the base model gave 5.0% with 95% hitting the cap. [23] This re-run checks the evaluation of one frozen edit. It does not repeat Astra’s search.
Completion and correctness are different quantities
Let F be the event that an answer finishes before the cap, and C the event that it is graded correct. The exact identity is:
The symbol ¬F means “did not finish before the cap,” and P denotes probability. A cut-off response can still contain an extractable correct answer, so its contribution must not automatically be set to zero. In particular, 7.9% accuracy with only 7.0% finishing proves that “all truncated answers are wrong” is inconsistent with these aggregate measurements.
When the second term is small, improving the completion rate can substantially raise measured accuracy even without a comparable improvement in mathematical knowledge. But finished answers form a selected subset: easy questions may finish disproportionately. Comparing correctness conditional on finishing is diagnostic, not a clean experiment isolating “pure reasoning.”
The strongest supporting practice result
| Quantity | Original | Edited |
|---|---|---|
| P(F): finished before the cap | 114 / 1,152 = 9.90% | 940 / 1,152 = 81.60% |
| P(C | F): correct, given finished | 107 / 114 = 93.86% | 695 / 940 = 73.94% |
| P(C | ¬F): correct, given cut off | 15 / 1,038 = 1.45% | 1 / 212 = 0.47% |
| P(C): identity above | 122 / 1,152 = 10.59% | 696 / 1,152 = 60.42% |
submission_evidence.json. The grey band shrinks from 1,023 to 211. The orange and amber bands grow from 7 to 245: a new group of answers now finishes and fails.The practice evidence. The 1,152 confirmation problems were excluded from edit selection, and no problem overlaps the 352 used earlier in generation-based selection. The records report 579 rescues (wrong before, correct after) and five regressions (correct before, wrong after). Of the rescues, 576 were originally truncated. On the 114 originally finished outputs, accuracy was 93.86% before and after, with three rescues and three regressions. The pooled gain is 49.83 points with a standard error of 1.50 and a 95% normal interval of 46.89 to 52.76 points; the five independent splits gain between 46.9 and 55.1 points. These are held-out practice results, not unseen benchmark scores. [3]
How far “already knew the answer” goes. The video summarizes the edit as letting the model finish answers it already knew how to solve. Among the 1,038 originally truncated problems, 589 became correct (56.7%) and 449 did not (43.3%). Accuracy among finished answers falls from 93.86% to 73.94%. That fall is not damage, because the problems that finished before keep their 93.86%. The likely cause is selection: easier problems finished first, and the originally truncated problems reach 56.7% correct after the edit. The logs do not measure difficulty directly. A footnote in Goedecke’s post, that all problems under the limit were solved, comes close but is not exact: 107 of 114 finished answers were correct. [21] The logs also cannot show that the 589 solutions were present before the edit, because the unedited model never wrote them. The edit can change the whole subsequent reasoning trajectory, and median tokens in correct answers rose from 5,310.5 to 9,171.5. “No new capability was demonstrated” is better supported than the universal claim “weight editing cannot ever add capabilities.”
A bound for the benchmark. The second term of the identity is not negative, so P(C | F) ≤ P(C) / P(F). On MATH-500 after the edit, this gives at most 48.1 / 66.95 ≈ 72%. So at least about 28% of finished MATH-500 answers are not correct. The benchmark files store the cut share per job, not per sample, so this page reports the bound and not the exact value.
What the model card changes
Qwen’s card states that this model runs in non-thinking mode by default, and warns that in thinking mode, “when using the recommended sampling parameters”, it is more prone to thinking loops than other Qwen3.5 models. The text-thinking recommendation is temperature 1.0. Temperature controls the sharpness of token sampling; lower values concentrate probability on the most likely tokens. The experiment used 0.6, and separate research reports greater looping at low temperatures, while noting that higher temperature does not solve the underlying learning errors. [15] [16]
Two more lines of the card narrow that point. The card’s own thinking-mode benchmark table uses the same settings as the experiment, including temperature 0.6 and presence penalty 1.5, so 0.6 is not an unusual choice. And the warning concerns the recommended parameters, so temperature 1.0 is not reported to remove the loops. The card’s example also allows 81,920 output tokens, 2.5 times the experiment’s 32,768 cap. None of these settings was tested against the edit in the released runs. [15]
A larger token cap could help a long but productive solution. An endless loop may simply consume the larger budget. Changing mode, sampling, stopping, or weights can each alter the outcome; measure accuracy, completion, and compute together.
Gemma: a useful negative result with caveats
The Gemma 3 270M follow-up started at 6.8% MATH-500 and reported 7.0%, 7.6%, 7.7%, and 7.0% after budgets of 5, 10, 25 and 50 passes. Astra’s final answers in three of the four runs reported the gain as not established. It had a much lower cap rate, 8.5%, consistent with fewer looping failures to repair. Astra’s notes describe ordinary reasoning errors, such as wrong arithmetic and invalid algebraic steps. [11]
Four other Gemma runs in the results table, which the post does not report, scored 6.7%, 6.7%, 6.1% and 6.2% on the same scale. [26] So across eight runs the range is 6.1% to 7.7% around a 6.8% base. Gemma is not a controlled clone of Qwen: size, architecture, generation settings (no thinking mode, temperature 1.0, 8,192 tokens), and prompt version differ. Its headline scores use a format-tolerant extractor, and under the strict boxed-answer rule that Qwen’s scores use the base is 2.8%, with reported runs at 3.5%, 3.1%, 3.8% and 2.6%. The authors conclude that editing “could not add an ability the model lacked”. The evidence for that is this one model. It limits the demonstrated claim; it does not prove a theorem about what WSP can never do.
Learn the mechanism, then test the claim
Path A — Five minutes, no model download
- Set the direction slider to 0, 1, 2, and 6. Explain the change in the selected column’s parallel component.
- Run the toy NumPy controller above. Replace all weights and biases with zero and observe that all actions tie. Restore the designed parameters: the rule reappears without training.
- Open the final report and exact diff manifest. Check the formula and two changed tensors yourself.
- Use the recipe in section 02 on a network from
exp1_which_game/networks. Confirm the 95.9% in row 8.
Path B — Repeat the game test on your own model
Each prompt is a self-contained text file, so any model with a long enough context can take it. The commands below are the ones Willison used, with the LLM command-line tool and LM Studio. [19]
llm install llm-lmstudio
LMSTUDIO_TIMEOUT=900 llm \
-f https://raw.githubusercontent.com/RikiyaT/lm_understand-logs/refs/heads/main/exp1_which_game/runs/pacman/prompt.txt \
-m lmstudio/qwen/qwen3.8-27b
Set the context window above the prompt size: Astra’s input count was about 73,700 tokens, and Willison reports that an 8,192 context failed with errors. The Qwen runs in that post took 46 minutes to 1 hour 5 minutes. Replace pacman with breakout, pong, or freeway. The URL names the game; the prompt text does not.
Path C — Reconstruct the published parameter edit
This replays the final artifact; it does not rerun Astra’s discovery process. To skip the rebuild, use the published edited checkpoint or the hosted demo, which shows the base and edited models side by side. On Windows, use Git Bash. First clone the logs, create an isolated Python environment, and install NumPy:
git clone https://github.com/RikiyaT/lm_understand-logs.git
cd lm_understand-logs
git rev-parse HEAD
python -m venv .venv
source .venv/Scripts/activate
python -m pip install numpy
Record the printed repository commit. Download the original model.safetensors from the pinned Qwen revision 2fc06364715b967f1860aea9cf38778875588b17 using the model’s file browser. Put it in a new base-qwen folder. Then run the authors’ reconstruction script:
python exp8_math/code/apply_edit.py \
base-qwen/model.safetensors \
exp8_math/runs/p50c/edit \
edited-qwen.safetensors
The script checks the base tensor hashes and rebuilt tensor hashes. Expect two “hash OK” messages. It supports the public single-file release and needs no PyTorch for reconstruction. A hash mismatch means the input is not the expected revision; do not bypass the check. [17]
Reconstruction works on CPU and needs the base weights, output storage, and RAM for the arrays. Allow several GB of headroom. On macOS/Linux, activation is source .venv/bin/activate. The command above follows the authors’ script interface; this tutorial did not download or execute the full Qwen checkpoint.
A weights file alone is not a complete runnable model folder. For inference you also need compatible configuration, tokenizer, chat template, and a runtime supporting this Qwen architecture. Do not overwrite a configuration with the wrong architecture. Reconstructing exact tensors verifies the patch; generating answers verifies behavior; rerunning the editor tests discovery reproducibility. These are three distinct tasks.
Path D — Test whether the edit earns its complexity
Use a fixed set of math problems that neither the editor nor your tuning process sees. Keep a development set for choosing settings. Evaluate both the base and edited checkpoint under every configuration below:
| Configuration | Why include it? |
|---|---|
| Thinking, temperature 0.6, 32,768 cap | Match the reported protocol |
| Thinking, model-card text sampling | Test the inexpensive sampling alternative |
| Non-thinking, model-card text sampling | Test the model’s default mode |
| Larger cap on a predefined subset | Distinguish insufficient time from persistent looping; compare actual tokens used |
Log each problem’s correctness, extracted final answer, whether thinking closes, whether the cap is hit, repetitive-tail rate, tokens, and elapsed time. Use several sampling seeds and report uncertainty over problems. Several samples of one problem are related observations, not several new benchmark questions.
For a paired comparison, let dᵢ equal edited correctness minus base correctness for problem i, averaging samples within a problem first. Let N be the number of problems, g the mean paired gain, and sd the sample standard deviation of the problem-level differences. A simple standard error is:
For stronger validation, resample whole problems in a paired bootstrap, and repeat independent editing searches. The first estimates uncertainty for a frozen edit on a problem population; the second measures whether the editing process reliably finds good patches.
Where the research frontier actually lies
Small edit ≠ small effect
A neuron writes to an entire hidden vector, and generation compounds many steps. A structurally small intervention can alter many downstream choices. Audit unrelated tasks and both thinking modes.
Correlation ≠ a unique mechanism
A contrast direction can carry several correlated features: repetition, uncertainty, position, or answer style. Counterfactual contexts and randomized controls help distinguish them.
Successful episodes ≠ repeated discovery
Thousands of evaluation episodes test one submitted policy. They do not establish the probability that a fresh editor run constructs an equally good policy. Budget comparisons have the same limitation.
Quantization can change the patch
The released diff reproduces a bfloat16 evaluation artifact. Applying the mathematical edit after low-bit quantization, or converting the result again, is a new intervention requiring new checks.
The connection to earlier interpretability work: Arditi and colleagues showed that a behavior can sometimes be mediated by a low-dimensional internal direction. WSP’s contribution here is that a general LLM organized the investigation, chose an intervention, and wrote the change. The underlying idea of directional intervention predates this result. A low-dimensional explanation for one behavior is not evidence that every behavior has a single removable direction. [18]
The human-baseline argument. Goedecke lays out the same steps as a playbook a researcher would try, comparing it to the Heretic “abliteration” tool: write looping and non-looping texts, take the difference of their internal states, find the weights that contribute most, and trim them. The post’s analogy is that editing weights resembles tweaking a compiled binary, and that the better route stays training. [21] Honnibal reaches the same place from the access table: the Python experiments show tasks a human engineer could do. [20] No released experiment measures a human against Astra, so both claims are arguments and not results. What the logs do show is the time and the budget: 20.3 hours (4.7 of them an outage), 158 turns, and 50 passes at maximum reasoning effort, with Astra choosing the steps.
What the post projects, against what it measured
| Projection in the post | Closest measurement | Status on this evidence |
|---|---|---|
| Auditing without running the model | Experiment 7: 4 weights-only attempts failed on a 270M model; 3/3 needed attention patterns from running it | Shown on small labeled networks; failed in the one language-model test |
| Lower optimization cost | Experiment 5: 501–583 s per game on 20,486 weights. Experiment 8: 20.3 hours, with no cost figure against fine-tuning | Shown for one-shot small policies; not measured for language models |
| Zero-data capability steering and unlearning | Experiment 8 used 50 passes on practice data; Gemma runs ranged 6.1–7.7% around 6.8% | Not demonstrated |
| Recursive self-improvement | No run edits the editor itself | Not tested |
| Grafting circuits across architectures | No experiment attempts it | Not tested |
A research interpretation: the use with direct support in these records is an automated neural debugger: form a failure hypothesis, inspect internals, propose a reversible patch, test controls, and retain only changes that survive independent checks. Whether such methods can efficiently install new skills in large pretrained models remains open. The authors say they are building a benchmark and harness for this question.
What this page does not establish
This page reruns no model. The labs recompute statistics from the released files of Experiments 1–3, and the numbers for Experiments 4–8 are copied from the released records. The logs release Astra’s reasoning only as summaries or as explanations the harness asked for, and some runs release neither, so claims about how it reasoned stop at what those records state. The logs were read as released, and nothing here audits whether a released file matches what ran.
Three checks for understanding
1. Did Astra read every Qwen weight as text?
No. The large-model experiment provided programmatic access to tensors and controlled model execution. Small-network experiments did put weights directly into the prompt.
2. Why can a sixfold benchmark ratio coexist with no demonstrated new math knowledge?
The original often exhausted its output budget. Recovering useful final answers on many of those cases raises scored accuracy. This supports repaired execution, while leaving the possibility of changes to reasoning trajectories open.
3. At α = 6, what happens to a selected column’s component along the unit direction?
Its coefficient changes from c to −5c. It is reversed and amplified. Only α = 1 erases that component in the column-level linear calculation.
4. Which experiments put raw weights in the prompt with no tools?
Experiments 1, 2, and 4, on networks of 17,253 to 171,664 weights. Experiment 5 also has no tools, but its weights start at zero, so there is nothing to read.
5. Accuracy among finished practice answers fell from 93.86% to 73.94%. Did the edit damage the model?
Not on this evidence. The 114 problems that finished before kept 93.86%. The finished group now holds 940 answers instead of 114, and the originally truncated problems reach 56.7% correct. Conditional accuracy compares two different groups of problems.
What’s next
A high-value solo experiment: build a small model-failure dashboard that compares base versus patched weights and separates accuracy, completion, repetition, and token cost. Start by asking whether tuned decoding recovers most of the apparent advantage. That makes a falsifiable contribution without first recreating the entire autonomous editor.
Sources and evidence trail
The research post and logs supply the experimental facts. The video supplies the critical framing and the two practical rules. Willison, Honnibal, and Goedecke supply the replication and the published critiques. Details were checked against the primary records below. Diagrams labeled “illustration” or “derivation” are explanatory constructions; labs labeled “real data” are computed from the named files. None is a source screenshot. This page does not claim its own rerun of the Qwen benchmark or editor.
- Takehi, Teoh, Zhang & Khattab — Sparks of Weight-Space Programming. MIT CSAIL research post, November 2, 2026. Definition and experimental overview.
- Experiment 8 README. Protocol, budget meaning, score provenance, run accounting, released and omitted material.
- p50c submission evidence. Paired practice confirmation, rescues, regressions, and descriptive outcome strata.
- Experiment 1: game identification.
- Experiment 2: diffusion-model shapes.
- Experiment 3: language and copying heads.
- Experiment 4: car-policy repair.
- Experiment 5: MinAtar policy construction. Baselines, source-code access, edit language, and scores.
- Experiment 6: Go policy construction.
- Experiment 7: sycophancy identification.
- Gemma follow-up README. Negative result and grading differences.
- p50c final report. Actual α = 6 formula, direction origin, controls, final confirmation.
- Frozen weights manifest. Shapes, selected neurons, relative matrix-change sizes.
- Exact evaluated diff manifest. 130,188 numerically changed bfloat16 entries.
- Qwen3.5-0.8B official model card. Default mode, thinking-loop warning, recommended decoding.
- Pipis et al. — Wait, Wait, Wait… Why Do Reasoning Models Loop? Temperature and looping; separate research, not a direct test of this edit.
- Authors’ apply_edit.py. Pinned base revision and bit-exact reconstruction interface.
- Arditi et al. — Refusal in Language Models Is Mediated by a Single Direction. Prior directional-intervention work.
- Simon Willison — Qwen 3.8 27B on my laptop can interpret model weights, too. November 3, 2026. Local replication of Experiment 1, commands, and timings.
- Matthew Honnibal — The ‘Astra can read and write weights to improve Qwen’ post is misleading. November 3, 2026. Access table across experiments.
- Sean Goedecke — LLMs are not superhuman at reading and writing neural network weights. November 3, 2026. Norm heatmaps and the human-baseline argument.
- Prompt Engineering — GPT-6 Astra Made Qwen 6x Better at Math Without Training. YouTube video and transcript. Key chapters: definition, network construction, Qwen, headline interpretation.
- Edited Qwen3.5-0.8B checkpoint on Hugging Face. Hash-verified rebuild and independent MATH-500 re-run by Ahsen Khaliq.
- Hosted demo. Base and edited models on a problem you type.
- Elhage et al. — A Mathematical Framework for Transformer Circuits. The matrix-composition method that matches Astra’s route in Experiment 3.
- Results table excerpt. Includes runs that the post does not report.
- lm_understand-logs repository. Harness description, the tool-free audit, placeholders, licenses, and all experiment folders.
- Papailiopoulos — AdderBoard. Community challenge in setting the weights of tiny arithmetic transformers.
- 10-pass final answer.
- 25-pass final answer.
- 50-pass and unedited evaluation scores. Accuracy, cap share, and mean tokens per benchmark.
Attribution: the repository states that its logs, data, and networks are CC BY 4.0 and its scripts are MIT-licensed; third-party material retains its own terms. The arrays behind the real-data labs in section 02 are derived from exp1_which_game/networks/*.npz, exp1_which_game/eval/scores.json, exp2_diffusion/networks/*.npz, exp2_diffusion/eval/samples/, exp2_diffusion/runs/*/answer.md, exp3_language/eval/heads.json, and exp3_language/eval/scores.json, rounded for size. This tutorial links to the originals and adds independent mathematical derivations, diagrams, a toy controller, and an evaluation plan.