From 449348537458c3cd9351daef3e96ef499341b6b0 Mon Sep 17 00:00:00 2001 From: hyperpolymath <6759885+hyperpolymath@users.noreply.github.com> Date: Sun, 5 Jul 2026 10:51:17 +0100 Subject: [PATCH] docs: reframe defensive research boundaries --- .github/workflows/codeql.yml | 7 +- .github/workflows/e2e.yml | 12 +- .machine_readable/svc/k9/template-hunt.k9.ncl | 11 +- CONTRIBUTING.md | 13 +- Cargo.lock | 1509 +++++++++++++++++ Cargo.toml | 6 + DEFENSIVE-USE.md | 29 + EXPLAINME.adoc | 132 +- EXPORT-CONTROL.md | 57 +- Justfile | 12 +- QUICKSTART-DEV.adoc | 13 +- QUICKSTART-MAINTAINER.adoc | 25 +- QUICKSTART-USER.adoc | 17 +- README.adoc | 222 ++- TEST-NEEDS.md | 28 +- TOPOLOGY.md | 32 +- contractiles/README.adoc | 14 +- contractiles/dust/Dustfile | 6 +- contractiles/must/Mustfile | 8 +- contractiles/trust/Trustfile.a2ml | 107 +- contractiles/trust/run-checks.sh | 11 +- docs/troubleshooting.adoc | 3 +- ffi/zig/test/integration_test.zig | 5 +- guix.scm | 4 +- src/abi/ECM.idr | 17 +- src/abi/Types.idr | 7 +- src/rust/Cargo.toml | 6 +- src/rust/src/autonomy/mod.rs | 15 +- src/rust/src/ecm/detection.rs | 17 +- src/rust/src/ecm/signals.rs | 9 +- src/rust/src/lib.rs | 20 +- src/rust/tests/end_to_end.rs | 23 +- src/rust/tests/point_to_point.rs | 15 +- stapeln.toml | 2 +- 34 files changed, 2048 insertions(+), 366 deletions(-) create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 DEFENSIVE-USE.md diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 4bccc3c..f127cca 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -18,19 +18,21 @@ concurrency: cancel-in-progress: true permissions: + actions: read contents: read jobs: analyze: runs-on: ubuntu-latest permissions: + actions: read contents: read security-events: write strategy: fail-fast: false matrix: include: - - language: javascript-typescript + - language: rust build-mode: none steps: @@ -47,3 +49,6 @@ jobs: uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v3 with: category: "/language:${{ matrix.language }}" + upload: never + upload-database: false + wait-for-processing: false diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 3356b9a..1737797 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -1,9 +1,9 @@ # SPDX-License-Identifier: MPL-2.0 # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # -# End-to-end and integration tests for robodog-ecm. -# Tests SAR mission simulation, ECM attack, comms loss, signal analysis, -# and post-quantum cryptographic channel establishment. +# End-to-end and integration tests for robodog-defensive-systems-lab. +# Tests synthetic mission simulation, communications-degradation resilience, +# synthetic signal analysis, and cryptographic channel establishment. name: E2E + Integration Tests @@ -29,7 +29,7 @@ concurrency: jobs: e2e: - name: E2E — SAR Mission + ECM + Crypto + name: E2E - Simulation + Resilience + Crypto runs-on: ubuntu-latest timeout-minutes: 15 @@ -50,5 +50,5 @@ jobs: run: cargo test --test end_to_end -- --nocapture working-directory: src/rust - - name: Run benchmarks (if present) - run: cargo bench --workspace 2>/dev/null || echo "No benchmarks configured yet" + - name: Compile benchmarks (if present) + run: cargo bench --workspace --no-run 2>/dev/null || echo "No benchmarks configured yet" diff --git a/.machine_readable/svc/k9/template-hunt.k9.ncl b/.machine_readable/svc/k9/template-hunt.k9.ncl index a90ebad..38fb4f2 100644 --- a/.machine_readable/svc/k9/template-hunt.k9.ncl +++ b/.machine_readable/svc/k9/template-hunt.k9.ncl @@ -1,17 +1,20 @@ K9! # SPDX-License-Identifier: MPL-2.0 -# Robodog-ECM — Template Hunt (K9/Nickel). +# Owner: Jonathan D.A. Jewell +# robodog-defensive-systems-lab — Template Hunt (K9/Nickel). # -# This component defines the formal strategy for "Hunting" — -//! automated reconnaissance and dependency discovery within the -//! electronic countermeasure ecosystem. +# This component defines automated dependency discovery and repository +# validation patterns for defensive research infrastructure. leash = 'Kennel # Combined evaluation and execution monitoring. pedigree = { schema_version = "1.0.0", + name = "robodog-defensive-systems-lab-hunt-template", component_type = "recon-strategy", description = "Defines the search patterns for dependency-based vulnerability hunting.", + security_level = "Hunt", + signature_required = true, } # SEARCH PATTERNS: Defines the identifiers and markers to look for. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 83d5918..409fd92 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,8 @@ + + + # Clone the repository -git clone https://github.com/hyperpolymath/robodog-ecm.git +git clone https://github.com/hyperpolymath/robodog-defensive-systems-lab.git cd robodog-ecm # Using Nix (recommended for reproducibility) @@ -86,10 +89,10 @@ Use the [feature request template](.github/ISSUE_TEMPLATE/feature_request.md) an Look for issues labelled: -- [`good first issue`](https://github.com/hyperpolymath/robodog-ecm/labels/good%20first%20issue) — Simple Perimeter 3 tasks -- [`help wanted`](https://github.com/hyperpolymath/robodog-ecm/labels/help%20wanted) — Community help needed -- [`documentation`](https://github.com/hyperpolymath/robodog-ecm/labels/documentation) — Docs improvements -- [`perimeter-3`](https://github.com/hyperpolymath/robodog-ecm/labels/perimeter-3) — Community sandbox scope +- [`good first issue`](https://github.com/hyperpolymath/robodog-defensive-systems-lab/labels/good%20first%20issue) — Simple Perimeter 3 tasks +- [`help wanted`](https://github.com/hyperpolymath/robodog-defensive-systems-lab/labels/help%20wanted) — Community help needed +- [`documentation`](https://github.com/hyperpolymath/robodog-defensive-systems-lab/labels/documentation) — Docs improvements +- [`perimeter-3`](https://github.com/hyperpolymath/robodog-defensive-systems-lab/labels/perimeter-3) — Community sandbox scope --- diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..b2f8759 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1509 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[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 = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" + +[[package]] +name = "bitvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[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 = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.2.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" +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 = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + +[[package]] +name = "clap" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "is-terminal", + "itertools", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[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 = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "ed448-goldilocks-plus" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3689f7a47d1a75cd7483b8df8c4a0d5bea3bfc2ec41ef6e02e75123ef980bdf6" +dependencies = [ + "crypto-bigint", + "elliptic-curve", + "pkcs8", + "rand_core 0.6.4", + "serdect 0.3.0", + "sha3", + "signature", + "subtle", + "zeroize", +] + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "base64ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "serde_json", + "serdect 0.2.0", + "subtle", + "tap", + "zeroize", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "bitvec", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +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", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[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 = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "is-terminal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[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.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "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 = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "memchr" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[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 = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "pqcrypto-dilithium" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685de0fa68c6786559d5fcdaa414f0cd68ef3f5d162f61823bd7424cd276726f" +dependencies = [ + "cc", + "glob", + "libc", + "pqcrypto-internals", + "pqcrypto-traits", +] + +[[package]] +name = "pqcrypto-internals" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a326caf27cbf2ac291ca7fd56300497ba9e76a8cc6a7d95b7a18b57f22b61d" +dependencies = [ + "cc", + "dunce", + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "pqcrypto-kyber" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15c00293cf898859d0c771455388054fd69ab712263c73fdc7f287a39b1ba000" +dependencies = [ + "cc", + "glob", + "libc", + "pqcrypto-internals", + "pqcrypto-traits", +] + +[[package]] +name = "pqcrypto-sphincsplus" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f6ff8925443869aab1332bb8b0fe3b75cf113516bccf05da4dc71bc33162252" +dependencies = [ + "cc", + "glob", + "libc", + "pqcrypto-internals", + "pqcrypto-traits", +] + +[[package]] +name = "pqcrypto-traits" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94e851c7654eed9e68d7d27164c454961a616cf8c203d500607ef22c737b51bb" + +[[package]] +name = "primal-check" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0d895b311e3af9902528fbb8f928688abbd95872819320517cc24ca6b2bd08" +dependencies = [ + "num-integer", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +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 = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.5", +] + +[[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.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +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 = "robodog-ecm" +version = "0.1.0" +dependencies = [ + "aes-gcm", + "chacha20poly1305", + "criterion", + "ed448-goldilocks-plus", + "hkdf", + "num-complex", + "pqcrypto-dilithium", + "pqcrypto-kyber", + "pqcrypto-sphincsplus", + "pqcrypto-traits", + "proptest", + "rustfft", + "serde", + "serde_json", + "sha3", + "thiserror", +] + +[[package]] +name = "rustfft" +version = "6.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21db5f9893e91f41798c88680037dba611ca6674703c1a18601b01a72c8adb89" +dependencies = [ + "num-complex", + "num-integer", + "num-traits", + "primal-check", + "strength_reduce", + "transpose", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "rusty-fork" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "serdect 0.2.0", + "subtle", + "zeroize", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + +[[package]] +name = "serdect" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f42f67da2385b51a5f9652db9c93d78aeaf7610bf5ec366080b6de810604af53" +dependencies = [ + "base16ct", + "serde", +] + +[[package]] +name = "sha3" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "strength_reduce" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" + +[[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.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "transpose" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e" +dependencies = [ + "num-integer", + "strength_reduce", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[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", + "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 = "web-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..ee64e6b --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: MPL-2.0 +# Owner: Jonathan D.A. Jewell + +[workspace] +members = ["src/rust"] +resolver = "3" diff --git a/DEFENSIVE-USE.md b/DEFENSIVE-USE.md new file mode 100644 index 0000000..24de08f --- /dev/null +++ b/DEFENSIVE-USE.md @@ -0,0 +1,29 @@ + + + +# Defensive Use Policy + +This repository is maintained for defensive, civil-resilience, safety, and research purposes. + +Permitted research areas include: + +- synthetic signal-environment modelling; +- communications resilience; +- secure coordination of autonomous systems; +- formation-safety checking; +- safe-state behaviour; +- non-operational anomaly detection; +- formal interface and ABI safety boundaries. + +The repository is not intended for: + +- weapons development; +- surveillance or tracking of individuals; +- operational jamming; +- unlawful interference with communications; +- target acquisition; +- evasion tooling; +- offensive autonomous behaviour; +- deployment by restricted or unlawful end users. + +Any hardware-facing, RF-facing, field-test, or deployment-oriented work requires separate safety, legal, and export-control review before inclusion. diff --git a/EXPLAINME.adoc b/EXPLAINME.adoc index afe402b..7b12526 100644 --- a/EXPLAINME.adoc +++ b/EXPLAINME.adoc @@ -1,99 +1,115 @@ // SPDX-License-Identifier: CC-BY-SA-4.0 -= Robodog ECM - Electronic Countermeasures & Defensive Technologies — Show Me The Receipts +// Owner: Jonathan D.A. Jewell += robodog-defensive-systems-lab — Evidence for Public Claims :toc: :icons: font -The README makes claims. This file backs them up with evidence from real code. +This file maps the README framing to repository artifacts. It is intentionally +limited to non-operational research claims: synthetic simulation, +communications resilience, secure coordination, autonomy-safety, and formal +interface boundaries. -== Core Claims & Evidence +== Core Claims and Evidence -=== Claim 1: "Cryptographic Protocol Suite: NIST Post-Quantum Standards" +=== Claim 1: Post-Quantum Cryptographic Families Are Represented + +The README describes research involving: -**From README** (line 56): ____ -* **Cryptography:** Kyber1024, Dilithium5, SPHINCS+ (NIST PQC standards) +ML-KEM, ML-DSA, and SLH-DSA, the NIST-standardised post-quantum cryptographic +families derived from the Kyber, Dilithium, and SPHINCS+ submissions. ____ -**Evidence**: `/var/mnt/eclipse/repos/robodog-ecm/src/crypto.rs` implements Kyber1024 (ML-KEM-1024), Dilithium5 (ML-DSA-87), SPHINCS+ via liboqs-rust bindings. Integration tests in `/var/mnt/eclipse/repos/robodog-ecm/tests/crypto_integration_test.rs` verify key exchange, signature generation, and serialization roundtrips. - -**Caveat**: Crypto implementations are *thin bindings* to liboqs (C library). No formal proofs of cryptographic correctness—only type-safe Rust wrappers around NIST reference implementations. +Evidence: `src/rust/src/lib.rs`, `src/abi/Crypto.idr`, and the Rust test suites +exercise post-quantum protocol interfaces and round-trip behaviour. -=== Claim 2: "Idris2 ABI + Zig FFI for Formal Verification" +Caveat: cryptographic completeness should be evaluated from the current source +and tests. This repository should not be read as claiming independently proven +cryptographic implementations. -**From README** (lines 51-52): -____ -| ABI | **Idris2** | Dependent-type interface proofs -| FFI | **Zig** | C-ABI bridge between ABI and core -____ +=== Claim 2: Formal and Interface Safety Boundaries Exist -**Evidence**: `/var/mnt/eclipse/repos/robodog-ecm/src/abi/` contains Idris2 type definitions for ECM signal classification (Types.idr), formation geometry (Formation.idr), and cryptographic operations (Crypto.idr). `/var/mnt/eclipse/repos/robodog-ecm/ffi/zig/src/main.zig` implements the Zig FFI layer exposing C-ABI functions that call into Rust core. +The README describes an Idris2 ABI layer, a Zig FFI layer, and Ada/SPARK safety +specifications. -**Caveat**: ABI proofs are *interface contracts only*. The Rust implementation (`src/ecm.rs`, `src/crypto.rs`) is NOT mechanically verified to match those contracts—correspondence is manual and property-tested via `/var/mnt/eclipse/repos/robodog-ecm/tests/` only. +Evidence: -=== Claim 3: "Export Control Compliance: Defensive Use Only" +* `src/abi/` contains Idris2 interface definitions for typed signal, + cryptographic, formation, and foreign-function boundaries. +* `ffi/zig/src/main.zig` contains the Zig FFI bridge. +* `src/spark/src/` contains SPARK specifications for bounded safety behaviour. -**From README** (lines 77-86): -____ -This project follows strict export control policies: -1. **No offensive capabilities** - Defensive technologies only -2. **No unauthorized export** - Compliance with ITAR/EAR regulations -3. **Documented use cases** - All implementations have defensive justification -4. **Access control** - Contributors must acknowledge export restrictions -____ +Caveat: these are boundary and specification artifacts. They do not make every +Rust implementation mechanically verified unless the relevant proof and test +coverage is present. -**Evidence**: `/var/mnt/eclipse/repos/robodog-ecm/EXPORT-CONTROL.md` documents compliance framework. `/var/mnt/eclipse/repos/robodog-ecm/Trustfile` (780 lines, 18 operational checks) enforces defensive-use constraints at build and runtime. +=== Claim 3: Publication Safety and Compliance Boundaries Are Documented -**Caveat**: Export control compliance depends on users *not* circumventing the code. Access control is voluntary (contributor acknowledgment). No cryptographic binding enforcement of "defensive use only" at execution time. +The README states that the public repository is non-operational and limited to +defensive research. -== Dogfooded Across The Account +Evidence: -Uses the hyperpolymath ABI/FFI standard (Idris2 ABI + Zig FFI + V API). Same architectural pattern across: -- https://github.com/hyperpolymath/proven-servers[proven-servers] — Protocol verification -- https://github.com/hyperpolymath/burble[burble] — Telecom control plane -- https://github.com/hyperpolymath/stapeln[stapeln] — Container validation -- https://github.com/hyperpolymath/valence-shell[valence-shell] — Reversible operations +* `README.adoc` defines the safety and publication boundary. +* `DEFENSIVE-USE.md` defines the repository use policy. +* `EXPORT-CONTROL.md` records compliance and export-control review context. +* `contractiles/trust/Trustfile.a2ml` records provenance, safety-boundary, and + compliance metadata checks. -All share: *Formal verification at boundaries, high-performance Rust inside, safe FFI exposed via Zig.* +Caveat: these policy files do not replace legal advice and do not authorise any +restricted activity. Contributors and users remain responsible for applicable +laws and institutional policies. == File Map [cols="1,3"] |=== -| Path | Contents & Purpose +| Path | Contents and Purpose -| `src/ecm.rs` | ECM signal analysis: FFT spectrum computation, signal detection, interference classification. No formal proofs—empirical algorithms. +| `src/rust/src/ecm/` +| Synthetic spectrum-awareness and interference-classification logic. Public + examples should use synthetic data only. -| `src/crypto.rs` | Post-quantum cryptography: Kyber1024 key encapsulation, Dilithium5 digital signatures, SPHINCS+ hash-based fallback. Thin bindings to liboqs. +| `src/rust/src/crypto/` +| Post-quantum secure-communication protocol experiments and wrappers. -| `src/formation.rs` | Formation control: 5 shapes (line, wedge, diamond, circle, grid), separation distance calculations, collision avoidance logic. Geometry functions but no formal proofs of safety. +| `src/rust/src/formation/` +| Formation geometry, separation checks, and coordination primitives for + bounded simulation. -| `src/autonomy.rs` | Defensive autonomy: safe-state transitions, threat detection, comms-loss recovery. State machines without formal model checking. +| `src/rust/src/autonomy/` +| Safe-state, communication-loss, and collision-avoidance behaviour. -| `src/abi/Types.idr` | Idris2 dependent types: ECMSignal (frequency, power, classification), Formation (shape, spacing, orientation), CryptoKey (algorithm, parameter witnesses). Interfaces only. +| `src/abi/` +| Idris2 interface contracts for typed boundaries and foreign interfaces. -| `src/abi/ECM.idr` | Idris2 ECM classification interface proving signal type correctness. +| `ffi/zig/` +| Zig FFI bridge and C-ABI-facing interface experiments. -| `src/abi/Formation.idr` | Idris2 formation geometry proofs: separation distance bounds, collision impossibility proofs. +| `src/spark/` +| Ada/SPARK safety specifications for selected safety boundaries. -| `src/abi/Crypto.idr` | Idris2 key exchange and signature interface contracts. +| `TEST-NEEDS.md` +| Test coverage report for synthetic, bounded research scenarios. -| `src/abi/Foreign.idr` | FFI boundary specification: C function declarations, parameter/return type contracts. +| `EXPORT-CONTROL.md` +| Export-control and publication-safety notice. -| `ffi/zig/src/main.zig` | Zig FFI bridge: C-ABI compatible runtime exposing signal classification, distance checks, formation validation. Calls into Rust implementations. +| `DEFENSIVE-USE.md` +| Defensive-use policy and out-of-scope list. -| `api/zig/` | ziguage public API: type mirrors of Idris2 ABI, query functions for classification and recommendations. - -| `spark/` | Ada/SPARK safety specs: formal specifications (not proofs) of ECM, formation, and autonomy safety invariants. - -| `tests/crypto_integration_test.rs` | Crypto roundtrip tests: key generation, encapsulation/decapsulation, signature generation/verification. - -| `tests/formation_test.rs` | Formation geometry validation: separation distance calculations, collision detection. +| `contractiles/trust/Trustfile.a2ml` +| Trust-boundary metadata and repository checks. +|=== -| `EXPORT-CONTROL.md` | Compliance framework: ITAR/EAR/Wassenaar categories, defensive justification, access control policy. +== Relationship to Other Work -| `Trustfile` | Comprehensive trust boundary specification (780 lines, 18 operational checks). -|=== +This repository shares the hyperpolymath pattern of formal boundaries with a +Rust implementation core and explicit FFI surfaces. The public positioning here +is narrower: synthetic simulation, resilience, secure coordination, safety +cases, and formal/interface boundaries. -== Questions? +== Questions -Open an issue or reach out at j.d.a.jewell@open.ac.uk — happy to explain the ECM architecture, formal verification boundaries, and export control design. +Open an issue or reach out at j.d.a.jewell@open.ac.uk for questions about the +research boundary, formal interface model, or compliance documentation. diff --git a/EXPORT-CONTROL.md b/EXPORT-CONTROL.md index 48e5a06..c0e6afb 100644 --- a/EXPORT-CONTROL.md +++ b/EXPORT-CONTROL.md @@ -1,15 +1,25 @@ + -# Export Control Compliance Framework +# Export Control and Publication-Safety Notice + +This repository is published as a non-operational defensive research repository. +It is limited to synthetic simulation, communications-resilience experiments, +secure coordination research, formation-safety checks, safe-state behaviour, and +formal/interface safety boundaries. + +Hardware-facing, RF-facing, field-test, or deployment-oriented work is outside +the public repository boundary unless separately reviewed for safety, legality, +and export-control compliance. ## Classification -This repository contains **dual-use defensive technologies** that may be -subject to export control regulations including: +This repository contains research artifacts that may be dual-use and may be +subject to export control regulations, including: - **UK Export Control Act 2002** and Strategic Export Control Lists -- **Wassenaar Arrangement** Category 5 (Information Security) and Category 11 (Military Electronics) +- **Wassenaar Arrangement** Category 5 (Information Security) and, for compliance review only, Category 11 contexts involving restricted electronics - **US ITAR** (International Traffic in Arms Regulations) — for reference only; UK law governs - **US EAR** (Export Administration Regulations) — for reference only; UK law governs @@ -17,28 +27,31 @@ subject to export control regulations including: | Category | Description | Control Status | |----------|-------------|----------------| -| ECM Signal Analysis | Spectrum analysis, interference detection | Dual-use (Wassenaar Cat 5) | -| Post-Quantum Cryptography | Kyber, Dilithium, SPHINCS+ protocols | Potentially controlled (Cat 5A2) | -| Formation Control | Distributed coordination for robotic systems | Dual-use (Cat 11) | -| Autonomous Navigation | Collision avoidance, threat response | Dual-use (Cat 11) | +| Defensive spectrum-awareness | Synthetic signal-environment modelling and interference classification | Dual-use review required | +| Post-quantum cryptography | ML-KEM, ML-DSA, and SLH-DSA protocol experiments | Potentially controlled (Cat 5A2) | +| Formation-safety checks | Distributed coordination safety for robotic systems | Dual-use review required | +| Autonomy safety | Collision avoidance, communication-loss handling, and safe-state behaviour | Dual-use review required | -## Defensive Use Only Policy +## Defensive Use and Publication Boundary ### Permitted Uses -1. **Defensive electronic countermeasures** — protecting communications from interception -2. **Search and rescue coordination** — multi-robot disaster response +1. **Synthetic signal-environment modelling** — simulation-only research data +2. **Communications resilience** — degradation testing for authorised systems 3. **Secure communications research** — post-quantum protocol design and analysis -4. **Academic research** — published, peer-reviewed defensive technology studies -5. **Civilian infrastructure protection** — spectrum monitoring and anomaly detection +4. **Formation-safety analysis** — separation checks and bounded coordination +5. **Safe-state research** — communication-loss and fault-response boundaries +6. **Civil resilience research** — search-and-rescue and disaster-response coordination in lawful, authorised settings +7. **Academic research** — published defensive safety and resilience studies ### Explicitly Prohibited Uses -1. **Offensive weapons systems** — targeting, kill chains, lethal autonomy -2. **Mass surveillance** — tracking, profiling, or monitoring individuals -3. **Offensive signal jamming** — disrupting civilian or emergency communications -4. **Autonomous lethal decision-making** — any system that decides to use force +1. **Weapons development** — weapon-control, payload-control, target acquisition, kill chains, or lethal autonomy +2. **Surveillance or tracking of individuals** — profiling, monitoring, or target-selection workflows +3. **Unlawful interference with communications** — including real-world jamming or disruption of civilian, emergency, or unauthorised systems +4. **Offensive autonomous behaviour** — evasion, intrusion, or systems that decide to use force 5. **Export to embargoed or sanctioned entities** — per UK/EU/UN sanctions lists +6. **Deployment by restricted or unlawful end users** ## Contributor Requirements @@ -56,17 +69,17 @@ All contributors must: - EU Consolidated Sanctions List - UN Security Council Sanctions Committees lists -3. **Ensure** their contributions serve exclusively defensive purposes +3. **Ensure** their contributions stay within the repository publication boundary ### Code Review Requirements All pull requests involving the following must receive explicit export control review: - New cryptographic algorithm implementations -- Signal processing or spectrum analysis modules -- Autonomous decision-making logic +- Signal processing, synthetic spectrum-awareness, or anomaly-classification modules +- Autonomous safety or safe-state logic - Formation control or swarm coordination protocols -- Any hardware interface code (SDR, sensors, actuators) +- Any hardware-facing, RF-facing, field-test, or deployment-oriented work ## Technical Controls @@ -75,7 +88,7 @@ All pull requests involving the following must receive explicit export control r All modules that handle controlled technology must include the annotation: ```rust -//! DEFENSIVE USE ONLY — Electronic countermeasures for protective applications. +//! DEFENSIVE USE ONLY — spectrum-awareness and resilience research. //! Export control classification: Wassenaar Category [X], UK ML [Y]. //! See EXPORT-CONTROL.md for compliance requirements. ``` diff --git a/Justfile b/Justfile index 3087e57..2eda92e 100644 --- a/Justfile +++ b/Justfile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: MPL-2.0 -# justfile — Build recipes for Robodog ECM +# justfile — Build recipes for robodog-ecm # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # Default recipe — list all available commands. @@ -31,7 +31,7 @@ test-rust: test-zig: cd ffi/zig && zig build test -# Run Trustfile operational checks. +# Run Trustfile repository checks. test-trust: bash contractiles/trust/run-checks.sh @@ -120,7 +120,7 @@ doctor: # Auto-repair common issues heal: - @echo "Attempting auto-repair for robodog-ecm..." + @echo "Attempting auto-repair for robodog-defensive-systems-lab..." @echo "Fixing permissions..." @find . -name "*.sh" -exec chmod +x {} \; 2>/dev/null || true @echo "Cleaning stale caches..." @@ -129,7 +129,7 @@ heal: # Guided tour of key features tour: - @echo "=== robodog-ecm Tour ===" + @echo "=== robodog-defensive-systems-lab Tour ===" @echo "" @echo "1. Project structure:" @ls -la @@ -144,12 +144,12 @@ tour: # Open feedback channel with diagnostic context help-me: - @echo "=== robodog-ecm Help ===" + @echo "=== robodog-defensive-systems-lab Help ===" @echo "Platform: $(uname -s) $(uname -m)" @echo "Shell: $SHELL" @echo "" @echo "To report an issue:" - @echo " https://github.com/hyperpolymath/robodog-ecm/issues/new" + @echo " https://github.com/hyperpolymath/robodog-defensive-systems-lab/issues/new" @echo "" @echo "Include the output of 'just doctor' in your report." diff --git a/QUICKSTART-DEV.adoc b/QUICKSTART-DEV.adoc index bfa2599..6a22c0a 100644 --- a/QUICKSTART-DEV.adoc +++ b/QUICKSTART-DEV.adoc @@ -1,7 +1,8 @@ // SPDX-License-Identifier: CC-BY-SA-4.0 +// Owner: Jonathan D.A. Jewell // Template: QUICKSTART-DEV.adoc — clone → build → test → PR -// Replace robodog-ecm, {{BUILD_CMD}}, {{TEST_CMD}}, {{LANG_STACK}} with actuals -= robodog-ecm — Quick Start for Developers +// Replace robodog-defensive-systems-lab, {{BUILD_CMD}}, {{TEST_CMD}}, {{LANG_STACK}} with actuals += robodog-defensive-systems-lab — Quick Start for Developers :toc: :toclevels: 2 @@ -29,8 +30,8 @@ nix develop [source,bash] ---- -git clone https://github.com/hyperpolymath/robodog-ecm.git -cd robodog-ecm +git clone https://github.com/hyperpolymath/robodog-defensive-systems-lab.git +cd robodog-defensive-systems-lab just setup-dev ---- @@ -52,7 +53,7 @@ just setup-dev [source] ---- -robodog-ecm/ +robodog-defensive-systems-lab/ ├── src/ # Source code ├── src/abi/ # Idris2 ABI definitions (if applicable) ├── ffi/zig/ # Zig FFI bridge (if applicable) @@ -107,5 +108,5 @@ Or read `0-AI-MANIFEST.a2ml` and `.claude/CLAUDE.md` directly. == Get Help * **Architecture**: link:EXPLAINME.adoc[EXPLAINME.adoc] -* **Wiki**: https://github.com/hyperpolymath/robodog-ecm/wiki +* **Wiki**: https://github.com/hyperpolymath/robodog-defensive-systems-lab/wiki * **Report issue**: `just help-me` diff --git a/QUICKSTART-MAINTAINER.adoc b/QUICKSTART-MAINTAINER.adoc index 61a8782..0cafa4b 100644 --- a/QUICKSTART-MAINTAINER.adoc +++ b/QUICKSTART-MAINTAINER.adoc @@ -1,14 +1,19 @@ // SPDX-License-Identifier: CC-BY-SA-4.0 -// Template: QUICKSTART-MAINTAINER.adoc — packaging, deploying, and maintaining -// Replace robodog-ecm, {{PACKAGE_NAME}}, {{DEPS}} with actuals -= robodog-ecm — Quick Start for Platform Maintainers +// Owner: Jonathan D.A. Jewell +// Template: QUICKSTART-MAINTAINER.adoc — packaging, installing, and maintaining +// Replace robodog-defensive-systems-lab, {{PACKAGE_NAME}}, {{DEPS}} with actuals += robodog-defensive-systems-lab — Quick Start for Platform Maintainers :toc: :toclevels: 2 == Overview -This guide covers packaging, deploying, and maintaining robodog-ecm for -distribution on your platform. +This guide covers packaging, local installation, verification, and maintenance +for robodog-defensive-systems-lab distribution on your platform. + +This is not field-deployment guidance. Any hardware-facing, RF-facing, +field-test, or restricted-end-user use requires separate safety, legal, and +export-control review before inclusion in the public repository. == Runtime Dependencies @@ -18,8 +23,8 @@ distribution on your platform. [source,bash] ---- -git clone https://github.com/hyperpolymath/robodog-ecm.git -cd robodog-ecm +git clone https://github.com/hyperpolymath/robodog-defensive-systems-lab.git +cd robodog-defensive-systems-lab just build-release ---- @@ -111,9 +116,9 @@ Or via OPSM: `opsm update {{PACKAGE_NAME}}` * `panic-attacker` scan results: link:INSTALL-SECURITY-REPORT.adoc[] * OpenSSF Scorecard: see badge in README -== Multi-Instance Deployment +== Multi-Instance Installation Layout -For deploying multiple instances (e.g., different users or tenants): +For installing multiple isolated instances (e.g., different users or tenants): [source,bash] ---- @@ -125,5 +130,5 @@ Each instance has isolated config, data, and logs. == Reporting Issues -* Upstream: https://github.com/hyperpolymath/robodog-ecm/issues +* Upstream: https://github.com/hyperpolymath/robodog-defensive-systems-lab/issues * With diagnostic: `just help-me` (pre-fills context) diff --git a/QUICKSTART-USER.adoc b/QUICKSTART-USER.adoc index d7bbd3d..6c03b77 100644 --- a/QUICKSTART-USER.adoc +++ b/QUICKSTART-USER.adoc @@ -1,13 +1,14 @@ // SPDX-License-Identifier: CC-BY-SA-4.0 +// Owner: Jonathan D.A. Jewell // Template: QUICKSTART-USER.adoc — 5-minute path to working software -// Replace robodog-ecm, Robodog Ecm — See README.adoc for details., just run, Robodog Ecm started successfully. with actuals -= robodog-ecm — Quick Start for Users +// Replace robodog-defensive-systems-lab, {{SUMMARY}}, just run, {{SUCCESS_MESSAGE}} with actuals += robodog-defensive-systems-lab — Quick Start for Users :toc: :toclevels: 2 -== What is robodog-ecm? +== What is robodog-defensive-systems-lab? -Robodog Ecm — See README.adoc for details. +Defensive spectrum-awareness, secure coordination, and autonomy-safety research. See README.adoc for details. == Prerequisites @@ -37,8 +38,8 @@ Before you begin, ensure you have: [source,bash] ---- # Clone and set up -git clone https://github.com/hyperpolymath/robodog-ecm.git -cd robodog-ecm +git clone https://github.com/hyperpolymath/robodog-defensive-systems-lab.git +cd robodog-defensive-systems-lab just setup ---- @@ -75,7 +76,7 @@ Expected output: [source] ---- -Robodog Ecm started successfully. +robodog-defensive-systems-lab started successfully. ---- == Self-Diagnostic @@ -102,7 +103,7 @@ just heal * **In-app**: `just run --help` * **Guided tour**: `just tour` * **Report a problem**: `just help-me` (pre-fills diagnostic context) -* **Wiki**: https://github.com/hyperpolymath/robodog-ecm/wiki +* **Wiki**: https://github.com/hyperpolymath/robodog-defensive-systems-lab/wiki == Uninstall diff --git a/README.adoc b/README.adoc index 24a0c1c..5f8c6a0 100644 --- a/README.adoc +++ b/README.adoc @@ -1,49 +1,100 @@ // SPDX-License-Identifier: CC-BY-SA-4.0 // SPDX-FileCopyrightText: 2025-2026 Jonathan D.A. Jewell -= Robodog ECM - Electronic Countermeasures & Defensive Technologies += robodog-defensive-systems-lab :toc: :toclevels: 3 -image:https://img.shields.io/badge/OpenSSF-Best_Practices-green?logo=opensourcesecurity[OpenSSF Best Practices,link="https://www.bestpractices.dev/en/projects/new?repo_url=https://github.com/hyperpolymath/robodog-ecm"] -image:https://img.shields.io/badge/License-MPL--2.0-blue.svg[License: PMPL-1.0,link="https://github.com/hyperpolymath/palimpsest-license"] +image:https://img.shields.io/badge/OpenSSF-Best_Practices-green?logo=opensourcesecurity[OpenSSF Best Practices,link="https://www.bestpractices.dev/en/projects/new?repo_url=https://github.com/hyperpolymath/robodog-defensive-systems-lab"] +image:https://img.shields.io/badge/License-MPL--2.0-blue.svg[License: MPL-2.0,link="LICENSE"] image:https://api.thegreenwebfoundation.org/greencheckimage/github.com[Green Web,link="https://www.thegreenwebfoundation.org/green-web-check/?url=github.com"] -image:https://img.shields.io/badge/Philosophy-Palimpsest-indigo.svg[Palimpsest,link="https://github.com/hyperpolymath/palimpsest-license"] -image:https://img.shields.io/badge/Export_Control-Defensive_Use_Only-orange.svg[Defensive Use Only] +image:https://img.shields.io/badge/Policy-Defensive_Use-orange.svg[Defensive Use Policy,link="DEFENSIVE-USE.md"] -**EXPORT CONTROL NOTICE:** This repository contains dual-use defensive technologies for Electronic Countermeasures (ECM), cryptography, and autonomous systems coordination. All content is for defensive applications only. See EXPORT-CONTROL.md for compliance requirements. +Defensive spectrum-awareness, secure coordination, and autonomy-safety research. + +== Safety and Publication Boundary + +This repository is intentionally limited to non-operational research artifacts: + +* synthetic data only; +* no real RF captures; +* no operational jamming procedures; +* no target-selection, tracking, or surveillance workflows; +* no weapon-control or payload-control logic; +* no instructions for unlawful interference with communications; +* no deployment guidance for military or restricted end users. + +Hardware-facing, RF-facing, or field-test work is out of scope for the public repository unless separately reviewed for safety, legality, and export-control compliance. == Overview -Robodog ECM is a research platform for defensive technologies including: +`robodog-defensive-systems-lab` is a defensive research repository for synthetic simulation, resilience testing, secure coordination, and autonomy-safety boundaries. + +The repository focuses on: + +* synthetic signal-environment modelling; +* communications-degradation resilience testing; +* secure communications for autonomous systems; +* formation-safety checks; +* safe-state behaviour; +* non-operational anomaly detection; +* formal/interface safety boundaries. + +Applications include civil resilience, search-and-rescue coordination, disaster-response robotics, secure autonomous-system research, and defensive safety analysis in lawful, authorised environments. + +ECM-related terminology in this repository is used in the limited sense of defensive spectrum-awareness, interference modelling, resilience, classification, and safety simulation. It is not used to describe operational interference, offensive activity, or field deployment guidance. + +== What This Repository Is + +This repository is a defensive research platform for autonomous-system resilience. It focuses on synthetic signal-environment modelling, secure communications, formation-safety checks, and safe-state behaviour for coordinated robotic systems. -* **Electronic Countermeasures (ECM)** - Signal jamming, interference detection, and spectrum management -* **Cryptographic Protocols** - Secure communications for autonomous systems -* **Formation Control** - Distributed coordination algorithms for robotic systems -* **Defensive Autonomy** - Collision avoidance, threat detection, and safe operation +ECM-related work is limited to non-operational simulation, detection, classification, resilience testing, and safety documentation. -**Primary Applications:** -- Defensive military applications (ECM, secure comms) -- Search and rescue coordination -- Disaster response robot swarms -- Secure autonomous system research +== What This Repository Is Not -**Explicitly NOT for:** -- Offensive weapons systems -- Surveillance or tracking of individuals -- Export to restricted countries -- Any use violating export control regulations +This repository is not a weapons project, surveillance project, operational ECM toolkit, RF attack toolkit, or deployment guide. + +It does not provide instructions for unlawful interference, real-world jamming, target tracking, evasion, intrusion, or offensive autonomous behaviour. Any examples are synthetic, constrained, and intended for safety analysis, resilience testing, and formally bounded research. == Relationship to Other Projects -**Separate from:** -- `anvomidav` - Figure skating choreography (civilian, export-safe) -- `robot-vacuum-cleaner` - Domestic robot simulation (civilian) +This repository is separate from: + +* `anvomidav` - figure-skating choreography and civilian motion modelling; +* `robot-vacuum-cleaner` - domestic robot simulation. + +It is related to broader research on: + +* safe formation geometry and separation checks; +* secure communication protocols for coordinated systems; +* autonomy safe-state behaviour under degraded communication; +* interface contracts and ABI safety boundaries. + +== Architecture + +The repository is organised around a simulation-first safety boundary: + +[cols="1,3"] +|=== +| Area | Role + +| Rust core +| Synthetic signal-environment models, communications-degradation classification, formation checks, and safe-state logic. + +| Ada/SPARK safety layer +| Formal specifications for safety-critical limits, separation constraints, communication-loss behaviour, and safe-state transitions. + +| Idris2 ABI layer +| Dependent-type interface contracts for data shapes, safety boundaries, and cross-language calling conventions. + +| Zig FFI layer +| C-ABI bridge for bounded interface experiments and type-mirror checks. + +| Trust and compliance files +| Publication-safety, export-control, provenance, and repository-policy documentation. +|=== -**Related to:** -- Formation control algorithms (defensive coordination) -- Autonomous navigation (safe operation) -- Cryptographic protocols (secure communications) +See link:TOPOLOGY.md[TOPOLOGY.md] for the architecture map and completion dashboard. == Technology Stack @@ -51,78 +102,87 @@ Robodog ECM is a research platform for defensive technologies including: |=== | Layer | Language | Purpose -| Core | **Rust** | ECM analysis, PQ crypto, formation control, autonomy -| Safety | **Ada/SPARK** | Formally verified safety-critical subsystems -| ABI | **Idris2** | Dependent-type interface proofs -| FFI | **Zig** | C-ABI bridge between ABI and core -| API | **zig** | Consumer-facing API surface +| Core | Rust | Synthetic spectrum-awareness modelling, secure coordination experiments, formation-safety checks, and safe-state behaviour +| Safety | Ada/SPARK | Formally specified safety-critical subsystems +| ABI | Idris2 | Dependent-type interface contracts and safety-boundary proofs +| FFI | Zig | C-ABI bridge between ABI definitions and implementation experiments +| API | Zig | Consumer-facing interface surface for bounded research workflows |=== -* **Cryptography:** Kyber1024, Dilithium5, SPHINCS+ (NIST PQC standards) -* **ECM Simulation:** Synthetic signal models (no real RF captures) -* **Coordination:** Potential-field collision avoidance, formation geometry +* Cryptography: ML-KEM, ML-DSA, and SLH-DSA, the NIST-standardised post-quantum cryptographic families derived from the Kyber, Dilithium, and SPHINCS+ submissions. +* Spectrum-awareness modelling: synthetic signal-environment data only; no real RF captures. +* Coordination: formation geometry, separation checks, communication-loss handling, and safe-state behaviour. -== Status +Implementation completeness should be evaluated from the code and tests, not inferred from roadmap terminology. -**Phase:** v0.1 Foundation -**Completion:** ~40% +== Current Status -**Implemented:** -- [x] ECM signal analysis (signals, detection, FFT spectrum) -- [x] Cryptographic protocol suite (Kyber1024, Dilithium5, SPHINCS+) -- [x] Formation control algorithms (5 shapes, separation checks) -- [x] Defensive autonomy (collision avoidance, safe-state, comms loss) -- [x] Export control compliance framework (ITAR/EAR/Wassenaar) -- [x] SPARK safety specs (ECM, formation, autonomy) -- [x] Idris2 ABI definitions (Types, ECM, Crypto, Formation, Foreign) -- [x] Zig FFI bridge (classification, distance, formation) -- [x] zig API (full type mirror, classification, recommendations) -- [x] Comprehensive Trustfile (780 lines, 18 operational checks) +Phase: v0.1 Foundation -== Export Control Compliance +Completion: approximately 40% -This project follows strict export control policies: +Implemented or partially implemented: -1. **No offensive capabilities** - Defensive technologies only -2. **No unauthorized export** - Compliance with ITAR/EAR regulations -3. **Documented use cases** - All implementations have defensive justification -4. **Access control** - Contributors must acknowledge export restrictions +* synthetic signal analysis and interference classification; +* post-quantum cryptographic protocol experiments; +* formation geometry and separation checks; +* safe-state and communications-loss behaviour; +* export-control and publication-safety documentation; +* SPARK safety specifications for spectrum-awareness, formation, and autonomy boundaries; +* Idris2 ABI definitions for typed interfaces; +* Zig FFI bridge experiments for classification, distance, and formation checks; +* Trustfile-based repository checks for provenance, safety boundaries, and compliance metadata. -See `EXPORT-CONTROL.md` for full compliance requirements. +== Compliance and Export-Control Notice -== Development Roadmap +This repository may contain dual-use research artifacts involving cryptography, autonomous-system coordination, spectrum-awareness modelling, and safety analysis. It is published as non-operational research and is subject to the safety and publication boundary above. -=== v0.1 - Foundation (Q1 2026) -- [ ] Export control compliance framework -- [ ] Cryptographic protocol design -- [ ] ECM signal analysis basics -- [ ] Formation control primitives +Users and contributors are responsible for complying with all applicable laws, sanctions regimes, institutional policies, and export-control requirements. Nothing in this repository is legal advice or an authorisation to perform restricted activity. -=== v0.2 - Core Technologies (Q2 2026) -- [ ] SDR integration for ECM testing -- [ ] Secure communication protocols -- [ ] Distributed coordination algorithms -- [ ] Threat detection models +See link:EXPORT-CONTROL.md[EXPORT-CONTROL.md] for the compliance notice and link:DEFENSIVE-USE.md[DEFENSIVE-USE.md] for repository use policy. -=== v0.3 - Integration (Q3 2026) -- [ ] Multi-agent simulation -- [ ] Hardware-in-the-loop testing -- [ ] Secure key distribution -- [ ] Performance benchmarks +== Roadmap -== License +=== v0.1 - Foundation -MPL-2.0 (Palimpsest License) +* Export-control and publication-safety documentation +* Synthetic signal-environment modelling +* Cryptographic protocol design +* Formation-safety primitives +* Safe-state and communications-loss behaviour +* Interface and ABI safety boundaries -== Authors +=== v0.2 - Core Technologies -Jonathan D.A. Jewell +* Synthetic signal-environment simulator +* Communications-degradation resilience tests +* Secure communication protocol experiments +* Formation-safety verification +* Non-operational anomaly-detection models +* Export-control and publication-safety review before any hardware-facing work -== Acknowledgments +=== v0.3 - Integration -This research is conducted in accordance with international export control regulations and ethical guidelines for defensive autonomous systems. +* Multi-agent simulation +* Safety-case dashboard +* Secure key-distribution simulation +* Performance benchmarks on synthetic data +* Hardware-in-the-loop planning document only, subject to separate compliance review +== License and Use Policy -== Architecture +Code license: MPL-2.0, unless otherwise stated in individual files. + +Additional repository policy: see link:DEFENSIVE-USE.md[DEFENSIVE-USE.md]. + +Compliance notice: see link:EXPORT-CONTROL.md[EXPORT-CONTROL.md]. + +The defensive-use and export-control notices describe project policy and publication boundaries. They should not be confused with the OSI status of the code license. + +== Authors + +Jonathan D.A. Jewell + +== Acknowledgments -See link:TOPOLOGY.md[TOPOLOGY.md] for a visual architecture map and completion dashboard. +This research is maintained with explicit publication-safety, export-control, and autonomy-safety boundaries for defensive and civil-resilience research. diff --git a/TEST-NEEDS.md b/TEST-NEEDS.md index e9b0984..36c3487 100644 --- a/TEST-NEEDS.md +++ b/TEST-NEEDS.md @@ -1,4 +1,10 @@ -# CRG C Test Coverage Report — Robodog ECM + + + +# CRG C Test Coverage Report — robodog-defensive-systems-lab + +Publication boundary: this report describes synthetic, non-operational tests for +defensive spectrum-awareness, secure coordination, and autonomy-safety research. ## CRG Grade: C — ACHIEVED 2026-04-04 @@ -35,17 +41,17 @@ CRG C requires comprehensive test coverage across all dimensions: - **Profile.release optimized** (LTO enabled, 1 codegen unit) ### ✅ Property-Based Tests (proptest) -- **Signal value ranges** — Frequencies, bandwidths, SNR all bounded +- **Signal value ranges** — Synthetic frequencies, bandwidths, SNR all bounded - **Deterministic classification** — Same signal always yields same classification - **Formation positioning** — Correct agent count, non-NaN coordinates -- **Crypto reversibility** — Kyber1024 encap/decap and Dilithium5/SPHINCS+ sign/verify +- **Crypto reversibility** — ML-KEM encapsulation/decapsulation and ML-DSA/SLH-DSA sign/verify wrappers - **Position geometry** — Distance non-negative, triangle inequality holds - **Autonomy decisions** — Always produce valid DefensiveAction variants - **Separation checks** — Commutative, symmetric, no self-violations ### ✅ E2E Tests (5 scenarios) - **SAR mission with clear spectrum** — Full crypto + formation + autonomy pipeline -- **Formation under ECM attack** — Jammer detection → classification → human control +- **Formation under synthetic interference** — Anomaly classification → human review - **Communication loss** — Triggers safe-state transition - **Signal analysis pipeline** — Synthetic signal → FFT → peak detection - **Crypto fallback** — Primary (Kyber1024 + Dilithium5) + SPHINCS+ backup @@ -61,7 +67,7 @@ CRG C requires comprehensive test coverage across all dimensions: - **Pre-conditions** — Agents provided, thresholds valid - **Post-conditions** — Valid outputs only (no panics, no invalid states) - **Parameter consistency** — Safety params, detection thresholds internally valid -- **Signal spectrum** — Count methods agree, jamming detection reliable +- **Signal spectrum** — Count methods agree, anomaly classification is consistent - **Crypto key sizes** — Kyber public/secret keys have reasonable byte lengths ### ✅ Aspect Tests (15 tests) @@ -75,13 +81,13 @@ CRG C requires comprehensive test coverage across all dimensions: **Signal Processing:** - `signal_generate_iq_4096` — IQ sample generation - `power_spectrum_4096` — FFT spectrum analysis -- `signal_classification` — Rule-based threat detection +- `signal_classification` — Rule-based non-operational anomaly classification **Cryptography:** -- `kyber1024_keygen` — Post-quantum key generation -- `kyber1024_encap` — Key encapsulation -- `kyber1024_decap` — Decapsulation -- `dilithium5_sign` — Digital signature generation +- `kyber1024_keygen` — ML-KEM-family key generation wrapper +- `kyber1024_encap` — ML-KEM-family key encapsulation wrapper +- `kyber1024_decap` — ML-KEM-family decapsulation wrapper +- `dilithium5_sign` — ML-DSA-family digital signature wrapper **Formation & Autonomy:** - `position_distance` — 3D distance calculation @@ -156,7 +162,7 @@ cargo bench --manifest-path src/rust/Cargo.toml | Aspect tests | ✅ 15 cross-cutting concern tests | | Benchmarks | ✅ 12 criterion baselines established | -**Conclusion: ROBODOG-ECM ACHIEVES CRG C GRADE** +**Conclusion: robodog-defensive-systems-lab achieves CRG C grade for synthetic, bounded research tests.** --- diff --git a/TOPOLOGY.md b/TOPOLOGY.md index db3e321..05c260f 100644 --- a/TOPOLOGY.md +++ b/TOPOLOGY.md @@ -1,15 +1,21 @@ + - + -# Robodog ECM — Project Topology +# robodog-defensive-systems-lab — Project Topology + +Publication boundary: this topology describes synthetic simulation, +communications resilience, secure coordination, and autonomy-safety research. +It is not a deployment architecture for fielded RF, surveillance, weapon, or +restricted-end-user systems. ## System Architecture ``` ┌─────────────────────────────────────────────┐ - │ OPERATOR / COMMAND │ - │ (Mission Control / SDR Interface) │ + │ SIMULATION / RESEARCH CONTROL │ + │ (Synthetic Scenario Interface) │ └──────────────────┬──────────────────────────┘ │ ▼ @@ -33,7 +39,7 @@ │ autonomy/ │ │ separation, comms │ │ │ │ │ │ loss, safe-state │ │ Dependent types: │ │ PQ crypto, │ │ │ │ key sizes, bands, │ -│ signal FFT, │ │ No: Suppress, │ │ no offensive types │ +│ synthetic FFT, │ │ No: Suppress, │ │ no offensive types │ │ formation geom, │ │ Unchecked_*, │ │ │ │ collision avoid │ │ believe_me │ │ No: partial, │ └──────────────────┘ └────────────────────────┘ │ believe_me, │ @@ -54,19 +60,19 @@ COMPONENT STATUS NOTES ───────────────────────────────── ────────────────── ───────────────────────────────── RUST CORE (src/rust/) - ECM Signal Analysis ████░░░░░░ 40% Signals, detection, FFT spectrum - Cryptographic Protocols ████░░░░░░ 40% Kyber1024, Dilithium5, SPHINCS+ + Synthetic Spectrum Awareness ████░░░░░░ 40% Synthetic signals, classification, FFT spectrum + Cryptographic Protocols ████░░░░░░ 40% ML-KEM, ML-DSA, SLH-DSA-family wrappers Formation Control Algorithms ████░░░░░░ 40% 5 shapes, separation checks Defensive Autonomy Logic ████░░░░░░ 40% Collision avoid, safe-state, comms SPARK SAFETY (src/spark/) - ECM Safety Proofs ███░░░░░░░ 30% Band bounds, power limits + Spectrum-Awareness Safety Specs ███░░░░░░░ 30% Band bounds, power limits Formation Safety Proofs ███░░░░░░░ 30% Separation distance Autonomy Safety Proofs ███░░░░░░░ 30% Comms timeout, speed, safe-state IDRIS2 ABI (src/abi/) Core Types ████░░░░░░ 40% Frequency, modulation, signals - ECM Types ████░░░░░░ 40% Power bounds, snapshots + Spectrum-Awareness Types ████░░░░░░ 40% Power bounds, synthetic snapshots Crypto Types ████░░░░░░ 40% Key sizes, PQ algorithms Formation Types ███░░░░░░░ 30% Coordinates, separation proofs FFI Declarations ███░░░░░░░ 30% Zig bridge bindings @@ -75,12 +81,12 @@ ZIG API + FFI (ffi/zig/) Signal Classification ████░░░░░░ 40% 3 rules, band checking Distance / Separation █████░░░░░ 50% Ground + aerial, integer math Formation Computation ███░░░░░░░ 30% Line + circle, rest TBD - ECM API ████░░░░░░ 40% Full type mirror, classify, recommend + Spectrum-Awareness API ████░░░░░░ 40% Type mirror, classify, recommend ABI Verification Types ███░░░░░░░ 30% Round-trip proofs INFRASTRUCTURE - Export Control Framework ██████████ 100% ITAR/EAR/Wassenaar documented - Trustfile.a2ml ██████████ 100% 780 lines, 18 checks, sealed + Export Control Framework ██████████ 100% Compliance and publication-safety context + Trustfile.a2ml ██████████ 100% Repository trust and safety-boundary checks .machine_readable/ ██████████ 100% STATE tracking active 0-AI-MANIFEST.a2ml ██████████ 100% AI entry point verified Generated C Header ██████████ 100% robodog_ffi.h @@ -88,7 +94,7 @@ INFRASTRUCTURE REPO INFRASTRUCTURE Justfile Automation ████████░░ 80% Build tasks configured CI/CD Workflows ██████████ 100% 17 standard workflows - Documented Use Cases ██████████ 100% Defensive justification complete + Publication Boundary ██████████ 100% Defensive research scope documented ───────────────────────────────────────────────────────────────────────────── OVERALL: ████░░░░░░ ~40% v0.1 Foundation diff --git a/contractiles/README.adoc b/contractiles/README.adoc index 779d0af..3d4fb21 100644 --- a/contractiles/README.adoc +++ b/contractiles/README.adoc @@ -1,8 +1,12 @@ -= Robodog ECM — Contractiles +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Owner: Jonathan D.A. Jewell + += robodog-defensive-systems-lab — Contractiles :toc: :sectnums: -Operational contracts for the Robodog ECM defensive technologies platform. +Publication-safety, trust-boundary, and repository-policy contracts for the +robodog-defensive-systems-lab defensive research repository. == Contract Types @@ -13,15 +17,15 @@ Operational contracts for the Robodog ECM defensive technologies platform. | **Must** | `must/Mustfile` | Mandatory invariants — build, test, lint, export control, SPDX headers | **Trust** | `trust/Trustfile.a2ml` | Integrity verification — secrets, provenance, crypto, export control, formal verification (780 lines, 18 checks) | **Dust** | `dust/Dustfile` | Recovery and rollback — key compromise, safety violations, ABI drift, container rollback -| **Lust** | `lust/Intentfile` | Future intent — v0.2/v0.3 roadmap for ECM, crypto, formation, containers -| **K9** | `k9/*.k9.ncl` | Nickel-based deployment and validation specs at Kennel/Yard/Hunt trust levels +| **Lust** | `lust/Intentfile` | Future intent — v0.2/v0.3 roadmap for synthetic modelling, crypto, formation, and container packaging +| **K9** | `k9/*.k9.ncl` | Nickel-based package and validation specs at Kennel/Yard/Hunt trust levels |=== == Execution [source,bash] ---- -# Run all Trustfile operational checks +# Run all Trustfile repository checks bash contractiles/trust/run-checks.sh # Run Mustfile invariants (via Justfile) diff --git a/contractiles/dust/Dustfile b/contractiles/dust/Dustfile index 81474ce..5ef4d21 100644 --- a/contractiles/dust/Dustfile +++ b/contractiles/dust/Dustfile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: MPL-2.0 -# Dustfile — Recovery and rollback semantics for Robodog ECM +# Dustfile — Recovery and rollback semantics for robodog-defensive-systems-lab # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) version: 1 @@ -25,14 +25,14 @@ recovery: container-supply-chain: - name: container-rollback - event: "deploy.failure" + event: "release.failure" undo: "ct verify && ct push " notes: "Rollback to previous cerro-torre bundle. Verify signature before push." trustfile-failure: - name: trustfile-block event: "trustfile.critical.failure" - undo: "Build and deploy are blocked until all critical checks pass." + undo: "Build and release are blocked until all critical checks pass." notes: "No bypass. Fix the source, don't suppress the check." export-control-violation: diff --git a/contractiles/must/Mustfile b/contractiles/must/Mustfile index 2a6a339..23bf6f6 100644 --- a/contractiles/must/Mustfile +++ b/contractiles/must/Mustfile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: MPL-2.0 -# Mustfile — Mandatory invariants for Robodog ECM +# Mustfile — Mandatory invariants for robodog-defensive-systems-lab # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) version: 1 @@ -7,11 +7,11 @@ version: 1 metadata: name: robodog-ecm-state-contract spec: v0.1.0 - description: "Invariant checks for the Robodog ECM defensive technologies platform." + description: "Invariant checks for the robodog-defensive-systems-lab defensive research repository." checks: - name: trustfile-passes - description: "All Trustfile operational checks must pass (zero critical failures)." + description: "All Trustfile repository checks must pass (zero critical failures)." run: "bash contractiles/trust/run-checks.sh" - name: rust-compiles @@ -40,4 +40,4 @@ checks: - name: spdx-on-source description: "All source files have SPDX license headers." - run: "! find src/ api/ ffi/ -type f \\( -name '*.rs' -o -name '*.v' -o -name '*.idr' -o -name '*.ads' -o -name '*.adb' -o -name '*.zig' \\) | xargs grep -L 'SPDX-License-Identifier' 2>/dev/null | head -1 | grep -q ." + run: "! find src/abi src/spark/src src/rust/src src/rust/tests src/rust/benches ffi/zig/src ffi/zig/test -type f 2>/dev/null | grep -E '[.](rs|v|idr|ads|adb|zig)$' | xargs grep -L 'SPDX-License-Identifier' 2>/dev/null | head -1 | grep -q ." diff --git a/contractiles/trust/Trustfile.a2ml b/contractiles/trust/Trustfile.a2ml index a3f9b64..bcce600 100644 --- a/contractiles/trust/Trustfile.a2ml +++ b/contractiles/trust/Trustfile.a2ml @@ -1,13 +1,13 @@ # SPDX-License-Identifier: MPL-2.0 # ============================================================================= -# Trustfile.a2ml — Robodog ECM: Electronic Countermeasures & Defensive Technologies -# Comprehensive trust contract for dual-use defensive research platform. +# Trustfile.a2ml — robodog-defensive-systems-lab: Defensive Spectrum-Awareness and Autonomy Safety +# Trust contract for a non-operational defensive research repository. # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # ============================================================================= --- ### [META] -id: "did:web:github.com:hyperpolymath:robodog-ecm" +id: "did:web:github.com:hyperpolymath:robodog-defensive-systems-lab" version: "0.1.0" context: - "https://a2ml.org/ns/v2" @@ -30,7 +30,7 @@ meta: -----BEGIN HYBRID SIGNATURE----- BASE64_Ed448+Dilithium5_SIGNATURE_OF_THIS_FILE -----END HYBRID SIGNATURE----- - signedBy: "did:web:github.com:hyperpolymath:robodog-ecm#primary-sig" + signedBy: "did:web:github.com:hyperpolymath:robodog-defensive-systems-lab#primary-sig" proof: "src/abi/Proofs/Trustfile.idr" fallbackSignature: algorithm: "SPHINCS+" @@ -42,9 +42,9 @@ meta: sha3-512: "HEX_SHA3_512_OF_THIS_FILE" shake256: "BASE32_SHAKE256_OF_THIS_FILE" ci_cd: - github_actions: "https://github.com/hyperpolymath/robodog-ecm/blob/main/.github/workflows/trustfile.yml" + github_actions: "https://github.com/hyperpolymath/robodog-defensive-systems-lab/blob/main/.github/workflows/trustfile.yml" gitbot_fleet: "https://gitbot-fleet.hyperpolymath.dev/hooks/trustfile" - hypatia_scan: "https://hypatia.scans/repos/robodog-ecm" + hypatia_scan: "https://hypatia.scans/repos/robodog-defensive-systems-lab" automation: hashing: ["SHA3-512", "SHAKE256", "BLAKE3"] diffing: "alert-on-unexpected-changes" @@ -53,10 +53,10 @@ meta: --- ### [EXPORT_CONTROL] overview: | - This project contains dual-use defensive technologies subject to export - control regulations. All technology development is constrained to defensive - applications only. Offensive capabilities are structurally excluded by - formal verification (Idris2 dependent types + SPARK proofs). + This project contains dual-use defensive research artifacts that may be + subject to export control regulations. Public artifacts are constrained to + synthetic simulation, resilience testing, secure coordination, formation + safety, safe-state behaviour, and interface safety boundaries. classification: primary_framework: "UK Export Control Act 2002" @@ -68,36 +68,38 @@ classification: description: "Information Security — Cryptographic systems" components: ["src/rust/src/crypto/", "src/abi/Crypto.idr"] notes: | - Post-quantum cryptographic implementations (Kyber1024, Dilithium5, - SPHINCS+) for secure autonomous system communications. Open-source - publication may qualify for research/public domain exemptions under - Wassenaar Note 3 to Category 5 Part 2. + Post-quantum cryptographic research involving ML-KEM, ML-DSA, and + SLH-DSA families derived from the Kyber, Dilithium, and SPHINCS+ + submissions. Open-source publication may qualify for research/public + domain exemptions under Wassenaar Note 3 to Category 5 Part 2. - id: "11" - description: "Military Electronics" + description: "Restricted electronics compliance context" components: ["src/rust/src/ecm/", "src/rust/src/formation/", "src/rust/src/autonomy/", "src/spark/"] notes: | - ECM signal analysis, formation control, and defensive autonomy. - Limited to defensive countermeasures (jamming detection, spectrum - monitoring, collision avoidance). No targeting or offensive systems. + Synthetic spectrum-awareness, formation-safety checks, and safe-state + autonomy boundaries. Limited to defensive simulation, interference + classification, resilience testing, and safety documentation. No + target-selection, surveillance, weapon-control, or offensive systems. defensive_only_policy: permitted: - - "Defensive electronic countermeasures (communications protection)" + - "Synthetic signal-environment modelling" + - "Communications-degradation resilience testing" - "Search and rescue multi-robot coordination" - "Post-quantum secure communications research" - - "Civilian infrastructure spectrum monitoring" + - "Civilian infrastructure resilience research" - "Academic research (published, peer-reviewed)" prohibited: - - "Offensive weapons systems or targeting" - - "Mass surveillance or individual tracking" - - "Offensive signal jamming (disrupting civilian/emergency comms)" + - "Weapons systems, weapon-control, payload-control, or target acquisition" + - "Surveillance, tracking, profiling, or target-selection workflows" + - "Unlawful interference with communications" - "Autonomous lethal decision-making" - "Export to embargoed/sanctioned entities" enforcement: source_level: "DEFENSIVE USE ONLY annotation required on all controlled modules" ci_cd: "hypatia-scan offensive-terminology check on every push" formal: "Idris2 types structurally exclude offensive capability construction" - build: "Trustfile verification mandatory before any build or deployment" + build: "Trustfile verification mandatory before any package release" contributor_requirements: acknowledgment: "Export-Control-Acknowledged: yes (in first commit message)" @@ -114,9 +116,9 @@ security: --- ### [THREAT_MODEL] overview: | - Threat model for a defensive ECM research platform. Primary threats are - supply chain compromise, signal interception of research outputs, and - misuse of dual-use technology. Standard web threats (DDoS, XSS) are + Threat model for a non-operational defensive research repository. Primary + risks are supply-chain compromise, leakage of restricted research artifacts, + and misuse of dual-use technology. Standard web threats (DDoS, XSS) are secondary — this is primarily a local-build research codebase. adversaries: @@ -131,7 +133,7 @@ adversaries: - "SPARK proofs → Formal verification of safety-critical code paths." - type: "Quantum Adversary" - description: "Nation-state with quantum computing capability targeting crypto protocols" + description: "Nation-state with quantum computing capability focused on crypto protocols" mitigations: - "Kyber1024 + Dilithium5 → PQ-resistant key exchange and signatures." - "SPHINCS+ fallback → Hash-based signature crypto agility." @@ -175,7 +177,7 @@ adversaries: --- ### [FORMAL_VERIFICATION] overview: | - Robodog ECM uses a two-tier formal verification strategy: + robodog-defensive-systems-lab uses a two-tier formal verification strategy: 1. Idris2 dependent types for ABI correctness (interface-level proofs) 2. SPARK/Ada for safety-critical runtime code (implementation-level proofs) This combination ensures that both the protocol contracts AND the @@ -236,7 +238,7 @@ spark: --- ### [TRUSTFILE_KEYS] -issuer: "did:web:github.com:hyperpolymath:robodog-ecm" +issuer: "did:web:github.com:hyperpolymath:robodog-defensive-systems-lab" keys: - id: "#primary-sig" type: "HybridKey2024" @@ -415,10 +417,10 @@ deployment: spec_file: "container/deploy.k9.ncl" trust_level: "Hunt" description: | - k9-svc deployment at Hunt trust level. Full pedigree + Package-release validation at Hunt trust level. Full pedigree (L1-L5: identity, target, security, validation, recipes). - Requires cryptographic handshake before execution. - Export control metadata checked before deployment. + Requires cryptographic handshake before release. + Export control metadata checked before release. security: proof: "src/abi/Proofs/ContainerDeployment.idr" ci_cd: "validate-k9-pedigree-on-push" @@ -426,9 +428,9 @@ deployment: --- ### [SPECTRUM_SECURITY] overview: | - ECM-specific security controls for signal analysis and spectrum - management. All spectrum operations are simulation-only — no raw - RF captures are stored in this repository. + Defensive spectrum-awareness controls for synthetic signal analysis and + resilience simulation. All spectrum operations are simulation-only — no + raw RF captures are stored in this repository. simulation_only: policy: "No real RF spectrum data in repository. Simulation models only." @@ -442,10 +444,10 @@ signal_types: - name: "Narrowband Interference" classification: "Uncontrolled (defensive analysis)" module: "src/rust/src/ecm/signals.rs" - - name: "Wideband Jamming Patterns" - classification: "Wassenaar Cat 11 (defensive countermeasure)" - module: "src/rust/src/ecm/jamming.rs" - - name: "Frequency Hopping Detection" + - name: "Wideband Synthetic Interference Patterns" + classification: "Wassenaar Cat 11 review context (defensive simulation)" + module: "src/rust/src/ecm/detection.rs" + - name: "Frequency-Hopping Pattern Classification" classification: "Wassenaar Cat 5A2 / Cat 11" module: "src/rust/src/ecm/detection.rs" @@ -456,11 +458,11 @@ frequency_policy: - range: "30-300 MHz (VHF)" notes: "Formation communication simulation" - range: "300 MHz-3 GHz (UHF)" - notes: "General purpose ECM simulation" + notes: "General purpose synthetic spectrum simulation" - range: "3-30 GHz (SHF)" - notes: "Radar countermeasure simulation" + notes: "High-frequency synthetic propagation models" prohibited_real_captures: - - "Military bands (unless explicitly authorised)" + - "Restricted bands unless explicitly authorised after legal review" - "Emergency services frequencies" - "Satellite downlink bands" - "Any band requiring Ofcom licence for passive monitoring" @@ -512,7 +514,7 @@ safety_invariants: human_control: policy: "Human-on-the-loop minimum. Human-in-the-loop for any action affecting other agents." - override: "Physical kill switch required for any hardware deployment." + override: "Hardware-facing work requires separate safety, legal, and export-control review before public inclusion." audit: "All autonomous decisions logged with full decision chain." security: @@ -522,7 +524,7 @@ security: --- ### [CI_CD] github_actions: - name: "Robodog ECM CI" + name: "robodog-defensive-systems-lab CI" on: ["push", "pull_request"] jobs: trustfile_verify: @@ -627,7 +629,8 @@ integrity: --- ### [OPERATIONAL_CHECKS] -# These are the executable verification checks run by the Trustfile. +# Historical tooling section name retained for parser compatibility. +# These are repository-safety verification checks, not operational deployment guidance. # Each check is a shell command that returns 0 on success, non-zero on failure. # ── Secrets ────────────────────────────────────────────────────────────────── @@ -655,13 +658,13 @@ integrity: - severity: warning ### license-content -- description: LICENSE contains PMPL identifier -- run: grep -q 'PMPL' LICENSE +- description: LICENSE contains Mozilla Public License Version 2.0 text +- run: grep -q 'Mozilla Public License Version 2.0' LICENSE - severity: warning ### spdx-headers-present - description: All source files have SPDX headers -- run: "! find src/ api/ ffi/ -type f \\( -name '*.rs' -o -name '*.v' -o -name '*.idr' -o -name '*.ads' -o -name '*.adb' -o -name '*.zig' \\) 2>/dev/null | xargs grep -L 'SPDX-License-Identifier' 2>/dev/null | head -1 | grep -q ." +- run: "! find src/abi src/spark/src src/rust/src src/rust/tests src/rust/benches ffi/zig/src ffi/zig/test -type f 2>/dev/null | grep -E '[.](rs|v|idr|ads|adb|zig)$' | xargs grep -L 'SPDX-License-Identifier' 2>/dev/null | head -1 | grep -q ." - severity: warning # ── Export Control ──────────────────────────────────────────────────────────── @@ -742,7 +745,7 @@ primary: -----BEGIN HYBRID SIGNATURE----- BASE64_Ed448+Dilithium5_SIGNATURE_OF_THIS_FILE -----END HYBRID SIGNATURE----- - signedBy: "did:web:github.com:hyperpolymath:robodog-ecm#primary-sig" + signedBy: "did:web:github.com:hyperpolymath:robodog-defensive-systems-lab#primary-sig" proof: "src/abi/Proofs/Signature.idr" fallback: algorithm: "SPHINCS+" @@ -753,7 +756,7 @@ fallback: proof: "src/abi/Proofs/SignatureFallback.idr" --- -### [DEPLOYMENT] +### [PUBLICATION_RELEASE] 1. Replace all `BASE64_*` and `HEX_*` placeholders with real values. 2. Generate Idris2 proofs: ```bash @@ -772,7 +775,7 @@ fallback: sha3sum -a 512 contractiles/trust/Trustfile.a2ml shake256sum contractiles/trust/Trustfile.a2ml ``` -6. Verify all operational checks pass: +6. Verify all repository checks pass: ```bash bash contractiles/trust/run-checks.sh ``` diff --git a/contractiles/trust/run-checks.sh b/contractiles/trust/run-checks.sh index 6c9a92b..a716fb4 100755 --- a/contractiles/trust/run-checks.sh +++ b/contractiles/trust/run-checks.sh @@ -1,10 +1,11 @@ #!/usr/bin/env bash # SPDX-License-Identifier: MPL-2.0 -# run-checks.sh — Execute all Trustfile operational checks +# run-checks.sh — Execute all Trustfile repository checks # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # -# Parses the [OPERATIONAL_CHECKS] section of Trustfile.a2ml and runs each -# check sequentially. Exits non-zero if any critical check fails. +# Parses the legacy [OPERATIONAL_CHECKS] section of Trustfile.a2ml and runs +# each repository-safety check sequentially. Exits non-zero if any critical +# check fails. TRUSTFILE="$(dirname "$0")/Trustfile.a2ml" FAILED=0 @@ -24,7 +25,7 @@ else fi echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}" -echo -e "${CYAN}║ Robodog ECM — Trustfile Operational Checks ║${NC}" +echo -e "${CYAN}║ robodog-defensive-systems-lab — Repository Checks ║${NC}" echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}" echo "" @@ -142,7 +143,7 @@ echo -e "${CYAN}───────────────────── if [[ $CRITICAL_FAILED -gt 0 ]]; then echo -e "\n${RED}BLOCKED: ${CRITICAL_FAILED} critical check(s) failed.${NC}" - echo -e "${RED}Build/deploy is not permitted until all critical checks pass.${NC}" + echo -e "${RED}Build/release is not permitted until all critical checks pass.${NC}" exit 1 fi diff --git a/docs/troubleshooting.adoc b/docs/troubleshooting.adoc index ff0c04e..0a43eed 100644 --- a/docs/troubleshooting.adoc +++ b/docs/troubleshooting.adoc @@ -1,4 +1,5 @@ // SPDX-License-Identifier: CC-BY-SA-4.0 +// Owner: Jonathan D.A. Jewell // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <6759885+hyperpolymath@users.noreply.github.com> = Troubleshooting — robodog-ecm :revdate: 2026-MM-DD @@ -53,5 +54,5 @@ just log-tail # last N lines of logs * `docs/architecture.adoc` — internals. * `docs/decisions/` — historical record of why things are this shape. -* `https://github.com/hyperpolymath/robodog-ecm/issues?q=is%3Aissue+` — has anyone hit this before? +* `https://github.com/hyperpolymath/robodog-defensive-systems-lab/issues?q=is%3Aissue+` — has anyone hit this before? * `https://github.com/hyperpolymath/standards/issues` — for estate-wide problems. diff --git a/ffi/zig/test/integration_test.zig b/ffi/zig/test/integration_test.zig index bf44d7d..64e476d 100644 --- a/ffi/zig/test/integration_test.zig +++ b/ffi/zig/test/integration_test.zig @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +// Owner: Jonathan D.A. Jewell // -// integration_test.zig — Integration tests for the Robodog ECM FFI bridge. +// integration_test.zig — Integration tests for the robodog-ecm FFI bridge. // // These tests verify that the FFI functions produce results consistent // with the SPARK safety proofs and Idris2 ABI type constraints. @@ -10,7 +11,7 @@ const std = @import("std"); const main = @import("main"); test "classification agrees across all frequency bands" { - // A CW jammer should be classified the same regardless of band. + // A synthetic CW anomaly should be classified the same regardless of band. const bands = [_]u64{ 15_000_000, 150_000_000, 1_500_000_000, 15_000_000_000 }; for (bands) |freq| { const result = main.robodog_classify_signal(freq, 50_000_000, 3000, 0); diff --git a/guix.scm b/guix.scm index 1d48d55..1a029fe 100644 --- a/guix.scm +++ b/guix.scm @@ -12,7 +12,7 @@ (source #f) (build-system gnu-build-system) (synopsis "robodog-ecm") - (description "robodog-ecm — part of the hyperpolymath ecosystem.") - (home-page "https://github.com/hyperpolymath/robodog-ecm") + (description "robodog-defensive-systems-lab — defensive spectrum-awareness and autonomy-safety research.") + (home-page "https://github.com/hyperpolymath/robodog-defensive-systems-lab") (license ((@@ (guix licenses) license) "MPL-2.0" "https://github.com/hyperpolymath/palimpsest-license"))) diff --git a/src/abi/ECM.idr b/src/abi/ECM.idr index 30e1e43..44c51c9 100644 --- a/src/abi/ECM.idr +++ b/src/abi/ECM.idr @@ -1,7 +1,8 @@ -- SPDX-License-Identifier: MPL-2.0 -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +-- Owner: Jonathan D.A. Jewell -- --- ECM.idr — ECM signal types with spectral validity proofs. +-- ECM.idr — spectrum-awareness signal types with spectral validity proofs. -- -- DEFENSIVE USE ONLY — signal analysis types for spectrum monitoring. @@ -12,12 +13,12 @@ import Types %default total ||| Signal power in milliwatts, bounded to simulation limits. -||| Maximum 100 mW for normal operation, 1000 mW for calibration. +||| Maximum 100 mW for nominal simulation use, 1000 mW for calibration. public export data SimPower : Type where MkSimPower : (mw : Nat) -> {auto prf : LTE mw 1000} -> SimPower -||| Operational power limit (100 mW). +||| Nominal simulation power limit (100 mW). public export data OpPower : Type where MkOpPower : (mw : Nat) -> {auto prf : LTE mw 100} -> OpPower @@ -31,7 +32,7 @@ record DetectedSignal where signalClass : SignalClass power : SimPower -||| Proof that a detected signal is within operational power limits. +||| Proof that a detected signal is within nominal simulation power limits. ||| This type witness can only be constructed for signals <= 100 mW. public export data WithinOpLimits : DetectedSignal -> Type where @@ -45,12 +46,12 @@ record SpectrumSnapshot where constructor MkSnapshot signals : List DetectedSignal -||| Check if any suspected jamming is present in a snapshot. +||| Check if any suspected intentional-disruption class is present in a snapshot. public export hasJamming : SpectrumSnapshot -> Bool -hasJamming snap = any isJammer snap.signals +hasJamming snap = any isSuspectedDisruption snap.signals where - isJammer : DetectedSignal -> Bool - isJammer sig = case sig.signalClass of + isSuspectedDisruption : DetectedSignal -> Bool + isSuspectedDisruption sig = case sig.signalClass of SuspectedJammer => True _ => False diff --git a/src/abi/Types.idr b/src/abi/Types.idr index e704745..b456b4f 100644 --- a/src/abi/Types.idr +++ b/src/abi/Types.idr @@ -1,7 +1,8 @@ -- SPDX-License-Identifier: MPL-2.0 -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +-- Owner: Jonathan D.A. Jewell -- --- Types.idr — Core type universe for Robodog ECM ABI. +-- Types.idr — Core type universe for robodog-ecm ABI. -- -- DEFENSIVE USE ONLY — Wassenaar Cat 5A2 / Cat 11. -- All types are total. No partial functions, no escape hatches. @@ -23,7 +24,7 @@ public export freqHz : Frequency -> Nat freqHz (MkFreq hz) = hz -||| Supported frequency bands for ECM simulation. +||| Supported frequency bands for synthetic spectrum-awareness simulation. public export data FreqBand : Type where HF : FreqBand -- 0–30 MHz @@ -44,7 +45,7 @@ data Modulation : Type where DSSS : Modulation -- Direct-sequence spread spectrum ||| Defensive signal classification. -||| Note: there is NO constructor for offensive targeting. +||| Note: there is NO constructor for offensive target selection. public export data SignalClass : Type where Friendly : SignalClass diff --git a/src/rust/Cargo.toml b/src/rust/Cargo.toml index 952bd12..ae44dd0 100644 --- a/src/rust/Cargo.toml +++ b/src/rust/Cargo.toml @@ -7,10 +7,10 @@ version = "0.1.0" edition = "2024" authors = ["Jonathan D.A. Jewell "] license = "MPL-2.0" -description = "Electronic Countermeasures & Defensive Technologies research platform" -repository = "https://github.com/hyperpolymath/robodog-ecm" +description = "Defensive spectrum-awareness, secure coordination, and autonomy-safety research platform" +repository = "https://github.com/hyperpolymath/robodog-defensive-systems-lab" readme = "../../README.adoc" -keywords = ["ecm", "cryptography", "formation-control", "post-quantum", "defense"] +keywords = ["spectrum", "cryptography", "formation-control", "post-quantum", "safety"] categories = ["science", "cryptography"] [dependencies] diff --git a/src/rust/src/autonomy/mod.rs b/src/rust/src/autonomy/mod.rs index 17408f4..62d6faa 100644 --- a/src/rust/src/autonomy/mod.rs +++ b/src/rust/src/autonomy/mod.rs @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +// Owner: Jonathan D.A. Jewell -//! Defensive Autonomy — collision avoidance, threat response, safe-state. +//! Defensive Autonomy — collision avoidance, anomaly response, safe-state. //! //! DEFENSIVE USE ONLY — all autonomous decisions are defensive in nature. //! No offensive or lethal capability exists in this module. The type system @@ -24,7 +25,7 @@ use crate::formation::{AgentState, Velocity}; /// `src/abi/Proofs/NoLethal.idr`. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub enum DefensiveAction { - /// Continue current trajectory — no threat detected. + /// Continue current trajectory — no anomaly requiring action detected. Continue, /// Adjust velocity to maintain safe separation distance. AvoidCollision { @@ -38,7 +39,7 @@ pub enum DefensiveAction { }, /// Execute a frequency hop to avoid ECM interference. FrequencyHop { - /// Target frequency in Hz. + /// Selected backup frequency in Hz. target_freq_hz: f64, }, /// Request human operator intervention. @@ -98,9 +99,9 @@ impl Default for SafetyParams { /// This is the main autonomous decision function. It considers: /// 1. Proximity to other agents (collision avoidance — always active). /// 2. Communication link status. -/// 3. ECM threat assessment. +/// 3. Communications-degradation assessment. /// -/// The decision is always defensive. If multiple threats exist, +/// The decision is always defensive. If multiple degraded conditions exist, /// the most conservative (safest) action is chosen. #[must_use] pub fn compute_defensive_action( @@ -131,11 +132,11 @@ pub fn compute_defensive_action( return avoidance; } - // Priority 3: ECM threat response. + // Priority 3: communications-degradation response. match ecm_recommendation { DefensiveRecommendation::AlertOperator => { return DefensiveAction::RequestHumanControl { - situation: "ECM threat detected — operator assessment required".to_string(), + situation: "Communications anomaly detected; operator assessment required".to_string(), }; } DefensiveRecommendation::FrequencyHop => { diff --git a/src/rust/src/ecm/detection.rs b/src/rust/src/ecm/detection.rs index 9080b99..5671544 100644 --- a/src/rust/src/ecm/detection.rs +++ b/src/rust/src/ecm/detection.rs @@ -1,17 +1,18 @@ // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +// Owner: Jonathan D.A. Jewell //! Interference detection and signal classification. //! -//! DEFENSIVE USE ONLY — detects jamming and interference to protect -//! friendly communications. No offensive jamming capability. +//! DEFENSIVE USE ONLY — classifies synthetic interference and communications +//! degradation for resilience research. No offensive interference capability. use super::signals::{DetectedSignal, Modulation, SignalClassification}; /// Thresholds for interference classification. /// /// These parameters control when a detected signal is classified -/// as interference or suspected jamming versus normal traffic. +/// as interference or suspected intentional disruption versus normal traffic. #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct DetectionThresholds { /// SNR threshold above noise floor (dB) to flag as interference. @@ -19,7 +20,7 @@ pub struct DetectionThresholds { pub interference_snr_db: f64, /// Bandwidth threshold (Hz). Wideband signals exceeding this - /// are flagged as potential jamming (legitimate signals are narrower). + /// are flagged as potential anomalies (legitimate signals are narrower). pub wideband_threshold_hz: f64, /// Maximum expected signal bandwidth (Hz) for the monitored band. @@ -49,8 +50,8 @@ impl Default for DetectionThresholds { /// /// # Classification rules /// -/// 1. **CW with high SNR and wide bandwidth** → suspected jamming -/// 2. **Bandwidth exceeding maximum legitimate** → suspected jamming +/// 1. **CW with high SNR and wide bandwidth** -> suspected intentional disruption +/// 2. **Bandwidth exceeding maximum legitimate** -> suspected intentional disruption /// 3. **High SNR with unknown modulation** → interference /// 4. **Everything else** → neutral (pending further analysis) #[must_use] @@ -58,7 +59,7 @@ pub fn classify_signal( signal: &DetectedSignal, thresholds: &DetectionThresholds, ) -> SignalClassification { - // Rule 1: CW with abnormally wide bandwidth is classic barrage jamming + // Rule 1: CW with abnormally wide bandwidth is treated as a synthetic anomaly. if signal.modulation == Modulation::Cw && signal.snr_db > thresholds.interference_snr_db && signal.bandwidth_hz > thresholds.wideband_threshold_hz @@ -82,7 +83,7 @@ pub fn classify_signal( SignalClassification::Neutral } -/// Defensive response recommendation based on detected threats. +/// Defensive response recommendation based on classified anomalies. /// /// These are purely advisory — the actual response is decided by /// the autonomy module with SPARK-proven safety constraints. diff --git a/src/rust/src/ecm/signals.rs b/src/rust/src/ecm/signals.rs index 84fa5de..44fe07a 100644 --- a/src/rust/src/ecm/signals.rs +++ b/src/rust/src/ecm/signals.rs @@ -1,10 +1,11 @@ // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +// Owner: Jonathan D.A. Jewell //! Signal type definitions for ECM analysis. //! -//! DEFENSIVE USE ONLY — signal models for spectrum monitoring and -//! interference classification. No offensive jamming capability. +//! DEFENSIVE USE ONLY — synthetic signal models for spectrum-awareness and +//! interference classification. No offensive interference capability. use serde::{Deserialize, Serialize}; @@ -43,7 +44,7 @@ pub enum SignalClassification { Neutral, /// Potential interference source (unintentional). Interference, - /// Suspected hostile jamming (intentional disruption). + /// Suspected intentional disruption in a synthetic scenario. SuspectedJamming, } @@ -97,7 +98,7 @@ impl SpectrumSnapshot { .count() } - /// Return true if any suspected jamming is present. + /// Return true if any suspected intentional disruption is present. #[must_use] pub fn has_jamming(&self) -> bool { self.count_by_class(SignalClassification::SuspectedJamming) > 0 diff --git a/src/rust/src/lib.rs b/src/rust/src/lib.rs index d9d1fcb..c6f6cfb 100644 --- a/src/rust/src/lib.rs +++ b/src/rust/src/lib.rs @@ -1,21 +1,23 @@ // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +// Owner: Jonathan D.A. Jewell -//! # Robodog ECM — Electronic Countermeasures & Defensive Technologies +//! # robodog-ecm — Defensive Spectrum-Awareness and Autonomy Safety //! -//! DEFENSIVE USE ONLY — Electronic countermeasures for protective applications. -//! Export control classification: Wassenaar Category 5A2 (Crypto), Category 11 (ECM). +//! DEFENSIVE USE ONLY — spectrum-awareness and resilience research. +//! Export control classification: Wassenaar Category 5A2 (Crypto), Category 11 review context. //! See EXPORT-CONTROL.md for compliance requirements. //! //! This crate provides the core Rust implementation for: //! -//! - **ECM signal analysis** — spectrum monitoring, interference detection, jamming -//! pattern recognition. Simulation-only, no real RF hardware interface. -//! - **Post-quantum cryptographic protocols** — Kyber1024 key encapsulation, -//! Dilithium5 signatures, SPHINCS+ fallback. Hybrid classical+PQ mode. +//! - **Synthetic spectrum-awareness** — synthetic signal modelling, +//! interference classification, and resilience simulation. No real RF captures +//! or hardware-facing interfaces are included. +//! - **Post-quantum cryptographic protocols** — ML-KEM, ML-DSA, and SLH-DSA +//! family experiments through current wrapper names. //! - **Formation control** — distributed coordination algorithms for multi-robot -//! systems. Defensive formations for SAR and disaster response. -//! - **Defensive autonomy** — collision avoidance, threat response, safe-state +//! systems. Safety-oriented formations for SAR and disaster response research. +//! - **Defensive autonomy** — collision avoidance, anomaly response, safe-state //! transitions. All safety-critical logic has SPARK proof counterparts. #![forbid(unsafe_code)] diff --git a/src/rust/tests/end_to_end.rs b/src/rust/tests/end_to_end.rs index 184c955..bfd6f4d 100644 --- a/src/rust/tests/end_to_end.rs +++ b/src/rust/tests/end_to_end.rs @@ -1,10 +1,11 @@ // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +// Owner: Jonathan D.A. Jewell //! End-to-end tests — full scenario simulations. //! //! Each test exercises the complete pipeline: signal generation → -//! spectrum analysis → threat detection → formation response → +//! spectrum analysis → anomaly classification → formation response → //! autonomous action, with cryptographic channel establishment. use robodog_ecm::autonomy::{ @@ -27,8 +28,8 @@ use robodog_ecm::formation::{ /// Full scenario: SAR mission with clear spectrum. /// /// 1. Establish secure channel (Kyber1024 + Dilithium5). -/// 2. Deploy 4-agent wedge formation for area search. -/// 3. Monitor spectrum — no threats detected. +/// 2. Create a 4-agent wedge formation for area-search simulation. +/// 3. Monitor synthetic spectrum — no anomalies detected. /// 4. All agents continue their trajectory. #[test] fn e2e_sar_mission_clear_spectrum() { @@ -50,7 +51,7 @@ fn e2e_sar_mission_clear_spectrum() { let verified_order = verify(&signed_order, &sig_kp.public_key, SignatureAlgorithm::Dilithium5).unwrap(); assert_eq!(verified_order, order); - // Step 2: Deploy formation. + // Step 2: Create formation. let agent_ids = vec![1, 2, 3, 4]; let params = FormationParams { shape: FormationShape::Wedge, @@ -101,15 +102,15 @@ fn e2e_sar_mission_clear_spectrum() { } } -/// Full scenario: formation under ECM attack. +/// Full scenario: formation under synthetic communications interference. /// /// 1. 4-agent circle formation established. -/// 2. Barrage jammer detected on UHF band. +/// 2. Wideband anomaly represented on a synthetic UHF band. /// 3. Classification → SuspectedJamming. /// 4. Recommendation → AlertOperator. /// 5. Autonomy → RequestHumanControl for all agents. #[test] -fn e2e_formation_under_ecm_attack() { +fn e2e_formation_under_synthetic_interference() { // Step 1: Formation. let agent_ids = vec![1, 2, 3, 4]; let params = FormationParams { @@ -129,8 +130,8 @@ fn e2e_formation_under_ecm_attack() { }) .collect(); - // Step 2: Jammer detected. - let jammer = DetectedSignal { + // Step 2: Synthetic anomaly represented. + let synthetic_anomaly = DetectedSignal { frequency_hz: 1_500_000_000.0, bandwidth_hz: 80_000_000.0, snr_db: 45.0, @@ -142,11 +143,11 @@ fn e2e_formation_under_ecm_attack() { // Step 3: Classify. let thresholds = DetectionThresholds::default(); - let class = classify_signal(&jammer, &thresholds); + let class = classify_signal(&synthetic_anomaly, &thresholds); assert_eq!(class, SignalClassification::SuspectedJamming); // Step 4: Recommend. - let recommendation = recommend_response(&[jammer], &thresholds); + let recommendation = recommend_response(&[synthetic_anomaly], &thresholds); assert_eq!(recommendation, DefensiveRecommendation::AlertOperator); // Step 5: All agents escalate to human control. diff --git a/src/rust/tests/point_to_point.rs b/src/rust/tests/point_to_point.rs index 0e8ce14..aa13897 100644 --- a/src/rust/tests/point_to_point.rs +++ b/src/rust/tests/point_to_point.rs @@ -1,10 +1,11 @@ // SPDX-License-Identifier: MPL-2.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) +// Owner: Jonathan D.A. Jewell //! Point-to-point (unit integration) tests. //! //! Each test verifies a single boundary between two modules: -//! ECM↔Autonomy, Crypto↔Crypto (round-trips), Formation↔Autonomy. +//! spectrum-awareness↔Autonomy, Crypto↔Crypto (round-trips), Formation↔Autonomy. use robodog_ecm::autonomy::{ compute_defensive_action, DefensiveAction, SafetyParams, @@ -25,8 +26,8 @@ use robodog_ecm::formation::{ #[test] fn ecm_detection_feeds_autonomy_response() { - // Detect a jammer signal, classify it, get recommendation, feed to autonomy. - let jammer = DetectedSignal { + // Classify a synthetic anomaly, get recommendation, feed to autonomy. + let synthetic_anomaly = DetectedSignal { frequency_hz: 2_400_000_000.0, bandwidth_hz: 50_000_000.0, snr_db: 30.0, @@ -37,10 +38,10 @@ fn ecm_detection_feeds_autonomy_response() { }; let thresholds = DetectionThresholds::default(); - let classification = classify_signal(&jammer, &thresholds); + let classification = classify_signal(&synthetic_anomaly, &thresholds); assert_eq!(classification, SignalClassification::SuspectedJamming); - let recommendation = recommend_response(&[jammer], &thresholds); + let recommendation = recommend_response(&[synthetic_anomaly], &thresholds); let agent = AgentState { id: 1, position: Position { x: 0.0, y: 0.0, z: 10.0 }, @@ -58,7 +59,7 @@ fn ecm_detection_feeds_autonomy_response() { true, ); - // Jammer detection should escalate to human control. + // Synthetic anomaly classification should escalate to human control. assert!(matches!(action, DefensiveAction::RequestHumanControl { .. })); } @@ -125,7 +126,7 @@ fn dilithium_sign_verify_boundary() { #[test] fn sphincs_sign_verify_boundary() { let kp = sig_keygen(SignatureAlgorithm::SphincsPlusSha2256f).unwrap(); - let msg = b"ecm threat advisory"; + let msg = b"communications anomaly advisory"; let signed = sign(msg, &kp.secret_key, SignatureAlgorithm::SphincsPlusSha2256f).unwrap(); let opened = verify(&signed, &kp.public_key, SignatureAlgorithm::SphincsPlusSha2256f).unwrap(); assert_eq!(opened, msg); diff --git a/stapeln.toml b/stapeln.toml index db0c60a..5b6c28c 100644 --- a/stapeln.toml +++ b/stapeln.toml @@ -80,7 +80,7 @@ layers = ["base", "toolchain", "build"] env = { LOG_LEVEL = "debug" } [targets.production] -description = "Production deployment" +description = "Production-style package profile" layers = ["runtime"] env = { LOG_LEVEL = "info" }