GEMMA DEVELOPER AGENTSAVED EVIDENCE

← Weight change

Direct mathematical edit / wsp31-0039

Instruction pair vector: think briefly + be exact about what the issue asks, compiled self-consistently into one neuron per layer (dose 2)

Gemma 4 31B, frozen four-bit baseAuthor: claudeState: doneVerdict: null

When

Recorded date: 2026-11-14

Ledger date only; exact weight-build/change timestamp is not recorded here. Not a live training event.

Exact tensor-change timestamp: unavailable.

Why change it?

Where the failures are once thinking is shorter (batch x001, 120 stage-1 tasks; `code/x_stats.py`, `code/x_seq.py`). 0031 `icv-brief-b20` and 0032 `icv-brief-b40` write the mean stream shift of a "keep your thinking very short" paragraph at doses 2 and 4: | arm | solved | at the 10,000-token budget | empty patch | finished with a wrong patch | budget reached, wrong patch | |---|---|---|---|---|---| | unedited (two arms) | 72, 64 | 45, 46 | 21, 18 | 16, 19 | 11, 19 | | 0031, dose 2 | 77 | 32 | 13 | 17 | 13 | | 0032, dose 4 | 71 | 19 | 8 | 31 | 10 | Brevity moves episodes off the budget; what it leaves, and at dose 4 produces, is wrong…

Which part changed?

Instruction pair vector: think briefly + be exact about what the issue asks, compiled self-consistently into one neuron per layer (dose 2)

The source describes adapter targets and mathematical changes. No before/after tensor comparison is available in this viewer.

How was it changed?

Combine the instruction to think briefly with an instruction to be exact about the issue. Compile the paired instruction activation difference self-consistently into one feedforward neuron per layer at dose 2; the runtime prompt stays unchanged.

Did it improve?

null · Stage 1: +2.00 (x004) tasks against reference arms. Stage 2: not yet measured. Matched control, stage 2: not yet measured. Verdict: null.

No reliable improvement: recorded verdict is null.

Evaluation set: wsp31_screen_v2 · Batch: x004. Local screening and historical task scores are not competition scores unless explicitly identified in the source. Different evaluation sets cannot be compared as a gain.

Original evidence

Literal source excerpts follow. They may contain original predictions and superseded counts; use the measured-outcome summary and corrections above for the current result.

Hypothesis
Where the failures are once thinking is shorter (batch x001, 120 stage-1 tasks; `code/x_stats.py`, `code/x_seq.py`).
0031 `icv-brief-b20` and 0032 `icv-brief-b40` write the mean stream shift of a "keep your thinking very short"
paragraph at doses 2 and 4:

| arm | solved | at the 10,000-token budget | empty patch | finished with a wrong patch | budget reached, wrong patch |
|---|---|---|---|---|---|
| unedited (two arms) | 72, 64 | 45, 46 | 21, 18 | 16, 19 | 11, 19 |
| 0031, dose 2 | 77 | 32 | 13 | 17 | 13 |
| 0032, dose 4 | 71 | 19 | 8 | 31 | 10 |

Brevity moves episodes off the budget; what it leaves, and at dose 4 produces, is wrong patches. The budget run of
the tools lane says the same from the other side (`results/wsp31/budget/s1_x124/summary.txt`: on the 67 stage-1
tasks whose unedited episode ended on a cap, doubling the budget empties the "empty patch" bin, 20 to 8, raises
failed tests from 25 to 30, and solves 27 instead of 22). The wrong patches have one shape: they fail the required
tests and nothing else (failed tests = required tests in 125 of 136 non-empty unsolved episodes of the four x001
arms, in 79 of the 83 that finished on their own; exactly one failed test in 73), and the agent had run a test
after its last edit in 71% to 88% of the finished-wrong episodes, about as often as in solved ones. So the agent
checks its patch against its own idea of the bug, the check passes, and the idea is not what the issue asks. No
regression, no lack of testing: an instruction to test more would add nothing.

This entry adds a second paragraph to the one that worked, and compiles the two together:

> (I1) Important: keep your thinking very short. Before each tool call, think in at most three short sentences: what you just learned and what you will do next. Never write long plans, never draft or rewrite code in your thoughts, and never go over the same point twice.

> (I5) Important: be exact about what the issue asks. In every thought keep in view the precise behaviour the issue describes, with each example, input variant and error message it mentions, and make your change fix the general cause so that all of them work, not only the case that was reported.

