diff --git a/crates/ml-alpha/src/rl/isv_slots.rs b/crates/ml-alpha/src/rl/isv_slots.rs index b131fc458..2ddf97970 100644 --- a/crates/ml-alpha/src/rl/isv_slots.rs +++ b/crates/ml-alpha/src/rl/isv_slots.rs @@ -1502,42 +1502,44 @@ pub const RL_EVAL_IQN_TAU_MIN_NORMAL_INDEX: usize = 693; // 0.10 pub const RL_EVAL_ENTROPY_COEF_MIN_NORMAL_INDEX: usize = 694; // 0.01 pub const RL_EVAL_PPO_CLIP_EPS_MIN_NORMAL_INDEX: usize = 695; // 0.05 -// ────────────────────────────────────────────────────────────────── +// ============================================================ // Regime observer (spec: 2026-05-31-regime-observer-design.md v3) // Unified state-machine signals for risk-stack controllers. -// ────────────────────────────────────────────────────────────────── +// ============================================================ -// regime_observer outputs (6 surface signals + 4 internal Welford state) -pub const RL_REGIME_DEAD_ZONE_FLAG_INDEX: usize = 696; -pub const RL_REGIME_DEAD_ZONE_DURATION_INDEX: usize = 697; -pub const RL_REGIME_DEAD_ZONE_TIMEOUT_FLAG_INDEX: usize = 698; -pub const RL_REGIME_RECOVERY_FACTOR_INDEX: usize = 699; -pub const RL_REGIME_SESSION_PNL_VARIANCE_EMA_INDEX: usize = 700; -pub const RL_REGIME_TAIL_EVENT_RECENCY_INDEX: usize = 701; -pub const RL_REGIME_SESSION_PNL_VAR_M2_INDEX: usize = 702; -pub const RL_REGIME_SESSION_PNL_VAR_MEAN_INDEX: usize = 703; -pub const RL_REGIME_SESSION_PNL_VAR_COUNT_INDEX: usize = 704; -pub const RL_REGIME_PREV_WORST_PNL_INDEX: usize = 705; +// regime_observer outputs (6 surface signals) +pub const RL_REGIME_DEAD_ZONE_FLAG_INDEX: usize = 696; // 0/1 +pub const RL_REGIME_DEAD_ZONE_DURATION_INDEX: usize = 697; // counter +pub const RL_REGIME_DEAD_ZONE_TIMEOUT_FLAG_INDEX: usize = 698; // 0/1 (safety net) +pub const RL_REGIME_RECOVERY_FACTOR_INDEX: usize = 699; // [0,1] (drift-free diag) +pub const RL_REGIME_SESSION_PNL_VARIANCE_EMA_INDEX: usize = 700; // σ² +pub const RL_REGIME_TAIL_EVENT_RECENCY_INDEX: usize = 701; // counter + +// regime_observer internal Welford state (kept on device) +pub const RL_REGIME_SESSION_PNL_VAR_M2_INDEX: usize = 702; // Welford +pub const RL_REGIME_SESSION_PNL_VAR_MEAN_INDEX: usize = 703; // Welford +pub const RL_REGIME_SESSION_PNL_VAR_COUNT_INDEX: usize = 704; // Welford +pub const RL_REGIME_PREV_WORST_PNL_INDEX: usize = 705; // Δ source // Kelly resurrection (consumed by Kelly kernel in F2) -pub const RL_KELLY_EPS_RECOVERY_LIVE_INDEX: usize = 706; -pub const RL_KELLY_EPS_RECOVERY_MIN_INDEX: usize = 707; -pub const RL_KELLY_EPS_RECOVERY_MAX_INDEX: usize = 708; -pub const RL_KELLY_EPS_RECOVERY_N_RECOVERY_INDEX: usize = 709; +pub const RL_KELLY_EPS_RECOVERY_LIVE_INDEX: usize = 706; // current ε value (drift-free) +pub const RL_KELLY_EPS_RECOVERY_MIN_INDEX: usize = 707; // config 0.05 +pub const RL_KELLY_EPS_RECOVERY_MAX_INDEX: usize = 708; // config 0.50 +pub const RL_KELLY_EPS_RECOVERY_N_RECOVERY_INDEX: usize = 709; // config 100 -// Safety net -pub const RL_REGIME_DEAD_ZONE_MAX_DURATION_INDEX: usize = 710; +// Safety net: dead-zone timeout (issue #4 — bounded loss during prolonged adverse regime) +pub const RL_REGIME_DEAD_ZONE_MAX_DURATION_INDEX: usize = 710; // config 1000 steps // IQN τ tail-boost (consumed in F5) -pub const RL_IQN_TAU_TAIL_BOOST_FACTOR_INDEX: usize = 711; -pub const RL_IQN_TAU_TAIL_BOOST_N_WINDOW_INDEX: usize = 712; +pub const RL_IQN_TAU_TAIL_BOOST_FACTOR_INDEX: usize = 711; // config 1.5 +pub const RL_IQN_TAU_TAIL_BOOST_N_WINDOW_INDEX: usize = 712; // config 100 // regime_observer config -pub const RL_REGIME_TAIL_SIGMA_THRESHOLD_INDEX: usize = 713; +pub const RL_REGIME_TAIL_SIGMA_THRESHOLD_INDEX: usize = 713; // config 3.0 // Popart per-account max envelope (consumed by popart in F4) -pub const RL_POPART_MAX_ABS_REWARD_EMA_INDEX: usize = 714; -pub const RL_POPART_MAX_DECAY_ALPHA_INDEX: usize = 715; +pub const RL_POPART_MAX_ABS_REWARD_EMA_INDEX: usize = 714; // envelope-detector state +pub const RL_POPART_MAX_DECAY_ALPHA_INDEX: usize = 715; // config 0.01 /// Last RL-allocated slot index (exclusive). /// Pre-risk-stack: 662. Post-Fix-B: 685. Post-v9 (warmup boundary): 696.