Per Class A audit ranking, the highest-suspected-impact fix for the
months-long WR-stuck-at-46-48% plateau across 11 superprojects.
Hardcoded REWARD_POS_CAP=+5.0f / REWARD_NEG_CAP=-10.0f
(state_layout.cuh:266-267) was structurally clipping the upper tail of
realized alpha. Controller signals (sharpe EMA, var_q, q_gap) all
derive from this CAPPED buffer, so the controller cannot select for
trades it cannot see. Selectivity gradient evaporates — small wins
clip to +5 alongside large wins also clipping to +5.
The state_layout comment lines 261-264 explicitly deferred Phase 2
(ISV-driven) "IF Phase 1 validation reveals adaptive need". Phase 1
has been running 11 SPs without budging WR — adaptive need revealed.
Architecture:
- 2 new ISV slots [452..454): REWARD_POS_CAP_ADAPTIVE,
REWARD_NEG_CAP_ADAPTIVE.
- Producer kernel reward_cap_update_kernel.cu: block-tree-reduce
Welford `mean + Z_99 × sigma` p99 estimator over winning realized
returns + conservative `max(p99, max_win)` takeover, × 1.5 safety
factor → POS cap. NEG cap = -2 × POS cap (preserves Kahneman 2:1
asymmetry per pearl_audit_unboundedness_for_implicit_asymmetry —
asymmetry stays, but moved from hardcoded scalar to producer-time
multiplier; single source of truth, no consumer applies the 2× ratio
itself).
- Pearl-A first-observation bootstrap from sentinel (5.0 / -10.0,
matching pre-P0-A hardcoded values for bit-identical cold-start).
Welford EMA α=0.01 thereafter (slow blend — reward distribution is
the foundation of training and shouldn't move fast).
- Bounds: POS in [1, 50], NEG in [-100, -2] (Category-1 dimensional
safety per feedback_isv_for_adaptive_bounds, NOT tuning).
- 3 consumer sites migrated atomically per
feedback_no_partial_refactor: experience_kernels.cu:3112-3114
(segment_complete cap), compute_sp15_final_reward_kernel.cu:163
(Stage 4 helper invocation), sp15_reward_axis_helpers.cuh:211
(sp15_apply_sp12_cap device fn signature change to take isv ptr).
- Cold-start fallback: when ISV slot at sentinel OR outside
[REWARD_POS_CAP_MIN_BOUND=1, REWARD_POS_CAP_MAX_BOUND=50],
consumers fall back to original macros (still defined in
state_layout.cuh).
- 2 new device-ptr accessors on the experience collector
(step_ret_per_sample_dev_ptr, trade_close_per_sample_dev_ptr) —
reuses existing per-sample buffers; no new buffer allocated.
- Per-epoch boundary launch (cold path) in training_loop.rs alongside
launch_aux_horizon_chain.
- Reset registry entries + dispatch arms in reset_named_state per the
C.10 lesson (missing dispatch causes runtime crash).
- Layout fingerprint seed updated: ISV_TOTAL_DIM 452→454 +
AUX_PRED_HORIZON_BARS=450 + AVG_WIN_HOLD_TIME_BARS=451 (previously
missing from seed) + REWARD_POS_CAP_ADAPTIVE=452 +
REWARD_NEG_CAP_ADAPTIVE=453.
Per feedback_isv_for_adaptive_bounds: every adaptive bound in ISV.
Verification:
- cargo check -p ml --tests --all-targets: clean (19 pre-existing
warnings, 0 new).
- sp14_isv_slots tests: 8/8 pass (4 layout + 4 fits-within).
- sp14_oracle_tests with --features cuda --ignored: 8/8 pass (4
existing q_disagreement/dir_concat + 4 new P0-A tests covering
Pearl-A bootstrap, no-winning-trades preservation, bounds clamping
to [1,50], Welford α=0.01 EMA blend).
- sp15_phase1_oracle_tests with --features cuda --ignored: 36/36 pass
(no regression from sp15_apply_sp12_cap signature change).
Cumulative WR-plateau fix series:
- Class C bug 1 (8f218cab2): replay buffer intent→realized.
- Class A P0-B (8f218cab2): Kelly warmup floor wiring.
- Class A P0-C (316db416b): MIN_HOLD_TARGET adaptive.
- Class A P0-A (this commit): REWARD_POS/NEG_CAP adaptive — restores
upper-tail alpha to the controller's view.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>