Why a paragraph of this kind. A constant vector carried I1, which is a disposition that holds at every thought. It
did not carry an episodic instruction ("make your first edit by your sixth tool call": 0% of the prompted
distribution reproduced in turn 6, stream cosine 0.14 to 0.40). I5 is written as a disposition ("in every thought
keep in view ...") aimed at the one failure shape above. I1 pays for the tokens I5 may cost. The sister entry
`fcv-brief-b20` is this entry without I5 (same neurons, same compile, same dose, same batch): **the difference
between the two entries is the effect of I5's shift**, measured against the same reference arms.

What the compile kept of I5 (measured, not assumed). The pair's mean shift `d15` is close to that of I1 alone (`d1`, turn 6, same
calls): the per-layer numbers are in the recipe ("Target"). The part I5 adds, `d15 - d1`, is a third to two thirds of the
size of `d1`. It is reproducible between two halves of the fit calls in layers 6 to 24 (split-half cosine 0.54 to
0.87) and not in layers 36 and above (0.02 to -0.26): in the upper third of the network what I5 adds to the mean
shift is inside the noise of 35 calls. The compiled write differs from the sister entry's most in layers 12 and 18
(cosine 0.22 and 0.72 with it; 0.82 to 0.97 at the other sampled layers). On 8 held-out calls this entry reproduces
0.40 of the pair prompt's effect on the logged path and the sister entry (I1 alone) 0.31; its stream cosine with
the prompted shift is higher than the sister's in layers 6 to 18 (0.75, 0.59, 0.56 against 0.69, 0.50, 0.47) and the
same above; of the 24 top-token changes the pair prompt makes it matches 13, the sister 14. Before the evaluation I
had set two bars for queueing the pair: reproduce the pair prompt at least 0.08 better than I1 alone (met: 0.09,
at the edge of what 8 calls resolve) and a split-half cosine of the added part of 0.4 or more in most sampled
layers (not met: 5 of 10). So I5 is in the vector, weakly, and mostly in the lower half of the network. I queue it
because the sister entry makes the question answerable in one batch, not because the pre-test is strong.

Different from the null and harmful rows it resembles: E4B "prompt rules compiled into weights" (PRIOR_E4B.md:
rank-16 reconstruction of the whole prompt, no gain) compiled what the prompt already said; I5 is not in the
harness prompt (which sets a pace and asks to reproduce and verify). 0035 / 0036 (gpt, source-grounding instruction
contrast, not scored yet) use another instruction; this entry does not depend on their result. The close-the-thought
family (0008 to 0021): no push to `<channel|>` here.

Risks. (1) The mean shift may carry "a second instruction is present" and little of its content: the fidelity
numbers above are the evidence for and against. (2) I5 may lengthen thoughts and give back the tokens I1 saved.
(3) Nobody has measured whether I5 as a prompt gains tasks; I may not run rollouts.
(4) The vector is fitted on 35 calls; the late-layer part of I5's shift is at the noise of that sample.

