The xv66n smoke (commit d5c29fb4f) confirmed plateau-decay LR works
across all 3 heads — but exposed a residual V instability: 10 trade-
close steps with l_v > 1e4, max 9.46e4. Root cause: the
reward_scale controller's Wiener-α blend cannot adapt fast enough
to a sudden fat-tail trade outcome, so a single closed trade with
realised PnL well outside `1 / mean_abs_pnl_ema`'s current estimate
produces a scaled reward 100s of times the C51 atom span.
Since `returns = scaled_reward + γ(1-done) v_tp1` and the spike
happens on done=1 steps, returns equals the unbounded scaled
reward, and V regression `(v_pred - returns)²` blows up.
## Fix: asymmetric clamp at apply_reward_scale boundary
`apply_reward_scale.cu` is rewritten to:
1. Scale `rewards[b] *= isv[RL_REWARD_SCALE_INDEX]` as before.
2. Asymmetric-clamp scaled to `[-REWARD_CLAMP_LOSS, +REWARD_CLAMP_WIN]`
= `[-3.0, +1.0]` per `pearl_audit_unboundedness_for_implicit_asymmetry`:
* `WIN = +1.0` matches the C51 atom span on the win side.
* `LOSS = -3.0` preserves loss-aversion asymmetry — fat-tail
losses remain visible up to 3 atom-units before flattening,
matching typical HFT P&L distributions where losses run
2-3× larger than wins per close.
3. Write back the clamped value to `rewards[b]`.
Single-block layout (block_x = min(b_size, 256), grid_x = 1,
shared = block_x × 4 B) per `pearl_no_atomicadd` — tree reduction
inside the block, no inter-block atomic.
## Diagnostic: pre-clamp max ISV slot
New ISV slot `RL_MAX_ABS_SCALED_REWARD_PRE_CLAMP_INDEX = 439`
holds `max(|scaled|)` over the current batch BEFORE the clamp
fires (each step overwrites — point measurement, not EMA).
Surfaced in diag.jsonl as `rewards.scaled_pre_clamp_max`.
Interpretation:
* pre_clamp_max ≤ 1.0 most steps → reward_scale controller is
tracking typical magnitudes correctly; clamp is a no-op.
* pre_clamp_max > 1.0 frequently → controller is failing to
track magnitudes; clamp is doing load-bearing work shaping V
target.
* pre_clamp_max > 100 ever → controller is grossly mis-scaled
(likely cold-start before mean_abs_pnl_ema converged).
RL_SLOTS_END: 439 → 440 (one new diagnostic slot).
## Why a clamp instead of fixing the controller
The reward_scale controller IS doing its job — it Wiener-blends
toward `1 / mean_abs_pnl_ema` with α floor 0.4. The problem is
that a single closed trade represents one observation in the EMA
denominator, so a sudden 10× excursion in trade magnitude takes
~3-5 closes to fully reflect in the scale. During those 3-5
steps, scaled rewards can be 5-10× the atom span.
A faster controller (smaller EMA floor, lookahead, etc.) would
oscillate. A clamp is the principled bound:
* source signal (raw PnL) remains unbounded — controller
continues to track magnitudes
* downstream signal (V/Q target) is bounded — no catastrophic
backward gradient
* pre-clamp diagnostic surfaces clamp activity so we know when
the controller is failing vs handling the regime fine
## Verified gates (local sm_86)
G1 isv_bootstrap ✅
G3 controllers ✅
G4 target_update ✅
G6 r7d_per_wiring ✅
integrated_smoke ✅
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>