Shift common writer output toward thought endings across all layers at 0.11 percent
When
Recorded date: 2026-11-12
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?
A small write toward the end-of-thought contrast, read from each writer's common thought component, can help the agent turn a nearly finished thought into a tool action. Unlike a signed projection gain, this rank-one map can add a close signal even when the writer has little positive alignment with the end direction. The screening traces include a failed pyquery episode with a 3,939-token thought that re-traces string merging before deciding to print an intermediate value, and a failed gunicorn episode with a 2,356-token thought that revisits process and environment handling. These examples support a time-cost hypothesis, not a claim that…
Which part changed?
Shift common writer output toward thought endings across all layers at 0.11 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 No champion file or promoted ledger row existed at design time. Thus weights, capture, and pre-tests all use the unedited checkpoint. The entry contains only this author's change. Overlap with future promotions is untested. size: whole network 0.110001% over 120 matrices, largest matrix 0.281965% control size: whole network 0.110003% over 120 matrices, largest matrix 0.281733% Measured with the official train_size.py, stored in size.json. The denominator is its 420-module norm table, including the virtual global value slots. Both arms change only the 120 writer matrices that exist in the checkpoint. Data:…
Did it improve?
- · No task-level result recorded in this snapshot.
Evaluation set: wsp31_screen_v1 · Batch: -. 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
A small write toward the end-of-thought contrast, read from each writer's common thought component, can help the agent turn a nearly finished thought into a tool action. Unlike a signed projection gain, this rank-one map can add a close signal even when the writer has little positive alignment with the end direction. The screening traces include a failed pyquery episode with a 3,939-token thought that re-traces string merging before deciding to print an intermediate value, and a failed gunicorn episode with a 2,356-token thought that revisits process and environment handling. These examples support a time-cost hypothesis, not a claim that the thoughts are useless. Ledger 0006 reports the broader association between long thoughts and session cutoffs. This differs from ledger 0007-0010: it changes both writers at every layer and keeps their existing input dependence, instead of fitting a new neuron gate or scaling a small set of final-layer neurons. PRIOR_E4B reports null or harmful brevity edits. Here the tested difference is the broad, measured writer contrast and the common-reader map; that earlier result remains a reason for the negative end of the prediction interval. No trained adapter supplied a direction.
Exact recipe
base: champion generation 0
No champion file or promoted ledger row existed at design time. Thus weights, capture, and pre-tests all use the
unedited checkpoint. The entry contains only this author's change. Overlap with future promotions is untested.
size: whole network 0.110001% over 120 matrices, largest matrix 0.281965%
control size: whole network 0.110003% over 120 matrices, largest matrix 0.281733%
Measured with the official train_size.py, stored in size.json. The denominator is its 420-module norm table,
including the virtual global value slots. Both arms change only the 120 writer matrices that exist in the checkpoint.
Data: code/turn1/data/snapshot.jsonl freezes 120 completed b001 screening episodes. One episode per task,
preferring base, then aa, then zero, gives 43 tasks. Sort by SHA256(instance_id), take indices divisible by four
as check tasks (11), and the others as fit tasks (32). The selected task list and exact token IDs are in
code/turn1/data/episodes.jsonl; code/turn1/data/check.jsonl is the check subset. No success label enters the direction.
Capture: code/turn1/author_capture.py, tools g31.G31 forward only, under the GPU0 lock. Prefix limit 11,000.
At each layer capture attention output after its post norm and MLP output before its post norm. Divide attention
output by its own post-norm weights to recover its raw write direction. Unit-normalize each token's writer vector.
For each task take up to 64 evenly spread positions at thought depth 50..249 (early), 64 at depth >=800 (late),
and 24 immediately before token 101 (end). The class means, not token activation dumps, are saved in capture.pt.
For each module separately, average the two class means over fit tasks with both classes. Positive is late for
the late family, and end for close/shift; negative is early. Let c be the unit sum of positive and negative means.
Let d be the unit difference after projecting it orthogonal to c. This removes the common write from the contrast.
All 60 layers, both o_proj and down_proj, rank 1 per matrix. No other parameter changes. No explicit gate: the
existing writer output supplies the scalar read. A global adapter rank of 1 spends one rank in a future stack.
Formula: `dW = +a * d c^T W (write the close contrast when the common thought write is present)`. Each matrix gets its own positive a so that all changed matrices have equal relative
Frobenius movement; one shared rescaling then sets the requested whole-network norm. The queued target is
0.1100%. Build the 0.33% version first; other doses rescale its stored bf16 factors with
scale_project.py. Therefore those doses include that extra rounding, rather than an unrounded analytical dose.
Control: Replace only the output d with a seeded Gaussian unit vector orthogonal to d. Keep the same reader c and positive sign. Seed = 310012 + 100*layer + module_index, with o_proj index 0 and down_proj index 1.
Rescale each control matrix to its edit's Frobenius norm. Both arms use build_project.py and the same scale path.
Norms match before bf16 storage; the two measured size lines report the small rounding difference. The control
tests the chosen direction at the same sites, rank, feedback rule, and norm.
Approximations: factor storage and model computation use bf16; attention raw directions recover a post-norm-rounded
vector; projection changes the RMS normalization of a writer as well as its direction. Per-matrix norm matching
does not match residual-stream effect size. Positions before thought close use logged history, which can include
an added newline; these are not exact original generation contexts. This is an observational contrast, not a proven
causal long-thought feature. Check-task pre-tests selected the dose, so these are development measurements.
The contrast may also encode token mix or context position; matching early and late means within tasks does not
remove those confounds. In the 43-task snapshot, longest-thought medians are 1,220 tokens for 25 failed tasks
and 1,027.5 for 18 solved tasks, with substantial overlap (snapshot_audit.json).
All 385 sampled end positions use newline tokens (one to five newlines); the early class is not token-matched.
Thus perfect AUC for close/shift may detect whitespace structure. All four check tasks with late positions were
solved episodes, so the late-position pre-test does not directly cover long thoughts from failed check episodes.
Rebuild: `bash build.sh OUTPUT_DIRECTORY`. It uses saved directions.pt and the pinned code/turn1/tool_snapshot tools;
the default output is under this author's scratch/rebuild. Capture and direction derivation commands are in
pipeline_job.sh and build_project.py. Saved inputs avoid dependence on the live, growing screening logs.
CPU threads are fixed at 8. manifest.json lists source/input hashes and each adapter file hash.
The rebuild was executed in a separate scratch directory: all six adapter files (weights, config, and edit metadata
for both arms) matched byte for byte. The receipt is rebuild.json.
Edit weights SHA256: `61795c966e0c35bc09136d4881846225545afc3cb47a5f9efc9fd6899bb5482c`.
Control weights SHA256: `b414f97e859ca0faacbf5b5be0dbcf119b78f06f92246e07f9901b4d3ba782f4`.
Directions SHA256: `baa7fd64637a59641abc2b794f219420d671ecaf2ced85be86cc8618bc2d983b`.
Checker output:
```
OK edit: 120 modules changed (of 120 present), r=1, max |dW|_F/|W|_F 0.00282 at 24.o_proj
OK ctrl: 120 modules changed (of 120 present), r=1, max |dW|_F/|W|_F 0.002817 at 4.o_proj
```
Held-out-by-task direction separation (AUC on per-task class means, averaged over 60 layers):
o_proj: 1.0000 on 11 check tasks, fitted on 32 tasks; down_proj: 1.0000 on 11 check tasks, fitted on 32 tasks.
This does not measure success prediction or prove that removing/amplifying the contrast helps.
### edit: documented causal pre-test, NOT VERIFIED YET
26 points on 2 check tasks; verdict ACTIVE.
| point | n | mean log-prob change of logged token | KL(base to arm) | top-token changed |
|---|---:|---:|---:|---:|
| all | 26 | -0.00521 | 0.04823 | 0.0000 |
| turn | 2 | -0.00427 | 0.00299 | 0.0000 |
| step | 8 | 0.04241 | 0.10054 | 0.0000 |
| think | 8 | -0.03375 | 0.04126 | 0.0000 |
| tool | 8 | -0.02453 | 0.01418 | 0.0000 |
### edit: thought-position pre-test, NOT VERIFIED YET
4 check tasks, prefixes at most 10000 tokens. Sampled positions, not generated continuations.
| position | n | change log p(close) | change log p(logged token) | top unchanged | p(close) base | p(close) arm |
|---|---:|---:|---:|---:|---:|---:|
| early | 192 | 1.8937 | -0.0037 | 0.9896 | 0.001114 | 0.004267 |
| late | 48 | 1.8826 | -0.0313 | 0.9792 | 0.003374 | 0.017633 |
| end | 28 | 1.0539 | 1.0539 | 0.8929 | 0.675403 | 0.730715 |
| non | 96 | 1.3500 | 0.0298 | 0.9375 | 0.001971 | 0.002588 |
| think | 28 | 8.0874 | -0.0165 | 1.0000 | 0.000009 | 0.000714 |
| tool | 28 | 1.9893 | -0.0124 | 1.0000 | 0.000000 | 0.000000 |
### edit: all-newline replay, NOT VERIFIED YET
Four check tasks, prefixes capped at 11,000 tokens. Every in-thought token 107..111 is checked.
| position | n | p(close) base | p(close) arm | close is top, base | close is top, arm |
|---|---:|---:|---:|---:|---:|
| early | 281 | 0.00011 | 0.00185 | 0.0000 | 0.0000 |
| mid | 266 | 0.00001 | 0.00104 | 0.0000 | 0.0000 |
| late | 121 | 0.00013 | 0.00168 | 0.0000 | 0.0000 |
| end | 31 | 0.70634 | 0.75946 | 0.7419 | 0.8387 |
Greedy replay at newline positions only (teacher-forced prefixes, not generated continuations):
```json
{"arm": {"long": {"cut_early": 0.0, "end_close": 1.0, "n": 3, "tokens_kept": 1.0}, "short": {"cut_early": 0.0, "end_close": 0.8214285714285714, "n": 28, "tokens_kept": 1.0}}, "base": {"long": {"cut_early": 0.0, "end_close": 1.0, "n": 3, "tokens_kept": 1.0}, "short": {"cut_early": 0.0, "end_close": 0.7142857142857143, "n": 28, "tokens_kept": 1.0}}}
```
### edit: served replay
32 points, 8 check tasks, vLLM port 18410 through gpu0_session.sh. fastprobe.py: 8 traces, 2 points per kind, max position 6000, kinds think/tool. Top-20 clipped estimates; fastprobe is still marked NOT VERIFIED YET in TOOLS.md. This is a direct served measurement, not a check of every offline number.
| point | n | log-prob change of logged token | clipped KL | top changed | clipped share |
|---|---:|---:|---:|---:|---:|
| all | 32 | -0.03926 | 0.08722 | 0.0000 | 0.0000 |
| think | 16 | -0.02277 | 0.15016 | 0.0000 | 0.0000 |
| tool | 16 | -0.05574 | 0.02427 | 0.0000 | 0.0000 |
### ctrl: documented causal pre-test, NOT VERIFIED YET
26 points on 2 check tasks; verdict ACTIVE.
| point | n | mean log-prob change of logged token | KL(base to arm) | top-token changed |
|---|---:|---:|---:|---:|
| all | 26 | -0.00616 | 0.00818 | 0.0000 |
| turn | 2 | 0.00056 | 0.00037 | 0.0000 |
| step | 8 | 0.01905 | 0.01078 | 0.0000 |
| think | 8 | -0.03206 | 0.01430 | 0.0000 |
| tool | 8 | -0.00716 | 0.00142 | 0.0000 |
### ctrl: thought-position pre-test, NOT VERIFIED YET
4 check tasks, prefixes at most 10000 tokens. Sampled positions, not generated continuations.
| position | n | change log p(close) | change log p(logged token) | top unchanged | p(close) base | p(close) arm |
|---|---:|---:|---:|---:|---:|---:|
| early | 192 | 0.3489 | -0.0054 | 0.9948 | 0.001114 | 0.001361 |
| late | 48 | 0.4458 | 0.0019 | 1.0000 | 0.003374 | 0.005797 |
| end | 28 | -0.0595 | -0.0595 | 0.9643 | 0.675403 | 0.669838 |
| non | 96 | 0.1993 | -0.0698 | 0.9271 | 0.001971 | 0.001091 |
| think | 28 | 0.7801 | -0.0167 | 1.0000 | 0.000009 | 0.000010 |
| tool | 28 | -0.0140 | 0.0032 | 1.0000 | 0.000000 | 0.000000 |
### ctrl: all-newline replay, NOT VERIFIED YET
Four check tasks, prefixes capped at 11,000 tokens. Every in-thought token 107..111 is checked.
| position | n | p(close) base | p(close) arm | close is top, base | close is top, arm |
|---|---:|---:|---:|---:|---:|
| early | 281 | 0.00011 | 0.00006 | 0.0000 | 0.0000 |
| mid | 266 | 0.00001 | 0.00001 | 0.0000 | 0.0000 |
| late | 121 | 0.00013 | 0.00009 | 0.0000 | 0.0000 |
| end | 31 | 0.70634 | 0.70157 | 0.7419 | 0.7097 |
Greedy replay at newline positions only (teacher-forced prefixes, not generated continuations):
```json
{"arm": {"long": {"cut_early": 0.0, "end_close": 1.0, "n": 3, "tokens_kept": 1.0}, "short": {"cut_early": 0.0, "end_close": 0.6785714285714286, "n": 28, "tokens_kept": 1.0}}, "base": {"long": {"cut_early": 0.0, "end_close": 1.0, "n": 3, "tokens_kept": 1.0}, "short": {"cut_early": 0.0, "end_close": 0.7142857142857143, "n": 28, "tokens_kept": 1.0}}}
```
### ctrl: served replay
32 points, 8 check tasks, vLLM port 18410 through gpu0_session.sh. fastprobe.py: 8 traces, 2 points per kind, max position 6000, kinds think/tool. Top-20 clipped estimates; fastprobe is still marked NOT VERIFIED YET in TOOLS.md. This is a direct served measurement, not a check of every offline number.
| point | n | log-prob change of logged token | clipped KL | top changed | clipped share |
|---|---:|---:|---:|---:|---:|
| all | 32 | -0.01193 | 0.01830 | 0.0000 | 0.0000 |
| think | 16 | -0.03132 | 0.02805 | 0.0000 | 0.0000 |
| tool | 16 | 0.00746 | 0.00855 | 0.0000 | 0.0000 |
Outside-thought split of the sampled positions: {"read_context": {"d_next": 0.03643103001239086, "edit_close": 0.0, "n": 82, "top_same": 0.926829268292683}, "tool_arguments": {"d_next": -0.008880725915730636, "edit_close": 0.0, "n": 14, "top_same": 1.0}}.
Tool arguments are positions inside tokens 48..49; read-context positions are the remaining non-thought sample.
The small tool-argument sample is a limited coherence check, not a test of patch correctness.
Pre-tests: the documented causal.py through its library interface plus targeted samples using the documented
g31.forward interface. TOOLS.md marks forward agreement with the served model and these pre-tests NOT VERIFIED YET.
No agent rollout was launched. Any served replay listed above used the documented GPU0 server wrapper.
Free-running coherence and solve rate remain untested.
The cand
Runner facts (2026-11-12 22:39:28 EST): source `wsp31/authors/gpt/queue/writer-close-shift-011/`; served copy `wsp31/queue/frozen/gpt__writer-close-shift-011/`; sha256 over files, edit `7050cef7a13015d699ab9fc2785e12956f9a9ac514de45f71fee18255f18ef37`, control `c0af35ae1a814347b78bde0503b92b5971aa33f8ff1eb1e387cedb15f8c7b9c0`; both passed the checker.Prediction (written before the run)
predicted_gain_120: -6 to 12 Expect 5% to 25% fewer thinking tokens, 5% to 20% fewer session-limit episodes relative to the reference rate, and 0 to 2 more tool calls per episode. Natural thought endings should become more decisive, with some additional earlier endings. Malformed calls should rise by less than 2 percentage points. The matched control should stay within 8% of reference thinking length and within -5 to +5 tasks. The hypothesis is wrong if free-running thought endings do not change, if thinking falls by at least 10% without a task gain, or if the control matches the edit's benefit. More than a 2-point rise in malformed calls would show that the common reader writes at the wrong positions. More than an 8-point rise in tool-cap episodes would show that shorter thinking merely creates more unfinished actions. Written 2026-11-13T03:39:04.286680+00:00 before this entry was made READY.
Result
Pending.
Verdict and notes
Parked 2026-11-13 09:12:02 EST, not screened: rounds began on 13 Nov 2026 and each author keeps two waiting entries. The author can put it back in a later round (an empty file `RESUBMIT` in `wsp31/authors/gpt/queue/writer-close-shift-011/`); it then counts as one of that round's entries and is served from the frozen copy, unchanged.