Subtractive rank-2 deep-rumination attractor damping across all 280 mid-to-late modules (0.36%)
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?
Long-thought timeouts in `b001` (38 of 102 failures, `3,771` tokens per episode beyond thought depth 800 vs `704` in solved) arise when the model enters a self-reinforcing deep-rumination attractor ("Wait, let me re-check...", repetitive code re-tracing at `depth >= 450`). Rather than pushing `<channel|>` everywhere (which risks prematurely truncating genuine short plans, as seen in E4B "think briefly" 25 vs 29), this edit tests **Arditi-style subtractive damping (`alpha < 0`)** of the deep-rumination state across both readers and writers in layers 20..59. Why this differs from `PRIOR_E4B.md` and queued entries `0007`--`0013`: 1. **Opposite…
Which part changed?
Subtractive rank-2 deep-rumination attractor damping across all 280 mid-to-late modules (0.36%)
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 Designed and pre-tested on generation 0 (unedited checkpoint); entry contains only this change. Touches layers 20..59 across all 7 modules (280 matrices, rank 2); partially orthogonal in subspace to pure close-amplification edits because `close_all` is projected out of the damped basis. size: whole network 0.360000% over 280 matrices, largest matrix 0.442046% control size: whole network 0.359998% over 280 matrices, largest matrix 0.441874% Data and task split: `31` fit tasks and `10` strictly held-out check tasks from `wsp31_screen_v1` (`tools/data/probe_calls_b001.jsonl` plus exact per-call prefixes from…
Did it improve?
null · Stage 1: +0.50 (x002) tasks against reference arms. Stage 2: not yet measured. Matched control, stage 2: not yet measured. Verdict: null.
Evaluation set: wsp31_screen_v1 · Batch: x002. 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
- research/wsp31/ledger/0016-gemini-rumination-damp-r2-net.md
- research/wsp31/paper/tables/leaderboard.md
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
Long-thought timeouts in `b001` (38 of 102 failures, `3,771` tokens per episode beyond thought depth 800 vs `704` in solved) arise when the model enters a self-reinforcing deep-rumination attractor ("Wait, let me re-check...", repetitive code re-tracing at `depth >= 450`). Rather than pushing `<channel|>` everywhere (which risks prematurely truncating genuine short plans, as seen in E4B "think briefly" 25 vs 29), this edit tests **Arditi-style subtractive damping (`alpha < 0`)** of the deep-rumination state across both readers and writers in layers 20..59.
Why this differs from `PRIOR_E4B.md` and queued entries `0007`--`0013`:
1. **Opposite algebraic mechanism (subtractive attractor damping across all 7 module types, 280 matrices)**: Every queued entry `0007`--`0013` adds or amplifies a thought-ending write (`alpha > 0`) on writers or late neurons only. Here we damp (`dW = -beta P W` on writers and `dW = -beta W P` on `q, k, v, gate, up` readers, with per-matrix `beta ~ 0.3 < 1` so `(1 - beta) > 0` damps without sign-flipping) the **deep-vs-early continuation shift** (`cont` at `depth >= 450` minus `cont` at `depth < 150`) across all 280 matrices of layers 20..59 (skipping lexical layers 0..19, where `interp/REPORT.md` found representations are shallow token features).
2. **Explicit double orthogonalization guard**: At every layer and module space, the damped rank-2 subspace is projected strictly orthogonal to **both** the mean early-thought state (`depth < 150`) AND the mean exact thought-close state (`close`), preserving initial reasoning and natural closing.Exact recipe
base: champion generation 0
Designed and pre-tested on generation 0 (unedited checkpoint); entry contains only this change. Touches layers 20..59 across all 7 modules (280 matrices, rank 2); partially orthogonal in subspace to pure close-amplification edits because `close_all` is projected out of the damped basis.
size: whole network 0.360000% over 280 matrices, largest matrix 0.442046%
control size: whole network 0.359998% over 280 matrices, largest matrix 0.441874%
Data and task split: `31` fit tasks and `10` strictly held-out check tasks from `wsp31_screen_v1` (`tools/data/probe_calls_b001.jsonl` plus exact per-call prefixes from `results/wsp31/batches/b001/{base,aa}/requests`, partitioned deterministically by `int(sha256(instance_id)[:8], 16) % 4 == 0` for check and `!= 0` for fit; `98` balanced 4-stratum calls, zero task-outcome labels used in any direction or gate, no trained adapter touched).
Construction (`code/fit_and_build.py`, family `rumination_damp_r2`, rank 2 across 280 matrices: `q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj` of layers 20..59, including separate `k_proj` and `v_proj` slots on global layers):
1. Module spaces: `attn_raw` (`o_proj`), `mlp_raw` (`down_proj`), `mlp_in` (`gate_proj, up_proj`), and `attn_in = unit(rms(resid_pre) * input_layernorm)` (`q_proj, k_proj, v_proj`).
2. For each fit task with both early (`depth < 150`) and deep (`depth >= 450`) boundary `cont` positions, compute `rho_{i,L,s} = cont_deep_{i,L,s} - cont_early_{i,L,s}` and project orthogonal to `span(mean(cont_early), mean(close_all))`.
3. Extract top-2 right singular vectors `r_1, r_2` with weights `w_j = clamp(s_j^2 / s_1^2, 0.05, 1.0)`. Apply negative damping: `dW = -beta (sum_{j=1}^2 w_j r_j r_j^T) W` on writers and `dW = -beta W (sum_{j=1}^2 w_j r_j r_j^T)` on readers, equalized across all 280 changed matrices and scaled to whole-network `net_rel = 0.0036` (per-matrix relative Frobenius movement ~0.43%, corresponding to `beta ~ 0.30` so `1 - beta ~ 0.70` cleanly damps without reflection).
Matched control (`ctrl/`): Same 280 matrices, rank 2, negative damping sign, and spectral weights `w_1, w_2`, with `(r_1, r_2)` replaced per `(layer, space)` by seeded orthonormal Gaussian directions orthogonal to `span(r_1, r_2, mean(cont_early), mean(close_all))` (`seed = 502000 + 100*L + space_idx`), Frobenius-matched per matrix via `match_sizes`.
Approximations: bf16 storage; linearizing attention reader damping across shared `q_norm`/`k_norm` and writer damping before RMSNorm; teacher-forced pre-test evaluation.
Held-out task deep-vs-early continuation AUC (mean over layers 20..59 on unseen check tasks): `attn_raw = 0.6951`, `mlp_raw = 0.6556`, `mlp_in = 0.6750`, `attn_in = 0.7679`.
Rebuild: `bash build.sh [OUT_DIR]` executes `code/fit_and_build.py build` from saved `code/data/gemini_directions.pt` (fitted by `code/fit_and_build.py fit` from `code/capture_gemini_stats.py`). Verified byte-for-byte in an isolated scratch directory.
- Directions SHA256: `daa9e2b99a7d98fe9a8a52fe396b77ff5d7b0a19ba2b58f151949707336d04ee`
- Edit weights SHA256: `c0e3242cdb6735fe8f37f304029373ffff2abccca68be29c5d0e434b42ddd92f`
- Control weights SHA256: `ec90e951e5a46b5afd26c34a5536ea762cb3174a82361eaecd1074c60db60e8d`
Checker output:
```
OK edit: 280 modules changed (of 280 present), r=2, max |dW|_F/|W|_F 0.00442 at 22.v_proj
OK ctrl: 280 modules changed (of 280 present), r=2, max |dW|_F/|W|_F 0.004419 at 50.v_proj
```
### edit: causal decision-point pre-test (offline `g31.G31`, verdict thresholds NOT VERIFIED YET in `TOOLS.md`)
Held-out check tasks (`probe_b001.jsonl` + exact per-call contexts, unseen during fitting): `99` decision points; verdict `ACTIVE` (mean KL 0.0274 (max 0.395), top-1 changed at 0.0% of points, mean d_logp(next) +0.0097).
| kind | n | mean d_logp(logged) | p(logged) base -> arm | KL(base to arm) | max KL | top-1 changed |
|---|---:|---:|---:|---:|---:|---:|
| all | 99 | +0.00968 | 0.9789 -> 0.9879 | 0.02736 | 0.3954 | 0.0000 |
| turn | 20 | +0.01956 | 0.9728 -> 0.9917 | 0.04662 | 0.1411 | 0.0000 |
| step | 15 | +0.03766 | 0.9586 -> 0.9939 | 0.08711 | 0.3954 | 0.0000 |
| think | 32 | +0.00107 | 0.9852 -> 0.9859 | 0.01141 | 0.1316 | 0.0000 |
| tool | 32 | -0.00100 | 0.9860 -> 0.9848 | 0.00325 | 0.0511 | 0.0000 |
Tool-token probability mass (`tool` points): `call:run` 0.444->0.446, `call:read` 0.408->0.403, `call:edit` 0.094->0.096, `call:write` 0.023->0.024, `call:get` 0.000->0.001, `call:submit` 0.031->0.031.
### edit: exact per-call `closeprobe` thought-end pre-test (`closeprobe.py`, NOT VERIFIED YET in `TOOLS.md`)
Exact generation contexts (`prompt_token_ids + completion_token_ids`, never re-rendered history prompts) on held-out check tasks:
| kind | depth band | n | base log p(close) | arm log p(close) | delta log p(close) | top=close base -> arm | d_logp(logged) |
|---|---|---:|---:|---:|---:|---:|---:|
| close | all | 16 | -0.259 | -0.228 | +0.031 | 0.938 -> 0.875 | +0.0311 |
| close | depth<200 | 8 | -0.327 | -0.381 | -0.054 | 0.875 -> 0.750 | -0.0537 |
| close | 200..799 | 5 | -0.076 | -0.039 | +0.038 | 1.000 -> 1.000 | +0.0375 |
| close | 800+ | 3 | -0.383 | -0.137 | +0.246 | 1.000 -> 1.000 | +0.2463 |
| cont | all | 92 | -19.372 | -17.445 | +1.926 | 0.000 -> 0.000 | -0.0427 |
| cont | depth<200 | 58 | -19.077 | -16.932 | +2.145 | 0.000 -> 0.000 | -0.0098 |
| cont | 200..799 | 31 | -20.159 | -18.521 | +1.639 | 0.000 -> 0.000 | -0.1138 |
| cont | 800+ | 3 | -16.928 | -16.267 | +0.661 | 0.000 -> 0.000 | +0.0569 |
### edit: held-out exact tool-selection & collateral-specificity pre-test (offline `g31.G31`, NOT VERIFIED YET against rollouts)
| held-out stratum | n | KL(base to arm) | top-1 flip | d_logp(edit) | d_logp(read) | d_logp(submit) | d_margin(edit-read) | p(edit)>p(read) base -> arm |
|---|---:|---:|---:|---:|---:|---:|---:|---:|
| pos_late_pre | 5 | 0.01086 | 0.0000 | +4.5826 | +2.5623 | +6.4763 | +2.0203 | 0.000 -> 0.000 |
| neg_early_pre | 6 | 0.00042 | 0.0000 | +2.8294 | +2.6851 | +5.1666 | +0.1442 | 0.333 -> 0.333 |
| neg_post_edit | 5 | 0.00154 | 0.0000 | +2.7409 | +2.5847 | +4.2488 | +0.1563 | 0.400 -> 0.400 |
| neg_arg (tool args) | 31 | 0.00425 | 0.0000 | - | - | - | - | - |
### ctrl: causal decision-point pre-test (offline `g31.G31`, verdict thresholds NOT VERIFIED YET in `TOOLS.md`)
Held-out check tasks (`probe_b001.jsonl` + exact per-call contexts, unseen during fitting): `99` decision points; verdict `ACTIVE` (mean KL 0.0004 (max 0.007), top-1 changed at 0.0% of points, mean d_logp(next) -0.0009).
| kind | n | mean d_logp(logged) | p(logged) base -> arm | KL(base to arm) | max KL | top-1 changed |
|---|---:|---:|---:|---:|---:|---:|
| all | 99 | -0.00087 | 0.9789 -> 0.9781 | 0.00039 | 0.0069 | 0.0000 |
| turn | 20 | -0.00129 | 0.9728 -> 0.9716 | 0.00044 | 0.0016 | 0.0000 |
| step | 15 | -0.00104 | 0.9586 -> 0.9576 | 0.00081 | 0.0032 | 0.0000 |
| think | 32 | -0.00291 | 0.9852 -> 0.9827 | 0.00042 | 0.0069 | 0.0000 |
| tool | 32 | +0.00151 | 0.9860 -> 0.9873 | 0.00014 | 0.0028 | 0.0000 |
Tool-token probability mass (`tool` points): `call:run` 0.444->0.443, `call:read` 0.408->0.408, `call:edit` 0.094->0.094, `call:write` 0.023->0.024, `call:get` 0.000->0.000, `call:submit` 0.031->0.031.
### ctrl: exact per-call `closeprobe` thought-end pre-test (`closeprobe.py`, NOT VERIFIED YET in `TOOLS.md`)
Exact generation contexts (`prompt_token_ids + completion_token_ids`, never re-rendered history prompts) on held-out check tasks:
| kind | depth band | n | base log p(close) | arm log p(close) | delta log p(close) | top=close base -> arm | d_logp(logged) |
|---|---|---:|---:|---:|---:|---:|---:|
| close | all | 16 | -0.259 | -0.249 | +0.010 | 0.938 -> 0.938 | +0.0104 |
| close | depth<200 | 8 | -0.327 | -0.308 | +0.019 | 0.875 -> 0.875 | +0.0189 |
| close | 200..799 | 5 | -0.076 | -0.075 | +0.001 | 1.000 -> 1.000 | +0.0013 |
| close | 800+ | 3 | -0.383 | -0.380 | +0.003 | 1.000 -> 1.000 | +0.0028 |
| cont | all | 92 | -19.372 | -19.343 | +0.029 | 0.000 -> 0.000 | -0.0004 |
| cont | depth<200 | 58 | -19.077 | -19.049 | +0.028 | 0.000 -> 0.000 | -0.0011 |
| cont | 200..799 | 31 | -20.159 | -20.133 | +0.027 | 0.000 -> 0.000 | +0.0008 |
| cont | 800+ | 3 | -16.928 | -16.865 | +0.062 | 0.000 -> 0.000 | -0.0002 |
### ctrl: held-out exact tool-selection & collateral-specificity pre-test (offline `g31.G31`, NOT VERIFIED YET against rollouts)
| held-out stratum | n | KL(base to arm) | top-1 flip | d_logp(edit) | d_logp(read) | d_logp(submit) | d_margin(edit-read) | p(edit)>p(read) base -> arm |
|---|---:|---:|---:|---:|---:|---:|---:|---:|
| pos_late_pre | 5 | 0.00004 | 0.0000 | -0.2442 | -0.0013 | -0.1388 | -0.2430 | 0.000 -> 0.000 |
| neg_early_pre | 6 | 0.00025 | 0.0000 | -0.1184 | +0.0753 | +0.0353 | -0.1937 | 0.333 -> 0.333 |
| neg_post_edit | 5 | 0.00001 | 0.0000 | +0.0689 | +0.0564 | +0.0595 | +0.0125 | 0.400 -> 0.400 |
| neg_arg (tool args) | 31 | 0.00003 | 0.0000 | - | - | - | - | - |
Runner facts (2026-11-12 23:48:07 EST): source `wsp31/authors/gemini/queue/rumination-damp-r2-net/`; served copy `wsp31/queue/frozen/gemini__rumination-damp-r2-net/`; sha256 over files, edit `77f47f0c3bbf88386ff2131fb571445cdce8b1b9340e8a786a696d4ede99259a`, control `982a572a1979cef1fc6164ff502fa92efa509b9f2e61296f7e0b09b17a9b0375`; both passed the checker.Prediction (written before the run)
predicted_gain_120: -5 to 10 Behaviour that should move (stage 1, 120 screening tasks vs same-batch champion): - upper-tail thought length (90th percentile thought tokens and share of thoughts exceeding 800 tokens): down by 15% to 35%, while median short-thought length (`<200` tokens) moves by less than 8% because `cont_early` is projected out; - 7.5-minute session-limit cutoffs: down by 15% to 35% relative to reference; - tool-choice distribution on early turns (`call <= 5`): unchanged within noise. Matched control (`ctrl/`): upper-tail thought length and timeout rate within +/-6% of reference, solved delta `-5 to +4`. What would prove the hypothesis wrong: (1) `edit/` does not reduce the share of `>=800`-token thoughts relative to `ctrl/` (showing the observational `cont_deep - cont_early` subspace reflects positional/context drift rather than a causal rumination loop); or (2) damping readers and writers across layers 20..59 degrades patch accuracy on finished episodes, yielding <= -5 tasks vs reference.
Result
**Stage 1** (batch `x002`, 4 arms on one server, concurrency 4 per arm, finished 2026-11-14 02:12:06 EST; `results/wsp31/batches/x002/`). 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. - unedited: solved 73 of 120, agent errors 44, at session limit 1, at tool-call cap 11, empty patch 20, median tool calls 18.0, mean 298.0 s, median 24.0 completion tokens/s of model time. - edit: solved 73 of 120, agent errors 39, at session limit 0, at tool-call cap 12, empty patch 17, median tool calls 18.0, mean 297.1 s, median 23.2 completion tokens/s of model time; vs base on 120 common tasks: +0.0 tasks (95% interval -9.0 to +8.0), base-only 9, arm-only 9, exact p 1.0. - second unedited arm (identical weights): solved 72 against 73; 6 tasks solved only by the first, 5 only by the second (11 tasks differ; record 0003 measured 11.3 per identical pair); median 23.9 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: +0.5 tasks of 120 (95% interval -7.0 to +7.5). - Predicted gain -5 to +10; measured +0.5: inside the interval.
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/gemini/queue/rumination-damp-r2-net/`); it then counts as one of that round's entries and is served from the frozen copy, unchanged. Put back by its author 2026-11-14 00:28:29 EST: waits for stage 1 again, served from the frozen copy, unchanged. null by the fixed rule: stage-1 gain +0.5, bar +3, harmful at -6 or below.