GEMMA DEVELOPER AGENTSAVED EVIDENCE

← Weight change

Direct mathematical edit / wsp31-0047

Paired outcome writer map across all 60 layers at 1 percent

Gemma 4 31B, frozen four-bit baseAuthor: gptState: runningVerdict: -

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?

The last round's source-grounding instruction edits were null (-2.5 and -3.5 tasks). At the current 20,000-token budget, many failures finish with a wrong patch. This entry asks whether writer states before edits contain a reusable part of the difference between successful and failed attempts on the same task. A rank-4 linear map moves failed-attempt means toward successful-attempt means while fitting zero change on successful, syntax and prompt means. This differs from 0025/0026's code-versus-prose projection and 0035/0036's constant instruction writes. It uses outcome-labelled, within-task pairs, separate input and output factors, and a…

Which part changed?

Paired outcome writer map across all 60 layers at 1 percent

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

How was it changed?

Computed directly by author-written code and packaged as a low-rank adapter over the frozen base; not gradient-trained. base: champion generation 0 size: whole network 0.999984% over 120 matrices, largest matrix 2.561328% control size: whole network 0.999984% over 120 matrices, largest matrix 2.561328% Rank 4, alpha 8, bf16 LoRA factors, o_proj and down_proj in layers 0 through 59. Median stable rank 2.2202. The norm uses all 420 editable matrices as its denominator. No champion overlap exists at design. A future writer edit could add to or oppose this map; no stack benefit is assumed. Data selection (`code/turn10/prepare.py`): unedited base/aa request logs from b007, x001, x003, x004 and x005. Keep tasks in both stage-1 lists and outside stage2_ids.txt;…

Did it improve?

- · No task-level result recorded in this snapshot.

Pending or parked proposal; not established as an applied or promoted update.

Evaluation set: wsp31_screen_v2 · Batch: b010. 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
The last round's source-grounding instruction edits were null (-2.5 and -3.5 tasks). At the current 20,000-token budget, many failures finish with a wrong patch. This entry asks whether writer states before edits contain a reusable part of the difference between successful and failed attempts on the same task. A rank-4 linear map moves failed-attempt means toward successful-attempt means while fitting zero change on successful, syntax and prompt means.

This differs from 0025/0026's code-versus-prose projection and 0035/0036's constant instruction writes. It uses outcome-labelled, within-task pairs, separate input and output factors, and a ridge solve with preserve samples. It neither projects onto a thought-close direction nor replaces a neuron. The E4B patch-correctness direction failed; this version tests paired tasks and a conditional map across both writers in every layer. That difference warrants a test, not a claim that correctness is readable.

The transfer check is weak: mean alignment with success-minus-failure directions on three reserved tasks is 0.0776. Mean relative reconstruction error is 1.0042 (zero change is 1.0). Rank 4 retains 54.27% of fit difference energy. Episode success is a noisy label for one editing decision; paired calls can serve different local purposes. Task content and the older 10,000-token budget in b007/x001 remain possible confounds. Screening stage 1 includes the fit tasks. Stage 2 is the first unseen-task outcome test.
Exact recipe
base: champion generation 0
size: whole network 0.999984% over 120 matrices, largest matrix 2.561328%
control size: whole network 0.999984% over 120 matrices, largest matrix 2.561328%

Rank 4, alpha 8, bf16 LoRA factors, o_proj and down_proj in layers 0 through 59. Median stable rank 2.2202. The norm uses all 420 editable matrices as its denominator. No champion overlap exists at design. A future writer edit could add to or oppose this map; no stack benefit is assumed.

Data selection (`code/turn10/prepare.py`): unedited base/aa request logs from b007, x001, x003, x004 and x005. Keep tasks in both stage-1 lists and outside stage2_ids.txt; separate audits verified no overlap with any of nine stage-2 lists. In each episode take the last edit_file/write_file call with a closed thought of at least 20 tokens and total exact context at most 12,000 tokens. Pair success and failure on the same task and tool, minimizing prompt-length difference, then maximum prompt length, then batch/arm names. Reserve tasks with SHA256(task) modulo 4 equal to zero; sort by hash. This yielded 18 fit pairs and 3 check pairs. Use only resolved labels, not hidden-test contents. Exact token inputs and request hashes are in `pairs.jsonl` and `selection.json`.

Capture with the documented g31 forward pass (mirror=True, GPU 0). For each call, sample 16 positions evenly across the last up-to-64 thought tokens, excluding the final token before close; sample up to 12 syntax positions and 16 prompt positions. Convert attn_out to raw writer direction by dividing by its post-attention norm weights; use mlp_raw directly. Normalize every sampled vector to unit L2 length, then average within each group. Capture statistics are frozen in `capture_stats.pt`.

