test(cli): pin the stop-less campaign member manifest (risk-regime grounding)

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
This commit is contained in:
2026-07-06 13:04:55 +02:00
parent c9d962f0ea
commit 455916db73
+53
View File
@@ -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 <blueprint.json>
/// --real SYM --axis …`, dispatched as sugar over the one campaign executor)
/// prints one member line per grid point, IN AXIS ORDER (odometer: the first