diff --git a/crates/aura-cli/src/scaffold.rs b/crates/aura-cli/src/scaffold.rs index 0c4a0b1..7a0a25e 100644 --- a/crates/aura-cli/src/scaffold.rs +++ b/crates/aura-cli/src/scaffold.rs @@ -103,6 +103,7 @@ aura-core = { path = "__ENGINE__/crates/aura-core" } const AURA_TOML: &str = r#"# Static project context only (C17); paths only. [paths] runs = "runs" +# data = "/path/to/archive" # the recorded-data root; defaults to the built-in path "#; const GITIGNORE: &str = "/target\nCargo.lock\n/runs\n"; diff --git a/docs/glossary.md b/docs/glossary.md index 55446c5..c7b6f07 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -17,7 +17,7 @@ The primitive `(frozen topology + param-set + data-window + RNG-seed) → determ ### Aura.toml **Avoid:** — -The per-project declarative config holding only static context — paths only: the data archive root and the runs dir — never logic, and never instrument geometry (that is the recorded sidecar, C15). Its presence marks the project root, the way `Cargo.toml` marks a cargo crate. +The per-project declarative config holding only static context — paths only: `[paths] data` (the archive root; defaults to the built-in path when unset) and `[paths] runs` (the runs dir) — never logic, and never instrument geometry (that is the recorded sidecar, C15). Its presence marks the project root, the way `Cargo.toml` marks a cargo crate. ### backtest **Avoid:** — diff --git a/docs/project-layout.md b/docs/project-layout.md index 3ef3d71..b3bf221 100644 --- a/docs/project-layout.md +++ b/docs/project-layout.md @@ -30,9 +30,10 @@ A project is always a Rust program built on the engine. ``` ger40-lab/ # your research project — a separate Rust crate (cdylib) -├── Aura.toml # STATIC context only, paths only: the runs dir (all -│ # the scaffold emits today), plus a data archive root -│ # once real data enters; no logic — instrument +├── Aura.toml # STATIC context only, paths only: `[paths] runs` +│ # (the runs dir) and `[paths] data` (the archive +│ # root; defaults to the built-in Pepperstone path +│ # when unset); no logic — instrument │ # geometry is the recorded sidecar (C15), never │ # authored here ├── Cargo.toml # cdylib; depends on aura-core/aura-std (+ shared node crates); diff --git a/docs/specs/fieldtest-milestone-research-artifacts.md b/docs/specs/fieldtest-milestone-research-artifacts.md new file mode 100644 index 0000000..e04165c --- /dev/null +++ b/docs/specs/fieldtest-milestone-research-artifacts.md @@ -0,0 +1,110 @@ +# Fieldtest — milestone: Research artifacts (process & campaign documents) — 2026-07-04 + +**Status:** Draft — awaiting orchestrator triage +**Author:** fieldtester (dispatched by fieldtest skill, milestone-close gate) + +## Scope +The milestone "Research artifacts — process & campaign documents" (#189/#192–#207, +cycles 0106–0109) ships roles 5/6b their artifacts: the **process document** (a +closed std-stage validation methodology) and the **campaign document** (persisted +experiment intent — instruments × windows × strategy refs × param axes × process +ref × data-level presentation), authored/validated/executed headless, content- +addressed beside blueprints. Over the four cycles the surface grew from v1 +document vocabularies + two-tier validation (0106), through the v1 executor + +blueprint on-ramp (0107), the annotator stages `std::monte_carlo`/`std::generalize` +(0108), to `persist_taps` trace persistence + the third executable validation tier +(0109). This milestone fieldtest runs ONE continuous downstream scenario over the +whole span: introspection-only authoring → 3-tier validate → register → run by +content id → judge the realization → re-run + byte-compare → boundary probes. + +## Examples +### fieldtests/milestone-research-artifacts/mra_1_strategy_smacross.json — strategy op-script (role-6a input) +- Open SMA-cross (source→fast/slow SMA→Sub→Bias→expose bias); built via + `graph build` to `mra_1_strategy_built.json`, param space + `fast.length/slow.length/bias.scale`, registered (content id `597d71…`). +- Fits: the campaign references it by content id; exercises `graph introspect + --vocabulary/--node/--unwired/--params/--content-id` + `graph register`. +- Outcome: built, registered, content id stable across sessions. (Op grammar + itself not CLI-discoverable — F8.) + +### fieldtests/milestone-research-artifacts/mra_2_process_full_v2.json — full v2 process document +- `std::sweep`(deflate) → `std::gate`(expectancy_r>0) → `std::walk_forward`(rolling) + → `std::monte_carlo` → `std::generalize`; authored from `process introspect + --unwired/--vocabulary/--block/--metrics` alone; validated, registered (`cd9127…`). +- Fits: the full anti-false-discovery pipeline the milestone promises. +- Outcome: `valid (intrinsic): 5 pipeline blocks`; registered. + +### fieldtests/milestone-research-artifacts/mra_3_campaign_full_v2.json — two-instrument campaign +- GER40 + FRA40, 2024-09, axes 2×2×1, process/strategy by content id, + `persist_taps [equity, r_equity]`, `emit [family_table, selection_report]`; + authored from `campaign introspect --unwired/--block` alone; validated all three + tiers, registered (`42edeb…`), run by content id. +- Fits: the whole milestone promise (intent → reproducible recorded evidence). +- Outcome: `valid (executable)`; run exit 0; two nominee trace cells on disk; + chart read-back OK; re-run byte-identical modulo counters. + +## Findings +See the recommendation table for classes. Full verbatim evidence is in the run +capture fixtures (`mra_run1_stdout.txt`, `mra_run2_stdout.txt`, +`mra_realization_campaign_runs.jsonl`) and the probe fixtures. + +### [working] F1 — full v2 pipeline closes end to end over two instruments +`campaign run ` executes sweep(deflate)→gate→walk_forward→monte_carlo +per cell + campaign-scope generalize; every stage records its evidence +(deflated_score/overfit_probability, survivor_ordinals, pooled_oos bootstrap with +prob_le_zero, generalization worst_case/sign_agreement/winners). Headless, no compile. + +### [working] F2 — bare-`{}` envelope + block/metric introspection bootstrap authoring +`introspect --unwired` on a bare `{}` enumerates every required slot (campaign +names the closed tap vocabulary inline); `--vocabulary`/`--block`/`--metrics` +(with `rankable|gate|generalize|annotation` tags) suffice to author both documents. + +### [working] F3 — three tiers, legible degradation +Inside a project: intrinsic + referential + `valid (executable)`. Outside: +intrinsic only + `referential checks skipped (no Aura.toml found up from …)`. + +### [working] F4 — C1 reproducibility + content-id stability +Two runs byte-identical modulo the campaign-run + family-run counters; metric +number stream hashes identically; op-script re-hashes to the same content id. + +### [working] F5 — auditable / navigable / chartable realization +`campaign runs` list + byte-identical bare-line dump; `trace_name` → on-disk +`{campaign8}-{run}/{strategy8}-{instrument}-w{n}/{tap}.json` family; `aura chart` +renders a nominee cell. + +### [working] F6 — refuse-don't-guess + no-compile diffability +Bogus process ref → referential refusal (exit 1); unknown tap → intrinsic +index-addressed refusal naming the closed vocabulary; wrong `kind` → exact-key +prose. A one-value axis edit → new content id, still executable, no compile. + +### [doc-gap] F7 — the documented `Aura.toml` data-archive root is not honored +Glossary + `docs/project-layout.md` say the archive root is an `Aura.toml` path; +`aura new` scaffolds none, a `[paths] archive=` key has no effect, and every +real-data path resolves a built-in `/mnt/tickdata/Pepperstone` (named in the +diagnostics). Cross-host reproducibility of recorded evidence is unreachable from +the public surface. Peripheral to the document milestone; does not block it on +this host. Repro: add `archive=` under `[paths]`, run any `--real`/campaign path. + +### [doc-gap] F8 — role-6a op-script grammar is not CLI-discoverable +`graph introspect` surfaces node vocabulary + ports but not the op-list verbs +(`source/add/feed/connect/expose`) or their JSON shape; `graph build --help` and +`project-layout.md` do not describe them. Authoring the op-script required the +fieldtest-corpus shape. Orthogonal (role 6a, shipped cycle 0088); does not block +roles 5/6b (strategy ids arrive via C25's id interface). + +## Recommendation summary +| Finding | class | action | +|---|---|---| +| F1 pipeline closes end to end | working | carry-on | +| F2 introspection bootstraps authoring | working | carry-on | +| F3 three-tier validate | working | carry-on | +| F4 C1 + content-id stability | working | carry-on | +| F5 auditable/navigable/chartable | working | carry-on | +| F6 refusals + diffability | working | carry-on | +| F7 Aura.toml archive root not honored | doc-gap | tighten glossary + project-layout (planner) | +| F8 op-script grammar undiscoverable | doc-gap | document op grammar (planner, orthogonal) | + +**Milestone Verdict: GREEN** — nameable, diffable, auditable research intent +executes reproducibly into recorded, chartable evidence, end to end. The two +doc-gaps are peripheral (archive configurability) and orthogonal (role-6a +discoverability); no bug, friction, or spec_gap in the milestone's own surface. diff --git a/fieldtests/milestone-research-artifacts/FINDINGS.md b/fieldtests/milestone-research-artifacts/FINDINGS.md new file mode 100644 index 0000000..095f7d0 --- /dev/null +++ b/fieldtests/milestone-research-artifacts/FINDINGS.md @@ -0,0 +1,96 @@ +# Milestone fieldtest — Research artifacts — process & campaign documents (cycles 0106–0109) — 2026-07-04 + +**Role:** downstream consumer (methodology + campaign designer), public +interface only (ledger C18/C22/C25, glossary, CLI --help + introspection, the +fieldtests/ corpora as shape hints). No `crates/` source read. Build: +`cargo build --release -p aura-cli` (HEAD `01925e06`); project dylib built in +the scaffolded `mrp_lab/`. Real data: local Pepperstone archive (GER40 + +FRA40, 2024-09). + +**Milestone Verdict: GREEN** — nameable, diffable, auditable research intent +executes reproducibly into recorded, chartable evidence, end to end. Both +findings are doc-gaps, neither a bug nor a broken contract; no +bug/friction/spec_gap in the milestone's own surface. + +## The one continuous scenario + +- `mra_1_strategy_smacross.json` (+`_built.json`) — op-script → `graph build` + → register, content id `597d71…` (stable across sessions). +- `mra_2_process_full_v2.json` — sweep(deflate) → gate → walk_forward → + monte_carlo → generalize, authored from introspection alone; registered + `cd9127…`. +- `mra_3_campaign_full_v2.json` — GER40+FRA40, persist_taps [equity, + r_equity], both emit kinds; validated through all three tiers, registered + `42edeb…`, run by content id. + +## Findings + +### F1 [working] Full v2 pipeline closes end to end over two instruments +`campaign run ` (exit 0) runs sweep(deflate)→gate→walk_forward→ +monte_carlo per cell + campaign-scope generalize. Records: sweep `selection` +(deflated_score/overfit_probability/n_trials), gate `survivor_ordinals: +[0,1,2]`, wf `family_id`, mc `pooled_oos` (GER40 `n_trades:1843, +prob_le_zero:0.274`; FRA40 `1272, 0.412`), `generalizations` +(`worst_case:0.04367…, sign_agreement:2`, per-instrument breakdown + `winners` +params). → carry-on. + +### F2 [working] Bare-{} envelope + block/metric introspection bootstrap authoring +`process|campaign introspect --unwired mra_bare.json` enumerates every +required slot (campaign names the closed tap vocabulary inline: +`persist_taps (equity | exposure | r_equity | net_r_equity)`); +`--vocabulary`/`--block`/`--metrics` (tags `rankable|gate|generalize| +annotation`) suffice to author both docs. The 0108-F8 R-expectancy tagging is +correct. → carry-on. + +### F3 [working] Three tiers, legible degradation +Inside a project: intrinsic + referential + `valid (executable): pipeline +shape and static guards pass`. Outside: intrinsic only + `referential checks +skipped (no Aura.toml found up from /tmp)` (exit 0). → carry-on. + +### F4 [working] C1 reproducibility + content-id stability +Two runs byte-identical after normalizing only the campaign-run counter +(`42edebd2-`) and the family-store per-name run index (`…-s0-`, both +mint-fresh per ledger); the R-metric/bootstrap number stream hashes +identically (`cd9ad25…`). Op-script re-hashes to `597d71…`. → carry-on. + +### F5 [working] Auditable / navigable / chartable realization +`campaign runs` → `run 0 — 2 cell(s), std::sweep -> std::gate -> +std::walk_forward -> std::monte_carlo`; `campaign runs ` dumps the BARE +store line, byte-identical to `campaign_runs.jsonl` (not the +`{"campaign_run":…}` wrapper). `trace_name:"42edebd2-0"` → on-disk +`runs/traces/42edebd2-0/597d719b-{GER40,FRA40}-w0/{equity,r_equity}.json` +(exactly the ledger layout); `aura chart 42edebd2-0/597d719b-GER40-w0` +renders a self-contained page. → carry-on. + +### F6 [working] Refuse-don't-guess + no-compile diffability +Bogus process ref → `process 0000… not found in the project store` +(referential, exit 1). Unknown tap → `presentation.persist_taps[1]: unknown +tap "pnl" (taps: equity | exposure | r_equity | net_r_equity)` (exit 1). +Process doc validated as campaign → `the "kind" key must be "campaign"` (the +#193 exact-key prose, exit 1). One-value axis edit (`slow.length` 16→32) → +new content id `ce0de8…`, still `valid (executable)`, no compile/run. +→ carry-on. + +### F7 [doc-gap] The documented Aura.toml data-archive root is not honored (as documented) +Glossary (`Aura.toml`: "paths only: the data archive root and the runs dir") ++ `docs/project-layout.md` claim the archive root is an `Aura.toml` path, but +neither names the KEY — and a guessed `[paths] archive = …` has no effect +(every real-data path then resolves the built-in default). The real key is +`[paths] data` (honored end-to-end incl. the campaign path). A consumer whose +archive lives elsewhere cannot configure it from the public surface without +the key name. → tighten docs (RESOLVED same-session: project-layout + +glossary now name `[paths] data`, and the `aura new` Aura.toml template +advertises the commented-out key). + +### F8 [doc-gap] Role-6a op-script grammar not CLI-discoverable +`graph introspect` surfaces node vocabulary (`--vocabulary`) + ports +(`--node`) but NOT the op-list verbs (`source/add/feed/connect/expose`) or +their JSON shape; `graph build --help` and `project-layout.md` omit them too. +Authored the op-script only via the fieldtest-corpus shape hint. Orthogonal +to this milestone (role 6a shipped cycle 0088); does not block roles 5/6b +(strategy content ids arrive via C25's id interface), but breaks "author from +introspection alone" for the upstream input. → document the op grammar +(filed; docwriter territory with the #197 docs half). + +Counts: working 6 (F1–F6), doc-gap 2 (F7 resolved same-session, F8 filed), +friction 0, spec_gap 0, bugs 0. diff --git a/fieldtests/milestone-research-artifacts/mra_1_strategy_built.json b/fieldtests/milestone-research-artifacts/mra_1_strategy_built.json new file mode 100644 index 0000000..83ba539 --- /dev/null +++ b/fieldtests/milestone-research-artifacts/mra_1_strategy_built.json @@ -0,0 +1 @@ +{"format_version":1,"blueprint":{"name":"graph","nodes":[{"primitive":{"type":"SMA","name":"fast"}},{"primitive":{"type":"SMA","name":"slow"}},{"primitive":{"type":"Sub","name":"sub"}},{"primitive":{"type":"Bias","name":"bias"}}],"edges":[{"from":0,"to":2,"slot":0,"from_field":0},{"from":1,"to":2,"slot":1,"from_field":0},{"from":2,"to":3,"slot":0,"from_field":0}],"input_roles":[{"name":"price","targets":[{"node":0,"slot":0},{"node":1,"slot":0}],"source":"F64"}],"output":[{"node":3,"field":0,"name":"bias"}]}} \ No newline at end of file diff --git a/fieldtests/milestone-research-artifacts/mra_1_strategy_smacross.json b/fieldtests/milestone-research-artifacts/mra_1_strategy_smacross.json new file mode 100644 index 0000000..ccbeb1a --- /dev/null +++ b/fieldtests/milestone-research-artifacts/mra_1_strategy_smacross.json @@ -0,0 +1,12 @@ +[ + {"op": "source", "role": "price", "kind": "F64"}, + {"op": "add", "type": "SMA", "name": "fast"}, + {"op": "add", "type": "SMA", "name": "slow"}, + {"op": "feed", "role": "price", "into": ["fast.series", "slow.series"]}, + {"op": "add", "type": "Sub", "name": "sub"}, + {"op": "connect", "from": "fast.value", "to": "sub.lhs"}, + {"op": "connect", "from": "slow.value", "to": "sub.rhs"}, + {"op": "add", "type": "Bias", "name": "bias"}, + {"op": "connect", "from": "sub.value", "to": "bias.signal"}, + {"op": "expose", "from": "bias.bias", "as": "bias"} +] diff --git a/fieldtests/milestone-research-artifacts/mra_2_process_full_v2.json b/fieldtests/milestone-research-artifacts/mra_2_process_full_v2.json new file mode 100644 index 0000000..b8e56d6 --- /dev/null +++ b/fieldtests/milestone-research-artifacts/mra_2_process_full_v2.json @@ -0,0 +1,13 @@ +{ + "format_version": 1, + "kind": "process", + "name": "mra-full-v2-sweep-gate-wf-mc-generalize", + "description": "Full v2 anti-false-discovery pipeline: deflated SQN sweep, positive-expectancy gate, rolling walk-forward, moving-block R-bootstrap of the pooled OOS series, then cross-instrument worst-case generalization.", + "pipeline": [ + { "block": "std::sweep", "metric": "sqn", "select": "argmax", "deflate": true }, + { "block": "std::gate", "all": [ { "metric": "expectancy_r", "cmp": "gt", "value": 0.0 } ] }, + { "block": "std::walk_forward", "in_sample_ms": 1209600000, "out_of_sample_ms": 604800000, "step_ms": 604800000, "mode": "rolling", "metric": "sqn", "select": "argmax" }, + { "block": "std::monte_carlo", "resamples": 1000, "block_len": 5 }, + { "block": "std::generalize", "metric": "expectancy_r" } + ] +} diff --git a/fieldtests/milestone-research-artifacts/mra_3_campaign_full_v2.json b/fieldtests/milestone-research-artifacts/mra_3_campaign_full_v2.json new file mode 100644 index 0000000..afd8f5a --- /dev/null +++ b/fieldtests/milestone-research-artifacts/mra_3_campaign_full_v2.json @@ -0,0 +1,22 @@ +{ + "format_version": 1, + "kind": "campaign", + "name": "mra-ger40-fra40-smacross-full-v2", + "seed": 42, + "data": { + "instruments": ["GER40", "FRA40"], + "windows": [ { "from_ms": 1725148800000, "to_ms": 1727740800000 } ] + }, + "strategies": [ + { + "ref": { "content_id": "597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a" }, + "axes": { + "fast.length": { "kind": "I64", "values": [2, 4] }, + "slow.length": { "kind": "I64", "values": [8, 16] }, + "bias.scale": { "kind": "F64", "values": [0.5] } + } + } + ], + "process": { "ref": { "content_id": "cd91270ca61ad42f56939231a7803a1d6d7aaa2b70bf79cde9da9284683b86b9" } }, + "presentation": { "persist_taps": ["equity", "r_equity"], "emit": ["family_table", "selection_report"] } +} diff --git a/fieldtests/milestone-research-artifacts/mra_bare.json b/fieldtests/milestone-research-artifacts/mra_bare.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/fieldtests/milestone-research-artifacts/mra_bare.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/fieldtests/milestone-research-artifacts/mra_chart_ger40.html b/fieldtests/milestone-research-artifacts/mra_chart_ger40.html new file mode 100644 index 0000000..1c834dc --- /dev/null +++ b/fieldtests/milestone-research-artifacts/mra_chart_ger40.html @@ -0,0 +1,235 @@ + + + + + +aura chart + + + +
+ aura chart + timestamp-aligned trace series + + +
+
+