For each layer and writer, let P and N contain successful and failed thought means, and R contain both sides' syntax and prompt means. Set D=P-N. Take the leading four right singular vectors V of D, fixing each sign by its largest absolute coordinate. X=[N;P;R], Y=[D V.T;0;0], lambda=0.02 times mean(diag(X X.T)). Solve H=(X X.T+lambda I)^(-1)Y, then M=V.T H.T X. The raw weight update is dW=M W. The code stores U=V.T and the right factor H.T X W. Equalize each changed matrix's relative Frobenius norm, then apply one common scale for this entry's target 1% network norm. Save dW=2 B A in bf16. The queued build uses CPU fp32 matrix products, not the GPU scout products.

Intended versus built: this homogeneous map fits means of normalized writer outputs, but acts on each actual, unnormalized output. The learned post norms, attention, nonlinearities, and later-layer responses remain in the forward pass. Preserve constraints are ridge penalties on means, not exact null spaces or per-token gates. Equalizing matrix norms changes the relative gains of the raw fitted maps. No optimizer step, trained-adapter direction, prompt change or agent rollout is used.

Control: reverse the complete update. The same builder keeps every A factor identical and negates every B factor exactly; layers, modules, rank, read factors and every stored matrix norm match. This tests the signed failed-to-success direction against its reverse. The reverse may be harmful, so beating it alone does not establish benefit over the champion.

Rebuild with `bash build.sh OUT_DIR` in an unused directory under this author. It runs `code/turn10/rebuild.py` using frozen `maps.pt` and the original checkpoint, with the frozen tool library in `code/turn10/tools`. A separate CPU rebuild matched config, weights and edit.json byte for byte in both arms (`rebuild_receipt.json`). `source_hashes.json` pins code, input tokens, maps and tool sources. Maps SHA256: ddf8637741b3f16b75c10c6b826e3fa9d3f13a0f05b16408791b959648838811. Edit weights SHA256: aae8b4fc48aa0aebbba7cab48fa95b8835e78a09e330df4a7b6452bb67a1d6a8. Control weights SHA256: 63b057edcb02f519959be8acfdea67f2b3c7b85401b499ba2c4bc85042f0cc96.

Both official adapter checkers pass. The size lines above come from `train_size.py` on the stored factors. Data-boundary audits and all summarized checks are in `checks.json`.

Dose choice: the first GPU hold tested 0.33%, 1% and 3% scouts on 772 exact positions in 14 calls from 11 non-fit tasks. They changed 10, 15 and 40 top tokens, respectively, and kept 14, 13 and 11 of 14 logged closes. Mean close-log-p changes were -0.0031, -0.0125 and -0.1826. The 3% scout failed the documented -0.05 thought-ending guard and was declined without entering the queue. Neither selected scout changed a top token at the 50 sampled string delimiters. The 1% reverse scout lost two closes (-0.2783 mean close-log-p), a control risk. CPU builds differ from GPU scouts in about 2,290 of 10,035,200 stored factor elements; the following official replay and serving checks use the exact queued CPU bytes.

Official `replay.py`: eight non-fit stage-1 calls, 1,073 logged tokens, at most 300 completion tokens per call, exact prefixes. Likelihood changes are nats per token. The probe does not predict solve rate. The serving check uses a zero-adapter reference, port 18410 under `gpu0_session.sh`, 100 after-close calls plus 12 whole turns from 52 non-fit tasks. No tool executes. After-close generation is capped at 1,000 tokens, whole turns at 1,800. The documented toolcall_check checks unpaired string delimiters; its thresholds were fitted on rollout data, and sensitivity on unedited-prefix continuations is not established.

| arm | replay top-token changes | solved log-p change | failed log-p change | complete tool calls | unpaired delimiters | syntax |
|---|---:|---:|---:|---:|---:|---|
| reference | reference | reference | reference | 112 | 0 | NOT BROKEN |
| cpu100_edit | 25/1073 | -0.00044 | -0.01753 | 112 | 0 | NOT BROKEN |
| cpu100_ctrl | 28/1073 | -0.01563 | -0.03913 | 111 | 2 | NOT BROKEN |

- reference: after-close 100/100 well-formed, 0 length cuts; whole-turn 11/12 well-formed, 0 length cuts, 0 repetitive. Mean whole-turn tokens 230.7.
- cpu100_edit: after-close 100/100 well-formed, 0 length cuts; whole-turn 12/12 well-formed, 0 length cuts, 0 repetitive. Mean whole-turn tokens 227.4.
- cpu100_ctrl: after-close 99/100 well-formed, 0 length cuts; whole-turn 12/12 well-formed, 0 length cuts, 0 repetitive. Mean whole-turn tokens 260.1.

