From 9df217d868389e070fda2134aa004875312f2c3c Mon Sep 17 00:00:00 2001 From: claude Date: Tue, 21 Jul 2026 07:10:09 +0200 Subject: [PATCH] =?UTF-8?q?fieldtest:=20shell-boundary=20=E2=80=94=204=20e?= =?UTF-8?q?xamples,=206=20findings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Downstream-consumer corpus for the #295 library surface: a standalone workspace (path-deps, no aura-cli in the link graph — cargo tree verified) exercising the four cycle axes as a World program would, public interface only: a DefaultMemberRunner member run over real GER40, a hand-authored campaign document through aura_campaign::execute, the IC + registry deflation dispatch as library calls, and load_family/reproduce round-trips. Run transcripts committed beside the sources. Findings routed separately: the family-id mismatch between the registry enumeration and the reproduce keying (list-then-reproduce dead-ends) to debug; the reproduce-API friction (no report on the simple path; DataSource/pip re-specification the manifest already holds, wrong pip silently DIVERGED) to a follow-up. Four working confirmations, chief among them the cycle's acceptance claim: all four axes compiled first-try from the public docs alone. refs #295 --- .../cycle-295-shell-boundary/Cargo.lock | 1294 +++++++++++++++++ .../cycle-295-shell-boundary/Cargo.toml | 51 + .../out_sb_1_member_run.txt | 4 + .../out_sb_2_campaign.txt | 6 + .../cycle-295-shell-boundary/out_sb_3_ic.txt | 9 + .../out_sb_4_reproduce.txt | 22 + .../sb_1_member_run.rs | 58 + .../cycle-295-shell-boundary/sb_2_campaign.rs | 110 ++ .../cycle-295-shell-boundary/sb_3_ic.rs | 71 + .../sb_4_reproduce.rs | 83 ++ 10 files changed, 1708 insertions(+) create mode 100644 fieldtests/cycle-295-shell-boundary/Cargo.lock create mode 100644 fieldtests/cycle-295-shell-boundary/Cargo.toml create mode 100644 fieldtests/cycle-295-shell-boundary/out_sb_1_member_run.txt create mode 100644 fieldtests/cycle-295-shell-boundary/out_sb_2_campaign.txt create mode 100644 fieldtests/cycle-295-shell-boundary/out_sb_3_ic.txt create mode 100644 fieldtests/cycle-295-shell-boundary/out_sb_4_reproduce.txt create mode 100644 fieldtests/cycle-295-shell-boundary/sb_1_member_run.rs create mode 100644 fieldtests/cycle-295-shell-boundary/sb_2_campaign.rs create mode 100644 fieldtests/cycle-295-shell-boundary/sb_3_ic.rs create mode 100644 fieldtests/cycle-295-shell-boundary/sb_4_reproduce.rs diff --git a/fieldtests/cycle-295-shell-boundary/Cargo.lock b/fieldtests/cycle-295-shell-boundary/Cargo.lock new file mode 100644 index 0000000..9749c87 --- /dev/null +++ b/fieldtests/cycle-295-shell-boundary/Cargo.lock @@ -0,0 +1,1294 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "aura-analysis" +version = "0.1.0" +dependencies = [ + "serde", +] + +[[package]] +name = "aura-backtest" +version = "0.1.0" +dependencies = [ + "aura-core", + "aura-engine", + "serde", +] + +[[package]] +name = "aura-campaign" +version = "0.1.0" +dependencies = [ + "aura-analysis", + "aura-backtest", + "aura-core", + "aura-engine", + "aura-registry", + "aura-research", + "rayon", + "serde", + "serde_json", +] + +[[package]] +name = "aura-composites" +version = "0.1.0" +dependencies = [ + "aura-backtest", + "aura-core", + "aura-engine", + "aura-std", + "aura-strategy", +] + +[[package]] +name = "aura-core" +version = "0.1.0" +dependencies = [ + "serde", +] + +[[package]] +name = "aura-engine" +version = "0.1.0" +dependencies = [ + "aura-analysis", + "aura-core", + "rayon", + "serde", + "serde_json", +] + +[[package]] +name = "aura-ingest" +version = "0.1.0" +dependencies = [ + "aura-core", + "aura-engine", + "data-server", +] + +[[package]] +name = "aura-market" +version = "0.1.0" +dependencies = [ + "aura-core", + "chrono", + "chrono-tz", +] + +[[package]] +name = "aura-measurement" +version = "0.1.0" +dependencies = [ + "aura-analysis", + "aura-core", + "serde", +] + +[[package]] +name = "aura-registry" +version = "0.1.0" +dependencies = [ + "aura-analysis", + "aura-backtest", + "aura-core", + "aura-engine", + "aura-research", + "serde", + "serde_json", +] + +[[package]] +name = "aura-research" +version = "0.1.0" +dependencies = [ + "aura-core", + "serde", + "serde_json", + "sha2", +] + +[[package]] +name = "aura-runner" +version = "0.1.0" +dependencies = [ + "aura-backtest", + "aura-campaign", + "aura-composites", + "aura-core", + "aura-engine", + "aura-ingest", + "aura-registry", + "aura-research", + "aura-std", + "aura-strategy", + "aura-vocabulary", + "data-server", + "libloading", + "serde", + "serde_json", + "sha2", + "toml", +] + +[[package]] +name = "aura-std" +version = "0.1.0" +dependencies = [ + "aura-core", + "chrono", + "chrono-tz", +] + +[[package]] +name = "aura-strategy" +version = "0.1.0" +dependencies = [ + "aura-core", +] + +[[package]] +name = "aura-vocabulary" +version = "0.1.0" +dependencies = [ + "aura-backtest", + "aura-core", + "aura-market", + "aura-std", + "aura-strategy", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bzip2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ecfb22d906f800d4fe833b6282cf4dc1c298f5057ca0b5445e5c209735ca47" +dependencies = [ + "bzip2-sys", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "cc" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "chrono-tz" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" +dependencies = [ + "chrono", + "phf", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "data-server" +version = "0.1.0" +source = "git+http://192.168.178.103:3000/Brummel/data-server.git?branch=main#694f96f2b23453d533c43d4da3b5ac9da4aca25a" +dependencies = [ + "chrono", + "regex", + "serde_json", + "zip", +] + +[[package]] +name = "deflate64" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac6b926516df9c60bfa16e107b21086399f8285a44ca9711344b9e553c5146e2" + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" + +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "futures-core" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" + +[[package]] +name = "futures-task" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" + +[[package]] +name = "futures-util" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.187" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7743783ea728ef5c31194c6590797eed286449b4a4e87d626d8a51f0a94e732" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "lzma-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" +dependencies = [ + "byteorder", + "crc", +] + +[[package]] +name = "lzma-sys" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "phf" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "sb295-fieldtest" +version = "0.0.0" +dependencies = [ + "aura-campaign", + "aura-core", + "aura-ingest", + "aura-measurement", + "aura-registry", + "aura-research", + "aura-runner", + "data-server", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.2", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a207d6d6a2b7fc470b80443726053f18a2481b7e1eee970597051596567987a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.2", +] + +[[package]] +name = "time" +version = "0.3.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "xz2" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" +dependencies = [ + "lzma-sys", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zip" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" +dependencies = [ + "aes", + "arbitrary", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "deflate64", + "displaydoc", + "flate2", + "getrandom 0.3.4", + "hmac", + "indexmap", + "lzma-rs", + "memchr", + "pbkdf2", + "sha1", + "thiserror", + "time", + "xz2", + "zeroize", + "zopfli", + "zstd", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/fieldtests/cycle-295-shell-boundary/Cargo.toml b/fieldtests/cycle-295-shell-boundary/Cargo.toml new file mode 100644 index 0000000..a6f4122 --- /dev/null +++ b/fieldtests/cycle-295-shell-boundary/Cargo.toml @@ -0,0 +1,51 @@ +# Standalone downstream-consumer crate for the shell-boundary (#295) fieldtest. +# +# The cycle's claim to substantiate empirically: a downstream World program can +# run the canonical member backtest and drive the family/validation machinery +# through the LIBRARY ALONE — no `aura` binary, no `aura-cli` in the link graph. +# +# Like the prior fixtures, this is NOT a member of the aura workspace (empty +# [workspace] table below = own workspace root); it path-deps the library crates +# exactly as a real C16 research project would, and drives the public surface +# discovered from the design ledger + glossary + authoring guide + `cargo doc` +# rustdoc + the shipped worked example (no crates/*/src was read). +# +# NB: aura-cli is deliberately ABSENT from [dependencies] — the link graph is the +# acceptance evidence. Run e.g.: +# cargo run --manifest-path fieldtests/cycle-295-shell-boundary/Cargo.toml --bin sb_1_member_run +# so HEAD source is always what runs. +[workspace] + +[package] +name = "sb295-fieldtest" +version = "0.0.0" +edition = "2024" +publish = false + +[dependencies] +aura-core = { path = "../../crates/aura-core" } +aura-runner = { path = "../../crates/aura-runner" } +aura-campaign = { path = "../../crates/aura-campaign" } +aura-research = { path = "../../crates/aura-research" } +aura-registry = { path = "../../crates/aura-registry" } +aura-ingest = { path = "../../crates/aura-ingest" } +aura-measurement = { path = "../../crates/aura-measurement" } +# Reached for directly: DefaultMemberRunner::new / DataSource::Real want an +# Arc, and aura-ingest re-exports only the constructed default_data_server(). +data-server = { git = "http://192.168.178.103:3000/Brummel/data-server.git", branch = "main" } + +[[bin]] +name = "sb_1_member_run" +path = "sb_1_member_run.rs" + +[[bin]] +name = "sb_2_campaign" +path = "sb_2_campaign.rs" + +[[bin]] +name = "sb_3_ic" +path = "sb_3_ic.rs" + +[[bin]] +name = "sb_4_reproduce" +path = "sb_4_reproduce.rs" diff --git a/fieldtests/cycle-295-shell-boundary/out_sb_1_member_run.txt b/fieldtests/cycle-295-shell-boundary/out_sb_1_member_run.txt new file mode 100644 index 0000000..52b424b --- /dev/null +++ b/fieldtests/cycle-295-shell-boundary/out_sb_1_member_run.txt @@ -0,0 +1,4 @@ +running member: strategy_id=884b1ba0640b2f5bb661c8d47e169db85ac2bb729ff5aa1ff3f9c930085da6d9 instrument=GER40 +member ran OK. metrics: + total_pips=79.35 max_drawdown=862.4750 bias_sign_flips=7253 + R: n_trades=6604 expectancy_r=0.0042 win_rate=0.363 sqn=0.255 sqn_normalized=0.031 net_expectancy_r=0.0042 diff --git a/fieldtests/cycle-295-shell-boundary/out_sb_2_campaign.txt b/fieldtests/cycle-295-shell-boundary/out_sb_2_campaign.txt new file mode 100644 index 0000000..d372afd --- /dev/null +++ b/fieldtests/cycle-295-shell-boundary/out_sb_2_campaign.txt @@ -0,0 +1,6 @@ +runs root: runs +campaign_id=7c892fcdced6a808bf036564a350e1fd1fd2d47324abbadb5dcd39e02f13d1aa +executing campaign (1 cell, sweep over fast.length in [2,3])… +campaign ran OK. run#=0 cells=1 + cell 0: 1 stage-families + stage 0 block std::sweep family_id=7c892fcd-0-GER40-w0-r0-s0-0 members=2 diff --git a/fieldtests/cycle-295-shell-boundary/out_sb_3_ic.txt b/fieldtests/cycle-295-shell-boundary/out_sb_3_ic.txt new file mode 100644 index 0000000..fffaad5 --- /dev/null +++ b/fieldtests/cycle-295-shell-boundary/out_sb_3_ic.txt @@ -0,0 +1,9 @@ +informed signal: + information_coefficient = 0.8909 + overfit_probability = 0.0020 + n_pairs = 399 +noise signal: + information_coefficient = -0.0191 + overfit_probability = 0.6507 + n_pairs = 399 +deterministic re-run identical: true diff --git a/fieldtests/cycle-295-shell-boundary/out_sb_4_reproduce.txt b/fieldtests/cycle-295-shell-boundary/out_sb_4_reproduce.txt new file mode 100644 index 0000000..d3ea576 --- /dev/null +++ b/fieldtests/cycle-295-shell-boundary/out_sb_4_reproduce.txt @@ -0,0 +1,22 @@ +### Case A — auto-discover the family id via registry.load_family_members() (the natural 'list then reproduce' path) +runs root: runs +reproducing family: 7c892fcd-0-GER40-w0-r0-s0 + load_family failed: exit=1 msg=no such family '7c892fcd-0-GER40-w0-r0-s0' + --- reproduce_family(id, env) --- + reproduce_family failed: exit=1 msg=no such family '7c892fcd-0-GER40-w0-r0-s0' + --- reproduce_family_in(reg, id, data, env) -> ReproduceReport --- + reproduce_family_in failed: exit=1 msg=no such family '7c892fcd-0-GER40-w0-r0-s0' + +### Case B — the family id as returned by execute()'s StageFamily.family_id (with the stage '-0' suffix) +runs root: runs +reproducing family: 7c892fcd-0-GER40-w0-r0-s0-0 + load_family OK: kind=Sweep members=2 + --- reproduce_family(id, env) --- +7c892fcd-0-GER40-w0-r0-s0-0 member sma_signal.fast.length=2, stop_length=3, stop_k=2 reproduced: bit-identical +7c892fcd-0-GER40-w0-r0-s0-0 member sma_signal.fast.length=3, stop_length=3, stop_k=2 reproduced: bit-identical +reproduced 2/2 members bit-identically + reproduce_family returned Ok(()) — bit-identical (no per-member detail returned). + --- reproduce_family_in(reg, id, data, env) -> ReproduceReport --- + ReproduceReport: 2/2 members bit-identical + IDENTICAL sma_signal.fast.length=2, stop_length=3, stop_k=2 + IDENTICAL sma_signal.fast.length=3, stop_length=3, stop_k=2 diff --git a/fieldtests/cycle-295-shell-boundary/sb_1_member_run.rs b/fieldtests/cycle-295-shell-boundary/sb_1_member_run.rs new file mode 100644 index 0000000..72181e8 --- /dev/null +++ b/fieldtests/cycle-295-shell-boundary/sb_1_member_run.rs @@ -0,0 +1,58 @@ +//! Axis 1 — a single member backtest driven through `DefaultMemberRunner`, the +//! shipped `aura_campaign::MemberRunner` implementor, over a shipped example +//! blueprint (r_sma) and real GER40 archive data. No `aura` binary involved; +//! this program links the library crates only (see Cargo.toml). +use std::collections::BTreeMap; + +use aura_campaign::{CellSpec, MemberRunner}; +use aura_ingest::default_data_server; +use aura_runner::{DefaultMemberRunner, Env}; + +const SYMBOL: &str = "GER40"; +// September 2024, inclusive epoch-ms — the window the shipped ger40 examples use. +const WINDOW_MS: (i64, i64) = (1_725_148_800_000, 1_727_740_799_999); + +fn main() { + let server = default_data_server(); + if !server.has_symbol(SYMBOL) { + println!("skip: no local {SYMBOL} archive — nothing to demonstrate."); + return; + } + + let blueprint_json = std::fs::read_to_string(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../crates/aura-cli/examples/r_sma.json" + )) + .expect("shipped example blueprint r_sma.json"); + + let env = Env::std(); + let runner = DefaultMemberRunner::new(&env, server, BTreeMap::new(), Vec::new()); + + let cell = CellSpec { + strategy_ordinal: 0, + strategy_id: aura_research::content_id_of(&blueprint_json), + blueprint_json, + axes: BTreeMap::new(), + instrument: SYMBOL.to_string(), + window_ms: WINDOW_MS, + regime: None, + regime_ordinal: 0, + }; + + println!("running member: strategy_id={} instrument={SYMBOL}", cell.strategy_id); + match runner.run_member(&cell, &[], WINDOW_MS) { + Ok(report) => { + let m = &report.metrics; + println!("member ran OK. metrics:"); + println!(" total_pips={:.2} max_drawdown={:.4} bias_sign_flips={}", m.total_pips, m.max_drawdown, m.bias_sign_flips); + match &m.r { + Some(r) => println!( + " R: n_trades={} expectancy_r={:.4} win_rate={:.3} sqn={:.3} sqn_normalized={:.3} net_expectancy_r={:.4}", + r.n_trades, r.expectancy_r, r.win_rate, r.sqn, r.sqn_normalized, r.net_expectancy_r + ), + None => println!(" R: (none)"), + } + } + Err(fault) => println!("member fault (data-dependent): {fault:?}"), + } +} diff --git a/fieldtests/cycle-295-shell-boundary/sb_2_campaign.rs b/fieldtests/cycle-295-shell-boundary/sb_2_campaign.rs new file mode 100644 index 0000000..1f5d8cc --- /dev/null +++ b/fieldtests/cycle-295-shell-boundary/sb_2_campaign.rs @@ -0,0 +1,110 @@ +//! Axis 2 — campaign execution driven through `aura_campaign::execute` with the +//! default runner over a tiny hand-authored campaign + process document. Author +//! the two closed-vocabulary documents as JSON, canonicalize + content-address +//! them via aura-research, register the artifacts, then run the whole family/ +//! validation machinery. Library crates only; no `aura` binary. +use std::collections::BTreeMap; +use std::num::NonZeroUsize; + +use aura_campaign::{execute, MemberRunner}; +use aura_ingest::default_data_server; +use aura_research::{ + campaign_to_json, content_id_of, parse_campaign, parse_process, process_to_json, +}; +use aura_runner::{DefaultMemberRunner, Env}; + +const SYMBOL: &str = "GER40"; +const FROM_MS: i64 = 1_725_148_800_000; // 2024-09-01 +const TO_MS: i64 = 1_727_740_800_000; // 2024-10-01 + +fn main() { + let server = default_data_server(); + if !server.has_symbol(SYMBOL) { + println!("skip: no local {SYMBOL} archive — nothing to demonstrate."); + return; + } + + // --- 1. the strategy blueprint (shipped example) + its content id ------------ + let blueprint_json = std::fs::read_to_string(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../crates/aura-cli/examples/r_sma.json" + )) + .expect("shipped example blueprint r_sma.json"); + let bp_id = content_id_of(&blueprint_json); + + // --- 2. a minimal process document: one selection-free sweep ----------------- + let process_src = r#"{ + "format_version": 1, + "kind": "process", + "name": "sb-explore-only-sweep", + "pipeline": [ { "block": "std::sweep" } ] + }"#; + let process_doc = parse_process(process_src).expect("process parses"); + let process_canon = process_to_json(&process_doc); + let process_id = content_id_of(&process_canon); + + // --- 3. a minimal campaign document referencing both by content id ----------- + let campaign_src = format!( + r#"{{ + "format_version": 1, + "kind": "campaign", + "name": "sb-ger40-sma-min", + "seed": 7, + "data": {{ + "instruments": ["{SYMBOL}"], + "windows": [ {{ "from_ms": {FROM_MS}, "to_ms": {TO_MS} }} ] + }}, + "strategies": [ + {{ + "ref": {{ "content_id": "{bp_id}" }}, + "axes": {{ "fast.length": {{ "kind": "I64", "values": [2, 3] }} }} + }} + ], + "process": {{ "ref": {{ "content_id": "{process_id}" }} }}, + "presentation": {{ "persist_taps": [], "emit": ["family_table"] }} + }}"# + ); + let campaign_doc = parse_campaign(&campaign_src).expect("campaign parses"); + let campaign_canon = campaign_to_json(&campaign_doc); + let campaign_id = content_id_of(&campaign_canon); + + // --- 4. wire the runner + registry, register the artifacts ------------------- + let env = Env::std(); + println!("runs root: {}", env.runs_root().display()); + let reg = env.registry(); + reg.put_blueprint(&bp_id, &blueprint_json).expect("store blueprint"); + reg.put_process(&process_canon).expect("store process"); + reg.put_campaign(&campaign_canon).expect("store campaign"); + + let runner = DefaultMemberRunner::new(&env, server, BTreeMap::new(), Vec::new()); + let strategies = vec![(bp_id.clone(), blueprint_json.clone())]; + + println!("campaign_id={campaign_id}"); + println!("executing campaign (1 cell, sweep over fast.length in [2,3])…"); + match execute( + &campaign_id, + &campaign_doc, + &process_doc, + &strategies, + &runner as &dyn MemberRunner, + ®, + NonZeroUsize::new(1).unwrap(), + ) { + Ok(outcome) => { + println!("campaign ran OK. run#={} cells={}", outcome.run, outcome.cells.len()); + for (ci, cell) in outcome.cells.iter().enumerate() { + println!(" cell {ci}: {} stage-families", cell.families.len()); + for fam in &cell.families { + println!( + " stage {} block {} family_id={} members={}", + fam.stage, + fam.block, + fam.family_id, + fam.reports.len() + ); + } + } + } + Err(fault) => println!("campaign fault: {fault:?}"), + } +} diff --git a/fieldtests/cycle-295-shell-boundary/sb_3_ic.rs b/fieldtests/cycle-295-shell-boundary/sb_3_ic.rs new file mode 100644 index 0000000..a2f5680 --- /dev/null +++ b/fieldtests/cycle-295-shell-boundary/sb_3_ic.rs @@ -0,0 +1,71 @@ +//! Axis 3 — the Information Coefficient as a pure library call +//! (`aura_measurement::information_coefficient`), including its permutation-null +//! deflation (the returned `overfit_probability`). No data archive, no `aura` +//! binary: just two in-memory (timestamp, value) series a downstream measurement +//! World program would hold. Runs an *informed* signal (correlated with the +//! forward return) against a *noise* signal to show the deflation discriminates. +use aura_core::Timestamp; +use aura_measurement::information_coefficient; + +const N: usize = 400; +const HORIZON: usize = 1; +const PERMUTATIONS: usize = 500; +const SEED: u64 = 12_345; + +// A tiny deterministic LCG so the fixture is reproducible without an rng dep. +struct Lcg(u64); +impl Lcg { + fn next_unit(&mut self) -> f64 { + self.0 = self.0.wrapping_mul(6_364_136_223_846_793_005).wrapping_add(1_442_695_040_888_963_407); + // top 53 bits -> [0,1) + ((self.0 >> 11) as f64) / ((1u64 << 53) as f64) + } + fn next_signed(&mut self) -> f64 { + self.next_unit() * 2.0 - 1.0 + } +} + +fn main() { + let mut rng = Lcg(0x1234_5678_9abc_def0); + + // A random-walk price and its forward one-step return. + let mut price = Vec::with_capacity(N); + let mut level = 100.0f64; + for _ in 0..N { + level += rng.next_signed(); + price.push(level); + } + let price_series: Vec<(Timestamp, f64)> = + price.iter().enumerate().map(|(i, &p)| (Timestamp(i as i64 * 60_000), p)).collect(); + + // Informed signal: the forward return plus noise (so it genuinely forecasts). + let mut informed = Vec::with_capacity(N); + for i in 0..N { + let fwd = if i + HORIZON < N { price[i + HORIZON] - price[i] } else { 0.0 }; + informed.push(fwd + 0.5 * rng.next_signed()); + } + let informed_series: Vec<(Timestamp, f64)> = + informed.iter().enumerate().map(|(i, &s)| (Timestamp(i as i64 * 60_000), s)).collect(); + + // Noise signal: uncorrelated with the forward return. + let noise_series: Vec<(Timestamp, f64)> = + (0..N).map(|i| (Timestamp(i as i64 * 60_000), rng.next_signed())).collect(); + + let informed_ic = information_coefficient(&informed_series, &price_series, HORIZON, PERMUTATIONS, SEED); + let noise_ic = information_coefficient(&noise_series, &price_series, HORIZON, PERMUTATIONS, SEED); + + println!("informed signal:"); + println!(" information_coefficient = {:.4}", informed_ic.information_coefficient); + println!(" overfit_probability = {:.4}", informed_ic.overfit_probability); + println!(" n_pairs = {}", informed_ic.n_pairs); + println!("noise signal:"); + println!(" information_coefficient = {:.4}", noise_ic.information_coefficient); + println!(" overfit_probability = {:.4}", noise_ic.overfit_probability); + println!(" n_pairs = {}", noise_ic.n_pairs); + + // Determinism check (C1/C18 for a measurement): same inputs -> same bytes. + let again = information_coefficient(&informed_series, &price_series, HORIZON, PERMUTATIONS, SEED); + let deterministic = again.information_coefficient == informed_ic.information_coefficient + && again.overfit_probability == informed_ic.overfit_probability; + println!("deterministic re-run identical: {deterministic}"); +} diff --git a/fieldtests/cycle-295-shell-boundary/sb_4_reproduce.rs b/fieldtests/cycle-295-shell-boundary/sb_4_reproduce.rs new file mode 100644 index 0000000..7029ba6 --- /dev/null +++ b/fieldtests/cycle-295-shell-boundary/sb_4_reproduce.rs @@ -0,0 +1,83 @@ +//! Axis 4 — project loading + bit-identical reproduction (C18/C1) as a library +//! consumer. Opens the default `Env`, discovers a persisted family in the run +//! registry (written by the sb_2_campaign fixture), inspects it via `load_family`, +//! and re-derives it via `reproduce_family`. Also probes `reproduce_family_in`, +//! the only variant that returns a programmatic `ReproduceReport`. No `aura` +//! binary; library crates only. +//! +//! Usage: `… --bin sb_4_reproduce []` +//! (omit the id to auto-pick the first family the registry holds). +use aura_ingest::default_data_server; +use aura_runner::family::DataSource; +use aura_runner::reproduce::{load_family, reproduce_family, reproduce_family_in}; +use aura_runner::Env; + +const SYMBOL: &str = "GER40"; +const FROM_MS: i64 = 1_725_148_800_000; +const TO_MS: i64 = 1_727_740_800_000; + +fn main() { + let env = Env::std(); + let reg = env.registry(); + println!("runs root: {}", env.runs_root().display()); + + // Discover a persisted family id (or take one from argv). + let arg_id = std::env::args().nth(1); + let family_id = match arg_id { + Some(id) => id, + None => { + let members = match reg.load_family_members() { + Ok(m) => m, + Err(e) => { + println!("could not read registry: {e:?}"); + return; + } + }; + match members.first() { + Some(rec) => rec.family.clone(), + None => { + println!("no persisted families — run the sb_2_campaign fixture first."); + return; + } + } + } + }; + println!("reproducing family: {family_id}"); + + // 1. Inspect the persisted family programmatically. + match load_family(®, &family_id) { + Ok(fam) => println!(" load_family OK: kind={:?} members={}", fam.kind, fam.members.len()), + Err(e) => println!(" load_family failed: exit={} msg={}", e.exit_code, e.message), + } + + // 2. The ergonomic path: reproduce_family(id, env) -> Result<(), RunnerError>. + // Auto-derives the data source from the stored manifest. + println!(" --- reproduce_family(id, env) ---"); + match reproduce_family(&family_id, &env) { + Ok(()) => println!(" reproduce_family returned Ok(()) — bit-identical (no per-member detail returned)."), + Err(e) => println!(" reproduce_family failed: exit={} msg={}", e.exit_code, e.message), + } + + // 3. The only variant that returns a ReproduceReport: reproduce_family_in, + // which forces the consumer to re-specify the DataSource (symbol/window/pip) + // that the family manifest already records. pip re-specified by hand here. + println!(" --- reproduce_family_in(reg, id, data, env) -> ReproduceReport ---"); + let data = DataSource::Real { + server: default_data_server(), + symbol: SYMBOL.to_string(), + from_ms: Some(FROM_MS), + to_ms: Some(TO_MS), + pip: 1.0, + }; + match reproduce_family_in(®, &family_id, &data, &env) { + Ok(report) => { + let n = report.outcomes.len(); + let identical = report.outcomes.iter().filter(|(_, ok)| *ok).count(); + println!(" ReproduceReport: {identical}/{n} members bit-identical"); + for (member, ok) in &report.outcomes { + println!(" {} {member}", if *ok { "IDENTICAL" } else { "DIVERGED " }); + } + } + Err(e) => println!(" reproduce_family_in failed: exit={} msg={}", e.exit_code, e.message), + } +}