← All runs · issue #93 · program: round A complete
DONE c600-a9-anchorq-val600
finished 600/600 on the staging fix, with pg_clipfrac exactly
0 at every one of its 600 steps, confirming the operator's bug is gone. It is
also the run that settles the program against its own family: the FRLR gap
crosses the incumbent at step 424 and ends 2.12x worse, while the
optimizer's gradient median climbs 9.25x. Section 28 predicted exactly this
crossing and section 29 scores it. KILLED
a10 at step 62 on two registered triggers: the codec's bias is what
buys FRLR's entire gap advantage, see section 26. DONE
a5b, a6, a7, a8, a9,
each scored against a bar registered before its data existed. All twelve arms have
now been re-scored on stability rather than reward; the ranking is section 29 and its
own page.
| cell | codec | token-IS | gap @200 | true drift @200 | actor/kl_loss | terminal val | verdict |
|---|---|---|---|---|---|---|---|
90-prf-exactk-600 | PRF exact-k | off | ~14.3 | no probe | 0.9085 @600 | 0.6613 | incumbent, 600 steps |
a5b | FRLR | on + bnorm | 5.37 | 0.016754 | 2.2262 | 0.6593 | FAIL G3 |
a6 | PRF exact-k | on + bnorm | 14.13 | 0.026793 | 0.2918 | 0.5391 | FAIL G1 |
a7 | FRLR | off | 8.18 | 0.008200 | 5.8246 | 0.6713 | best, gap-slope FAIL |
a8 | FRLR, q cadence 20 | off | 6.83 @window | 0.00701 @150 | 0.1064 | 0.6613 | G1+G2-level PASS, slopes FAIL; capability TIED with a7 |
a9 | FRLR, anchor-owned Q | off | 7.00 @199 lowest | 0.00859 | 4.1330 | 0.6713 | flattest LATE trend; slope FAIL at the registered window |
a10 | FRLR, anchor-owned + unbiased | off | 14.88 @41-60 | 0.00242 @60 | 0.1775 | n/a | KILLED @62: gap = incumbent level |
c600-a9 | FRLR, anchor-owned, 600 steps | off | 31.10 @599 | 0.027622 | 0.5060 | 0.6633 | gap crosses at 424, grad drift 9.25x |
actor/kl_loss, val) = +1.00 and Spearman(probe/kl_dense, val) = -1.00: the gated metric is ordered the wrong way against capability in every cell, and the codec-free one is ordered correctly in every cell. a7 sits at 5.82 nats, inside the historical 3-8 nat collapse band, holding the best capability measured. Any gate on that band kills the winner. Recommendation: demote actor/kl_loss to a labelled diagnostic, promote probe/kl_dense, require a cadence-5 probe on every cell, gate promotion on val and OOD.Ledger about 43 of 100 GPU-h. a9 and a10 are chained as one sequential process on the box, so neither handoff idles the GPU; if a9 dies before step 30 the chain diverts to the 600-step durability run rather than repeating a9's failure in a10. The three finished cells' checkpoints (37G each, R2 sink was off) are uploading to R2 now, verified byte-exact before any local delete.
Protocol: answers were written down first from current understanding, then two dedicated subagents read the four papers in full, then each answer was re-checked. Changes are flagged.
No evidence that it does, and the papers explain why the fear is misdirected. "PRF accumulates extra movement" was a statement about the measured policy KL, not the weights. The codec-view KL mixes real policy drift with the codec's distortion of the measurement itself; the probe (section 4) is the instrument that separates them, and until it runs the honest bound is "at most ~60x dense in the codec's own view, far less in the real view". On the weights directly: movement is tiny in every regime (cosine-to-base ~1.0, relative change 0.03-0.13 percent), and the papers add the decisive detail that this is below the bf16 realization floor of 0.195-0.391 percent per weight, so most individual weights are bitwise unchanged. Capability evidence agrees: val held 0.451 to 0.661 over 600 steps and the 10-benchmark OOD suite showed parity with dense at step 100.
Refined after reading: the structural protection (KL-leashed, off-principal, spectrum-preserving updates) is conditional on the update stream being unbiased. Unbiased codecs (PRF, stochastic rounding) keep the protection; a biased coherent codec (PowerSGD held-Q) defeats it silently at unchanged update magnitude, which is exactly the early-layer-shift collapse we measured. Consequence: monitor geometry (spectral shift, principal angles), not weight norms.
Corrected bookkeeping: the train-inference gap series rose 13.88 to 14.66 but 87 percent of that is the sampler sharpening; the training-view component crept 14.46 to 14.74 (+0.28). And "RL updates 5-30 percent of parameters" is probe-dependent: bf16-aware probing revises it to ~46 percent changed for our 1.5B math class.
Three sound mechanisms adopted; one of our pre-reading ideas withdrawn.
The evidence so far favors "benign, possibly mildly regularizing" for unbiased codecs and "destructive" for biased ones. OOD dose-response: the compressed policy matched dense on all 10 benchmarks at step 100 and beat dense@150 on two, despite a ~1000x codec-view KL ratio. The #89 dropout arm (the classic noise regularizer) was benign; PowerSGD (biased) collapsed. The papers supply the mechanism (unbiased noise leaves the geometry routing intact; biased error defeats it), and the controlled test is now scheduled where it belongs: round C compares the winner to the dense control on the OOD suite at matched dense-view training KL, probe-measured. Pre-registered expectation: parity or slight codec advantage.
| paper | core finding | what we adopted |
|---|---|---|
| 2505.11711 RL Finetunes Small Subnetworks | RL updates 5-30 percent of parameters yet the update is 99+ percent full-rank; the subnetwork is consistent across seeds and algorithms; training it alone recovers full accuracy. | No naive low-rank compression of updates or sign traffic; LayerNorm droppable from sign traffic; subnetwork consistency motivates mask-based ideas but see next row. |
| 2511.08567 The Path Not Taken | The visible sparsity is a precision artifact plus geometry routing bias; with a bf16-aware probe it is 36-92 percent. Three gates: KL leash, off-principal steering, bf16 realization floor. Safe mask (~70 percent) tracks dense RLVR; principal-aligned training is worst; spectrum preserved. | Safe-mask sign traffic + bf16-delta refresh encoding (phase 2); geometry monitors (this program); the conditional-protection frame for biased vs unbiased codecs; RELEX cautions. |
| 2602.01826 Mismatch is an Optimization Problem | Gradient noise and the train-inference gap escalate in tandem; gradient error bounded by C times response-length squared; triggered LR halving stabilizes where constant LR collapses. | The static/creep decomposition of our gap; log E[rho] slope as the noise early-warning; a dormant LR brake (detect and log; never primary, since our collapse mode does not discriminate on update magnitude); response-length trigger for phase 2. |
| 2606.08779 Discrepancy-Constrained MDP | Constrain the per-token absolute probability difference between training and inference views under a budget c via a dual multiplier; ratio-free, so it survives where importance sampling degenerates; never drive the gap to zero (tolerance region). | The controller's dual/PI form, bounds, and nonzero setpoint; CVC mode (b) advantage shaping with dual lambda; the principled reason token-IS is dead on PRF but this is not. |
Dense control (live, protocol-identical): reference KL 0.0074@288 and concave; its train-inference gap settles at ~0.0002 nats with E[rho] = 1.0000. The gain G(t) between the curves grew 17 to 60 and is decelerating; whether the excess is real dense-view drift or mask adaptation is exactly what the probe measures in round B. Baseline gate card at step 100-120 (what every round-A arm must beat): reference KL 0.156-0.203, gap 14.24 nats, E[rho] 0.0014, training score 0.63-0.68 with slope 0.0032/step, entropy 7.81.
Baseline to beat: the #90 PRF exact-k 600-step run. One clarification the operator asked for: the every-25-step dense pass is a probe: it recomputes the batch's log-probabilities once with the codec switched off, measurement only, and never touches the weights. It feeds an adaptive coefficient on the always-on reference-KL leash (a dual-ascent controller with a nonzero setpoint tied to the dense control's curve). The channel that touches weights on a cadence remains the anchor (sign of a gradient EMA every 20 ticks, modeling the real-world slow sync).
| round | runs | steps | what it decides |
|---|---|---|---|
| R0 (running) | dense control finishes | 600 | full G(t), val at 300/450/600, the controller setpoint table |
| A: codec ladder | 5 (sr_quant SR, sr_quant RN, byte-parity hybrid, PRF+CVC, FRLR+token-IS) | 120 each | which arm shrinks the gap at the source without paying KL; SR vs RN decides the unbiasedness mechanism; CVC decides "can the gap be trained down"; FRLR+IS probes the never-tried small-gap corrected-drift quadrant |
| B: control plane | 1-2 | 200 | winner + probe + controller; first direct measurement of real dense-view drift under compression; controller must hold it under 2x dense |
| C: validation | 1 | 600 | beat the #90 card end to end: val parity, no tripwires, OOD parity vs dense (also the regularizer test) |
Rules: validation only in round C (gate cells use the free training reward slope); checkpoints only in round C (R2 sink); every decision rule is pre-registered in the issue; anything ambiguous goes to the analyst verdict, not a relitigated debate. Full equations for all nine mechanisms are in the issue body, section 4.
93-mismatch-control-kit)| item | what | commit | tests | knobs |
|---|---|---|---|---|
I1 | sr_quant codec: blockwise-absmax stochastic-rounding activation quantization, forward + backward, SR/RN modes, boot gate | d891b533 | in the 205-test pre-program baseline | COMM_EFF_QUANT_BITS / _BLOCK_SIZE / _ROUNDING |
I2 | log-ratio distribution metrics (p10/p50/p90, std, agree_frac_1nat): the tail-variance early-warning the optimization panel asked for | 001769fe | in baseline | none (always on with rollout correction metrics) |
I3 | dense-view probe every K steps (codec-off logprob recompute, measurement only) + kl_gain + dual/PI controller on the reference-KL coefficient + dormant LR-brake detector | c2606424 | 38 new, all pass | COMM_EFF_PROBE_EVERY / _CTRL_ENABLED / _KL_TARGET_TABLE / _KL_TARGET_FLOOR / _KL_TARGET_GAIN / _CTRL_KI / _CTRL_KP / _CTRL_BETA_MIN / _CTRL_BETA_MAX |
I4 | CVC both modes: (a) CE loss term on the codec view with warmup ramp, (b) DC-GRPO ratio-free advantage shaping with dual lambda | ca158ef9 | 19 new, all pass | COMM_EFF_CVC_LAMBDA / _WARMUP_STEPS; COMM_EFF_DC_ENABLED / _ETA / _TARGET (explicit, fail-loud) / _LAMBDA0 / _LAMBDA_MAX |
I5 | byte-parity subset quantization (PRF exact-k subset + 2-bit block SR, 1233 vs 1232 incumbent bits) + the run_93_cell.sh launcher for every cell in the matrix | f563c3cd | 9 + 10 new, all pass; bash -n on all launchers | COMM_EFF_QUANT_SUBSET_K; ROLLOUT_IS / ROLLOUT_IS_THRESHOLD; run_93_cell.sh ARM contract with DRY_RUN |
I6 | FRLR r48 k28 + decoupled token-IS threshold 2.0 (the never-tried quadrant) | config only (arm a5) | launcher-lint asserts the resolved config | ARM=a5 |
Suite: 281 tests pass at HEAD f563c3cd; the branch is pushed to origin so any cell launches on the box with one command (DRY_RUN=1 echoes the resolved config first). A single short verification pass over the final wiring returned LAUNCH_READY with all five checks passing (default-off safety, probe correctness, controller delivery, launcher contract, within-step identity). Known caveats recorded in the issue: the round-B/C setpoint table must be baked from the finished dense control before b1/c can launch (the launcher fails loud without it), and the step-600 val must be backfilled from train.log per the known WandB teardown race.
A dedicated planning subagent published the plan of record into issue #93 (deep tier, labeled awaiting:approval). It is ONE long-running recursive trial-and-error experiment, up to 3 days on exactly one H200, under a strict loop: run, observe, decide, next run, with every round designed from what the previous round found. One box serves every consecutive cell; no teardown between cells.
| loop stage | who runs it | what happens |
|---|---|---|
| 1. launch | experiment-runner | builds the payload, launches the cell from 93-mismatch-control-kit with one command, registers the ledger row, tees the heartbeat log |
| 2. observe (every cycle) | machine-monitor | cheap numeric health polls: step advance, ppo_kl identity, reference KL, entropy, reward, gap, grad norm, memory, NaN |
| 3. observe (anomaly only) | training-log-monitor | the classifier, dispatched only when the machine-monitor escalates |
| 4. gate read | Workflow fan-out | pulls the finished cell's WandB history, computes the pre-registered gate numbers |
| 5. decide | analyst | ONE bounded PASS / REVISE / STOP verdict per cell against the fixed gates; no verification loops |
| 6. next | loop | within a round the next cell auto-launches on a non-STOP verdict (no idle GPU); round boundaries are hard money/kill reads |
| 7. close | log-writer | SUMMARY row + PR when the program ends |
Round A ran to completion on 2026-07-25: a1, a3, a4 and a5 to 120 steps each, a2 stopped at step 60 under its pre-authorised kill. Every threshold below was committed in writing before a4 and a5 produced a single step, so none of it can have been fitted to the results.
The blind-committed lexicographic criteria produce no winner. Eligibility leaves the incumbent, a4 and a5; the drift veto then eliminates a4 and a5. a3 is excluded on wire budget by 0.5 bits, an overdetermined exclusion since it also fails both objective clauses. The incumbent survives its own vetoes by construction and fails the objective at 3.7x the settling bar.
| arm | wire bits | V1 drift slope @100-120 | V2 grad max/mean | V3 score level | gap slope 61-120 | gap level | E[rho] |
|---|---|---|---|---|---|---|---|
| dense (uncompressed) | n/a | 0.000016 | 0.07 / 0.05 | 0.6587 | -0.000000 | 0.0002 | 1.0000 |
| incumbent PRF exact-k | 1232 | 0.002176 | 4.17 / 1.65 | 0.6577 | +0.001867 | 14.2458 | 0.0021 |
| a1 1-bit SR | 2304 | 0.003887 (1.79x) | 0.70 / 0.65 | 0.6529 | +0.003265 | 13.7511 | 0.0025 |
| a2 1-bit RN | 2304 | killed@60, 6.86x, z=+15 | 9.15 / 8.20 | n/a | n/a | n/a | n/a |
| a3 parity hybrid | 1232.5 | 0.001616 (0.74x) | 5.25 / 2.89 | 0.6569 | +0.001300 | 14.9924 | 0.0017 |
| a4 PRF + CVC-CE | 1232 | 0.003955 (1.82x) | 3.62 / 1.84 | 0.6491 | +0.001685 | 14.2473 | 0.0025 |
| a5 FRLR + token-IS | 1232 | 0.004584 (2.11x) | 0.20 / 0.14 | 0.5908 | -0.002049 | 4.4842 | 0.3985 |
a3 and a5 are complementary failures. a3 clears every safety veto and moves the objective nowhere. a5 moves the objective decisively and fails two vetoes. No arm clears both, so the pre-registered decision ladder has no matching row and the registered judgment fallback governs: escalate to the operator, launch nothing.
The program's registered success criterion is a train-inference gap that settles. Four compressed arms rise. One falls.
| arm | gap at step 1 | gap late | change |
|---|---|---|---|
| incumbent | 13.8794 | 14.6529 | +0.7735 |
| a1 | 13.1822 | 13.7523 | +0.5701 |
| a3 | 14.5284 | 14.9928 | +0.4645 |
| a4 | 13.7994 | 14.2482 | +0.4487 |
| a5 | 10.7564 | 4.5810 | -6.1754 |
| dense | 0.0004 | 0.0002 | -0.0003 |
Named series direct-labelled; a1, a2 and a3 drawn as one muted band. Palette validated for colour-vision deficiency (worst adjacent pair ΔE 9.2 deutan, 27.6 normal).
The fall is genuine codec convergence, not a lower instrument offset: a5's training-view log-perplexity fell 9.9623 to 4.4848 while its sampler held near 0.19, and the gap is essentially the difference between the two throughout. FRLR's rank-48 basis warm-starts into an accurate reconstruction.
Only the three arms whose reference KL is comparable in level are drawn. a1 (2.284 nats) and a3 (0.923) are excluded because each carries a large stochastic-rounding view offset, so plotting them on one axis would repeat exactly the incomparable-levels error documented in section 10. a4 sits at 0.206, close to the incumbent. Series start at step 10 to exclude a5's warm-start transient, which peaks at 2.798 nats at step 2.
The veto fired on a leading indicator (slope), not a realised harm (level). a5's reference-KL level sits below the incumbent's in every window: 0.375x at 61-80, 0.584x at 81-100, 0.838x at 100-120, and 0.980x at step 120 exactly, with the fitted crossing about step 122.
Whether that acceleration saturates is not resolvable from 120 steps. The incumbent's own slope saturates after step 80 and its real 600-step trajectory is benign (0.19 at 120, 0.31 at 200, 0.45 at 300, 0.62 at 400, 0.91 at 600), nowhere near the 3-8 nat collapse band. An earlier draft of this analysis extrapolated a5's power law (exponent 2.65, self-consistent to 4 percent) to 3 nats by step 334 and stated it as fact; that was overclaimed from a 2.8x horizon extension and is recorded here as conditional.
a1 and a2 differ in exactly one environment variable, making a clean single-knob factorial. Varying noise energy 2.7x at zero bias moved drift not at all. Flipping to biased rounding at identical wire budget moved it 6.9x (z = +15). Provenance is unusually tight: one shared launcher branch, identical logical wire budget, and 6 of 7 confinement counters bit-identical at matched step 60.
Token-IS at threshold 2.0 downweights about 87 percent of tokens, which is a strong constant-direction estimator bias. So the a1/a2 law predicts a5's drift failure from arms it was never fitted to, and three checks agree: the fitted exponent 2.65 is bias-like (constant-direction bias grows as t squared, unbiased noise as t, and step size moves only the coefficient); a5 shows about 25x the incumbent's drift per unit gradient norm despite 12x smaller effective steps; and updates dominated by the ~13 percent agreement-region tokens explain the falling gap and the rising drift simultaneously. This resolves what looked like a paradox: smaller steps producing more drift.
This cost two near-miss decisions and is now quantified. The codec inflates the entropy reading about 43x: the dense control reads 0.1815 nats with its own sampler at 0.1792, agreeing to 1 percent as they must for an uncompressed run, while every compressed arm reads 7.79 to 7.94 against a sampler value of 0.18. Separately, 87 percent of a3's apparent gap-level disadvantage was step-1 offset measured with zero training done. a5's falling entropy read as textbook collapse and was nearly killed on it; Pinsker plus Fannes-Audenaert over the 151,936-token vocabulary caps any true policy-entropy change at 0.575 nats against an observed 2.24, so the drop was mathematically forced to be view movement.
The gap moves through rollout-view sharpening (-0.80 nats); the training view CVC-CE targets moves -0.035. Matched-window slopes agree within one HAC standard error in all five windows and a4's level is slightly higher. It bought nothing measurable (z = -0.91) for 82 percent worse drift. That is direct evidence for the registered DC-mode fallback, which is ratio-free.
Measured elasticity 0.494 nats of gap per e-fold of noise energy implies 6.5 to 8.5x the wire budget to reach the target. A pre-registered prediction that a3 would land near 13.6 nats failed (actual 14.99) for a structural reason: deletion and quantization are orthogonal variance axes (the deletion term is 18.948 for the incumbent, 2.116 for a3, 0 for a1), so a one-parameter fit through two arms cannot reach their mixture.
Recommended: one pre-registered 120-step probe, about 4 GPU-h, before committing 28 h to rounds B and C. The knob is rollout_is_batch_normalize, which defaults to False and which core_algos.py:2409 documents as normalising IS weights to mean 1.0. It restores about 6.03x of the observed 12.55x gradient attenuation. An earlier draft recommended widening the IS threshold instead; that was wrong, because only 0.33 percent of tokens sit at the cap while 88.4 percent are in the low tail, so raising it buys at most 1.11x.
Three riders fix round A's structural gaps: save checkpoints at 0/60/120 (round A saved none, so none of these five arms can ever be re-analysed); log actor-versus-reference KL through the anchor's existing paired dense replay, which yields a true-view drift channel essentially free and retires the codec-view ambiguity; and run step-120 validation plus two OOD benchmarks.
Ledger at the boundary: 20.1 of 100 GPU-h, about $67. Awaiting the operator's decision; nothing is launching.
Round A ended with no winner and one live lead, a5's falling gap. Two cells followed, each pre-registered before launch with thresholds hardcoded into the scoring script, because a bar that can be passed on the command line is not a pre-registered bar.
| gate | measured | bar | call |
|---|---|---|---|
| G1 learning, score level | 0.6277 | ≥ 0.6248 | COIN FLIP +0.52 Newey-West SE, bootstrap CI [0.6173, 0.6389] contains the bar, P(pass) 0.629 |
| G2 gap level | 4.4486 | < 14.2458 | PASS 0.31x |
| G2 gap slope | +0.000358 | ≤ +5.0e-4 | pass, but one sample flipped it |
| G3 drift slope | +0.008091 | ≤ 3.264e-3 | FAIL 2.48x |
Two things about that scorecard are worth more than the verdict. G2's slope clause is not a well-posed test, and this was demonstrated rather than argued: at 20 rows it read +0.001408, a fail at 2.8x, and adding step 120 moved it to +0.000358, a pass. The gap oscillates about 0.295 nats inside the 20-step window while the bar targets 0.010 nats, so a 20-step slope reports oscillation phase, not trend. It is recorded as passed and uninformative, and it would have been discounted had it failed.
And a5b validated at parity. Its terminal val is MATH accuracy 0.6593 against the incumbent's 0.6613 at step 150 and 0.6633 at step 300, while carrying 2.45x the incumbent's entire 600-step reference KL. The incumbent's own val wobbles across a range of 0.0120 between its four checkpoints and ends exactly where it started, so a5b sits inside its noise floor. The verdict's reasoning, that this was a bad trade under the rule against damaging the base model, was contradicted by that measurement. Section 13 explains why, and the explanation is not the one the verdict assumed.
a6 carries the same weighting as a5b on the incumbent's codec, and both cells run a dense probe: a forward pass on the same weights with the codec silent, no backward and no weight change. So probe/kl_dense is the policy's KL to the reference, and actor/kl_loss is that quantity seen through the codec.
Both panels are clipped to step 150, a6's extent when the figure was drawn, so the two arms are compared over an identical range. Left: what the matrix was gated on, where a5b sits far above a6 and above the incumbent. Right: the same two runs measured with the codec silent, where a6 is the higher line. The vertical scales differ by roughly 75x and the ordering of the two arms reverses between the panels. An earlier draft of this figure ran each series to its own last step, which let a5b's longer curve overtake and made it read as worse in both panels: the same cross-window error this report warns about, in graphical form.
| step | codec view | codec FREE | inflation |
|---|---|---|---|
| 25 | 0.00348 | 0.000252 | 13.8x |
| 100 | 0.19011 | 0.003857 | 49.3x |
| 150 | 0.80699 | 0.008710 | 92.6x |
| 200 | 2.22616 | 0.016754 | 132.9x |
This dissolves the val result rather than deepening it. a5b validating at parity was never surprising, because the base model was barely moved. No appeal to damage being collapse-only is required.
| channel | a6 (PRF) | a5b (FRLR) | who looks worse |
|---|---|---|---|
| codec view, 81-100 | 0.08037 | 0.14971 | a5b, by 1.86x |
| codec FREE, step 100 | 0.006561 | 0.003857 | a6, by 1.70x |
In codec view a6 is the safest arm in the matrix, with a drift slope of +0.001404 against the incumbent's +0.002176. In truth it drifts more than a5b, and the ratio widens: 1.22x, 1.44x, 1.70x at steps 50, 75, 100. The mechanism is the one the probe was added to test. PRF exact-k draws each mask from a fixed stationary distribution, so its offset is roughly constant and the inflation falls, 134.6x to 14.3x. FRLR refreshes its basis every step, so its offset adapts and the inflation rises, 13.8x to 132.9x. Codec-view drift is a real quantity times a codec-specific, time-varying, non-monotonic factor spanning an order of magnitude in each direction.
actor/kl_loss, which includes round A's drift column and the V1 veto as applied across arms. Round A ran no probes at all, so its drift numbers cannot be repaired retrospectively. Listed as open rather than refuted: the a1/a2 factorial behind "coherence, not magnitude". That was a within-codec-family comparison at identical wire, so it may well survive, but rounding mode is exactly the kind of change that shifts a view offset, and neither arm has probe data. Unaffected: the gap findings, established structurally at step 1 and cross-checked against the dense channel; the wire budgets, computed from source; and a5b's val, a direct capability measurement.a6 fails G1 at 0.4854 against the 0.6248 bar, 0.74x the incumbent, and it is not the onset delay that a5b showed. a5b closed from 0.71x to 0.98x across this span; a6 sits flat at 0.79x, 0.76x, 0.76x, 0.74x, 0.78x and does not move. Same weighting, same normalisation, opposite trajectory, so the deficit is an interaction rather than a property of the weighting alone.
| window | a5b ESS | a6 ESS | a5b IS mean | a6 IS mean | a5b grad_norm | a6 grad_norm |
|---|---|---|---|---|---|---|
| 41-60 | 0.2357 | 0.0019 | 0.1772 | 0.0024 | 0.6692 | 29.79 |
| 81-100 | 0.2696 | 0.0007 | 0.1732 | 0.0007 | 0.9647 | 41.65 |
| 121-150 | 0.2644 | 0.0006 | 0.1586 | 0.0005 | 0.6987 | 57.12 |
a6's effective sample size is 0.0006, so a 128-sequence batch does the statistical work of about 0.08 sequences, with 99.97 percent of tokens in the low tail. rollout_is_batch_normalize divides by the mean weight, so at 0.0005 it amplifies the surviving mass by roughly 1600x to 2000x, and that mass rests on a handful of tokens. Gradient norm reaches 57.1 against the incumbent's 1.73, a factor of 33, still climbing, with a maximum of 248.8 excluding the step 1-3 transient.
The cause is the gap itself. The weight is exp(log πtrainer − log πrollout). At PRF's 14.1 nats that exponential is essentially zero for nearly every token; at FRLR's 4.4 nats the mean lands at a workable 0.17. The amplification factor is 1/mean_weight and mean_weight shrinks as the gap grows, so batch normalisation converts a large gap into a gradient explosion.
Health is impaired rather than degenerate: entropy flat at 7.8086, aborted ratio 0.0000, score still slowly rising, response length falling from 674.7 to 592.7.
The two finished cells jointly establish that the 3.2x gap reduction is FRLR's alone, since a6 reproduces the incumbent's gap to 0.8 percent while carrying the same weighting, and that the weighting is only viable because the gap is low. Neither shows the weighting is necessary. The corner of the design nobody has run is FRLR on its own.
| token-IS off | token-IS on + bnorm | |
|---|---|---|
| PRF exact-k | incumbent: gap 14.25, learns 1.00x | a6: gap 14.14, learns 0.78x, ESS 0.0006 |
| FRLR r48/k28 | a7, running now | a5b: gap 4.45, learns 0.98x, true drift 0.0168 |
a7 answers two questions in one cell. Does FRLR alone deliver the gap win with no importance-sampling estimator at all, and therefore no ESS, no truncation bias, no normalisation amplification and no onset delay? And does token-IS add true, codec-free drift? a7 against a5b is the same codec with the weighting on and off, with a dense probe on both, which is the one attribution that was otherwise impossible because the incumbent has no probe.
Four predictions are registered so the read is falsifiable: gap lands at 4.2 to 5.0 nats; learning clears 0.6248 without a5b's onset delay, so its score at 41-60 exceeds 0.3728; codec-free drift at step 200 comes in at or below a5b's 0.016754; and no rollout_is_* metrics appear at all, which is itself the check that the arm is configured as intended. Codec verified byte-identical to a5b by diffing the resolved config, so the only difference is the weighting.
Both probe cells ran a terminal validation, which round A did not. Put the gated quantity next to the capability it was supposed to protect.
| cell | codec-view drift @200 | codec-FREE drift @200 | terminal val | vs incumbent | gate said |
|---|---|---|---|---|---|
| incumbent | 0.9085 @600 | no probe exists | 0.6613 @150 | 1.000x | reference |
| a5b FRLR + token-IS | 2.2262 | 0.016754 | 0.6593 | 0.997x | FAIL 2.48x |
| a6 PRF + token-IS | 0.2918 | 0.026793 | 0.5391 | 0.815x | PASS |
Read the second and fifth columns together. a5b carries 7.63x a6's codec-view drift and has 1.22x its capability. The registered gate passed a6, whose drift slope of +0.001404 beat the incumbent's +0.002176, and failed a5b at 2.48x over threshold. The capability outcome is the exact reverse of both calls.
It is not damage below baseline. a6's val of 0.5391 tracks its own training score of 0.4932 at step 200, and both arms started near 0.357, so a6 improved on the base model and simply improved less. Calling it capability damage would overstate the evidence.
What it does show is movement without benefit. Taking the common starting score as a proxy for base val, which is a proxy because both cells ran with validation before training disabled:
| cell | true drift | capability gained | drift per unit gained |
|---|---|---|---|
| a5b | 0.016754 | 0.302 | 0.0554 |
| a6 | 0.026793 | 0.182 | 0.1471 |
a6 moved 2.66x further from the base model per unit of capability acquired. That is what an effective sample size of 0.00067 and a gradient norm of 64 actually cost: not a broken model, an inefficient one that spends weight movement without buying accuracy.
Neither recorded verdict changes. Both cells were scored against bars registered before their data existed, which is the only reason this evidence is worth anything.
a7 is the corner of the design nobody had run. It answers the two questions a5b and a6 left open, and at step 51 of 200 it has already settled the first.
| window | gap | score | grad_norm | ||||||
|---|---|---|---|---|---|---|---|---|---|
| incumbent | a5b | a7 | incumbent | a5b | a7 | incumbent | a5b | a7 | |
| 2-20 | 13.7495 | 5.6815 | 5.6509 | 0.3603 | 0.3575 | 0.3655 | 2.139 | 13.437 | 6.391 |
| 21-40 | 13.8450 | 4.5474 | 4.5207 | 0.3920 | 0.3524 | 0.3883 | 1.845 | 0.642 | 2.273 |
| 41-51 | 14.0167 | 4.7278 | 4.4749 | 0.4934 | 0.3604 | 0.4831 | 1.863 | 0.620 | 1.718 |
a7 carries no importance weighting of any kind and reproduces a5b's gap to within 5 percent at every window, the same 3.1x reduction at the same 1232-bit wire. Together with a6, which carried the weighting on the incumbent's codec and reproduced the incumbent's gap to 0.8 percent, the attribution closes from both directions: token-IS contributes nothing to the gap and FRLR contributes all of it.
a7 shows no onset delay at all, tracking the incumbent from the first window and reaching 0.979x by 41-51 where a5b sat at 0.730x and had not begun learning. Gradient norm tells the same story: a7 runs at 1.72 against the incumbent's 1.86, where a5b was suppressed to 0.62 by the IS weights and a6 amplified to about 30 by normalisation at a large gap. a7 is the only compressed arm in this program whose gradients look normal.
Nothing is settled until the registered window at 100-120 and the terminal validation. But no previous cell has had this combination: the full gap reduction, incumbent-speed learning, normal gradients, no importance-sampling machinery, at the incumbent's exact wire budget.
All three probe-bearing cells finished with a terminal validation, which round A did not have. Putting the gated quantity beside the capability it was meant to protect gives the program's clearest result.
| cell | actor/kl_loss @200 | codec-FREE drift @200 | terminal val |
|---|---|---|---|
| a6 PRF + IS + bnorm | 0.2918 | 0.026793 | 0.5391 |
| a5b FRLR + IS + bnorm | 2.2262 | 0.016754 | 0.6593 |
| a7 FRLR, no IS | 5.8246 | 0.008200 | 0.6713 |
Spearman(actor/kl_loss, val) = +1.00. Spearman(probe/kl_dense, val) = -1.00. Higher codec-view "drift" goes with better capability in every cell; higher real drift goes with worse capability in every cell. With n = 3 a perfect ordering arises by chance one time in six, so this is consistent evidence rather than proof, but the effect sizes are large and it matches the mechanism in section 13.
a7 carries 5.8246 nats of actor/kl_loss, inside the 3-to-8 nat band this program has treated as its danger zone, while holding the best capability ever measured here. Its real drift is 0.0082 nats and its inflation factor 710.2x. Any gate defined on that band would have killed the winning arm.
a7's 0.6713 is +0.0090 over the incumbent interpolated at step 200, and the incumbent's own checkpoint-to-checkpoint spread is 0.0120. So this is not a clear win over the incumbent: a7's margin is smaller than the reference's own variability. The fair framing is the step count, since a7 reaches at 200 steps what the incumbent needed about 450 steps to reach, and it exceeds three of the incumbent's four checkpoints.
a7 cut the train-inference mismatch 3x and its capability advantage is within the reference's noise. Meanwhile the incumbent ran 600 steps at 14.6 nats of mismatch and finished at the same validation accuracy it had at step 150.
The most parsimonious reading of all the evidence is that at this model scale and horizon, a 14-nat train-inference mismatch is simply not harmful, which partly undercuts minimising it as the objective. That is a hypothesis rather than a proof: the mismatch may bite beyond 600 steps or at larger scale, and this program has not tested either. But it belongs on the table alongside the codec comparison.
a7's one real defect is that its gap stops settling. The mechanism points at a single existing knob: frlr_q_cadence=1 means Q is rebuilt every step and chases a policy that a7 moves faster than any prior arm, so the basis lags further as learning accelerates. a8 is a7's exact codec with the cadence raised to 20, mirroring the PowerSGD governance in which Q moved only at anchor fires.
| gap window | a7, cadence 1 | a8, cadence 20 |
|---|---|---|
| 2-20 | 5.6509 | 10.7863 |
| 21-40 | 4.5207 | 11.7151 |
| 41-55 | 4.4807 | 9.5046 |
| slope 21-55 | -0.00141 | -0.09397 |
At step 55 a8's gap is about 2x higher in level than a7's though falling fast, and its inflation at step 50 is 376.7x against a7's 71.6x, the opposite of what the hypothesis predicted.
The train-inference gap is driven by the reconstruction error the codec injects into the trainer's forward pass. Both codecs send exactly 77 numbers out of a 1536-dimensional activation. They differ in what those numbers buy.
Transformer activations are strongly anisotropic, so the covariance spectrum decays fast and a rank-48 subspace aligned to the top eigenvectors captures far more than its nominal 48/1536 = 3.1 percent of the energy. PRF's coordinate deletion captures exactly k/H = 5 percent regardless of structure, because the coordinate axes have nothing to do with the principal directions.
The measurement confirms it is alignment and not the low-rank form. At step 1, where Q is a deterministic seeded frame and therefore a random subspace, FRLR is only 1.29x better than PRF (13.8794 against 10.7259), and the energy accounting says the two capture 5.0 and 4.9 percent respectively, which is a tie. By step 20, once the power iteration has fitted Q, the advantage is 2.98x.
The obvious explanation is that Q goes stale between fits. Cell a8 refutes that. Freezing Q for 20 steps should make staleness worse, and instead the trend flattened by 13x:
| at window 100-120 | a7, cadence 1 | a8, cadence 20 |
|---|---|---|
| score | 0.6559 | 0.6602 |
| gap level | 5.0849 | 6.8293 |
| gap slope | +0.016351 | +0.001262 |
| gap slope 61-120 | rising | -0.026533 |
| true drift | 0.00438 | 0.00459 |
a8's gap runs 11.7151 -> 8.0304 -> 6.8293, falling monotonically, where a7's rose to 8.1849 by step 200. So the mechanism is estimator variance in Q. At cadence 1 the basis is re-derived every step from a single batch's sketch with one power iteration, so it jitters, and that jitter grows as the policy's activations diversify. At cadence 20 the sketch accumulates over 20 batches before orthonormalising, so Q is estimated from 20x more data and stops jittering. a8's higher level is the flip side of the same fact: only 10 refreshes in 200 steps, so it converges from its random start more slowly.
| candidate mechanism | status |
|---|---|
| Q estimator variance (under-averaged basis) | supported by a8's 13x flatter slope |
Estimator bias (the capped gamma norm matching) | still open, and now scheduled. a8 flattening while still biased shows variance is sufficient to explain much of the trend, not that bias is excluded. See section 22. |
| Activations becoming less compressible as RL proceeds | not measurable: no FRLR spectrum diagnostic exists (rank1_evr_mean is the anchor's RELEX predictor, not the codec basis) |
An earlier section of this report attributed the climb to Q going stale. That reading is superseded by a8 and is corrected here rather than edited away. It was also nearly acted on: a step-55 read of a8 looked bad enough to justify killing the cell, and killing it would have destroyed the only evidence that identifies the mechanism.
The practical consequence points where the operator's architectural constraint already pointed. Anchor-owned Q is the limit case of what a8 tested, namely refresh rarely from a large accumulated sketch, and it has a second benefit: if Q lives in the anchor then its broadcast rides the slow circuit, which this program already does not charge to the wire budget, so the 1233.4-against-1232 discrepancy from the Q correction disappears entirely.
a8's registered window is complete at 21 rows. It passes G1 and the G2 level and fails both slope clauses, and it is the arm to build on: best learning in the program, less than half the incumbent's gap, the flattest gap trend of any FRLR arm by 13x, the lowest codec-free drift, no importance-sampling machinery, wire parity to 0.1 percent.
| gate | a8 measured | bar | call |
|---|---|---|---|
| G1 learning, score level | 0.6602 | ≥ 0.6248 | PASS, 1.004x the incumbent |
| G2 gap level | 6.8293 | < 14.2458 | PASS, 0.48x |
| G2 gap slope | +0.001262 | ≤ +5.0e-4 | FAIL 2.5x, but 13x flatter than a7 and negative over 61-120 |
| G3 drift slope | +0.006967 | ≤ 3.264e-3 | FAIL 2.1x, codec view, no physical content |
| G4 wire | 1233.4 bits | 1232 | parity to 0.1% |
a7 and a8 run the identical codec. The only difference is that a8 refreshes Q every 20 steps instead of every step. Their codec-view drift readings:
probe/kl_gain first | last | direction | actor/kl_loss | |
|---|---|---|---|---|
| a7, cadence 1 | 71.6x @50 | 710.2x @200 | rising | 5.8246 |
| a8, cadence 20 | 5641.4x | 157.4x | falling | 0.1064 |
Codec-free, a8 is the cleanest cell measured: probe/kl_dense = 0.007006 at step 150 with a full-run slope of +5.1e-05, and probe/gap_dense averaging 0.000302 nats. So the codec accounts for a factor of 22619 in the measured gap: essentially all of the 6.83 nats is codec view, not policy divergence. The LR brake fired 0 of 30 probes, against a7's 1.
The confound I built in, restated so it is not forgotten. At cadence 20 over 200 steps Q gets only 10 power iterations against a7's 200, so a8 varies both view stationarity (intended) and total Q fitting (not). Its higher gap level against a7 (6.83 vs 5.08) is most likely that under-fitting rather than a cost of the slow cadence. Cadence 5 would have separated them; the operator's architectural instruction supersedes the question, so no cell is being spent on it.
In section 20 I concluded that estimator bias is "not the main driver" of the gap climb, on the grounds that a8 flattened the trend while still being the biased variant. The operator pushed back and asked why there would be no point testing the unbiased mode, given that the program's divergence and collapse had been attributed to directional bias in the first place. That pushback is right and my reasoning was bad in two distinct ways.
| my claim | what was wrong with it |
|---|---|
| "a8 flattened while biased, so bias is not the driver" | a8 shows variance is sufficient to explain much of the trend. It does not show bias is excluded. Two mechanisms can both contribute, and I treated sufficiency as exclusivity. |
| Reasoning about the 200-step gap trend | The question asked was about divergence and collapse, a different quantity. a8's gap trend says nothing about whether the codec's bias causes divergence at 600 steps. |
On the question actually asked, the program's strongest evidence is the operator's: the a1/a2 factorial killed the biased round-to-nearest arm at step 60 with 6.9x worse drift at z = +15, while the unbiased stochastic-rounding arm survived. One environment variable apart. And the two codecs in this program differ on exactly that axis: PRF exact-k is unbiased (constant 1/(1-p) gain, exact to 0.26%), FRLR as run is biased (a capped, detached, data-dependent gamma). It has never been isolated within FRLR.
actor/kl_loss, the channel section 13 shows ranks the wrong way against capability, and neither arm carries a probe. So "bias causes drift" is open, not established. That cuts in both directions, and what settles the argument is cost: one variable, 6.5 GPU-h, ahead of a 20-hour 600-step commitment. Going into that commitment with a known bias when the unbiased variant is one environment variable away is bad sequencing.| # | run | what moves vs the previous | cost |
|---|---|---|---|
| 1 | a9-frlr-anchorq-200 | Q governance only: harvested from the anchor's clean stale-weight forward, refreshed only when the anchor fires. Two things a cadence knob cannot do: Q is fitted to the slow net so it cannot chase the policy at all, and the broadcast rides the uncharged slow circuit, restoring exact 1232-bit parity. | ~6.5 h |
| 2 | a10-frlr-anchorq-unbiased-200 | Bias only: the residual gain becomes the constant H/k, so E[ĥ|h,Q] = h exactly, at negative wire cost (the per-token norm scalar stops being sent, 76 numbers rather than 77). | ~6.5 h |
| 3 | 600 steps of the winner | Horizon only. PRF is the sole arm proven at 600; every other result here is 200 steps. Not yet authorized. | ~20 h |
Anchor-owned FRLR needed code, not a flag. The config validator rejected the combination outright on the stated premise that the codec "has no PowerSGD basis Q for the anchor to own". That is true of the plain PRF mask and false for FRLR, which does carry a per-boundary basis. And the mask codec had no ownership plumbing at all. Both landed with 25 new tests (159 pass, lint clean), including one that caught a real bug before it reached the GPU: the harvest gate read is_grad_enabled() from inside a no_grad block, where it is False by construction, so the sketch would never have accumulated.
The registered bar is scored at 100-120 and is not evaluable yet. This section records one thing only: whether the code does what it was written to do.
[comm_eff][frlr-anchor-q] refreshed global_step=20 anchor_step=20 boundaries=7 refreshes=7Traceback, AssertionError or FATAL in the log.refreshes=7 is decisive rather than merely encouragingThe refresh counter is incremented in two places: the fast path's cadence branch, and the anchor's update. Under anchor ownership the fast branch is skipped outright, so the counter can only move inside the anchor. The model has 7 masked boundaries at pp_size=8, and one anchor fire refreshes all 7.
| if... | counter after 20 steps | observed |
|---|---|---|
| the anchor is the sole Q writer (intended) | 7 (one fire x 7 boundaries) | 7 |
| the fast path were still writing Q at cadence 1 | about 140 (20 fires x 7) | not observed |
So the arithmetic confirms both halves of the instruction at once: the anchor IS the Q writer and the fast path is NOT. That is a much stronger check than "it did not crash", and it is exactly the property that could have failed silently, leaving an arm that reported itself as anchor-owned while behaving like a7.
The engine asserts a non-empty sketch before refreshing. Passing it means the entire harvest chain executed: the validator accepted prf_mask with owns_q, the state plumbed the flag onto the codec, the engine registered the codec on the anchor clone, and the hook's harvest branch ran ahead of the confinement assert with path_tag=None. That last step is where the bug a unit test caught would have bitten: the harvest gate read is_grad_enabled() from inside a no_grad block, where it is False by construction, so the sketch would have stayed empty and this assert would have fired at step 20 instead of at test time. Timing was as predicted as well: one optimizer tick per step at batch 128 / mini 128, and an anchor cadence of 20 ticks puts the first fire at exactly step 20.
Three times in this session I extrapolated from a window far too short to carry the claim: a9 read as 1.7x slower than a8 from four step times (its per-step times in fact match a8's), R2 upload concurrency judged on four minutes of part counts, and R2 throughput projected at 2.2 MB/s where 20.6 minutes of data gives 5.78 MB/s, which is the difference between "the back-fill will not finish" and "it takes 6.7 hours". Each was corrected within the hour, and one error of the same class nearly justified killing a8, the cell that identified the gap mechanism.
| gate | a9 | bar | call |
|---|---|---|---|
| G1 learning, score level | 0.6612 | ≥ 0.6248 | PASS, highest window score in the program |
| G2 gap level | 5.9232 | < 14.2458 | PASS, 0.42x |
| G2 gap slope | +0.009262 | ≤ +5.0e-4 | FAIL 18.5x |
| G3 drift slope | +0.024098 | ≤ 3.264e-3 | FAIL, codec view, no physical content |
| G4 wire | 1232 bits | 1232 | PASS, now literally: Q rides the uncharged slow circuit |
The mechanism works, verified by arithmetic rather than by absence of a crash. Five anchor fires at steps 20/40/60/80/100 with the refresh counter at 7/14/21/28/35, exactly 7 per fire. Under anchor ownership that counter can only move inside the anchor, so 35 after 100 steps proves the fast path never wrote Q; at cadence 1 it would read about 700.
P2 (gap level between a7 and a8), P3 (learning within 0.02 of a7), P4 (inflation falls rather than rises) and P5 (wire exactly 1232) all confirmed. P1 failed: I predicted the slope would be at or below a8's +0.001262 because anchor ownership is "the limit case" of a8's mechanism. It came in 7.3x higher. The middle outcome pre-committed in the a9 pre-read is the one that fired.
| at 100-120 | score | gap level | gap slope | actor/kl_loss |
|---|---|---|---|---|
| incumbent PRF | 0.6577 | 14.2458 | no probe | 0.9085 @600 |
| a7 fast Q, cadence 1 | 0.6559 | 5.0849 | +0.016351 | 5.8246 |
| a8 fast Q, cadence 20 | 0.6602 | 6.8293 | +0.001262 | 0.1064 |
| a9 anchor-owned Q | 0.6612 | 5.9232 | +0.009262 | 0.7003 |
a9 is second on both gap measures, and the 0.0053 learning spread across all four arms is well inside the incumbent's own 0.0120 checkpoint spread, so that ordering carries no weight. Anchor ownership buys a better level than a8 and a flatter slope than a7, and is worse than each on the other axis. Neither FRLR arm dominates.
A matched-step check stopped me publishing the opposite claim. a9's codec-free drift reads 0.005265 at step 120, a8's quoted figure was step 150 and a7's step 200, and drift grows with steps, so "a9 has the lowest drift in the program" would have been an artifact of comparing different points on the same curve.
probe/kl_dense, codec-FREE | a5b | a7 | a8 | a9 |
|---|---|---|---|---|
| step 50 | 0.000752 | 0.001576 | 0.001520 | 0.001498 |
| step 100 | 0.003857 | 0.003992 | 0.004282 | 0.004319 |
| step 120 | - | 0.005095 | 0.005329 | 0.005265 |
actor/kl_loss reads 5.8246, 0.1064 and 0.7003, a 55x spread. So Q governance moves the gap and it moves the codec view, and it moves neither capability nor real drift. This is the strongest form of section 13 yet: not merely that the gated metric is mis-calibrated, but that a single knob swings it 55x while the physical quantity it claims to measure does not move.a5b sits lower at steps 50 to 100 for the reason already established: token-IS suppressed its learning, and a model that learns less moves less.
The run-3 selection rule was built on a false premise. It read "flattest gap slope among {a9, a10}", which presumed a9 would dominate a8. It does not, so as written it would send a 7.3x worse slope into the 20-hour run.
The obvious untested cell, one variable from a9: anchor-owned Q accumulating its sketch over several anchor fires before orthonormalising, instead of one minibatch per refresh. a9 beats a8 on gap level using a single minibatch of sketch data against a8's twenty steps' worth, which says slow-net alignment buys the level; a8's flatter slope says sample size buys the slope. Nothing in the matrix has both. Not scheduled, and it is new spend.
And the question the program keeps circling. Within the FRLR family the gap spans 5.08 to 6.83 and the slope +0.0013 to +0.0164, while capability and real drift are flat. Nothing measured in 200 steps distinguishes these arms on any quantity that matters to the deployment. That does not make the gap unimportant; it means its importance is unestablished at this horizon, which is exactly what the 600-step run exists to test.
a9 finished 200/200 with zero errors and ten anchor fires, refresh counter 70, exactly 7 per fire throughout. Its terminal validation is 0.6713426853707415, which is identical to a7's to the digit: both are 335 of 499 problems. A coincidence at the problem level, but it settles the capability question between them.
| step | a7 gap | a8 gap | a9 gap |
|---|---|---|---|
| 60 | 4.4546 | 9.5067 | 5.7190 |
| 120 | 5.1976 | 6.8292 | 5.9989 |
| 150 | 6.0681 | 6.4195 | 6.5184 |
| 199 | 7.7618 | 7.2249 | 7.0031 |
| OLS gap slope | a7 | a8 | a9 |
|---|---|---|---|
| 100-120 (REGISTERED) | +0.016351 | +0.001262 | +0.009262 |
| 121-150 | +0.026249 | -0.007288 | +0.016096 |
| 150-199 (late) | +0.038535 | +0.018366 | +0.012172 |
The registered window is 100-120, a8 wins it, and switching to the window that ranks arms the way one now prefers is exactly the goalpost move this program has been disciplined about. Stated precisely: on the registered criterion a8 is the best arm, and that stands. What the late data shows is a reliability problem with using that number to predict 600-step behaviour, since a slope measured at a curve's turning point extrapolates badly by construction, and the 100-199 figure gives a8 +0.001485 only because its fall cancels its rise.
Section 24 states that the operator's anchor-Q constraint "has a measurable cost" of 7.3x on the registered criterion. That was measured at a8's turning point and overstates the case.
| measure | best arm |
|---|---|
| registered gap slope, 100-120 | a8 |
| late gap slope, 150-199 | a9 |
| gap level at step 199 | a9 |
| terminal validation | a9 = a7 |
| codec-free drift, matched steps | all three identical |
On three of five measures a9 is at least tied best, and of the two where a8 leads, one is the turning-point artifact. So the honest revision is that the constraint's cost is not established and may be zero. Recorded as a correction rather than by editing the earlier claim away.
a9 was the first cell with the in-training R2 checkpoint sink enabled, and it turned teardown from a8's roughly two minutes into a bandwidth-bound wait. The log reports the upload as queued "async", and it is async with respect to training but not with respect to process exit: a9 sat at step 200 with the GPU at 0 percent while 19G uploaded, and exited within a minute of those uploads being killed. Measured progress was 16 of 74 parts in 7 minutes, so the full wait would have been about 55 minutes of idle GPU; stopping it cut the handoff to 11 minutes, and the checkpoint was never at risk because it sits on local disk with deletion disabled. For a 600-step run with three saves that is roughly 2.5 hours of idle GPU. Either make the sink genuinely asynchronous or leave it off and back-fill, which is what a5b through a8 did at no cost to occupancy.
a10 was a9's exact configuration plus frlr_unbiased=true, so the residual gain becomes the constant H/k and the reconstruction is exactly unbiased. One environment variable. It was killed at step 62 on two pre-registered triggers, per the instruction not to wait 200 steps when the signal is clear.
| trigger | measured 41-60 | threshold | result |
|---|---|---|---|
| a10 gap level | 14.8751 | ≤ 8.7078 (1.5x a9's) | KILL, 2.56x a9 |
| gap at step 60 | 14.9201 | ≤ 12.0 | KILL |
| score level | 0.5179 | ≥ 0.40 | pass |
| gap slope | +0.008671 | ≤ +0.016 | pass |
probe/kl_dense, codec-FREE | a9 biased | a10 unbiased | ratio |
|---|---|---|---|
| step 25 | 0.000285 | 0.000256 | 0.90x |
| step 50 | 0.001498 | 0.001471 | 0.98x |
| step 60 | 0.002511 | 0.002419 | 0.96x |
Removing the bias lowers real drift by 2 to 10 percent. Consistently in the predicted direction at all three probe points, so probably a real effect, and the same order as the 4 to 8 percent arm-to-arm noise already established across a7/a8/a9. Against a gap penalty of 2.56x, the trade is not close. The mechanism is the one the pre-registration named: the constant H/k gain is unbiased in expectation but has higher per-token variance, and the gap is a per-token KL, so it is exactly the quantity variance inflates.
a10 is also the only arm below the wire budget, at 1216 bits: 76 coordinates rather than 77, because the unbiased gain makes the per-token norm scalar unnecessary. Verified from the runtime mask_ratio of 0.9505208 = 1 - 76/1536 rather than from the config alone. It bought 16 bits and paid 9 nats.
| claim | status |
|---|---|
| For FRLR, directional bias drives reference drift | REFUTED. The unbiased arm drifts 2-10% less while its mismatch is 2.56x worse |
| The a1/a2 factorial (biased arm killed at step 60, 6.9x worse drift) | NOT overturned. That was sr_quant 1-bit, where bias is a rounding error on EVERY coordinate; a10's is a single detached per-token scalar on a low-rank residual. Structurally different objects |
| FRLR's advantage rests on a biased estimator | ESTABLISHED, and new. A real property of the proposed method, not previously characterised |
The pre-registered selection rule was "flattest gap slope at 100-120 among {a9, a10}". a10 is disqualified, so a9 wins by the rule, and a9 satisfies the anchor-Q constraint. c600-a9-anchorq-val600 launched 23:45:53Z: a9's config at 600 steps, val at 300 and 600, probe cadence 5, and the R2 sink deliberately OFF because a9 showed the in-training sink idles the GPU at teardown, which for three saves would cost about 2.5 hours. Idle across the handoff was about 6 minutes. Kill triggers: the gap crossing the incumbent's 14.3, or val at 300 below 0.65.
What it decides. PRF exact-k is the only arm ever proven at 600 steps. Every FRLR result is a 200-step result, and no FRLR arm settles. a9 ran 5.92 at its registered window and 7.00 at step 199 with a late slope of +0.012172; continued linearly that reaches about 12 by step 600, still under the incumbent's 14.3, but if it accelerates as a7 did it crosses.
The operator sent two WandB plots showing actor/pg_clipfrac and actor/pg_clipfrac_lower spiking at exactly steps 20, 40 and 60, and asked why the clip fraction peaks when the anchor fires. It was a bug I introduced the same day, and it also falsifies a claim written into this program's notes repeatedly as fact: that pg_clipfrac is zero by construction because train_batch == ppo_mini makes the ratio identically 1.
| arm | Q governance | nonzero pg_clipfrac steps |
|---|---|---|
| a7 | fast path, cadence 1 | 0 of 200 |
| a8 | fast path, cadence 20 | 0 of 200 |
| a9 | anchor-owned | 9, all multiples of 20, values 0.18 to 0.35 |
| a10 | anchor-owned | 3, all multiples of 20 |
| c600 (first attempt) | anchor-owned | 3, all multiples of 20 |
The anchor fires at the top of train_batch, which is after that step's old_log_probs were recomputed in a separate call. My anchor_update_basis published the new basis immediately. So within one step the old-logprob forward reconstructed activations through Qt and the train forward through Qt+1. The PPO ratio exp(logp_new - logp_old) then departs from 1 because the measurement apparatus changed, not because the policy moved, and PPO dutifully clips it, truncating the gradient for 20 to 35 percent of tokens at 5 percent of steps.
PowerSGD's anchor path solves this by staging: anchor_update_basis(staged=True) writes a candidate, and engine_workers.py publishes it only after every PPO minibatch sharing those old_log_probs has completed. Its comment states the reasoning verbatim. I had ported the harvest half of that contract and omitted the staging half. The fix adds _pending_frlr_basis, activate_staged_frlr_basis() and discard_staged_frlr_basis() (so a candidate from an update that did not commit cannot leak into a later policy pair), with four new tests including one that reproduces the bug: unstaged, the two forwards of one step differ; staged, they are byte-identical. 163 tests pass.
| result | status |
|---|---|
| a5b, a6, a7, a8, round A, the incumbent | UNAFFECTED. Fast-path Q refreshes at the first boundary fire of a step and is held for every forward in it, which is exactly why their clipfrac is 0 |
| a10: bias buys the whole gap advantage | SAFE. a9 and a10 both carried the artifact, so the comparison is apples-to-apples |
| Anchor-owned Q works mechanically | SAFE. The refresh-counter arithmetic concerns Q writes, not clipping |
| Q governance does not touch real drift | STRENGTHENED. a9 carried the artifact and still matched a7's drift within 4 percent |
| a9 beats a8 on late slope and terminal gap | CONFOUNDED. a8 clean, a9 not. Provisional until the rerun |
| The anchor-Q constraint costs nothing | PROVISIONAL, since it rests on those a9 numbers |
The rerun repairs the confound for free. Because it passes through step 200 on clean code, its own 100-120 window is a proper a9-equivalent, so the comparison that was provisional is settled by the same run that answers durability. Cost of the restart: 64 steps, about two hours.
c600-a9-anchorq-val600, restarted 2026-07-27T02:05:56Z on commit f2ac3c6. Values below are the resolved config read from WandB, not the launcher's intent, because the engine truncates its log at start and launcher defaults do not always survive Hydra.
| group | setting |
|---|---|
| Model / data | Qwen/Qwen2.5-Math-1.5B, MATH (EleutherAI/hendrycks_math), prompt 1024 / response 2048 |
| GRPO | adv_estimator grpo, train_batch 128, ppo_mini 128 (so ONE optimizer tick per step and the PPO ratio is structurally 1), rollout n=8, AdamW lr 1e-6, reference KL low_var_kl coef 0.001 |
| Codec | prf_mask with FRLR: rank 48 + residual k=28 + 1 norm scalar = 77 of 1536 coordinates, mask_ratio 0.94987. frlr_unbiased=false, i.e. the capped detached per-token norm-matching gain (the biased one, which section 26 shows is where the gap advantage comes from). No token-IS: rollout_is=None |
| Boundaries | pp_size=8, giving 7 masked boundaries on the 28-layer model. Masking also applied to the old-logprob recompute and the reference forward, so the three forwards are codec-consistent |
| Wire | 1232 bits/token/boundary (77 x 16), exact parity with the PRF incumbent. Under anchor ownership the Q broadcast rides the slow circuit, which this program does not charge, so parity is literal rather than approximate |
| Anchor | enabled, owns_q=true, cadence 20 and delay_K 20 optimizer ticks (so 30 fires over 600 steps), batch_scope rollout_batch, snapshot on CPU, paired dense replay, spectral signed-EMA enabled |
| Probe | probe/kl_dense every 5 steps, controller OFF. Codec-silent and forward-only, so it measures the policy's true KL to the reference with no codec inflation |
| Schedule | 600 steps, validation at 300 and 600, checkpoints every 200. No step-0 validation: it is hard-set off for these cells and the base checkpoint is shared with earlier arms |
| R2 sink | OFF, deliberately. Section 25 showed the in-training sink is asynchronous to training but not to process exit, idling the GPU through the upload. Three saves would cost about 2.5 h. Checkpoints stay local and are back-filled |
| Hardware | 1x H200 NVL, single node, vLLM gpu_memory_utilization 0.72 |
a9 is the identical arm and ran 199 logged steps: median 108.9 s/step, mean 115.3 s, p10 99.8 and p90 133.4, and its wall clock over 200 steps implies 115.0 s/step including overheads. So:
| quantity | value |
|---|---|
| 600 steps at the measured mean | 19.2 h |
| plus two validations | about 0.3 h |
| expected finish | about 21:50Z on 2026-07-27 |
| honest band from the p10 to p90 spread | 17 to 22 h, so 20:00Z to 01:00Z |
| cost at $3.344/h | about $65, taking the ledger to roughly 72 of 100 GPU-h |
PRF exact-k is the only arm ever proven at 600 steps; every FRLR result is a 200-step result, and section 25 established that no FRLR arm settles. Compare against the incumbent's validations at 150/300/450/600 of 0.6613 / 0.6633 / 0.6733 / 0.6613 and its gap of about 14.3.
a9 ran a gap of 5.92 at its registered window and 7.00 at step 199, with a late-window slope of +0.012172. Continued linearly that reaches about 12 by step 600, still under the incumbent's 14.3; if it accelerates as a7 did, it crosses. Kill triggers: the gap crossing 14.3, or validation at 300 below 0.65, which is under every incumbent checkpoint.
Full analysis, three figures and the corrections ledger: the stability ranking page. The short version is below.
Section 28 registered the kill trigger as "the gap crossing 14.3" and reasoned that a9's late slope extrapolated to about 12 by step 600, "still under the incumbent's 14.3; if it accelerates as a7 did, it crosses". It accelerated and it crossed.
First step at which FRLR exceeds the incumbent: 417. First step after which it stays above for the rest of the run: 424. This is the rotation-invariant versus alignment-dependent split that section 20 derived before the run existed: PRF's codec error does not care where the activations point, so its gap is stationary; FRLR's tracks a subspace the policy keeps moving, so it is excellent while the basis is fresh and degrades as the policy walks away from it.
actor/kl_loss is real drift multiplied by a codec-view inflation factor
that itself moves 50x, and it spans 55x across a7, a8 and a9, three arms whose
codec-free drift is identical to within 4 percent at matched step 120.
actor/entropy is disqualified because the dense control sharpens the same
way, so its decline is ordinary GRPO on maths, not compression damage. Neither appears
in the ranking.
Twelve program arms on gap stationarity, gradient behaviour and non-collapse. The incumbent and the dense control are references, not entrants. Twelve arms were run to beat the incumbent and none of them did.
| # | arm | codec | gap slope (window) | gap drift | grad drift | grad max | steps | outcome |
|---|---|---|---|---|---|---|---|---|
| ref | incumbent | PRF exact-k | +0.000848 (100-599) | 1.029 | 0.85x | 4.65 | 600 | the bar: stationary on every axis |
| ref | dense | none | 0 (no codec) | n/a | 0.76x | 0.11 | 600 | uncompressed control, val 0.6774 |
| 1 | a3 | sr_quant 2-bit k493 | +0.000101 (100-120) | 1.001 | 0.71x | 7.28 | 120 | flattest gap in the program, no horizon evidence |
| 2 | a4 | PRF exact-k + CVC | +0.001542 (100-120) | 1.002 | 0.91x | 3.62 | 120 | most incumbent-like arm, the natural horizon candidate |
| 3 | a1 | sr_quant 1-bit SR | +0.002825 (100-120) | 1.003 | 0.77x | 0.90 | 120 | tightest gradients ever measured here, but 1.87x over wire parity |
| 4 | a8 | FRLR, q_cadence 20 | +0.001485 (100-199) | 0.986 | 0.05x | 53.82 | 200 | best FRLR arm; only arm ending below its step-100 gap |
| 5 | a9 | FRLR, anchor-owned Q | +0.012203 (100-199) | 1.192 | 0.40x | 24.70 | 199 | carried the clipfrac bug; its corrected continuation is c600 |
| 6 | a7 | FRLR, fast Q cadence 1 | +0.028329 (100-199) | 1.551 | 1.86x | 68.01 | 200 | worst gap trend of any arm that finished |
| 7 | a5b | FRLR + token-IS + bnorm | +0.006673 (100-199) | 1.150 | 0.86x | 204.39 | 200 | looks calm because IS suppressed the update; spike ratio 284x |
| 8 | a5 | FRLR + token-IS | -0.005037 (100-120) | 1.016 | 1.00x | 2.91 | 120 | most stationary numbers in the program, on a run that barely learned |
| 9 | a10 | FRLR, unbiased | +0.009809 (30-60) | 1.018 | 1.31x | 2.29 | 61 | killed for futility, not instability: unbiased FRLR has no advantage left |
| 10 | c600 | FRLR, anchor-owned Q, 600 steps | +0.045972 (100-599) | 5.122 | 9.25x | 176.37 | 600 | the horizon test, and it fails. Accuracy held at 0.6633 |
| 11 | a2 | sr_quant 1-bit RN, biased | +0.014397 (30-60) | 1.033 | 0.49x | 62.24 | 62 | killed at 60; run-minimum grad norm 6.15 exceeds a1's run-maximum 0.90 |
| 12 | a6 | PRF + token-IS + bnorm | +0.000413 (100-199) | 1.002 | 2.27x | 608.81 | 200 | flat gap, collapsed model (val 0.5391) |
Gap drift is the end level over the level at step 100; grad drift is the median of the last fifth over the median of the first fifth. A drift far below 1.0 (a8 0.05x, a9 0.40x, a2 0.49x) is a decaying startup transient, not a calm run, so it must be read next to the run maximum.
PRF exact-k, 77 of 1536 coordinates with a constant 1/(1-p) rescale and a mask that is a pseudo-random function of seed, step and layer. It is unbiased, there is no side channel because the mask is derived rather than transmitted, there is no basis to broadcast and no anchor coupling to get wrong, and it is the only configuration in this program with 600 steps of evidence that the optimizer stays in a steady state: gradient block medians flat at 1.50 to 1.82 across all twelve blocks, a block maximum never above 4.645, a gap that moved 0.42 nats in 500 steps, and four validations inside 0.6613 to 0.6733. The two upgrades worth a horizon run, in order, are a4 (PRF exact-k plus CVC cross-entropy, same family, lowest risk) and a3 (sr_quant 2-bit byte-parity, a genuinely independent shot). FRLR is out for long-horizon work in every governance variant tested.
Stated at the width the evidence supports: on the short matched window 100-120 the incumbent is fourth, not first, behind a3, a5b and a6. Its win is a horizon win, and a3 and a4 are unproven rather than beaten. Codec-free drift cannot compare the two families at all, because the incumbent carries no probe. And compression costs about 1.4 to 1.6 points of validation against the dense control at 600 steps, a price both families pay equally.