From 455916db73e9c04a400ad53a3dc46c2ab82e61b3 Mon Sep 17 00:00:00 2001 From: Brummel Date: Mon, 6 Jul 2026 13:04:55 +0200 Subject: [PATCH] test(cli): pin the stop-less campaign member manifest (risk-regime grounding) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The dissolved real-data sweep member manifest carries only the swept signal axes today — no stop param; the R-path stop is a wrap_r constant baked outside the signal param_space. The existing member-line pin (sweep_real_blueprint_member_lines_pin_the_dissolved_contract) locates each binding by `find`, so it never pinned this absence. This characterization pin does, as the grounding ratification for the risk-regime-axis design pass: the resolved-regime manifest stamp will flip it to require the stop key — the ratified additive contract extension, exactly like the instrument stamp. refs #210 --- crates/aura-cli/tests/cli_run.rs | 53 ++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/crates/aura-cli/tests/cli_run.rs b/crates/aura-cli/tests/cli_run.rs index 211fd2d..bcf0840 100644 --- a/crates/aura-cli/tests/cli_run.rs +++ b/crates/aura-cli/tests/cli_run.rs @@ -1403,6 +1403,59 @@ fn sweep_real_is_byte_deterministic_across_runs() { const GER40_SEPT2024_FROM_MS: &str = "1725148800000"; const GER40_SEPT2024_TO_MS: &str = "1727740799999"; +/// Characterization pin (grounding-check ratification for the risk-regime-axis +/// spec): the dissolved real-data sweep member manifest carries ONLY the swept +/// signal axes as `params` — NO `stop_length` / `stop_k`. The R-path stop is a +/// `wrap_r` constant baked OUTSIDE the signal `param_space`, so it never reaches +/// a campaign member manifest today; the sibling +/// `sweep_real_blueprint_member_lines_pin_the_dissolved_contract` locates each +/// binding with `find` and so never pins this ABSENCE. This pins the stop-less +/// baseline the risk-regime cycle deliberately extends: once the resolved regime +/// is stamped into the manifest, this assertion flips to require the stop key — +/// the ratified additive contract extension, exactly like the instrument stamp. +/// Gated on the local GER40 archive; skips cleanly when absent. +#[test] +fn sweep_real_blueprint_member_manifest_carries_no_stop_param_today() { + if !local_data_present() { + eprintln!("skip: no local data at {}", data_server::DEFAULT_DATA_PATH); + return; + } + let dir = temp_cwd("sweep_real_blueprint_no_stop"); + let fixture = format!("{}/tests/fixtures/sma_signal_open.json", env!("CARGO_MANIFEST_DIR")); + let out = std::process::Command::new(BIN) + .args([ + "sweep", &fixture, + "--real", "GER40", + "--from", GER40_SEPT2024_FROM_MS, + "--to", GER40_SEPT2024_TO_MS, + "--axis", "sma_signal.fast.length=2,4", + "--axis", "sma_signal.slow.length=8", + "--name", "brp_nostop", + ]) + .current_dir(&dir) + .output() + .unwrap(); + assert!(out.status.success(), "stderr: {}", String::from_utf8_lossy(&out.stderr)); + let stdout = String::from_utf8_lossy(&out.stdout).into_owned(); + let lines: Vec<&str> = stdout.lines().collect(); + assert_eq!(lines.len(), 2, "one member line per grid point: {stdout}"); + + for line in &lines { + let v: serde_json::Value = serde_json::from_str(line).expect("member line parses as JSON"); + let params = v["report"]["manifest"]["params"] + .as_array() + .expect("manifest.params is an array"); + let names: Vec<&str> = params.iter().filter_map(|p| p[0].as_str()).collect(); + // The swept signal axis IS stamped ... + assert!(!names.is_empty(), "the swept signal axis is stamped: {line}"); + // ... and no stop param is (the baseline this cycle extends). + assert!( + !names.iter().any(|n| n.contains("stop")), + "no stop param is stamped in the campaign member manifest today: {line}" + ); + } +} + /// Property: the real-data blueprint sweep path (`aura sweep /// --real SYM --axis …`, dispatched as sugar over the one campaign executor) /// prints one member line per grid point, IN AXIS ORDER (odometer: the first