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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user