diff --git a/crates/aura-cli/tests/cli_run.rs b/crates/aura-cli/tests/cli_run.rs index 787c4cd..6f0852e 100644 --- a/crates/aura-cli/tests/cli_run.rs +++ b/crates/aura-cli/tests/cli_run.rs @@ -55,7 +55,7 @@ fn fresh_project() -> (&'static PathBuf, (RunsCleanup, MutexGuard<'static, ()>)) #[test] fn sweep_outside_project_refuses_and_leaves_no_store() { let cwd = temp_cwd("sweep-outside-project-refuses"); - let bp = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let bp = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args(["sweep", &bp, "--real", "GER40", "--axis", "sma_signal.fast.length=2,4"]) .current_dir(&cwd) @@ -72,7 +72,7 @@ fn sweep_outside_project_refuses_and_leaves_no_store() { #[test] fn generalize_outside_project_refuses_and_leaves_no_store() { let cwd = temp_cwd("generalize-outside-project-refuses"); - let bp = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let bp = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args(["generalize", &bp, "--real", "GER40,USDJPY", "--axis", "sma_signal.fast.length=2"]) .current_dir(&cwd) @@ -89,7 +89,7 @@ fn generalize_outside_project_refuses_and_leaves_no_store() { #[test] fn walkforward_outside_project_refuses_and_leaves_no_store() { let cwd = temp_cwd("walkforward-outside-project-refuses"); - let bp = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let bp = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args(["walkforward", &bp, "--real", "GER40", "--axis", "sma_signal.fast.length=2,4"]) .current_dir(&cwd) @@ -106,7 +106,7 @@ fn walkforward_outside_project_refuses_and_leaves_no_store() { #[test] fn mc_outside_project_refuses_and_leaves_no_store() { let cwd = temp_cwd("mc-outside-project-refuses"); - let bp = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let bp = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args(["mc", &bp, "--real", "GER40", "--axis", "sma_signal.fast.length=2,4"]) .current_dir(&cwd) @@ -1055,7 +1055,7 @@ fn runs_families_list_and_per_family_rank_across_invocations() { // each a related set of 4 records (C18/C21 lineage), in the sibling family // store. `sweep` is blueprint-only now (#159 cut 4); the shipped open r-sma // example over a 2x2 axis grid stands in for the retired built-in default. - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); for _ in 0..2 { let out = Command::new(BIN) .args([ @@ -1175,7 +1175,7 @@ fn local_data_present() -> bool { fn sweep_real_no_geometry_symbol_refuses_with_exit_1() { // not gated: the pip refusal happens before any data access. let (dir, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(BIN) .args(["sweep", &fixture, "--axis", "sma_signal.fast.length=2,4", "--real", "NONEXISTENT"]) .current_dir(dir).output().unwrap(); @@ -1253,7 +1253,7 @@ fn sweep_real_blueprint_member_manifest_stamps_the_default_stop() { return; } let (dir, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(BIN) .args([ "sweep", &fixture, @@ -1300,7 +1300,7 @@ fn sweep_real_blueprint_member_manifest_stamps_project_provenance() { return; } let (dir, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(BIN) .args([ "sweep", &fixture, @@ -1394,7 +1394,7 @@ fn sweep_real_ohlc_channel_members_run_and_reproduce() { return; } let (dir, _g) = fresh_project(); - let fixture = format!("{}/examples/r_channel_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/tests/fixtures/r_channel_open.json", env!("CARGO_MANIFEST_DIR")); let axes = std::process::Command::new(BIN) .args(["sweep", &fixture, "--list-axes"]) .current_dir(dir) @@ -1475,7 +1475,7 @@ fn sweep_real_blueprint_member_lines_pin_the_dissolved_contract() { return; } let (dir, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(BIN) .args([ "sweep", &fixture, @@ -1713,7 +1713,7 @@ fn sweep_real_with_trace_writes_tap_series_to_disk() { return; } let (dir, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(BIN) .args([ "sweep", &fixture, @@ -1771,7 +1771,7 @@ fn family_id_of_kind(dir: &Path, want: &str) -> String { /// silently re-run every member over the built-in synthetic showcase stream, /// which diverges from the stored real-data metrics on every member (observed: /// `reproduced 0/N bit-identically`, exit 1). Gated on the local GER40 archive -/// (skip-on-no-data convention); uses the plain `r_sma_open.json` blueprint — +/// (skip-on-no-data convention); uses the plain `r_sma.json` blueprint — /// no gang, no campaign-specific fixture — because the divergence is driven by /// `--real`, not by the minting path. #[test] @@ -1781,7 +1781,7 @@ fn reproduce_real_sweep_family_re_derives_bit_identically() { return; } let (dir, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let mint = Command::new(BIN) .args([ "sweep", &fixture, @@ -1819,9 +1819,10 @@ fn reproduce_real_sweep_family_re_derives_bit_identically() { /// Property (C18/C1 reproduce guarantee, #246): the same reproduce guarantee holds /// when the swept axis names a BOUND param of a CLOSED starter blueprint, not an /// already-open one — `r_sma.json` (both `sma_signal.fast.length` and -/// `sma_signal.slow.length` bound), the closed counterpart of the OPEN -/// `r_sma_open.json` the walk-forward reproduce sibling -/// (`aura_walkforward_over_a_blueprint_reproduces_bit_identically`) sweeps. +/// `sma_signal.slow.length` bound), overriding only the `fast.length` axis and +/// leaving `slow.length` bound — unlike the walk-forward reproduce sibling +/// (`aura_walkforward_over_a_blueprint_reproduces_bit_identically`), which +/// overrides both axes over the same closed blueprint. /// Modelled on that sibling (synthetic in-process walk-forward — no `--real`), /// NOT on `reproduce_real_sweep_family_re_derives_bit_identically`: a real-data /// mint routes through the campaign executor (`CliMemberRunner::run_member` + @@ -1935,7 +1936,7 @@ fn reproduce_real_walkforward_family_does_not_panic() { const WF_FROM_MS: &str = "1735689600000"; const WF_TO_MS: &str = "1747353600000"; let (dir, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let mint = Command::new(BIN) .args([ "walkforward", &fixture, @@ -2139,7 +2140,7 @@ fn sweep_real_multi_column_blueprint_opens_high_and_low_columns() { #[test] fn aura_sweep_real_blueprint_refuses_a_raw_form_axis_name_before_data_access() { let dir = temp_cwd("sweep_real_rawname_refusal"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = Command::new(BIN) .args([ "sweep", &fixture, @@ -2184,7 +2185,7 @@ fn aura_sweep_real_blueprint_subset_axes_refuses_without_store_litter() { return; } let (dir, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/tests/fixtures/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); let out = Command::new(BIN) .args([ "sweep", &fixture, @@ -2228,9 +2229,11 @@ fn aura_sweep_real_blueprint_subset_axes_refuses_without_store_litter() { /// comment. Modelled on `sweep_real_blueprint_member_lines_pin_the_dissolved_contract` /// (the dissolved-sweep e2e family `walkforward_dissolved_refuses_an_unknown_axis_name` /// belongs to): same store-reading assertions (`aura runs families`, one -/// persisted `Sweep` family, member count), but over the CLOSED `r_sma.json` -/// fixture (`sma_signal.fast.length`/`sma_signal.slow.length` both bound) -/// instead of the OPEN `r_sma_open.json` every other real-data sweep pin uses. +/// persisted `Sweep` family, member count), over the same `r_sma.json` +/// fixture every other real-data sweep pin uses (`sma_signal.fast.length`/ +/// `sma_signal.slow.length` both bound) — the distinguishing property here +/// is that the swept axis names an already-bound param, not that the +/// fixture differs. #[test] fn sweep_dissolved_accepts_an_axis_over_a_bound_param() { if !local_data_present() { @@ -2269,6 +2272,89 @@ fn sweep_dissolved_accepts_an_axis_over_a_bound_param() { ); } +/// Property (#246 override merge, exercised at scale by #248's open-twins +/// migration): sweeping the CLOSED `examples/r_sma.json` (both SMA lengths +/// bound to defaults 2/4) with `--axis` values that override BOTH bound +/// lengths yields BIT-IDENTICAL per-member `total_pips` to sweeping the +/// historical OPEN `tests/fixtures/r_sma_open.json` (both lengths genuinely +/// unbound) over the same axis values. #248's migration replaced the "bind +/// an open param" idiom with "override a bound param" at dozens of call +/// sites across cli_run.rs/research_docs.rs/project_load.rs; if the override +/// merge ever diverged from the historical bind path (e.g. a different +/// position in the rebuilt param vector), every migrated seed/grade site +/// would silently compile a DIFFERENT graph while still exiting 0 — no other +/// test cross-checks the two idioms against each other. NOT gated — a +/// synthetic sweep, no `--real`, so it is CI-safe on every machine. +#[test] +fn sweep_over_a_bound_override_matches_the_historical_open_bind() { + let closed_dir = temp_cwd("bound-override-matches-open-closed"); + let closed_bp = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); + let closed_out = Command::new(BIN) + .args([ + "sweep", &closed_bp, + "--axis", "sma_signal.fast.length=2,4", + "--axis", "sma_signal.slow.length=8,16", + ]) + .current_dir(&closed_dir) + .output() + .expect("spawn sweep over the closed blueprint's bound-override axes"); + assert!( + closed_out.status.success(), + "closed sweep exit: {:?}; stderr: {}", + closed_out.status, + String::from_utf8_lossy(&closed_out.stderr) + ); + + let open_dir = temp_cwd("bound-override-matches-open-open"); + let open_bp = format!("{}/tests/fixtures/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let open_out = Command::new(BIN) + .args([ + "sweep", &open_bp, + "--axis", "sma_signal.fast.length=2,4", + "--axis", "sma_signal.slow.length=8,16", + ]) + .current_dir(&open_dir) + .output() + .expect("spawn sweep over the open blueprint's unbound axes"); + assert!( + open_out.status.success(), + "open sweep exit: {:?}; stderr: {}", + open_out.status, + String::from_utf8_lossy(&open_out.stderr) + ); + + let pips = |dir: &Path| -> Vec { + let rank = Command::new(BIN) + .args(["runs", "family", "sweep-0", "rank", "total_pips"]) + .current_dir(dir) + .output() + .expect("spawn rank"); + assert!(rank.status.success(), "rank exit: {:?}", rank.status); + let out = String::from_utf8(rank.stdout).expect("utf-8"); + out.lines() + .map(|l| { + let key = "\"total_pips\":"; + let start = l.find(key).expect("line has total_pips") + key.len(); + let tail = &l[start..]; + let end = tail.find([',', '}']).expect("token end"); + tail[..end].parse().expect("total_pips is an f64") + }) + .collect() + }; + let mut closed_pips = pips(&closed_dir); + let mut open_pips = pips(&open_dir); + closed_pips.sort_by(|a, b| a.partial_cmp(b).unwrap()); + open_pips.sort_by(|a, b| a.partial_cmp(b).unwrap()); + assert_eq!( + closed_pips, open_pips, + "bound-override and historical open-bind must compute bit-identical \ + member metrics for the same axis grid" + ); + + let _ = std::fs::remove_dir_all(&closed_dir); + let _ = std::fs::remove_dir_all(&open_dir); +} + /// The synthetic seed-resweep `mc` is undefined over real bars (one realization -> /// identical members), so a bare `aura mc --real EURUSD` — with no R candidate — is /// REJECTED (usage on stderr, exit 2) at the binary boundary. The real path is @@ -2600,7 +2686,7 @@ fn generalize_grades_a_candidate_across_two_instruments() { const FROM_MS: &str = "1725148800000"; const TO_MS: &str = "1727740799999"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40,USDJPY", @@ -2646,7 +2732,7 @@ fn generalize_real_e2e_pins_the_exact_current_grade() { const FROM_MS: &str = "1725148800000"; const TO_MS: &str = "1727740799999"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40,USDJPY", @@ -2691,7 +2777,7 @@ fn generalize_real_e2e_pins_the_exact_current_grade() { /// blueprint, not just the historical r-sma candidate — the whole point of /// dropping `--strategy r-sma`/`--fast`/`--slow` for a positional blueprint + /// generic `--axis`. Every other generalize E2E test here still exercises -/// `r_sma_open.json`, so a regression that silently special-cased r-sma paths +/// `r_sma.json`, so a regression that silently special-cased r-sma paths /// back in (e.g. resolving axes against a hardcoded `sma_signal.*` namespace) /// would ship green there while breaking every other blueprint. This runs the /// unrelated r-breakout candidate (the ganged `channel_length` axis, no @@ -2703,7 +2789,7 @@ fn generalize_grades_a_non_r_sma_blueprint() { const FROM_MS: &str = "1725148800000"; const TO_MS: &str = "1727740799999"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_breakout_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/tests/fixtures/r_breakout_open.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40,USDJPY", @@ -2751,7 +2837,7 @@ fn walkforward_real_e2e_pins_the_exact_current_grade() { const FROM_MS: &str = "1735689600000"; const TO_MS: &str = "1767225599000"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "walkforward", &fixture, "--real", "GER40", @@ -2797,7 +2883,7 @@ fn walkforward_real_e2e_pins_the_exact_current_grade() { /// sweepable blueprint through the campaign path, not just the historical r-sma /// candidate — the whole point of dropping `--strategy r-sma`/`--fast`/`--slow` /// for a positional blueprint + generic `--axis`. Every other walkforward E2E -/// test here still exercises `r_sma_open.json`; a regression that silently +/// test here still exercises `r_sma.json`; a regression that silently /// special-cased the refit's axis lookup back to a hardcoded `sma_signal.*` /// namespace (e.g. in `walkforward_summary_json_from_reports`'s per-axis /// `raw_matches_wrapped` search) would ship green there while breaking every @@ -2813,7 +2899,7 @@ fn walkforward_dissolves_a_non_r_sma_blueprint() { const FROM_MS: &str = "1735689600000"; const TO_MS: &str = "1767225599000"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_breakout_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/tests/fixtures/r_breakout_open.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "walkforward", &fixture, "--real", "GER40", @@ -2852,7 +2938,7 @@ fn walkforward_dissolves_a_non_r_sma_blueprint() { #[test] fn walkforward_dissolved_refuses_a_multi_value_stop() { let cwd = temp_cwd("walkforward-multi-stop"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "walkforward", &fixture, "--real", "GER40", @@ -2874,7 +2960,7 @@ fn walkforward_dissolved_refuses_a_multi_value_stop() { #[test] fn walkforward_dissolved_accepts_select_plateau() { let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "walkforward", &fixture, "--real", "GER40", @@ -2918,7 +3004,7 @@ fn walkforward_real_e2e_pins_the_exact_current_plateau_grade() { const FROM_MS: &str = "1735689600000"; const TO_MS: &str = "1767225599000"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "walkforward", &fixture, "--real", "GER40", @@ -2972,7 +3058,7 @@ fn walkforward_real_e2e_pins_the_exact_current_plateau_grade() { #[test] fn walkforward_dissolved_defaults_a_single_omitted_knob() { let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "walkforward", &fixture, "--real", "GER40", @@ -3005,7 +3091,7 @@ fn walkforward_dissolved_defaults_a_single_omitted_knob() { #[test] fn walkforward_dissolved_refuses_an_empty_real_symbol() { let cwd = temp_cwd("walkforward-empty-real"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "walkforward", &fixture, "--real", "", @@ -3029,7 +3115,7 @@ fn walkforward_dissolved_refuses_an_empty_real_symbol() { #[test] fn walkforward_dissolved_refuses_an_unknown_axis_name() { let cwd = temp_cwd("walkforward-unknown-axis"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "walkforward", &fixture, "--real", "GER40", @@ -3059,7 +3145,7 @@ fn walkforward_dissolved_refuses_an_unknown_axis_name() { #[test] fn walkforward_dissolved_refuses_an_unknown_select_token() { let cwd = temp_cwd("walkforward-bad-select"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "walkforward", &fixture, "--real", "GER40", @@ -3083,7 +3169,7 @@ fn walkforward_dissolved_refuses_an_unknown_select_token() { #[test] fn walkforward_dissolved_refuses_name_and_trace_together() { let cwd = temp_cwd("walkforward-name-and-trace"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "walkforward", &fixture, "--real", "GER40", @@ -3119,7 +3205,7 @@ fn walkforward_dissolves_through_the_campaign_path() { const FROM_MS: &str = "1735689600000"; const TO_MS: &str = "1767225599000"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "walkforward", &fixture, "--real", "GER40", @@ -3210,7 +3296,7 @@ fn walkforward_stopless_defaults_the_regime_byte_identically_to_explicit_3_2() { const FROM_MS: &str = "1735689600000"; const TO_MS: &str = "1767225599000"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); // Stop-less: the two knobs are omitted entirely. This is the headline — today it // is refused at the argv boundary (exit 2, "requires --stop-length --stop-k"); @@ -3296,7 +3382,7 @@ fn generalize_dissolves_through_the_campaign_path() { const FROM_MS: &str = "1725148800000"; const TO_MS: &str = "1727740799999"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40,USDJPY", @@ -3387,7 +3473,7 @@ fn generalize_repeated_identical_invocation_does_not_litter_the_store() { const FROM_MS: &str = "1725148800000"; const TO_MS: &str = "1727740799999"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let invoke = || { std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ @@ -3442,7 +3528,7 @@ fn generalize_distinct_invocations_persist_distinct_campaign_documents() { const FROM_MS: &str = "1725148800000"; const TO_MS: &str = "1727740799999"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let invoke = |fast: &str| { let fast_axis = format!("sma_signal.fast.length={fast}"); std::process::Command::new(env!("CARGO_BIN_EXE_aura")) @@ -3492,7 +3578,7 @@ fn generalize_distinct_invocations_persist_distinct_campaign_documents() { #[test] fn generalize_without_explicit_window_resolves_a_shared_window_and_completes() { let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40,USDJPY", @@ -3545,7 +3631,7 @@ fn generalize_without_explicit_window_resolves_the_intersection_of_all_symbols() return; } let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); // The resolved shared window persists verbatim in the generated campaign // document; read the (from_ms, to_ms) of the one whose `name` field matches. @@ -3630,7 +3716,7 @@ fn generalize_without_explicit_window_resolves_the_intersection_of_all_symbols() /// before any data access — so it asserts the arity refusal on any machine. #[test] fn generalize_refuses_a_single_instrument() { - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40", @@ -3646,7 +3732,7 @@ fn generalize_refuses_a_single_instrument() { /// `check_r_metric` pre-check), so this asserts the R-only refusal on any machine. #[test] fn generalize_refuses_a_non_r_metric() { - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40,USDJPY", @@ -3671,7 +3757,7 @@ fn generalize_refuses_a_non_r_metric() { /// check precedes any geometry/archive lookup, so it asserts on any machine. #[test] fn generalize_refuses_a_duplicate_instrument() { - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40,GER40", @@ -3696,7 +3782,7 @@ fn generalize_refuses_a_duplicate_instrument() { /// into a multi-cell run whose generalization grade would be ill-defined. #[test] fn generalize_refuses_a_multi_value_axis() { - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40,USDJPY", @@ -3720,7 +3806,7 @@ fn generalize_refuses_a_multi_value_axis() { /// sweep/walkforward "no axis" refusals. Data-free (fires before any archive access). #[test] fn generalize_refuses_no_axis() { - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40,USDJPY", @@ -3744,7 +3830,7 @@ fn generalize_refuses_no_axis() { /// `aura sweep` enforces (`aura_sweep_real_blueprint_refuses_a_raw_form_axis_name_before_data_access`). #[test] fn generalize_refuses_an_unknown_axis_name() { - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40,USDJPY", @@ -3781,7 +3867,7 @@ fn generalize_persists_a_discoverable_cross_instrument_family() { const FROM_MS: &str = "1725148800000"; const TO_MS: &str = "1727740799999"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40,USDJPY", @@ -3843,7 +3929,7 @@ fn generalize_family_members_are_attributed_to_the_right_instrument() { const FROM_MS: &str = "1725148800000"; const TO_MS: &str = "1727740799999"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40,USDJPY", @@ -3910,7 +3996,7 @@ fn generalize_family_members_stamp_project_provenance() { const FROM_MS: &str = "1725148800000"; const TO_MS: &str = "1727740799999"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40,USDJPY", @@ -3957,13 +4043,13 @@ fn generalize_family_members_stamp_project_provenance() { } } -/// `aura sweep --axis = …` (#166): sweeps a loaded OPEN -/// signal over its named param-space axes and persists a discoverable Sweep family. -/// Both open knobs (fast/slow) must be bound by axes; the 2×2 grid yields 4 members. +/// `aura sweep --axis = …` (#166): sweeps a loaded CLOSED +/// blueprint over its named bound-override axes and persists a discoverable Sweep family. +/// Both bound knobs (fast/slow) must be re-opened by axes; the 2×2 grid yields 4 members. #[test] fn aura_sweep_loads_a_blueprint_and_persists_a_sweep_family() { let cwd = temp_cwd("blueprint-sweep"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = Command::new(BIN) .args([ "sweep", &fixture, @@ -3996,7 +4082,7 @@ fn aura_sweep_loads_a_blueprint_and_persists_a_sweep_family() { /// both are the lying/pointer-less surface this pins. #[test] fn sweep_and_walkforward_refuse_trace_with_a_forward_pointer() { - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); for verb in ["sweep", "walkforward"] { let cwd = temp_cwd(&format!("{verb}-trace-refusal")); let out = Command::new(BIN) @@ -4050,7 +4136,7 @@ fn aura_sweep_persists_the_canonical_blueprint_keyed_by_topology_hash() { use sha2::{Digest, Sha256}; let cwd = temp_cwd("blueprint-sweep-store"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = Command::new(BIN) .args([ "sweep", &fixture, @@ -4101,12 +4187,13 @@ fn aura_sweep_persists_the_canonical_blueprint_keyed_by_topology_hash() { } /// An `--axis` name that does not resolve against the loaded blueprint's param_space -/// fails clean (a named BindError, non-zero exit), not a panic. The OPEN fixture has -/// sweepable knobs, so a nonsense axis name (`nope`) is genuinely unknown — it names -/// neither an open knob nor a bound param (#246: a bound name would re-open instead). +/// fails clean (a named BindError, non-zero exit), not a panic. The CLOSED fixture has +/// bound-override knobs, so a nonsense axis name (`nope`) is genuinely unknown — it names +/// neither a re-openable bound param nor an already-open knob (#246: a bound name would +/// re-open instead). #[test] fn aura_sweep_rejects_an_unknown_axis() { - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = Command::new(BIN) .args(["sweep", &fixture, "--axis", "nope=1,2", "--name", "f"]) .output() @@ -4127,7 +4214,7 @@ fn aura_sweep_rejects_an_unknown_axis() { #[test] fn aura_reproduce_re_derives_a_persisted_sweep_family() { let cwd = temp_cwd("blueprint-reproduce"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let sweep = Command::new(BIN) .args([ "sweep", &fixture, @@ -4168,7 +4255,7 @@ fn aura_reproduce_re_derives_a_persisted_sweep_family() { #[test] fn aura_reproduce_reports_a_diverged_member_and_exits_one() { let cwd = temp_cwd("blueprint-reproduce-diverge"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let sweep = Command::new(BIN) .args([ "sweep", &fixture, @@ -4207,7 +4294,7 @@ fn aura_reproduce_reports_a_diverged_member_and_exits_one() { #[test] fn aura_reproduce_re_derives_a_persisted_sweep_bit_identically() { let cwd = temp_cwd("reproduce_roundtrip"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let sweep = std::process::Command::new(BIN) .args([ @@ -4291,7 +4378,7 @@ fn aura_mc_over_a_blueprint_reproduces_bit_identically() { #[test] fn aura_walkforward_over_a_blueprint_reproduces_bit_identically() { let cwd = temp_cwd("blueprint-walkforward-reproduce"); - let bp = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let bp = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let run = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args(["walkforward", &bp, "--axis", "sma_signal.fast.length=2,3", "--axis", "sma_signal.slow.length=4,6", "--name", "wfr"]) @@ -4316,7 +4403,7 @@ fn aura_walkforward_over_a_blueprint_reproduces_bit_identically() { #[test] fn aura_walkforward_over_a_blueprint_persists_a_family() { let cwd = temp_cwd("blueprint-walkforward-persist"); - let bp = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let bp = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args(["walkforward", &bp, "--axis", "sma_signal.fast.length=2,3", "--axis", "sma_signal.slow.length=4,6", "--name", "wfx"]) @@ -4337,11 +4424,11 @@ fn aura_walkforward_over_a_blueprint_persists_a_family() { let _ = std::fs::remove_dir_all(&cwd); } -/// E2E (#173): an OPEN blueprint with no --axis (nothing to re-fit) is a usage +/// E2E (#173): a CLOSED blueprint with no --axis (nothing to re-fit) is a usage /// error (exit 2), naming that >= 1 --axis is required. #[test] fn aura_walkforward_over_a_blueprint_rejects_no_axis() { - let bp = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let bp = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args(["walkforward", &bp]) .output() @@ -4379,7 +4466,7 @@ fn aura_walkforward_over_a_blueprint_rejects_malformed() { /// while leaving the malformed test green. #[test] fn aura_walkforward_over_a_blueprint_rejects_an_unknown_axis() { - let bp = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let bp = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args(["walkforward", &bp, "--axis", "nope=1,2"]) .output() @@ -4433,7 +4520,7 @@ fn aura_walkforward_emits_an_unknown_axis_rejection_once() { #[test] fn aura_mc_rejects_an_open_blueprint() { let cwd = temp_cwd("mc-blueprint-open-reject"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/tests/fixtures/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); let out = Command::new(BIN) .args(["mc", &fixture, "--seeds", "4"]) .current_dir(&cwd) @@ -4453,7 +4540,7 @@ fn aura_mc_rejects_an_open_blueprint() { #[test] fn aura_run_rejects_an_open_blueprint_without_panicking() { let cwd = temp_cwd("run-blueprint-open-reject"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/tests/fixtures/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); let out = Command::new(BIN) .args(["run", &fixture]) .current_dir(&cwd) @@ -4510,7 +4597,7 @@ fn aura_reproduce_rejects_an_unknown_family() { #[test] fn aura_reproduce_rejects_a_missing_stored_blueprint() { let cwd = temp_cwd("reproduce_missing_store"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let sweep = std::process::Command::new(BIN) .args([ "sweep", @@ -4551,7 +4638,7 @@ fn aura_reproduce_rejects_a_missing_stored_blueprint() { /// user can discover then sweep or re-open without guessing. #[test] fn aura_sweep_list_axes_prints_prefixed_names() { - let bp = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let bp = format!("{}/tests/fixtures/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args(["sweep", &bp, "--list-axes"]) .output() @@ -4594,7 +4681,7 @@ fn aura_sweep_list_axes_closed_prints_bound_defaults() { /// and takes no other flags. A query cannot also seed a sweep. #[test] fn aura_sweep_list_axes_rejects_other_flags() { - let bp = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let bp = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args(["sweep", &bp, "--list-axes", "--axis", "sma_signal.fast.length=2,3"]) .output() @@ -4683,7 +4770,7 @@ fn aura_sweep_rejects_malformed_json_house_style() { #[test] fn aura_sweep_list_axes_names_round_trip_into_a_working_sweep() { let cwd = temp_cwd("blueprint-list-axes-roundtrip"); - let bp = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let bp = format!("{}/tests/fixtures/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); // 1) discover the axis names + kinds (do NOT hardcode them) — this is what a user // reads. #246: the fixture now lists a BOUND param (`bias.scale`, F64) alongside @@ -4943,7 +5030,7 @@ fn mc_r_bootstrap_real_e2e_pins_the_exact_current_grade() { const FROM_MS: &str = "1735689600000"; const TO_MS: &str = "1767225599000"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "mc", &fixture, "--real", "GER40", @@ -4985,7 +5072,7 @@ fn mc_r_bootstrap_real_e2e_pins_the_exact_current_grade() { /// blueprint through the campaign path, not just the historical r-sma candidate /// — the whole point of dropping `--strategy r-sma`/`--fast`/`--slow` for a /// positional blueprint + generic `--axis`. Every other mc E2E test here still -/// exercises `r_sma_open.json`; a regression that silently special-cased the +/// exercises `r_sma.json`; a regression that silently special-cased the /// pipeline's axis lookup back to a hardcoded `sma_signal.*` namespace would /// ship green there while breaking every other blueprint. This runs the /// unrelated r-breakout candidate (the ganged `channel_length` axis, no @@ -5000,7 +5087,7 @@ fn mc_dissolves_a_non_r_sma_blueprint() { const FROM_MS: &str = "1735689600000"; const TO_MS: &str = "1767225599000"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_breakout_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/tests/fixtures/r_breakout_open.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "mc", &fixture, "--real", "GER40", @@ -5055,7 +5142,7 @@ fn mc_dissolves_through_the_campaign_path() { const FROM_MS: &str = "1735689600000"; const TO_MS: &str = "1767225599000"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "mc", &fixture, "--real", "GER40", @@ -5158,7 +5245,7 @@ fn mc_real_fits_the_injected_roller_to_a_short_window() { return; } let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); // Probe GER40's full archive window: a single-cell, no-window sweep records // `campaign_window_ms(full_window)` into its generated campaign document, in the @@ -5251,7 +5338,7 @@ fn mc_real_fits_the_injected_roller_to_a_short_window() { #[test] fn mc_dissolved_refuses_a_multi_value_stop() { let cwd = temp_cwd("mc-multi-stop"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "mc", &fixture, "--real", "GER40", @@ -5276,7 +5363,7 @@ fn mc_dissolved_refuses_a_multi_value_stop() { #[test] fn mc_dissolved_refuses_an_unknown_axis_name() { let cwd = temp_cwd("mc-unknown-axis"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "mc", &fixture, "--real", "GER40", @@ -5318,7 +5405,7 @@ fn mc_dissolved_seed_changes_the_bootstrap_draw_not_the_pooled_series() { const FROM_MS: &str = "1735689600000"; const TO_MS: &str = "1767225599000"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let run = |seed: &str| { std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ @@ -5381,7 +5468,7 @@ fn walkforward_campaign_runs_an_arbitrary_blueprint() { const FROM_MS: &str = "1735689600000"; const TO_MS: &str = "1767225599000"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_breakout_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/tests/fixtures/r_breakout_open.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "walkforward", &fixture, "--real", "GER40", @@ -5432,7 +5519,7 @@ fn mc_campaign_runs_an_arbitrary_blueprint() { const FROM_MS: &str = "1735689600000"; const TO_MS: &str = "1767225599000"; let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_breakout_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/tests/fixtures/r_breakout_open.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "mc", &fixture, "--real", "GER40", @@ -5481,7 +5568,7 @@ fn generalize_campaign_runs_an_arbitrary_blueprint() { return; } let (cwd, _g) = fresh_project(); - let fixture = format!("{}/examples/r_meanrev_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/tests/fixtures/r_meanrev_open.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "generalize", &fixture, "--real", "GER40,USDJPY", @@ -5519,7 +5606,7 @@ fn generalize_campaign_runs_an_arbitrary_blueprint() { #[test] fn walkforward_campaign_refuses_missing_axis() { let cwd = temp_cwd("walkforward-campaign-no-axis"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args(["walkforward", &fixture, "--real", "GER40", "--stop-length", "14", "--stop-k", "2.0"]) .current_dir(&cwd) @@ -5535,7 +5622,7 @@ fn walkforward_campaign_refuses_missing_axis() { #[test] fn mc_campaign_refuses_seeds_with_real() { let cwd = temp_cwd("mc-campaign-seeds-mix"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "mc", &fixture, "--real", "GER40", "--seeds", "3", @@ -5556,7 +5643,7 @@ fn mc_campaign_refuses_seeds_with_real() { #[test] fn walkforward_campaign_refuses_a_raw_form_axis_name() { let cwd = temp_cwd("walkforward-campaign-raw-axis"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "walkforward", &fixture, "--real", "GER40", @@ -5577,7 +5664,7 @@ fn walkforward_campaign_refuses_a_raw_form_axis_name() { #[test] fn mc_campaign_refuses_an_unknown_axis() { let cwd = temp_cwd("mc-campaign-unknown-axis"); - let fixture = format!("{}/examples/r_breakout_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_breakout.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "mc", &fixture, "--real", "GER40", @@ -5605,7 +5692,7 @@ fn mc_campaign_refuses_an_unknown_axis() { #[test] fn mc_campaign_refuses_missing_axis() { let cwd = temp_cwd("mc-campaign-no-axis"); - let fixture = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let fixture = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = std::process::Command::new(env!("CARGO_BIN_EXE_aura")) .args(["mc", &fixture, "--real", "GER40", "--stop-length", "14", "--stop-k", "2.0"]) .current_dir(&cwd) diff --git a/crates/aura-cli/tests/project_load.rs b/crates/aura-cli/tests/project_load.rs index 92acc5b..b08013b 100644 --- a/crates/aura-cli/tests/project_load.rs +++ b/crates/aura-cli/tests/project_load.rs @@ -103,12 +103,12 @@ fn project_registry_anchors_at_discovered_root_not_invocation_cwd() { let sub = dir.join("src"); let runs_dir = dir.join("runs"); std::fs::remove_dir_all(&runs_dir).ok(); - let open_bp = - format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let closed_bp = + format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let out = Command::new(env!("CARGO_BIN_EXE_aura")) .args([ "sweep", - &open_bp, + &closed_bp, "--axis", "sma_signal.fast.length=2,4", "--axis", diff --git a/crates/aura-cli/tests/research_docs.rs b/crates/aura-cli/tests/research_docs.rs index 3d32c4c..5fd5c9a 100644 --- a/crates/aura-cli/tests/research_docs.rs +++ b/crates/aura-cli/tests/research_docs.rs @@ -315,15 +315,16 @@ fn campaign_validate_in_project_reports_referential_tier_end_to_end() { ScratchPath::File(dir.join("ref-bad.campaign.json")), ]); - // Seed one real, content-addressed, open-param blueprint into the - // project's own store via a real sweep (mirrors `project_load.rs`'s - // anchor test). - let open_bp = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + // Seed one real, content-addressed blueprint into the project's own + // store via a real sweep over its bound params, which the axes reopen + // as overridable defaults (#246) (mirrors `project_load.rs`'s anchor + // test). + let closed_bp = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let (sweep_out, sweep_code) = run_code_in( dir, &[ "sweep", - &open_bp, + &closed_bp, "--axis", "sma_signal.fast.length=2,4", "--axis", @@ -956,15 +957,16 @@ fn campaign_register_refuses_invalid_cost_section_and_writes_nothing() { ); } -/// Seed one open-param blueprint into the built demo project's store via a -/// real sweep and return its content id (the referential test's recipe). +/// Seed one blueprint (its params bound, reopened by the sweep axes per +/// #246) into the built demo project's store via a real sweep and return +/// its content id (the referential test's recipe). fn seed_blueprint(dir: &Path, name: &str) -> String { - let open_bp = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); + let closed_bp = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); let (out, code) = run_code_in( dir, &[ "sweep", - &open_bp, + &closed_bp, "--axis", "sma_signal.fast.length=2,4", "--axis", @@ -3208,8 +3210,8 @@ fn campaign_run_accepts_a_graph_register_seeded_strategy() { ScratchPath::File(dir.join("onramp.process.json")), ScratchPath::File(dir.join("onramp.campaign.json")), ]); - let open_bp = format!("{}/examples/r_sma_open.json", env!("CARGO_MANIFEST_DIR")); - let (reg_out, reg_code) = run_code_in(dir, &["graph", "register", &open_bp]); + let closed_bp = format!("{}/examples/r_sma.json", env!("CARGO_MANIFEST_DIR")); + let (reg_out, reg_code) = run_code_in(dir, &["graph", "register", &closed_bp]); assert_eq!(reg_code, Some(0), "graph register failed: {reg_out}"); let bp_id = reg_out .lines() diff --git a/docs/design/INDEX.md b/docs/design/INDEX.md index dd890f4..082d371 100644 --- a/docs/design/INDEX.md +++ b/docs/design/INDEX.md @@ -1032,7 +1032,8 @@ SQN comparability. Each swept member's manifest records the fixed R-defining par beside the floated knobs (reproducible from its own manifest, C18). [HISTORY — the built-in `--strategy` sweep surface was retired with the demos → blueprint-data (#159, cuts 1b-4); the rankable R sweep now runs as `aura sweep - --axis …` over examples/r_sma_open.json.] + --axis …` over r_sma_open.json (an example then; relocated to +`crates/aura-cli/tests/fixtures/` by #248).] **Realization (cycle 0067, #130 + #135).** **#130 (SQN100):** `RMetrics` gains `sqn_normalized = (mean_R/stdev_R)·√(min(n, 100))` — the n-normalized "SQN score"