Files
foxhunt/crates
jgrusewski 827a0e9416 fix(rl): ISV-ify ALL remaining tunable design constants (10 new slots)
Per `feedback_isv_for_adaptive_bounds`: every controller design knob
that's genuinely tunable now lives in ISV instead of as a kernel-side
`#define`. Tuning is a re-seed (kernel launch with new arg) rather
than a recompile.

## New ISV slots (10 design constants)

  RL_REWARD_CLAMP_WIN_INDEX       (452, =1.0)    apply_reward_scale
  RL_REWARD_CLAMP_LOSS_INDEX      (453, =3.0)    apply_reward_scale
  RL_KL_TARGET_INDEX              (454, =0.01)   rl_ppo_clip_controller
  RL_IMPROVEMENT_THRESHOLD_INDEX  (455, =0.99)   rl_lr_controller
  RL_PLATEAU_PATIENCE_INDEX       (456, =1000.0) rl_lr_controller
  RL_DIV_TARGET_INDEX             (457, =0.01)   rl_target_tau_controller
  RL_ENTROPY_TARGET_FRAC_INDEX    (458, =0.7)    rl_entropy_coef_controller
  RL_KURT_LIFT_SCALE_INDEX        (459, =7.0)    rl_per_alpha_controller
  RL_PPO_CLAMP_MARGIN_INDEX       (460, =10.0)   rl_ppo_ratio_clamp_controller
  RL_LR_WARMUP_STEPS_INDEX        (461, =2000.0) rl_lr_controller

RL_SLOTS_END: 452 → 462.

## Constants NOT converted (truly fundamental)

  * All `*_INDEX` (ABI)
  * All `*_MIN`/`*_MAX` clamp bounds (algebraic domain)
  * All `*_BOOTSTRAP` (one-shot init)
  * `WIENER_ALPHA_FLOOR` (per pearl_wiener_alpha_floor_for_nonstationary)
  * Schulman pattern parameters (`*_TOLERANCE`/`*_ADJUST_RATE`)
  * C51 (`Q_N_ATOMS`, `V_MIN/MAX`, `N_ACTIONS`)
  * Kernel numerics (`STREAM_ALPHA`, `ABS_MEAN_FLOOR`, `EPS_PNL`)
  * `KURT_GAUSSIAN` (statistical constant = 3.0 for Gaussian)
  * `KURT_NOISE_FLOOR` (defensive)
  * `LR_BOOTSTRAP`/`LR_MIN`/`LR_MAX`/`LR_LOSS_EMA_ALPHA`/`DECAY_FACTOR`

## New infrastructure

New CUDA kernel `rl_isv_write.cu` — generic single-thread device-side
seeder taking `(int slot, float value)`. Trainer loops calling it
once per design constant at init. Replaces the prior pattern of
extending `rl_streaming_clamp_init`'s arg list every time a new
constant was added.

## Ordering fix

Design constants must be seeded BEFORE controllers bootstrap — the
controllers' bootstrap paths read these slots (e.g.
`rl_entropy_coef_controller` reads `RL_ENTROPY_TARGET_FRAC_INDEX`
to derive its target). Without correct ordering, controllers see
sentinel 0.0 and bootstrap to wrong values (caught by failing G1
test before commit). Seed loop runs at TOP of
`with_controllers_bootstrapped`.

## Diag bake-in

JSONL gains `isv_config` block exposing all 10 design constants per
step:
  isv_config.{reward_clamp_win, reward_clamp_loss, kl_target,
              improvement_threshold, plateau_patience, div_target,
              entropy_target_frac, kurt_lift_scale, ppo_clamp_margin,
              lr_warmup_steps}

Post-hoc analysis can correlate any controller's behaviour with the
exact design constants it saw, without grepping the source for
`#define` defaults.

## Test updates

G1 (isv_bootstrap) + G3 (r5_controllers) — skip 10 new design-
constant slots in sentinel-zero loop, assert seeded values
separately.

## Verified gates (local sm_86)

  G1 isv_bootstrap    (with 10 new assertions)
  G3 controllers     
  G4 target_update   
  integrated_smoke   

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 01:10:53 +02:00
..