+
+
+
+
+
+
diff --git a/fieldtests/milestone-research-artifacts/mra_probe1_campaign_tweaked.json b/fieldtests/milestone-research-artifacts/mra_probe1_campaign_tweaked.json
new file mode 100644
index 0000000..5e21d3a
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mra_probe1_campaign_tweaked.json
@@ -0,0 +1,22 @@
+{
+  "format_version": 1,
+  "kind": "campaign",
+  "name": "mra-ger40-fra40-smacross-full-v2",
+  "seed": 42,
+  "data": {
+    "instruments": ["GER40", "FRA40"],
+    "windows": [ { "from_ms": 1725148800000, "to_ms": 1727740800000 } ]
+  },
+  "strategies": [
+    {
+      "ref": { "content_id": "597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a" },
+      "axes": {
+        "fast.length": { "kind": "I64", "values": [2, 4] },
+        "slow.length": { "kind": "I64", "values": [8, 32] },
+        "bias.scale": { "kind": "F64", "values": [0.5] }
+      }
+    }
+  ],
+  "process": { "ref": { "content_id": "cd91270ca61ad42f56939231a7803a1d6d7aaa2b70bf79cde9da9284683b86b9" } },
+  "presentation": { "persist_taps": ["equity", "r_equity"], "emit": ["family_table", "selection_report"] }
+}
diff --git a/fieldtests/milestone-research-artifacts/mra_probe2_campaign_badref.json b/fieldtests/milestone-research-artifacts/mra_probe2_campaign_badref.json
new file mode 100644
index 0000000..c763ba6
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mra_probe2_campaign_badref.json
@@ -0,0 +1,22 @@
+{
+  "format_version": 1,
+  "kind": "campaign",
+  "name": "mra-ger40-fra40-smacross-full-v2",
+  "seed": 42,
+  "data": {
+    "instruments": ["GER40", "FRA40"],
+    "windows": [ { "from_ms": 1725148800000, "to_ms": 1727740800000 } ]
+  },
+  "strategies": [
+    {
+      "ref": { "content_id": "597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a" },
+      "axes": {
+        "fast.length": { "kind": "I64", "values": [2, 4] },
+        "slow.length": { "kind": "I64", "values": [8, 16] },
+        "bias.scale": { "kind": "F64", "values": [0.5] }
+      }
+    }
+  ],
+  "process": { "ref": { "content_id": "0000000000000000000000000000000000000000000000000000000000000000" } },
+  "presentation": { "persist_taps": ["equity", "r_equity"], "emit": ["family_table", "selection_report"] }
+}
diff --git a/fieldtests/milestone-research-artifacts/mra_probe3_campaign_badtap.json b/fieldtests/milestone-research-artifacts/mra_probe3_campaign_badtap.json
new file mode 100644
index 0000000..fb39643
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mra_probe3_campaign_badtap.json
@@ -0,0 +1,22 @@
+{
+  "format_version": 1,
+  "kind": "campaign",
+  "name": "mra-ger40-fra40-smacross-full-v2",
+  "seed": 42,
+  "data": {
+    "instruments": ["GER40", "FRA40"],
+    "windows": [ { "from_ms": 1725148800000, "to_ms": 1727740800000 } ]
+  },
+  "strategies": [
+    {
+      "ref": { "content_id": "597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a" },
+      "axes": {
+        "fast.length": { "kind": "I64", "values": [2, 4] },
+        "slow.length": { "kind": "I64", "values": [8, 16] },
+        "bias.scale": { "kind": "F64", "values": [0.5] }
+      }
+    }
+  ],
+  "process": { "ref": { "content_id": "cd91270ca61ad42f56939231a7803a1d6d7aaa2b70bf79cde9da9284683b86b9" } },
+  "presentation": { "persist_taps": ["equity", "pnl"], "emit": ["family_table", "selection_report"] }
+}
diff --git a/fieldtests/milestone-research-artifacts/mra_realization_campaign_runs.jsonl b/fieldtests/milestone-research-artifacts/mra_realization_campaign_runs.jsonl
new file mode 100644
index 0000000..a841dba
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mra_realization_campaign_runs.jsonl
@@ -0,0 +1,2 @@
+{"campaign":"42edebd2159de708009ba21e1ed4aea2cffabc373bf761c5765f79c190b677bd","process":"cd91270ca61ad42f56939231a7803a1d6d7aaa2b70bf79cde9da9284683b86b9","run":0,"seed":42,"cells":[{"strategy":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","instrument":"GER40","window_ms":[1725148800000,1727740800000],"stages":[{"block":"std::sweep","family_id":"42edebd2-0-GER40-w0-s0-0","selection":{"winner_ordinal":0,"params":[["bias.scale",{"F64":0.5}],["fast.length",{"I64":2}],["slow.length",{"I64":8}]],"selection":{"selection_metric":"sqn","n_trials":4,"raw_winner_metric":1.0540214890316064,"mode":"Argmax","deflated_score":-1.0290009962190139,"overfit_probability":0.3876123876123876,"n_resamples":1000,"block_len":5,"seed":42}}},{"block":"std::gate","survivor_ordinals":[0,1,2]},{"block":"std::walk_forward","family_id":"42edebd2-0-GER40-w0-s2-0"},{"block":"std::monte_carlo","bootstrap":{"pooled_oos":{"e_r":{"mean":0.02572811864069487,"p5":-0.045358717986233116,"p25":-0.003867370198210889,"p50":0.025041122400765753,"p75":0.054149001087649175,"p95":0.09609753891677572},"prob_le_zero":0.274,"n_trades":1843,"block_len":5,"n_resamples":1000}}}]},{"strategy":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","instrument":"FRA40","window_ms":[1725148800000,1727740800000],"stages":[{"block":"std::sweep","family_id":"42edebd2-0-FRA40-w0-s0-0","selection":{"winner_ordinal":2,"params":[["bias.scale",{"F64":0.5}],["fast.length",{"I64":4}],["slow.length",{"I64":8}]],"selection":{"selection_metric":"sqn","n_trials":4,"raw_winner_metric":2.1027529408673753,"mode":"Argmax","deflated_score":-0.25026485410828503,"overfit_probability":0.08491508491508491,"n_resamples":1000,"block_len":5,"seed":42}}},{"block":"std::gate","survivor_ordinals":[0,1,2]},{"block":"std::walk_forward","family_id":"42edebd2-0-FRA40-w0-s2-0"},{"block":"std::monte_carlo","bootstrap":{"pooled_oos":{"e_r":{"mean":0.013305753279586063,"p5":-0.09686234697635485,"p25":-0.02935938855824511,"p50":0.014375417056209604,"p75":0.0572151928623397,"p95":0.11740134416304716},"prob_le_zero":0.412,"n_trades":1272,"block_len":5,"n_resamples":1000}}}]}],"generalizations":[{"strategy_ordinal":0,"window_ordinal":0,"generalization":{"selection_metric":"expectancy_r","n_instruments":2,"worst_case":0.04367535583327283,"sign_agreement":2,"per_instrument":[["GER40",0.04367535583327283],["FRA40",0.048403786424396446]]},"winners":[["GER40",[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]]],["FRA40",[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]]]]}],"trace_name":"42edebd2-0"}
+{"campaign":"42edebd2159de708009ba21e1ed4aea2cffabc373bf761c5765f79c190b677bd","process":"cd91270ca61ad42f56939231a7803a1d6d7aaa2b70bf79cde9da9284683b86b9","run":1,"seed":42,"cells":[{"strategy":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","instrument":"GER40","window_ms":[1725148800000,1727740800000],"stages":[{"block":"std::sweep","family_id":"42edebd2-0-GER40-w0-s0-1","selection":{"winner_ordinal":0,"params":[["bias.scale",{"F64":0.5}],["fast.length",{"I64":2}],["slow.length",{"I64":8}]],"selection":{"selection_metric":"sqn","n_trials":4,"raw_winner_metric":1.0540214890316064,"mode":"Argmax","deflated_score":-1.0290009962190139,"overfit_probability":0.3876123876123876,"n_resamples":1000,"block_len":5,"seed":42}}},{"block":"std::gate","survivor_ordinals":[0,1,2]},{"block":"std::walk_forward","family_id":"42edebd2-0-GER40-w0-s2-1"},{"block":"std::monte_carlo","bootstrap":{"pooled_oos":{"e_r":{"mean":0.02572811864069487,"p5":-0.045358717986233116,"p25":-0.003867370198210889,"p50":0.025041122400765753,"p75":0.054149001087649175,"p95":0.09609753891677572},"prob_le_zero":0.274,"n_trades":1843,"block_len":5,"n_resamples":1000}}}]},{"strategy":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","instrument":"FRA40","window_ms":[1725148800000,1727740800000],"stages":[{"block":"std::sweep","family_id":"42edebd2-0-FRA40-w0-s0-1","selection":{"winner_ordinal":2,"params":[["bias.scale",{"F64":0.5}],["fast.length",{"I64":4}],["slow.length",{"I64":8}]],"selection":{"selection_metric":"sqn","n_trials":4,"raw_winner_metric":2.1027529408673753,"mode":"Argmax","deflated_score":-0.25026485410828503,"overfit_probability":0.08491508491508491,"n_resamples":1000,"block_len":5,"seed":42}}},{"block":"std::gate","survivor_ordinals":[0,1,2]},{"block":"std::walk_forward","family_id":"42edebd2-0-FRA40-w0-s2-1"},{"block":"std::monte_carlo","bootstrap":{"pooled_oos":{"e_r":{"mean":0.013305753279586063,"p5":-0.09686234697635485,"p25":-0.02935938855824511,"p50":0.014375417056209604,"p75":0.0572151928623397,"p95":0.11740134416304716},"prob_le_zero":0.412,"n_trades":1272,"block_len":5,"n_resamples":1000}}}]}],"generalizations":[{"strategy_ordinal":0,"window_ordinal":0,"generalization":{"selection_metric":"expectancy_r","n_instruments":2,"worst_case":0.04367535583327283,"sign_agreement":2,"per_instrument":[["GER40",0.04367535583327283],["FRA40",0.048403786424396446]]},"winners":[["GER40",[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]]],["FRA40",[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]]]]}],"trace_name":"42edebd2-1"}
diff --git a/fieldtests/milestone-research-artifacts/mra_run1_stderr.txt b/fieldtests/milestone-research-artifacts/mra_run1_stderr.txt
new file mode 100644
index 0000000..9e83779
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mra_run1_stderr.txt
@@ -0,0 +1 @@
+aura: traces persisted: 42edebd2-0 (2 tap(s) x 2 cell(s))
diff --git a/fieldtests/milestone-research-artifacts/mra_run1_stdout.txt b/fieldtests/milestone-research-artifacts/mra_run1_stdout.txt
new file mode 100644
index 0000000..4f9f2ab
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mra_run1_stdout.txt
@@ -0,0 +1,15 @@
+{"family_id":"42edebd2-0-GER40-w0-s0-0","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":2}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"GER40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":13117250.0000001,"max_drawdown":6156000.00000006,"bias_sign_flips":3977,"r":{"expectancy_r":0.028321444460569407,"n_trades":3903,"win_rate":0.33692031770433,"avg_win_r":1.5089377461851683,"avg_loss_r":-0.7240009808747663,"profit_factor":1.0589943641136834,"max_r_drawdown":78.64539272099334,"n_open_at_end":1,"sqn":1.0540214890316064,"sqn_normalized":0.16871363772287948,"net_expectancy_r":0.028321444460569407,"conviction_terciles_r":[-0.05124882989934285,0.06705254021274346,0.0691606230683076]}}}}
+{"family_id":"42edebd2-0-GER40-w0-s0-0","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":2}],["graph.slow.length",{"I64":16}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"GER40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":358625.0000013883,"max_drawdown":6570250.000000078,"bias_sign_flips":2550,"r":{"expectancy_r":0.001942726488289421,"n_trades":2581,"win_rate":0.2909724912824487,"avg_win_r":1.9096186007126963,"avg_loss_r":-0.7809340940267545,"profit_factor":1.0035086026962674,"max_r_drawdown":72.50403168697483,"n_open_at_end":1,"sqn":0.05152717930726507,"sqn_normalized":0.010142438121122548,"net_expectancy_r":0.001942726488289421,"conviction_terciles_r":[0.003799692660105443,-0.03634478563974999,0.0383309605444476]}}}}
+{"family_id":"42edebd2-0-GER40-w0-s0-0","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"GER40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":7427500.00000102,"max_drawdown":4223625.000000085,"bias_sign_flips":3570,"r":{"expectancy_r":0.025765945651374078,"n_trades":3811,"win_rate":0.358960902650223,"avg_win_r":1.508960221588393,"avg_loss_r":-0.8047742792695608,"profit_factor":1.0499444782267588,"max_r_drawdown":90.38863380823058,"n_open_at_end":1,"sqn":0.8490217221109733,"sqn_normalized":0.1375305967356901,"net_expectancy_r":0.025765945651374078,"conviction_terciles_r":[0.016131381474867954,-0.0014331659738562395,0.06257064137773533]}}}}
+{"family_id":"42edebd2-0-GER40-w0-s0-0","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":16}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"GER40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":-700187.4999997262,"max_drawdown":9144874.999999981,"bias_sign_flips":1965,"r":{"expectancy_r":-0.021911292659493667,"n_trades":2388,"win_rate":0.3274706867671692,"avg_win_r":1.76727288256566,"avg_loss_r":-0.8931080703843195,"profit_factor":0.9635201732345389,"max_r_drawdown":132.7156533736896,"n_open_at_end":1,"sqn":-0.5448524993019401,"sqn_normalized":-0.11149664160230002,"net_expectancy_r":-0.021911292659493667,"conviction_terciles_r":[-0.0043670430492390765,-0.0543615931213561,-0.007005241807885511]}}}}
+{"family_id":"42edebd2-0-GER40-w0-s2-0","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":2}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1726358400000000000,1726963199999000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","selection":{"selection_metric":"sqn","n_trials":3,"raw_winner_metric":1.2525827059630634,"mode":"Argmax","deflated_score":-0.9114506657085979,"overfit_probability":0.3086913086913087,"n_resamples":1000,"block_len":5,"seed":42},"instrument":"GER40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":-2671375.000000078,"max_drawdown":5680625.000000145,"bias_sign_flips":964,"r":{"expectancy_r":0.005758622144586189,"n_trades":948,"win_rate":0.310126582278481,"avg_win_r":1.655446626472683,"avg_loss_r":-0.7358442421863931,"profit_factor":1.0113439231583259,"max_r_drawdown":77.80119014468967,"n_open_at_end":1,"sqn":0.0892283296665764,"sqn_normalized":0.028980014237749655,"net_expectancy_r":0.005758622144586189,"conviction_terciles_r":[0.03078221446840116,-0.13067653604467921,0.1171701880100367]}}}}
+{"family_id":"42edebd2-0-GER40-w0-s2-0","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1726963200000000000,1727567999999000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","selection":{"selection_metric":"sqn","n_trials":3,"raw_winner_metric":1.2953203025774422,"mode":"Argmax","deflated_score":-0.686644047115786,"overfit_probability":0.22977022977022976,"n_resamples":1000,"block_len":5,"seed":42},"instrument":"GER40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":1411000.0000000175,"max_drawdown":2021375.0000000114,"bias_sign_flips":852,"r":{"expectancy_r":0.04367535583327283,"n_trades":895,"win_rate":0.36089385474860336,"avg_win_r":1.442019963427087,"avg_loss_r":-0.7459493089443524,"profit_factor":1.0916123750857663,"max_r_drawdown":31.811394008723603,"n_open_at_end":1,"sqn":0.7810963645657824,"sqn_normalized":0.26109171973841766,"net_expectancy_r":0.04367535583327283,"conviction_terciles_r":[0.016139456567046833,0.1004939582171051,0.014490588177598856]}}}}
+{"selection_report":{"family_id":"42edebd2-0-GER40-w0-s0-0","stage":0,"block":"std::sweep","winner_ordinal":0,"params":[["bias.scale",{"F64":0.5}],["fast.length",{"I64":2}],["slow.length",{"I64":8}]],"selection":{"selection_metric":"sqn","n_trials":4,"raw_winner_metric":1.0540214890316064,"mode":"Argmax","deflated_score":-1.0290009962190139,"overfit_probability":0.3876123876123876,"n_resamples":1000,"block_len":5,"seed":42}}}
+{"family_id":"42edebd2-0-FRA40-w0-s0-0","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":2}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"FRA40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":9011500.000000523,"max_drawdown":2256874.99999992,"bias_sign_flips":2600,"r":{"expectancy_r":0.06848977082170854,"n_trades":2598,"win_rate":0.3672055427251732,"avg_win_r":1.5851269293911563,"avg_loss_r":-0.8116025949174954,"profit_factor":1.1333581676419873,"max_r_drawdown":113.43637240562812,"n_open_at_end":1,"sqn":1.6096239575111717,"sqn_normalized":0.3157947124442909,"net_expectancy_r":0.06848977082170854,"conviction_terciles_r":[0.06254350002600088,0.04400160398370689,0.09892420845541809]}}}}
+{"family_id":"42edebd2-0-FRA40-w0-s0-0","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":2}],["graph.slow.length",{"I64":16}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"FRA40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":4874024.999999512,"max_drawdown":1828525.0000001895,"bias_sign_flips":1734,"r":{"expectancy_r":0.012633910991027422,"n_trades":1764,"win_rate":0.3163265306122449,"avg_win_r":1.9660034426361068,"avg_loss_r":-0.891163932008935,"profit_factor":1.02073631038418,"max_r_drawdown":127.56571960156333,"n_open_at_end":1,"sqn":0.1805352564960793,"sqn_normalized":0.04298458488001888,"net_expectancy_r":0.012633910991027422,"conviction_terciles_r":[-0.05122435364587141,0.005056510877614854,0.0840695757413386]}}}}
+{"family_id":"42edebd2-0-FRA40-w0-s0-0","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"FRA40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":8785849.999999577,"max_drawdown":2055075.0000003316,"bias_sign_flips":2323,"r":{"expectancy_r":0.09120457579140544,"n_trades":2527,"win_rate":0.3850415512465374,"avg_win_r":1.6346237585154926,"avg_loss_r":-0.8751704980763805,"profit_factor":1.169464285922158,"max_r_drawdown":89.88964388296372,"n_open_at_end":1,"sqn":2.1027529408673753,"sqn_normalized":0.4182978458755474,"net_expectancy_r":0.09120457579140544,"conviction_terciles_r":[0.10541266530037846,0.051347405582177874,0.11682323053590576]}}}}
+{"family_id":"42edebd2-0-FRA40-w0-s0-0","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":16}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"FRA40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":4061324.9999994994,"max_drawdown":1863250.0000001749,"bias_sign_flips":1388,"r":{"expectancy_r":-0.018755910436808243,"n_trades":1665,"win_rate":0.3429429429429429,"avg_win_r":1.8447093825081005,"avg_loss_r":-0.9913689655296274,"profit_factor":0.9712061494135039,"max_r_drawdown":102.1145398453396,"n_open_at_end":1,"sqn":-0.30292209491863514,"sqn_normalized":-0.0742375845131563,"net_expectancy_r":-0.018755910436808243,"conviction_terciles_r":[-0.24161321766097607,-0.03185355967084881,0.21719904602140036]}}}}
+{"family_id":"42edebd2-0-FRA40-w0-s2-0","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":2}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1726358400000000000,1726963199999000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","selection":{"selection_metric":"sqn","n_trials":3,"raw_winner_metric":2.632639545000805,"mode":"Argmax","deflated_score":0.6416650665274515,"overfit_probability":0.011988011988011988,"n_resamples":1000,"block_len":5,"seed":42},"instrument":"FRA40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":200650.00000037864,"max_drawdown":1165800.000000123,"bias_sign_flips":650,"r":{"expectancy_r":-0.022520683530951865,"n_trades":656,"win_rate":0.3490853658536585,"avg_win_r":1.4115482009182443,"avg_loss_r":-0.791611490413543,"profit_factor":0.9562935590836824,"max_r_drawdown":57.55698063941928,"n_open_at_end":1,"sqn":-0.30795082586578854,"sqn_normalized":-0.12023459738040812,"net_expectancy_r":-0.022520683530951865,"conviction_terciles_r":[-0.09571003331162321,0.09707913620766383,-0.06926535143310024]}}}}
+{"family_id":"42edebd2-0-FRA40-w0-s2-0","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1726963200000000000,1727567999999000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","selection":{"selection_metric":"sqn","n_trials":3,"raw_winner_metric":1.9751748199764239,"mode":"Argmax","deflated_score":-0.019423194317684134,"overfit_probability":0.053946053946053944,"n_resamples":1000,"block_len":5,"seed":42},"instrument":"FRA40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":1124449.999999984,"max_drawdown":2055075.0000003225,"bias_sign_flips":569,"r":{"expectancy_r":0.048403786424396446,"n_trades":616,"win_rate":0.3847402597402597,"avg_win_r":1.5985540013052624,"avg_loss_r":-0.9209513611396272,"profit_factor":1.0854248341104564,"max_r_drawdown":89.88964388296372,"n_open_at_end":1,"sqn":0.46583912259170446,"sqn_normalized":0.1876919312629149,"net_expectancy_r":0.048403786424396446,"conviction_terciles_r":[0.2751004399586205,-0.08090144199044479,-0.04851486478663962]}}}}
+{"selection_report":{"family_id":"42edebd2-0-FRA40-w0-s0-0","stage":0,"block":"std::sweep","winner_ordinal":2,"params":[["bias.scale",{"F64":0.5}],["fast.length",{"I64":4}],["slow.length",{"I64":8}]],"selection":{"selection_metric":"sqn","n_trials":4,"raw_winner_metric":2.1027529408673753,"mode":"Argmax","deflated_score":-0.25026485410828503,"overfit_probability":0.08491508491508491,"n_resamples":1000,"block_len":5,"seed":42}}}
+{"campaign_run":{"campaign":"42edebd2159de708009ba21e1ed4aea2cffabc373bf761c5765f79c190b677bd","process":"cd91270ca61ad42f56939231a7803a1d6d7aaa2b70bf79cde9da9284683b86b9","run":0,"seed":42,"cells":[{"strategy":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","instrument":"GER40","window_ms":[1725148800000,1727740800000],"stages":[{"block":"std::sweep","family_id":"42edebd2-0-GER40-w0-s0-0","selection":{"winner_ordinal":0,"params":[["bias.scale",{"F64":0.5}],["fast.length",{"I64":2}],["slow.length",{"I64":8}]],"selection":{"selection_metric":"sqn","n_trials":4,"raw_winner_metric":1.0540214890316064,"mode":"Argmax","deflated_score":-1.0290009962190139,"overfit_probability":0.3876123876123876,"n_resamples":1000,"block_len":5,"seed":42}}},{"block":"std::gate","survivor_ordinals":[0,1,2]},{"block":"std::walk_forward","family_id":"42edebd2-0-GER40-w0-s2-0"},{"block":"std::monte_carlo","bootstrap":{"pooled_oos":{"e_r":{"mean":0.02572811864069487,"p5":-0.045358717986233116,"p25":-0.003867370198210889,"p50":0.025041122400765753,"p75":0.054149001087649175,"p95":0.09609753891677572},"prob_le_zero":0.274,"n_trades":1843,"block_len":5,"n_resamples":1000}}}]},{"strategy":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","instrument":"FRA40","window_ms":[1725148800000,1727740800000],"stages":[{"block":"std::sweep","family_id":"42edebd2-0-FRA40-w0-s0-0","selection":{"winner_ordinal":2,"params":[["bias.scale",{"F64":0.5}],["fast.length",{"I64":4}],["slow.length",{"I64":8}]],"selection":{"selection_metric":"sqn","n_trials":4,"raw_winner_metric":2.1027529408673753,"mode":"Argmax","deflated_score":-0.25026485410828503,"overfit_probability":0.08491508491508491,"n_resamples":1000,"block_len":5,"seed":42}}},{"block":"std::gate","survivor_ordinals":[0,1,2]},{"block":"std::walk_forward","family_id":"42edebd2-0-FRA40-w0-s2-0"},{"block":"std::monte_carlo","bootstrap":{"pooled_oos":{"e_r":{"mean":0.013305753279586063,"p5":-0.09686234697635485,"p25":-0.02935938855824511,"p50":0.014375417056209604,"p75":0.0572151928623397,"p95":0.11740134416304716},"prob_le_zero":0.412,"n_trades":1272,"block_len":5,"n_resamples":1000}}}]}],"generalizations":[{"strategy_ordinal":0,"window_ordinal":0,"generalization":{"selection_metric":"expectancy_r","n_instruments":2,"worst_case":0.04367535583327283,"sign_agreement":2,"per_instrument":[["GER40",0.04367535583327283],["FRA40",0.048403786424396446]]},"winners":[["GER40",[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]]],["FRA40",[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]]]]}],"trace_name":"42edebd2-0"}}
diff --git a/fieldtests/milestone-research-artifacts/mra_run2_stderr.txt b/fieldtests/milestone-research-artifacts/mra_run2_stderr.txt
new file mode 100644
index 0000000..ad68143
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mra_run2_stderr.txt
@@ -0,0 +1 @@
+aura: traces persisted: 42edebd2-1 (2 tap(s) x 2 cell(s))
diff --git a/fieldtests/milestone-research-artifacts/mra_run2_stdout.txt b/fieldtests/milestone-research-artifacts/mra_run2_stdout.txt
new file mode 100644
index 0000000..9b92041
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mra_run2_stdout.txt
@@ -0,0 +1,15 @@
+{"family_id":"42edebd2-0-GER40-w0-s0-1","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":2}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"GER40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":13117250.0000001,"max_drawdown":6156000.00000006,"bias_sign_flips":3977,"r":{"expectancy_r":0.028321444460569407,"n_trades":3903,"win_rate":0.33692031770433,"avg_win_r":1.5089377461851683,"avg_loss_r":-0.7240009808747663,"profit_factor":1.0589943641136834,"max_r_drawdown":78.64539272099334,"n_open_at_end":1,"sqn":1.0540214890316064,"sqn_normalized":0.16871363772287948,"net_expectancy_r":0.028321444460569407,"conviction_terciles_r":[-0.05124882989934285,0.06705254021274346,0.0691606230683076]}}}}
+{"family_id":"42edebd2-0-GER40-w0-s0-1","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":2}],["graph.slow.length",{"I64":16}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"GER40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":358625.0000013883,"max_drawdown":6570250.000000078,"bias_sign_flips":2550,"r":{"expectancy_r":0.001942726488289421,"n_trades":2581,"win_rate":0.2909724912824487,"avg_win_r":1.9096186007126963,"avg_loss_r":-0.7809340940267545,"profit_factor":1.0035086026962674,"max_r_drawdown":72.50403168697483,"n_open_at_end":1,"sqn":0.05152717930726507,"sqn_normalized":0.010142438121122548,"net_expectancy_r":0.001942726488289421,"conviction_terciles_r":[0.003799692660105443,-0.03634478563974999,0.0383309605444476]}}}}
+{"family_id":"42edebd2-0-GER40-w0-s0-1","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"GER40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":7427500.00000102,"max_drawdown":4223625.000000085,"bias_sign_flips":3570,"r":{"expectancy_r":0.025765945651374078,"n_trades":3811,"win_rate":0.358960902650223,"avg_win_r":1.508960221588393,"avg_loss_r":-0.8047742792695608,"profit_factor":1.0499444782267588,"max_r_drawdown":90.38863380823058,"n_open_at_end":1,"sqn":0.8490217221109733,"sqn_normalized":0.1375305967356901,"net_expectancy_r":0.025765945651374078,"conviction_terciles_r":[0.016131381474867954,-0.0014331659738562395,0.06257064137773533]}}}}
+{"family_id":"42edebd2-0-GER40-w0-s0-1","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":16}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"GER40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":-700187.4999997262,"max_drawdown":9144874.999999981,"bias_sign_flips":1965,"r":{"expectancy_r":-0.021911292659493667,"n_trades":2388,"win_rate":0.3274706867671692,"avg_win_r":1.76727288256566,"avg_loss_r":-0.8931080703843195,"profit_factor":0.9635201732345389,"max_r_drawdown":132.7156533736896,"n_open_at_end":1,"sqn":-0.5448524993019401,"sqn_normalized":-0.11149664160230002,"net_expectancy_r":-0.021911292659493667,"conviction_terciles_r":[-0.0043670430492390765,-0.0543615931213561,-0.007005241807885511]}}}}
+{"family_id":"42edebd2-0-GER40-w0-s2-1","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":2}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1726358400000000000,1726963199999000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","selection":{"selection_metric":"sqn","n_trials":3,"raw_winner_metric":1.2525827059630634,"mode":"Argmax","deflated_score":-0.9114506657085979,"overfit_probability":0.3086913086913087,"n_resamples":1000,"block_len":5,"seed":42},"instrument":"GER40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":-2671375.000000078,"max_drawdown":5680625.000000145,"bias_sign_flips":964,"r":{"expectancy_r":0.005758622144586189,"n_trades":948,"win_rate":0.310126582278481,"avg_win_r":1.655446626472683,"avg_loss_r":-0.7358442421863931,"profit_factor":1.0113439231583259,"max_r_drawdown":77.80119014468967,"n_open_at_end":1,"sqn":0.0892283296665764,"sqn_normalized":0.028980014237749655,"net_expectancy_r":0.005758622144586189,"conviction_terciles_r":[0.03078221446840116,-0.13067653604467921,0.1171701880100367]}}}}
+{"family_id":"42edebd2-0-GER40-w0-s2-1","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1726963200000000000,1727567999999000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","selection":{"selection_metric":"sqn","n_trials":3,"raw_winner_metric":1.2953203025774422,"mode":"Argmax","deflated_score":-0.686644047115786,"overfit_probability":0.22977022977022976,"n_resamples":1000,"block_len":5,"seed":42},"instrument":"GER40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":1411000.0000000175,"max_drawdown":2021375.0000000114,"bias_sign_flips":852,"r":{"expectancy_r":0.04367535583327283,"n_trades":895,"win_rate":0.36089385474860336,"avg_win_r":1.442019963427087,"avg_loss_r":-0.7459493089443524,"profit_factor":1.0916123750857663,"max_r_drawdown":31.811394008723603,"n_open_at_end":1,"sqn":0.7810963645657824,"sqn_normalized":0.26109171973841766,"net_expectancy_r":0.04367535583327283,"conviction_terciles_r":[0.016139456567046833,0.1004939582171051,0.014490588177598856]}}}}
+{"selection_report":{"family_id":"42edebd2-0-GER40-w0-s0-1","stage":0,"block":"std::sweep","winner_ordinal":0,"params":[["bias.scale",{"F64":0.5}],["fast.length",{"I64":2}],["slow.length",{"I64":8}]],"selection":{"selection_metric":"sqn","n_trials":4,"raw_winner_metric":1.0540214890316064,"mode":"Argmax","deflated_score":-1.0290009962190139,"overfit_probability":0.3876123876123876,"n_resamples":1000,"block_len":5,"seed":42}}}
+{"family_id":"42edebd2-0-FRA40-w0-s0-1","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":2}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"FRA40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":9011500.000000523,"max_drawdown":2256874.99999992,"bias_sign_flips":2600,"r":{"expectancy_r":0.06848977082170854,"n_trades":2598,"win_rate":0.3672055427251732,"avg_win_r":1.5851269293911563,"avg_loss_r":-0.8116025949174954,"profit_factor":1.1333581676419873,"max_r_drawdown":113.43637240562812,"n_open_at_end":1,"sqn":1.6096239575111717,"sqn_normalized":0.3157947124442909,"net_expectancy_r":0.06848977082170854,"conviction_terciles_r":[0.06254350002600088,0.04400160398370689,0.09892420845541809]}}}}
+{"family_id":"42edebd2-0-FRA40-w0-s0-1","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":2}],["graph.slow.length",{"I64":16}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"FRA40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":4874024.999999512,"max_drawdown":1828525.0000001895,"bias_sign_flips":1734,"r":{"expectancy_r":0.012633910991027422,"n_trades":1764,"win_rate":0.3163265306122449,"avg_win_r":1.9660034426361068,"avg_loss_r":-0.891163932008935,"profit_factor":1.02073631038418,"max_r_drawdown":127.56571960156333,"n_open_at_end":1,"sqn":0.1805352564960793,"sqn_normalized":0.04298458488001888,"net_expectancy_r":0.012633910991027422,"conviction_terciles_r":[-0.05122435364587141,0.005056510877614854,0.0840695757413386]}}}}
+{"family_id":"42edebd2-0-FRA40-w0-s0-1","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"FRA40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":8785849.999999577,"max_drawdown":2055075.0000003316,"bias_sign_flips":2323,"r":{"expectancy_r":0.09120457579140544,"n_trades":2527,"win_rate":0.3850415512465374,"avg_win_r":1.6346237585154926,"avg_loss_r":-0.8751704980763805,"profit_factor":1.169464285922158,"max_r_drawdown":89.88964388296372,"n_open_at_end":1,"sqn":2.1027529408673753,"sqn_normalized":0.4182978458755474,"net_expectancy_r":0.09120457579140544,"conviction_terciles_r":[0.10541266530037846,0.051347405582177874,0.11682323053590576]}}}}
+{"family_id":"42edebd2-0-FRA40-w0-s0-1","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":16}],["graph.bias.scale",{"F64":0.5}]],"window":[1725148800000000000,1727740800000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","instrument":"FRA40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":4061324.9999994994,"max_drawdown":1863250.0000001749,"bias_sign_flips":1388,"r":{"expectancy_r":-0.018755910436808243,"n_trades":1665,"win_rate":0.3429429429429429,"avg_win_r":1.8447093825081005,"avg_loss_r":-0.9913689655296274,"profit_factor":0.9712061494135039,"max_r_drawdown":102.1145398453396,"n_open_at_end":1,"sqn":-0.30292209491863514,"sqn_normalized":-0.0742375845131563,"net_expectancy_r":-0.018755910436808243,"conviction_terciles_r":[-0.24161321766097607,-0.03185355967084881,0.21719904602140036]}}}}
+{"family_id":"42edebd2-0-FRA40-w0-s2-1","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":2}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1726358400000000000,1726963199999000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","selection":{"selection_metric":"sqn","n_trials":3,"raw_winner_metric":2.632639545000805,"mode":"Argmax","deflated_score":0.6416650665274515,"overfit_probability":0.011988011988011988,"n_resamples":1000,"block_len":5,"seed":42},"instrument":"FRA40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":200650.00000037864,"max_drawdown":1165800.000000123,"bias_sign_flips":650,"r":{"expectancy_r":-0.022520683530951865,"n_trades":656,"win_rate":0.3490853658536585,"avg_win_r":1.4115482009182443,"avg_loss_r":-0.791611490413543,"profit_factor":0.9562935590836824,"max_r_drawdown":57.55698063941928,"n_open_at_end":1,"sqn":-0.30795082586578854,"sqn_normalized":-0.12023459738040812,"net_expectancy_r":-0.022520683530951865,"conviction_terciles_r":[-0.09571003331162321,0.09707913620766383,-0.06926535143310024]}}}}
+{"family_id":"42edebd2-0-FRA40-w0-s2-1","report":{"manifest":{"commit":"01925e061938d74a28d3727617fb6e62c1a9c50e","params":[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]],"window":[1726963200000000000,1727567999999000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","selection":{"selection_metric":"sqn","n_trials":3,"raw_winner_metric":1.9751748199764239,"mode":"Argmax","deflated_score":-0.019423194317684134,"overfit_probability":0.053946053946053944,"n_resamples":1000,"block_len":5,"seed":42},"instrument":"FRA40","topology_hash":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","project":{"namespace":"mrp_lab","dylib_sha256":"72b1f661bcca3a00553c38f420f5c1508fec630fdaa3183462a1a986fd399d70","commit":"01925e061938d74a28d3727617fb6e62c1a9c50e-dirty"}},"metrics":{"total_pips":1124449.999999984,"max_drawdown":2055075.0000003225,"bias_sign_flips":569,"r":{"expectancy_r":0.048403786424396446,"n_trades":616,"win_rate":0.3847402597402597,"avg_win_r":1.5985540013052624,"avg_loss_r":-0.9209513611396272,"profit_factor":1.0854248341104564,"max_r_drawdown":89.88964388296372,"n_open_at_end":1,"sqn":0.46583912259170446,"sqn_normalized":0.1876919312629149,"net_expectancy_r":0.048403786424396446,"conviction_terciles_r":[0.2751004399586205,-0.08090144199044479,-0.04851486478663962]}}}}
+{"selection_report":{"family_id":"42edebd2-0-FRA40-w0-s0-1","stage":0,"block":"std::sweep","winner_ordinal":2,"params":[["bias.scale",{"F64":0.5}],["fast.length",{"I64":4}],["slow.length",{"I64":8}]],"selection":{"selection_metric":"sqn","n_trials":4,"raw_winner_metric":2.1027529408673753,"mode":"Argmax","deflated_score":-0.25026485410828503,"overfit_probability":0.08491508491508491,"n_resamples":1000,"block_len":5,"seed":42}}}
+{"campaign_run":{"campaign":"42edebd2159de708009ba21e1ed4aea2cffabc373bf761c5765f79c190b677bd","process":"cd91270ca61ad42f56939231a7803a1d6d7aaa2b70bf79cde9da9284683b86b9","run":1,"seed":42,"cells":[{"strategy":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","instrument":"GER40","window_ms":[1725148800000,1727740800000],"stages":[{"block":"std::sweep","family_id":"42edebd2-0-GER40-w0-s0-1","selection":{"winner_ordinal":0,"params":[["bias.scale",{"F64":0.5}],["fast.length",{"I64":2}],["slow.length",{"I64":8}]],"selection":{"selection_metric":"sqn","n_trials":4,"raw_winner_metric":1.0540214890316064,"mode":"Argmax","deflated_score":-1.0290009962190139,"overfit_probability":0.3876123876123876,"n_resamples":1000,"block_len":5,"seed":42}}},{"block":"std::gate","survivor_ordinals":[0,1,2]},{"block":"std::walk_forward","family_id":"42edebd2-0-GER40-w0-s2-1"},{"block":"std::monte_carlo","bootstrap":{"pooled_oos":{"e_r":{"mean":0.02572811864069487,"p5":-0.045358717986233116,"p25":-0.003867370198210889,"p50":0.025041122400765753,"p75":0.054149001087649175,"p95":0.09609753891677572},"prob_le_zero":0.274,"n_trades":1843,"block_len":5,"n_resamples":1000}}}]},{"strategy":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","instrument":"FRA40","window_ms":[1725148800000,1727740800000],"stages":[{"block":"std::sweep","family_id":"42edebd2-0-FRA40-w0-s0-1","selection":{"winner_ordinal":2,"params":[["bias.scale",{"F64":0.5}],["fast.length",{"I64":4}],["slow.length",{"I64":8}]],"selection":{"selection_metric":"sqn","n_trials":4,"raw_winner_metric":2.1027529408673753,"mode":"Argmax","deflated_score":-0.25026485410828503,"overfit_probability":0.08491508491508491,"n_resamples":1000,"block_len":5,"seed":42}}},{"block":"std::gate","survivor_ordinals":[0,1,2]},{"block":"std::walk_forward","family_id":"42edebd2-0-FRA40-w0-s2-1"},{"block":"std::monte_carlo","bootstrap":{"pooled_oos":{"e_r":{"mean":0.013305753279586063,"p5":-0.09686234697635485,"p25":-0.02935938855824511,"p50":0.014375417056209604,"p75":0.0572151928623397,"p95":0.11740134416304716},"prob_le_zero":0.412,"n_trades":1272,"block_len":5,"n_resamples":1000}}}]}],"generalizations":[{"strategy_ordinal":0,"window_ordinal":0,"generalization":{"selection_metric":"expectancy_r","n_instruments":2,"worst_case":0.04367535583327283,"sign_agreement":2,"per_instrument":[["GER40",0.04367535583327283],["FRA40",0.048403786424396446]]},"winners":[["GER40",[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]]],["FRA40",[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]]]]}],"trace_name":"42edebd2-1"}}
diff --git a/fieldtests/milestone-research-artifacts/mra_runs_dump.json b/fieldtests/milestone-research-artifacts/mra_runs_dump.json
new file mode 100644
index 0000000..fa66537
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mra_runs_dump.json
@@ -0,0 +1 @@
+{"campaign":"42edebd2159de708009ba21e1ed4aea2cffabc373bf761c5765f79c190b677bd","process":"cd91270ca61ad42f56939231a7803a1d6d7aaa2b70bf79cde9da9284683b86b9","run":0,"seed":42,"cells":[{"strategy":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","instrument":"GER40","window_ms":[1725148800000,1727740800000],"stages":[{"block":"std::sweep","family_id":"42edebd2-0-GER40-w0-s0-0","selection":{"winner_ordinal":0,"params":[["bias.scale",{"F64":0.5}],["fast.length",{"I64":2}],["slow.length",{"I64":8}]],"selection":{"selection_metric":"sqn","n_trials":4,"raw_winner_metric":1.0540214890316064,"mode":"Argmax","deflated_score":-1.0290009962190139,"overfit_probability":0.3876123876123876,"n_resamples":1000,"block_len":5,"seed":42}}},{"block":"std::gate","survivor_ordinals":[0,1,2]},{"block":"std::walk_forward","family_id":"42edebd2-0-GER40-w0-s2-0"},{"block":"std::monte_carlo","bootstrap":{"pooled_oos":{"e_r":{"mean":0.02572811864069487,"p5":-0.045358717986233116,"p25":-0.003867370198210889,"p50":0.025041122400765753,"p75":0.054149001087649175,"p95":0.09609753891677572},"prob_le_zero":0.274,"n_trades":1843,"block_len":5,"n_resamples":1000}}}]},{"strategy":"597d719b7ac607158cda3e68cd497387620397a5e93087e23da512876dafba9a","instrument":"FRA40","window_ms":[1725148800000,1727740800000],"stages":[{"block":"std::sweep","family_id":"42edebd2-0-FRA40-w0-s0-0","selection":{"winner_ordinal":2,"params":[["bias.scale",{"F64":0.5}],["fast.length",{"I64":4}],["slow.length",{"I64":8}]],"selection":{"selection_metric":"sqn","n_trials":4,"raw_winner_metric":2.1027529408673753,"mode":"Argmax","deflated_score":-0.25026485410828503,"overfit_probability":0.08491508491508491,"n_resamples":1000,"block_len":5,"seed":42}}},{"block":"std::gate","survivor_ordinals":[0,1,2]},{"block":"std::walk_forward","family_id":"42edebd2-0-FRA40-w0-s2-0"},{"block":"std::monte_carlo","bootstrap":{"pooled_oos":{"e_r":{"mean":0.013305753279586063,"p5":-0.09686234697635485,"p25":-0.02935938855824511,"p50":0.014375417056209604,"p75":0.0572151928623397,"p95":0.11740134416304716},"prob_le_zero":0.412,"n_trades":1272,"block_len":5,"n_resamples":1000}}}]}],"generalizations":[{"strategy_ordinal":0,"window_ordinal":0,"generalization":{"selection_metric":"expectancy_r","n_instruments":2,"worst_case":0.04367535583327283,"sign_agreement":2,"per_instrument":[["GER40",0.04367535583327283],["FRA40",0.048403786424396446]]},"winners":[["GER40",[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]]],["FRA40",[["graph.fast.length",{"I64":4}],["graph.slow.length",{"I64":8}],["graph.bias.scale",{"F64":0.5}]]]]}],"trace_name":"42edebd2-0"}
diff --git a/fieldtests/milestone-research-artifacts/mrp_lab/.gitignore b/fieldtests/milestone-research-artifacts/mrp_lab/.gitignore
new file mode 100644
index 0000000..af5cf3d
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mrp_lab/.gitignore
@@ -0,0 +1,3 @@
+/target
+Cargo.lock
+/runs
diff --git a/fieldtests/milestone-research-artifacts/mrp_lab/Aura.toml b/fieldtests/milestone-research-artifacts/mrp_lab/Aura.toml
new file mode 100644
index 0000000..af335c1
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mrp_lab/Aura.toml
@@ -0,0 +1,3 @@
+# Static project context only (C17); paths only.
+[paths]
+runs = "runs"
diff --git a/fieldtests/milestone-research-artifacts/mrp_lab/CLAUDE.md b/fieldtests/milestone-research-artifacts/mrp_lab/CLAUDE.md
new file mode 100644
index 0000000..1d0c3b3
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mrp_lab/CLAUDE.md
@@ -0,0 +1,10 @@
+# mrp_lab — an aura research project
+
+This crate is an aura project: a cdylib of node/strategy blueprints the
+`aura` host loads during research (see the engine's docs/project-layout.md).
+
+- Build: `cargo build` (the next `aura` invocation loads the fresh dylib)
+- Run:   `aura run blueprints/signal.json` (from anywhere inside this dir)
+- Nodes live in `src/`; each is registered in `vocabulary()`/`type_ids()`
+  under the `mrp_lab::` namespace prefix.
+- Topology is data (`blueprints/*.json`), node logic is Rust.
diff --git a/fieldtests/milestone-research-artifacts/mrp_lab/Cargo.toml b/fieldtests/milestone-research-artifacts/mrp_lab/Cargo.toml
new file mode 100644
index 0000000..dd92f0b
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mrp_lab/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "mrp_lab"
+version = "0.1.0"
+edition = "2024"
+publish = false
+
+[lib]
+crate-type = ["cdylib"]
+
+[dependencies]
+aura-core = { path = "/home/brummel/dev/aura/crates/aura-core" }
+
+# Standalone workspace root: never a member of an enclosing workspace.
+[workspace]
diff --git a/fieldtests/milestone-research-artifacts/mrp_lab/blueprints/signal.json b/fieldtests/milestone-research-artifacts/mrp_lab/blueprints/signal.json
new file mode 100644
index 0000000..f4a3126
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mrp_lab/blueprints/signal.json
@@ -0,0 +1 @@
+{"format_version":1,"blueprint":{"name":"mrp_lab_signal","nodes":[{"primitive":{"type":"SMA","name":"fast","bound":[{"pos":0,"name":"length","kind":"I64","value":{"I64":2}}]}},{"primitive":{"type":"SMA","name":"slow","bound":[{"pos":0,"name":"length","kind":"I64","value":{"I64":4}}]}},{"primitive":{"type":"Sub"}},{"primitive":{"type":"Bias","name":"bias","bound":[{"pos":0,"name":"scale","kind":"F64","value":{"F64":0.5}}]}},{"primitive":{"type":"mrp_lab::Identity"}}],"edges":[{"from":0,"to":2,"slot":0,"from_field":0},{"from":1,"to":2,"slot":1,"from_field":0},{"from":2,"to":3,"slot":0,"from_field":0},{"from":3,"to":4,"slot":0,"from_field":0}],"input_roles":[{"name":"price","targets":[{"node":0,"slot":0},{"node":1,"slot":0}],"source":"F64"}],"output":[{"node":4,"field":0,"name":"bias"}]}}
\ No newline at end of file
diff --git a/fieldtests/milestone-research-artifacts/mrp_lab/src/lib.rs b/fieldtests/milestone-research-artifacts/mrp_lab/src/lib.rs
new file mode 100644
index 0000000..4f3188b
--- /dev/null
+++ b/fieldtests/milestone-research-artifacts/mrp_lab/src/lib.rs
@@ -0,0 +1,76 @@
+//! mrp_lab — an aura research project: node logic + the exported vocabulary.
+//!
+//! Every node type this crate provides is registered in `vocabulary()` /
+//! `type_ids()` under the `mrp_lab::` namespace prefix; the `aura` host loads
+//! this cdylib per invocation and merges it with the std vocabulary.
+
+use aura_core::{
+    Cell, Ctx, FieldSpec, Firing, Node, NodeSchema, PortSpec, PrimitiveBuilder,
+    ScalarKind,
+};
+
+/// One-input f64 pass-through. Emits `None` until its input has a value.
+pub struct Identity {
+    out: [Cell; 1],
+}
+
+impl Identity {
+    pub fn new() -> Self {
+        Self { out: [Cell::from_f64(0.0)] }
+    }
+    pub fn builder() -> PrimitiveBuilder {
+        PrimitiveBuilder::new(
+            "mrp_lab::Identity",
+            NodeSchema {
+                inputs: vec![PortSpec {
+                    kind: ScalarKind::F64,
+                    firing: Firing::Any,
+                    name: "value".into(),
+                }],
+                output: vec![FieldSpec { name: "value".into(), kind: ScalarKind::F64 }],
+                params: vec![],
+            },
+            |_| Box::new(Identity::new()),
+        )
+    }
+}
+
+impl Default for Identity {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+impl Node for Identity {
+    fn lookbacks(&self) -> Vec {
+        vec![1]
+    }
+    fn eval(&mut self, ctx: Ctx<'_>) -> Option<&[Cell]> {
+        let w = ctx.f64_in(0);
+        if w.is_empty() {
+            return None;
+        }
+        self.out[0] = Cell::from_f64(w[0]);
+        Some(&self.out)
+    }
+    fn label(&self) -> String {
+        "mrp_lab::Identity".to_string()
+    }
+}
+
+fn vocabulary(type_id: &str) -> Option {
+    match type_id {
+        "mrp_lab::Identity" => Some(Identity::builder()),
+        _ => None,
+    }
+}
+
+fn type_ids() -> &'static [&'static str] {
+    &["mrp_lab::Identity"]
+}
+
+aura_core::aura_project! {
+    namespace: "mrp_lab",
+    vocabulary: vocabulary,
+    type_ids: type_ids,
+}