Champion. Built and tested on generation 0. If 0031 is promoted while this entry waits, the runner serves both
always-on neurons together (0031 uses the third-quietest neuron of each layer, this entry the fourth): I1 at about
dose 4 plus I5 at dose 2. That stack is not intended (0032's regime for I1); a pair entry for that champion would
carry I5 alone.

Fitted on (task, unedited arm of batch b001, call index; all stage-1 tasks, none in a stage-2 list; the 35
calls of turn 6): mewwts__addict.75284f95.func_basic__9sg9rq7f base 3; scitokens__scitokens-193 aa 5; benoitc__gunicorn.bacbf8aa.func_basic__3napqcbj zero 3; rasbt__mlxtend-1087 zero 22; r1chardj0n3s__parse.30da9e4f.func_pm_remove_cond__k4df18dk zero 1; ross-rotordynamics__ross-177 aa 4; lepture__mistune.bf54ef67.combine_module__dalnbilu aa 3; openmdao__openmdao-3315 aa 22; prettytable__prettytable.ca90b055.func_basic__1mmuxqev zero 3; cool-RR__PySnooper.57472b46.lm_rewrite__031xvy9b zero 3; wireservice__csvkit-800 aa 11; life4__textdistance.c3aca916.combine_file__ciwv50c6 base 2; ishepard__pydriller-84 zero 2; zopefoundation__zope.configuration-34 base 26; stingraysoftware__stingray-234 base 29; jsvine__pdfplumber.02ff4313.func_pm_remove_assign__1v9soh1j zero 3; sqlfluff__sqlfluff-5362 zero 24; prometheus__client_python-1134 base 3; Textualize__textual-1352 zero 19; ipython__traitlets-517 aa 28; django-money__django-money.835c1ab8.combine_module__bqggrnha aa 13; pallets__jinja.ada0a9a6.func_basic__2vdao9be zero 27; geographika__mappyfile-146 zero 21; pypa__hatch-1148 aa 13; gcaufield__MonkeyPack-27 base 2; hdmf-dev__hdmf-1270 base 15; tophat__syrupy-768 zero 2; rubik__radon.54b88e58.func_basic__8pbqxg0r zero 8; juju-solutions__charms.reactive-71 zero 32; manicmaniac__sqlalchemy-repr-7 base 1; keis__base58-46 base 3; urbandataanalytics__SwissKnife-12 base 3; pytask-dev__pytask-200 zero 27; conda__conda-6131 aa 31; mewwts__addict.75284f95.combine_file__3fttj8ti zero 1.
Exact recipe
This entry: arm `G20` of `code/fcv2_job.py` (paragraph pair I1 + I5, dose beta = 2). Control: arm `G20c`.

base: champion generation 0

No edit had passed when this entry was built; statistics, weights and pre-tests are those of the unedited model.

size: whole network 0.6766% over 180 matrices, largest matrix 1.6391%

control size: whole network 0.6766% over 180 matrices, largest matrix 1.6391%

The size is mostly the removal of the 60 replaced neurons (old gate and up rows of norm about 1); the functional
dose is beta. Rank 1 per matrix, 180 matrices (gate, up and down of the MLP in all 60 layers).

Built in the second GPU-0 hold of turn 8 (`flock gpu0.lock timeout 1560 code/gpu_hold9.sh`: `code/fcv2_job.py`,
forward pass `tools/g31.py`, no optimiser anywhere, then one served generation check) and rebuilt bit for bit on
CPU by `build.sh` (`code/fcv2_build.py` from `code/data/fcv2_stats.pt`; the sha256 of `edit/` and `ctrl/` equal those
of the arms the job evaluated).

Data: as in 0031 and the sister entry. `tools/data/probe_calls_b001_full.jsonl`, stage-1 tasks in no stage-2 list,
calls after the first of an episode, at most 4,600 tokens, a closed thought and 24 or more completion tokens, one
call per task; every fourth task (sorted by name) held out; the fit calls are the 35 of turn 6. No task outcome
enters any statistic.

Target (`fcv2_job.phase1`). The pair is inserted at the end of the first user message as a blank line, I1, a blank
line, I5 (56 + 59 tokens). For each fit call the logged sequence is run as logged and with the pair inserted;
`resid_post` is captured at all 60 layers at the positions P of the completion (at most 300 per call, evenly
spaced). `d15_L` = mean over calls of the mean over P of (with - without). Against `d1_L`, the shift of I1 alone
on the same calls (turn 6, `code/data/icv_stats.pt`), layers [0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59]:
size of d15 over size of d1: 1.22 1.16 1.24 1.27 1.03 1.01 1.02 1.03 1.02 0.98 1.02; cosine(d15, d1): 0.92 0.92 0.85 0.92 0.83 0.92 0.96 0.94 0.94 0.91 0.94; size of (d15 - d1) over size of d1: 0.50 0.46 0.65 0.53 0.60 0.41 0.28 0.34 0.35 0.41 0.34; split-half cosine (even against odd fit calls) of d15: 0.89 0.98 0.96 0.96 0.81 0.87 0.87 0.75 0.68 0.60 0.73; of d15 - d1: -0.08 0.86 0.87 0.79 0.54 0.39 0.02 -0.15 -0.26 -0.18 -0.17.

Self-consistent write (`fcv2_job.phase2`, the method of `code/fcv_job.py`). For each fit call one pass with a hook
after every layer L, in layer order: `s_L = mean over P of (resid_post_L of this pass - resid_post_L of the unedited
pass)`; `c_L = beta d15_L - s_L`; `c_L` is added to `resid_post_L` at every position except BOS. After the hook the
mean shift over P is `beta d15_L` exactly, so `c_L` is what layer L and the residual path did not supply.
`G_L = mean over the 35 calls of c_L`. Against the sister entry's write `F20` (I1 alone, dose 2), same layers:

| dose | size of the write over size of F20 (think-briefly alone, dose 2) | cosine with F20 | split-half cosine (even against odd fit calls) |
|---|---|---|---|
| 1 | 0.61 0.49 0.79 0.66 0.48 0.50 0.51 0.51 0.52 0.52 0.51 | 0.92 0.79 0.28 0.70 0.83 0.87 0.96 0.88 0.81 0.84 0.90 | 1.00 0.99 0.95 0.85 0.92 0.87 0.97 0.84 0.80 0.76 0.83 |
| 2 | 1.22 0.91 1.55 1.19 0.96 1.01 1.02 1.04 1.04 1.08 1.03 | 0.92 0.86 0.22 0.72 0.83 0.86 0.97 0.87 0.83 0.82 0.92 | 1.00 0.99 0.99 0.95 0.96 0.97 0.99 0.94 0.93 0.91 0.96 |

Always-on neuron, read vector, gate and up rows: those of the sister entry, taken from `code/data/fcv_stats.pt`
(fourth-quietest neuron of each layer in my turn-3 capture; ridge fit of the constant 1 on the MLP input at
completion positions; gate row = 8 `w`, up row = `w`; `gbar_L` 7.8 to 8.0; coefficient of variation 0.05 to 0.12).

Write. Down column `c = clipdiv(G_L, w_post_L) * rmsy_L / (gbar_L * layer_scalar_L)`: `w_post` = weight of the
post-feedforward norm, `rmsy_L` = mean RMS of the raw MLP output at completion positions, `clipdiv` divides
coordinate-wise and zeroes the 5% of coordinates with the smallest |w_post| (`code/thinklib.py`). The write relative
to the RMS of the raw MLP output is `rho` in `edit/edit.json` (0.005 to 0.068, median 0.015).

Intended against built. Intended: the model behaves at every position as if the pair were in the prompt, twice
over. Built: a constant per layer solved so that the mean stream shift over completion positions is `2 d15_L` on
the 35 fit calls when applied as an exact vector by a hook; the served neuron writes through the post-feedforward
norm, fires at 0.75 to 0.93 of `gbar` on prompt positions and at 0.25 to 3.3 on BOS, and writes one vector for all
calls. Not built: anything of the pair's effect that depends on the call or the position, which is about half of it
by the stream cosine below.

Control: same neurons, same gate and up rows, and the written vector `G_L` with the sign of every coordinate
flipped at random (seed 6000 + L) before the same `clipdiv` and scaling: identical per-coordinate magnitudes, so the
same |dW|_F and the same size of write, and no relation to either paragraph. It holds the removal of 60 neurons and
an always-on write of the same size in every layer, and differs only in direction. The control for "I5 adds
something" is the sister entry, not this one.

### Pre-test (forward pass, teacher-forced on the logged path; 8 held-out calls)

`icv_job.evaluate` (my script of turn 6; checked by a CPU plumbing run and by bit-for-bit rebuilds, not against
another tool). Each held-out call is run unedited (base), unedited with the pair inserted (prompted) and with each
adapter; numbers are at the positions of the logged completion, against base. "flips" = positions with another top
token; "close on top inside" = thought positions where `<channel|>` becomes the top token; "dlogp close" = mean
change of log p(`<channel|>`) where the agent went on / where it closed; "reproduced" = 1 - KL(prompted || arm) /
KL(prompted || base); "shift cos" = cosine between the arm's and the prompt's change of the log-probs of base's 50
top tokens; "prompt flips matched" = of the positions where the prompted top token differs from base, those where
the arm's top token is the prompted one. Eight calls is a small sample: read differences of 0.05 in "reproduced" or
2 flips as nothing. The row of the sister entry is scored against the pair prompt here, so it shows what I1 alone
reproduces of the pair.

| arm | calls / positions | flips | flips in thought | close on top inside | dlogp close inside | dlogp close at close | tool flips | KL from base | reproduced | shift cos | prompt flips matched |
|---|---|---|---|---|---|---|---|---|---|---|---|
| prompted with the paragraph pair (the target) | 8 / 1278 | 0.019 | 0.037 | 0 of 460 | -0.01 | -0.202 (7 of 8 kept) | 0 of 8 | 0.0077 | - | - | - |
| **this entry**: paragraph pair, dose 2 (G20) | 8 / 1278 | 0.015 | 0.026 | 0 of 460 | -0.20 | -0.106 (7 of 8 kept) | 0 of 8 | 0.0060 | 0.40 | 0.36 | 13 of 24 |
| **its control**: control of G20 | 8 / 1278 | 0.011 | 0.017 | 0 of 460 | -0.11 | +0.015 (8 of 8 kept) | 0 of 8 | 0.0015 | -0.15 | 0.12 | 8 of 24 |
| paragraph pair, dose 1 (G10) | 8 / 1278 | 0.010 | 0.015 | 0 of 460 | -0.13 | -0.019 (7 of 8 kept) | 0 of 8 | 0.0019 | 0.39 | 0.33 | 11 of 24 |
| think-briefly paragraph alone, dose 2 (F20, the sister entry), against the pair prompt | 8 / 1278 | 0.014 | 0.024 | 0 of 460 | -0.24 | -0.101 (7 of 8 kept) | 0 of 8 | 0.0075 | 0.31 | 0.36 | 14 of 24 |

Stream shift (mean over completion positions of `resid_post`, arm minus base, against prompted-with-the-pair minus
base; layers [0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59]):
- paragraph pair, dose 2 (G20): cosine 0.23 0.75 0.59 0.56 0.49 0.50 0.59 0.52 0.53 0.47 0.40; norm ratio 4.98 1.80 2.20 3.02 1.51 1.64 1.54 1.31 1.30 1.19 1.22
- control of G20: cosine -0.04 0.03 0.07 -0.08 0.02 0.03 0.06 0.08 0.08 0.09 0.05; norm ratio 4.96 1.64 1.29 1.20 1.10 1.33 1.23 1.00 1.07 1.04 1.33
- paragraph pair, dose 1 (G10): cosine 0.22 0.75 0.59 0.54 0.47 0.45 0.59 0.55 0.53 0.48 0.34; norm ratio 2.49 0.94 1.20 1.63 0.83 0.88 0.80 0.74 0.76 0.73 0.68
- think-briefly paragraph alone, dose 2 (F20, the sister entry), against the pair prompt: cosine 0.21 0.69 0.50 0.47 0.46 0.49 0.57 0.53 0.51 0.47 0.46; norm ratio 4.11 1.57 1.51 1.73 1.41 1.65 1.51 1.32 1.31 1.22 1.21

### Served generation (vLLM through `tools/gpu0_session.sh`, greedy, single turns, no rollout)

`code/icv_gen.py`: mid-episode calls of the held-out tasks (one per task, prompts of at most 4,600 tokens, so calls
with short thoughts), answers of up to 1,500 tokens. "shorter / longer" = contexts whose thought is shorter / longer
than the unedited model's; "cut" = answer not finished in 1,500 tokens; "loops" = answers of 600 tokens or more with
more than half repeated 8-token sequences. The prompted row is I1 alone (the script's fixed reference), not the pair.

| arm | thought tokens mean | median | shorter / longer | answer tokens mean | same tool as unedited | well-formed tool call | cut | loops |
|---|---|---|---|---|---|---|---|---|
| unedited | 69 | 30 | - | 135 | - | 16 of 17 | 0 | 0 |
| unedited, paragraph I1 in the prompt | 35 | 25 | 8 / 0 | 116 | 15 of 17 | 16 of 17 | 0 | 0 |
| think-briefly paragraph alone, dose 2 (F20, the sister entry) | 48 | 30 | 4 / 4 | 128 | 15 of 17 | 17 of 17 | 0 | 0 |
| **this entry**: paragraph pair, dose 2 (G20) | 42 | 30 | 6 / 3 | 121 | 15 of 17 | 16 of 17 | 0 | 0 |
| paragraph pair, dose 1 (G10) | 47 | 30 | 3 / 2 | 137 | 14 of 17 | 17 of 17 | 0 | 0 |
| self-consistent compile, dose 3 (F30) | 36 | 22 | 9 / 2 | 101 | 15 of 17 | 17 of 17 | 0 | 0 |

17 contexts (calls 2, 17, 4, 17, 9, 3, 12, 12, 21, 26, 2, 13, 12, 17, 4, 26, 15).

`interp/toolcall_check.py` on that file: 0 unpaired string delimiters in the 17 tool calls of every arm (UNDECIDED: it needs 60
calls); no answer reaches 1,500 tokens, so no loop rate. In one of the 17 contexts this entry calls `submit_patch`
where the unedited model does not; the unedited model with I1 in the prompt does the same in one context.

`tools/closeprobe.py` (40 logged closes and 126 goes-on points of the default per-call set; third hold): change of
log p(close) at close +0.034 (raised at 34 of 40), at goes-on points -0.090; `<channel|>` is the top token at 40 of
40 closes. The tools lane's rule (below -0.05 at close: expect longer ordinary thoughts) does not flag it; the
sister entry has +0.033 and -0.069. On the 8 closes of the pre-test table the same quantity is -0.11 (the pair
prompt: -0.20; 0031: -0.17, and its rollout thoughts got shorter): the two samples disagree in sign, so neither
says more than "no large change".

Not measured: whole episodes; thoughts beyond 1,500 tokens; tool-call syntax on 60 or more calls; the pair as a
prompt in rollouts; generation speed under this adapter (rank 1 on 180 matrices, the shape of 0031, which ran at
24.6 against 25.1 tokens per second).

Checker: `check_adapter.py` passes on `edit/` and `ctrl/` (run by `build.sh`): 180 modules, r = 1.

Runner facts (2026-11-14 01:39:58 EST): source `wsp31/authors/claude/queue/fcv-brief-exact-b20/`; served copy `wsp31/queue/frozen/claude__fcv-brief-exact-b20/`; sha256 over files, edit `350e59563dd59192de6a2eb9821e6a21baebd77d211105a7d1d5aab815bea9e0`, control `2ff911925e12193821c10ca37b1b6125c6f6cd1e900a46c80e0bbaab8d07084e`; both passed the checker.
Prediction (written before the run)
predicted_gain_120: -4 to 8

My median is 2, one below the sister entry's 3: I5's shift is measured only in part (above), and a second paragraph
is more likely to cost tokens than the pre-test can show. The number that tests the hypothesis is the difference
to the sister entry in the same batch: I predict this entry minus `fcv-brief-b20` between -5 and +6 solved tasks,
median 0 to +1. A real effect of I5 would have to show as +4 or more there to be told from the spread of two arms.

Behaviour that should move if I5 acts as written (from `task_results.jsonl` with `code/x_stats.py`, this entry
against the sister entry, and both against the mean of the two reference arms):
- finished episodes with a wrong patch, plus episodes that reach the budget with a wrong patch: 4 or more fewer
  than in the sister entry (x001: 30 for 0031; 27 and 38 for the two unedited arms, so identical arms differ by 11
  here and only a large difference means anything);
- episodes that end on the token budget: within 5 of the sister entry, and 4 or more below the reference mean (I1
  still acts);
- median output tokens per episode: at most 8% above the sister entry;
- empty patches: within 4 of the sister entry.

Control (sign-scrambled write of the same size on the same neurons): none of these; budget endings within 5 of the
reference mean, gain -4 to 3.

The hypothesis is wrong if (a) the wrong-patch count is not lower than the sister entry's by at least 2 and the
solved count is not higher: I5's mean shift does nothing a rollout can see, and a quality instruction does not
compile into a constant vector the way a style instruction does; or (b) budget endings rise to the reference level:
I5 undid I1, and the pair is worse than I1 alone; or (c) the wrong-patch count falls and solved tasks do not rise:
the episodes moved into another failure bin (budget or empty patch). A gain over the reference arms that the sister
entry shares is I1's, not this entry's.
Result
**Stage 1** (batch `x004`, 4 arms on one server, concurrency 4 per arm, finished 2026-11-14 07:11:42 EST; `results/wsp31/batches/x004/`). Reference arm: unedited. Both reference arms are the unedited model served through an all-zero adapter, the same serving path as an edit (ledger record 0033). Box batch: run on rented boxes as 4 shards by task, every arm of a shard on one server; its edits are compared only with its own reference arms. Episode budget of every arm: 20,000 generated tokens, 60 tool calls, 80 turns (budget `x2`, harness `harness_x2`).

- unedited: solved 78 of 120, agent errors 18, at session limit 18, at tool-call cap 4, empty patch 7, median tool calls 22.0, mean 388.4 s, median 24.3 completion tokens/s of model time.
- edit: solved 79 of 120, agent errors 15, at session limit 15, at tool-call cap 3, empty patch 3, median tool calls 19.0, mean 341.3 s, median 23.9 completion tokens/s of model time; vs base on 120 common tasks: +1.0 tasks (95% interval -6.0 to +8.0), base-only 6, arm-only 7, exact p 1.0.
- second unedited arm (identical weights): solved 76 against 78; 7 tasks solved only by the first, 5 only by the second (12 tasks differ; record 0003 measured 11.3 per identical pair); median 24.6 completion tokens/s. The gain used by the rule is against the mean of the two reference arms per task.
- edit against the mean of the two reference arms: +2.0 tasks of 120 (95% interval -4.5 to +8.5).
- Predicted gain -4 to +8; measured +2.0: inside the interval.
Verdict and notes
null by the fixed rule: stage-1 gain +2.0, bar +3, harmful at -6 or below.