These checks can exclude a large local syntax break; they do not test full-episode looping, total tool use or patch correctness. The reference's after-close panel contains only three edit_file calls; most are reads or shell commands, so code-writing coverage is thin. The dose choice uses these panels, so they are development checks. The custom transport capture/scout code is new; g31 and the official replay backend are documented as verified, but the transport-to-solve-rate link is unvalidated.

Fit episodes (call indices are zero-based):

- r1chardj0n3s__parse.30da9e4f.func_basic__83wal9im: success x004/base call 2; failure x004/aa call 2.
- lepture__python-livereload-198: success x005/base call 16; failure x004/base call 9.
- conda__conda-6131: success b007/base call 14; failure x005/base call 21.
- h5io__h5io-79: success x003/base call 22; failure b007/base call 32.
- kayak__pypika.1c9646f0.func_basic__7dnlb52y: success x004/aa call 44; failure b007/base call 35.
- mwouts__jupytext-1443: success x005/aa call 4; failure x004/base call 16.
- google__yapf-59: success x004/aa call 38; failure x005/base call 23.
- pallets__jinja.ada0a9a6.func_basic__2vdao9be: success x005/base call 35; failure b007/base call 21.
- r1chardj0n3s__parse.30da9e4f.func_pm_remove_cond__k4df18dk: success x005/base call 4; failure b007/base call 4.
- copier-org__copier-2646: success x004/aa call 33; failure x003/base call 24.
- miLibris__flask-rest-jsonapi-122: success x004/aa call 4; failure b007/base call 4.
- timothycrosley__isort-819: success x004/base call 38; failure x005/aa call 55.
- sqlfluff__sqlfluff-5362: success x003/aa call 59; failure b007/base call 27.
- vmware__tern-295: success b007/aa call 11; failure x005/aa call 79.
- python-markdown__markdown-743: success b007/base call 28; failure x005/aa call 18.
- webscopeio__license.sh-64: success x005/base call 20; failure x004/aa call 15.
- borgbackup__borg-7448: success x005/base call 32; failure b007/base call 16.
- cloudtools__troposphere-1968: success b007/base call 16; failure x005/base call 9.

Reserved pair checks:

- mozilla__bleach.73871d76.func_pm_remove_cond__dfyej8pm: success b007/base call 13; failure b007/aa call 28.
- lepture__mistune.bf54ef67.combine_module__dalnbilu: success x003/aa call 5; failure b007/base call 5.
- prettytable__prettytable.ca90b055.combine_file__2mwa4qpg: success b007/aa call 15; failure b007/base call 14.

The eight-call replay and 52-task generation panels are named in `code/turn10/replay_panel.jsonl` and `generation_panel.jsonl`; every task passes the stage boundary audit. No stage-2 trace or per-task result was read.

Runner facts (2026-11-14 09:34:13 EST): source `wsp31/authors/gpt/queue/paired-outcome-writers-r4-100/`; served copy `wsp31/queue/frozen/gpt__paired-outcome-writers-r4-100/`; sha256 over files, edit `5881541aa06dbc15f865aab7c6d0b7ea8f376cb95fb01feb2989422bb341de9c`, control `2ad10e913bd9e39838d2b3d61fe2c81c6db589008de96b54b54b3db9323abf0d`; both passed the checker.
Prediction (written before the run)
predicted_gain_120: -6 to 12

This is an 80% interval for tasks gained over the same-batch champion reference mean. Expected mechanism: 4 to 9 fewer episodes that finish with a nonempty wrong patch, with median tool calls and mean generated tokens within 15% of the reference. Unpaired tool-call delimiters should remain below 3%. The target is better edit choices, not shorter thoughts. The reversed control is expected to gain -8 to 3 tasks and to improve wrong-patch counts less than the edit; that control interval is a forecast, not a measured result.

The mechanism is wrong if finished wrong-patch episodes do not fall, or if changes mainly increase cut-offs or malformed calls. A nonpositive task gain, or no advantage over the reverse direction, rejects the proposed signed benefit even if local token choices moved. Gains confined to the 18 fit tasks would support memorization rather than transfer. The 1% and 0.33% doses test whether a stronger map buys more corrected tasks or only adds regressions. No new dose of this family should be queued after a null result without a new mechanism.
Result
Pending.
Verdict and notes
Pending.