diff --git a/docs/superpowers/plans/2026-04-24-dqn-v2-plan-3-behavioural.md b/docs/superpowers/plans/2026-04-24-dqn-v2-plan-3-behavioural.md index efb1aa451..ec085ad70 100644 --- a/docs/superpowers/plans/2026-04-24-dqn-v2-plan-3-behavioural.md +++ b/docs/superpowers/plans/2026-04-24-dqn-v2-plan-3-behavioural.md @@ -1061,6 +1061,10 @@ git commit -m "feat(dqn-v2): D.4a persistence credit — shaping×conviction×|m - Modify: `experience_kernels.cu` — consume STATE_KL_AMPLIFICATION for reward scaling - Test: `state_kl_fires_on_distribution_shift` +### ✅ LANDED `673eb6612` + +> **Actual outcome.** ISV slots [78] STATE_KL_TRAIN_VAL_EMA + [79] STATE_KL_AMPLIFICATION; fingerprint shifted [76,77] → [80,81]; ISV_TOTAL_DIM 78 → 82. New kernel `state_kl_divergence_kernel.cu` does single-block per-dim Gaussian moment-match KL on the OFI block (32 dims), kernel-internal trailing-EMA-of-self for the amp ratio (no extra threshold slot). Val-side launch via `GpuBacktestEvaluator::val_state_sample()` (returns `chunked_states_buf` device pointer + sample count). Consumer wires kl_amp ∈ [1,2] into B.1 opp_cost and B.2 bonus via `fmaxf(1.0, …)` guard against cold-start 0. Smoke 3-fold convergence: best at ep5/ep2/ep3 — *diverse* epoch positions, addressing the earlier "always ep1" concern. Per-fold best Sharpe 105.13 / 83.28 / 103.49. + **Reality reconciliation.** Original slot numbers 58/63/64 collide with Plan 2 Q-quantile [50..58) and Plan 3 Task 1 reward-component EMAs [63..69). Original fire-trigger used a tuned `2.0× threshold` multiplier and amplification-decay constants `0.02f`, `2.0f`, `1.0f` that violate `feedback_adaptive_not_tuned.md`. This revision tail-appends after Task 6 and makes the amplification formula ISV-derived. Post-revision slot layout (assumes Tasks 4+6a+6b+6c land first — actual ISV_TOTAL_DIM ≥ 78 at Task 7 start):