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.
This commit is contained in:
jgrusewski
2026-04-28 22:32:19 +02:00
parent 169610c85d
commit d8e77fade3
4 changed files with 55 additions and 4 deletions

View File

@@ -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 `<data_dir>/../futures-baseline-mbp10` and
// `<data_dir>/../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",

View File

@@ -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 `<data_dir>/../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

View File

@@ -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

View File

@@ -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