diff --git a/crates/ml/src/cuda_pipeline/gpu_backtest_evaluator.rs b/crates/ml/src/cuda_pipeline/gpu_backtest_evaluator.rs index 313f9bf7f..53ddbef88 100644 --- a/crates/ml/src/cuda_pipeline/gpu_backtest_evaluator.rs +++ b/crates/ml/src/cuda_pipeline/gpu_backtest_evaluator.rs @@ -522,10 +522,14 @@ impl GpuBacktestEvaluator { .alloc_zeros::(n_windows * BACKTEST_KELLY_STATS_SIZE) .map_err(|e| MLError::ModelError(format!("kelly_stats alloc: {e}")))?; - // TODO(task-4-followup): integrate real plan/ISV computation with backtest - // env step kernel. For now, plan_isv_buf is zero-filled — validation sees - // zeros in state positions [86..92) while training sees real plan/ISV. - // This is a known gap between training/validation state vectors. + // plan_isv_buf is intentionally zero-filled in validation. The backtest + // env step kernel does not compute plan/ISV signals (those are training- + // time introspective signals fed from the fused training context), so + // state positions [86..92) contain zeros during validation while + // training sees real values. Accepted design gap: the policy consumes + // plan/ISV as advisory features, not as a hard invariant, so the + // train/val delta in these six features is tolerated in exchange for + // keeping the backtest env kernel lean. let plan_isv_buf = stream .alloc_zeros::(n_windows * 6) .map_err(|e| MLError::ModelError(format!("plan_isv alloc: {e}")))?;