From d8e77fade3eee7d87b8a2605ad95b31408d241ab Mon Sep 17 00:00:00 2001 From: jgrusewski Date: Tue, 28 Apr 2026 22:32:19 +0200 Subject: [PATCH] fix(smoke,argo): multi_fold_convergence forwards mbp10/trades flags + Argo wires env vars Per feedback_mbp10_mandatory.md, MBP-10 + trades are mandatory inputs. multi_fold_convergence now reads FOXHUNT_MBP10_DATA / FOXHUNT_TRADES_DATA env vars, forwards them to train_baseline_rl as --mbp10-data-dir / --trades-data-dir, and hard-fails if either path is missing. Argo sanitizer-test + nsys-test templates set the env vars to PVC paths /data/test-data/{mbp10,trades} and FOXHUNT_TEST_DATA points at /data/test-data/ohlcv (PVC layout has lost+found/trades/mbp10/ohlcv as top-level subdirs; the symbol ES.FUT lives under ohlcv/). Without this, the smoke would silently fall back to tick-rule proxy classification and validate a degraded model variant (no real OFI), defeating the purpose of L40S validation. Audit doc updated per Invariant 7. --- .../dqn/smoke_tests/multi_fold_convergence.rs | 36 +++++++++++++++++++ docs/dqn-wire-up-audit.md | 3 ++ infra/k8s/argo/nsys-test-template.yaml | 10 ++++-- infra/k8s/argo/sanitizer-test-template.yaml | 10 ++++-- 4 files changed, 55 insertions(+), 4 deletions(-) diff --git a/crates/ml/src/trainers/dqn/smoke_tests/multi_fold_convergence.rs b/crates/ml/src/trainers/dqn/smoke_tests/multi_fold_convergence.rs index 31d784772..a27534cee 100644 --- a/crates/ml/src/trainers/dqn/smoke_tests/multi_fold_convergence.rs +++ b/crates/ml/src/trainers/dqn/smoke_tests/multi_fold_convergence.rs @@ -50,6 +50,40 @@ fn test_multi_fold_convergence() -> Result<()> { // the 6/2/2 (step 2) walk-forward actually yields 3 folds on the baseline // dataset (vs production 12/3/3 step 3 which only fits 2), and 5 epochs // is ample to save a best-sharpe checkpoint per fold. + // + // MBP-10 + trades data are mandatory per `feedback_mbp10_mandatory.md` — + // OFI features are part of the production state vector. Pull paths from + // FOXHUNT_MBP10_DATA / FOXHUNT_TRADES_DATA env vars (set by the + // sanitizer-test / nsys-test Argo templates and locally by the smoke + // helper); fall back to `/../futures-baseline-mbp10` and + // `/../futures-baseline-trades` for the local repo layout. + let mbp10_dir = std::env::var("FOXHUNT_MBP10_DATA").unwrap_or_else(|_| { + let p = std::path::Path::new(&data_dir).parent() + .map(|p| p.join("futures-baseline-mbp10")) + .unwrap_or_else(|| PathBuf::from("test_data/futures-baseline-mbp10")); + p.to_string_lossy().into_owned() + }); + let trades_dir = std::env::var("FOXHUNT_TRADES_DATA").unwrap_or_else(|_| { + let p = std::path::Path::new(&data_dir).parent() + .map(|p| p.join("futures-baseline-trades")) + .unwrap_or_else(|| PathBuf::from("test_data/futures-baseline-trades")); + p.to_string_lossy().into_owned() + }); + if !std::path::Path::new(&mbp10_dir).exists() { + return Err(anyhow!( + "MBP-10 data directory not found at {} (set FOXHUNT_MBP10_DATA to override). \ + OFI features are mandatory per feedback_mbp10_mandatory.md.", + mbp10_dir + )); + } + if !std::path::Path::new(&trades_dir).exists() { + return Err(anyhow!( + "Trades data directory not found at {} (set FOXHUNT_TRADES_DATA to override). \ + Trade-classified VPIN/Kyle's λ are mandatory per feedback_mbp10_mandatory.md.", + trades_dir + )); + } + let status = std::process::Command::new("cargo") .current_dir(&workspace) .env("SQLX_OFFLINE", "true") @@ -62,6 +96,8 @@ fn test_multi_fold_convergence() -> Result<()> { "--", "--model", "dqn", "--data-dir", &data_dir, + "--mbp10-data-dir", &mbp10_dir, + "--trades-data-dir", &trades_dir, "--symbol", "ES.FUT", "--epochs", "5", "--max-folds", "3", diff --git a/docs/dqn-wire-up-audit.md b/docs/dqn-wire-up-audit.md index 59dd30d0e..8e0a7e230 100644 --- a/docs/dqn-wire-up-audit.md +++ b/docs/dqn-wire-up-audit.md @@ -2,6 +2,9 @@ **Status:** Populated during Plan 1 Task 6 (A.5 orphan audit). Updated on every commit per Invariant 7. +multi_fold_convergence smoke MBP-10 wiring (2026-04-28): the test now forwards `--mbp10-data-dir` and `--trades-data-dir` to its spawned `train_baseline_rl` subprocess, reading paths from `FOXHUNT_MBP10_DATA` / `FOXHUNT_TRADES_DATA` env vars (set by the L40S sanitizer-test + nsys-test Argo templates to `/data/test-data/{mbp10,trades}`) with fallback to `/../futures-baseline-{mbp10,trades}` for local repo runs. The test hard-fails fast if either path is missing, citing `feedback_mbp10_mandatory.md`. Without this, OFI features (state slots [18..26)) silently fell back to tick-rule proxy and the smoke validated a degraded model variant — a `feedback_no_partial_refactor.md` violation now closed. + + Q-drift production-safety kill criterion (2026-04-28): The `train-multi-seed-p526h` repro (5ep×3fold, MSE-clamp + PopArt-carry landed) reproduced a geometric Q-divergence in fold 1 that we can no diff --git a/infra/k8s/argo/nsys-test-template.yaml b/infra/k8s/argo/nsys-test-template.yaml index ea2a1cb14..76c383383 100644 --- a/infra/k8s/argo/nsys-test-template.yaml +++ b/infra/k8s/argo/nsys-test-template.yaml @@ -98,9 +98,15 @@ spec: - name: CUBLAS_WORKSPACE_CONFIG value: ":4096:8" - name: FOXHUNT_TEST_DATA - value: /data/test-data + value: /data/test-data/ohlcv - name: TEST_DATA_DIR - value: /data/test-data + value: /data/test-data/ohlcv + # MBP-10 + trades are mandatory per feedback_mbp10_mandatory.md + # (OFI features are part of the production state vector). + - name: FOXHUNT_MBP10_DATA + value: /data/test-data/mbp10 + - name: FOXHUNT_TRADES_DATA + value: /data/test-data/trades - name: RUST_LOG value: info - name: LD_LIBRARY_PATH diff --git a/infra/k8s/argo/sanitizer-test-template.yaml b/infra/k8s/argo/sanitizer-test-template.yaml index 40b57d15b..2bdbd8ae2 100644 --- a/infra/k8s/argo/sanitizer-test-template.yaml +++ b/infra/k8s/argo/sanitizer-test-template.yaml @@ -95,9 +95,15 @@ spec: - name: CUBLAS_WORKSPACE_CONFIG value: ":4096:8" - name: FOXHUNT_TEST_DATA - value: /data/test-data + value: /data/test-data/ohlcv - name: TEST_DATA_DIR - value: /data/test-data + value: /data/test-data/ohlcv + # MBP-10 + trades are mandatory per feedback_mbp10_mandatory.md + # (OFI features are part of the production state vector). + - name: FOXHUNT_MBP10_DATA + value: /data/test-data/mbp10 + - name: FOXHUNT_TRADES_DATA + value: /data/test-data/trades - name: RUST_LOG value: info - name: LD_LIBRARY_PATH