===== 001 BEGIN Execution code-brief.md | 3204 bytes | SHA256 96016869f1735c244387bd7c78c2da4e26c330952f446604732f77944b2b1e64 =====
# CODE review: bounded complete-buffer BAO proof

Review the additive `cyber_bao::proof` API on exact Radio parent
b933829cbe273d2f31fe75ca83125f3ddd8917a2. The frozen PLAN was approved by a fresh
Opus session. This CODE review sees the actual implementation and its tests;
PLAN approval is separate. Return APPROVE or REQUEST CHANGES with concrete blockers
separated from finite advice. No source edits, commit or merge by the reviewer.

The three production changes are one module declaration and two new source files.
They compose the merged RangeTraversal and GroupHasher without changing kernels,
legacy readers, dependencies or features. This is an additive minor API reaching
Radio's soft3 rung; it is not release acceptance or complete foundation row 4.
The future Kadek adapter reaches Cyb separately and is outside this implementation.
No license, canon or specification text changes are included. Public Rustdoc is
the new carrier, error, work, output and lifetime contract.

Trust is conditional on the supplied complete root and size. Canonical field-word
checks precede arithmetic, exact EOF alone seals the immutable borrowed result,
and output replays one geometry item per call. Whole selected groups can extend
outside the request. The future Kadek adapter must retain its BaoAnchor association,
charge verification/output/copy and own bounded storage before publishing ranges.
This API authenticates neither a caller-invented particle association nor a first
partial download. No network, serialized anchor or generic budget is added.

Review targets: canonical-word order/offsets, ROOT and absolute chunk counters,
frontier stack correspondence, group completion followed by a later parent,
one bounded action per call, sticky error/strict EOF publication, independent
output coordinates and unforgeable borrowed view. Empty-file verification has four
actions and no output; nonempty-file empty requests are rejected. Geometry admission
is not a promise that a host can allocate a maximal admitted group.

The readable packet includes complete changed sources/tests, full relevant owning
geometry/reducer/backend/carrier and consumer contracts, exact primary excerpts,
approved PLAN/finite cases/review, seal sources and diagnostic classifications,
fixture provenance and gate summaries. Raw command receipts and every source epoch
are in the compact execution audit and independently replayable against exact Git
objects. It includes the real initial invocation/cache incidents and current-parent
negative comparisons; it does not disguise them as successful gates.

Omitted from this bounded review input: bulk locks/metadata, unrelated workspace
runtime/network sources, full prior audit archives, most verbose gate raw output,
compiled targets and the rest of primary repositories outside labeled excerpts.
Their identities remain indexed by the audit and frozen research. The reviewer has
not seen those omitted bodies. Root independently verifies the full raw/source
capsule. Cached registry and external consumer inventory are historical observations,
not current whole-product closure or hosted CI success. No 32-bit runtime or
allocator-free no_std final-link claim is made.

===== 001 END =====

===== 002 BEGIN Execution acceptance-map.md | 2405 bytes | SHA256 57b76f6b345680fc421cb4a41f241a493c610f7e7a85d1713e0bafa85412c73e =====
# Finite acceptance map

All assertions are source-bound; expected roots, offsets, schedules and tree shape
precede the implementation. The initial 17 materialized seed carriers total 107086
bytes. Sixteen are valid finite carriers; the last is a synthetic maximum-depth
prefix, not a witnessed complete huge file. Malformed runtime variants are explicit
mutations in the full test source, not separately materialized in that seed count.

- `proof.rs`: literal schedules, whole-group coordinates, request intersection,
  pointer identity, two independent cursors, terminal output, external quotas,
  total exhaustion, cancellation, interleaved jobs, view/cursor retention and Debug.
- `proof_failures.rs`: geometry/error precedence, all canonical-word positions,
  short headers, every truncated prefix of selected carriers, parent/leaf errors,
  strict suffix rejection, terminal stickiness, grouped ROOT and absolute counters,
  all BlockSize logs, deepest finite prefix and largest-width setup, exact Display.
- `proof_allocation.rs`: observer positive control, successful verification/output,
  terminal polls and cancellation; EOF failure and constructor geometry failure.
  Other error branches are verified functionally, without an allocator observation
  claim. Fixture allocation and destruction happen outside the observed interval.
- `seals/src/bin/*`: positive runtime control plus private fields E0451, private
  constructor E0624, raw conversion E0277, DeserializeOwned and Deserialize<'static>
  E0277, proof drop E0505, proof mutation E0502 and immutable leaf mutation E0594.
  Exact compiler classes are asserted; generic compile failure alone is insufficient.
- `interleaved-oracle/`: independently assembled four-leaf carrier from committed
  kernels, never a traversal/encoder/verifier. Its parent pair after two payloads
  exercises resumed frontier state and replay offsets. Original adapter manifest's
  73 output actions includes its planned copy work; Radio emits six iterator items.

Negative compiler API absence on b933 is recorded separately from actual legacy
carrier runtime observations on a96d. Original tests-first and intermediate source
freezes are preserved. The final tests-only interleaved witness has its own source
bridge and focused debug/release results; earlier broad counts keep their 17-test
source epoch and are not relabeled as runs of the expanded corpus.

===== 002 END =====

===== 003 BEGIN Execution gate-report.md | 6299 bytes | SHA256 42968f33a92bc59de1abf6f0f9cd867740159655b65087a62cb1517e423d7216 =====
# Gate results on exact b933 parent

All results are local observations, not hosted CI or release acceptance. The full
argv, source epoch, stream hashes and precise comparison scope are in gate-ledger.json
and comparisons.json. Raw records remain unchanged. Rustup 1.95 is matched to its
Clippy driver; jobs=2, incremental=0, --locked/--offline are local strengthening.
Nextest uses the retained CI configuration plus an explicit local 10-second slow
period/three-period termination, --test-threads=1 and staging relays. The nightly
documentation row effectively uses RUSTDOCFLAGS=--cfg docsrs; its actual warnings
are retained, and it is not described as warnings-denied.

| Gate receipt | Exit | Observed result |
| --- | ---: | --- |
| `ci-selector-iroh-bench` | 0 | completed successfully |
| `ci-selector-iroh-dns-server` | 0 | completed successfully |
| `ci-selector-iroh-relay` | 101 | error: cannot specify features for packages outside of workspace |
| `ci-selector-iroh` | 101 | error: cannot specify features for packages outside of workspace |
| `final-interleaved-clippy-none` | 0 | completed successfully |
| `final-interleaved-format-new` | 0 | completed successfully |
| `final-interleaved-proof-debug-default` | 0 | 18 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `final-interleaved-proof-debug-none` | 0 | 18 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `final-interleaved-proof-release-default` | 0 | 18 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `final-interleaved-proof-release-none` | 0 | 18 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `local-native-cyber-radio-relay` | 0 | completed successfully |
| `local-native-cyber-radio` | 0 | completed successfully |
| `nostd-binary` | 101 | error: no global memory allocator found but one is required; link to std or add `#[global_allocator]` to a static item that implements the GlobalAlloc trait |
| `nostd-library` | 0 | completed successfully |
| `owner-clippy-all-final` | 101 | error: using `clone` on type `Hash` which implements the `Copy` trait; 1 warning lines |
| `owner-debug-all-final` | 0 | 121 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `owner-debug-default-final` | 0 | 118 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `owner-debug-none-final` | 0 | 45 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `owner-doc-default` | 0 | completed successfully |
| `owner-doc-none` | 0 | completed successfully |
| `owner-msrv` | 0 | completed successfully |
| `owner-release-all-final` | 0 | 121 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `owner-release-default-final` | 0 | 118 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `owner-release-none-final` | 0 | 45 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `ready-clippy-none` | 0 | completed successfully |
| `ready-format-lib-candidate` | 1 | see raw output |
| `ready-format-lib-parent` | 1 | see raw output |
| `ready-proof-debug-default` | 0 | 17 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `ready-proof-debug-none` | 0 | 17 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `ready-proof-release-default` | 0 | 17 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `ready-proof-release-none` | 0 | 17 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `semver-parent-default` | 0 | completed successfully |
| `semver-parent-none` | 0 | completed successfully |
| `semver-tag-default` | 101 | error: running 'cargo update' on crate 'cyber-bao' failed with output: |
| `semver-tag-none` | 101 | error: running 'cargo update' on crate 'cyber-bao' failed with output: |
| `workspace-clippy-all` | 101 | error: consider using `sort_by_key`; 1 warning lines |
| `workspace-clippy-default` | 101 | error: using `clone` on type `Hash` which implements the `Copy` trait; 1 warning lines |
| `workspace-clippy-none` | 101 | error: consider using `sort_by_key`; 1 warning lines |
| `workspace-deny` | 13 | error[no-license-field]: license expression was not specified in manifest for crate 'cyber-hemera = 0.3.1' |
| `workspace-doctests` | 0 | 51 passed / 0 failed / 0 ignored (all Cargo test summaries) |
| `workspace-format` | 105 | see raw output |
| `workspace-msrv` | 0 | completed successfully |
| `workspace-nextest-all-isolated` | 101 | error[E0599]: no method named `add` found for enum `Result<T, E>` in the current scope; 1 warning lines |
| `workspace-nextest-default-isolated` | 100 | Summary [ 307.893s] 580 tests run: 575 passed (4 slow), 5 failed, 9 skipped; error: test run failed |
| `workspace-nextest-none-isolated` | 100 | Summary [ 295.185s] 580 tests run: 575 passed (2 slow), 5 failed, 9 skipped; error: test run failed |
| `workspace-nightly-docs` | 101 | warning: output filename collision.; 9 warning lines |

Parent pairs are narrower where named failing-cases; they do not rerun unrelated
passing tests. Five mDNS cases fail on both default and no-default candidate and
parent runs. Compilation/lint/docs/fmt/policy reds remain real gate failures even
when present on the exact parent. Unknown causes are not attributed to memory or
network policy without evidence. Cached offline deny is not a fresh advisory fetch.

The literal CI selectors iroh/iroh-relay fail because those package names do not
select local workspace packages. Explicit cyber-radio/cyber-radio-relay all-feature
native checks verify the actual renamed sources. Broad workspace default/none
runs exercise the local docs/blob/CLI/integration consumers. No external product
closure, Linux/Windows run, 32-bit runtime or final no_std allocator-free link is
claimed. The isolated thumb library succeeds; candidate and parent binaries fail
for the existing Hemera allocator dependency.

Source epochs matter: owner final matrices have 17 new tests (default118, all121,
none45); the later one-line module-order correction has targeted ready checks.
The final interleaved test adds an 18th new test without production edits, and only
its focused checks are new. Original source/test/format/Clippy invocation failures,
the mixed parent/candidate cache incident and harmless cleanup-guard refusal are
retained as historical rows; they are not substituted for current final outcomes.

===== 003 END =====

===== 004 BEGIN Execution review-gates.json | 124903 bytes | SHA256 1a8fd31268d93db002b5281077ecc2563a25f919babc6535cb865c4f04f506e2 =====
[
  {
    "name": "ci-selector-iroh-bench",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/ci-selector-iroh-bench.json",
    "record_sha256": "42e362cff139253c57dc6a383d9a9ea05085a90fb09a37db40d79a04f5f0d148",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "check",
      "--locked",
      "--offline",
      "-p",
      "iroh-bench",
      "--all-features",
      "--lib",
      "--bins"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-ci-selector-iroh-bench.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-ci-selector-iroh-bench.stderr",
      "bytes": 6119,
      "sha256": "9479a1db233017cb90705c8ce825ada0001a22d4d6f75262826f88f4be033a9d"
    }
  },
  {
    "name": "ci-selector-iroh-dns-server",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/ci-selector-iroh-dns-server.json",
    "record_sha256": "582dfb81241b3839c5410d6b6e0e51fddd0402116166b5e9d01b51e9259c716c",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "check",
      "--locked",
      "--offline",
      "-p",
      "iroh-dns-server",
      "--all-features",
      "--lib",
      "--bins"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-ci-selector-iroh-dns-server.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-ci-selector-iroh-dns-server.stderr",
      "bytes": 3135,
      "sha256": "5ad2c67ca7b43bb1c3005cda84b5f6b4e52f087497518c7771758a69270a0553"
    }
  },
  {
    "name": "ci-selector-iroh-relay",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/ci-selector-iroh-relay.json",
    "record_sha256": "3a5d0f32d188d6f0f031640e41799b77a3216eb8ef85feb20e48945749088499",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "check",
      "--locked",
      "--offline",
      "-p",
      "iroh-relay",
      "--all-features",
      "--lib",
      "--bins"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: cannot specify features for packages outside of workspace"
    ],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-ci-selector-iroh-relay.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-ci-selector-iroh-relay.stderr",
      "bytes": 65,
      "sha256": "e8ba25ea0890bf6630709e9f811ccb71944e489015181c521f81c609f9040c2a"
    }
  },
  {
    "name": "ci-selector-iroh",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/ci-selector-iroh.json",
    "record_sha256": "6498d4c36bc2ff2b3d8e94356f5cd0b7205f5753168538cab2ea61b682400fee",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "check",
      "--locked",
      "--offline",
      "-p",
      "iroh",
      "--all-features",
      "--lib",
      "--bins"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: cannot specify features for packages outside of workspace"
    ],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-ci-selector-iroh.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-ci-selector-iroh.stderr",
      "bytes": 65,
      "sha256": "e8ba25ea0890bf6630709e9f811ccb71944e489015181c521f81c609f9040c2a"
    }
  },
  {
    "name": "final-interleaved-clippy-none",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/final-interleaved-clippy-none.json",
    "record_sha256": "5dc4068ae538f2bc96f71adf72c729170cec36e99bf7ce9376ec2784afeda9dc",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "clippy",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--no-default-features",
      "--all-targets",
      "--",
      "-D",
      "warnings"
    ],
    "epoch": "a0624dd1f9d1257356609e816519d50d1cd5900d69aa0c413d00a6b6c05a886c",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-final-interleaved-clippy-none.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-final-interleaved-clippy-none.stderr",
      "bytes": 1272,
      "sha256": "0d89ab0b555fa2107579a89ce3a8915cb92378e59fa01122dc8278f4dd467563"
    }
  },
  {
    "name": "final-interleaved-format-new",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/final-interleaved-format-new.json",
    "record_sha256": "14fd92dd93f2fb54c7e168ccd94768548bef184d658e10b8ac6cfe588551471b",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "/Users/master/.rustup/toolchains/nightly-2025-11-26-aarch64-apple-darwin/bin/rustfmt",
      "--check",
      "--edition",
      "2024",
      "--config",
      "unstable_features=true",
      "--config",
      "imports_granularity=Crate,group_imports=StdExternalCrate,reorder_imports=true,format_code_in_doc_comments=true",
      "cyber-bao/src/proof.rs",
      "cyber-bao/src/proof/output.rs",
      "cyber-bao/tests/proof.rs",
      "cyber-bao/tests/proof_failures.rs",
      "cyber-bao/tests/proof_allocation.rs",
      "cyber-bao/tests/support/proof.rs"
    ],
    "epoch": "a0624dd1f9d1257356609e816519d50d1cd5900d69aa0c413d00a6b6c05a886c",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-final-interleaved-format-new.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-final-interleaved-format-new.stderr",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    }
  },
  {
    "name": "final-interleaved-proof-debug-default",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/final-interleaved-proof-debug-default.json",
    "record_sha256": "8d4b464d0468b82c03e57730e4969a03f9a3caae1f545065dce79885e067ed88",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--test",
      "proof",
      "--test",
      "proof_failures",
      "--test",
      "proof_allocation"
    ],
    "epoch": "a0624dd1f9d1257356609e816519d50d1cd5900d69aa0c413d00a6b6c05a886c",
    "test_aggregate": [
      18,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-final-interleaved-proof-debug-default.stdout",
      "bytes": 1525,
      "sha256": "0bb67855080940766948cab3b1077693b83d706fdba9565594c9f348d096229e"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-final-interleaved-proof-debug-default.stderr",
      "bytes": 2492,
      "sha256": "b7187aa50bf53352e48db01e7b9a9f99b4de8567447a9081f8e50a4abcd6d611"
    }
  },
  {
    "name": "final-interleaved-proof-debug-none",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/final-interleaved-proof-debug-none.json",
    "record_sha256": "edd6ba57f82d0de626f55b38340133d34617141ba4be6c7ede4b7654b3f31da6",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--no-default-features",
      "--test",
      "proof",
      "--test",
      "proof_failures",
      "--test",
      "proof_allocation"
    ],
    "epoch": "a0624dd1f9d1257356609e816519d50d1cd5900d69aa0c413d00a6b6c05a886c",
    "test_aggregate": [
      18,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-final-interleaved-proof-debug-none.stdout",
      "bytes": 1525,
      "sha256": "4d6efeb4fe3a63b6f3ba69d5f23506e79e35431d70f88e6e6a4a35148489cda9"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-final-interleaved-proof-debug-none.stderr",
      "bytes": 735,
      "sha256": "20896e15b594302067e990d4ec00bbe6996d7d3a20cbb1d2d7b2537ba2e92c97"
    }
  },
  {
    "name": "final-interleaved-proof-release-default",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/final-interleaved-proof-release-default.json",
    "record_sha256": "a391b794bc65a7aa8076e34e2b829e2556a054ac4afe54d28ceb8ca0ea1bc1c3",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--release",
      "--test",
      "proof",
      "--test",
      "proof_failures",
      "--test",
      "proof_allocation"
    ],
    "epoch": "a0624dd1f9d1257356609e816519d50d1cd5900d69aa0c413d00a6b6c05a886c",
    "test_aggregate": [
      18,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-final-interleaved-proof-release-default.stdout",
      "bytes": 1525,
      "sha256": "69a9d4ab947eb5d6a07dff97b3adb6fd0be1bda1020fe086a1cbc3129256ca15"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-final-interleaved-proof-release-default.stderr",
      "bytes": 2707,
      "sha256": "c378c3b72fb92d655d7bab100cc7efb49621abfbab4f9e6e976bce6f1bb21151"
    }
  },
  {
    "name": "final-interleaved-proof-release-none",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/final-interleaved-proof-release-none.json",
    "record_sha256": "4d60a70edfb262e84ead76f12fa929a75a1e8e5fdaa6ca35ea2153b086c25ae9",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--no-default-features",
      "--release",
      "--test",
      "proof",
      "--test",
      "proof_failures",
      "--test",
      "proof_allocation"
    ],
    "epoch": "a0624dd1f9d1257356609e816519d50d1cd5900d69aa0c413d00a6b6c05a886c",
    "test_aggregate": [
      18,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-final-interleaved-proof-release-none.stdout",
      "bytes": 1525,
      "sha256": "44f10eb3fbff7701376d07ddb1e34b6dda00b75069f64ecea52b9ff2ad639d4b"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-final-interleaved-proof-release-none.stderr",
      "bytes": 742,
      "sha256": "8556f0c7a06715f266aaa5d4ac4c36f3b1b7d52ac8523330484aa8325a31a590"
    }
  },
  {
    "name": "local-native-cyber-radio-relay",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/local-native-cyber-radio-relay.json",
    "record_sha256": "5ae9255571f7ce1efc81b0c0368695f75ca17f416095f91347befb7d6f48157d",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "check",
      "--locked",
      "--offline",
      "-p",
      "cyber-radio-relay",
      "--all-features",
      "--lib",
      "--bins"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-local-native-cyber-radio-relay.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-local-native-cyber-radio-relay.stderr",
      "bytes": 1989,
      "sha256": "5c9a45077fe22b718e44bed3e3aa923fd27a3c548804a0cc79498d9c13ec75cd"
    }
  },
  {
    "name": "local-native-cyber-radio",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/local-native-cyber-radio.json",
    "record_sha256": "50ad4da8f61084b3c87b9e1eb8ceba26fac05be3a471e7750c5a8f39b0429baf",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "check",
      "--locked",
      "--offline",
      "-p",
      "cyber-radio",
      "--all-features",
      "--lib",
      "--bins"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-local-native-cyber-radio.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-local-native-cyber-radio.stderr",
      "bytes": 1023,
      "sha256": "bde797117b71da3f888352f13a7195efed223ec443da7b580cd28c465f65209f"
    }
  },
  {
    "name": "nostd-binary",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/nostd-binary.json",
    "record_sha256": "1608a641297b688e9c69951be14dd9a443e9364f7d1f1b3eadbd8559721514f9",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "build",
      "--locked",
      "--offline",
      "--manifest-path",
      "/Users/master/cyber/radio-bao-bounded-proof/audit/2026-10-12-bao-bounded-proof/nostd/Cargo.toml",
      "--bin",
      "link-probe",
      "--target",
      "thumbv7em-none-eabi"
    ],
    "epoch": "7c2462f6f3522fe617008de6a0db519431e564be9bb61b656d2c7b6061b90679",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: no global memory allocator found but one is required; link to std or add `#[global_allocator]` to a static item that implements the GlobalAlloc trait",
      "error: could not compile `bao-proof-nostd-probe` (bin \"link-probe\") due to 1 previous error"
    ],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-nostd-binary.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-nostd-binary.stderr",
      "bytes": 591,
      "sha256": "b801cb8bec6185609b7a4b1f7e17b574d61927e0542998878da42085609c8ef9"
    }
  },
  {
    "name": "nostd-library",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/nostd-library.json",
    "record_sha256": "16f83469cc7c7bebeac509f6474c965f72f78a436285fe6cc39839772c792a80",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "check",
      "--locked",
      "--offline",
      "--manifest-path",
      "/Users/master/cyber/radio-bao-bounded-proof/audit/2026-10-12-bao-bounded-proof/nostd/Cargo.toml",
      "--lib",
      "--target",
      "thumbv7em-none-eabi"
    ],
    "epoch": "7c2462f6f3522fe617008de6a0db519431e564be9bb61b656d2c7b6061b90679",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-nostd-library.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-nostd-library.stderr",
      "bytes": 413,
      "sha256": "aed9e3b8e98a3677fe9b98106bce597459425ae8dea906c2e8d1d58bb21defad"
    }
  },
  {
    "name": "owner-clippy-all-final",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/owner-clippy-all-final.json",
    "record_sha256": "09fed4f5d8e067996d4365f80de421cd2345b165036c37a9fe9fb807ed9b0dc8",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "clippy",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--all-features",
      "--all-targets",
      "--",
      "-D",
      "warnings"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: using `clone` on type `Hash` which implements the `Copy` trait",
      "error: this function has too many arguments (9/7)",
      "error: large size difference between variants",
      "error: this `if` statement can be collapsed",
      "error: could not compile `cyber-bao` (lib) due to 11 previous errors",
      "warning: build failed, waiting for other jobs to finish...",
      "error: this loop could be written as a `while let` loop",
      "error: could not compile `cyber-bao` (lib test) due to 14 previous errors"
    ],
    "warning_lines": 1,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-owner-clippy-all-final.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-owner-clippy-all-final.stderr",
      "bytes": 9213,
      "sha256": "5ba484e88793abd52fff2568634bb68f6273dbf6292130ddf14fb218bdf31085"
    }
  },
  {
    "name": "owner-debug-all-final",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/owner-debug-all-final.json",
    "record_sha256": "f718b68fee2263d03bb6c2864a4a10178e75bbddd0843f888faccb2df35452d9",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--all-features"
    ],
    "epoch": "7c2462f6f3522fe617008de6a0db519431e564be9bb61b656d2c7b6061b90679",
    "test_aggregate": [
      121,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-owner-debug-all-final.stdout",
      "bytes": 8357,
      "sha256": "69de7a2cf20e1d37dafb474724cc394c3659d2d381a917819be7b911fd0ea54a"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-owner-debug-all-final.stderr",
      "bytes": 1268,
      "sha256": "ef07c683c47791b35c7c7991698e047a060db43d8fe2feccae43a5ffc65af9c3"
    }
  },
  {
    "name": "owner-debug-default-final",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/owner-debug-default-final.json",
    "record_sha256": "118acb0e399606645c279b65214783474837bd89965fdb063ca8736b6059cf56",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao"
    ],
    "epoch": "7c2462f6f3522fe617008de6a0db519431e564be9bb61b656d2c7b6061b90679",
    "test_aggregate": [
      118,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-owner-debug-default-final.stdout",
      "bytes": 8192,
      "sha256": "93f12661bf02999a614b9badc6c335393a3c9626c921371c86e1a5e48f83fba0"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-owner-debug-default-final.stderr",
      "bytes": 1268,
      "sha256": "8f66612aab41b55ba176fe14a410c47d4214ec2e7a652746b358296a7bdcdfca"
    }
  },
  {
    "name": "owner-debug-none-final",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/owner-debug-none-final.json",
    "record_sha256": "bc8e2af4fa7d26bac8d117412a19c1b9a6a29d9bb7c22c5970f13cd1cd30baf6",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--no-default-features"
    ],
    "epoch": "7c2462f6f3522fe617008de6a0db519431e564be9bb61b656d2c7b6061b90679",
    "test_aggregate": [
      45,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-owner-debug-none-final.stdout",
      "bytes": 3901,
      "sha256": "0e7ab8f175596f6d929a8e4e08e6cd8addb6c4bb64dda2ba73ffc336d98ae33c"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-owner-debug-none-final.stderr",
      "bytes": 1268,
      "sha256": "5d65d1ac8a897d420eb3e9e2d8afb7ff11b316fcf92f7b2553257bafb23fce69"
    }
  },
  {
    "name": "owner-doc-default",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/owner-doc-default.json",
    "record_sha256": "b4a8ff0fa9b336933be5e2db1db52b389a5baa346564082a74e36da977fd0874",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "doc",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--no-deps"
    ],
    "epoch": "7c2462f6f3522fe617008de6a0db519431e564be9bb61b656d2c7b6061b90679",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-owner-doc-default.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-owner-doc-default.stderr",
      "bytes": 961,
      "sha256": "719aeb068ac35b4d66868a841dc740a34be7e8270e919fd74a3adfb0b6ea4e99"
    }
  },
  {
    "name": "owner-doc-none",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/owner-doc-none.json",
    "record_sha256": "455c8ac094d4e71cfdde92434155619ddf171c302d745a3b5e27c530abf08bbe",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "doc",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--no-default-features",
      "--no-deps"
    ],
    "epoch": "7c2462f6f3522fe617008de6a0db519431e564be9bb61b656d2c7b6061b90679",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-owner-doc-none.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-owner-doc-none.stderr",
      "bytes": 224,
      "sha256": "de4a7a79a48d15c2b029598a223cb3c03ade119127a0b1a33d522731958918c9"
    }
  },
  {
    "name": "owner-msrv",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/owner-msrv.json",
    "record_sha256": "d62c38605b7a13a85cba9421cb4d4de14df99536e6bebe21f8a13d8ce2b7cd8e",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.89.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.89.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.89.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-msrv-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "check",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--no-default-features",
      "--lib"
    ],
    "epoch": "7c2462f6f3522fe617008de6a0db519431e564be9bb61b656d2c7b6061b90679",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-owner-msrv.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-owner-msrv.stderr",
      "bytes": 284,
      "sha256": "976527840f48cb397a8241a74e76e3c0876561f8414acf2a2fe254a6ce2f17d4"
    }
  },
  {
    "name": "owner-release-all-final",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/owner-release-all-final.json",
    "record_sha256": "acacddf1929f24123659873271c40d1c81cdb73109e60f7a13d5f469320b02fd",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--all-features",
      "--release"
    ],
    "epoch": "7c2462f6f3522fe617008de6a0db519431e564be9bb61b656d2c7b6061b90679",
    "test_aggregate": [
      121,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-owner-release-all-final.stdout",
      "bytes": 8357,
      "sha256": "7c8a499d9bee606eadaa2a821e9b6cb29e3b00fbc670dae10141525a62f0bd3f"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-owner-release-all-final.stderr",
      "bytes": 1289,
      "sha256": "4260ddd724839368f9e9b503d50aaef824510fdf7825426a2d69e6dd0db4e43e"
    }
  },
  {
    "name": "owner-release-default-final",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/owner-release-default-final.json",
    "record_sha256": "fb37841e160f645ca3e436c7ef3a649dc12f77f14ba6f8125aa66d297321c4f4",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--release"
    ],
    "epoch": "7c2462f6f3522fe617008de6a0db519431e564be9bb61b656d2c7b6061b90679",
    "test_aggregate": [
      118,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-owner-release-default-final.stdout",
      "bytes": 8192,
      "sha256": "718e8ebe280722b0facc9bc521d5d05025cac8e1ef9b45ab1151174b3ebcb1fa"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-owner-release-default-final.stderr",
      "bytes": 1289,
      "sha256": "12bdc735031e1dee8fbcd2c4e38ba2b8a20819a82cf4908ee1a46c124f8907b4"
    }
  },
  {
    "name": "owner-release-none-final",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/owner-release-none-final.json",
    "record_sha256": "d502999e537a0af188dd6f5f3c829088bf7bab577d75542ba45f188b1359665f",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--no-default-features",
      "--release"
    ],
    "epoch": "7c2462f6f3522fe617008de6a0db519431e564be9bb61b656d2c7b6061b90679",
    "test_aggregate": [
      45,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-owner-release-none-final.stdout",
      "bytes": 3901,
      "sha256": "728c6471890279cdcbf3fab48dd76492ee5925f832d827f582d31433a4f18d05"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-owner-release-none-final.stderr",
      "bytes": 1289,
      "sha256": "08be0e5b9a701078c093c3967637e762e75fa16d993b5e5721c47ef48d967558"
    }
  },
  {
    "name": "parent-ci-selector-iroh-relay",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/parent-ci-selector-iroh-relay.json",
    "record_sha256": "3b3a959628ff28b38364fe5f0d32831915bf65ac4c34dc78378dff3a52cfa988",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-parent-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "check",
      "--locked",
      "--offline",
      "-p",
      "iroh-relay",
      "--all-features",
      "--lib",
      "--bins"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: cannot specify features for packages outside of workspace"
    ],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-ci-selector-iroh-relay.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-ci-selector-iroh-relay.stderr",
      "bytes": 65,
      "sha256": "e8ba25ea0890bf6630709e9f811ccb71944e489015181c521f81c609f9040c2a"
    }
  },
  {
    "name": "parent-ci-selector-iroh",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/parent-ci-selector-iroh.json",
    "record_sha256": "ebe97c1a8ef8af858665083fe96fcd066245fbb5d8e031088158dca7d4bffeda",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-parent-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "check",
      "--locked",
      "--offline",
      "-p",
      "iroh",
      "--all-features",
      "--lib",
      "--bins"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: cannot specify features for packages outside of workspace"
    ],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-ci-selector-iroh.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-ci-selector-iroh.stderr",
      "bytes": 65,
      "sha256": "e8ba25ea0890bf6630709e9f811ccb71944e489015181c521f81c609f9040c2a"
    }
  },
  {
    "name": "parent-owner-clippy-all-final",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/parent-owner-clippy-all-final.json",
    "record_sha256": "f51d6cb6676c55758b449ec4bbf4ce19bda915c2afa6fcbb9d127ba519bf7a65",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-parent-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "clippy",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--all-features",
      "--all-targets",
      "--",
      "-D",
      "warnings"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: using `clone` on type `Hash` which implements the `Copy` trait",
      "error: this function has too many arguments (9/7)",
      "error: large size difference between variants",
      "error: this `if` statement can be collapsed",
      "error: could not compile `cyber-bao` (lib) due to 11 previous errors",
      "warning: build failed, waiting for other jobs to finish..."
    ],
    "warning_lines": 1,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-owner-clippy-all-final.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-owner-clippy-all-final.stderr",
      "bytes": 8450,
      "sha256": "91dd3bfce2e6a0830935f19897526a0471300cf5a50f31c1c7845976a1ed5ae1"
    }
  },
  {
    "name": "parent-owner-msrv",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/parent-owner-msrv.json",
    "record_sha256": "1e5c606f87012f174f24cb7f201d625ac1d6c9a457595e8d593214386c84eb8d",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.89.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.89.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.89.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-msrv-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "check",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--no-default-features",
      "--lib"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-owner-msrv.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-owner-msrv.stderr",
      "bytes": 155,
      "sha256": "322ce2a6dbd1bc07cd52259a80928d598f6efa6cd691776a150dcecb674654ca"
    }
  },
  {
    "name": "parent-semver-tag-default",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/parent-semver-tag-default.json",
    "record_sha256": "263db7eeb92a9ec62ca3a8df1e91b5ab1be03ba5cd63ebd32d6d29a1903ffd80",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-api-parent-tag-default",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=",
      "RUSTDOCFLAGS=",
      "CARGO_NET_OFFLINE=true",
      "RUSTUP_TOOLCHAIN=1.95.0",
      "/Users/master/.cargo/bin/cargo-semver-checks",
      "semver-checks",
      "-p",
      "cyber-bao",
      "--baseline-rev",
      "v0.1.0",
      "--default-features"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: running 'cargo update' on crate 'cyber-bao' failed with output:",
      "error: failed to get `cyber-hemera` as a dependency of package `cyber-bao v0.1.0 (/private/tmp/radio-bao-proof-api-parent-tag-default/semver-checks/git-v0_1_0/770544fdb7d8effd9f23188c44752d224afe50ef/cyber-bao)`",
      "error: failed to update dependencies for crate cyber-bao v0.1.0",
      "error: aborting due to failure to run 'cargo update' for crate cyber-bao v0.1.0"
    ],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-semver-tag-default.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-semver-tag-default.stderr",
      "bytes": 2391,
      "sha256": "d4307cf261c9947d1780a1f7b131418069103d0be64bbfbace7e412c55ea84c4"
    }
  },
  {
    "name": "parent-semver-tag-none",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/parent-semver-tag-none.json",
    "record_sha256": "7e33b38d17548d032bbe85d5a3f73a930914fa2cdb11e4aaf28982bb712c5831",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-api-parent-tag-none",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=",
      "RUSTDOCFLAGS=",
      "CARGO_NET_OFFLINE=true",
      "RUSTUP_TOOLCHAIN=1.95.0",
      "/Users/master/.cargo/bin/cargo-semver-checks",
      "semver-checks",
      "-p",
      "cyber-bao",
      "--baseline-rev",
      "v0.1.0",
      "--only-explicit-features"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: running 'cargo update' on crate 'cyber-bao' failed with output:",
      "error: failed to get `cyber-hemera` as a dependency of package `cyber-bao v0.1.0 (/private/tmp/radio-bao-proof-api-parent-tag-none/semver-checks/git-v0_1_0/770544fdb7d8effd9f23188c44752d224afe50ef/cyber-bao)`",
      "error: failed to update dependencies for crate cyber-bao v0.1.0",
      "error: aborting due to failure to run 'cargo update' for crate cyber-bao v0.1.0"
    ],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-semver-tag-none.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-semver-tag-none.stderr",
      "bytes": 2398,
      "sha256": "130b4784fad7166182308b773844718daff63963c336bb00d4312f5dc0994a41"
    }
  },
  {
    "name": "parent-workspace-clippy-all",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/parent-workspace-clippy-all.json",
    "record_sha256": "15e2794eb94f4ebc65c09acc6e1424cd8f14f0bff563aff3b8939baa8b01364f",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-parent-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "clippy",
      "--locked",
      "--offline",
      "--workspace",
      "--all-features",
      "--all-targets",
      "--lib",
      "--bins",
      "--tests",
      "--benches",
      "--examples"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: consider using `sort_by_key`",
      "error: could not compile `cyber-radio` (lib) due to 1 previous error",
      "warning: build failed, waiting for other jobs to finish..."
    ],
    "warning_lines": 1,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-workspace-clippy-all.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-workspace-clippy-all.stderr",
      "bytes": 12156,
      "sha256": "d3b357c61e3181c389e3f3c4302cfdf9bfd3ed486c03069c3c4ea00d20a14d51"
    }
  },
  {
    "name": "parent-workspace-clippy-default",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/parent-workspace-clippy-default.json",
    "record_sha256": "e57becae5c21b4c5cd73b500946a00f3caece75e27e40394f76fe205f46c0b97",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-parent-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "clippy",
      "--locked",
      "--offline",
      "--workspace",
      "--all-targets",
      "--lib",
      "--bins",
      "--tests",
      "--benches",
      "--examples"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: using `clone` on type `Hash` which implements the `Copy` trait",
      "error: this function has too many arguments (9/7)",
      "error: large size difference between variants",
      "error: this `if` statement can be collapsed",
      "error: could not compile `cyber-bao` (lib) due to 11 previous errors",
      "warning: build failed, waiting for other jobs to finish...",
      "error: consider using `sort_by_key`",
      "error: could not compile `cyber-radio` (lib) due to 1 previous error"
    ],
    "warning_lines": 1,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-workspace-clippy-default.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-workspace-clippy-default.stderr",
      "bytes": 7470,
      "sha256": "0cb29b291e122b01f52dab8ca70f9bd7f3c80b5ba0581e43d293635ad23fbb05"
    }
  },
  {
    "name": "parent-workspace-clippy-none",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/parent-workspace-clippy-none.json",
    "record_sha256": "7f0c4cc095a971d391d74bec6e2fa86194961717bb7d6d4ea93dfccc9f38a137",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-parent-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "clippy",
      "--locked",
      "--offline",
      "--workspace",
      "--no-default-features",
      "--all-targets",
      "--lib",
      "--bins",
      "--tests",
      "--benches",
      "--examples"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: consider using `sort_by_key`",
      "error: could not compile `cyber-radio` (lib) due to 1 previous error",
      "warning: build failed, waiting for other jobs to finish..."
    ],
    "warning_lines": 1,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-workspace-clippy-none.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-workspace-clippy-none.stderr",
      "bytes": 1829,
      "sha256": "d611c0da0dbd33566673e00f76f61e9de59a1792cf7a483f966cd481353c70b8"
    }
  },
  {
    "name": "parent-workspace-deny",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 13,
    "record": "records/parent-workspace-deny.json",
    "record_sha256": "79e168f7631dab4db713a6f3b8bf4f9b4eb21b5231a8cd02c51fb438b9e6768a",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-parent-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=",
      "RUSTDOCFLAGS=",
      "CARGO_NET_OFFLINE=true",
      "cargo",
      "deny",
      "--workspace",
      "--all-features",
      "--locked",
      "--offline",
      "check",
      "-Dwarnings"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error[source-not-allowed]: detected 'git' source not explicitly allowed",
      "error[unmatched-source]: allowed source was not encountered",
      "error[no-license-field]: license expression was not specified in manifest for crate 'cyber-hemera = 0.3.1'",
      "error[gather-failure]:",
      "error[unlicensed]: a valid license expression could not be retrieved for the crate",
      "error[unlicensed]: cyber-hemera = 0.3.1 is unlicensed",
      "error[rejected]: failed to satisfy license requirements",
      "error[no-license-field]: license expression was not specified in manifest for crate 'radio-integration-tests = 0.1.0'",
      "error[unlicensed]: radio-integration-tests = 0.1.0 is unlicensed",
      "error[unsound]: Unsoundness in `Error::downcast_mut()`",
      "error[unmaintained]: core2 is unmaintained, all versions yanked",
      "error[vulnerability]: Invalid pointer dereference in `fmt::Pointer` impl for `Atomic` and `Shared` when the underlying pointer is invalid",
      "error[unsound]: `event-listener` allows `!Send` tags to cross thread boundaries via `StackSlot`",
      "error[vulnerability]: h2 unbounded empty DATA frames",
      "error[vulnerability]: NSEC3 closest-encloser proof validation enters unbounded loop on cross-zone responses",
      "error[vulnerability]: CPU exhaustion during message encoding due to O(n²) name compression",
      "error[unsound]: Potential use-after-free due to lack of panic safety in `LruCache::pop()`",
      "error[unmaintained]: proc-macro-error is unmaintained",
      "error[vulnerability]: Quadratic run time when checking a start tag for duplicate attribute names",
      "error[vulnerability]: Unbounded namespace-declaration allocation in `NsReader` enables memory-exhaustion denial of service",
      "error[unsound]: Rand is unsound with a custom logger using `rand::rng()`",
      "error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries",
      "error[vulnerability]: CRLs not considered authoritative by Distribution Point due to faulty matching logic",
      "error[vulnerability]: Name constraints for URI names were incorrectly accepted",
      "error[vulnerability]: Name constraints were accepted for certificates asserting a wildcard name",
      "error[vulnerability]: Reachable panic in certificate revocation list parsing",
      "error[yanked]: detected yanked crate (try `cargo update -p core2`)",
      "error[yanked]: detected yanked crate (try `cargo update -p crypto-common`)",
      "error[yanked]: detected yanked crate (try `cargo update -p spin`)"
    ],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-workspace-deny.stdout",
      "bytes": 60,
      "sha256": "365329d605346eb50741362dca5a1c743ef3447b473d99b0cf03bf72bb635865"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-workspace-deny.stderr",
      "bytes": 116095,
      "sha256": "56e0bbea01c6cd3f27d352d65afe0dc50105f63f5dd20388afeec6a9ea983d7e"
    }
  },
  {
    "name": "parent-workspace-format",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 105,
    "record": "records/parent-workspace-format.json",
    "record_sha256": "fe451a6e1decdb26e510644c1bbdb4b9c7261d4515bfa7bbd5bbe6b098d73bf2",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-parent-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=",
      "RUSTDOCFLAGS=",
      "cargo",
      "make",
      "format-check"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-workspace-format.stdout",
      "bytes": 139864,
      "sha256": "15d8e4393306e32081e66d22f05c08a00f8ec44059d0365249abec81984d5f0a"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-workspace-format.stderr",
      "bytes": 44,
      "sha256": "2fbee959f357a86caade9b9087b271809465353f3440f7f77ea77037325c7a4d"
    }
  },
  {
    "name": "parent-workspace-nextest-all-isolated",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/parent-workspace-nextest-all-isolated.json",
    "record_sha256": "fdc2b97f4f98827b8af8380cb8c2c4d9fae189b582b989dbc66042cd5530811b",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-parent-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "nextest",
      "run",
      "--locked",
      "--offline",
      "--workspace",
      "--all-features",
      "--lib",
      "--bins",
      "--tests",
      "--config-file",
      "/Users/master/cyber/radio-bao-bounded-proof/audit/2026-10-12-bao-bounded-proof/nextest.toml",
      "--profile",
      "ci",
      "--run-ignored",
      "default",
      "--no-fail-fast",
      "--message-format",
      "human",
      "--test-threads",
      "1"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error[E0599]: no method named `add` found for enum `Result<T, E>` in the current scope",
      "error: could not compile `iroh-gossip` (lib test) due to 1 previous error",
      "warning: build failed, waiting for other jobs to finish...",
      "error: command `/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/cargo test --no-run --message-format json-render-diagnostics --workspace --lib --bins --tests --all-features --locked --offline` exited with code 101"
    ],
    "warning_lines": 1,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-workspace-nextest-all-isolated.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-workspace-nextest-all-isolated.stderr",
      "bytes": 21364,
      "sha256": "7b6277d349e215bba6bc5abddf089c45aa7cb3f5172e576f65e761cdab20058b"
    }
  },
  {
    "name": "parent-workspace-nextest-default-failing-cases",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 100,
    "record": "records/parent-workspace-nextest-default-failing-cases.json",
    "record_sha256": "d5f42adc4c6bf85553bf22424aa8642715367ed68f79f7bc8459077299d12b13",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-parent-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "nextest",
      "run",
      "--locked",
      "--offline",
      "--workspace",
      "--lib",
      "--bins",
      "--tests",
      "--config-file",
      "/Users/master/cyber/radio-bao-bounded-proof/audit/2026-10-12-bao-bounded-proof/nextest.toml",
      "--profile",
      "ci",
      "--run-ignored",
      "default",
      "--no-fail-fast",
      "--message-format",
      "human",
      "--test-threads",
      "1",
      "-E",
      "(package(=cyber-radio) & test(=address_lookup::mdns::tests::run_in_isolation::mdns_publish_expire)) | (package(=cyber-radio) & test(=address_lookup::mdns::tests::run_in_isolation::mdns_publish_resolve)) | (package(=cyber-radio) & test(=address_lookup::mdns::tests::run_in_isolation::mdns_subscribe)) | (package(=cyber-radio) & test(=address_lookup::mdns::tests::run_in_isolation::non_advertising_endpoint_not_discovered)) | (package(=cyber-radio) & test(=address_lookup::mdns::tests::run_in_isolation::test_service_names))"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": [
      0,
      5,
      0,
      0,
      475
    ],
    "nextest_summaries": [
      "Summary [  21.197s] 5 tests run: 0 passed, 5 failed, 92 skipped"
    ],
    "diagnostics": [
      "error: test run failed"
    ],
    "warning_lines": 0,
    "failed_cases": [
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::mdns_publish_expire"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::mdns_publish_resolve"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::mdns_subscribe"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::non_advertising_endpoint_not_discovered"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::test_service_names"
      ]
    ],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-workspace-nextest-default-failing-cases.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-workspace-nextest-default-failing-cases.stderr",
      "bytes": 29365,
      "sha256": "0c1b5e45b764ce97f20a7c757990f84c9ed72e763d3cd743bb64cb91cb16c95a"
    }
  },
  {
    "name": "parent-workspace-nextest-none-failing-cases",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 100,
    "record": "records/parent-workspace-nextest-none-failing-cases.json",
    "record_sha256": "59815a9c622828e1c89d1073a2ab166fb1d50930d2ebc2a9c200ff4a97e5407f",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-parent-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "nextest",
      "run",
      "--locked",
      "--offline",
      "--workspace",
      "--no-default-features",
      "--lib",
      "--bins",
      "--tests",
      "--config-file",
      "/Users/master/cyber/radio-bao-bounded-proof/audit/2026-10-12-bao-bounded-proof/nextest.toml",
      "--profile",
      "ci",
      "--run-ignored",
      "default",
      "--no-fail-fast",
      "--message-format",
      "human",
      "--test-threads",
      "1",
      "-E",
      "(package(=cyber-radio) & test(=address_lookup::mdns::tests::run_in_isolation::mdns_publish_expire)) | (package(=cyber-radio) & test(=address_lookup::mdns::tests::run_in_isolation::mdns_publish_resolve)) | (package(=cyber-radio) & test(=address_lookup::mdns::tests::run_in_isolation::mdns_subscribe)) | (package(=cyber-radio) & test(=address_lookup::mdns::tests::run_in_isolation::non_advertising_endpoint_not_discovered)) | (package(=cyber-radio) & test(=address_lookup::mdns::tests::run_in_isolation::test_service_names))"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": [
      0,
      5,
      0,
      0,
      475
    ],
    "nextest_summaries": [
      "Summary [  21.173s] 5 tests run: 0 passed, 5 failed, 92 skipped"
    ],
    "diagnostics": [
      "error: test run failed"
    ],
    "warning_lines": 0,
    "failed_cases": [
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::mdns_publish_expire"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::mdns_publish_resolve"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::mdns_subscribe"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::non_advertising_endpoint_not_discovered"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::test_service_names"
      ]
    ],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-workspace-nextest-none-failing-cases.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-workspace-nextest-none-failing-cases.stderr",
      "bytes": 27941,
      "sha256": "8fffc6499cd50d2de5522a8770f0c35c668d4f7fb3d23583cae5f2b05e8b1230"
    }
  },
  {
    "name": "parent-workspace-nightly-docs",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/parent-workspace-nightly-docs.json",
    "record_sha256": "a71bdf3242e4dae3e541d9a2d59caaa1b68baaa8caf160352dd1f067c944d195",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/nightly-2025-10-09-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/nightly-2025-10-09-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/nightly-2025-10-09-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-parent-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=--cfg docsrs",
      "cargo",
      "doc",
      "--locked",
      "--offline",
      "--workspace",
      "--all-features",
      "--no-deps",
      "--document-private-items"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "warning: output filename collision.",
      "warning: unresolved link to `iroh::relay::server`",
      "warning: `cyber-radio-relay` (bin \"cyber-radio-relay\" doc) generated 1 warning",
      "warning: unresolved link to `willow-rs`",
      "warning: unresolved link to `AreaOfInterest`",
      "warning: `iroh-willow` (lib doc) generated 2 warnings",
      "warning: unresolved link to `Self::persist`",
      "error: couldn't generate documentation: failed to read column from disk: data consumer error: invalid type: null, expected type data at line 1 column 4",
      "error: could not document `cyber-bao`",
      "warning: build failed, waiting for other jobs to finish...",
      "warning: `iroh-blobs` (lib doc) generated 1 warning"
    ],
    "warning_lines": 9,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-parent-workspace-nightly-docs.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-parent-workspace-nightly-docs.stderr",
      "bytes": 20933,
      "sha256": "5b5f9ba4192e4d756a2a4b0c2ddfbd55c89e837d7cba4e55977ffe0a7fbb0b9c"
    }
  },
  {
    "name": "ready-clippy-none",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/ready-clippy-none.json",
    "record_sha256": "5438023fe69471e360420707796470a50eea96df2d4a866f4c6ca35e11bccc28",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "clippy",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--no-default-features",
      "--all-targets",
      "--",
      "-D",
      "warnings"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-ready-clippy-none.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-ready-clippy-none.stderr",
      "bytes": 1271,
      "sha256": "a6ab5d1cabe472d5e5d1569910d576ba8beeb1e455d117d1847a2d1883d1f121"
    }
  },
  {
    "name": "ready-format-lib-candidate",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 1,
    "record": "records/ready-format-lib-candidate.json",
    "record_sha256": "0abad27eaca06c49fd7e7b59e5a2be2501727ea81d7cc9f8ef715d60aaea29e9",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "/Users/master/.rustup/toolchains/nightly-2025-11-26-aarch64-apple-darwin/bin/rustfmt",
      "--check",
      "--edition",
      "2024",
      "--config",
      "unstable_features=true,skip_children=true",
      "--config",
      "imports_granularity=Crate,group_imports=StdExternalCrate,reorder_imports=true,format_code_in_doc_comments=true",
      "cyber-bao/src/lib.rs"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-ready-format-lib-candidate.stdout",
      "bytes": 468,
      "sha256": "7636f880e9d13c155b72e5599a49c5099a41110768ab596f77ac36b99f4ddeb8"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-ready-format-lib-candidate.stderr",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    }
  },
  {
    "name": "ready-format-lib-parent",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 1,
    "record": "records/ready-format-lib-parent.json",
    "record_sha256": "e6ed37cdc32c27c2c0b66039a899a68c1d2f216500aa995cfc828fe065410c45",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-parent-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "/Users/master/.rustup/toolchains/nightly-2025-11-26-aarch64-apple-darwin/bin/rustfmt",
      "--check",
      "--edition",
      "2024",
      "--config",
      "unstable_features=true,skip_children=true",
      "--config",
      "imports_granularity=Crate,group_imports=StdExternalCrate,reorder_imports=true,format_code_in_doc_comments=true",
      "cyber-bao/src/lib.rs"
    ],
    "epoch": "e6e61e071923ec01bfb5401a1b73a9a1e45a7d7a178c8dd01d537e368812cde8",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-ready-format-lib-parent.stdout",
      "bytes": 465,
      "sha256": "936502117767c4449db5eee267a4cab9f9097c56dfafc8e1c59f0d2ffd4cd671"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-ready-format-lib-parent.stderr",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    }
  },
  {
    "name": "ready-proof-debug-default",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/ready-proof-debug-default.json",
    "record_sha256": "c87bcebff0986f21249d03cbb6c489fadee1c1448bc38f00ac876493dc740c5c",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--test",
      "proof",
      "--test",
      "proof_failures",
      "--test",
      "proof_allocation"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": [
      17,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-ready-proof-debug-default.stdout",
      "bytes": 1451,
      "sha256": "92298e94042491b486a6fd60743dcbdacaaffd1151c61ab3532cee3dd3559fff"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-ready-proof-debug-default.stderr",
      "bytes": 475,
      "sha256": "c44e5080b7e168c34f5bf6778d446a76c368676abebc63083366020823eb3d0e"
    }
  },
  {
    "name": "ready-proof-debug-none",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/ready-proof-debug-none.json",
    "record_sha256": "038dffe1e73515ec456eb4af12c1ccb4a894eaa18cdc5ec9e4e010be6bbe740f",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--test",
      "proof",
      "--test",
      "proof_failures",
      "--test",
      "proof_allocation",
      "--no-default-features"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": [
      17,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-ready-proof-debug-none.stdout",
      "bytes": 1451,
      "sha256": "ac89e2e838c9a112c1a57723407a30a4c4976c2f3a5c2071991edadf66c63f7b"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-ready-proof-debug-none.stderr",
      "bytes": 475,
      "sha256": "7f244065b2813767220c5bdf0c37eb0b30da1924851177d1a8802da073353298"
    }
  },
  {
    "name": "ready-proof-release-default",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/ready-proof-release-default.json",
    "record_sha256": "663143f70ad163779ce30ddb25c9b2a45e13cdcc21b158423738405b5a0f3f14",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--test",
      "proof",
      "--test",
      "proof_failures",
      "--test",
      "proof_allocation",
      "--release"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": [
      17,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-ready-proof-release-default.stdout",
      "bytes": 1451,
      "sha256": "b5ad50ea0a944d3ca19ded977895d16821ed4285a05d512f5ee5da6af816d295"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-ready-proof-release-default.stderr",
      "bytes": 482,
      "sha256": "a341d933f95a64d20c3ae0e552da90a64ac6723e6e55dd7ee79626418c34d74b"
    }
  },
  {
    "name": "ready-proof-release-none",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/ready-proof-release-none.json",
    "record_sha256": "3d9a207b9688253ba2f52fe07080acfdd03e0150c8c3052053d7cf03860c0067",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "-p",
      "cyber-bao",
      "--test",
      "proof",
      "--test",
      "proof_failures",
      "--test",
      "proof_allocation",
      "--no-default-features",
      "--release"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": [
      17,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-ready-proof-release-none.stdout",
      "bytes": 1451,
      "sha256": "a13751e609db494d04a8bd16c2de37eb33c146b66f6c36acbc7523c87ab0acce"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-ready-proof-release-none.stderr",
      "bytes": 482,
      "sha256": "fc8b871a59cae2af594911df5ee6bcebff94e6a89899ee5d91c865fa5df3c3b4"
    }
  },
  {
    "name": "semver-parent-default",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/semver-parent-default.json",
    "record_sha256": "18d6f56034dcd46b9f93e7f1a73c8da2952fa4aa3ceb0ac7e2f78af6dd2ebe98",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-api-parent-default",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=",
      "RUSTDOCFLAGS=",
      "CARGO_NET_OFFLINE=true",
      "RUSTUP_TOOLCHAIN=1.95.0",
      "/Users/master/.cargo/bin/cargo-semver-checks",
      "semver-checks",
      "-p",
      "cyber-bao",
      "--baseline-root",
      "/tmp/radio-bao-proof-parent-b933",
      "--default-features"
    ],
    "epoch": "a0624dd1f9d1257356609e816519d50d1cd5900d69aa0c413d00a6b6c05a886c",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-semver-parent-default.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-semver-parent-default.stderr",
      "bytes": 499,
      "sha256": "243ea4951c29d018880a10c947e3418504b527f8b8dfadfb042f48f5def3e1b3"
    }
  },
  {
    "name": "semver-parent-none",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/semver-parent-none.json",
    "record_sha256": "e982bd5ff2217cd3ae6fbf803a4533fe2e66a43612ee6b36dcda63fb6e47755d",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-api-parent-none",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=",
      "RUSTDOCFLAGS=",
      "CARGO_NET_OFFLINE=true",
      "RUSTUP_TOOLCHAIN=1.95.0",
      "/Users/master/.cargo/bin/cargo-semver-checks",
      "semver-checks",
      "-p",
      "cyber-bao",
      "--baseline-root",
      "/tmp/radio-bao-proof-parent-b933",
      "--only-explicit-features"
    ],
    "epoch": "a0624dd1f9d1257356609e816519d50d1cd5900d69aa0c413d00a6b6c05a886c",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-semver-parent-none.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-semver-parent-none.stderr",
      "bytes": 499,
      "sha256": "ee94ad311f371bf2887b628ca785748cc6230f29867e0ec3facd33326ed62083"
    }
  },
  {
    "name": "semver-tag-default",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/semver-tag-default.json",
    "record_sha256": "5138800e82c97bef155231bbaf58fe62c65dbefea28898d695c70499c31ae368",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-api-tag-default",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=",
      "RUSTDOCFLAGS=",
      "CARGO_NET_OFFLINE=true",
      "RUSTUP_TOOLCHAIN=1.95.0",
      "/Users/master/.cargo/bin/cargo-semver-checks",
      "semver-checks",
      "-p",
      "cyber-bao",
      "--baseline-rev",
      "v0.1.0",
      "--default-features"
    ],
    "epoch": "a0624dd1f9d1257356609e816519d50d1cd5900d69aa0c413d00a6b6c05a886c",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: running 'cargo update' on crate 'cyber-bao' failed with output:",
      "error: failed to get `cyber-hemera` as a dependency of package `cyber-bao v0.1.0 (/private/tmp/radio-bao-proof-api-tag-default/semver-checks/git-v0_1_0/770544fdb7d8effd9f23188c44752d224afe50ef/cyber-bao)`",
      "error: failed to update dependencies for crate cyber-bao v0.1.0",
      "error: aborting due to failure to run 'cargo update' for crate cyber-bao v0.1.0"
    ],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-semver-tag-default.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-semver-tag-default.stderr",
      "bytes": 2304,
      "sha256": "4fd7838badd9a9906fcd93b8c2102302fc7a84d4eb913c4f662521a729d30576"
    }
  },
  {
    "name": "semver-tag-none",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/semver-tag-none.json",
    "record_sha256": "b897e644c6040b479333723d7e55a1477a43d45f9c55ed182579b374ba3074b0",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-api-tag-none",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=",
      "RUSTDOCFLAGS=",
      "CARGO_NET_OFFLINE=true",
      "RUSTUP_TOOLCHAIN=1.95.0",
      "/Users/master/.cargo/bin/cargo-semver-checks",
      "semver-checks",
      "-p",
      "cyber-bao",
      "--baseline-rev",
      "v0.1.0",
      "--only-explicit-features"
    ],
    "epoch": "a0624dd1f9d1257356609e816519d50d1cd5900d69aa0c413d00a6b6c05a886c",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: running 'cargo update' on crate 'cyber-bao' failed with output:",
      "error: failed to get `cyber-hemera` as a dependency of package `cyber-bao v0.1.0 (/private/tmp/radio-bao-proof-api-tag-none/semver-checks/git-v0_1_0/770544fdb7d8effd9f23188c44752d224afe50ef/cyber-bao)`",
      "error: failed to update dependencies for crate cyber-bao v0.1.0",
      "error: aborting due to failure to run 'cargo update' for crate cyber-bao v0.1.0"
    ],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-semver-tag-none.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-semver-tag-none.stderr",
      "bytes": 2363,
      "sha256": "7b83945932b77a74eed4b4f0d51357fcab5dc4eb02f06ceaf6663c9a4b7810af"
    }
  },
  {
    "name": "workspace-clippy-all",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/workspace-clippy-all.json",
    "record_sha256": "63256a96daba396513ada9558357062719f1247c632b44031fb97417bce5373a",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "clippy",
      "--locked",
      "--offline",
      "--workspace",
      "--all-features",
      "--all-targets",
      "--lib",
      "--bins",
      "--tests",
      "--benches",
      "--examples"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: consider using `sort_by_key`",
      "error: could not compile `cyber-radio` (lib) due to 1 previous error",
      "warning: build failed, waiting for other jobs to finish..."
    ],
    "warning_lines": 1,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-workspace-clippy-all.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-workspace-clippy-all.stderr",
      "bytes": 12156,
      "sha256": "9624aea8731917dedc6884dded9dae29345fcab4573ef00793b86580000aaf29"
    }
  },
  {
    "name": "workspace-clippy-default",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/workspace-clippy-default.json",
    "record_sha256": "21e0e41725491809c5186adf0f133faec98f7a88666fa0ba65a6cfca270ad18e",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "clippy",
      "--locked",
      "--offline",
      "--workspace",
      "--all-targets",
      "--lib",
      "--bins",
      "--tests",
      "--benches",
      "--examples"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: using `clone` on type `Hash` which implements the `Copy` trait",
      "error: this function has too many arguments (9/7)",
      "error: large size difference between variants",
      "error: this `if` statement can be collapsed",
      "error: could not compile `cyber-bao` (lib) due to 11 previous errors",
      "warning: build failed, waiting for other jobs to finish..."
    ],
    "warning_lines": 1,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-workspace-clippy-default.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-workspace-clippy-default.stderr",
      "bytes": 6737,
      "sha256": "512b4e75edcea128e55d54d9f961c83d1597f4dd3e018d3888889f416ec23a92"
    }
  },
  {
    "name": "workspace-clippy-none",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/workspace-clippy-none.json",
    "record_sha256": "6fcff5616c5a85d953e4870528ffb430925d46e2ef91a4e42c94813d67786aa8",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "clippy",
      "--locked",
      "--offline",
      "--workspace",
      "--no-default-features",
      "--all-targets",
      "--lib",
      "--bins",
      "--tests",
      "--benches",
      "--examples"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error: consider using `sort_by_key`",
      "error: using `clone` on type `Hash` which implements the `Copy` trait",
      "error: this function has too many arguments (9/7)",
      "error: large size difference between variants",
      "error: this `if` statement can be collapsed",
      "error: could not compile `cyber-bao` (lib) due to 11 previous errors",
      "warning: build failed, waiting for other jobs to finish...",
      "error: could not compile `cyber-radio` (lib) due to 1 previous error"
    ],
    "warning_lines": 1,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-workspace-clippy-none.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-workspace-clippy-none.stderr",
      "bytes": 8251,
      "sha256": "ee6c0ff7a712ed08a4dd8538e7514317e491eadf58832c5982dca7fa659fc7e0"
    }
  },
  {
    "name": "workspace-deny",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 13,
    "record": "records/workspace-deny.json",
    "record_sha256": "d824c35f8776628c88b777e6ffcf968dc27694c11ca0e5a2647c8b684a634898",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=",
      "RUSTDOCFLAGS=",
      "CARGO_NET_OFFLINE=true",
      "cargo",
      "deny",
      "--workspace",
      "--all-features",
      "--locked",
      "--offline",
      "check",
      "-Dwarnings"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error[no-license-field]: license expression was not specified in manifest for crate 'cyber-hemera = 0.3.1'",
      "error[gather-failure]:",
      "error[unlicensed]: a valid license expression could not be retrieved for the crate",
      "error[unlicensed]: cyber-hemera = 0.3.1 is unlicensed",
      "error[rejected]: failed to satisfy license requirements",
      "error[no-license-field]: license expression was not specified in manifest for crate 'radio-integration-tests = 0.1.0'",
      "error[unlicensed]: radio-integration-tests = 0.1.0 is unlicensed",
      "error[source-not-allowed]: detected 'git' source not explicitly allowed",
      "error[unmatched-source]: allowed source was not encountered",
      "error[unsound]: Unsoundness in `Error::downcast_mut()`",
      "error[unmaintained]: core2 is unmaintained, all versions yanked",
      "error[vulnerability]: Invalid pointer dereference in `fmt::Pointer` impl for `Atomic` and `Shared` when the underlying pointer is invalid",
      "error[unsound]: `event-listener` allows `!Send` tags to cross thread boundaries via `StackSlot`",
      "error[vulnerability]: h2 unbounded empty DATA frames",
      "error[vulnerability]: NSEC3 closest-encloser proof validation enters unbounded loop on cross-zone responses",
      "error[vulnerability]: CPU exhaustion during message encoding due to O(n²) name compression",
      "error[unsound]: Potential use-after-free due to lack of panic safety in `LruCache::pop()`",
      "error[unmaintained]: proc-macro-error is unmaintained",
      "error[vulnerability]: Quadratic run time when checking a start tag for duplicate attribute names",
      "error[vulnerability]: Unbounded namespace-declaration allocation in `NsReader` enables memory-exhaustion denial of service",
      "error[unsound]: Rand is unsound with a custom logger using `rand::rng()`",
      "error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries",
      "error[vulnerability]: CRLs not considered authoritative by Distribution Point due to faulty matching logic",
      "error[vulnerability]: Name constraints for URI names were incorrectly accepted",
      "error[vulnerability]: Name constraints were accepted for certificates asserting a wildcard name",
      "error[vulnerability]: Reachable panic in certificate revocation list parsing",
      "error[yanked]: detected yanked crate (try `cargo update -p core2`)",
      "error[yanked]: detected yanked crate (try `cargo update -p crypto-common`)",
      "error[yanked]: detected yanked crate (try `cargo update -p spin`)"
    ],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-workspace-deny.stdout",
      "bytes": 60,
      "sha256": "365329d605346eb50741362dca5a1c743ef3447b473d99b0cf03bf72bb635865"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-workspace-deny.stderr",
      "bytes": 116179,
      "sha256": "4609c350e5997143fb99f79c5aa991082a1e32849869cdf119f79664c28a6a46"
    }
  },
  {
    "name": "workspace-doctests",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/workspace-doctests.json",
    "record_sha256": "2fa245bc23aea3a448b96721474a6c6f380ad2c25aae94e6622ebc61c77eaacb",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "test",
      "--locked",
      "--offline",
      "--workspace",
      "--all-features",
      "--doc"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": [
      51,
      0,
      0,
      0,
      0
    ],
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-workspace-doctests.stdout",
      "bytes": 5439,
      "sha256": "25b034d8447e2dbc7d31ba33c033f13d2303db57d8555e9e56b9f228547a592f"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-workspace-doctests.stderr",
      "bytes": 1105,
      "sha256": "ceffba25f4498f8f07f9d2adc0ec4f544f7ac6e3ed56f89847e52be3e799c269"
    }
  },
  {
    "name": "workspace-format",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 105,
    "record": "records/workspace-format.json",
    "record_sha256": "7ecf2c6bf2f8d63f54160f1f3fb4162c34f81641083b519ab8f06f4c7d530cbe",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=",
      "RUSTDOCFLAGS=",
      "cargo",
      "make",
      "format-check"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-workspace-format.stdout",
      "bytes": 140749,
      "sha256": "7db6eb1866a3c50fcc14559aa225b849b297d170524441f40ef21acebf0230c1"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-workspace-format.stderr",
      "bytes": 44,
      "sha256": "2fbee959f357a86caade9b9087b271809465353f3440f7f77ea77037325c7a4d"
    }
  },
  {
    "name": "workspace-msrv",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 0,
    "record": "records/workspace-msrv.json",
    "record_sha256": "5f0af2b8e8b56b0d6129b88547c5c7724854d264a4404f9577497841a9677c09",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.89.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.89.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.89.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "check",
      "--locked",
      "--offline",
      "--workspace",
      "--all-targets"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [],
    "warning_lines": 0,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-workspace-msrv.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-workspace-msrv.stderr",
      "bytes": 19970,
      "sha256": "01926c867eeb23549b767ad64de42195e85a15d1d41ac804e4a2666d00696ace"
    }
  },
  {
    "name": "workspace-nextest-all-isolated",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/workspace-nextest-all-isolated.json",
    "record_sha256": "ca8561811eb4e760c1444317badc6c8fcb348322aae69decb014baf120c63958",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "nextest",
      "run",
      "--locked",
      "--offline",
      "--workspace",
      "--all-features",
      "--lib",
      "--bins",
      "--tests",
      "--config-file",
      "/Users/master/cyber/radio-bao-bounded-proof/audit/2026-10-12-bao-bounded-proof/nextest.toml",
      "--profile",
      "ci",
      "--run-ignored",
      "default",
      "--no-fail-fast",
      "--message-format",
      "human",
      "--test-threads",
      "1"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "error[E0599]: no method named `add` found for enum `Result<T, E>` in the current scope",
      "error: could not compile `iroh-gossip` (lib test) due to 1 previous error",
      "warning: build failed, waiting for other jobs to finish...",
      "error: command `/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/cargo test --no-run --message-format json-render-diagnostics --workspace --lib --bins --tests --all-features --locked --offline` exited with code 101"
    ],
    "warning_lines": 1,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-workspace-nextest-all-isolated.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-workspace-nextest-all-isolated.stderr",
      "bytes": 21415,
      "sha256": "2f1c861a4706159586c38fb26c70b4ff80dec531d2c454883da95890283028a9"
    }
  },
  {
    "name": "workspace-nextest-default-isolated",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 100,
    "record": "records/workspace-nextest-default-isolated.json",
    "record_sha256": "d7d4f3c79e959b29756f51879d9aea8b9354dda91c2d2be3ffb69b2157b7136f",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "nextest",
      "run",
      "--locked",
      "--offline",
      "--workspace",
      "--lib",
      "--bins",
      "--tests",
      "--config-file",
      "/Users/master/cyber/radio-bao-bounded-proof/audit/2026-10-12-bao-bounded-proof/nextest.toml",
      "--profile",
      "ci",
      "--run-ignored",
      "default",
      "--no-fail-fast",
      "--message-format",
      "human",
      "--test-threads",
      "1"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": [
      0,
      5,
      0,
      0,
      475
    ],
    "nextest_summaries": [
      "Summary [ 307.893s] 580 tests run: 575 passed (4 slow), 5 failed, 9 skipped"
    ],
    "diagnostics": [
      "error: test run failed"
    ],
    "warning_lines": 0,
    "failed_cases": [
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::mdns_publish_expire"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::mdns_publish_resolve"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::mdns_subscribe"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::non_advertising_endpoint_not_discovered"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::test_service_names"
      ]
    ],
    "stdout": {
      "path": "/tmp/radio-bao-proof-workspace-nextest-default-isolated.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-workspace-nextest-default-isolated.stderr",
      "bytes": 77820,
      "sha256": "4af5604a66428de9846a121636806b7e676e958d381dcdb028741dc5d736e5d9"
    }
  },
  {
    "name": "workspace-nextest-none-isolated",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 100,
    "record": "records/workspace-nextest-none-isolated.json",
    "record_sha256": "d6d9457a69a6505aa5872d5126768dff7d5543d363969e208e84f0d06c629caf",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "cargo",
      "nextest",
      "run",
      "--locked",
      "--offline",
      "--workspace",
      "--no-default-features",
      "--lib",
      "--bins",
      "--tests",
      "--config-file",
      "/Users/master/cyber/radio-bao-bounded-proof/audit/2026-10-12-bao-bounded-proof/nextest.toml",
      "--profile",
      "ci",
      "--run-ignored",
      "default",
      "--no-fail-fast",
      "--message-format",
      "human",
      "--test-threads",
      "1"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": [
      0,
      5,
      0,
      0,
      475
    ],
    "nextest_summaries": [
      "Summary [ 295.185s] 580 tests run: 575 passed (2 slow), 5 failed, 9 skipped"
    ],
    "diagnostics": [
      "error: test run failed"
    ],
    "warning_lines": 0,
    "failed_cases": [
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::mdns_publish_expire"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::mdns_publish_resolve"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::mdns_subscribe"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::non_advertising_endpoint_not_discovered"
      ],
      [
        "FAIL",
        "cyber-radio",
        "address_lookup::mdns::tests::run_in_isolation::test_service_names"
      ]
    ],
    "stdout": {
      "path": "/tmp/radio-bao-proof-workspace-nextest-none-isolated.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-workspace-nextest-none-isolated.stderr",
      "bytes": 75757,
      "sha256": "dec072a9ffa1c0b321dc4a1e555b6ff55bfe800cd0de7e1562f62f2d1ca230e9"
    }
  },
  {
    "name": "workspace-nightly-docs",
    "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
    "exit": 101,
    "record": "records/workspace-nightly-docs.json",
    "record_sha256": "c960d0c0cefca8b8d6afe088462a338c49210087222d880cd11c31bb57452c10",
    "argv": [
      "env",
      "-u",
      "RUSTC_WRAPPER",
      "PATH=/Users/master/.rustup/toolchains/nightly-2025-10-09-aarch64-apple-darwin/bin:/tmp/radio-gate-tools/bin:/Users/master/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin",
      "RUSTC=/Users/master/.rustup/toolchains/nightly-2025-10-09-aarch64-apple-darwin/bin/rustc",
      "RUSTDOC=/Users/master/.rustup/toolchains/nightly-2025-10-09-aarch64-apple-darwin/bin/rustdoc",
      "CARGO_BUILD_JOBS=2",
      "CARGO_INCREMENTAL=0",
      "CARGO_TARGET_DIR=/tmp/radio-bao-proof-candidate-final-target",
      "RUST_BACKTRACE=1",
      "IROH_FORCE_STAGING_RELAYS=1",
      "RUSTFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=-Dwarnings",
      "RUSTDOCFLAGS=--cfg docsrs",
      "cargo",
      "doc",
      "--locked",
      "--offline",
      "--workspace",
      "--all-features",
      "--no-deps",
      "--document-private-items"
    ],
    "epoch": "ad2801623f451035cd58047109309a434872b47cca094c48cee7e8082d02d37a",
    "test_aggregate": null,
    "nextest_summaries": [],
    "diagnostics": [
      "warning: output filename collision.",
      "warning: unresolved link to `iroh::relay::server`",
      "warning: `cyber-radio-relay` (bin \"cyber-radio-relay\" doc) generated 1 warning",
      "warning: unresolved link to `willow-rs`",
      "warning: unresolved link to `AreaOfInterest`",
      "warning: `iroh-willow` (lib doc) generated 2 warnings",
      "warning: unresolved link to `Self::persist`",
      "error: couldn't generate documentation: failed to read column from disk: data consumer error: invalid type: null, expected type data at line 1 column 4",
      "error: could not document `cyber-bao`",
      "warning: build failed, waiting for other jobs to finish...",
      "warning: `iroh-blobs` (lib doc) generated 1 warning"
    ],
    "warning_lines": 9,
    "failed_cases": [],
    "stdout": {
      "path": "/tmp/radio-bao-proof-workspace-nightly-docs.stdout",
      "bytes": 0,
      "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "stderr": {
      "path": "/tmp/radio-bao-proof-workspace-nightly-docs.stderr",
      "bytes": 21075,
      "sha256": "94b288302306abdb296e8096fe599f27d04f99d03ed709ee33f8fb99518f0ee6"
    }
  }
]

===== 004 END =====

===== 005 BEGIN Execution comparisons.json | 3896 bytes | SHA256 81bb65991152884bf973e514c5e4826b5f4f39af59c8dc2dd0b4e2985f7d43f6 =====
[
  {
    "candidate": "ci-selector-iroh-relay",
    "parent": "parent-ci-selector-iroh-relay",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  },
  {
    "candidate": "ci-selector-iroh",
    "parent": "parent-ci-selector-iroh",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  },
  {
    "candidate": "owner-clippy-all-final",
    "parent": "parent-owner-clippy-all-final",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  },
  {
    "candidate": "owner-msrv",
    "parent": "parent-owner-msrv",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  },
  {
    "candidate": "semver-tag-default",
    "parent": "parent-semver-tag-default",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  },
  {
    "candidate": "semver-tag-none",
    "parent": "parent-semver-tag-none",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  },
  {
    "candidate": "workspace-clippy-all",
    "parent": "parent-workspace-clippy-all",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  },
  {
    "candidate": "workspace-clippy-default",
    "parent": "parent-workspace-clippy-default",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  },
  {
    "candidate": "workspace-clippy-none",
    "parent": "parent-workspace-clippy-none",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  },
  {
    "candidate": "workspace-deny",
    "parent": "parent-workspace-deny",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  },
  {
    "candidate": "workspace-format",
    "parent": "parent-workspace-format",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  },
  {
    "candidate": "workspace-nextest-all-isolated",
    "parent": "parent-workspace-nextest-all-isolated",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  },
  {
    "candidate": "workspace-nextest-all",
    "parent": "parent-workspace-nextest-all",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  },
  {
    "candidate": "workspace-nextest-default-isolated",
    "parent": "parent-workspace-nextest-default-failing-cases",
    "scope": "exact failing runtime cases only; same workspace features/profile/env; candidate full matrix"
  },
  {
    "candidate": "workspace-nextest-default",
    "parent": "parent-workspace-nextest-default",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  },
  {
    "candidate": "workspace-nextest-none-isolated",
    "parent": "parent-workspace-nextest-none-failing-cases",
    "scope": "exact failing runtime cases only; same workspace features/profile/env; candidate full matrix"
  },
  {
    "candidate": "workspace-nightly-docs",
    "parent": "parent-workspace-nightly-docs",
    "scope": "same requested command scope on exact current parent; inspect raw diagnostics, scheduling may reveal different subsets"
  }
]

===== 005 END =====

===== 006 BEGIN Execution source-complete.json | 1696 bytes | SHA256 84c9210da7108d41f8d8591377765dda8f0da2fe180dc8029d582bab51c35770 =====
{
  "parent": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
  "created": "2026-10-13T00:46:59Z",
  "files": [
    {
      "path": "cyber-bao/src/lib.rs",
      "local": "source-complete/cyber-bao/src/lib.rs",
      "bytes": 1345,
      "sha256": "9e82621f1a213a4943c2d8e5b313621ce0e5cee811f86975fe9bff20195c472a"
    },
    {
      "path": "cyber-bao/src/proof.rs",
      "local": "source-complete/cyber-bao/src/proof.rs",
      "bytes": 11816,
      "sha256": "82e5aed5b71ab1263d05df7808046a614991ec5daeab2e30b88a12b970c395b7"
    },
    {
      "path": "cyber-bao/src/proof/output.rs",
      "local": "source-complete/cyber-bao/src/proof/output.rs",
      "bytes": 5054,
      "sha256": "b2f4ec894d5f28524ebad8e60e6129ee15f2282aeeb51c347f4e8471072989d6"
    },
    {
      "path": "cyber-bao/tests/proof.rs",
      "local": "source-complete/cyber-bao/tests/proof.rs",
      "bytes": 10191,
      "sha256": "9c7a06da1f77d9966e940c29aee04184c958f5513224128ba19b7113b28c4eb9"
    },
    {
      "path": "cyber-bao/tests/proof_failures.rs",
      "local": "source-complete/cyber-bao/tests/proof_failures.rs",
      "bytes": 11662,
      "sha256": "9a89df71bbdd17dec76b9907dd026a3b4104cfe77d12367b12a86140f67e1af7"
    },
    {
      "path": "cyber-bao/tests/proof_allocation.rs",
      "local": "source-complete/cyber-bao/tests/proof_allocation.rs",
      "bytes": 4240,
      "sha256": "b8dc7985cc0cf68e68530d19cc8040b8ed28773c67965b5170ad571645b45df5"
    },
    {
      "path": "cyber-bao/tests/support/proof.rs",
      "local": "source-complete/cyber-bao/tests/support/proof.rs",
      "bytes": 7549,
      "sha256": "a28d04cb2d1cee78f950b895956830fe849cfe97256649b3a2088200994c5ddd"
    }
  ]
}

===== 006 END =====

===== 007 BEGIN Execution interleaved-test-bridge.json | 336 bytes | SHA256 c47fa533a5be26ce6101d6d48cc3f09e1975c240ac10a57c92e6abd5b591a07b =====
{
  "from": "source-ready.json",
  "to": "source-complete.json",
  "changed": [
    {
      "path": "cyber-bao/tests/proof.rs",
      "local": "source-complete/cyber-bao/tests/proof.rs",
      "bytes": 10191,
      "sha256": "9c7a06da1f77d9966e940c29aee04184c958f5513224128ba19b7113b28c4eb9"
    }
  ],
  "production_unchanged": true
}

===== 007 END =====

===== 008 BEGIN Execution test-adjustments.json | 1330 bytes | SHA256 5e0432e8f98b9b311cc8dea29dc0c7cc38eadc01dbfde68963ce8c36d038c2b1 =====
{
  "rows": [
    {
      "path": "cyber-bao/tests/proof.rs",
      "first_sha256": "5781a521bd60fffac480b1a93dd39b269a6d68fdd677087b05485aef61f78eca",
      "ready_sha256": "01298d186800bfda4ba5db19f69e0c3291ab33528c323a9f551a677c54cd7baa",
      "unchanged": false
    },
    {
      "path": "cyber-bao/tests/proof_failures.rs",
      "first_sha256": "0b56c6426a0628d66fbc4fe61846045d60db7252dbe3ed5c96654706641007ad",
      "ready_sha256": "9a89df71bbdd17dec76b9907dd026a3b4104cfe77d12367b12a86140f67e1af7",
      "unchanged": false
    },
    {
      "path": "cyber-bao/tests/proof_allocation.rs",
      "first_sha256": "f0ca1f2bdec25b517c4c475a185f3d3ee5cc902facdfa79985f748a6be9bc920",
      "ready_sha256": "b8dc7985cc0cf68e68530d19cc8040b8ed28773c67965b5170ad571645b45df5",
      "unchanged": false
    },
    {
      "path": "cyber-bao/tests/support/proof.rs",
      "first_sha256": "a28d04cb2d1cee78f950b895956830fe849cfe97256649b3a2088200994c5ddd",
      "ready_sha256": "a28d04cb2d1cee78f950b895956830fe849cfe97256649b3a2088200994c5ddd",
      "unchanged": true
    }
  ],
  "diff_sha256": "60b0577d6c0ff94999fe201d5765cb11644864a64a63cba37155091391da5895",
  "changes": "lexical cancellation/lifetime scope, one scoped reversed-range lint allowance, std/external import grouping; literal expected values unchanged"
}

===== 008 END =====

===== 009 BEGIN Execution source-order-bridge.json | 490 bytes | SHA256 af87625cebcd847843e22b342129d11288caf3a774a2bc47d4c62560e9b6471d =====
{
  "before": "source-final.json",
  "after": "source-ready.json",
  "changes": [
    {
      "path": "cyber-bao/src/lib.rs",
      "before": "098506adfe8f8fe7aee0130a4e134dcd85afbde0868bf9fea15939a91def641e",
      "after": "9e82621f1a213a4943c2d8e5b313621ce0e5cee811f86975fe9bff20195c472a"
    }
  ],
  "reason": "new pub mod proof moved after cfg-gated io for configured module order; all visibility and cfg semantics unchanged; existing parent re-export formatting remains untouched"
}

===== 009 END =====

===== 010 BEGIN Execution seals-final-results.json | 948 bytes | SHA256 1ffe016c204635059bcc44711b03845125b9ca0d81b3d2fb6b1f479619ee49c0 =====
[
  {
    "bin": "fields",
    "expected": "E0451",
    "actual": [
      "E0451"
    ],
    "exit_code": 101
  },
  {
    "bin": "constructor",
    "expected": "E0624",
    "actual": [
      "E0624"
    ],
    "exit_code": 101
  },
  {
    "bin": "conversion",
    "expected": "E0277",
    "actual": [
      "E0277"
    ],
    "exit_code": 101
  },
  {
    "bin": "deserialize",
    "expected": "E0277",
    "actual": [
      "E0277"
    ],
    "exit_code": 101
  },
  {
    "bin": "deserialize_static",
    "expected": "E0277",
    "actual": [
      "E0277"
    ],
    "exit_code": 101
  },
  {
    "bin": "drop_proof",
    "expected": "E0505",
    "actual": [
      "E0505"
    ],
    "exit_code": 101
  },
  {
    "bin": "mutate_proof",
    "expected": "E0502",
    "actual": [
      "E0502"
    ],
    "exit_code": 101
  },
  {
    "bin": "mutate_leaf",
    "expected": "E0594",
    "actual": [
      "E0594"
    ],
    "exit_code": 101
  }
]

===== 010 END =====

===== 011 BEGIN Execution interleaved-oracle.json | 1212 bytes | SHA256 6d0b0287c092a899b6f22985ea41940472caeed0c58ac9efa09e6e78a25f7f7c =====
{
  "created": "2026-10-13T00:41:40Z",
  "origin": "root independent literal assembler, committed a96 Radio kernels; no encoder/traversal/verifier",
  "files": [
    {
      "path": "interleaved-oracle/body.bin",
      "bytes": 16384,
      "sha256": "48149ae1ba9acc1a00d9050eda69d6eb894262c7929cad507db1ba590a116c91"
    },
    {
      "path": "interleaved-oracle/fixture_oracle.rs",
      "bytes": 2995,
      "sha256": "e1ec0b572fab8b77b74e4dbde16365243618d1c231edbc32fa9d2b5167412552"
    },
    {
      "path": "interleaved-oracle/interleaved.bao",
      "bytes": 12488,
      "sha256": "674ac7f2fa42c1d25fa7083c8d0d46b3459cfd6a82dcd16e20445a1479dfc7ad"
    },
    {
      "path": "interleaved-oracle/manifest.json",
      "bytes": 458,
      "sha256": "889d3b761aeeaec5aa0be3c631ad530dab4723e9f9362ef855fb25203ccd4420"
    },
    {
      "path": "interleaved-oracle/selected.bin",
      "bytes": 4098,
      "sha256": "b68e6889a7d56daccc9ea0e19d8cdf3e7b2ee4363f1b13858c60b7e96d1a5950"
    }
  ],
  "output_items": 6,
  "verification_actions": 11,
  "note": "Original manifest output_actions=73 is Kadek adapter copy/planning arithmetic, not Radio iterator item count. This unit asserts 6 output events."
}

===== 011 END =====

===== 012 BEGIN Execution interleaved-oracle/manifest.json | 458 bytes | SHA256 889d3b761aeeaec5aa0be3c631ad530dab4723e9f9362ef855fb25203ccd4420 =====
{
  "file_len": 16384,
  "request": [4095, 8193],
  "group_log": 0,
  "particle": "c79a928e4bb2c54e54ad845163194f6457404d8dec5f09ee56daee498130b699",
  "root": "e621f66b42fb61b260200dfa649d3f16d35cde5af2e8c04cc2551c109f00c6f6",
  "wire_bytes": 12488,
  "groups": [[136, 0, 4096], [4232, 4096, 4096], [8392, 8192, 4096]],
  "parent_offsets": [8, 72, 8328],
  "derived_verification_actions": 11,
  "derived_output_actions": 73,
  "derived_total_actions": 84
}

===== 012 END =====

===== 013 BEGIN Execution interleaved-oracle/fixture_oracle.rs | 2995 bytes | SHA256 e1ec0b572fab8b77b74e4dbde16365243618d1c231edbc32fa9d2b5167412552 =====
// Research fixture assembly from explicit small-tree expressions. Uses only
// committed kernels, never a Bao encoder, traversal or proof verifier.
use cyber_bao::{HashBackend, Poseidon2Backend};
use std::{env, fs, path::Path};

fn hex(bytes: &[u8]) -> String {
    bytes.iter().map(|b| format!("{b:02x}")).collect()
}

fn main() {
    let target = env::args().nth(1).expect("new output directory");
    let target = Path::new(&target);
    fs::create_dir(target).unwrap();
    let data: Vec<u8> = (0..16384)
        .map(|i| ((29 * i + 7 * (i / 4096)) % 251) as u8)
        .collect();
    let b = Poseidon2Backend;
    let l0 = b.chunk_hash(&data[..4096], 0, false);
    let l1 = b.chunk_hash(&data[4096..8192], 1, false);
    let l2 = b.chunk_hash(&data[8192..12288], 2, false);
    let l3 = b.chunk_hash(&data[12288..], 3, false);
    let p01 = b.parent_hash(&l0, &l1, false);
    let p23 = b.parent_hash(&l2, &l3, false);
    let root = b.parent_hash(&p01, &p23, true);
    let particle = hemera::hash(&data);

    let mut wire = (data.len() as u64).to_le_bytes().to_vec();
    for h in [p01, p23, l0, l1] {
        wire.extend_from_slice(h.as_bytes());
    }
    assert_eq!(wire.len(), 136);
    wire.extend_from_slice(&data[..8192]);
    assert_eq!(wire.len(), 8328);
    for h in [l2, l3] {
        wire.extend_from_slice(h.as_bytes());
    }
    assert_eq!(wire.len(), 8392);
    wire.extend_from_slice(&data[8192..12288]);
    assert_eq!(wire.len(), 12488);
    assert_eq!(&wire[136..4232], &data[..4096]);
    assert_eq!(&wire[4232..8328], &data[4096..8192]);
    assert_eq!(&wire[8392..12488], &data[8192..12288]);

    let mut selected = Vec::new();
    selected.extend_from_slice(&wire[4231..4232]);
    selected.extend_from_slice(&wire[4232..8328]);
    selected.extend_from_slice(&wire[8392..8393]);
    assert_eq!(selected, data[4095..8193]);
    assert_eq!(selected.len(), 4098);
    // A contiguous slice of the proof carrier includes the intervening pair,
    // and demonstrably is not the requested file range.
    assert_ne!(&wire[4231..4231 + selected.len()], selected.as_slice());

    fs::write(target.join("body.bin"), &data).unwrap();
    fs::write(target.join("interleaved.bao"), &wire).unwrap();
    fs::write(target.join("selected.bin"), &selected).unwrap();
    let manifest = format!(
        "{{\n  \"file_len\": 16384,\n  \"request\": [4095, 8193],\n  \"group_log\": 0,\n  \"particle\": \"{}\",\n  \"root\": \"{}\",\n  \"wire_bytes\": 12488,\n  \"groups\": [[136, 0, 4096], [4232, 4096, 4096], [8392, 8192, 4096]],\n  \"parent_offsets\": [8, 72, 8328],\n  \"derived_verification_actions\": 11,\n  \"derived_output_actions\": 73,\n  \"derived_total_actions\": 84\n}}\n",
        hex(particle.as_bytes()),
        hex(root.as_bytes())
    );
    fs::write(target.join("manifest.json"), &manifest).unwrap();
    print!("{manifest}");
    println!(
        "Explicit small-tree assembly PASS; no Bao traversal/encoder/verifier or Kadek adapter executed"
    );
}

===== 013 END =====

===== 014 BEGIN Execution plan-review/result.md | 10624 bytes | SHA256 834848c396abf1d459d9dec1b98ce6f2c7264b6990006d0e89ad1bf55f4637fb =====
# PLAN Review — bounded whole-buffer Poseidon2 BAO proof verifier

**Verdict: APPROVE**

Reviewed from the supplied frozen brief only: `plan.md`, `finite-cases.md`, `research.md`, archive README, measurement/bridge/fixture/input manifests, both probe sources, all raw stdout/stderr and command receipts, the merged `traversal.rs` and its two test files, parent `group.rs`/`hash.rs`/`tree.rs`/`io/slice.rs`/`root_policy.rs`/`lib.rs`, the Hemera `field.rs`/`encoding.rs`/`params.rs` and spec/kernel excerpts, Kadek `anchor.rs`/manifest/runtime excerpt, Radio CI/manifest/consumer files, and the prior traversal CODE verdict. I ran no tools and did not read the hash-indexed omitted bodies (historical capsules, bulk lock, Hemera sponge/permutation/tree remainder, compiled targets, full metadata stdout).

## What I verified independently

**The action oracle is arithmetically correct.** `2 + P + L + Σ(2·N_g − 1)` with `Σ N_g = C` gives `2 + P + L + 2C − L = 2 + P + 2C`. Each fixture row checks out against the measured `expected_actions` in both raw stdouts:

- `hello`: P=0, C=1 → 4 ✓ (H S K E)
- `three-right`: P=1, C=1 → 5 ✓
- `three-interior`: P=2, C=1 → 6 ✓
- `three-boundary`: P=2, C=2 → 8 ✓ (H P P S K S K E)
- `grouped-left`: P=1, C=2 → 2+1+4 = 7 ✓; the single 8192-byte group needs 2·2−1 = 3 kernels, so H P S K K K E = 7 ✓
- `final-short`: log 1, size 8193 → groups {0..8192}, {8192..8193}; P=1, selected group has 1 byte → N=1, C=1 → 5 ✓
- `sole-group`: P=0, one 8192-byte group → 3 kernels, 1+1+3+1 = 6 ✓
- empty: 4 ✓ with the synthetic zero-length ROOT setup.

The bound `P ≤ groups−1 ≤ N−1` and `total ≤ 3N+1 < 2^54` holds since `N ≤ 2^52`. Nothing overflows u64.

**The canonical-wire tightening is grounded in real evidence, not speculation.** Hemera `field.rs:21` keeps the raw `value` in `[0, 2^64)`; `Goldilocks::new` is a bare `const fn` with no reduction; `encoding.rs::bytes_to_cv` calls `Goldilocks::new` on each LE u64 without reducing; `hash_to_bytes` reduces only on *output*. So two distinct 32-byte encodings can produce identical parent output. The primary stdout confirms exactly this: four alias words, `raw_equal=false parent_equal=true legacy_accept=true`, all under the same synthetic root `9fa00cab…`. The research correctly retracts the earlier "constructor reduces" shorthand. The rejection offsets 40/48/56/64 are right: header 8 + left 32 = 40 is the right child's word 0, and the first pair's left words sit at 8+word·8. `research.md` also correctly refuses to call this a particle bypass — no complete file with root `9fa00cab…` is witnessed, and `measurements.json` records `whole_file_synthetic_root_witnessed: false`.

**ROOT/grouping authority is preserved.** `root_policy.rs` already pins `2abf65dd…` as the canonical D8192 ROOT and `11890a7e…` as the non-ROOT internal CV, and already asserts `LeafMismatch { start_chunk: 0 }` for the historical value across `decode`, `decode_slice`, `encode_ranges_validated` and `valid_ranges`. The PLAN's sole-group rejection requirement is consistent with that existing contract, and `grouping_preserves_fixed_tree_at_boundaries` already witnesses root invariance across logs 0/1/2/4. The primary probe re-derives both literals independently (`assert_ne!(root, p01)`).

**The traversal composition is sound.** Merged `traversal.rs` gives exactly one item per `next`, `is_root` only on the first frame, leaf clipping via `size - start` (no `(first+1)*g` overflow), and 53 frames with pop-before-push. The PLAN's 53-slot expected stack mirrors that frontier bound correctly: at most 52 deferred siblings plus one current expectation. `GroupHasher` is one kernel per pending `step`, `2N−1` total, ROOT only on the completing kernel — matching the Group-kernel row. The PLAN's claim that `GroupHasher::new` cannot fail after checked traversal is correct against `group.rs`: `InputTooLarge` needs `len > u64::MAX` (impossible from a usize slice on ≤64-bit), and `CounterOverflow` needs `start + leaves − 1 > u64::MAX`, excluded by `start_chunk ≤ 2^52−1` from traversal geometry. Using an internal assertion rather than a new public variant is the right call.

**Legacy gaps are real and bounded.** `io/slice.rs::decode_slice` confirms every characterized weakness: the single-block shortcut hashes `&slice[cursor..]` with no length check against `declared_size`; there is no EOF/trailing check; `tree.blocks() <= 1` returns before touching the expected stack, and the multi-group path with an empty filtered traversal never pops the root — hence `multi_wrong_root_accepted=true`. The 321-byte debug/release stdouts are byte-identical. These are correctly labeled as existing-API semantics left unchanged.

**Error precedence is complete and consistent.** Constructor Geometry → EmptyRequest → NonCanonicalRoot (ascending word) places all cheap scalar checks before any byte read, and the constructor reads nothing — so the "no successful mode with an unchecked root" invariant holds. Per-stage Truncated-before-canonical and canonical-before-arithmetic is specified in both directions, including the subtle "noncanonical left followed by incomplete right pair → Truncated wins" case. `TrailingBytes { offset: consumed length }` on a matching last group is the one case legacy gets wrong, and `finite-cases.md` tests both the 1-byte suffix and the concatenated-valid-proof variant.

**Scope and authority boundaries hold.** Kadek `anchor.rs` is committed and self-contained: `BaoAnchor` has private fields, only `BaoAnchorJob::pull` constructs it, and it binds particle + len + root + `HemeraFixed4096V1`. Nothing in this PLAN touches it, and the PLAN explicitly denies minting `VerifiedRange` from a Radio view. `kadek-ifac/Cargo.toml` pins `cyber-bao` at a96d with `default-features = false`, so an additive `pub mod proof` under `#![cfg_attr(not(feature = "std"), no_std)]` is reachable there — the ring-1 / minor-semver framing is honest, not inflated. The bridge shows 38/39 unchanged inputs with the single `lib.rs` module-wiring delta and `candidate_traversal_identical: true`.

**Gate discipline is correct.** No inheritance from the traversal gates is claimed; the prior CODE verdict's disclosure of red repository gates (workspace Clippy, nightly docs, cargo-deny, all-features nextest `iroh-gossip` E0599, last-tag no-default exit 100) is carried forward rather than laundered. The PLAN requires exact-parent comparison with identical env/profile and forbids stale-ancestor reds and a gratuitous second matrix. Local `--locked/--offline/jobs=2/incremental=0` is labeled local strengthening, consistent with the receipts. `.config/nextest.toml` `terminate-after = 3` is in the retained support set, satisfying "read CI profile termination from actual config."

## Blockers

None.

## Advice (non-blocking)

1. **`BlockSize` admission crosses an unchecked boundary.** The prior CODE review already flagged that `BaoTree::blocks()`/`shifted()` use unchecked `1u64 << block_size.0`. Your constructor delegates to `RangeTraversal`, so logs up to 51 are admitted, and the PLAN says "No unchecked BaoTree byte helpers are used for large geometry" — good. Make that an explicit rustdoc non-claim on `ProofVerifier::new` too: admitting log 51 here is not a statement that the same `BlockSize` is safe in `tree.rs`.

2. **`ProofItem::Parent` carries no coordinate.** `Leaf` gets `file_offset`/`proof_offset`/`bytes`; `Parent` is a unit variant. A consumer replaying for retransmission or progress accounting cannot tell *which* parent it just consumed, and the error table already materializes `TreeNode` for `ParentMismatch`. Consider `Parent { node: TreeNode, proof_offset: usize }` — it is free (both are already in the cursor), keeps `ProofItem` `Copy`-ish in spirit, and removes the only asymmetry in the output surface. If you keep it unit, document that parents are deliberately opaque and that consumers must count them positionally.

3. **`VerifiedProof::request` returning a cloned `Range<u64>` prevents `Copy`.** Everything else in the view is `Copy` by value. `Range` is not `Copy`; returning `(u64, u64)` or exposing `request_start()`/`request_end()` would let `VerifiedProof` derive `Copy` and remove a borrow-vs-move wart for callers that pass the view into a copy loop. Minor, but decide before freezing names.

4. **Display-string freeze deserves a single oracle test.** `finite-cases.md` lists eight exact strings and says "do not make diagnostic strings the only oracle" — correct. Add the converse guard: one test that asserts all eight strings *and* that `ProofError` implements `core::error::Error` via a `fn core_error<E: core::error::Error>()` witness, exactly as `range_traversal.rs` does. Cheap, and it caught nothing only because the traversal unit already did it.

5. **The 52-level synthetic prefix needs an explicit cost note.** `finite-cases.md` says "compute only those explicit synthetic commitments with zero deferred sibling CVs." That is 52 parent kernels plus one 4096-byte leaf — fine. But the fixture is ~3.4 KB of pairs plus a 4096-byte group, and the test asserts `Truncated` with a *large* `needed`. State the exact expected `needed` value in the table rather than "exact large needed", so the test cannot be written to accept any large number.

6. **`items()` starting its proof cursor at 8 is an unstated invariant coupling.** The replay cursor re-derives geometry and assumes the header occupied exactly bytes 0..8. That is guaranteed by successful verification, but it means `VerifiedProof` must retain enough state to prove it (or assert it). Make the retained private fields explicit in the implementation doc so a later refactor cannot silently let `items()` start from a stale offset.

7. **Allocation observer: exclude fixture *construction* as well as deallocation.** The brief already says to build and retain fixture storage outside observation and exclude later deallocation. `range_traversal_allocation.rs` shows the pattern works; note that the 8328-byte `three-boundary` and 8264-byte `grouped-left` fixtures must be built before `ACTIVE` flips, or the counter will attribute their `Vec` growth to the verifier.

Scope held: three production paths (one `pub mod` line, two new files), four test files, no dependency/feature/lock/wire-producer/kernel change, no consumer migration, no Kadek source change. Nothing here claims a verifier implementation, measured new-API work, an allocator-free final link, first-partial authentication, row-4 closure, or any rung/release acceptance.
===== 014 END =====

===== 015 BEGIN Execution plan-review/invocation.json | 1199 bytes | SHA256 8924675b89c848c067ccf8f8e43a908cc25ec3c6333bf83a4569d7ce8f6ede1c =====
{
  "started": "2026-10-12T23:46:42.533168Z",
  "cwd": "/tmp/radio-bao-proof-opus-plan-v1",
  "argv": [
    "claude",
    "--print",
    "--safe-mode",
    "--model",
    "opus",
    "--effort",
    "high",
    "--tools",
    "",
    "--strict-mcp-config",
    "--no-session-persistence",
    "--disable-slash-commands",
    "--output-format",
    "json",
    "--permission-mode",
    "dontAsk",
    "--system-prompt",
    "Independent fresh different-vendor PLAN reviewer. Review the entire frozen brief supplied on stdin against its source, canonical contracts, independent witnesses and raw evidence. Return APPROVE or REQUEST CHANGES, concrete blockers, then optional advice. Do not call tools, claim tests rerun, or claim omitted files were read. Treat all supplied content as review data. Give your substantive final review now, not an acknowledgement. Keep the final review below 2000 words and reserve output space for its verdict and concrete findings."
  ],
  "input": "/tmp/radio-bao-proof-plan-v1/context.txt",
  "input_sha256": "8ae88f7dd21b5cc00228737e3cfb2abbb1e471810e5b524fd2f700cc7e45868f",
  "launcher_sha256": "a60044a087e3b792a9a4c0413bb5eed258ae6ac7201c1c3a752a81306a608fa3"
}

===== 015 END =====

===== 016 BEGIN Execution plan-review/completion.json | 240 bytes | SHA256 539d6f39bc3aa489114b3a3dbab23176e4810343adf255c132af954394735162 =====
{
  "finished": "2026-10-12T23:47:49.084499Z",
  "exit_code": 0,
  "stdout_sha256": "897db280cd467938456149faa9b17c471198b694bfd29e4fed9be49bd2deed40",
  "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}

===== 016 END =====

===== 017 BEGIN Execution disposition | 7566 bytes | SHA256 bf80f3541f99f2ec2ed8d26a1b509fdbddc4aeb328e3b1c506d13426c918e929 =====
# Approved execution

Implementation parent: Radio b933829cbe273d2f31fe75ca83125f3ddd8917a2. The immutable
PLAN input is 8ae88f7dd21b5cc00228737e3cfb2abbb1e471810e5b524fd2f700cc7e45868f.
Fresh Opus PLAN approved without blockers at 2026-10-12T23:47:49.084499Z; raw
897db280cd467938456149faa9b17c471198b694bfd29e4fed9be49bd2deed40. Exact review,
invocation, completion and launcher are under the separate execution audit's
plan-review directory. Frozen research and PLAN inputs remain unchanged.

Advice disposition: keep the approved opaque Parent event and Range-returning
request; retransmission coordinates and a Copy view are unnecessary scope. Add
explicit geometry-only admission rustdoc and one Display/core::error::Error oracle.
VerifiedProof privately retains proof/root/size/block/request; successful validation
establishes the fixed eight-byte replay header. Build and retain allocation fixtures
outside the observer and exclude their later deallocation.

Correct advice 5's conflation using literal arithmetic: the log-0 full-range deep
prefix is 8 + 52*64 + 4096 = 7432 bytes. Actions H + 52P + S + K = 55 succeed;
action 56 attempts the next leaf setup, returning Truncated { offset:7432,
needed:4096 }. Separately, u64::MAX/log51 first-group geometry on 64-bit has a
2^63-byte first group. Header plus one valid synthetic pair occupies 72 bytes;
action 3 (H P S) fails Truncated { offset:72, needed:2^63 }. Neither fixture is a
witnessed complete file. No large allocation or full-file enumeration is needed.

Files remain the approved three production paths plus focused integration tests
and their support. Tests/fixtures freeze precedes the parent API-absence run, which
must fail specifically at the unresolved new proof module. That compile absence is
distinct from earlier real legacy carrier observations. Four tests/support files
and 17 generated fixtures were frozen before production; parent compilation failed
with E0432 for the absent module, and its matched traversal control passed 8 tests.
The three production files now implement the approved machine and output view.
Focused debug passed all 17 new tests. Allocation observation covers successful
stages, output, terminal polls and cancellation, plus EOF and constructor geometry
failures; it does not claim every error branch was observed.

The first Clippy invocation mixed Rustup rustc and Homebrew clippy-driver, producing
E0514; retained as an invocation failure, not a source verdict. Matched Rustup 1.95
all-features Clippy reaches 11 legacy io/tree lints. No-default Clippy additionally
found three drop_non_drop diagnostics in the new test. The tests-only correction
uses lexical scopes instead of explicit drop; literal assertions remain unchanged.
The original tests-first snapshot and all negative receipts remain immutable.

Final source freeze: `audit/2026-10-12-bao-bounded-proof/source-final.json` binds
all seven Rust source/test files. The configured formatter added only one import
separator and moved the std import ahead of the external crate import. The invalid
range test has a local reversed_empty_ranges allowance, preserving its literal
negative oracle. Final owner tests pass default 118, all-features 121 and no-default
45 in each debug/release mode; each Cargo run also checks its zero doctest cases.
No-default all-target Clippy and scoped configured rustfmt pass. The final gate
runner hashes all live Rust/TOML/lock/workflow inputs before and after each command.

Seven external negative compiler probes match their specific expected error classes,
with a successful runtime control. Constructor/field/conversion/DeserializeOwned,
proof drop/mutation and leaf mutation failures remain distinct. Host allocation is
observed, not a final-link promise: the isolated thumb library compiles, while its
binary and a current-parent pure ChunkNum control both fail for the existing
Hemera allocator requirement. The owner no-default library passes Rust 1.89;
this measured row does not establish the entire workspace MSRV.

`source-ready.json` is the final module-order bridge: move only `pub mod proof;`
after the cfg-gated io declaration. The existing parent re-export formatting issue
is intentionally unchanged. Earlier owner and workspace receipts retain their own
source epochs; the bridge changes no cfg, public API, implementation or fixture.
The first lib-only formatter check detected both the new placement and the inherited
re-export difference; new module placement alone is corrected.

Workspace cache correction: the initial runner reused one target across parent and
candidate. After the parent build, the candidate default test compiler observed a
cyber-bao artifact without the new module (E0432). This contradicts the unchanged
source and successful isolated owner witnesses, so that result is classified as a
build-cache isolation failure, not a runtime source regression. The driver was
paused while its parent command completed, then retired before another candidate
started. That non-isolated parent run reported 563 run / 558 passed / 5 mDNS failures /
9 skipped; it is retained but not the accepted clean comparator. The completed
mixed cache was removed after checking no compiler or test still used it. Fresh
candidate and parent targets are disjoint for all later comparisons.

The earlier manual default count of 117 was an addition error: raw aggregate is
118 = prior 101 + 17 new tests. Final report counts are derived from raw results.
The separate Deserialize<'static> probe strengthens DeserializeOwned's narrower
compiler witness; source inspection also checks that no Deserialize implementation
or raw-result constructor exists. Original seven probe receipts remain immutable.

The final broad candidate runs finished on source-ready: default and no-default
workspace runs each reported 580 run / 575 passed / 5 mDNS failures / 9 skipped.
Their parent comparison selects only those exact five cases with the same profile,
features, environment and explicit timeout configuration. All-features build fails
at the same gossip E0599 on both current inputs. Workspace Rust 1.89 and 51 doctests
pass. Nightly docs retains its effective docsrs-only RUSTDOCFLAGS, actual warnings
and matched rustdoc search-index failure; no unproven cache-cause claim is made.

Root's independent four-leaf fixture adds the missing parent-after-payload frontier
case. Frozen original bytes and assembly source are in interleaved-oracle. A first
cleanup guard matched its invoking shell text and refused; chained preparation
continued without appending the test, so the complete-* receipts actually reran
the original 17 tests. Those receipts and the old source-complete attempt are kept
honestly. The corrected guard excludes its own process and invoking shell; a new
source-complete freeze and final-interleaved-* gates will identify the real added
18th test. Production sources remain byte-identical.

Final source-complete contains exactly one tests-only change from source-ready:
the independent interleaved four-leaf carrier. All four narrow debug/release and
default/no-default runs pass 18 tests, with no-default all-target Clippy and scoped
formatting green. Exact b933 semver comparisons pass both feature modes with
(no change; assume minor); the public addition still requires minor acceptance.
Both tag-v0.1.0 comparisons fail on the same absent archived relative hemera/rs
path. No tag compatibility floor is established. All isolated broad gates and
narrow runtime counterparts are complete; no further implementation edits planned.

===== 017 END =====

===== 018 BEGIN Candidate full cyber-bao/src/lib.rs | 1345 bytes | SHA256 9e82621f1a213a4943c2d8e5b313621ce0e5cee811f86975fe9bff20195c472a =====
//! Poseidon2-BAO: verified streaming with Poseidon2 hash over Goldilocks.
//!
//! This crate provides BAO-style content-verified streaming using the
//! Poseidon2 algebraic hash function. The tree structure
//! and encoding formats are compatible with the original bao specification,
//! differing only in the hash function used.
//!
//! # Architecture
//!
//! - **`tree`**: Pure geometry — tree node indexing, chunk counting, block sizes
//! - **`hash`**: Pluggable hash backend trait with Poseidon2 implementation
//! - **`io`**: Encoding, decoding, outboard creation, and slice extraction

#![cfg_attr(not(feature = "std"), no_std)]

pub mod group;
pub mod hash;
#[cfg(feature = "std")]
pub mod io;
pub mod proof;
pub mod traversal;
pub mod tree;

pub use hash::{HashBackend, Poseidon2Backend};
pub use tree::{BaoChunk, BaoTree, BlockSize, CHUNK_SIZE, ChunkNum, TreeNode};

#[cfg(feature = "std")]
pub use tree::PostOrderChunkIter;

/// A set of chunk ranges (used for partial downloads, range requests, etc.).
#[cfg(feature = "std")]
pub type ChunkRanges = range_collections::RangeSet2<ChunkNum>;

/// Borrowed reference to chunk ranges.
#[cfg(feature = "std")]
pub type ChunkRangesRef = range_collections::RangeSetRef<ChunkNum>;

/// A set of byte ranges.
#[cfg(feature = "std")]
pub type ByteRanges = range_collections::RangeSet2<u64>;

===== 018 END =====

===== 019 BEGIN Candidate full cyber-bao/src/proof.rs | 11816 bytes | SHA256 82e5aed5b71ab1263d05df7808046a614991ec5daeab2e30b88a12b970c395b7 =====
//! Strict complete-buffer proofs for the canonical fixed-4096 Hemera tree.
//!
//! Concrete Poseidon2 kernels, counters and domains are those of Hemera d5f0a095.
//! A proof is an LE u64 complete length, then selected preorder child pairs and
//! whole group payloads. Every hash is four canonical LE field words. Grouping
//! changes the carrier, not the complete ROOT; historical internal CVs are not
//! roots. Legacy std carrier APIs have their own, unchanged admission behavior.

use core::{fmt, ops::Range};

use hemera::{Hash, OUTPUT_BYTES, OUTPUT_ELEMENTS, field::P};

use crate::{
    BaoChunk, BlockSize, CHUNK_SIZE, HashBackend, Poseidon2Backend, TreeNode,
    group::GroupHasher,
    traversal::{RangeTraversal, RangeTraversalError},
};

mod output;
pub use output::{ProofItem, ProofItems, VerifiedProof};

static BACKEND: Poseidon2Backend = Poseidon2Backend;
const _: () = assert!(CHUNK_SIZE == 4096 && OUTPUT_BYTES == 32 && OUTPUT_ELEMENTS == 4);
const PAIR_BYTES: usize = 2 * OUTPUT_BYTES;

/// First failed admission or proof action; coordinates name the encoded proof
/// except for TreeNode indexes and absolute file chunk counters.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ProofError {
    Geometry(RangeTraversalError),
    EmptyRequest,
    NonCanonicalRoot { word: u8 },
    Truncated { offset: usize, needed: usize },
    SizeMismatch { expected: u64, declared: u64 },
    NonCanonicalHash { offset: usize },
    ParentMismatch { node: TreeNode },
    LeafMismatch { start_chunk: u64 },
    TrailingBytes { offset: usize },
}

impl fmt::Display for ProofError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Self::Geometry(e) => e.fmt(f),
            Self::EmptyRequest => f.write_str("empty request for nonempty file"),
            Self::NonCanonicalRoot { word } => write!(f, "noncanonical expected root word {word}"),
            Self::Truncated { offset, needed } => {
                write!(f, "truncated proof at {offset}: need {needed} bytes")
            }
            Self::SizeMismatch { expected, declared } => {
                write!(f, "proof size {declared} differs from expected {expected}")
            }
            Self::NonCanonicalHash { offset } => {
                write!(f, "noncanonical proof hash word at {offset}")
            }
            Self::ParentMismatch { node } => write!(f, "proof parent mismatch at node {}", node.0),
            Self::LeafMismatch { start_chunk } => {
                write!(f, "proof leaf mismatch at chunk {start_chunk}")
            }
            Self::TrailingBytes { offset } => write!(f, "trailing proof bytes at {offset}"),
        }
    }
}
impl core::error::Error for ProofError {}

struct Pending<'a> {
    reducer: GroupHasher<'a, Poseidon2Backend>,
    expected: Hash,
    start_chunk: u64,
}

/// Resumable verification against an externally trusted complete root and size.
///
/// A returned view authenticates selected bytes only relative to those supplied
/// inputs. This API establishes no particle/root association or Kadek authority.
/// It borrows the immutable encoded proof, acquires no owner and allocates nothing.
/// Cancellation is dropping the verifier; no byte-feeding/reset API is provided.
///
/// Each pending step performs one bounded action: header; one parent pair and
/// kernel; one group setup; one GroupHasher kernel (<=4096 bytes or two hashes);
/// or final EOF commit. For P visited parents and C selected fixed chunks, a valid
/// nonempty proof takes 2+P+2*C actions; empty file takes 4. Constructor/fixed-array
/// setup is bounded. These are work units, not constant wall time.
///
/// The caller checks is_finished, charges one persistent unit, then steps. Yields,
/// completed groups and subsequent output/copy must not renew its total allowance.
/// No exact-total planning scan or budget is hidden here. There are three separate
/// fixed frontiers: traversal, expected hashes, and the current group reducer.
pub struct ProofVerifier<'a> {
    proof: &'a [u8],
    root: [u8; OUTPUT_BYTES],
    size: u64,
    block: BlockSize,
    request: Range<u64>,
    traversal: RangeTraversal,
    expected: [Option<Hash>; 53],
    occupied: usize,
    cursor: usize,
    header: bool,
    empty_pending: bool,
    group: Option<Pending<'a>>,
    complete: bool,
    error: Option<ProofError>,
}

impl<'a> ProofVerifier<'a> {
    /// Admit geometry, reject empty requests for nonempty files, then check all
    /// expected-root words. Reads no proof bytes and performs no hash kernel.
    ///
    /// Geometry admits logs 0..=51 on 64-bit and 0..=19 on 32-bit, even for empty
    /// files. This concerns integer geometry, not allocation Layout or the safety
    /// of the same BlockSize in unchecked BaoTree helpers. Range requires
    /// start <= end <= size. Empty file 0..0 still requires its canonical ROOT.
    pub fn new(
        proof: &'a [u8],
        root: [u8; OUTPUT_BYTES],
        size: u64,
        block: BlockSize,
        request: Range<u64>,
    ) -> Result<Self, ProofError> {
        let traversal =
            RangeTraversal::new(size, block, request.clone()).map_err(ProofError::Geometry)?;
        if size != 0 && request.is_empty() {
            return Err(ProofError::EmptyRequest);
        }
        if let Some(word) = noncanonical(&root) {
            return Err(ProofError::NonCanonicalRoot { word });
        }
        Ok(Self {
            proof,
            root,
            size,
            block,
            request,
            traversal,
            expected: [None; 53],
            occupied: 0,
            cursor: 0,
            header: false,
            empty_pending: size == 0,
            group: None,
            complete: false,
            error: None,
        })
    }

    /// True after either exact EOF completion or a sticky processing error.
    pub fn is_finished(&self) -> bool {
        self.complete || self.error.is_some()
    }

    /// Perform one action. Pending returns None; only the separate EOF action
    /// emits Some(view). Successful terminal polls return None without work;
    /// failed terminal polls return the identical error without work.
    pub fn step(&mut self) -> Result<Option<VerifiedProof<'a>>, ProofError> {
        if let Some(error) = self.error {
            return Err(error);
        }
        if self.complete {
            return Ok(None);
        }
        let result = self.advance();
        if let Err(error) = result {
            self.error = Some(error);
            self.group = None;
        }
        result
    }

    fn advance(&mut self) -> Result<Option<VerifiedProof<'a>>, ProofError> {
        if !self.header {
            let declared = u64::from_le_bytes(self.take(8)?.try_into().expect("eight-byte header"));
            if declared != self.size {
                return Err(ProofError::SizeMismatch {
                    expected: self.size,
                    declared,
                });
            }
            self.expected[0] = Some(Hash::from_bytes(self.root));
            self.occupied = 1;
            self.header = true;
            return Ok(None);
        }
        if let Some(group) = self.group.as_mut() {
            if let Some(hash) = group.reducer.step() {
                if hash != group.expected {
                    return Err(ProofError::LeafMismatch {
                        start_chunk: group.start_chunk,
                    });
                }
                self.group = None;
            }
            return Ok(None);
        }
        if self.empty_pending {
            self.empty_pending = false;
            self.start_group(0, 0, true)?;
            return Ok(None);
        }
        if let Some(item) = self.traversal.next() {
            match item {
                BaoChunk::Parent {
                    node,
                    is_root,
                    left,
                    right,
                } => {
                    let offset = self.cursor;
                    let bytes = self.take(PAIR_BYTES)?;
                    let l = wire_hash(&bytes[..OUTPUT_BYTES], offset)?;
                    let r = wire_hash(&bytes[OUTPUT_BYTES..], offset + OUTPUT_BYTES)?;
                    let expected = self.pop();
                    if BACKEND.parent_hash(&l, &r, is_root) != expected {
                        return Err(ProofError::ParentMismatch { node });
                    }
                    if right {
                        self.push(r);
                    }
                    if left {
                        self.push(l);
                    }
                }
                BaoChunk::Leaf {
                    start_chunk,
                    size,
                    is_root,
                } => self.start_group(start_chunk, size, is_root)?,
            }
            return Ok(None);
        }
        assert_eq!(self.occupied, 0, "geometry consumes every expected hash");
        if self.cursor != self.proof.len() {
            return Err(ProofError::TrailingBytes {
                offset: self.cursor,
            });
        }
        self.complete = true;
        Ok(Some(VerifiedProof::new(
            self.proof,
            self.root,
            self.size,
            self.block,
            self.request.clone(),
        )))
    }

    fn take(&mut self, needed: usize) -> Result<&'a [u8], ProofError> {
        if needed > self.proof.len() - self.cursor {
            return Err(ProofError::Truncated {
                offset: self.cursor,
                needed,
            });
        }
        let start = self.cursor;
        self.cursor += needed;
        Ok(&self.proof[start..self.cursor])
    }

    fn start_group(&mut self, start_chunk: u64, size: usize, root: bool) -> Result<(), ProofError> {
        let data = self.take(size)?;
        let expected = self.pop();
        // Checked geometry bounds final counters by 2^52-1; admitted group sizes
        // fit usize/u64. Empty file is one zero-length leaf at counter zero.
        let reducer =
            GroupHasher::new(&BACKEND, data, start_chunk, root).expect("admitted group geometry");
        self.group = Some(Pending {
            reducer,
            expected,
            start_chunk,
        });
        Ok(())
    }
    fn pop(&mut self) -> Hash {
        self.occupied -= 1;
        self.expected[self.occupied]
            .take()
            .expect("expected hash follows geometry")
    }
    fn push(&mut self, hash: Hash) {
        // At most 52 deferred right siblings plus the current expectation.
        self.expected[self.occupied] = Some(hash);
        self.occupied += 1;
    }
}

fn noncanonical(bytes: &[u8; OUTPUT_BYTES]) -> Option<u8> {
    bytes
        .chunks_exact(8)
        .position(|word| u64::from_le_bytes(word.try_into().expect("eight-byte word")) >= P)
        .map(|word| word as u8)
}
fn wire_hash(bytes: &[u8], offset: usize) -> Result<Hash, ProofError> {
    let array = bytes.try_into().expect("one complete child hash");
    if let Some(word) = noncanonical(&array) {
        return Err(ProofError::NonCanonicalHash {
            offset: offset + usize::from(word) * 8,
        });
    }
    Ok(Hash::from_bytes(array))
}

impl fmt::Debug for ProofVerifier<'_> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("ProofVerifier")
            .field("proof_bytes", &self.proof.len())
            .field("size", &self.size)
            .field("request", &self.request)
            .field("cursor", &self.cursor)
            .field("expected", &self.occupied)
            .field("group_pending", &self.group.is_some())
            .field("finished", &self.is_finished())
            .field("error", &self.error)
            .finish_non_exhaustive()
    }
}

===== 019 END =====

===== 020 BEGIN Candidate full cyber-bao/src/proof/output.rs | 5054 bytes | SHA256 b2f4ec894d5f28524ebad8e60e6129ee15f2282aeeb51c347f4e8471072989d6 =====
use core::{fmt, iter::FusedIterator, ops::Range};

use crate::{BaoChunk, BlockSize, CHUNK_SIZE, traversal::RangeTraversal};

/// Complete proof validation relative to the supplied root and complete size.
/// This sealed view does not establish a particle/root association. It retains
/// only immutable proof bytes and the admitted root/size/block/request tuple;
/// successful validation establishes the fixed eight-byte header for replay.
/// It can outlive its verifier, but cannot outlive or mutate the proof storage.
pub struct VerifiedProof<'a> {
    proof: &'a [u8],
    root: [u8; 32],
    size: u64,
    block: BlockSize,
    request: Range<u64>,
}
impl<'a> VerifiedProof<'a> {
    pub(super) fn new(
        proof: &'a [u8],
        root: [u8; 32],
        size: u64,
        block: BlockSize,
        request: Range<u64>,
    ) -> Self {
        Self {
            proof,
            root,
            size,
            block,
            request,
        }
    }
    pub fn root(&self) -> [u8; 32] {
        self.root
    }
    pub fn size(&self) -> u64 {
        self.size
    }
    pub fn block_size(&self) -> BlockSize {
        self.block
    }
    /// The original half-open requested byte interval, independent of group cover.
    pub fn request(&self) -> Range<u64> {
        self.request.clone()
    }

    /// Start bounded geometry replay without scanning, rehashing or copying bytes.
    /// Each pending next is one separately chargeable parent/leaf action. A caller
    /// copies only the requested intersection of each whole leaf under its own
    /// persistent work/storage limits. An empty verified file emits no items.
    pub fn items(&self) -> ProofItems<'a> {
        ProofItems {
            proof: self.proof,
            cursor: 8,
            traversal: RangeTraversal::new(self.size, self.block, self.request.clone())
                .expect("sealed geometry"),
        }
    }
}

/// One output action. Public slice/coordinate values are not sealed authority;
/// obtain them through a completed view and its externally trusted root.
pub enum ProofItem<'a> {
    /// Opaque parent skip, exactly 64 encoded bytes. Count it positionally and
    /// charge its action; replay does not scan across it to find a payload.
    Parent,
    /// Whole selected group (only the final file group may be short).
    Leaf {
        file_offset: u64,
        proof_offset: usize,
        bytes: &'a [u8],
    },
}

/// Fixed-frontier output cursor. Every pending next returns one item; terminal
/// polls are fused, with no hashing, allocation or copying in any action.
pub struct ProofItems<'a> {
    proof: &'a [u8],
    cursor: usize,
    traversal: RangeTraversal,
}
impl ProofItems<'_> {
    /// True immediately after the final emission, or for an empty verified file.
    pub fn is_complete(&self) -> bool {
        self.traversal.is_complete()
    }
}
impl<'a> Iterator for ProofItems<'a> {
    type Item = ProofItem<'a>;
    fn next(&mut self) -> Option<Self::Item> {
        match self.traversal.next()? {
            BaoChunk::Parent { .. } => {
                self.cursor += super::PAIR_BYTES;
                Some(ProofItem::Parent)
            }
            BaoChunk::Leaf {
                start_chunk, size, ..
            } => {
                let proof_offset = self.cursor;
                self.cursor += size;
                // The sealed immutable proof already passed these exact extents;
                // checked traversal bounds start_chunk*4096 by the file length.
                Some(ProofItem::Leaf {
                    file_offset: start_chunk * CHUNK_SIZE as u64,
                    proof_offset,
                    bytes: &self.proof[proof_offset..self.cursor],
                })
            }
        }
    }
}
impl FusedIterator for ProofItems<'_> {}

impl fmt::Debug for VerifiedProof<'_> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("VerifiedProof")
            .field("proof_bytes", &self.proof.len())
            .field("root", &self.root)
            .field("size", &self.size)
            .field("block", &self.block)
            .field("request", &self.request)
            .finish()
    }
}
impl fmt::Debug for ProofItems<'_> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("ProofItems")
            .field("proof_bytes", &self.proof.len())
            .field("cursor", &self.cursor)
            .field("complete", &self.is_complete())
            .finish()
    }
}
impl fmt::Debug for ProofItem<'_> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Self::Parent => f.write_str("Parent"),
            Self::Leaf {
                file_offset,
                proof_offset,
                bytes,
            } => f
                .debug_struct("Leaf")
                .field("file_offset", file_offset)
                .field("proof_offset", proof_offset)
                .field("bytes", &bytes.len())
                .finish(),
        }
    }
}

===== 020 END =====

===== 021 BEGIN Candidate full cyber-bao/tests/proof.rs | 10191 bytes | SHA256 9c7a06da1f77d9966e940c29aee04184c958f5513224128ba19b7113b28c4eb9 =====
//! Literal schedules, borrowed output and external scheduling; no legacy roundtrip oracle.
#[path = "support/proof.rs"]
mod support;

use cyber_bao::{
    BlockSize,
    proof::{ProofItem, ProofVerifier, VerifiedProof},
};
use support::{Case, cases, named};

fn finish(c: &Case) -> VerifiedProof<'_> {
    let mut job =
        ProofVerifier::new(&c.wire, c.root, c.size, BlockSize(c.log), c.request.clone()).unwrap();
    for index in 1..c.actions {
        assert!(!job.is_finished(), "{} action {index}", c.name);
        assert!(job.step().unwrap().is_none(), "{} action {index}", c.name);
    }
    assert!(!job.is_finished());
    let view = job.step().unwrap().expect("EOF action seals once");
    assert!(job.is_finished());
    for _ in 0..10 {
        assert!(job.step().unwrap().is_none());
    }
    view
}

fn output(c: &Case, view: &VerifiedProof<'_>) {
    assert_eq!(view.root(), c.root);
    assert_eq!(view.size(), c.size);
    assert_eq!(view.block_size(), BlockSize(c.log));
    assert_eq!(view.request(), c.request);
    let mut changed_copy = view.request();
    changed_copy.start = u64::MAX;
    assert_ne!(changed_copy, view.request());
    let mut items = view.items();
    let mut other = view.items();
    fn fused<T: std::iter::FusedIterator>(_: &T) {}
    fused(&items);
    assert_eq!(items.is_complete(), c.output.is_empty());
    let mut requested = Vec::new();
    for (index, expected) in c.output.iter().enumerate() {
        assert!(!items.is_complete());
        let item = items.next().unwrap();
        let parallel = other.next().unwrap();
        match (item, parallel, expected) {
            (ProofItem::Parent, ProofItem::Parent, None) => {}
            (
                ProofItem::Leaf {
                    file_offset,
                    proof_offset,
                    bytes,
                },
                ProofItem::Leaf {
                    file_offset: f,
                    proof_offset: p,
                    bytes: b,
                },
                Some((offset, file, len)),
            ) => {
                assert_eq!(
                    (proof_offset, file_offset, bytes.len()),
                    (*offset, *file, *len)
                );
                assert_eq!((f, p, b), (file_offset, proof_offset, bytes));
                assert_eq!(bytes, &c.wire[*offset..*offset + *len]);
                assert_eq!(bytes.as_ptr(), c.wire[*offset..].as_ptr());
                let start = c.request.start.max(file_offset);
                let end = c
                    .request
                    .end
                    .min(file_offset + u64::try_from(bytes.len()).unwrap());
                requested.extend_from_slice(
                    &bytes[usize::try_from(start - file_offset).unwrap()
                        ..usize::try_from(end - file_offset).unwrap()],
                );
            }
            _ => panic!("{} event {index}", c.name),
        }
        assert_eq!(items.is_complete(), index + 1 == c.output.len());
    }
    for _ in 0..10 {
        assert!(items.next().is_none());
        assert!(other.next().is_none());
    }
    if c.name == "hello" {
        assert_eq!(requested, b"ell");
    } else if c.size != 0 {
        let body = support::data(usize::try_from(c.size).unwrap());
        assert_eq!(
            requested,
            body[usize::try_from(c.request.start).unwrap()
                ..usize::try_from(c.request.end).unwrap()]
        );
    } else {
        assert!(requested.is_empty());
    }
}

#[test]
fn literal_schedules_and_exact_borrowed_coordinates() {
    for c in cases() {
        let view = finish(&c);
        output(&c, &view);
    }
}

#[test]
fn caller_quotas_and_total_are_not_renewed_by_groups_or_yields() {
    for c in cases() {
        for quota in [1, 2, c.actions, c.actions + 1] {
            for limit in [c.actions - 1, c.actions, c.actions + 1] {
                let mut job = ProofVerifier::new(
                    &c.wire,
                    c.root,
                    c.size,
                    BlockSize(c.log),
                    c.request.clone(),
                )
                .unwrap();
                let mut paid = 0;
                let mut completed = None;
                while !job.is_finished() && paid < limit {
                    for _ in 0..quota {
                        if job.is_finished() || paid == limit {
                            break;
                        }
                        paid += 1; // external harness budget, not a Radio or Kadek API
                        if let Some(view) = job.step().unwrap() {
                            completed = Some(view);
                        }
                    }
                }
                assert_eq!(paid, limit.min(c.actions));
                assert_eq!(completed.is_some(), limit >= c.actions);
                assert_eq!(job.is_finished(), limit >= c.actions);
                if let Some(view) = completed {
                    output(&c, &view);
                }
            }
        }
    }
}

#[test]
fn jobs_can_interleave_and_views_outlive_verifiers_and_cursors() {
    let a = named("three-boundary");
    let b = named("grouped-left");
    let (va, vb) = {
        let mut ja =
            ProofVerifier::new(&a.wire, a.root, a.size, BlockSize(a.log), a.request.clone())
                .unwrap();
        let mut jb =
            ProofVerifier::new(&b.wire, b.root, b.size, BlockSize(b.log), b.request.clone())
                .unwrap();
        for _ in 1..b.actions {
            assert!(ja.step().unwrap().is_none());
            assert!(jb.step().unwrap().is_none());
        }
        let vb = jb.step().unwrap().unwrap();
        assert!(ja.step().unwrap().is_none());
        let va = ja.step().unwrap().unwrap();
        (va, vb)
    };
    output(&a, &va);
    output(&b, &vb);
    let kept = {
        let mut items = vb.items();
        assert!(matches!(items.next(), Some(ProofItem::Parent)));
        match items.next().unwrap() {
            ProofItem::Leaf { bytes, .. } => bytes,
            _ => unreachable!(),
        }
    };
    assert_eq!(kept, &b.wire[72..]);
}

#[test]
fn cancelling_at_each_pending_stage_publishes_nothing() {
    for c in cases() {
        for stop in 0..c.actions {
            let mut job =
                ProofVerifier::new(&c.wire, c.root, c.size, BlockSize(c.log), c.request.clone())
                    .unwrap();
            for _ in 0..stop {
                assert!(job.step().unwrap().is_none());
            }
            assert!(!job.is_finished());
        }
    }
}

#[test]
fn debug_does_not_print_payload() {
    let c = named("hello");
    let job =
        ProofVerifier::new(&c.wire, c.root, c.size, BlockSize(c.log), c.request.clone()).unwrap();
    assert!(!format!("{job:?}").contains("104, 101, 108, 108, 111"));
    let view = finish(&c);
    assert!(!format!("{view:?}").contains("104, 101, 108, 108, 111"));
    let mut items = view.items();
    assert!(!format!("{items:?}").contains("104, 101, 108, 108, 111"));
    assert!(!format!("{:?}", items.next().unwrap()).contains("104, 101, 108, 108, 111"));
}

#[test]
fn parent_after_payload_resumes_the_frontier_and_borrowed_output() {
    // Independent four-leaf tree and literal carrier; no encoder or traversal oracle.
    let body: Vec<u8> = (0..16384)
        .map(|i| ((29 * i + 7 * (i / 4096)) % 251) as u8)
        .collect();
    let l0 = support::leaf(&body[..4096], 0);
    let l1 = support::leaf(&body[4096..8192], 1);
    let l2 = support::leaf(&body[8192..12288], 2);
    let l3 = support::leaf(&body[12288..], 3);
    let p01 = support::parent(l0, l1, false);
    let p23 = support::parent(l2, l3, false);
    let root = support::parent(p01, p23, true);
    assert_eq!(
        *root.as_bytes(),
        support::digest("e621f66b42fb61b260200dfa649d3f16d35cde5af2e8c04cc2551c109f00c6f6")
    );
    let mut wire = u64::try_from(body.len()).unwrap().to_le_bytes().to_vec();
    support::pair(&mut wire, p01, p23);
    support::pair(&mut wire, l0, l1);
    wire.extend_from_slice(&body[..8192]);
    assert_eq!(wire.len(), 8328);
    support::pair(&mut wire, l2, l3);
    wire.extend_from_slice(&body[8192..12288]);
    assert_eq!(wire.len(), 12488);
    let c = Case {
        name: "four-interleaved",
        root: *root.as_bytes(),
        size: 16384,
        log: 0,
        request: 4095..8193,
        wire,
        actions: 11,
        output: vec![
            None,
            None,
            Some((136, 0, 4096)),
            Some((4232, 4096, 4096)),
            None,
            Some((8392, 8192, 4096)),
        ],
    };
    for stop in 0..11 {
        let mut job =
            ProofVerifier::new(&c.wire, c.root, c.size, BlockSize(0), 4095..8193).unwrap();
        for _ in 0..stop {
            assert!(job.step().unwrap().is_none());
        }
        assert!(!job.is_finished());
    }
    let view = finish(&c);
    let mut items = view.items();
    let mut selected = Vec::new();
    for expected in &c.output {
        assert!(!items.is_complete());
        match (items.next().unwrap(), expected) {
            (ProofItem::Parent, None) => {}
            (
                ProofItem::Leaf {
                    proof_offset,
                    file_offset,
                    bytes,
                },
                Some((p, f, n)),
            ) => {
                assert_eq!((proof_offset, file_offset, bytes.len()), (*p, *f, *n));
                assert_eq!(bytes.as_ptr(), c.wire[*p..].as_ptr());
                let begin = usize::try_from(*f).unwrap();
                assert_eq!(bytes, &body[begin..begin + *n]);
                let start = 4095u64.max(*f) - *f;
                let end = 8193u64.min(*f + 4096) - *f;
                selected.extend_from_slice(
                    &bytes[usize::try_from(start).unwrap()..usize::try_from(end).unwrap()],
                );
            }
            _ => panic!("literal interleaved event mismatch"),
        }
    }
    assert!(items.is_complete());
    assert!(items.next().is_none());
    assert_eq!(selected, body[4095..8193]);
    assert_ne!(&c.wire[4231..4231 + selected.len()], selected);
}

===== 021 END =====

===== 022 BEGIN Candidate full cyber-bao/tests/proof_failures.rs | 11662 bytes | SHA256 9a89df71bbdd17dec76b9907dd026a3b4104cfe77d12367b12a86140f67e1af7 =====
//! Error variants, literal coordinates and first-error precedence.
#[path = "support/proof.rs"]
mod support;

use cyber_bao::{
    BlockSize, TreeNode,
    proof::{ProofError, ProofVerifier},
    traversal::RangeTraversalError,
};
use hemera::{Hash, field::P};
use support::{Case, digest, named};

fn failure(c: &Case, expected: ProofError, action: usize) {
    let mut job =
        ProofVerifier::new(&c.wire, c.root, c.size, BlockSize(c.log), c.request.clone()).unwrap();
    for i in 1..action {
        assert!(
            job.step().unwrap().is_none(),
            "{} prematurely completed at {i}",
            c.name
        );
        assert!(!job.is_finished());
    }
    assert_eq!(
        job.step().unwrap_err(),
        expected,
        "{} action {action}",
        c.name
    );
    assert!(job.is_finished());
    for _ in 0..10 {
        assert_eq!(job.step().unwrap_err(), expected);
    }
}

#[test]
#[allow(clippy::reversed_empty_ranges)] // Intentionally invalid request geometry.
fn geometry_precedes_empty_request_and_root_canonicality() {
    for log in 0..=255 {
        let admitted = match usize::BITS {
            64 => log <= 51,
            32 => log <= 19,
            _ => panic!("unsupported host width"),
        };
        for size in [0, 1, u64::MAX] {
            let request = if size == 0 { 0..0 } else { 0..1 };
            let result = ProofVerifier::new(&[], [0; 32], size, BlockSize(log), request);
            if admitted {
                assert!(result.is_ok());
            } else {
                assert_eq!(
                    result.unwrap_err(),
                    ProofError::Geometry(RangeTraversalError::InvalidBlockSize)
                );
            }
        }
    }
    for request in [2..1, 0..6] {
        assert_eq!(
            ProofVerifier::new(&[], [255; 32], 5, BlockSize(0), request).unwrap_err(),
            ProofError::Geometry(RangeTraversalError::InvalidRange)
        );
    }
    assert_eq!(
        ProofVerifier::new(&[], [255; 32], 0, BlockSize(255), 1..0).unwrap_err(),
        ProofError::Geometry(RangeTraversalError::InvalidBlockSize)
    );
    assert_eq!(
        ProofVerifier::new(&[], [255; 32], 0, BlockSize(0), 0..1).unwrap_err(),
        ProofError::Geometry(RangeTraversalError::InvalidRange)
    );
    for at in [0, 2, 5] {
        assert_eq!(
            ProofVerifier::new(&[], [255; 32], 5, BlockSize(0), at..at).unwrap_err(),
            ProofError::EmptyRequest
        );
    }
}

#[test]
fn each_expected_root_word_has_exact_canonical_boundary() {
    for word in 0..4 {
        for value in [0, P - 1, P, u64::MAX] {
            let mut root = [0; 32];
            root[word * 8..word * 8 + 8].copy_from_slice(&value.to_le_bytes());
            let result = ProofVerifier::new(&[], root, 1, BlockSize(0), 0..1);
            if value < P {
                assert!(result.is_ok());
            } else {
                assert_eq!(
                    result.unwrap_err(),
                    ProofError::NonCanonicalRoot {
                        word: u8::try_from(word).unwrap()
                    }
                );
            }
        }
    }
    assert_eq!(
        ProofVerifier::new(&[], [255; 32], 1, BlockSize(0), 0..1).unwrap_err(),
        ProofError::NonCanonicalRoot { word: 0 }
    );
}

#[test]
fn header_size_is_trusted_input_and_every_truncation_is_exact() {
    for declared in [0, 4, 6, 4096, u64::MAX] {
        let mut c = named("hello");
        c.wire[..8].copy_from_slice(&declared.to_le_bytes());
        failure(
            &c,
            ProofError::SizeMismatch {
                expected: 5,
                declared,
            },
            1,
        );
    }
    for name in ["three-interior", "grouped-left"] {
        let mut c = named(name);
        let full = c.wire.clone();
        for len in 0..full.len() {
            c.wire = full[..len].to_vec();
            let (offset, needed, action) = if len < 8 {
                (0, 8, 1)
            } else if len < 72 {
                (8, 64, 2)
            } else if name == "three-interior" && len < 136 {
                (72, 64, 3)
            } else if name == "three-interior" {
                (136, 4096, 4)
            } else {
                (72, 8192, 3)
            };
            failure(&c, ProofError::Truncated { offset, needed }, action);
        }
    }
}

#[test]
fn both_children_all_words_reject_noncanonical_before_hashing() {
    for pair_start in [8, 72] {
        for child in [0, 32] {
            for word in 0..4 {
                for value in [P, u64::MAX] {
                    let mut c = named("three-interior");
                    let offset = pair_start + child + word * 8;
                    c.wire[offset..offset + 8].copy_from_slice(&value.to_le_bytes());
                    failure(
                        &c,
                        ProofError::NonCanonicalHash { offset },
                        if pair_start == 8 { 2 } else { 3 },
                    );
                }
            }
        }
    }
    let mut c = named("three-interior");
    c.wire[8..16].copy_from_slice(&P.to_le_bytes());
    c.wire.truncate(71);
    failure(
        &c,
        ProofError::Truncated {
            offset: 8,
            needed: 64,
        },
        2,
    );
}

#[test]
fn canonical_parent_and_payload_corruption_never_publish() {
    for pair_start in [8, 72] {
        let mut c = named("three-interior");
        let left = c.wire[pair_start..pair_start + 32].to_vec();
        c.wire
            .copy_within(pair_start + 32..pair_start + 64, pair_start);
        c.wire[pair_start + 32..pair_start + 64].copy_from_slice(&left);
        failure(
            &c,
            ProofError::ParentMismatch {
                node: TreeNode::new(if pair_start == 8 { 3 } else { 1 }),
            },
            if pair_start == 8 { 2 } else { 3 },
        );
    }
    let mut c = named("three-interior");
    c.root = [0; 32];
    failure(
        &c,
        ProofError::ParentMismatch {
            node: TreeNode::new(3),
        },
        2,
    );
    let mut c = named("three-interior");
    c.wire[40..72].fill(0);
    failure(
        &c,
        ProofError::ParentMismatch {
            node: TreeNode::new(3),
        },
        2,
    );
    for (offset, start_chunk, action) in [(136, 0, 5), (4232, 1, 7)] {
        let mut c = named("three-boundary");
        c.wire[offset] ^= 1;
        failure(&c, ProofError::LeafMismatch { start_chunk }, action);
    }
    let mut c = named("sole-group");
    c.root = digest("11890a7e7cf1e4de463a04bf53bfdf269d627983a221daaf9029a3ff43297389");
    failure(&c, ProofError::LeafMismatch { start_chunk: 0 }, 5);
}

#[test]
fn representation_aliases_are_not_normalized() {
    let d = support::data(4096);
    let left = support::leaf(&d, 0);
    let zero = Hash::from_bytes([0; 32]);
    let root = support::parent(left, zero, true);
    let mut c = named("three-right");
    c.root = *root.as_bytes();
    c.size = 8192;
    c.request = 0..1;
    c.wire = 8192u64.to_le_bytes().to_vec();
    support::pair(&mut c.wire, left, zero);
    c.wire.extend_from_slice(&d);
    for word in 0..4 {
        let mut alias = c.wire.clone();
        let offset = 40 + word * 8;
        alias[offset..offset + 8].copy_from_slice(&P.to_le_bytes());
        std::mem::swap(&mut c.wire, &mut alias);
        failure(&c, ProofError::NonCanonicalHash { offset }, 2);
        std::mem::swap(&mut c.wire, &mut alias);
    }
}

#[test]
fn absolute_chunk_counter_is_not_relative_to_the_selected_group() {
    let mut c = named("three-right");
    let payload = c.wire[72..].to_vec();
    let wrong = support::leaf(&payload, 0);
    let zero = Hash::from_bytes([0; 32]);
    c.root = *support::parent(zero, wrong, true).as_bytes();
    c.wire = 12288u64.to_le_bytes().to_vec();
    support::pair(&mut c.wire, zero, wrong);
    c.wire.extend_from_slice(&payload);
    failure(&c, ProofError::LeafMismatch { start_chunk: 2 }, 4);
}

#[test]
fn exact_eof_is_a_separate_required_commit() {
    for name in ["empty", "hello", "three-boundary", "sole-group"] {
        for concatenate in [false, true] {
            let mut c = named(name);
            let end = c.wire.len();
            if concatenate {
                c.wire.extend_from_slice(&c.wire.clone());
            } else {
                c.wire.push(0);
            }
            failure(&c, ProofError::TrailingBytes { offset: end }, c.actions);
        }
    }
    let mut c = named("empty");
    c.root = [0; 32];
    failure(&c, ProofError::LeafMismatch { start_chunk: 0 }, 3);
    for name in ["hello", "three-right"] {
        let mut c = named(name);
        c.wire.truncate(8);
        failure(
            &c,
            ProofError::Truncated {
                offset: 8,
                needed: if name == "hello" { 5 } else { 64 },
            },
            2,
        );
    }
}

#[test]
fn maximum_frontier_prefix_uses_literal_small_missing_leaf() {
    let (root, wire) = support::deep_prefix();
    let c = Case {
        name: "deep",
        root,
        wire,
        size: u64::MAX,
        log: 0,
        request: 0..u64::MAX,
        actions: 56,
        output: Vec::new(),
    };
    failure(
        &c,
        ProofError::Truncated {
            offset: 7432,
            needed: 4096,
        },
        56,
    );
}

#[test]
#[cfg(target_pointer_width = "64")]
fn largest_group_width_is_geometry_not_allocation_admission() {
    let zero = Hash::from_bytes([0; 32]);
    let root = support::parent(zero, zero, true);
    let mut wire = u64::MAX.to_le_bytes().to_vec();
    support::pair(&mut wire, zero, zero);
    assert_eq!(wire.len(), 72);
    let c = Case {
        name: "large",
        root: *root.as_bytes(),
        wire,
        size: u64::MAX,
        log: 51,
        request: 0..1,
        actions: 3,
        output: Vec::new(),
    };
    failure(
        &c,
        ProofError::Truncated {
            offset: 72,
            needed: 1usize << 63,
        },
        3,
    );
}

#[test]
fn diagnostic_strings_and_core_error_trait_are_frozen() {
    fn core_error<E: core::error::Error>() {}
    core_error::<ProofError>();
    for (error, text) in [
        (
            ProofError::Geometry(RangeTraversalError::InvalidBlockSize),
            "invalid traversal block size",
        ),
        (
            ProofError::Geometry(RangeTraversalError::InvalidRange),
            "invalid traversal byte range",
        ),
        (ProofError::EmptyRequest, "empty request for nonempty file"),
        (
            ProofError::NonCanonicalRoot { word: 2 },
            "noncanonical expected root word 2",
        ),
        (
            ProofError::Truncated {
                offset: 72,
                needed: 4096,
            },
            "truncated proof at 72: need 4096 bytes",
        ),
        (
            ProofError::SizeMismatch {
                expected: 5,
                declared: 6,
            },
            "proof size 6 differs from expected 5",
        ),
        (
            ProofError::NonCanonicalHash { offset: 40 },
            "noncanonical proof hash word at 40",
        ),
        (
            ProofError::ParentMismatch {
                node: TreeNode::new(3),
            },
            "proof parent mismatch at node 3",
        ),
        (
            ProofError::LeafMismatch { start_chunk: 2 },
            "proof leaf mismatch at chunk 2",
        ),
        (
            ProofError::TrailingBytes { offset: 13 },
            "trailing proof bytes at 13",
        ),
    ] {
        assert_eq!(error.to_string(), text);
    }
}

===== 022 END =====

===== 023 BEGIN Candidate full cyber-bao/tests/proof_allocation.rs | 4240 bytes | SHA256 b8dc7985cc0cf68e68530d19cc8040b8ed28773c67965b5170ad571645b45df5 =====
//! Concrete host observation; fixture allocation and destruction are outside it.
#[path = "support/proof.rs"]
mod support;

use std::{
    alloc::{GlobalAlloc, Layout, System},
    cell::Cell,
    hint::black_box,
};

use cyber_bao::{BlockSize, proof::ProofVerifier};

thread_local! {
    static ACTIVE: Cell<bool> = const { Cell::new(false) };
    static COUNT: Cell<usize> = const { Cell::new(0) };
}
struct Allocator;
fn record() {
    ACTIVE.with(|active| {
        if active.get() {
            COUNT.with(|n| n.set(n.get() + 1));
        }
    });
}
unsafe impl GlobalAlloc for Allocator {
    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
        record();
        // SAFETY: preserve the allocator's incoming layout.
        unsafe { System.alloc(layout) }
    }
    unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 {
        record();
        // SAFETY: preserve the allocator's incoming layout.
        unsafe { System.alloc_zeroed(layout) }
    }
    unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, size: usize) -> *mut u8 {
        record();
        // SAFETY: preserve the original pointer/layout and requested new size.
        unsafe { System.realloc(ptr, layout, size) }
    }
    unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
        // SAFETY: preserve the original allocation identity; frees are not allocs.
        unsafe { System.dealloc(ptr, layout) }
    }
}
#[global_allocator]
static ALLOCATOR: Allocator = Allocator;

fn observed<T>(f: impl FnOnce() -> T) -> T {
    struct Guard;
    impl Drop for Guard {
        fn drop(&mut self) {
            ACTIVE.with(|a| a.set(false));
        }
    }
    COUNT.with(|n| n.set(0));
    ACTIVE.with(|a| assert!(!a.replace(true)));
    let guard = Guard;
    let result = f();
    drop(guard);
    assert_eq!(COUNT.with(Cell::get), 0);
    result
}

#[test]
fn concrete_verifier_all_stages_output_failure_and_cancel_allocate_nothing() {
    COUNT.with(|n| n.set(0));
    ACTIVE.with(|a| a.set(true));
    let positive = black_box(vec![17u8; 17]);
    ACTIVE.with(|a| a.set(false));
    assert!(COUNT.with(Cell::get) > 0);
    drop(positive);
    let all = support::cases(); // construction and eventual drop outside observation
    for c in &all {
        let mut job = observed(|| {
            ProofVerifier::new(&c.wire, c.root, c.size, BlockSize(c.log), c.request.clone())
                .unwrap()
        });
        let mut view = None;
        while !job.is_finished() {
            if let Some(v) = observed(|| job.step().unwrap()) {
                view = Some(v);
            }
        }
        let view = view.unwrap();
        for _ in 0..10 {
            assert!(observed(|| job.step().unwrap()).is_none());
        }
        let mut items = observed(|| view.items());
        while !items.is_complete() {
            black_box(observed(|| items.next()));
        }
        for _ in 0..10 {
            assert!(observed(|| items.next()).is_none());
        }
        observed(|| {
            black_box(items);
            black_box(view);
            black_box(job);
        });
        for stop in 0..c.actions {
            let mut job = observed(|| {
                ProofVerifier::new(&c.wire, c.root, c.size, BlockSize(c.log), c.request.clone())
                    .unwrap()
            });
            for _ in 0..stop {
                assert!(observed(|| job.step().unwrap()).is_none());
            }
            observed(|| {
                black_box(job);
            });
        }
    }
    let mut corrupt = support::named("three-boundary");
    corrupt.wire.push(0);
    let mut job = observed(|| {
        ProofVerifier::new(
            &corrupt.wire,
            corrupt.root,
            corrupt.size,
            BlockSize(corrupt.log),
            corrupt.request.clone(),
        )
        .unwrap()
    });
    for _ in 1..corrupt.actions {
        assert!(observed(|| job.step().unwrap()).is_none());
    }
    let error = observed(|| job.step().unwrap_err());
    for _ in 0..10 {
        assert_eq!(observed(|| job.step().unwrap_err()), error);
    }
    observed(|| {
        black_box(job);
    });
    assert!(observed(|| ProofVerifier::new(&[], [0; 32], 0, BlockSize(255), 0..0)).is_err());
}

===== 023 END =====

===== 024 BEGIN Candidate full cyber-bao/tests/support/proof.rs | 7549 bytes | SHA256 a28d04cb2d1cee78f950b895956830fe849cfe97256649b3a2088200994c5ddd =====
#![allow(dead_code)]
//! Independent small-tree expressions and literal carrier coordinates.
use std::ops::Range;

use cyber_bao::{HashBackend, Poseidon2Backend};
use hemera::Hash;

pub struct Case {
    pub name: &'static str,
    pub root: [u8; 32],
    pub size: u64,
    pub log: u8,
    pub request: Range<u64>,
    pub wire: Vec<u8>,
    pub actions: usize,
    /// None is one opaque parent; Some is (proof offset, file offset, length).
    pub output: Vec<Option<(usize, u64, usize)>>,
}

pub fn data(n: usize) -> Vec<u8> {
    (0..n).map(|i| ((31 * i + i / 4096) % 256) as u8).collect()
}
pub fn digest(hex: &str) -> [u8; 32] {
    std::array::from_fn(|i| u8::from_str_radix(&hex[2 * i..2 * i + 2], 16).unwrap())
}
pub fn leaf(data: &[u8], counter: u64) -> Hash {
    Poseidon2Backend.chunk_hash(data, counter, false)
}
pub fn parent(left: Hash, right: Hash, root: bool) -> Hash {
    Poseidon2Backend.parent_hash(&left, &right, root)
}
pub fn pair(wire: &mut Vec<u8>, left: Hash, right: Hash) {
    wire.extend_from_slice(left.as_bytes());
    wire.extend_from_slice(right.as_bytes());
}
fn case(name: &'static str, root: Hash, size: u64, log: u8, request: Range<u64>) -> Case {
    Case {
        name,
        root: *root.as_bytes(),
        size,
        log,
        request,
        wire: size.to_le_bytes().to_vec(),
        actions: 0,
        output: Vec::new(),
    }
}
pub fn cases() -> Vec<Case> {
    let mut out = Vec::new();
    let empty = Poseidon2Backend.chunk_hash(&[], 0, true);
    assert_eq!(
        *empty.as_bytes(),
        digest("ea57b2e6b1ec7d2de11b15cb6d7060dd61d247fe0fbf5f7d3fb97a7be9328552")
    );
    let mut c = case("empty", empty, 0, 0, 0..0);
    c.actions = 4;
    out.push(c);
    let hello = Poseidon2Backend.chunk_hash(b"hello", 0, true);
    assert_eq!(
        *hello.as_bytes(),
        digest("626fa46e4e7bd5c87d630eef8333931a0b9198587400a0191eae7821692880d7")
    );
    let mut c = case("hello", hello, 5, 0, 1..4);
    c.wire.extend_from_slice(b"hello");
    c.actions = 4;
    c.output = vec![Some((8, 0, 5))];
    out.push(c);

    let d = data(12288);
    let l0 = leaf(&d[..4096], 0);
    let l1 = leaf(&d[4096..8192], 1);
    let l2 = leaf(&d[8192..], 2);
    let p01 = parent(l0, l1, false);
    let root = parent(p01, l2, true);
    assert_eq!(
        *root.as_bytes(),
        digest("373d0ded6b2bd351ba575cdc690ca79bbc04af1a49844f67140ce7a10e672992")
    );
    let mut c = case("three-right", root, 12288, 0, 8192..8193);
    pair(&mut c.wire, p01, l2);
    c.wire.extend_from_slice(&d[8192..]);
    c.actions = 5;
    c.output = vec![None, Some((72, 8192, 4096))];
    out.push(c);
    let mut c = case("three-interior", root, 12288, 0, 4097..4100);
    pair(&mut c.wire, p01, l2);
    pair(&mut c.wire, l0, l1);
    c.wire.extend_from_slice(&d[4096..8192]);
    c.actions = 6;
    c.output = vec![None, None, Some((136, 4096, 4096))];
    out.push(c);
    let mut c = case("three-boundary", root, 12288, 0, 4095..4097);
    pair(&mut c.wire, p01, l2);
    pair(&mut c.wire, l0, l1);
    c.wire.extend_from_slice(&d[..8192]);
    c.actions = 8;
    c.output = vec![None, None, Some((136, 0, 4096)), Some((4232, 4096, 4096))];
    out.push(c);
    let mut c = case("grouped-left", root, 12288, 1, 4095..4097);
    pair(&mut c.wire, p01, l2);
    c.wire.extend_from_slice(&d[..8192]);
    c.actions = 7;
    c.output = vec![None, Some((72, 0, 8192))];
    out.push(c);
    let short = data(8193);
    let final_cv = leaf(&short[8192..], 2);
    let short_root = parent(p01, final_cv, true);
    assert_eq!(
        *short_root.as_bytes(),
        digest("40c6bd68b6e89443753bce2dd95fd159da63a7399340fa6070a762d102d9e3ae")
    );
    let mut c = case("final-short", short_root, 8193, 1, 8192..8193);
    pair(&mut c.wire, p01, final_cv);
    c.wire.extend_from_slice(&short[8192..]);
    c.actions = 5;
    c.output = vec![None, Some((72, 8192, 1))];
    out.push(c);
    let root2 = parent(l0, l1, true);
    assert_eq!(
        *root2.as_bytes(),
        digest("2abf65dd26465a7352707d79d18ff3aab9ee5d97614a774619c79ed527e20190")
    );
    assert_eq!(
        *p01.as_bytes(),
        digest("11890a7e7cf1e4de463a04bf53bfdf269d627983a221daaf9029a3ff43297389")
    );
    assert_ne!(root2, p01);
    let mut c = case("sole-group", root2, 8192, 1, 1..8191);
    c.wire.extend_from_slice(&d[..8192]);
    c.actions = 6;
    c.output = vec![Some((8, 0, 8192))];
    out.push(c);

    for (log, actions) in [(0, 10), (1, 9), (2, 8), (4, 8)] {
        let mut c = case("full-three", root, 12288, log, 0..12288);
        if log == 0 {
            pair(&mut c.wire, p01, l2);
            pair(&mut c.wire, l0, l1);
            c.output = vec![
                None,
                None,
                Some((136, 0, 4096)),
                Some((4232, 4096, 4096)),
                Some((8328, 8192, 4096)),
            ];
        } else if log == 1 {
            pair(&mut c.wire, p01, l2);
            c.output = vec![None, Some((72, 0, 8192)), Some((8264, 8192, 4096))];
        } else {
            c.output = vec![Some((8, 0, 12288))];
        }
        c.wire.extend_from_slice(&d);
        c.actions = actions;
        out.push(c);
    }
    let d = data(7 * 4096);
    let l: Vec<_> = d
        .chunks(4096)
        .enumerate()
        .map(|(i, b)| leaf(b, u64::try_from(i).unwrap()))
        .collect();
    let p01 = parent(l[0], l[1], false);
    let p23 = parent(l[2], l[3], false);
    let p03 = parent(p01, p23, false);
    let p45 = parent(l[4], l[5], false);
    let p46 = parent(p45, l[6], false);
    let root5 = parent(p03, l[4], true);
    let root7 = parent(p03, p46, true);
    let mut c = case("five-right", root5, 5 * 4096, 0, 16384..16385);
    pair(&mut c.wire, p03, l[4]);
    c.wire.extend_from_slice(&d[16384..20480]);
    c.actions = 5;
    c.output = vec![None, Some((72, 16384, 4096))];
    out.push(c);
    let mut c = case("five-interior", root5, 5 * 4096, 0, 12289..12290);
    pair(&mut c.wire, p03, l[4]);
    pair(&mut c.wire, p01, p23);
    pair(&mut c.wire, l[2], l[3]);
    c.wire.extend_from_slice(&d[12288..16384]);
    c.actions = 7;
    c.output = vec![None, None, None, Some((200, 12288, 4096))];
    out.push(c);
    let mut c = case("seven-right", root7, 7 * 4096, 0, 24576..24577);
    pair(&mut c.wire, p03, p46);
    pair(&mut c.wire, p45, l[6]);
    c.wire.extend_from_slice(&d[24576..]);
    c.actions = 6;
    c.output = vec![None, None, Some((136, 24576, 4096))];
    out.push(c);
    let mut c = case("seven-interior", root7, 7 * 4096, 0, 20481..20482);
    pair(&mut c.wire, p03, p46);
    pair(&mut c.wire, p45, l[6]);
    pair(&mut c.wire, l[4], l[5]);
    c.wire.extend_from_slice(&d[20480..24576]);
    c.actions = 7;
    c.output = vec![None, None, None, Some((200, 20480, 4096))];
    out.push(c);
    out
}

pub fn named(name: &str) -> Case {
    cases().into_iter().find(|c| c.name == name).unwrap()
}

/// Synthetic commitment prefix; no actual enormous complete file is witnessed.
pub fn deep_prefix() -> ([u8; 32], Vec<u8>) {
    let d = data(4096);
    let mut left = leaf(&d, 0);
    let zero = Hash::from_bytes([0; 32]);
    let mut pairs = Vec::new();
    for level in 0..52 {
        pairs.push((left, zero));
        left = parent(left, zero, level == 51);
    }
    let mut wire = u64::MAX.to_le_bytes().to_vec();
    for (left, right) in pairs.into_iter().rev() {
        pair(&mut wire, left, right);
    }
    wire.extend_from_slice(&d);
    assert_eq!(wire.len(), 7432);
    (*left.as_bytes(), wire)
}

===== 024 END =====

===== 025 BEGIN Compiler probe seals/src/bin/constructor.rs | 108 bytes | SHA256 44b1343431ff98e05bc62e5abf3ca7fdfde4859592c1b151bc69dae4b65caaa3 =====
fn main() { let _ = cyber_bao::proof::VerifiedProof::new(&[], [0; 32], 0, cyber_bao::BlockSize(0), 0..0); }

===== 025 END =====

===== 026 BEGIN Compiler probe seals/src/bin/control.rs | 171 bytes | SHA256 558682e413efd5b96880b5f2b63b1ebe7af955486ef0ccc003d1f4702f138263 =====
fn main() {
    let proof = vec![0u8; 8];
    let view = bao_proof_seal_probes::finish(&proof);
    assert_eq!(view.size(), 0);
    assert!(view.items().is_complete());
}

===== 026 END =====

===== 027 BEGIN Compiler probe seals/src/bin/conversion.rs | 77 bytes | SHA256 39e3ae2696cd620bad12c42123ca6d7e9f4834f10e8e4219bc1a35f49873bb3b =====
fn main() { let _: cyber_bao::proof::VerifiedProof<'_> = (&[][..]).into(); }

===== 027 END =====

===== 028 BEGIN Compiler probe seals/src/bin/deserialize.rs | 125 bytes | SHA256 56add0d77940a54750248e16e144d5824b5290bdc551196552f3a9fcf3c1fc9c =====
fn main() {
    fn require<T: serde::de::DeserializeOwned>() {}
    require::<cyber_bao::proof::VerifiedProof<'static>>();
}

===== 028 END =====

===== 029 BEGIN Compiler probe seals/src/bin/deserialize_static.rs | 125 bytes | SHA256 abcf92a7802f3d3945732beedf337cf9f387235fbcd9f7757eaebd36f4e87d16 =====
fn main() {
    fn require<T: serde::Deserialize<'static>>() {}
    require::<cyber_bao::proof::VerifiedProof<'static>>();
}

===== 029 END =====

===== 030 BEGIN Compiler probe seals/src/bin/drop_proof.rs | 140 bytes | SHA256 83e25ff462790ef05d4ca4046a079a0a4d01cb08458fa60c3101146fe6ced3a1 =====
fn main() {
    let proof = vec![0u8; 8];
    let view = bao_proof_seal_probes::finish(&proof);
    drop(proof);
    let _ = view.size();
}

===== 030 END =====

===== 031 BEGIN Compiler probe seals/src/bin/fields.rs | 145 bytes | SHA256 6673bad9d61073ef76ee5e9f4c6e1c151e94d2e7f12f32bd878e68908d3747d7 =====
fn main() {
    let _ = cyber_bao::proof::VerifiedProof { proof: &[], root: [0; 32], size: 0, block: cyber_bao::BlockSize(0), request: 0..0 };
}

===== 031 END =====

===== 032 BEGIN Compiler probe seals/src/bin/mutate_leaf.rs | 223 bytes | SHA256 041145c756d14251a0f9ef67e4b423692500dddd30b8f89690dd0b279054877b =====
fn main() {
    let proof = vec![0u8; 8];
    let view = bao_proof_seal_probes::finish(&proof);
    for item in view.items() {
        if let cyber_bao::proof::ProofItem::Leaf { bytes, .. } = item { bytes[0] = 1; }
    }
}

===== 032 END =====

===== 033 BEGIN Compiler probe seals/src/bin/mutate_proof.rs | 145 bytes | SHA256 66c491bd2a52d63b5bb5bced4f17dc7bf9588539ff75db408debddbe7fa0fdc9 =====
fn main() {
    let mut proof = vec![0u8; 8];
    let view = bao_proof_seal_probes::finish(&proof);
    proof[0] = 1;
    let _ = view.size();
}

===== 033 END =====

===== 034 BEGIN Witness records/parent-absence.json | 1212 bytes | SHA256 7523cd0f2e01c26a5d4b7b5e9467a3a514aa546a189397df8cfd20da962c4449 =====
{
  "started": "2026-10-12T23:57:06.046346Z",
  "finished": "2026-10-12T23:57:20.534949Z",
  "cwd": "/Users/master/cyber/radio-bao-bounded-proof",
  "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
  "argv": [
    "env",
    "CARGO_BUILD_JOBS=2",
    "CARGO_INCREMENTAL=0",
    "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
    "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
    "RUSTFLAGS=-Dwarnings",
    "RUSTDOCFLAGS=-Dwarnings",
    "/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/cargo",
    "test",
    "--locked",
    "--offline",
    "-p",
    "cyber-bao",
    "--test",
    "proof",
    "--test",
    "proof_failures",
    "--test",
    "proof_allocation",
    "--no-run"
  ],
  "runner_sha256": "10fc0f8210a06cd42e2cc85d0f2b328da05a5e09e01c8feb75651b31fdb0d5d6",
  "exit_code": 101,
  "stdout": {
    "path": "/tmp/radio-bao-proof-parent-absence-v1.stdout",
    "bytes": 0,
    "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  "stderr": {
    "path": "/tmp/radio-bao-proof-parent-absence-v1.stderr",
    "bytes": 2931,
    "sha256": "a9cd37a774aacf036b089c1bf8ab48dfa2169a68da53380b7065a25bbbfe89cb"
  }
}

===== 034 END =====

===== 035 BEGIN Witness records/parent-absence.stdout | 0 bytes | SHA256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 =====

===== 035 END =====

===== 036 BEGIN Witness records/parent-absence.stderr | 2931 bytes | SHA256 a9cd37a774aacf036b089c1bf8ab48dfa2169a68da53380b7065a25bbbfe89cb =====
    Blocking waiting for file lock on package cache
    Blocking waiting for file lock on package cache
    Blocking waiting for file lock on package cache
   Compiling proc-macro2 v1.0.106
   Compiling unicode-ident v1.0.22
   Compiling quote v1.0.44
   Compiling libc v0.2.180
   Compiling syn v2.0.114
   Compiling getrandom v0.3.4
   Compiling version_check v0.9.5
   Compiling cfg-if v1.0.4
   Compiling syn v1.0.109
   Compiling proc-macro-error-attr v0.4.12
   Compiling fastrand v2.3.0
   Compiling proc-macro-error v0.4.12
   Compiling serde_core v1.0.228
   Compiling rustix v1.1.3
   Compiling zerocopy v0.8.39
   Compiling proc-macro-hack v0.5.20+deprecated
   Compiling syn-mid v0.5.4
   Compiling rand_core v0.9.5
   Compiling errno v0.3.14
   Compiling futures-core v0.3.31
   Compiling bitflags v2.10.0
   Compiling serde v1.0.228
   Compiling pin-project-lite v0.2.16
   Compiling autocfg v1.5.0
   Compiling smallvec v1.15.1
   Compiling ref-cast v1.0.25
   Compiling num-traits v0.2.19
   Compiling tokio-macros v2.6.0
   Compiling ref-cast-impl v1.0.25
   Compiling pin-project-internal v1.1.10
   Compiling parking v2.2.1
   Compiling futures-io v0.3.31
   Compiling once_cell v1.21.3
   Compiling bytes v1.11.1
   Compiling pin-project v1.1.10
   Compiling tokio v1.49.0
   Compiling tempfile v3.24.0
   Compiling futures-lite v2.6.1
   Compiling ppv-lite86 v0.2.21
   Compiling genawaiter-proc-macro v0.99.1
   Compiling inplace-vec-builder v0.1.1
   Compiling wait-timeout v0.2.1
   Compiling quick-error v1.2.3
   Compiling bit-vec v0.8.0
   Compiling fnv v1.0.7
   Compiling binary-merge v0.1.2
   Compiling genawaiter-macro v0.99.1
   Compiling range-collections v0.4.6
   Compiling genawaiter v0.99.1
   Compiling rusty-fork v0.3.1
   Compiling bit-set v0.8.0
   Compiling iroh-io v0.6.2
   Compiling rand_chacha v0.9.0
   Compiling rand v0.9.2
   Compiling rand_xorshift v0.4.0
   Compiling regex-syntax v0.8.9
   Compiling cyber-hemera v0.3.1 (https://github.com/cyberia-to/hemera?rev=d5f0a09539360934fb32db9b2e15a91995607db6#d5f0a095)
   Compiling unarray v0.1.4
   Compiling proptest v1.10.0
   Compiling cyber-bao v0.1.0 (/Users/master/cyber/radio-bao-bounded-proof/cyber-bao)
error[E0432]: unresolved import `cyber_bao::proof`
 --> cyber-bao/tests/proof.rs:7:5
  |
7 |     proof::{ProofItem, ProofVerifier, VerifiedProof},
  |     ^^^^^ could not find `proof` in `cyber_bao`

error[E0432]: unresolved import `cyber_bao::proof`
 --> cyber-bao/tests/proof_allocation.rs:5:28
  |
5 | use cyber_bao::{BlockSize, proof::ProofVerifier};
  |                            ^^^^^ could not find `proof` in `cyber_bao`

For more information about this error, try `rustc --explain E0432`.
error: could not compile `cyber-bao` (test "proof_allocation") due to 1 previous error
warning: build failed, waiting for other jobs to finish...
error: could not compile `cyber-bao` (test "proof") due to 1 previous error

===== 036 END =====

===== 037 BEGIN Witness records/parent-control.json | 1131 bytes | SHA256 92718dc3282fd92c29581a4709cc7ee6bc900e739dd9ce18dbb0fb6565e7fd58 =====
{
  "started": "2026-10-12T23:58:47.672850Z",
  "finished": "2026-10-12T23:58:48.378134Z",
  "cwd": "/Users/master/cyber/radio-bao-bounded-proof",
  "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
  "argv": [
    "env",
    "CARGO_BUILD_JOBS=2",
    "CARGO_INCREMENTAL=0",
    "CARGO_TARGET_DIR=/tmp/radio-bao-proof-target",
    "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
    "RUSTFLAGS=-Dwarnings",
    "RUSTDOCFLAGS=-Dwarnings",
    "/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/cargo",
    "test",
    "--locked",
    "--offline",
    "-p",
    "cyber-bao",
    "--test",
    "range_traversal"
  ],
  "runner_sha256": "10fc0f8210a06cd42e2cc85d0f2b328da05a5e09e01c8feb75651b31fdb0d5d6",
  "exit_code": 0,
  "stdout": {
    "path": "/tmp/radio-bao-proof-parent-control-v1.stdout",
    "bytes": 602,
    "sha256": "7cf2fdb49247ace382517631715c7f843875bd4da1dd0b0e9763b97abad2384a"
  },
  "stderr": {
    "path": "/tmp/radio-bao-proof-parent-control-v1.stderr",
    "bytes": 271,
    "sha256": "3713dd992cf25bad9091d6328cd0447daf0087822d65f4f22aa576a25fe5bc52"
  }
}

===== 037 END =====

===== 038 BEGIN Witness records/parent-control.stdout | 602 bytes | SHA256 7cf2fdb49247ace382517631715c7f843875bd4da1dd0b0e9763b97abad2384a =====

running 8 tests
test exact_admission_errors_and_geometry_precedence ... ok
test caller_pauses_and_interleaving_preserve_progress ... ok
test maximum_file_final_path_uses_literal_remainder ... ok
test maximum_left_prefix_requires_fifty_three_pending_slots ... ok
test literal_half_open_selection_flags_and_root_placement ... ok
test tiny_lengths_and_empty_requests_are_geometric ... ok
test literal_complete_left_shapes_and_partial_last_groups ... ok
test finite_eager_compatibility_is_supplemental ... ok

test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s


===== 038 END =====

===== 039 BEGIN Witness records/parent-control.stderr | 271 bytes | SHA256 3713dd992cf25bad9091d6328cd0447daf0087822d65f4f22aa576a25fe5bc52 =====
   Compiling cyber-bao v0.1.0 (/Users/master/cyber/radio-bao-bounded-proof/cyber-bao)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.36s
     Running tests/range_traversal.rs (/tmp/radio-bao-proof-target/debug/deps/range_traversal-6ad231f7cc780394)

===== 039 END =====

===== 040 BEGIN Witness records/fixture-freeze.json | 1196 bytes | SHA256 51d8c967c7f016425c18a85186f2ac0dee14dbd6a4a7539d13dc6c9256f060c9 =====
{
  "started": "2026-10-12T23:58:33.662890Z",
  "finished": "2026-10-12T23:58:35.417523Z",
  "cwd": "/Users/master/cyber/radio-bao-bounded-proof",
  "revision": "b933829cbe273d2f31fe75ca83125f3ddd8917a2",
  "argv": [
    "env",
    "CARGO_BUILD_JOBS=2",
    "CARGO_INCREMENTAL=0",
    "CARGO_TARGET_DIR=/tmp/radio-bao-proof-research-target",
    "RUSTC=/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/rustc",
    "RUSTFLAGS=-Dwarnings",
    "/Users/master/.rustup/toolchains/1.95.0-aarch64-apple-darwin/bin/cargo",
    "run",
    "--locked",
    "--offline",
    "--manifest-path",
    "audit/2026-10-12-bao-bounded-proof/fixture-probe/Cargo.toml",
    "--",
    "audit/2026-10-12-bao-bounded-proof/fixtures"
  ],
  "runner_sha256": "10fc0f8210a06cd42e2cc85d0f2b328da05a5e09e01c8feb75651b31fdb0d5d6",
  "exit_code": 0,
  "stdout": {
    "path": "/tmp/radio-bao-proof-fixture-freeze-v1.stdout",
    "bytes": 3083,
    "sha256": "261fb7c1163d2e4701f59cfa3a881e3f77ce96143d96c4eb5edbe0dd09da7328"
  },
  "stderr": {
    "path": "/tmp/radio-bao-proof-fixture-freeze-v1.stderr",
    "bytes": 581,
    "sha256": "25848dfa1d9be4caec1c0f24025bd7faa83a5b34cdd909c0a96fd5213ff6724c"
  }
}

===== 040 END =====

===== 041 BEGIN Witness records/fixture-freeze.stdout | 3083 bytes | SHA256 261fb7c1163d2e4701f59cfa3a881e3f77ce96143d96c4eb5edbe0dd09da7328 =====
empty-log0.bin root=ea57b2e6b1ec7d2de11b15cb6d7060dd61d247fe0fbf5f7d3fb97a7be9328552 size=0 request=0..0 bytes=8 actions=4 output=[]
hello-log0.bin root=626fa46e4e7bd5c87d630eef8333931a0b9198587400a0191eae7821692880d7 size=5 request=1..4 bytes=13 actions=4 output=[Some((8, 0, 5))]
three-right-log0.bin root=373d0ded6b2bd351ba575cdc690ca79bbc04af1a49844f67140ce7a10e672992 size=12288 request=8192..8193 bytes=4168 actions=5 output=[None, Some((72, 8192, 4096))]
three-interior-log0.bin root=373d0ded6b2bd351ba575cdc690ca79bbc04af1a49844f67140ce7a10e672992 size=12288 request=4097..4100 bytes=4232 actions=6 output=[None, None, Some((136, 4096, 4096))]
three-boundary-log0.bin root=373d0ded6b2bd351ba575cdc690ca79bbc04af1a49844f67140ce7a10e672992 size=12288 request=4095..4097 bytes=8328 actions=8 output=[None, None, Some((136, 0, 4096)), Some((4232, 4096, 4096))]
grouped-left-log1.bin root=373d0ded6b2bd351ba575cdc690ca79bbc04af1a49844f67140ce7a10e672992 size=12288 request=4095..4097 bytes=8264 actions=7 output=[None, Some((72, 0, 8192))]
final-short-log1.bin root=40c6bd68b6e89443753bce2dd95fd159da63a7399340fa6070a762d102d9e3ae size=8193 request=8192..8193 bytes=73 actions=5 output=[None, Some((72, 8192, 1))]
sole-group-log1.bin root=2abf65dd26465a7352707d79d18ff3aab9ee5d97614a774619c79ed527e20190 size=8192 request=1..8191 bytes=8200 actions=6 output=[Some((8, 0, 8192))]
full-three-log0.bin root=373d0ded6b2bd351ba575cdc690ca79bbc04af1a49844f67140ce7a10e672992 size=12288 request=0..12288 bytes=12424 actions=10 output=[None, None, Some((136, 0, 4096)), Some((4232, 4096, 4096)), Some((8328, 8192, 4096))]
full-three-log1.bin root=373d0ded6b2bd351ba575cdc690ca79bbc04af1a49844f67140ce7a10e672992 size=12288 request=0..12288 bytes=12360 actions=9 output=[None, Some((72, 0, 8192)), Some((8264, 8192, 4096))]
full-three-log2.bin root=373d0ded6b2bd351ba575cdc690ca79bbc04af1a49844f67140ce7a10e672992 size=12288 request=0..12288 bytes=12296 actions=8 output=[Some((8, 0, 12288))]
full-three-log4.bin root=373d0ded6b2bd351ba575cdc690ca79bbc04af1a49844f67140ce7a10e672992 size=12288 request=0..12288 bytes=12296 actions=8 output=[Some((8, 0, 12288))]
five-right-log0.bin root=acf73af9720783c76e310c9e96036992607fc3f7fae4ba388a11d6c641ed002e size=20480 request=16384..16385 bytes=4168 actions=5 output=[None, Some((72, 16384, 4096))]
five-interior-log0.bin root=acf73af9720783c76e310c9e96036992607fc3f7fae4ba388a11d6c641ed002e size=20480 request=12289..12290 bytes=4296 actions=7 output=[None, None, None, Some((200, 12288, 4096))]
seven-right-log0.bin root=8bad63da9ba9744fbefb711917903ee7ea3205f5e8249360c2fc3539d28e3af7 size=28672 request=24576..24577 bytes=4232 actions=6 output=[None, None, Some((136, 24576, 4096))]
seven-interior-log0.bin root=8bad63da9ba9744fbefb711917903ee7ea3205f5e8249360c2fc3539d28e3af7 size=28672 request=20481..20482 bytes=4296 actions=7 output=[None, None, None, Some((200, 20480, 4096))]
synthetic-deep-prefix root=eee60e574b07a5811774cbea70092388eaa7987f9abb9e238726fed179617d3c bytes=7432 error_action=56 missing_offset=7432 missing_bytes=4096

===== 041 END =====

===== 042 BEGIN Witness records/fixture-freeze.stderr | 581 bytes | SHA256 25848dfa1d9be4caec1c0f24025bd7faa83a5b34cdd909c0a96fd5213ff6724c =====
    Blocking waiting for file lock on package cache
    Blocking waiting for file lock on package cache
    Blocking waiting for file lock on package cache
   Compiling cyber-bao v0.1.0 (/Users/master/cyber/radio-bao-bounded-proof/cyber-bao)
   Compiling bao-proof-fixture-freeze v0.0.0 (/Users/master/cyber/radio-bao-bounded-proof/audit/2026-10-12-bao-bounded-proof/fixture-probe)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.13s
     Running `/tmp/radio-bao-proof-research-target/debug/bao-proof-fixture-freeze audit/2026-10-12-bao-bounded-proof/fixtures`

===== 042 END =====

===== 043 BEGIN task/plan.md | 14878 bytes | SHA256 6a104b42977d594a0ac1e05cd999ec750c896f4d4e24865a0eb1718cfba34350 =====
# Bounded complete-buffer BAO proof verification

Proposed PLAN; no production implementation or approval. Serves Kadek foundation
row 4 through Radio, declared part of soft3; the future Kadek adapter reaches Cyb.
Radio implementation parent is b933829cbe273d2f31fe75ca83125f3ddd8917a2 (PR39);
research probes remain attributed to a96d86e28d384cdf656aadc4282c78c0c170c102.
Hemera is d5f0a09539360934fb32db9b2e15a91995607db6. The prerequisite RangeTraversal
is merged; an ordinary fast-forward and exact source/lock/consumer bridge preserve
the research identities. Its source equals the previously frozen candidate. Kadek's
sealed BaoAnchor is now committed at 4d9ca9ab3498238b9c1e03f6d6f160e1ec729912.

## Result and boundary

Add one concrete no_std Poseidon2 proof reader borrowing an immutable complete
proof buffer. It verifies one nonempty half-open byte request, or the empty file,
against an externally trusted complete-root/length pair. It returns a private-field
borrowed view only after every selected group, every required parent and exact
encoded EOF have passed. The view can replay one geometry item per output action
without allocating spans or copying payload. Legacy std readers/producers remain
unchanged. This is an additive minor API, with ring 1 reach, not a patch/ring-0-only
claim. The canonical-wire requirement is an intentional new-profile tightening.

Radio does not derive particle authority. The future Kadek adapter must use the
committed BaoAnchor's root, length and HemeraFixed4096V1 profile, retain that sealed
association, charge persistent work, own bounded proof/output storage and publish
only after full verification. A caller-created root or Radio view cannot create a
Kadek VerifiedRange. No Kadek adapter, network fetch, incremental byte feeding,
serialized anchor, first-partial authentication, multi-range set or legacy-reader
migration belongs to this unit.

## Carrier and admission

The borrowed carrier is exactly: eight-byte LE complete u64 length, followed by
the selected preorder parent pairs and whole selected group payloads. Both 32-byte
children are present for every visited parent, even when only one child is selected.
Request and BlockSize are separate trusted operation inputs, not wire fields.
The supplied length must equal the header. A file-backed slice's in-memory length
does not substitute for this complete file length. No suffix or concatenated proof
is permitted. A final short group consumes exactly its remaining file bytes.

ROOT, absolute 4096-byte counters, complete-left shape and concrete kernels follow
Hemera d5's tree/capacity/encoding contracts and parameters, already used by Radio
a96's GroupHasher. Grouping changes the carrier, never the canonical complete root.
Historical grouped internal CVs without ROOT are not accepted as canonical roots.
This does not equate the tree root with the separately pinned plain particle hash.

Constructor order is deterministic: RangeTraversal geometry admission (BlockSize
before range), reject an empty request when length > 0, then check the four expected
root words in ascending order. The constructor reads no proof bytes and hashes none.
Each hash word is one LE u64 and must be strictly below exported `hemera::field::P`;
check all four words in the supplied root and both children of every wire pair.
Use public Hemera constants for widths. `Hash::from_bytes` itself is a raw wrapper;
the proof reader must perform the canonical check before parent arithmetic.

Block log admits exactly the RangeTraversal range: 0..=51 on 64-bit, 0..=19 on
32-bit. This is integer geometry, not an allocation/Layout promise. Range requires
start <= end <= length. Empty file only admits 0..0: header must be zero, one empty
ROOT leaf is hashed, and EOF must be byte 8. It yields a verified empty view with
no output items. A nonempty file's empty request is rejected, including at EOF;
there is no successful mode with an unchecked root.

## Small public surface and lifetime

Names below are proposed, to be frozen by review:

```rust
ProofVerifier::new(proof: &[u8], root: [u8; 32], size: u64,
                   block: BlockSize, request: Range<u64>) -> Result<Self, ProofError>
ProofVerifier::is_finished(&self) -> bool
ProofVerifier::step(&mut self) -> Result<Option<VerifiedProof<'a>>, ProofError>
VerifiedProof::{root, size, block_size, request} // exact admitted operation inputs
VerifiedProof::items(&self) -> ProofItems<'a>
ProofItems::is_complete(&self) -> bool
impl Iterator<Item = ProofItem<'a>> + FusedIterator for ProofItems<'a>
enum ProofItem<'a> {
    Parent,
    Leaf { file_offset: u64, proof_offset: usize, bytes: &'a [u8] },
}

The implementation supplies explicit named lifetimes; this sketch abbreviates them. VerifiedProof has private fields and no public constructor, conversion from raw bytes, Deserialize, attestation or mutable-byte escape. Its accessors return the root/size/block by value, and a cloned range. It borrows only the original immutable proof, not the verifier. It can outlive a dropped verifier but not the proof bytes. No allocation owner/clone is acquired. Debug prints coordinates/state, not payload. Public ProofItem values carry slices/coordinates, not independent sealed authority; consumers obtain trusted items through a successfully completed view and its root.

Pending successful steps return None with is_finished=false. Exact EOF completion returns Some(view) once and sets is_finished=true. Later successful polls return None without work. Any processing error becomes sticky and sets is_finished=true; later polls return that same Copy error without work. Dropping cancels a pending job. No push/flush/reset/request reuse or hidden quota renewal exists.

Bounded machine and work

Use one RangeTraversal, one fixed 53-slot expected-hash stack, and at most one GroupHasher borrowing the current proof group and a static Poseidon2Backend. The expected stack follows the same frontier bound as traversal: at most 52 deferred siblings plus one current value. Parent processing pops exactly one expectation, hashes the pair using that node's ROOT bit, compares it, then pushes only selected right/left expectations in that order. It does not traverse or authenticate the unselected sibling payload. Never clone an arbitrary generic backend hash.

After constructor setup, each pending call admits exactly one of these actions:

Action Exact bounded work and transition
Header Read at most 8 bytes, compare declared/trusted size, seed expected root.
Parent Obtain one traversal item, consume exactly 64 bytes, validate left words then right words, one parent kernel, compare, push at most two expectations.
Group setup Obtain one leaf item, take exactly its checked payload slice, pop its expectation, initialize the fixed reducer; no kernel.
Group kernel Exactly one GroupHasher step: one <=4096-byte leaf or one two-child parent. On completing hash, compare the pending expected hash in this same action.
Commit Geometry and expected stack must be empty and no group pending; check cursor == proof.len, emit the view.

The empty file substitutes one synthetic zero-length ROOT group setup for geometry, then one kernel. No generic reducer, traversal scan, proof-sized buffer initialization or payload copy may be hidden in any action or constructor. Fixed 53-slot setup and small scalar checks are bounded setup. GroupHasher admission cannot fail after checked traversal: real group bytes fit usize/u64 and final absolute chunk counters are <=2^52-1; use an internal invariant assertion rather than inventing a reachable new external failure class. Stack/geometry invariants likewise follow private state.

For a valid nonempty proof let P be visited parents, L selected groups, and C the number of 4096-byte chunks across those groups. Total actions are 2 + P + L + sum(2*N_group-1) = 2 + P + 2*C. Empty-file total is 4. This is an exact oracle, not an uncharged constructor traversal. Across a u64-sized file with N=ceil(size/4096), P <= groups-1 <= N-1, so total <=3*N+1 <2^54. Counts cannot overflow u64. Error attempts cost their one admitted action; terminal polls cost 0. Radio owns no budget type. The caller checks is_finished, admits one persistent unit, then steps; it may abort on total exhaustion with no published result. A future Kadek adapter must not reset totals on yields, completed groups or the transition from verification to output/copy. No exact-total preflight is promised by this Radio API; a separate charged planning walk would be an adapter choice.

Read extents use needed <= proof.len()-cursor before slicing/advancing. Leaf coordinates come from the checked traversal; multiply its absolute chunk start by 4096 only under that bound. Keep proof usize offsets distinct from file u64 offsets. No unchecked BaoTree byte helpers are used for large geometry.

Errors and output actions

ProofError derives Debug, Clone, Copy, PartialEq and Eq, and implements Display and core::error::Error. Its exact variants and precedence are:

Location Error and coordinate
Constructor Geometry(RangeTraversalError), then EmptyRequest, then NonCanonicalRoot { word: u8 }.
Header Truncated { offset: 0, needed: 8 }, then SizeMismatch { expected, declared }.
Parent Truncated { offset: cursor, needed: 64 }, then NonCanonicalHash { offset: offending LE word's absolute proof offset } scanning left then right, then ParentMismatch { node: TreeNode }.
Group setup Truncated { offset: cursor, needed: exact group size }.
Completing group LeafMismatch { start_chunk: u64 }; zero for empty file.
Commit TrailingBytes { offset: consumed proof length }.

No EOF publication on a matching last group alone. An invalid suffix makes the whole proof fail. No partially verified view is accessible on any failure. Freeze exact Display messages and variant/coordinate assertions with tests before implementation; do not make diagnostic strings the only oracle.

items() creates a fresh checked geometry cursor in bounded fixed setup and starts its proof cursor at 8; construction scans/hashes/copies no proof. Each pending next obtains exactly one geometry item. Parent advances 64 bytes and returns Parent; leaf advances its exact size and returns that immutable slice plus file/proof coordinates. It must not loop across parents to find a leaf. Verified immutable input permits infallible replay; assert private invariants rather than rehash. P+L output actions, zero for empty file. The cursor is immediately complete after the final item and all later polls return None without work. Caller charges each pending output action separately, then charges any byte copying separately; no free collect/copy helper. Whole groups may extend outside the request. Copy only their intersection with the view's exact requested range for a requested-range packet; do not confuse wire offsets with authenticated file offsets.

Steps, files, and gates

  1. Preserve research probes and fixtures and the completed actual traversal bridge. → verify: exact Git identities, retained a96d measurements, identical prerequisite candidate/merged source, unchanged lock and owning consumers except module wiring.
  2. Freeze manual fixtures and tests from finite-cases.md, then demonstrate API absence on the exact parent. → verify: expected missing-module compiler class, separated from the measured legacy behavior; no false new runtime baseline.
  3. Add only concrete proof module, output view and re-export/module wiring. → verify: all literal cases, exact costs/coordinates, step pauses/failures, no early result.
  4. Exercise lifetime/field seals, allocation and feature/build contracts. → verify: positive control compiler case, expected compile-error classes, host allocation observer, debug/release, actual no-default count, no_std cross check; no final-link allocator-free claim based only on a library compile.
  5. Freeze gate receipts, source delta and bounded fresh CODE context. → verify: independent exact-parent/raw/source replay, different-vendor CODE approval before root's commit/merge. No production CODE review is claimed by this PLAN.

Expected production paths: cyber-bao/src/lib.rs, new cyber-bao/src/proof.rs and cyber-bao/src/proof/output.rs. Tests: new cyber-bao/tests/proof.rs, proof_failures.rs, proof_allocation.rs and support/proof.rs (split by contract if needed; every file <500 lines). Rustdoc is the API/carrier/work contract; README gets at most a module link. No dependency/feature/wire-producer/kernel changes. Task and audit paths are owned here; other source paths require a justified scope amendment. No Kadek source or shared fixture ledger changes in this unit.

Required owner gates: strict warning-free cyber-bao debug/release tests for default, no-default and all-features; doctests; Clippy and formatting; exact library no_std cross check and measured MSRV. Semver against v0.1.0 plus actual-parent comparison if needed; additive API requires minor acceptance regardless of no breaking findings. Radio CI argv/config are frozen as support: workspace all/default/none test, Clippy, docs, MSRV, formatting, deny and applicable native consumer gates are retained as required gate rows, not silently replaced by the small owner suite. External/rung closure and unavailable platform/toolchain rows must be explicit. Current parent failure comparisons use exact failing cases/commands and identical env/profile, never stale ancestor reds or an unnecessary second whole matrix. Local --locked, offline, jobs=2, incremental=0 and bounded-time configuration are labeled local strengthening, with raw command/timeout receipts. CI profile termination must be read from actual config, not inferred. Research runs no broad CI matrix.

Five likely failures

  1. A trusted size/root becomes an arbitrary authority escape: keep Radio result conditional on supplied root, borrow original bytes, publish only at strict EOF; Kadek integration is separately sealed and outside this change.
  2. ROOT or absolute counters change with grouping/selection: explicit three-leaf, sole-group, right-only and final-short manual carriers and historical-CV rejection.
  3. Unbounded work hides in a traversal/leaf/output call: exact action schedules, largest-depth finite prefixes, one-item output events and source invariant review.
  4. Canonical validation normalizes/reduces instead of rejecting: four independent word positions, both child sides and root, p-1/p/MAX boundaries before hashing.
  5. Completion, failure or borrowed retention leaks partial authority: late suffix and last-leaf failures, sticky terminal polls, interleaved jobs, output exact ranges, successful/failed/cancelled drop and compile-time lifetime/field seals.

===== 043 END =====

===== 044 BEGIN task/finite-cases.md | 8731 bytes | SHA256 93056283cc10f6fe9310aa8493c533557b5f96876b357dc8039a7b87b879a24c =====

Finite proof-verifier acceptance table

Proposed tests, frozen before the new API exists. Research fixtures are under audit/2026-10-12-bao-proof-research/fixtures. Rust primary-probe builds the wire manually, uses explicit chunk/parent expressions, then checks legacy producer and reader agreement as supplemental evidence. It does not implement the proposed reader. Its printed expected_actions are PLAN literals, not measured new-reader work.

For D[n], byte i = (31*i + floor(i/4096)) mod 256. Let Li be the non-ROOT hash of the actual chunk at absolute counter i; P01=parent(L0,L1,false). Three-chunk ROOT is parent(P01,L2,true). No recursive test helper infers these small tree shapes. Future five/seven-group cases spell their parent expressions independently: R5=P(P(P(L0,L1),P(L2,L3)),L4,ROOT); R7=P(P(P(L0,L1),P(L2,L3)),P(P(L4,L5),L6),ROOT), inner P never ROOT.

Literal successful carriers

Offsets below refer to payload in the encoded proof; file coordinates are separate. H=header, P=one parent, S=group setup, K=one reducer kernel, E=EOF commit. Every proper prefix of each action sequence must return no completed view. Output Parent events consume one action each; output leaves borrow exactly the listed proof bytes.

Fixture File/request/log Payload (proof offset; file offset; bytes) Verification Output
empty 0 / 0..0 / 0 none H S K E = 4 0
hello 5 / 1..4 / 0 8; 0; 5 H S K E = 4 Leaf
three-right 12288 / 8192..8193 / 0 72; 8192; 4096 H P S K E = 5 Parent, Leaf
three-interior 12288 / 4097..4100 / 0 136; 4096; 4096 H P P S K E = 6 Parent, Parent, Leaf
three-boundary 12288 / 4095..4097 / 0 136; 0; 4096 and 4232; 4096; 4096 H P P S K S K E = 8 Parent, Parent, Leaf, Leaf
grouped-left 12288 / 4095..4097 / 1 72; 0; 8192 H P S K K K E = 7 Parent, Leaf
final-short 8193 / 8192..8193 / 1 72; 8192; 1 H P S K E = 5 Parent, Leaf
sole-group 8192 / 1..8191 / 1 8; 0; 8192 H S K K K E = 6 Leaf

Root literals: empty ea57b2e6b1ec7d2de11b15cb6d7060dd61d247fe0fbf5f7d3fb97a7be9328552; hello 626fa46e4e7bd5c87d630eef8333931a0b9198587400a0191eae7821692880d7; D8192 2abf65dd26465a7352707d79d18ff3aab9ee5d97614a774619c79ed527e20190; D12288 373d0ded6b2bd351ba575cdc690ca79bbc04af1a49844f67140ce7a10e672992; D8193 40c6bd68b6e89443753bce2dd95fd159da63a7399340fa6070a762d102d9e3ae. D8192 historical internal CV is 11890a7e7cf1e4de463a04bf53bfdf269d627983a221daaf9029a3ff43297389. It must fail sole-group LeafMismatch { start_chunk: 0 }, not normalize to ROOT.

Complete the pre-implementation fixture set with explicit full-three, right/interior five/seven, all groupings 0/1/2/4 where their wire differs, one-byte final group and nonaligned requests. Freeze expected pair order/ranges before coding; roundtrip is never their sole oracle. Freeze source files before failure-first API-absence run.

Admission, malformed proof, and precedence

Case Required result
Exhaust all 256 logs, including short/empty file Geometry InvalidBlockSize outside host range; compile-only 32-bit evidence labeled separately.
Reversed range, EOF+1, both invalid log/range Geometry InvalidRange; bad log takes precedence.
Nonempty file 0..0, interior empty, EOF empty EmptyRequest before root/proof parsing.
Empty file valid 0..0 / invalid 0..1 Four-step root verification / InvalidRange.
Expected root has p or MAX in each word independently NonCanonicalRoot { word: 0/1/2/3 }; ascending first error, before header.
Root word 0 or p-1 Canonical admission, then ordinary proof mismatch if not the matching root; no false validity claim.
Hello header declared 0, 4, 6, 4096, MAX, trusted length 5 Header SizeMismatch with exact expected/declared. LE 5 succeeds.
Every header prefix 0..7 bytes Truncated { offset:0, needed:8 }.
Every truncated prefix of three-interior, grouped-left Stage-specific Truncated cursor/needed; complete bytes required before examining a pair or starting a group.
Pair word p/MAX, left and right, all four positions NonCanonicalHash at 8+word8 or 40+word8 for first pair, before parent hashing; second parent starts at 72.
Noncanonical left followed by incomplete right pair Pair Truncated takes precedence over canonical validation.
Canonical pair order swap, canonical wrong root, modified canonical sibling ParentMismatch at literal node3 or1, before group output.
Three-boundary first/last payload mutation LeafMismatch counter 0/1; completed earlier group never yields a view.
Same selected data computed at wrong absolute counter LeafMismatch of selected start counter.
Single/multiple group suffix 1 byte / concatenated valid proof TrailingBytes at exact original carrier length after hashing, no view.
Empty-file correct root + suffix / canonical wrong root TrailingBytes offset 8 / LeafMismatch counter 0.
Nonempty file header-only, nonempty request First parent or leaf setup Truncated, never success with an unchecked root.
u64MAX file, log 51 on 64-bit, first-byte query, short carrier Bounded Parent processing then leaf Truncated with exact large needed; no allocation or overflowing end.

The synthetic-canonical and four synthetic-alias fixtures bind a supplied parent commitment with an arbitrary zero unselected sibling. Each alias changes only one right child's LE word from 0 to p. Legacy accepts all under the same supplied root; the new profile must reject each at offsets 40, 48, 56, 64. No actual complete file with this synthetic root has been witnessed; these fixtures prove encoding behavior, not a particle bypass or a complete-file collision.

Work, state, retention, and bounds

  • Exact valid action sequences above under per-call schedules 1,2,total,total+1; an external test budget with total exact and exact+1 completes at identical paid count; total one below prevents final commit and yields no authority. Radio has no WorkBudget constructor, so the harness must not pretend to test Kadek's adapter.
  • Interleave two jobs and pause after every stage. No kernel repeats on resumption. Every error becomes sticky; repeat 10 failed polls returns identical variant/offset, no additional state work. Repeat 10 completed polls returns None. Drop at every pending stage performs no additional hashing or output.
  • Rewalk each completed view twice, interleave its output cursors, assert exact event counts, slices, pointer offsets, file offsets and request intersections. Retain a borrowed view/leaf after verifier/cursor drop while proof stays alive. Empty view has 0 events and immediately complete. Final next makes complete true.
  • Field/constructor seal compiler probes: a valid public API control succeeds; raw VerifiedProof struct literal fails E0451; no From/raw constructor/Deserialize escape exists; destroying or mutating borrowed proof storage before use fails the expected borrow-check class. Capture actual compiler diagnostics, not only generic compile_fail. No test claims aliases imply extra allocation charges.
  • A host counting allocator test has an allocating positive control and observes constructor, each verifier stage, completed output replay, errors/terminal polls and cancellation/drop separately. Build and retain fixture storage outside observation; exclude its later deallocation. Concrete Poseidon2 scope only; a library cross compile does not prove allocator-free linking.
  • Largest-depth fixed prefix uses u64MAX geometry, 52 explicit parent levels and one 4096-byte first leaf. Compute only those explicit synthetic commitments with zero deferred sibling CVs; a full-range request builds the 53-entry expected frontier then runs out of supplied proof. Observe Truncated and no result; do not enumerate the file or call this a real complete-file proof. This is separate from the already reviewed traversal boundary witness. Exact large coordinate/multiplication checks are asserted. Proof input retains no proof-sized output vector.

Canonical errors proposed Display strings (freeze with variants before coding): geometry delegates to RangeTraversal; EmptyRequest = "empty request for nonempty file"; NonCanonicalRoot = "noncanonical expected root word {word}"; Truncated = "truncated proof at {offset}: need {needed} bytes"; SizeMismatch = "proof size {declared} differs from expected {expected}"; NonCanonicalHash = "noncanonical proof hash word at {offset}"; ParentMismatch = "proof parent mismatch at node {node_index}"; LeafMismatch = "proof leaf mismatch at chunk {start_chunk}"; TrailingBytes = "trailing proof bytes at {offset}".

===== 044 END =====

===== 045 BEGIN task/research.md | 9092 bytes | SHA256 956ea7addb3dba2a6f16771958dd1746fd737679ca9d3de527f3a074d29ed8e7 =====

Bounded BAO proof research

Serves Kadek foundation row 4 through Radio (declared part of soft3) and a future Kadek adapter in Cyb. Stage: research complete; PLAN proposed, not approved. Owned branch research/bao-bounded-proof; no production changes, commit, push or vendor dispatch. Original preliminary note is retained in audit/2026-10-12-bao-proof-research/notes/initial-research.md.

Source identities: Radio a96d86e28d384cdf656aadc4282c78c0c170c102; Hemera d5f0a09539360934fb32db9b2e15a91995607db6; committed Kadek anchor 4d9ca9ab3498238b9c1e03f6d6f160e1ec729912. RangeTraversal merged as Radio PR39, b933829cbe273d2f31fe75ca83125f3ddd8917a2. Ordinary fetch/fast-forward and an exact source bridge confirm candidate identity and unchanged kernels/carrier/lock/consumers, except module wiring. New implementation will use b933; all research measurements remain attributed to a96d. No broad Radio matrix was run for research. This research does not close Kadek row 4 or prove an allocator-free final no_std application link.

Existing carrier and measured boundary

cyber-bao/src/io/slice.rs writes eight LE complete-length bytes, selected preorder parent pairs and complete selected groups. Multi-group verification allocates traversal, expected-hash and output vectors, hashes an entire group in one call, and does not require encoded EOF. The single-group shortcut hashes all remaining bytes without checking their length against the header. Single-group extraction includes the body even for an empty request; multi-group empty extraction is only its header. These are existing API semantics, left unchanged by the proposed unit.

The immutable legacy probe manually supplies LE5 + hello, mutates only the header, appends a six-byte suffix to a two-chunk carrier, and checks empty requests. At Radio a96d and Rust 1.95, debug and release both accept declared lengths 0,4,5,6,4096 for five actual bytes; accept the suffix after an 8264-byte proof; and return an empty result for an empty multi-group query with a wrong root. Both captured outputs are identical 321-byte files. These are size/EOF/empty-selection admission witnesses, not forged hashes, a particle/root substitution, or new-reader test failures.

Commands are captured verbatim in records/initial-debug.json and legacy-release.json: cargo run [--release] --locked --offline --manifest-path .../probe/Cargo.toml, Rust 1.95, jobs 2, incremental 0, RUSTFLAGS=-Dwarnings, a private target directory. The legacy three-file freeze remains unchanged. Root's first inline source-freeze helper used a wrong Ruby text/binary comparison and was corrected before handoff; that helper mistake is not a production discrepancy.

Independent carrier and encoding evidence

The separate 269-line primary-probe manually writes eight real-file carriers using explicit small chunk/parent expressions. They cover empty/hello, three-chunk right and interior selection, a cross-chunk request, grouped-left selection, a final one-byte group and a sole two-chunk group. Its root/offset/action table is in finite-cases.md. It compares with existing producer/reader only after construction; roundtrip is supplemental, not the wire-shape oracle. Existing empty, hello, D8192 ROOT and historical non-ROOT literals are asserted independently. New D12288 and D8193 roots are pinned kernel-expression results, not independent cryptographic implementations. Printed action counts are proposed-machine literals, not measured new-API work. Debug and release outputs and every generated fixture agree exactly.

At pinned Hemera, public hemera::field::P is 0xffff_ffff_0000_0001 and Hash stores four LE words. Hash::from_bytes preserves any 32 bytes with bytewise equality. bytes_to_cv calls Goldilocks::new, which stores raw u64; it does not itself reduce. Field arithmetic and canonical hash output identify residue-equivalent values. This corrects the preliminary shorthand that the constructor performs reduction. The normative output encoding is canonical [0,p); parent input parsing currently has no representation guard. The new profile must check all four words of root and both children before hashing; it must not normalize an invalid encoding.

A synthetic parent commitment, with actual selected-left chunk CV and an arbitrary zero unselected-right CV, demonstrates each word independently. Replacing any one zero right word by p preserves parent output and legacy acceptance; the raw Hash still differs. Five fixtures retain the canonical and four alias carriers. There is no witnessed complete file for this synthetic commitment. This measures encoding behavior, not a complete-file collision or a Kadek authority bypass. Separate 0,p-1,p,MAX raw-word controls retain their exact bytes. The proposed canonical rule accepts the first two representations and rejects the latter two, regardless of any later root mismatch. All checks pass in debug/release with strict warnings.

Smallest composition

GroupHasher is already merged: one <=4096-byte leaf or one parent kernel per call, fixed 53 frontier, absolute counters and only final ROOT. Merged RangeTraversal supplies checked u64/usize geometry with a fixed 53-frame frontier and one selected node per call. Parent child flags specify which paths to visit; both child hashes remain necessary. Neither primitive parses the carrier or binds a particle.

Proposed composition is concrete Poseidon2: a borrowed whole-buffer verifier, fixed expected-hash stack and at most one borrowed GroupHasher. Generic HashBackend permits arbitrary allocation/cost through its associated Hash and methods, so it cannot justify unconditional resource guarantees. No new hash arithmetic, generic transform, allocation, byte owner or budget abstraction is needed. The verifier checks trusted header length, all parents/groups, canonical words and exact EOF, then seals a borrowed result. Its output cursor emits one parent event or whole leaf slice per call; it never scans for a leaf, hashes again, or allocates a span vector. Kadek will separately match its BaoAnchor and own quota/pool/copy/publication.

For a valid nonempty proof, exact action count is header 1 + parents P + group setups L

  • sum(2N_group-1) + EOF 1 =2+P+2C; empty file costs 4 and has no output items. No exact total is computed by an uncharged traversal. Caller-supplied persistent budgets can stop before any next action without publication. One atomic kernel remains a bounded unit, not constant wall time. Immutable proof borrowing prevents mutation after verification; completed views depend on proof lifetime, not verifier lifetime. Private fields prevent fabricating a completed view through safe API.

Chosen empty policy is strict: reject any empty request to a nonempty file, including EOF, instead of adding a successful no-authentication mode. Empty file 0..0 still hashes canonical empty ROOT and requires an exact eight-byte header. This API is a new strict profile; unchanged legacy single-group empty extraction does not define its admission. A profile-preserving grouping change uses repaired canonical roots; old grouped internal CVs are not grandfathered.

Consumers, scope and remaining verification

Within exact Radio a96d, four manifests directly depend on cyber-bao: iroh-blobs, particle, radio-cli, tests/integration. iroh-docs depends on local iroh-blobs. Current particle/radio-cli use std encode/decode/outboard; the iroh-blobs slice decoder call is in the cfg(test) export_pairs module. Other current slice callers are cyber-bao unit/integration tests. The new additive module migrates none of those APIs. Radio exporter writes the same size/pair carrier; its actual literal exporter tests are relevant regression coverage. Sync/fsm transport variants can omit a size header; they are not silently admitted as this complete-buffer profile.

Kadek now pins cyber-bao a96d with default-features=false for BaoAnchor, using the same merged GroupHasher and Git Hemera d5; its plain particle remains registry Hemera 0.3.1. Same immutable-body association is the authority invariant, not alleged identity of the two source packages. A Radio result verified under an arbitrary root cannot mint VerifiedRange. The future adapter remains a separate reviewed unit.

The prior exact-revision graph inventory is retained by hash/reference, with its cached-default and retained-Nu distinctions; it is not a fresh network inventory. The registry declares Radio part_of soft3 and Kadek part_of Cyb. New public API reaches ring 1 even when existing direct calls remain unchanged. Required closure/gates and unavailable platforms must be reported explicitly. No inherited-red assumption is attached to this new candidate: eventual negatives need current exact-parent comparisons.

Next: freeze the bounded fresh vendor PLAN input after root's draft read and the completed traversal merge bridge. Only approval authorizes tests-first production. Implementation will supply exact diagnostics, allocation and lifetime witnesses, current owner/workspace/consumer gates and a separate fresh CODE review.

===== 045 END =====

===== 046 BEGIN probe/src/main.rs | 2322 bytes | SHA256 5a6f0b73072d4d40075dbe57c26408a52a3634e898036eb452da0fe54436f526 ===== //! Characterize the committed legacy carrier, without proposing a new decoder. use cyber_bao::{ BlockSize, CHUNK_SIZE, ChunkNum, ChunkRanges, HashBackend, Poseidon2Backend, io::slice::{decode_slice, extract_slice}, };

fn main() { let backend = Poseidon2Backend; let hello = b"hello"; let (root, proof) = extract_slice(&backend, hello, 0..5, BlockSize::ZERO); assert_eq!(proof, [5_u64.to_le_bytes().as_slice(), hello].concat()); let one = ChunkRanges::from(ChunkNum(0)..ChunkNum(1)); for declared in [0_u64, 4, 5, 6, 4096] { let mut changed = proof.clone(); changed[..8].copy_from_slice(&declared.to_le_bytes()); let decoded = decode_slice(&backend, &changed, &root, &one, BlockSize::ZERO) .expect("legacy single-group decoder accepts changed header"); assert_eq!(decoded, vec![(0, hello.to_vec())]); println!("single declared={declared} payload=5 accepted=true"); }

let body = vec![0x42; 2 * CHUNK_SIZE];
let all = ChunkRanges::from(ChunkNum(0)..ChunkNum(2));
let (root, mut proof) = extract_slice(&backend, &body, 0..8192, BlockSize::ZERO);
let original_len = proof.len();
proof.extend_from_slice(b"suffix");
let decoded = decode_slice(&backend, &proof, &root, &all, BlockSize::ZERO)
    .expect("legacy multi-group decoder accepts suffix");
assert_eq!(
    decoded,
    vec![(0, body[..4096].to_vec()), (4096, body[4096..].to_vec())]
);
println!("multi original={original_len} suffix=6 accepted=true");

let (_, single_empty) = extract_slice(&backend, hello, 2..2, BlockSize::ZERO);
assert_eq!(
    single_empty,
    [5_u64.to_le_bytes().as_slice(), hello].concat()
);
let (_, multi_empty) = extract_slice(&backend, &body, 2..2, BlockSize::ZERO);
assert_eq!(multi_empty, 8192_u64.to_le_bytes());
let empty = ChunkRanges::from(ChunkNum(0)..ChunkNum(0));
let wrong = backend.chunk_hash(b"wrong", 0, true);
let decoded = decode_slice(&backend, &multi_empty, &wrong, &empty, BlockSize::ZERO)
    .expect("legacy empty traversal performs no root check");
assert!(decoded.is_empty());
println!(
    "empty single_wire={} multi_wire={} multi_wrong_root_accepted=true",
    single_empty.len(),
    multi_empty.len()
);

}

===== 046 END =====

===== 047 BEGIN primary-probe/src/main.rs | 7858 bytes | SHA256 6c274529c97ebc1e98ffd0bcb37e2e47abf02f5e1db7ca07480ff20ea432971f ===== //! Primary expressions and manual carriers, not a proposed verifier prototype. use cyber_bao::{ BlockSize, ChunkNum, ChunkRanges, HashBackend, Poseidon2Backend, group::GroupHasher, io::slice::{decode_slice, extract_slice}, }; use hemera::{Hash, field::P}; use std::{ops::Range, path::Path};

fn data(n: usize) -> Vec { (0..n).map(|i| ((31 * i + i / 4096) % 256) as u8).collect() } fn leaf(data: &[u8], index: u64) -> Hash { Poseidon2Backend.chunk_hash(data, index, false) } fn parent(left: Hash, right: Hash, root: bool) -> Hash { Poseidon2Backend.parent_hash(&left, &right, root) } fn pair(wire: &mut Vec, left: Hash, right: Hash) { wire.extend_from_slice(left.as_bytes()); wire.extend_from_slice(right.as_bytes()); } fn save(dir: &Path, name: &str, wire: &[u8]) { std::fs::write(dir.join(format!("{name}.bin")), wire).unwrap(); } fn ranges(range: Range) -> ChunkRanges { ChunkRanges::from(ChunkNum(range.start / 4096)..ChunkNum(range.end.div_ceil(4096))) } #[allow(clippy::too_many_arguments)] fn witness( dir: &Path, name: &str, body: &[u8], root: Hash, wire: &[u8], request: Range, log: u8, expected: &[(u64, Vec)], actions: u64, ) { assert_eq!( u64::from_le_bytes(wire[..8].try_into().unwrap()), u64::try_from(body.len()).unwrap() ); assert_eq!( decode_slice( &Poseidon2Backend, wire, &root, &ranges(request.clone()), BlockSize(log) ) .unwrap(), expected ); // Producer agreement is supplemental. The wire above was built by literal expressions. assert_eq!( extract_slice(&Poseidon2Backend, body, request.clone(), BlockSize(log)), (root, wire.to_vec()) ); save(dir, name, wire); println!( "fixture={name} size={} log={log} request={}..{} wire={} root={root} expected_actions={actions}", body.len(), request.start, request.end, wire.len() ); } fn main() { let dir = std::env::args_os().nth(1).expect("fixture directory"); let dir = Path::new(&dir); assert_eq!(P, 0xffff_ffff_0000_0001); let empty = Poseidon2Backend.chunk_hash(&[], 0, true); let hello = Poseidon2Backend.chunk_hash(b"hello", 0, true); assert_eq!( empty.to_string(), "ea57b2e6b1ec7d2de11b15cb6d7060dd61d247fe0fbf5f7d3fb97a7be9328552" ); assert_eq!( hello.to_string(), "626fa46e4e7bd5c87d630eef8333931a0b9198587400a0191eae7821692880d7" ); save(dir, "empty", &0u64.to_le_bytes()); let mut wire = 5u64.to_le_bytes().to_vec(); wire.extend_from_slice(b"hello"); witness( dir, "hello", b"hello", hello, &wire, 1..4, 0, &[(0, b"hello".to_vec())], 4, ); println!("fixture=empty size=0 log=0 request=0..0 wire=8 root={empty} expected_actions=4");

let body = data(12288);
let l0 = leaf(&body[..4096], 0);
let l1 = leaf(&body[4096..8192], 1);
let l2 = leaf(&body[8192..], 2);
let p01 = parent(l0, l1, false);
let root = parent(p01, l2, true);
let mut wire = 12288u64.to_le_bytes().to_vec();
pair(&mut wire, p01, l2);
wire.extend_from_slice(&body[8192..]);
witness(
    dir,
    "three-right",
    &body,
    root,
    &wire,
    8192..8193,
    0,
    &[(8192, body[8192..].to_vec())],
    5,
);
let mut wire = 12288u64.to_le_bytes().to_vec();
pair(&mut wire, p01, l2);
pair(&mut wire, l0, l1);
wire.extend_from_slice(&body[4096..8192]);
witness(
    dir,
    "three-interior",
    &body,
    root,
    &wire,
    4097..4100,
    0,
    &[(4096, body[4096..8192].to_vec())],
    6,
);
let mut wire = 12288u64.to_le_bytes().to_vec();
pair(&mut wire, p01, l2);
pair(&mut wire, l0, l1);
wire.extend_from_slice(&body[..8192]);
witness(
    dir,
    "three-boundary",
    &body,
    root,
    &wire,
    4095..4097,
    0,
    &[
        (0, body[..4096].to_vec()),
        (4096, body[4096..8192].to_vec()),
    ],
    8,
);
let mut wire = 12288u64.to_le_bytes().to_vec();
pair(&mut wire, p01, l2);
wire.extend_from_slice(&body[..8192]);
witness(
    dir,
    "grouped-left",
    &body,
    root,
    &wire,
    4095..4097,
    1,
    &[(0, body[..8192].to_vec())],
    7,
);

let body = data(8193);
let l2 = leaf(&body[8192..], 2);
let root = parent(p01, l2, true);
let mut wire = 8193u64.to_le_bytes().to_vec();
pair(&mut wire, p01, l2);
wire.extend_from_slice(&body[8192..]);
witness(
    dir,
    "final-short",
    &body,
    root,
    &wire,
    8192..8193,
    1,
    &[(8192, body[8192..].to_vec())],
    5,
);

let body = data(8192);
let root = parent(l0, l1, true);
assert_eq!(
    root.to_string(),
    "2abf65dd26465a7352707d79d18ff3aab9ee5d97614a774619c79ed527e20190"
);
assert_eq!(
    p01.to_string(),
    "11890a7e7cf1e4de463a04bf53bfdf269d627983a221daaf9029a3ff43297389"
);
assert_ne!(root, p01);
let mut wire = 8192u64.to_le_bytes().to_vec();
wire.extend_from_slice(&body);
witness(
    dir,
    "sole-group",
    &body,
    root,
    &wire,
    1..8191,
    1,
    &[(0, body.clone())],
    6,
);
let mut reducer = GroupHasher::new(&Poseidon2Backend, &body, 0, true).unwrap();
assert_eq!(reducer.step(), None);
assert_eq!(reducer.step(), None);
assert_eq!(reducer.step(), Some(root));
assert!(reducer.is_complete());
assert_eq!(reducer.step(), None);

// Synthetic parent commitment, NOT the root of a witnessed complete file.
// Its unselected sibling is an arbitrary zero CV. This probes representation.
let zero = Hash::from_bytes([0; 32]);
let synthetic_root = parent(l0, zero, true);
let mut canonical = 8192u64.to_le_bytes().to_vec();
pair(&mut canonical, l0, zero);
canonical.extend_from_slice(&body[..4096]);
let query = ranges(0..1);
let baseline = decode_slice(
    &Poseidon2Backend,
    &canonical,
    &synthetic_root,
    &query,
    BlockSize(0),
)
.unwrap();
assert_eq!(baseline, [(0, body[..4096].to_vec())]);
save(dir, "synthetic-canonical", &canonical);
for word in 0..4 {
    let mut noncanonical = [0; 32];
    noncanonical[word * 8..word * 8 + 8].copy_from_slice(&P.to_le_bytes());
    let raw = Hash::from_bytes(noncanonical);
    assert_ne!(raw, zero);
    assert_eq!(raw.as_bytes(), &noncanonical);
    assert_eq!(parent(l0, raw, true), synthetic_root);
    let mut alias = canonical.clone();
    alias[40 + word * 8..48 + word * 8].copy_from_slice(&P.to_le_bytes());
    assert_eq!(
        decode_slice(
            &Poseidon2Backend,
            &alias,
            &synthetic_root,
            &query,
            BlockSize(0)
        )
        .unwrap(),
        baseline
    );
    save(dir, &format!("synthetic-alias-{word}"), &alias);
    println!(
        "alias_word={word} raw_equal=false parent_equal=true legacy_accept=true root={synthetic_root}"
    );
}
for value in [0, P - 1, P, u64::MAX] {
    let mut raw = [0; 32];
    raw[..8].copy_from_slice(&value.to_le_bytes());
    assert_eq!(Hash::from_bytes(raw).as_bytes(), &raw);
    println!("word={value} proposed_canonical={}", value < P);
}
println!(
    "No new verifier API, allocation guarantee, or whole-file synthetic-root authority is tested here."
);

}

===== 047 END =====

===== 048 BEGIN Radio Cargo.toml | 2085 bytes | SHA256 3f8d71aa50c829445d66c981166e22f9b64fbd1f91bdddf4ecb422cf4ebd39f2 ===== [workspace] members = [ "iroh-base", "iroh-dns-server", "iroh", "iroh/bench", "iroh-relay",

"cyber-bao", "particle", "iroh-blobs", "iroh-gossip", "iroh-docs", "iroh-car", "iroh-willow", "tests/integration", "radio-cli", ] resolver = "2" exclude = ["quinn", "nettools"]

[workspace.dependencies] hemera = { package = "cyber-hemera", git = "https://github.com/cyberia-to/hemera", rev = "d5f0a09539360934fb32db9b2e15a91995607db6", default-features = false }

[profile.release] debug = true

Hemera is the hash under every blob, BAO tree and ticket. Unoptimized it makes the

two-node tests (8 MB blobs) take minutes and starve their QUIC paths into idle

timeouts; optimizing just the hash keeps debug builds debuggable everywhere else.

[profile.dev.package.cyber-hemera] opt-level = 3

[profile.dev-ci] inherits = 'dev' opt-level = 1

[profile.optimized-release] inherits = 'release' debug = false lto = true debug-assertions = false opt-level = 3 panic = 'abort' incremental = false

[workspace.lints.rust] missing_debug_implementations = "warn"

We use this --cfg for documenting the cargo features on which an API

is available. To preview this locally use: RUSTDOCFLAGS="--cfg

iroh_docsrs" cargo +nightly doc --all-features. We use our own

iroh_docsrs instead of the common docsrs to avoid also enabling this

feature in any dependencies, because some indirect dependencies

require a feature enabled when using --cfg docsrs which we can not

do. To enable for a crate set `#![cfg_attr(iroh_docsrs,

feature(doc_cfg))]` in the crate.

We also have our own iroh_loom cfg to enable tokio-rs/loom testing.

unexpected_cfgs = { level = "warn", check-cfg = ["cfg(iroh_docsrs)", "cfg(iroh_loom)"] }

[workspace.lints.clippy] unused-async = "warn"

[patch.crates-io] willow-data-model = { git = "https://github.com/n0-computer/willow-rs.git", branch = "main" } willow-encoding = { git = "https://github.com/n0-computer/willow-rs.git", branch = "main" } meadowcap = { git = "https://github.com/n0-computer/willow-rs.git", branch = "main" }

===== 048 END =====

===== 049 BEGIN Radio cyber-bao/Cargo.toml | 1078 bytes | SHA256 95e58b3d1e130d6a579b361111e848b9aa907f66eee0e2acb7ab5449c9f9e365 ===== [package] name = "cyber-bao" version = "0.1.0" edition = "2024" description = "Poseidon2-BAO: verified streaming with Poseidon2 hash over Goldilocks" license = "MIT OR Apache-2.0" rust-version = "1.89"

[lints] workspace = true

[dependencies] hemera = { workspace = true } bytes = { version = "1", optional = true } smallvec = { version = "1", features = ["const_new"], optional = true } range-collections = { version = "0.4", features = ["serde", "new_unchecked"], optional = true } iroh-io = { version = "0.6.1", optional = true } genawaiter = { version = "0.99.1", features = ["futures03"], optional = true } tokio = { version = "1", features = ["io-util"], optional = true } serde = { version = "1", features = ["derive"], optional = true }

[dev-dependencies] proptest = "1" tokio = { version = "1", features = ["macros", "rt", "io-util"] }

[features] default = ["std"] std = ["hemera/std", "dep:bytes", "dep:smallvec", "dep:range-collections", "dep:iroh-io", "dep:genawaiter"] tokio_fsm = ["std", "dep:tokio"] serde = ["std", "dep:serde", "hemera/serde", "bytes/serde"]

===== 049 END =====

===== 050 BEGIN Radio cyber-bao/src/lib.rs | 1330 bytes | SHA256 2e054f65e05d5a47555e684cb339903972672e2f1077a2ee19ddd6648f88ac40 ===== //! Poseidon2-BAO: verified streaming with Poseidon2 hash over Goldilocks. //! //! This crate provides BAO-style content-verified streaming using the //! Poseidon2 algebraic hash function. The tree structure //! and encoding formats are compatible with the original bao specification, //! differing only in the hash function used. //! //! # Architecture //! //! - tree: Pure geometry — tree node indexing, chunk counting, block sizes //! - hash: Pluggable hash backend trait with Poseidon2 implementation //! - io: Encoding, decoding, outboard creation, and slice extraction

#![cfg_attr(not(feature = "std"), no_std)]

pub mod group; pub mod hash; #[cfg(feature = "std")] pub mod io; pub mod traversal; pub mod tree;

pub use hash::{HashBackend, Poseidon2Backend}; pub use tree::{BaoChunk, BaoTree, BlockSize, CHUNK_SIZE, ChunkNum, TreeNode};

#[cfg(feature = "std")] pub use tree::PostOrderChunkIter;

/// A set of chunk ranges (used for partial downloads, range requests, etc.). #[cfg(feature = "std")] pub type ChunkRanges = range_collections::RangeSet2;

/// Borrowed reference to chunk ranges. #[cfg(feature = "std")] pub type ChunkRangesRef = range_collections::RangeSetRef;

/// A set of byte ranges. #[cfg(feature = "std")] pub type ByteRanges = range_collections::RangeSet2;

===== 050 END =====

===== 051 BEGIN Radio cyber-bao/src/group.rs | 6349 bytes | SHA256 948307e945b1f7f3808b5828dacb04547a89c701c8f00ba1534fa396d0b66cdf ===== //! Incremental fixed-chunk group hashing with a fixed frontier. //! //! This computes a hash only; it does not authenticate data or a particle/root //! association. Each pending step calls one backend kernel, on at most 4096 input //! bytes or two child hashes. Arbitrary backend code and hash destructors retain //! their own cost and allocation behavior.

use core::fmt;

use crate::{CHUNK_SIZE, HashBackend};

/// A group cannot be represented by the backend's absolute chunk counters. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum GroupHashError { /// The input length does not fit in a u64 (unreachable on <=64-bit targets). InputTooLarge, /// The last absolute chunk counter would exceed u64::MAX. CounterOverflow, }

impl fmt::Display for GroupHashError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(match self { Self::InputTooLarge => "group input length exceeds u64", Self::CounterOverflow => "group chunk counter overflows u64", }) } }

impl core::error::Error for GroupHashError {}

fn leaf_count(len: u64) -> u64 { (len / CHUNK_SIZE as u64 + u64::from(!len.is_multiple_of(CHUNK_SIZE as u64))).max(1) }

fn validate_counter(len: u64, start: u64) -> Result<u64, GroupHashError> { let leaves = leaf_count(len); start .checked_add(leaves - 1) .ok_or(GroupHashError::CounterOverflow)?; Ok(leaves) }

/// A resumable complete-left binary reduction over fixed 4096-byte chunks. /// /// Construction and completed polls call no backend method. Every pending /// step performs exactly one leaf or parent kernel: for N chunks /// (at least one, even for empty input), completion takes exactly 2*N-1 steps. /// Only the completing kernel receives the requested root flag. /// /// The caller owns scheduling: check is_complete, admit /// one unit from its persistent budget, then step. Intermediate steps return /// None while is_complete is false; count kernel entries, not returned hashes. /// No internal quota is renewed by polling. Backend panics have no recovery /// contract. Hashes are moved, never cloned. /// /// The frontier uses 53 slots: a u64 byte length needs at most 2^52 leaves; /// before a leaf there are at most 52 complete peaks, plus the incoming leaf. /// This fixed storage does not require allocation or a placeholder hash. pub struct GroupHasher<'a, B: HashBackend> { backend: &'a B, remaining: &'a [u8], next_counter: u64, leaves: u64, processed: u64, frontier: [Option<B::Hash>; 53], occupied: usize, reductions: u32, root: bool, complete: bool, }

impl<B: HashBackend> fmt::Debug for GroupHasher<', B> { fn fmt(&self, f: &mut fmt::Formatter<'>) -> fmt::Result { f.debug_struct("GroupHasher") .field("remaining_bytes", &self.remaining.len()) .field("processed_leaves", &self.processed) .field("leaves", &self.leaves) .field("occupied", &self.occupied) .field("is_complete", &self.complete) .finish_non_exhaustive() } }

impl<'a, B: HashBackend> GroupHasher<'a, B> { /// Borrow a group and validate every counter before any hashing. /// /// Empty input is a single empty leaf. A sole leaf at u64::MAX is valid; /// two leaves starting there return [GroupHashError::CounterOverflow]. pub fn new( backend: &'a B, data: &'a [u8], start_chunk: u64, is_root: bool, ) -> Result<Self, GroupHashError> { let len = u64::try_from(data.len()).map_err(|| GroupHashError::InputTooLarge)?; let leaves = validate_counter(len, start_chunk)?; Ok(Self { backend, remaining: data, next_counter: start_chunk, leaves, processed: 0, frontier: core::array::from_fn(|| None), occupied: 0, reductions: 0, root: is_root, complete: false, }) }

/// Whether the final hash has already been returned.
pub fn is_complete(&self) -> bool {
    self.complete
}

/// Perform one pending kernel and return the hash only on the final step.
///
/// Intermediate steps return None with `is_complete() == false`. Completed
/// polls return None with `is_complete() == true` and perform no kernel.
pub fn step(&mut self) -> Option<B::Hash> {
    if self.complete {
        return None;
    }
    if self.reductions != 0 {
        let right = self.frontier[self.occupied - 1]
            .take()
            .expect("occupied right peak");
        let left = self.frontier[self.occupied - 2]
            .take()
            .expect("occupied left peak");
        let final_parent = self.processed == self.leaves && self.occupied == 2;
        let hash = self
            .backend
            .parent_hash(&left, &right, self.root && final_parent);
        self.occupied -= 1;
        self.reductions -= 1;
        if final_parent {
            self.complete = true;
            return Some(hash);
        }
        self.frontier[self.occupied - 1] = Some(hash);
    } else {
        let take = self.remaining.len().min(CHUNK_SIZE);
        let hash = self.backend.chunk_hash(
            &self.remaining[..take],
            self.next_counter,
            self.root && self.leaves == 1,
        );
        self.remaining = &self.remaining[take..];
        self.processed += 1;
        if self.leaves == 1 {
            self.complete = true;
            return Some(hash);
        }
        self.frontier[self.occupied] = Some(hash);
        self.occupied += 1;
        if self.processed == self.leaves {
            // Fold remaining complete peaks from right to left.
            self.reductions = (self.occupied - 1) as u32;
        } else {
            // Merge equal-size complete peaks before accepting another leaf.
            self.reductions = self.processed.trailing_zeros();
            self.next_counter += 1; // all used counters were validated in new
        }
    }
    None
}

}

#[cfg(test)] mod tests;

===== 051 END =====

===== 052 BEGIN Radio cyber-bao/src/hash.rs | 3960 bytes | SHA256 1e705848543784c326be3ecd347878eae8dc5ab0207392d64ba5d9efb695bf1f ===== //! Hash backend trait and Poseidon2 implementation. //! //! The HashBackend trait abstracts the hash function used in BAO tree //! construction, making the tree machinery hash-agnostic. The Poseidon2Backend //! provides the concrete implementation using hemera.

use hemera::{Hash, OUTPUT_BYTES};

/// Trait for pluggable hash functions in BAO tree operations. /// /// Implementations must provide: /// - Leaf hashing: hash a data chunk at a position in the file /// - Parent hashing: combine two child hashes into a parent hash pub trait HashBackend { /// The hash output type. type Hash: AsRef<[u8]> + Clone + Eq + core::fmt::Debug;

/// Hash a data chunk (leaf node).
///
/// - `data`: the chunk data
/// - `counter`: 0-based position index in the file
/// - `is_root`: true if this is the only chunk (root finalization)
fn chunk_hash(&self, data: &[u8], counter: u64, is_root: bool) -> Self::Hash;

/// Combine two child hashes into a parent hash.
///
/// - `left`: left child hash
/// - `right`: right child hash
/// - `is_root`: true if this is the tree root
fn parent_hash(&self, left: &Self::Hash, right: &Self::Hash, is_root: bool) -> Self::Hash;

/// Size of the hash output in bytes.
fn hash_size(&self) -> usize;

/// A zero hash (used for empty/placeholder nodes).
fn zero_hash(&self) -> Self::Hash;

/// Construct a hash from its raw byte representation.
fn hash_from_bytes(&self, bytes: &[u8]) -> Self::Hash;

}

/// Poseidon2 hash backend using hemera. #[derive(Debug, Clone, Copy, Default)] pub struct Poseidon2Backend;

impl HashBackend for Poseidon2Backend { type Hash = Hash;

fn chunk_hash(&self, data: &[u8], counter: u64, is_root: bool) -> Hash {
    hemera::tree::chunk_cv(data, counter, is_root)
}

fn parent_hash(&self, left: &Hash, right: &Hash, is_root: bool) -> Hash {
    hemera::tree::parent_cv(left, right, is_root)
}

fn hash_size(&self) -> usize {
    OUTPUT_BYTES
}

fn zero_hash(&self) -> Hash {
    Hash::from_bytes([0u8; OUTPUT_BYTES])
}

fn hash_from_bytes(&self, bytes: &[u8]) -> Hash {
    let mut arr = [0u8; OUTPUT_BYTES];
    arr.copy_from_slice(&bytes[..OUTPUT_BYTES]);
    Hash::from_bytes(arr)
}

}

#[cfg(test)] mod tests { use super::*;

#[test]
fn poseidon2_backend_basic() {
    let backend = Poseidon2Backend;
    let h1 = backend.chunk_hash(b"hello", 0, false);
    let h2 = backend.chunk_hash(b"hello", 0, false);
    assert_eq!(h1, h2); // deterministic

    let h3 = backend.chunk_hash(b"world", 0, false);
    assert_ne!(h1, h3); // different data
}

#[test]
fn poseidon2_backend_counter() {
    let backend = Poseidon2Backend;
    let h0 = backend.chunk_hash(b"data", 0, false);
    let h1 = backend.chunk_hash(b"data", 1, false);
    assert_ne!(h0, h1); // different counter
}

#[test]
fn poseidon2_backend_parent() {
    let backend = Poseidon2Backend;
    let left = backend.chunk_hash(b"left", 0, false);
    let right = backend.chunk_hash(b"right", 1, false);
    let parent = backend.parent_hash(&left, &right, false);
    assert_ne!(parent, left);
    assert_ne!(parent, right);

    // Non-commutative
    let parent_rev = backend.parent_hash(&right, &left, false);
    assert_ne!(parent, parent_rev);
}

#[test]
fn poseidon2_backend_root_differs() {
    let backend = Poseidon2Backend;
    let left = backend.chunk_hash(b"left", 0, false);
    let right = backend.chunk_hash(b"right", 1, false);
    let non_root = backend.parent_hash(&left, &right, false);
    let root = backend.parent_hash(&left, &right, true);
    assert_ne!(non_root, root);
}

#[test]
fn hash_size() {
    let backend = Poseidon2Backend;
    assert_eq!(backend.hash_size(), OUTPUT_BYTES);
}

}

===== 052 END =====

===== 053 BEGIN Radio cyber-bao/src/tree.rs | 12320 bytes | SHA256 458f26235aee22c42376dde8929a55831c1f8a58dd59a5dac270cd9bb8bd667a ===== //! BAO tree geometry — pure math, no hashing. //! //! This module provides the tree structure used for verified streaming. //! The tree uses in-order indexing (same as bao-tree): leaves at //! even positions, parents at odd positions, level = trailing ones count.

use core::fmt; use core::ops::Range;

use hemera::OUTPUT_BYTES;

#[cfg(feature = "std")] mod traversal; #[cfg(feature = "std")] pub use traversal::PostOrderChunkIter;

/// Size of a single chunk in bytes (Hemera spec: 4 KiB). pub const CHUNK_SIZE: usize = 4096;

/// Size of a hash pair (two hashes concatenated). const PAIR_SIZE: usize = OUTPUT_BYTES * 2;

/// A node position in the in-order binary tree. /// /// Leaves are at even indices (0, 2, 4, ...). /// Parents are at odd indices with level = trailing_ones count. #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct TreeNode(pub(crate) u64);

impl TreeNode { /// Create a tree node from a raw in-order index. pub fn new(index: u64) -> Self { Self(index) }

/// The level of this node (0 for leaves).
pub fn level(self) -> u32 {
    self.0.trailing_ones()
}

/// Whether this is a leaf node.
pub fn is_leaf(self) -> bool {
    (self.0 & 1) == 0
}

/// The midpoint chunk number (boundary between left and right subtrees).
pub fn mid(self) -> ChunkNum {
    ChunkNum(self.0 + 1)
}

/// The left child of this node, if it has one.
pub fn left_child(self) -> Option<Self> {
    let level = self.level();
    if level == 0 {
        return None;
    }
    Some(Self(self.0 - (1 << (level - 1))))
}

/// The right child of this node, if it has one.
pub fn right_child(self) -> Option<Self> {
    let level = self.level();
    if level == 0 {
        return None;
    }
    Some(Self(self.0 + (1 << (level - 1))))
}

/// The parent of this node.
pub fn parent(self) -> Option<Self> {
    let level = self.level();
    let span = 1u64 << level;
    let offset = self.0;
    if offset & (span << 1) == 0 {
        Some(Self(offset + span))
    } else {
        offset.checked_sub(span).map(Self)
    }
}

/// Range of chunks covered by this node's subtree.
pub fn chunk_range(self) -> Range<ChunkNum> {
    let level = self.level();
    let span = 1u64 << level;
    let mid = self.0 + 1;
    ChunkNum(mid - span)..ChunkNum(mid + span)
}

/// Range of bytes covered by this node's subtree.
pub fn byte_range(self) -> Range<u64> {
    let range = self.chunk_range();
    range.start.to_bytes()..range.end.to_bytes()
}

/// The right descendant of this node that is within the tree bounds.
///
/// Starts at right child, then walks left until within `len`.
pub fn right_descendant(self, len: Self) -> Option<Self> {
    let mut node = self.right_child()?;
    while node >= len {
        node = node.left_child()?;
    }
    Some(node)
}

/// Count of nodes below this node in the subtree (excluding self).
pub fn count_below(self) -> u64 {
    let level = self.level();
    if level == 0 {
        return 0;
    }
    (1u64 << (level + 1)) - 2
}

/// Post-order offset of this node (closed-form).
pub fn post_order_offset(self) -> u64 {
    let level = self.level();
    let span = 1u64 << level;
    let mid = self.0 + 1;
    let start = mid - span;
    // In a complete binary tree, post-order offset = start + count_below
    start + self.count_below()
}

/// Shift the node index by removing the block_size lowest bits.
///
/// Returns `None` if the node's level is below the block size
/// (i.e., it's an intra-block node that doesn't appear in the block-level tree).
pub const fn add_block_size(self, n: u8) -> Option<Self> {
    let mask = (1u64 << n) - 1;
    if self.0 & mask == mask {
        Some(Self(self.0 >> n))
    } else {
        None
    }
}

/// The inverse of `add_block_size` — expand back to the unshifted index.
pub const fn subtract_block_size(self, n: u8) -> Self {
    let shifted = !(!self.0 << n);
    Self(shifted)
}

}

impl fmt::Debug for TreeNode { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "TreeNode({}, level={})", self.0, self.level()) } }

impl fmt::Display for TreeNode { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.0) } }

/// Count of chunks (each CHUNK_SIZE bytes). #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct ChunkNum(pub u64);

impl ChunkNum { /// Number of chunks needed for size bytes (rounds up). pub fn chunks(size: u64) -> Self { Self(size.div_ceil(CHUNK_SIZE as u64)) }

/// Number of full chunks in `size` bytes (rounds down).
pub fn full_chunks(size: u64) -> Self {
    Self(size / CHUNK_SIZE as u64)
}

/// Convert chunks back to bytes.
pub fn to_bytes(self) -> u64 {
    self.0 * CHUNK_SIZE as u64
}

}

impl fmt::Debug for ChunkNum { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "ChunkNum({})", self.0) } }

impl fmt::Display for ChunkNum { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.0) } }

impl core::ops::Add for ChunkNum { type Output = Self; fn add(self, rhs: Self) -> Self { Self(self.0 + rhs.0) } }

impl core::ops::Add for ChunkNum { type Output = Self; fn add(self, rhs: u64) -> Self { Self(self.0 + rhs) } }

impl core::ops::Sub for ChunkNum { type Output = Self; fn sub(self, rhs: Self) -> Self { Self(self.0 - rhs.0) } }

impl core::ops::Sub for ChunkNum { type Output = Self; fn sub(self, rhs: u64) -> Self { Self(self.0 - rhs) } }

#[cfg(feature = "std")] impl range_collections::range_set::RangeSetEntry for ChunkNum { fn min_value() -> Self { ChunkNum(0) }

fn is_min_value(&self) -> bool {
    self.0 == 0
}

}

/// Block size for chunk groups — log2 of the number of chunks per block. /// /// BlockSize(0) = CHUNK_SIZE bytes (one chunk per block). /// BlockSize(2) = 4 × CHUNK_SIZE bytes (4 chunks per block, recommended default). #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct BlockSize(pub u8);

impl BlockSize { /// One chunk per block. pub const ZERO: Self = Self(0);

/// Default 16 KiB blocks (4 × 4096-byte chunks, recommended for production).
pub const DEFAULT: Self = Self(2);

/// Create from the log2 of chunks per block.
pub const fn from_chunk_log(log: u8) -> Self {
    Self(log)
}

/// Create from a byte size (must be a power of 2 >= CHUNK_SIZE).
pub fn from_bytes(bytes: u64) -> Option<Self> {
    if bytes < CHUNK_SIZE as u64 || !bytes.is_power_of_two() {
        return None;
    }
    let log = (bytes / CHUNK_SIZE as u64).trailing_zeros() as u8;
    Some(Self(log))
}

/// Block size in bytes.
pub fn bytes(self) -> usize {
    CHUNK_SIZE << self.0
}

/// Log2 of chunks per block.
pub fn chunk_log(self) -> u8 {
    self.0
}

/// Log2 of chunks per block as u32.
pub fn to_u32(self) -> u32 {
    self.0 as u32
}

}

/// The BAO tree geometry descriptor. /// /// Contains no actual data or hashes — purely describes the tree shape /// for a blob of a given size and block size. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct BaoTree { size: u64, block_size: BlockSize, }

impl BaoTree { /// Create a new tree for the given data size and block size. pub fn new(size: u64, block_size: BlockSize) -> Self { Self { size, block_size } }

/// Total data size in bytes.
pub fn size(&self) -> u64 {
    self.size
}

/// Block size configuration.
pub fn block_size(&self) -> BlockSize {
    self.block_size
}

/// Number of chunks (CHUNK_SIZE bytes each).
pub fn chunks(&self) -> ChunkNum {
    ChunkNum::chunks(self.size)
}

/// Number of blocks (chunk groups). Minimum 1 even for empty data.
pub fn blocks(&self) -> u64 {
    let chunk_count = self.chunks().0;
    let chunks_per_block = 1u64 << self.block_size.0;
    chunk_count.div_ceil(chunks_per_block).max(1)
}

/// Root node of the tree (at the block level).
///
/// In the in-order binary tree, the root of N leaves is at
/// index `next_power_of_two(N) - 1`.
pub fn root(&self) -> TreeNode {
    let blocks = self.blocks();
    if blocks <= 1 {
        return TreeNode(0);
    }
    TreeNode(blocks.next_power_of_two() - 1)
}

/// Size of the outboard (hash pairs only, no size prefix).
/// Each internal node is a hash pair (two OUTPUT_BYTES hashes).
pub fn outboard_size(&self) -> u64 {
    let blocks = self.blocks();
    if blocks <= 1 {
        return 0;
    }
    (blocks - 1) * PAIR_SIZE as u64
}

/// Block size in bytes (chunk group size).
pub fn chunk_group_bytes(&self) -> usize {
    self.block_size.bytes()
}

/// Compute the shifted tree representation (block-level tree).
///
/// Returns `(root_node, filled_size)` in the shifted coordinate system.
pub fn shifted(&self) -> (TreeNode, TreeNode) {
    let level = self.block_size.0;
    let size = self.size;
    let shift = CHUNK_SIZE.trailing_zeros() + level as u32;
    let mask = (1u64 << shift) - 1;
    let full_blocks = size >> shift;
    let open_block = u64::from((size & mask) != 0);
    let blocks = (full_blocks + open_block).max(1);
    let n = blocks.div_ceil(2);
    let root = n.next_power_of_two() - 1;
    let filled_size = n + n.saturating_sub(1);
    (TreeNode(root), TreeNode(filled_size))
}

/// Compute the left, mid, and right byte boundaries for a leaf node.
///
/// `(start, mid.min(size), end.min(size))`
pub fn leaf_byte_ranges3(&self, node: TreeNode) -> (u64, u64, u64) {
    let Range { start, end } = node.byte_range();
    let mid = node.mid().to_bytes();
    (start, mid.min(self.size), end.min(self.size))
}

/// Convert a node's in-order chunk_range to actual chunk numbers.
///
/// `TreeNode::chunk_range()` returns values in the in-order index space
/// where leaf at index 2k covers range 2k..2k+2. Actual chunk numbers
/// are: block_idx * chunks_per_block, where block_idx = leaf_index / 2.
/// This method performs that conversion for use with `ChunkRanges`.
pub fn node_actual_chunk_range(&self, node: TreeNode) -> Range<ChunkNum> {
    let raw = node.chunk_range();
    let cpb = 1u64 << self.block_size.0;
    // In-order index space → block space: divide by 2
    // Block space → chunk space: multiply by chunks_per_block
    ChunkNum((raw.start.0 / 2) * cpb)..ChunkNum((raw.end.0 / 2) * cpb)
}

/// Whether a node is relevant for the outboard (i.e., tracked at this block size).
pub fn is_relevant_for_outboard(&self, node: TreeNode) -> bool {
    let level = node.level();
    let bs = self.block_size.to_u32();
    if level < bs {
        false
    } else if level > bs {
        true
    } else {
        node.mid().to_bytes() < self.size
    }
}

}

/// Items yielded during tree traversal. #[derive(Debug, Clone)] pub enum BaoChunk { /// A parent node — contains two child hashes (PAIR_SIZE bytes). Parent { node: TreeNode, is_root: bool, /// Whether the left child will be visited in this traversal. left: bool, /// Whether the right child will be visited in this traversal. right: bool, }, /// A leaf node — contains actual data. Leaf { start_chunk: u64, size: usize, is_root: bool, }, }

#[cfg(test)] mod tests;

===== 053 END =====

===== 054 BEGIN Radio cyber-bao/src/traversal.rs | 6067 bytes | SHA256 87f646ef36a1e7ba1be3dd4576acf4bf6637d1ec6705953aef0bf8c6ac42eb5a ===== //! Checked, allocation-free preorder geometry for one byte range. //! //! This cursor emits geometry only. It does not parse a proof or authenticate //! a particle, root, payload or empty request.

use core::{fmt, iter::FusedIterator, ops::Range};

use crate::{BaoChunk, BlockSize, CHUNK_SIZE, TreeNode};

/// Invalid geometry supplied to [RangeTraversal::new]. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum RangeTraversalError { /// The group width cannot be represented by both u64 and usize. InvalidBlockSize, /// The byte range is reversed or extends beyond the file. InvalidRange, }

impl fmt::Display for RangeTraversalError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(match self { Self::InvalidBlockSize => "invalid traversal block size", Self::InvalidRange => "invalid traversal byte range", }) } }

impl core::error::Error for RangeTraversalError {}

#[derive(Debug, Clone, Copy)] struct Frame { first: u64, count: u64, is_root: bool, }

/// Preorder cursor over whole groups intersecting a half-open byte range. /// /// Construction uses fixed storage for 53 frames. Each pending [Iterator::next] /// pops one frame, pushes at most two children and returns one item, without /// allocation, recursion, scanning or hashing. Pausing requires no extra state: /// simply retain the cursor without calling next. /// /// ROOT belongs to the complete file tree, even when the request selects only /// one leaf. Parent flags identify children visited by this request; a parent /// still describes a pair of hashes. An empty request is immediately complete /// and emits no item; it makes no authentication claim. pub struct RangeTraversal { size: u64, group_bytes: u64, selected: Range, frames: [Frame; 53], pending: usize, }

impl fmt::Debug for RangeTraversal { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("RangeTraversal") .field("size", &self.size) .field("group_bytes", &self.group_bytes) .field("selected", &self.selected) .field("pending", &self.pending) .finish() } }

impl RangeTraversal { /// Admit a file size, group width and half-open requested byte interval. /// /// Block geometry is validated before the request: the block log must be at /// most 51, and its byte width must fit usize. This admits logs 0..=51 on /// 64-bit targets and 0..=19 on 32-bit targets, even for a short or empty file. /// Width admission concerns integer geometry, not allocation layout validity. /// The request must satisfy start <= end <= size; an empty interval at EOF /// is valid. Only the final file group is clipped to its actual byte length. pub fn new( size: u64, block_size: BlockSize, request: Range, ) -> Result<Self, RangeTraversalError> { if block_size.0 > 51 { return Err(RangeTraversalError::InvalidBlockSize); } let group_bytes = (CHUNK_SIZE as u64) << block_size.0; usize::try_from(group_bytes).map_err(|_| RangeTraversalError::InvalidBlockSize)?; if request.start > request.end || request.end > size { return Err(RangeTraversalError::InvalidRange); } let mut result = Self { size, group_bytes, selected: 0..0, frames: [Frame { first: 0, count: 0, is_root: false, }; 53], pending: 0, }; if request.start < request.end { result.selected = request.start / group_bytes..(request.end - 1) / group_bytes + 1; result.push(Frame { first: 0, count: size.div_ceil(group_bytes), is_root: true, }); } Ok(result) }

/// Whether no item remains, including immediately after the last emission.
pub fn is_complete(&self) -> bool {
    self.pending == 0
}

fn push(&mut self, frame: Frame) {
    // N <= 2^52: at depth d <= 52, at most d deferred siblings plus
    // one current frame exist. Pop before pushing children preserves 53.
    self.frames[self.pending] = frame;
    self.pending += 1;
}

}

impl Iterator for RangeTraversal { type Item = BaoChunk;

fn next(&mut self) -> Option<Self::Item> {
    if self.is_complete() {
        return None;
    }
    self.pending -= 1;
    let frame = self.frames[self.pending];
    if frame.count == 1 {
        // first < N implies first * group_bytes <= size - 1. Subtract
        // before clipping: the next group's byte end need not fit u64.
        let start = frame.first * self.group_bytes;
        return Some(BaoChunk::Leaf {
            start_chunk: start / CHUNK_SIZE as u64,
            size: self.group_bytes.min(self.size - start) as usize,
            is_root: frame.is_root,
        });
    }
    let left_count = 1u64 << (frame.count - 1).ilog2();
    let middle = frame.first + left_count;
    let end = frame.first + frame.count;
    let left = self.selected.start < middle && frame.first < self.selected.end;
    let right = self.selected.start < end && middle < self.selected.end;
    if right {
        self.push(Frame {
            first: middle,
            count: frame.count - left_count,
            is_root: false,
        });
    }
    if left {
        self.push(Frame {
            first: frame.first,
            count: left_count,
            is_root: false,
        });
    }
    // middle < N <= 2^52, so this group-based index is below 2^53.
    Some(BaoChunk::Parent {
        node: TreeNode::new(2 * middle - 1),
        is_root: frame.is_root,
        left,
        right,
    })
}

}

impl FusedIterator for RangeTraversal {}

===== 054 END =====

===== 055 BEGIN Radio cyber-bao/src/io/slice.rs | 13041 bytes | SHA256 0f29291599f56c3c8dda4930e660d41a3e04cf1a3ee9cdfb8c36e3fc1de832d7 ===== //! Slice extraction and verification. //! //! A slice is a minimal subset of the combined encoding that proves //! a requested byte range. It includes only the parent hashes on the //! path from the requested chunks to the root, plus the chunk data //! in the range. Verification is O(log N) in the file size.

use std::ops::Range;

use crate::hash::HashBackend; use crate::io::outboard; use crate::tree::{BaoChunk, BaoTree, BlockSize, ChunkNum, CHUNK_SIZE}; use crate::{ChunkRanges, ChunkRangesRef};

/// Extract a slice (proof + data) for the given byte range. /// /// Returns the root hash and the encoded slice that can be verified /// against it. pub fn extract_slice<B: HashBackend>( backend: &B, data: &[u8], range: Range, block_size: BlockSize, ) -> (B::Hash, Vec) { let chunk_ranges = crate::io::round_up_to_chunks(&crate::ByteRanges::from(range)); extract_slice_ranges(backend, data, &chunk_ranges, block_size) }

/// Extract a slice for multiple chunk ranges (multi-range query). /// /// Returns the root hash and the encoded slice containing only the /// parent hashes on the verification path and the leaf data for /// requested ranges. pub fn extract_slice_ranges<B: HashBackend>( backend: &B, data: &[u8], ranges: &ChunkRangesRef, block_size: BlockSize, ) -> (B::Hash, Vec) { let ob = outboard::outboard(backend, data, block_size); let tree = ob.tree;

let mut slice_data = Vec::new();
slice_data.extend_from_slice(&(data.len() as u64).to_le_bytes());

if tree.blocks() <= 1 {
    slice_data.extend_from_slice(data);
    return (ob.root, slice_data);
}

let hash_size = backend.hash_size();
let pair_size = hash_size * 2;
let pre_order = tree.pre_order_chunks();
let mut outboard_offset = 0usize;

for chunk in &pre_order {
    match chunk {
        BaoChunk::Parent { node, .. } => {
            let actual_range = tree.node_actual_chunk_range(*node);
            let node_chunks = ChunkRanges::from(actual_range.start..actual_range.end);
            if !node_chunks.is_disjoint(ranges) {
                slice_data
                    .extend_from_slice(&ob.data[outboard_offset..outboard_offset + pair_size]);
            }
            outboard_offset += pair_size;
        }
        BaoChunk::Leaf {
            start_chunk,
            size,
            ..
        } => {
            let chunks_per_block = 1u64 << block_size.chunk_log();
            let block_idx = *start_chunk / chunks_per_block;
            let leaf_start = block_idx * chunks_per_block;
            let leaf_end = leaf_start + chunks_per_block;
            let leaf_range =
                ChunkRanges::from(ChunkNum(leaf_start)..ChunkNum(leaf_end));
            if !leaf_range.is_disjoint(ranges) {
                let byte_start = (*start_chunk * CHUNK_SIZE as u64) as usize;
                let byte_end = (byte_start + *size).min(data.len());
                if byte_start < data.len() {
                    slice_data.extend_from_slice(&data[byte_start..byte_end]);
                }
            }
        }
    }
}

(ob.root, slice_data)

}

/// Decode and verify a slice against a trusted root hash. /// /// Returns a vec of (offset, data) pairs for each verified leaf. pub fn decode_slice<B: HashBackend>( backend: &B, slice: &[u8], root_hash: &B::Hash, ranges: &ChunkRangesRef, block_size: BlockSize, ) -> Result<Vec<(u64, Vec)>, SliceDecodeError> { if slice.len() < 8 { return Err(SliceDecodeError::Truncated); }

let declared_size = u64::from_le_bytes(slice[..8].try_into().unwrap());
let tree = BaoTree::new(declared_size, block_size);
let hash_size = backend.hash_size();
let pair_size = hash_size * 2;

let mut cursor = 8usize;
let mut results = Vec::new();

if tree.blocks() <= 1 {
    let leaf_data = &slice[cursor..];
    let computed = super::hash_group(backend, leaf_data, 0, true);
    if computed != *root_hash {
        return Err(SliceDecodeError::LeafMismatch { start_chunk: 0 });
    }
    results.push((0u64, leaf_data.to_vec()));
    return Ok(results);
}

let pre_order = tree.pre_order_chunks_filtered(ranges);
// For in-file requests, only pending visited nodes have expected hashes.
let mut expected_stack: Vec<B::Hash> = vec![root_hash.clone()];

for chunk in &pre_order {
    match chunk {
        BaoChunk::Parent {
            node,
            is_root,
            left,
            right,
        } => {
            if cursor + pair_size > slice.len() {
                return Err(SliceDecodeError::Truncated);
            }
            let left_bytes = &slice[cursor..cursor + hash_size];
            let right_bytes = &slice[cursor + hash_size..cursor + pair_size];
            cursor += pair_size;

            let left_hash = backend.hash_from_bytes(left_bytes);
            let right_hash = backend.hash_from_bytes(right_bytes);

            let computed = backend.parent_hash(&left_hash, &right_hash, *is_root);
            let expected = expected_stack.pop().ok_or(SliceDecodeError::Truncated)?;
            if computed != expected {
                return Err(SliceDecodeError::ParentMismatch { node: node.0 });
            }

            if *right {
                expected_stack.push(right_hash);
            }
            if *left {
                expected_stack.push(left_hash);
            }
        }
        BaoChunk::Leaf {
            start_chunk,
            size,
            is_root,
        } => {
            if cursor + *size > slice.len() {
                return Err(SliceDecodeError::Truncated);
            }
            let leaf_data = &slice[cursor..cursor + *size];
            cursor += *size;

            let computed = super::hash_group(backend, leaf_data, *start_chunk, *is_root);
            let expected = expected_stack.pop().ok_or(SliceDecodeError::Truncated)?;
            if computed != expected {
                return Err(SliceDecodeError::LeafMismatch {
                    start_chunk: *start_chunk,
                });
            }

            let byte_offset = *start_chunk * CHUNK_SIZE as u64;
            results.push((byte_offset, leaf_data.to_vec()));
        }
    }
}

Ok(results)

}

/// Error during slice decoding / verification. #[derive(Debug, Clone, PartialEq, Eq)] pub enum SliceDecodeError { Truncated, ParentMismatch { node: u64 }, LeafMismatch { start_chunk: u64 }, }

impl std::fmt::Display for SliceDecodeError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { SliceDecodeError::Truncated => write!(f, "truncated slice"), SliceDecodeError::ParentMismatch { node } => { write!(f, "parent hash mismatch at node {node}") } SliceDecodeError::LeafMismatch { start_chunk } => { write!(f, "leaf hash mismatch at chunk {start_chunk}") } } } }

impl std::error::Error for SliceDecodeError {}

#[cfg(test)] mod tests { use hemera::OUTPUT_BYTES;

use super::*;
use crate::hash::Poseidon2Backend;

const PAIR_SIZE: usize = OUTPUT_BYTES * 2;

#[test]
fn slice_full_range_matches_encode() {
    let backend = Poseidon2Backend;
    let data = vec![0x42u8; CHUNK_SIZE * 2];
    let (root, slice) = extract_slice(&backend, &data, 0..CHUNK_SIZE as u64 * 2, BlockSize::ZERO);

    assert_eq!(slice.len(), 8 + PAIR_SIZE + CHUNK_SIZE * 2);

    let left = backend.chunk_hash(&data[..CHUNK_SIZE], 0, false);
    let right = backend.chunk_hash(&data[CHUNK_SIZE..], 1, false);
    let expected_root = backend.parent_hash(&left, &right, true);
    assert_eq!(root, expected_root);
}

#[test]
fn slice_partial_range_is_smaller() {
    let backend = Poseidon2Backend;
    let data = vec![0x42u8; CHUNK_SIZE * 4];
    let (root_full, full_slice) = extract_slice(&backend, &data, 0..CHUNK_SIZE as u64 * 4, BlockSize::ZERO);
    let (root_partial, partial_slice) =
        extract_slice(&backend, &data, 0..CHUNK_SIZE as u64, BlockSize::ZERO);

    assert_eq!(root_full, root_partial);
    assert!(partial_slice.len() < full_slice.len());
}

#[test]
fn slice_root_hash_independent_of_range() {
    let backend = Poseidon2Backend;
    let data = vec![0x42u8; CHUNK_SIZE * 4];
    let (root1, _) = extract_slice(&backend, &data, 0..CHUNK_SIZE as u64, BlockSize::ZERO);
    let (root2, _) = extract_slice(&backend, &data, CHUNK_SIZE as u64..CHUNK_SIZE as u64 * 2, BlockSize::ZERO);
    let (root3, _) = extract_slice(&backend, &data, 0..CHUNK_SIZE as u64 * 4, BlockSize::ZERO);
    assert_eq!(root1, root2);
    assert_eq!(root2, root3);
}

#[test]
fn decode_slice_full_range_roundtrip() {
    let backend = Poseidon2Backend;
    let data = vec![0x42u8; CHUNK_SIZE * 2];
    let ranges = ChunkRanges::from(ChunkNum(0)..ChunkNum(2));
    let (root, slice) = extract_slice_ranges(&backend, &data, &ranges, BlockSize::ZERO);

    let results = decode_slice(&backend, &slice, &root, &ranges, BlockSize::ZERO)
        .expect("decode should succeed");

    let mut decoded = vec![0u8; CHUNK_SIZE * 2];
    for (offset, chunk) in &results {
        decoded[*offset as usize..*offset as usize + chunk.len()].copy_from_slice(chunk);
    }
    assert_eq!(decoded, data);
}

#[test]
fn decode_slice_partial_range() {
    let backend = Poseidon2Backend;
    let data = vec![0xABu8; CHUNK_SIZE * 4];
    let ranges = ChunkRanges::from(ChunkNum(0)..ChunkNum(1));
    let (root, slice) = extract_slice_ranges(&backend, &data, &ranges, BlockSize::ZERO);

    let results = decode_slice(&backend, &slice, &root, &ranges, BlockSize::ZERO)
        .expect("decode should succeed");

    assert_eq!(results.len(), 1);
    assert_eq!(results[0].0, 0);
    assert_eq!(results[0].1, data[..CHUNK_SIZE]);
}

#[test]
fn decode_slice_wrong_root_fails() {
    let backend = Poseidon2Backend;
    let data = vec![0x42u8; CHUNK_SIZE * 2];
    let ranges = ChunkRanges::from(ChunkNum(0)..ChunkNum(2));
    let (_, slice) = extract_slice_ranges(&backend, &data, &ranges, BlockSize::ZERO);

    let wrong_root = backend.chunk_hash(b"wrong", 0, true);
    let result = decode_slice(&backend, &slice, &wrong_root, &ranges, BlockSize::ZERO);
    assert!(result.is_err());
}

#[test]
fn multi_range_slice_extract_and_verify() {
    let backend = Poseidon2Backend;
    let data: Vec<u8> = (0..CHUNK_SIZE * 4).map(|i| (i % 256) as u8).collect();
    // Request chunks 0 and 3 (non-contiguous)
    let ranges = ChunkRanges::from(ChunkNum(0)..ChunkNum(1))
        | ChunkRanges::from(ChunkNum(3)..ChunkNum(4));
    let (root, slice) = extract_slice_ranges(&backend, &data, &ranges, BlockSize::ZERO);

    let results = decode_slice(&backend, &slice, &root, &ranges, BlockSize::ZERO)
        .expect("decode should succeed");

    assert_eq!(results.len(), 2);
    assert_eq!(results[0].0, 0);
    assert_eq!(results[0].1, data[..CHUNK_SIZE]);
    assert_eq!(results[1].0, CHUNK_SIZE as u64 * 3);
    assert_eq!(results[1].1, data[CHUNK_SIZE * 3..CHUNK_SIZE * 4]);
}

#[test]
fn single_block_slice_roundtrip() {
    let backend = Poseidon2Backend;
    let data = vec![0x42u8; 500];
    let ranges = ChunkRanges::from(ChunkNum(0)..ChunkNum(1));
    let (root, slice) = extract_slice_ranges(&backend, &data, &ranges, BlockSize::ZERO);

    let results = decode_slice(&backend, &slice, &root, &ranges, BlockSize::ZERO)
        .expect("decode should succeed");
    assert_eq!(results.len(), 1);
    assert_eq!(results[0].1, data);
}

#[test]
fn slice_roundtrip_block_size_nonzero() {
    let backend = Poseidon2Backend;
    let bs = BlockSize::from_chunk_log(1); // 2 chunks per block
    // 8 chunks → 4 blocks of 2 chunks
    let data: Vec<u8> = (0..CHUNK_SIZE * 8).map(|i| (i % 256) as u8).collect();
    let ranges = ChunkRanges::all();
    let (root, slice) = extract_slice_ranges(&backend, &data, &ranges, bs);

    let results = decode_slice(&backend, &slice, &root, &ranges, bs)
        .expect("decode should succeed");

    let mut decoded = vec![0u8; CHUNK_SIZE * 8];
    for (offset, chunk) in &results {
        decoded[*offset as usize..*offset as usize + chunk.len()].copy_from_slice(chunk);
    }
    assert_eq!(decoded, data);
}

}

===== 055 END =====

===== 056 BEGIN Radio iroh-blobs/Cargo.toml | 3156 bytes | SHA256 cbf2f94e32cb76f6976b9f271231077da1eadeb9a8fea69636180bec5441c011 ===== [package] name = "iroh-blobs" version = "0.98.0" edition = "2021" description = "content-addressed blobs for iroh" license = "MIT OR Apache-2.0" authors = ["dignifiedquire me@dignifiedquire.com", "n0 team"] repository = "https://github.com/n0-computer/iroh-blobs" keywords = ["hashing", "poseidon2", "streaming"]

Sadly this also needs to be updated in .github/workflows/ci.yml

rust-version = "1.89"

[lints] workspace = true

[dependencies] cyber-bao = { path = "../cyber-bao", features = ["tokio_fsm", "serde"] } hemera = { workspace = true, features = ["std", "serde"] } bytes = { version = "1", features = ["serde"] } derive_more = { version = "2.0.1", features = ["from", "try_from", "into", "debug", "display", "deref", "deref_mut"] } futures-lite = "2.6.0" quinn = { package = "iroh-quinn", version = "0.16.0", optional = true } n0-future = "0.3.0" range-collections = { version = "0.4.6", features = ["serde"] } smallvec = { version = "1", features = ["serde", "const_new"] } tokio = { version = "1.43.0", default-features = false, features = ["sync"] } tracing = "0.1.41" iroh-io = "0.6.1" rand = "0.9.2" hex = "0.4.3" serde = "1.0.217" postcard = { version = "1.1.1", features = ["experimental-derive", "use-std"] } data-encoding = "2.8.0" ref-cast = "1.0.24" arrayvec = "0.7.6" iroh = { package = "cyber-radio", path = "../iroh", default-features = false } self_cell = "1.1.0" genawaiter = { version = "0.99.1", features = ["futures03"] } iroh-base = { package = "cyber-radio-base", path = "../iroh-base" } iroh-tickets = "0.3" irpc = { version = "0.12.0", features = ["spans", "stream", "derive", "varint-util"], default-features = false } iroh-metrics = { version = "0.38" } redb = { version = "2.6.3", optional = true } reflink-copy = { version = "0.1.24", optional = true } n0-error = "0.1.2" nested_enum_utils = "0.2.3"

non-wasm-in-browser dependencies

[target.'cfg(not(all(target_family = "wasm", target_os = "unknown")))'.dependencies] chrono = { version = "0.4.39" }

wasm-in-browser dependencies

[target.'cfg(all(target_family = "wasm", target_os = "unknown"))'.dependencies] chrono = {version = "0.4.39", default-features = false, features = ["js-sys", "wasmbind", "std"] }

[dev-dependencies] clap = { version = "4.5.31", features = ["derive"] } hex = "0.4.3" iroh-test = "0.31.0" proptest = "1.6.0" serde_json = "1.0.138" serde_test = "1.0.177" tempfile = "3.17.1" test-strategy = "0.4.0" testresult = "0.4.1" tracing-subscriber = { version = "0.3.20", features = ["fmt"] } tracing-test = "0.2.5" walkdir = "2.5.0" atomic_refcell = "0.1.13" iroh = { package = "cyber-radio", path = "../iroh", features = ["address-lookup-mdns"]} async-compression = { version = "0.4.30", features = ["lz4", "tokio"] } concat_const = "0.2.0" anyhow = "1.0.100"

[build-dependencies] cfg_aliases = "0.2.1"

[features] hide-proto-docs = [] metrics = [] default = ["hide-proto-docs", "fs-store", "rpc"] fs-store = ["dep:redb", "dep:reflink-copy"] rpc = ["dep:quinn", "irpc/rpc", "irpc/quinn_endpoint_setup"]

example name = "expiring-tags" required-features = ["fs-store"]

example name = "random_store" required-features = ["fs-store"]

===== 056 END =====

===== 057 BEGIN Radio particle/Cargo.toml | 367 bytes | SHA256 a80402ad3fce896380f81f4a510e7ef081c1a881043970a81c7b24e203996969 ===== [package] name = "particle" version = "0.1.0" edition = "2024" description = "CLI tool for Poseidon2 hashing and BAO verified streaming" license = "MIT OR Apache-2.0" rust-version = "1.89"

[lints] workspace = true

bin name = "particle" path = "src/main.rs"

[dependencies] hemera = { workspace = true, features = ["std"] } cyber-bao = { path = "../cyber-bao" }

===== 057 END =====

===== 058 BEGIN Radio radio-cli/Cargo.toml | 666 bytes | SHA256 5d2e24decf543ba918766c57dd5bd3f3224b871933c3f4fc51d2420461cfccc0 ===== [package] name = "radio-cli" version = "0.1.0" edition = "2021" description = "Radio network CLI — hash, node, blob, gossip" license = "MIT OR Apache-2.0"

bin name = "radio" path = "src/main.rs"

[lints] workspace = true

[dependencies] clap = { version = "4", features = ["derive"] } tokio = { version = "1", features = ["full"] } iroh = { package = "cyber-radio", path = "../iroh" } iroh-blobs = { path = "../iroh-blobs" } iroh-gossip = { path = "../iroh-gossip" } hemera = { workspace = true, features = ["std"] } cyber-bao = { path = "../cyber-bao" } anyhow = "1" futures-lite = "2" tracing-subscriber = "0.3" data-encoding = "2" bytes = "1" rand = "0.9"

===== 058 END =====

===== 059 BEGIN Radio tests/integration/Cargo.toml | 673 bytes | SHA256 ac74983dbeee09aed2222c0c6108e81f97a176e59a7b3db444b3d4e1e429b4a0 ===== [package] name = "radio-integration-tests" version = "0.1.0" edition = "2021" publish = false

[dependencies] iroh = { package = "cyber-radio", path = "../../iroh" } iroh-base = { package = "cyber-radio-base", path = "../../iroh-base" } iroh-blobs = { path = "../../iroh-blobs" } iroh-gossip = { path = "../../iroh-gossip" } iroh-docs = { path = "../../iroh-docs" } hemera = { package = "cyber-hemera", version = "0.1" } cyber-bao = { path = "../../cyber-bao" }

tokio = { version = "1", features = ["full"] } anyhow = "1" bytes = "1" rand = "0.9" rand_chacha = "0.9" futures-util = "0.3" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] }

===== 059 END =====

===== 060 BEGIN Radio iroh-docs/Cargo.toml | 2490 bytes | SHA256 fc5de9598d40d5265bbc36c4bc6bd7f38f55ba206bf0f717bfdf9b8e0e8b07c6 ===== [package] name = "iroh-docs" version = "0.96.0" edition = "2021" readme = "README.md" description = "Iroh sync" license = "MIT/Apache-2.0" authors = ["n0 team"] repository = "https://github.com/n0-computer/iroh-docs"

Sadly this also needs to be updated in .github/workflows/ci.yml

rust-version = "1.89"

[dependencies] anyhow = "1" async-channel = "2.3.1" hemera = { workspace = true, features = ["std"] } bytes = { version = "1.7", features = ["serde"] } derive_more = { version = "2.0.1", features = [ "debug", "deref", "display", "from", "from_str", "try_into", "into", "as_ref", ] } ed25519-dalek = { version = "3.0.0-pre.1", features = ["serde", "rand_core"] } futures-buffered = "0.2.4" futures-lite = "2.3.0" futures-util = { version = "0.3.25" } hex = "0.4" iroh = { package = "cyber-radio", version = "0.1", path = "../iroh" } iroh-tickets = { version = "0.2"} iroh-blobs = { version = "0.98", path = "../iroh-blobs" } iroh-gossip = { version = "0.96", path = "../iroh-gossip", features = ["net"] } iroh-metrics = { version = "0.38", default-features = false } irpc = { version = "0.12.0" } n0-future = "0.3" num_enum = "0.7" postcard = { version = "1", default-features = false, features = [ "alloc", "use-std", "experimental-derive", ] } quinn = { package = "iroh-quinn", version = "0.16.0" } rand = "0.9.2" redb = { version = "2.6.3" } self_cell = "1.0.3" serde = { version = "1.0.164", features = ["derive"] } serde-error = "0.1.3" strum = { version = "0.26", features = ["derive"] } tempfile = { version = "3.4" } thiserror = "2" tokio = { version = "1", features = ["sync", "rt", "time", "io-util"] } tokio-stream = { version = "0.1", features = ["sync"] } tokio-util = { version = "0.7.12", features = ["codec", "io-util", "io", "rt"] } tracing = "0.1" n0-error = "0.1.0"

[dev-dependencies] data-encoding = "2.6.0" iroh = { package = "cyber-radio", version = "0.1", path = "../iroh", features = ["test-utils"] } nested_enum_utils = "0.2" parking_lot = "0.12.3" proptest = "1.2.0" rand_chacha = "0.9" tempfile = "3.4" test-strategy = "0.4" testdir = "0.7" testresult = "0.4.1" tokio = { version = "1", features = ["sync", "macros"] } tracing-subscriber = { version = "0.3.20", features = ["env-filter"] } tracing-test = "0.2.5"

[features] default = ["metrics"] metrics = ["iroh-metrics/metrics", "iroh/metrics"]

[package.metadata.docs.rs] all-features = true rustdoc-args = ["--cfg", "iroh_docsrs"]

[lints] workspace = true

===== 060 END =====

===== 061 BEGIN Radio iroh-blobs/src/api/blobs/export_pairs.rs | 13409 bytes | SHA256 96914dc66c602b6e0bc9cf29a5287a84214b514be367ca96eef0b637079eb9c2 ===== //! Exercise the actual exporter with literal pairs and an independent store proof. mod support;

use std::io;

use cyber_bao::{ io::{slice::decode_slice, EncodeError}, Poseidon2Backend, CHUNK_SIZE, }; use n0_future::StreamExt; use support::*;

use super::{EncodedItem, ExportBaoProgress}; use crate::{ api::{Error, ExportBaoError}, provider::events::ProgressError, store::{readonly_mem::ReadonlyMemStore, IROH_BLOCK_SIZE}, };

async fn chunks(export: ExportBaoProgress) -> Vec<Vec> { let mut stream = export.into_byte_stream(); let mut chunks = Vec::new(); while let Some(item) = stream.next().await { chunks.push(item.unwrap().to_vec()); } chunks }

#[test] fn geometry_pins() { assert_eq!(geometry(), (65536, 16)); }

#[tokio::test] async fn root_policy_readonly_memory_key_and_wire() { let (data, root, wire) = root_policy_fixture(); let store = ReadonlyMemStore::new([&data]); let keys = store.list().hashes().await.unwrap(); assert_eq!(keys, [root]); assert_eq!(root, crate::Hash::new(&data)); assert_eq!( store .export_bao(keys[0], ranges(0, 2)) .bao_to_vec() .await .unwrap(), wire ); assert_eq!(store.get_bytes(keys[0]).await.unwrap().as_ref(), data); store.shutdown().await.unwrap(); }

#[tokio::test] async fn root_policy_mutable_memory_key_and_wire() { let (data, root, wire) = root_policy_fixture(); let store = crate::store::mem::MemStore::new(); let added = store.add_bytes(data.clone()).await.unwrap(); assert_eq!(added.hash, root); assert_eq!(store.list().hashes().await.unwrap(), [root]); assert_eq!(root, crate::Hash::new(&data)); assert_eq!( store .export_bao(added.hash, ranges(0, 2)) .bao_to_vec() .await .unwrap(), wire ); assert_eq!(store.get_bytes(added.hash).await.unwrap().as_ref(), data); store.shutdown().await.unwrap(); }

#[cfg(feature = "fs-store")] #[tokio::test] async fn root_policy_tiny_and_streamed_fs_import_agree() { use crate::store::fs::{options::Options, FsStore};

let (data, root, wire) = root_policy_fixture();
let mut keys = Vec::new();
for (max_data_inlined, inlined) in [(32768, true), (4096, false)] {
    let dir = tempfile::tempdir().unwrap();
    let mut options = Options::new(dir.path());
    options.inline.max_data_inlined = max_data_inlined;
    options.inline.max_outboard_inlined = 16384;
    assert_eq!(options.is_inlined_all(8192), inlined);
    let store = FsStore::load_with_opts(dir.path().join("blobs.db"), options)
        .await
        .unwrap();
    let added = store.add_bytes(data.clone()).await.unwrap();
    keys.push(added.hash);
    assert_eq!(added.hash, root);
    assert_eq!(store.get_bytes(added.hash).await.unwrap().as_ref(), data);
    assert_eq!(
        store
            .export_bao(added.hash, ranges(0, 2))
            .bao_to_vec()
            .await
            .unwrap(),
        wire
    );
    store.shutdown().await.unwrap();
}
assert_eq!(keys, [root, root]);
assert_eq!(root, crate::Hash::new(&data));

}

#[tokio::test] async fn literal_parent_write() { let mut bytes = Vec::new(); scripted(literal_items()) .await .write(&mut bytes) .await .unwrap(); assert_eq!(bytes, literal_wire()); }

#[tokio::test] async fn literal_parent_progress() { let mut sink = Sink::default(); let mut progress = Progress::default(); scripted(literal_items()) .await .write_with_progress(&mut sink, &mut progress, &identity(), INDEX) .await .unwrap(); assert_eq!(sink.bytes, literal_wire()); assert_eq!(progress.starts, [(INDEX, identity(), 100)]); assert_eq!(progress.overhead, 72); assert_eq!(progress.payloads, [(INDEX, OFFSET, PAYLOAD.len())]); }

#[tokio::test] async fn literal_parent_byte_stream() { let chunks = chunks(scripted(literal_items()).await).await; assert_eq!( chunks.iter().map(Vec::len).collect::<Vec<_>>(), [8, 64, PAYLOAD.len()] ); assert_eq!(chunks.concat(), literal_wire()); }

#[tokio::test] async fn readonly_store_right_block() { let (data, root, expected) = right_fixture(); let (block, count) = geometry(); assert_eq!(expected.len(), 8 + 2 * hemera::OUTPUT_BYTES + block); // Optional evidence output is only enabled by the isolated audit command. if let Some(dir) = std::env::var_os("RADIO_EXPORT_PAIRS_FIXTURE_DIR") { let dir = std::path::PathBuf::from(dir); std::fs::write(dir.join("right-proof.bin"), &expected).unwrap(); std::fs::write(dir.join("right-root.txt"), root.to_string()).unwrap(); } let store = ReadonlyMemStore::new([&data]); let query = ranges(count, 2 * count); let mut written = Vec::new(); store .export_bao(root, query.clone()) .write(&mut written) .await .unwrap(); assert_eq!(written, expected); let mut sink = Sink::default(); let mut progress = Progress::default(); store .export_bao(root, query.clone()) .write_with_progress(&mut sink, &mut progress, &root.into(), INDEX) .await .unwrap(); assert_eq!(sink.bytes, expected); assert_eq!(progress.starts, [(INDEX, root.into(), data.len() as u64)]); assert_eq!(progress.overhead, 72); assert_eq!(progress.payloads, [(INDEX, block as u64, block)]); let chunks = chunks(store.export_bao(root, query.clone())).await; assert_eq!( chunks.iter().map(Vec::len).collect::<Vec<_>>(), [8, 64, block] ); assert_eq!(chunks.concat(), expected); let decoded = decode_slice(&Poseidon2Backend, &written, &root, &query, IROH_BLOCK_SIZE).unwrap(); assert_eq!(decoded, [(block as u64, data[block..].to_vec())]); store.shutdown().await.unwrap(); }

#[tokio::test] async fn readonly_store_parent_free() { geometry(); let data = body(CHUNK_SIZE); let root = hemera::tree::chunk_cv(&data, 0, true); let mut expected = (CHUNK_SIZE as u64).to_le_bytes().to_vec(); expected.extend_from_slice(&data); let store = ReadonlyMemStore::new([&data]); let mut written = Vec::new(); store .export_bao(root, ranges(0, 1)) .write(&mut written) .await .unwrap(); assert_eq!(written, expected); let mut sink = Sink::default(); let mut progress = Progress::default(); store .export_bao(root, ranges(0, 1)) .write_with_progress(&mut sink, &mut progress, &root.into(), INDEX) .await .unwrap(); assert_eq!(sink.bytes, expected); assert_eq!(progress.overhead, 8); assert_eq!(progress.payloads, [(INDEX, 0, CHUNK_SIZE)]); let chunks = chunks(store.export_bao(root, ranges(0, 1))).await; assert_eq!( chunks.iter().map(Vec::len).collect::<Vec<_>>(), [8, CHUNK_SIZE] ); assert_eq!(chunks.concat(), expected); store.shutdown().await.unwrap(); }

fn check_inner(error: ExportBaoError, kind: io::ErrorKind, detail: &str) { let ExportBaoError::ExportBaoInner { source: EncodeError::Io(source), .. } = error else { panic!("expected encoded I/O error: {error:?}"); }; assert_eq!(source.kind(), kind); assert_eq!(source.to_string(), detail); }

fn check_sink(error: ExportBaoError) { let ExportBaoError::ExportBaoIo { source, .. } = error else { panic!("expected sink I/O error: {error:?}"); }; assert_eq!(source.kind(), io::ErrorKind::BrokenPipe); assert_eq!(source.to_string(), "pair sink failure"); }

fn error_items() -> Vec { let mut items = literal_items(); items.truncate(2); items.push(EncodedItem::Error(EncodeError::Io(io::Error::new( io::ErrorKind::InvalidData, "encoded sentinel", )))); items }

#[tokio::test] async fn encoded_error_propagates() { let mut bytes = Vec::new(); check_inner( scripted(error_items()) .await .write(&mut bytes) .await .unwrap_err(), io::ErrorKind::InvalidData, "encoded sentinel", ); assert_eq!(bytes, literal_wire()[..72]); let mut sink = Sink::default(); let mut progress = Progress::default(); check_inner( scripted(error_items()) .await .write_with_progress(&mut sink, &mut progress, &identity(), INDEX) .await .unwrap_err(), io::ErrorKind::InvalidData, "encoded sentinel", ); assert_eq!(sink.bytes, bytes); assert_eq!(progress.overhead, 72); assert!(progress.payloads.is_empty()); let mut stream = scripted(error_items()).await.into_byte_stream(); let mut prefix = Vec::new(); for _ in 0..2 { prefix.extend_from_slice(&stream.next().await.unwrap().unwrap()); } let Error::Io(source) = stream.next().await.unwrap().unwrap_err(); assert_eq!(prefix, bytes); assert_eq!(source.kind(), io::ErrorKind::InvalidData); assert_eq!(source.to_string(), "encoded sentinel"); assert!(stream.next().await.is_none()); }

#[tokio::test] async fn readonly_store_missing() { let store = ReadonlyMemStore::new([b"present"]); let detail = "export task ended unexpectedly"; let mut bytes = Vec::new(); check_inner( store .export_bao(identity(), ranges(0, 1)) .write(&mut bytes) .await .unwrap_err(), io::ErrorKind::UnexpectedEof, detail, ); assert!(bytes.is_empty()); let mut sink = Sink::default(); let mut progress = Progress::default(); check_inner( store .export_bao(identity(), ranges(0, 1)) .write_with_progress(&mut sink, &mut progress, &identity(), INDEX) .await .unwrap_err(), io::ErrorKind::UnexpectedEof, detail, ); assert!(sink.bytes.is_empty()); assert!(progress.starts.is_empty()); assert_eq!(progress.overhead, 0); assert!(progress.payloads.is_empty()); let mut stream = store .export_bao(identity(), ranges(0, 1)) .into_byte_stream(); let Error::Io(source) = stream.next().await.unwrap().unwrap_err(); assert_eq!(source.kind(), io::ErrorKind::UnexpectedEof); assert_eq!(source.to_string(), detail); assert!(stream.next().await.is_none()); store.shutdown().await.unwrap(); }

#[tokio::test] async fn writer_failure_accounting() { for (call, overhead) in [(0, 0), (1, 8), (2, 72)] { let mut sink = Sink { fail_call: Some(call), ..Sink::default() }; check_sink( scripted(literal_items()) .await .write(&mut sink) .await .unwrap_err(), ); assert_eq!(sink.calls, call + 1); assert_eq!(sink.bytes, literal_wire()[..overhead]); let mut sink = Sink { fail_call: Some(call), ..Sink::default() }; let mut progress = Progress::default(); check_sink( scripted(literal_items()) .await .write_with_progress(&mut sink, &mut progress, &identity(), INDEX) .await .unwrap_err(), ); assert_eq!(sink.calls, call + 1); assert_eq!(sink.bytes, literal_wire()[..overhead]); assert_eq!(progress.overhead, overhead); assert_eq!(progress.starts, [(INDEX, identity(), 100)]); assert!(progress.payloads.is_empty()); } }

#[tokio::test] async fn partial_parent_failure() { for use_progress in [false, true] { let mut sink = Sink { fail_call: Some(1), partial: 17, ..Sink::default() }; let mut progress = Progress::default(); let export = scripted(literal_items()).await; let error = if use_progress { export .write_with_progress(&mut sink, &mut progress, &identity(), INDEX) .await .unwrap_err() } else { export.write(&mut sink).await.unwrap_err() }; check_sink(error); assert_eq!(sink.bytes, literal_wire()[..25]); assert_eq!(sink.calls, 2); assert_eq!(progress.overhead, if use_progress { 8 } else { 0 }); assert!(progress.payloads.is_empty()); } }

#[tokio::test] async fn payload_progress_failure() { let mut items = literal_items(); items.pop(); items.extend(literal_items().into_iter().skip(2)); let mut sink = Sink::default(); let mut progress = Progress { reject_payload: true, ..Progress::default() }; let error = scripted(items) .await .write_with_progress(&mut sink, &mut progress, &identity(), INDEX) .await .unwrap_err(); assert!(matches!( error, ExportBaoError::ClientError { source: ProgressError::Permission { .. }, .. } )); assert_eq!(sink.bytes, literal_wire()); assert_eq!(sink.calls, 3); assert_eq!(progress.overhead, 72); assert_eq!(progress.payloads, [(INDEX, OFFSET, PAYLOAD.len())]); }

===== 061 END =====

===== 062 BEGIN Radio .config/nextest.toml | 594 bytes | SHA256 ef588b7e34ddd981c24a523ba359ec76a616a45b40f3f3f525692ae809aea590 ===== [test-groups] run-in-isolation = { max-threads = 32 }

these are tests that must not run with other tests concurrently. All tests in

this group can take up at most 32 threads among them, but each one requiring

16 threads also. The effect should be that tests run isolated.

profile.ci.overrides filter = 'test(::run_in_isolation::)' test-group = 'run-in-isolation' threads-required = 32

profile.default.overrides filter = 'test(::run_in_isolation::)' test-group = 'run-in-isolation' threads-required = 32

[profile.default] slow-timeout = { period = "10s", terminate-after = 3 }

===== 062 END =====

===== 063 BEGIN Radio Makefile.toml | 662 bytes | SHA256 0f1e457aa4bb7c6e4674d2dfbd847b58344319a1242625c2f055241ebd048d8d =====

Use cargo-make to run tasks here: https://crates.io/crates/cargo-make

[tasks.format] workspace = false command = "cargo" args = [ "fmt", "--all", "--", "--config", "unstable_features=true", "--config", "imports_granularity=Crate,group_imports=StdExternalCrate,reorder_imports=true,format_code_in_doc_comments=true", ]

[tasks.format-check] workspace = false command = "cargo" args = [ "fmt", "--all", "--check", "--", "--config", "unstable_features=true", "--config", "imports_granularity=Crate,group_imports=StdExternalCrate,reorder_imports=true,format_code_in_doc_comments=true", ]

===== 063 END =====

===== 064 BEGIN Radio .github/workflows/ci.yml | 11846 bytes | SHA256 ded5a95996283b54293810ab4938dadc1d589fab73be85397ad9c3435b203208 ===== name: CI

on: pull_request: types: ["labeled", "unlabeled", "opened", "synchronize", "reopened"] merge_group: push: branches: - main

concurrency: group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true

env: RUST_BACKTRACE: 1 RUSTFLAGS: -Dwarnings RUSTDOCFLAGS: -Dwarnings MSRV: "1.89" SCCACHE_CACHE_SIZE: "10G" IROH_FORCE_STAGING_RELAYS: "1"

jobs: tests: name: CI Test Suite if: "github.event_name != 'pull_request' || ! contains(github.event.pull_request.labels.*.name, 'flaky-test')" uses: "./.github/workflows/tests.yaml"

cross_build: name: Cross Build Only if: "github.event_name != 'pull_request' || ! contains(github.event.pull_request.labels.*.name, 'flaky-test')" timeout-minutes: 30 runs-on: [self-hosted, linux, X64] strategy: fail-fast: false matrix: target: # cross tests are currently broken vor armv7 and aarch64 # see https://github.com/cross-rs/cross/issues/1311 # - armv7-linux-androideabi # - aarch64-linux-android # Freebsd execution fails in cross # - i686-unknown-freebsd # Linking fails :/ - x86_64-unknown-freebsd # Netbsd execution fails to link in cross # - x86_64-unknown-netbsd steps: - name: Checkout uses: actions/checkout@v6 with: submodules: recursive

  - name: Install rust stable
    uses: dtolnay/rust-toolchain@stable

  - name: Cleanup Docker
    continue-on-error: true
    run: |
      docker kill $(docker ps -q)

    # See https://github.com/cross-rs/cross/issues/1222
  - name: Cache cross
    id: cache-cross
    uses: actions/cache@v5
    with:
      path: ~/.cargo/bin/cross
      key: cross-${{ runner.os }}-${{ runner.arch }}

  - name: Install cross
    if: steps.cache-cross.outputs.cache-hit != 'true'
    uses: taiki-e/install-action@cross

  - name: build
    # cross tests are currently broken vor armv7 and aarch64
    # see https://github.com/cross-rs/cross/issues/1311.  So on
    # those platforms we only build but do not run tests.
    run: cross build --all --target ${{ matrix.target }}
    env:
      RUST_LOG: ${{ runner.debug && 'TRACE' || 'DEBUG'}}
      CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER: cc

android_build: name: Android Build Only if: "github.event_name != 'pull_request' || ! contains(github.event.pull_request.labels.*.name, 'flaky-test')" timeout-minutes: 30 # runs-on: ubuntu-latest runs-on: [self-hosted, linux, X64] strategy: fail-fast: false matrix: target: - aarch64-linux-android - armv7-linux-androideabi steps: - name: Checkout uses: actions/checkout@v6

  - name: Set up Rust
    uses: dtolnay/rust-toolchain@stable
    with:
      target: ${{ matrix.target }}
  - name: Install rustup target
    run: rustup target add ${{ matrix.target }}

  - name: Setup Java
    uses: actions/setup-java@v5
    with:
      distribution: "temurin"
      java-version: "17"

  - name: Setup Android SDK
    uses: android-actions/setup-android@v3

  - name: Setup Android NDK
    uses: arqu/setup-ndk@main
    id: setup-ndk
    with:
      ndk-version: r23
      add-to-path: true

  - name: Build
    env:
      ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
    run: |
      cargo install --version 3.5.4 cargo-ndk
      cargo ndk --target ${{ matrix.target }} build

cross_test: name: Cross Test if: "github.event_name != 'pull_request' || ! contains(github.event.pull_request.labels.*.name, 'flaky-test')" timeout-minutes: 30 runs-on: [self-hosted, linux, X64] strategy: fail-fast: false matrix: target: - i686-unknown-linux-gnu steps: - name: Checkout uses: actions/checkout@v6 with: submodules: recursive

  - name: Install rust stable
    uses: dtolnay/rust-toolchain@stable

  - name: Cleanup Docker
    continue-on-error: true
    run: |
      docker kill $(docker ps -q)

    # See https://github.com/cross-rs/cross/issues/1222
  - name: Cache cross
    id: cache-cross
    uses: actions/cache@v5
    with:
      path: ~/.cargo/bin/cross
      key: cross-${{ runner.os }}-${{ runner.arch }}

  - name: Install cross
    if: steps.cache-cross.outputs.cache-hit != 'true'
    uses: taiki-e/install-action@cross

  - name: test
    run: cross test --all --target ${{ matrix.target }} -- --test-threads=12
    env:
      RUST_LOG: ${{ runner.debug && 'TRACE' || 'DEBUG' }}
      CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER: cc

wasm_test: name: Build & test wasm32 for browsers runs-on: ubuntu-latest env: RUSTFLAGS: '--cfg getrandom_backend="wasm_js"' steps: - name: Checkout sources uses: actions/checkout@v6

  - name: Setup node.js version 22.5 # needed for browser-like websocket API support in node.js
    uses: actions/setup-node@v6
    with:
      node-version: 22.5

  - name: Install stable toolchain
    uses: dtolnay/rust-toolchain@stable

  - name: Add wasm target
    run: rustup target add wasm32-unknown-unknown

  - name: Install cargo-binstall
    uses: cargo-bins/cargo-binstall@v1.16.5

  - name: Install wasm-bindgen-test-runner
    run: cargo binstall wasm-bindgen-cli --locked --no-confirm

  - name: Install wasm-tools
    uses: bytecodealliance/actions/wasm-tools/setup@v1

  - name: wasm32 build (iroh-base)
    run: cargo build --target wasm32-unknown-unknown -p iroh-base --all-features

  - name: wasm32 build (iroh-relay)
    run: cargo build --target wasm32-unknown-unknown -p iroh-relay --no-default-features

  - name: wasm32 build (iroh)
    run: cargo build --target wasm32-unknown-unknown -p iroh --no-default-features

  # If the Wasm file contains any 'import "env"' declarations, then
  # some non-Wasm-compatible code made it into the final code.
  - name: Ensure no 'import "env"' in iroh-relay Wasm
    run: |
      ! wasm-tools print --skeleton target/wasm32-unknown-unknown/debug/iroh_relay.wasm | grep 'import "env"'

  - name: Ensure no 'import "env"' in iroh Wasm
    run: |
      ! wasm-tools print --skeleton target/wasm32-unknown-unknown/debug/iroh.wasm | grep 'import "env"'

  - name: Run integration test in wasm
    run: cargo test -p iroh --test integration --target=wasm32-unknown-unknown --no-default-features

check_semver: runs-on: ubuntu-latest env: RUSTC_WRAPPER: "sccache" SCCACHE_GHA_ENABLED: "on" steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Install sccache uses: mozilla-actions/sccache-action@v0.0.9

  - name: Setup Environment (PR)
    if: ${{ github.event_name == 'pull_request' }}
    shell: bash
    run: |
      echo "HEAD_COMMIT_SHA=$(git rev-parse origin/${{ github.base_ref }})" >> ${GITHUB_ENV}
  - name: Setup Environment (Push)
    if: ${{ github.event_name == 'push' || github.event_name == 'merge_group' }}
    shell: bash
    run: |
      echo "HEAD_COMMIT_SHA=$(git rev-parse origin/main)" >> ${GITHUB_ENV}
  - name: Check semver
    # uses: obi1kenobi/cargo-semver-checks-action@v2
    uses: n0-computer/cargo-semver-checks-action@feat-baseline
    with:
      package: iroh, iroh-base, iroh-dns-server, iroh-bench, iroh-relay, iroh-net-report
      baseline-rev: ${{ env.HEAD_COMMIT_SHA }}
      use-cache: false

check_fmt: timeout-minutes: 30 name: Checking fmt runs-on: ubuntu-latest env: RUSTC_WRAPPER: "sccache" SCCACHE_GHA_ENABLED: "on" steps: - uses: actions/checkout@v6 - uses: dtolnay/rust-toolchain@stable with: components: rustfmt - uses: mozilla-actions/sccache-action@v0.0.9 - uses: taiki-e/install-action@cargo-make - run: cargo make format-check

check_docs: timeout-minutes: 30 name: Checking docs runs-on: ubuntu-latest env: RUSTC_WRAPPER: "sccache" SCCACHE_GHA_ENABLED: "on" RUSTDOCFLAGS: --cfg docsrs steps: - uses: actions/checkout@v6 - uses: dtolnay/rust-toolchain@master with: toolchain: nightly-2025-10-09 - name: Install sccache uses: mozilla-actions/sccache-action@v0.0.9

  - name: Docs
    run: cargo doc --workspace --all-features --no-deps --document-private-items

clippy_check: timeout-minutes: 30 runs-on: ubuntu-latest env: RUSTC_WRAPPER: "sccache" SCCACHE_GHA_ENABLED: "on" steps: - uses: actions/checkout@v6 - uses: dtolnay/rust-toolchain@stable with: components: clippy - name: Install sccache uses: mozilla-actions/sccache-action@v0.0.9

  # TODO: We have a bunch of platform-dependent code so should
  #    probably run this job on the full platform matrix
  - name: clippy check (all features)
    run: cargo clippy --workspace --all-features --all-targets --lib --bins --tests --benches --examples

  - name: clippy check (no features)
    run: cargo clippy --workspace --no-default-features --all-targets --lib --bins --tests --benches --examples

  - name: clippy check (default features)
    run: cargo clippy --workspace --all-targets --lib --bins --tests --benches --examples

msrv: if: "github.event_name != 'pull_request' || ! contains(github.event.pull_request.labels.*.name, 'flaky-test')" timeout-minutes: 30 name: Minimal Supported Rust Version runs-on: ubuntu-latest env: RUSTC_WRAPPER: "sccache" SCCACHE_GHA_ENABLED: "on" steps: - uses: actions/checkout@v6 - uses: dtolnay/rust-toolchain@master with: toolchain: ${{ env.MSRV }} - name: Install sccache uses: mozilla-actions/sccache-action@v0.0.9

  - name: Check MSRV all features
    run: |
      cargo +$MSRV check --workspace --all-targets

cargo_deny: timeout-minutes: 30 name: cargo deny runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: EmbarkStudios/cargo-deny-action@v2 with: arguments: --workspace --all-features command: check command-arguments: "-Dwarnings"

netsim-integration-tests: permissions: write-all if: "github.event_name != 'pull_request' || ! contains(github.event.pull_request.labels.*.name, 'flaky-test')" uses: "./.github/workflows/netsim_runner.yaml" secrets: inherit with: branch: ${{ github.ref }} max_workers: 6 netsim_branch: "main" sim_paths: ${{ github.event_name == 'pull_request' && 'sims/integration' || 'sims/iroh/iroh.json,sims/integration' }} pr_number: ${{ github.event.pull_request.number || '' }} filter: ${{ github.event_name == 'pull_request' && 'skip:intg_iroh_full__1_to_3,intg_iroh_full__1_to_1x3,intg_iroh_relay_only__1_to_3' || '' }}

codespell: timeout-minutes: 30 runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Cache pip uses: actions/cache@v5 with: path: ~/.cache/pip key: pip-codespell-2.4.1 - run: pip install --user codespell[toml]==2.4.1 - run: codespell --ignore-words-list=ans,atmost,crate,inout,ratatui,ser,stayin,swarmin,worl,keep-alives --skip=CHANGELOG.md

===== 064 END =====

===== 065 BEGIN Radio .github/workflows/tests.yaml | 10418 bytes | SHA256 749952dae052754d58ca44b060dac25431a507f5ddf9e854e2c54a91084b5a6b =====

Run all tests, with or without flaky tests.

name: Tests

on: workflow_call: inputs: rust-version: description: "The version of the rust compiler to run" type: string default: "stable" flaky: description: "Whether to also run flaky tests" type: boolean default: false git-ref: description: "Which git ref to checkout" type: string default: ${{ github.ref }}

env: RUST_BACKTRACE: 1 RUSTFLAGS: -Dwarnings RUSTDOCFLAGS: -Dwarnings SCCACHE_CACHE_SIZE: "10G" CRATES_LIST: "iroh,iroh-bench,iroh-dns-server,iroh-relay" IROH_FORCE_STAGING_RELAYS: "1" NEXTEST_VERSION: "0.9.80"

jobs: build_and_test_nix: timeout-minutes: 30 name: "Tests" runs-on: ${{ matrix.runner }} strategy: fail-fast: false matrix: name: [ubuntu-latest, macOS-arm-latest] rust: ["${{ inputs.rust-version }}"] features: [all, none, default] include: - name: ubuntu-latest os: ubuntu-latest release-os: linux release-arch: amd64 runner: [self-hosted, linux, X64] - name: macOS-arm-latest os: macOS-latest release-os: darwin release-arch: aarch64 runner: [self-hosted, macOS, ARM64] env: # Using self-hosted runners so use local cache for sccache and # not SCCACHE_GHA_ENABLED. RUSTC_WRAPPER: "sccache" steps: - name: Checkout uses: actions/checkout@v6 with: ref: ${{ inputs.git-ref }}

  - name: Install ${{ matrix.rust }} rust
    uses: dtolnay/rust-toolchain@master
    with:
      toolchain: ${{ matrix.rust }}

  - name: Install cargo-nextest
    uses: taiki-e/install-action@v2
    with:
      tool: nextest@${{ env.NEXTEST_VERSION }}

  - name: Install sccache
    uses: mozilla-actions/sccache-action@v0.0.9

  - name: Select features
    run: |
      case "${{ matrix.features }}" in
          all)
              echo "FEATURES=--all-features" >> "$GITHUB_ENV"
              ;;
          none)
              echo "FEATURES=--no-default-features" >> "$GITHUB_ENV"
              ;;
          default)
              echo "FEATURES=" >> "$GITHUB_ENV"
              ;;
          *)
              exit 1
      esac

  - name: check features
    if: ${{ ! inputs.flaky }}
    run: |
      for i in ${CRATES_LIST//,/ }
      do
        echo "Checking $i $FEATURES"
        targets="--lib --bins"
        echo cargo check -p $i $FEATURES $targets
        cargo check -p $i $FEATURES $targets
      done
    env:
      RUST_LOG: ${{ runner.debug && 'TRACE' || 'DEBUG'}}

  - name: build tests
    run: |
      cargo nextest run --workspace ${{ env.FEATURES }} --lib --bins --tests --no-run

  - name: list ignored tests
    run: |
      cargo nextest list --workspace ${{ env.FEATURES }} --lib --bins --tests --run-ignored ignored-only

  - name: run tests
    run: |
      mkdir -p output
      cargo nextest run --workspace ${{ env.FEATURES }} --lib --bins --tests --profile ci --run-ignored ${{ inputs.flaky && 'all' || 'default' }} ${{ inputs.flaky && '--verbose' || '' }} --no-fail-fast --message-format ${{ inputs.flaky && 'libtest-json' || 'human' }} > output/${{ matrix.name }}_${{ matrix.features }}_${{ matrix.rust }}.json
    env:
      RUST_LOG: ${{ runner.debug && 'TRACE' || 'DEBUG'}}
      NEXTEST_EXPERIMENTAL_LIBTEST_JSON: 1

  - name: upload results
    if: ${{ failure() && inputs.flaky }}
    uses: actions/upload-artifact@v6
    with:
      name: libtest_run_${{ github.run_number }}-${{ github.run_attempt }}-${{ matrix.name }}_${{ matrix.features }}_${{ matrix.rust }}.json
      path: output
      retention-days: 45
      compression-level: 0

  - name: doctests
    if: ${{ (! inputs.flaky) &&  matrix.features == 'all' }}
    env:
      RUST_LOG: ${{ runner.debug && 'TRACE' || 'DEBUG'}}
    run: |
      cargo test --workspace --all-features --doc

  # We can not check the doctest features by only compiling them,
  # so are forced to run them once more.
  - name: Check doctest features
    if: ${{ ! inputs.flaky }}
    env:
      RUST_LOG: ${{ runner.debug && 'TRACE' || 'DEBUG'}}
    run: |
      for i in ${CRATES_LIST//,/ }
      do
        echo "Checking $i doctest $FEATURES"
        echo cargo test -p $i --doc $FEATURES
        cargo test -p $i --doc $FEATURES
      done

build_and_test_windows: timeout-minutes: 30 name: "Tests" runs-on: ${{ matrix.runner }} strategy: fail-fast: false matrix: name: [windows-latest] rust: ["${{ inputs.rust-version}}"] features: [all, none, default] target: - x86_64-pc-windows-msvc include: - name: windows-latest os: windows runner: [self-hosted, windows, x64] env: # Using self-hosted runners so use local cache for sccache and # not SCCACHE_GHA_ENABLED. RUSTC_WRAPPER: "sccache" steps: - name: Checkout uses: actions/checkout@v6 with: ref: ${{ inputs.git-ref }}

  - name: Install ${{ matrix.rust }}
    run: |
      rustup toolchain install ${{ matrix.rust }}
      rustup toolchain default ${{ matrix.rust }}
      rustup target add ${{ matrix.target }}
      rustup set default-host ${{ matrix.target }}

  - name: Cache cargo-nextest
    id: cache-nextest
    uses: actions/cache@v5
    with:
      path: ~/.cargo/bin/cargo-nextest.exe
      key: nextest-windows-${{ env.NEXTEST_VERSION }}

  - name: Install cargo-nextest
    if: steps.cache-nextest.outputs.cache-hit != 'true'
    shell: powershell
    run: |
      $tmp = New-TemporaryFile | Rename-Item -NewName { $_ -replace 'tmp$', 'zip' } -PassThru
      Invoke-WebRequest -OutFile $tmp https://get.nexte.st/${{ env.NEXTEST_VERSION }}/windows
      $outputDir = if ($Env:CARGO_HOME) { Join-Path $Env:CARGO_HOME "bin" } else { "~/.cargo/bin" }
      $tmp | Expand-Archive -DestinationPath $outputDir -Force
      $tmp | Remove-Item

  - name: Select features
    run: |
      switch ("${{ matrix.features }}") {
          "all" {
              echo "FEATURES=--all-features" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
          }
          "none" {
              echo "FEATURES=--no-default-features" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
          }
          "default" {
              echo "FEATURES=" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
          }
          default {
              Exit 1
          }
      }

  - name: Install sccache
    uses: mozilla-actions/sccache-action@v0.0.9

  - uses: msys2/setup-msys2@v2
    with:
      release: false

  - name: build tests
    run: |
      cargo nextest run --workspace ${{ env.FEATURES }} --lib --bins --tests --target ${{ matrix.target }} --no-run

  - name: list ignored tests
    run: |
      cargo nextest list --workspace ${{ env.FEATURES }} --lib --bins --tests --target ${{ matrix.target }} --run-ignored ignored-only

  - name: tests
    run: |
      mkdir -p output
      cargo nextest run --workspace ${{ env.FEATURES }} --lib --bins --tests --profile ci --target ${{ matrix.target }} --run-ignored ${{ inputs.flaky && 'all' || 'default' }} --no-fail-fast --message-format ${{ inputs.flaky && 'libtest-json' || 'human' }} > output/${{ matrix.name }}_${{ matrix.features }}_${{ matrix.rust }}.json
    env:
      RUST_LOG: ${{ runner.debug && 'TRACE' || 'DEBUG'}}
      NEXTEST_EXPERIMENTAL_LIBTEST_JSON: 1

  - name: upload results
    if: ${{ failure() && inputs.flaky }}
    uses: actions/upload-artifact@v6
    with:
      name: libtest_run_${{ github.run_number }}-${{ github.run_attempt }}-${{ matrix.name }}_${{ matrix.features }}_${{ matrix.rust }}.json
      path: output
      retention-days: 1
      compression-level: 0

minimal-crates: runs-on: ${{ matrix.runner }} strategy: fail-fast: false matrix: name: [ubuntu-latest, macOS-arm-latest] # TODO: windows include: - name: ubuntu-latest os: ubuntu-latest release-os: linux release-arch: amd64 runner: [self-hosted, linux, X64] - name: macOS-arm-latest os: macOS-latest release-os: darwin release-arch: aarch64 runner: [self-hosted, macOS, ARM64] steps: - uses: actions/checkout@v6 - uses: dtolnay/rust-toolchain@nightly - name: cargo check run: | rm -f Cargo.lock cargo +nightly check -Z minimal-versions --workspace --all-features --lib --bins

minimal-crates-windows: timeout-minutes: 30 name: "Minimal Crates (Windows)" runs-on: ${{ matrix.runner }} strategy: fail-fast: false matrix: name: [windows-latest] rust: ["${{ inputs.rust-version}}"] target: - x86_64-pc-windows-msvc include: - name: windows-latest os: windows runner: [self-hosted, windows, x64] env: # Using self-hosted runners so use local cache for sccache and # not SCCACHE_GHA_ENABLED. RUSTC_WRAPPER: "sccache" steps: - name: Checkout uses: actions/checkout@v6 with: ref: ${{ inputs.git-ref }}

  - name: Install Rust nightly
    run: |
      rustup toolchain install nightly
      rustup target add ${{ matrix.target }}
      rustup set default-host ${{ matrix.target }}

  - name: Install sccache
    uses: mozilla-actions/sccache-action@v0.0.9

  - uses: msys2/setup-msys2@v2
    with:
      release: false

  - name: cargo check
    run: |
      rm -Force Cargo.lock
      cargo +nightly check -Z minimal-versions --workspace --all-features --lib --bins

===== 065 END =====

===== 066 BEGIN Kadek kadek-ifac/src/provenance/anchor.rs | 6443 bytes | SHA256 93ef654721a60df46d6bd716dfca483f30ac4c3e696d4c061d346bfab1b4188d ===== use super::{Particle, VerifiedBody}; use crate::{Error, ErrorKind, Result, WorkBudget, WorkLimits}; use core::fmt; use cyber_bao::{group::GroupHasher, Poseidon2Backend, CHUNK_SIZE};

static BACKEND: Poseidon2Backend = Poseidon2Backend; const _: () = assert!(CHUNK_SIZE == 4096);

/// The complete-root semantics carried by a sealed [BaoAnchor]. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum BaoRootProfile { /// Canonical complete-left tree over fixed 4096-byte chunks, absolute chunk /// counters from zero, and a final short chunk. ROOT applies only to the /// final parent or sole leaf; empty input is one empty ROOT leaf. /// /// Parameters and domains are Hemera d5f0a095's /// tree, /// capacity /// and parameters, /// using the concrete kernels accepted at that revision. A semantic change /// requires a new profile identity; retaining V1 preserves outputs, domains /// and geometry. This is neither CDC nor the plain particle hash. Historical /// grouped values missing ROOT are not V1 roots. Proof grouping and wire /// validation remain separate from this complete-file identity. HemeraFixed4096V1, }

/// In-process association derived exclusively from one verified complete body. /// The particle and tree root each identify the same immutable bytes, using /// their separately pinned algorithms. Neither digest substitutes for the other. /// /// Only successful [BaoAnchorJob] completion creates this fixed value. It /// retains no body allocation and is useful for warm-cache reuse. Authenticating /// an unseen particle's first partial download or restoring a saved mapping /// requires an independently authenticated association or complete-body /// reverification. This capability alone admits no byte range or packet. #[doc = include_str!("anchor/seals.md")] #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct BaoAnchor { particle: Particle, len: u64, root: [u8; 32], }

impl BaoAnchor { pub const fn particle(&self) -> Particle { self.particle }

/// Complete body length in bytes.
pub const fn len(&self) -> u64 {
    self.len
}

pub const fn is_empty(&self) -> bool {
    self.len == 0
}

pub const fn root(&self) -> &[u8; 32] {
    &self.root
}

pub const fn profile(&self) -> BaoRootProfile {
    BaoRootProfile::HemeraFixed4096V1
}

}

/// Borrowed, single-shot complete-body anchor derivation with persistent work. /// One unit is one leaf kernel over at most 4096 bytes or one two-child parent /// kernel. For N=max(1,ceil(len/4096)), the exact total is 2*N-1. These units do /// not measure CPU time and differ from [crate::BodyVerifier]'s absorb units. /// /// Construction preflights the total before hashing. Scalar checks and the /// reducer's fixed 53-slot initialization are bounded setup. No allocation, /// additional body owner or pool reservation is needed. Dropping an unfinished /// job abandons derivation. Drop the job before releasing its borrowed body; /// a completed anchor has no lifetime or retained owner. pub struct BaoAnchorJob<'a> { particle: Particle, len: u64, reducer: GroupHasher<'a, Poseidon2Backend>, work: WorkBudget, }

impl<'a> BaoAnchorJob<'a> { /// Borrow exactly the verified owner's immutable complete storage. /// Insufficient total work or unrepresentable length/geometry returns /// LimitExceeded with process bao.anchor and no fabricated byte offset. pub fn new(body: &'a VerifiedBody, limits: WorkLimits) -> Result { let len = u64::try_from(body.body.len()) .map_err(|| limit_error("BAO anchor body length does not fit file coordinates"))?; if kernel_count(len)? > limits.max_total() { return Err(limit_error("BAO anchor work limit")); } let reducer = GroupHasher::new(&BACKEND, &body.body, 0, true) .map_err(|| limit_error("BAO anchor geometry"))?; Ok(Self { particle: body.particle, len, reducer, work: WorkBudget::new(limits), }) }

/// Yield WouldBlock while pending, emit one anchor, then return None on
/// every later poll without work. Intermediate tree hashes are not EOF.
/// Each kernel is charged before execution; completion seals the output
/// within that final kernel's unit. Yields preserve all progress and total.
/// There is no push/flush/reset or reusable request.
pub fn pull(&mut self) -> Result<Option<BaoAnchor>> {
    if self.reducer.is_complete() {
        return Ok(None);
    }
    let mut call = self.work.begin_call();
    loop {
        // Positive limits admit a unit; exact constructor preflight covers
        // every kernel. Thus only call-quota exhaustion can fail here.
        call.charge(1)
            .map_err(|error| error.with_process("bao.anchor"))?;
        if let Some(root) = self.reducer.step() {
            return Ok(Some(BaoAnchor {
                particle: self.particle,
                len: self.len,
                root: *root.as_bytes(),
            }));
        }
    }
}

}

impl fmt::Debug for BaoAnchorJob<'> { fn fmt(&self, f: &mut fmt::Formatter<'>) -> fmt::Result { f.debug_struct("BaoAnchorJob") .field("particle", &self.particle) .field("len", &self.len) .field("reducer", &self.reducer) .field("work", &self.work) .finish() } }

fn kernel_count(len: u64) -> Result { let leaves = (len / CHUNK_SIZE as u64) .checked_add(u64::from(!len.is_multiple_of(CHUNK_SIZE as u64))) .ok_or_else(|| limit_error("BAO anchor work overflow"))? .max(1); leaves .checked_mul(2) .and_then(|n| n.checked_sub(1)) .ok_or_else(|| limit_error("BAO anchor work overflow")) }

fn limit_error(detail: &'static str) -> Error { Error::new(ErrorKind::LimitExceeded, detail).with_process("bao.anchor") }

#[cfg(test)] #[path = "anchor/tests.rs"] mod tests;

===== 066 END =====

===== 067 BEGIN Kadek kadek-ifac/Cargo.toml | 429 bytes | SHA256 8ee668643ce9154222b83817ad1a332db824c846842ac828e87fea3394a51ea6 ===== [package] name = "kadek-ifac" version.workspace = true edition.workspace = true license-file.workspace = true description = "Shared image storage and media codec interfaces — no_std + alloc"

[dependencies] hemera = { package = "cyber-hemera", version = "=0.3.1", default-features = false } cyber-bao = { git = "https://github.com/cyberia-to/radio", rev = "a96d86e28d384cdf656aadc4282c78c0c170c102", default-features = false }

===== 067 END =====

===== 068 BEGIN Hemera rs/src/params.rs | 6597 bytes | SHA256 bf5b2cb5a80697d272546425bddcdf2cb2bfe7e08367ae7c793a0922088f2a91 ===== // --- // tags: hemera, rust // crystal-type: source // crystal-domain: comp // --- //! Hemera — Poseidon2 parameter set over the Goldilocks field. //! //! Single source of truth for every constant in the protocol. //! The WGSL shader (gpu/poseidon2.wgsl) duplicates a subset of //! these values because WGSL cannot import Rust; keep them in sync. //! //! text //! ┌──────────────────────────────────────────────────────────┐ //! │ HEMERA — Complete Specification │ //! │ │ //! │ Field: p = 2⁶⁴ − 2³² + 1 (Goldilocks) │ //! │ Full-round S-box: d = 7 (x → x⁷) │ //! │ Partial S-box: x⁻¹ (field inversion) │ //! │ State width: t = 16 = 2⁴ │ //! │ Full rounds: R_F = 8 (4 + 4) = 2³ │ //! │ Partial rounds: R_P = 16 = 2⁴ │ //! │ Rate: r = 8 elements = 2³ │ //! │ Input rate: 56 bytes/block (7 B/element) = 7 × 2³ │ //! │ Capacity: c = 8 elements (64 bytes) = 2³ │ //! │ Output: 4 elements (32 bytes) = 2² │ //! │ │ //! │ Full round constants: 8 × 16 = 128 = 2⁷ │ //! │ Partial round constants: 16 = 2⁴ │ //! │ Total constants: 144 = 9 × 2⁴ │ //! │ Total rounds: 24 = 3 × 2³ │ //! │ │ //! │ Classical collision resistance: 256 bits = 2⁸ │ //! │ Quantum collision resistance: 170 bits │ //! │ Algebraic degree: 2¹⁰⁴⁶ │ //! │ │ //! │ Every parameter that appears in code is a power of 2. │ //! └──────────────────────────────────────────────────────────┘ //!

use crate::field::Goldilocks;

// ── Permutation parameters ──────────────────────────────────────────

/// Width of the Poseidon2 state (number of Goldilocks field elements). pub const WIDTH: usize = 16;

/// Number of full (external) rounds — 4 initial + 4 final. pub const ROUNDS_F: usize = 8;

/// Number of partial (internal) rounds. pub const ROUNDS_P: usize = 16;

/// Total number of rounds per permutation (R_F + R_P). pub const ROUNDS_TOTAL: usize = ROUNDS_F + ROUNDS_P; // 24

/// Full-round S-box degree (x → x^d). pub const SBOX_DEGREE: usize = 7;

// ── Sponge parameters ───────────────────────────────────────────────

/// Number of rate elements in the sponge. pub const RATE: usize = 8;

/// Number of capacity elements in the sponge. pub const CAPACITY: usize = WIDTH - RATE; // 8

// ── Encoding parameters ─────────────────────────────────────────────

/// Bytes per field element when encoding arbitrary input data. /// /// We use 7 bytes per element because 2^56 − 1 < p (Goldilocks prime), /// so any 7-byte value fits without reduction. pub const INPUT_BYTES_PER_ELEMENT: usize = 7;

/// Bytes per field element when encoding hash output. /// /// For output we use the full canonical u64 representation (8 bytes), /// since output elements are already valid field elements. pub const OUTPUT_BYTES_PER_ELEMENT: usize = 8;

// ── Derived constants ───────────────────────────────────────────────

/// Number of input bytes that fill one rate block (8 elements × 7 bytes). pub const RATE_BYTES: usize = RATE * INPUT_BYTES_PER_ELEMENT; // 56

/// Number of output elements extracted per squeeze (4 elements = 32 bytes). pub const OUTPUT_ELEMENTS: usize = 4;

/// Number of output bytes per squeeze (4 elements × 8 bytes). pub const OUTPUT_BYTES: usize = OUTPUT_ELEMENTS * OUTPUT_BYTES_PER_ELEMENT; // 32

// ── Tree parameters ─────────────────────────────────────────────────

/// Canonical chunk size for content tree construction (4 KB). /// /// Content is split into fixed 4 KB chunks. Each chunk is hashed via /// hash_leaf. The last chunk may be shorter. See spec §4.6.1. pub const CHUNK_SIZE: usize = 4096;

/// Maximum tree depth (sufficient for 2^64 chunks). pub const MAX_TREE_DEPTH: usize = 64;

// ── Security properties (informational) ─────────────────────────────

/// Classical collision resistance in bits. pub const COLLISION_BITS: usize = 256;

// ── Permutation entry point ─────────────────────────────────────────

/// Apply the Poseidon2 permutation in-place. #[inline] pub(crate) fn permute(state: &mut [Goldilocks; WIDTH]) { crate::permutation::permute(state); }

#[cfg(test)] mod tests { use super::*;

#[test]
fn permutation_is_deterministic() {
    let mut s1 = [Goldilocks::ZERO; WIDTH];
    let mut s2 = [Goldilocks::ZERO; WIDTH];
    permute(&mut s1);
    permute(&mut s2);
    assert_eq!(s1, s2);
}

#[test]
fn permutation_changes_state() {
    let mut state = [Goldilocks::ZERO; WIDTH];
    let original = state;
    permute(&mut state);
    assert_ne!(state, original);
}

#[test]
fn different_inputs_different_outputs() {
    let mut s1 = [Goldilocks::ZERO; WIDTH];
    let mut s2 = [Goldilocks::ZERO; WIDTH];
    s2[0] = Goldilocks::new(1);
    permute(&mut s1);
    permute(&mut s2);
    assert_ne!(s1, s2);
}

#[test]
fn sponge_geometry() {
    assert_eq!(WIDTH, RATE + CAPACITY);
    assert_eq!(RATE_BYTES, 56);
    assert_eq!(OUTPUT_BYTES, 32);
    assert_eq!(OUTPUT_ELEMENTS, 4);
}

}

===== 068 END =====

===== 069 BEGIN Hemera rs/src/field.rs | 12041 bytes | SHA256 7a9da58f2daa65d946574753d819e4c0d39d80d61fd519ad42e38d038aebd09a ===== // --- // tags: hemera, rust // crystal-type: source // crystal-domain: comp // --- //! Goldilocks prime field (p = 2^64 - 2^32 + 1). //! //! Minimal implementation covering the operations hemera needs: //! addition, subtraction, multiplication, and the x^7 S-box.

use core::ops::{Add, AddAssign, Mul, MulAssign, Sub, SubAssign};

/// The Goldilocks prime: p = 2^64 - 2^32 + 1. pub const P: u64 = 0xFFFF_FFFF_0000_0001;

/// Two's complement of P modulo 2^64: 2^32 - 1. const NEG_ORDER: u64 = P.wrapping_neg(); // 0xFFFF_FFFF

/// A Goldilocks field element. /// /// Internal value may be non-canonical (in [0, 2^64)). /// Use as_canonical_u64() to reduce to [0, p). #[derive(Clone, Copy, Default, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Goldilocks { value: u64, }

impl Goldilocks { pub const ZERO: Self = Self { value: 0 };

#[inline]
pub const fn new(value: u64) -> Self {
    Self { value }
}

/// Reduce to canonical form in [0, p).
#[inline]
pub fn as_canonical_u64(self) -> u64 {
    // Mask, not branch: hash outputs of secret inputs pass through here.
    self.value.wrapping_sub(P & u64::from(self.value >= P).wrapping_neg())
}

/// Compute x^2.
#[inline]
fn square(self) -> Self {
    self * self
}

/// Compute x^7 (the Poseidon2 full-round S-box for Goldilocks).
#[inline]
pub fn pow7(self) -> Self {
    let x2 = self.square();
    let x3 = x2 * self;
    let x4 = x2.square();
    x3 * x4
}

/// Compute x^(-1) = x^(p-2) (the Poseidon2 partial-round S-box).
///
/// Uses Fermat's little theorem: x^(-1) = x^(p-2) mod p.
/// Convention: 0^(-1) = 0 (permutation over F_p).
#[inline]
pub fn inv(self) -> Self {
    // x^(p-2) by the 75-multiply addition chain (acpu gl_inv) instead
    // of naive square-and-multiply (~125 serial muls). The partial
    // rounds of the Poseidon2 permutation call this once each, and the
    // permutation is the single hottest primitive in the stack — every
    // saved serial multiply here is felt from Brakedown to the graph.
    // Bit-identical result: same Fermat exponent, better chain.
    if self.as_canonical_u64() == 0 {
        return Self::ZERO;
    }
    let x = self;
    // chain of 2^k-1 powers up to x^(2^31-1)
    let x2 = x * x;
    let x3 = x2 * x;
    let x4 = x2 * x2;
    let x7 = x3 * x4;
    let x6 = x3 * x3;
    let x12 = x6 * x6;
    let x15 = x12 * x3; // 2^4-1
    let x30 = x15 * x15;
    let x60 = x30 * x30;
    let x120 = x60 * x60;
    let x127 = x120 * x7; // 2^7-1
    let x254 = x127 * x127;
    let x255 = x254 * x; // 2^8-1
    let mut t = x255;
    for _ in 0..7 {
        t = t * t;
    }
    let x_2p15m1 = t * x127; // 2^15-1
    let x_2p16m2 = x_2p15m1 * x_2p15m1;
    let x_2p16m1 = x_2p16m2 * x; // 2^16-1
    t = x_2p16m1;
    for _ in 0..15 {
        t = t * t;
    }
    let x_2p31m1 = t * x_2p15m1; // 2^31-1
    // x^(2^32-1)
    let x_2p32m2 = x_2p31m1 * x_2p31m1;
    let x_epsilon = x_2p32m2 * x;
    // x^((2^31-1)*2^33)
    t = x_2p31m1;
    for _ in 0..33 {
        t = t * t;
    }
    // p-2 = (2^31-1)*2^33 + 2^32-1
    t * x_epsilon
}

/// The raw representative in `[0, 2^64)` (not necessarily canonical).
#[inline(always)]
pub(crate) const fn raw(self) -> u64 {
    self.value
}

/// Double this element.
#[inline]
fn double(self) -> Self {
    self + self
}

}

impl core::fmt::Debug for Goldilocks { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "Goldilocks({})", self.as_canonical_u64()) } }

// ── Arithmetic ──────────────────────────────────────────────────────

impl Add for Goldilocks { type Output = Self;

#[inline]
fn add(self, rhs: Self) -> Self {
    let (sum, over) = self.value.overflowing_add(rhs.value);
    let (sum, over) = sum.overflowing_add(u64::from(over) * NEG_ORDER);
    // Mask, not branch: the sponge absorbs secret input with this add.
    Self::new(sum.wrapping_add(NEG_ORDER & u64::from(over).wrapping_neg()))
}

}

impl AddAssign for Goldilocks { #[inline] fn add_assign(&mut self, rhs: Self) { *self = *self + rhs; } }

impl Sub for Goldilocks { type Output = Self;

#[inline]
fn sub(self, rhs: Self) -> Self {
    let (diff, under) = self.value.overflowing_sub(rhs.value);
    let (diff, under) = diff.overflowing_sub(u64::from(under) * NEG_ORDER);
    Self::new(diff.wrapping_sub(NEG_ORDER & u64::from(under).wrapping_neg()))
}

}

impl SubAssign for Goldilocks { #[inline] fn sub_assign(&mut self, rhs: Self) { *self = *self - rhs; } }

impl Mul for Goldilocks { type Output = Self;

#[inline]
fn mul(self, rhs: Self) -> Self {
    // Same representative as `reduce128(a·b)`; latency-scheduled on aarch64.
    Self::new(crate::arith::mul(self.value, rhs.value))
}

}

impl MulAssign for Goldilocks { #[inline] fn mul_assign(&mut self, rhs: Self) { *self = *self * rhs; } }

impl core::iter::Sum for Goldilocks { fn sum<I: Iterator<Item = Self>>(iter: I) -> Self { reduce128(iter.map(|x| x.value as u128).sum::()) } }

/// Reduce a 128-bit product to a Goldilocks element. /// /// Uses the identity 2^64 ≡ 2^32 - 1 (mod p). #[inline] fn reduce128(x: u128) -> Goldilocks { let x_lo = x as u64; let x_hi = (x >> 64) as u64; let x_hi_hi = x_hi >> 32; let x_hi_lo = x_hi & NEG_ORDER;

let (mut t0, borrow) = x_lo.overflowing_sub(x_hi_hi);
if borrow {
    t0 -= NEG_ORDER;
}
let t1 = x_hi_lo * NEG_ORDER;
let (res, carry) = t0.overflowing_add(t1);
Goldilocks::new(res + NEG_ORDER * u64::from(carry))

}

// ── MDS and diffusion matrices ──────────────────────────────────────

/// Apply the 4x4 MDS matrix used in Poseidon2 external rounds: /// text /// [ 2 3 1 1 ] /// [ 1 2 3 1 ] /// [ 1 1 2 3 ] /// [ 3 1 1 2 ] /// #[inline(always)] pub fn apply_mat4(x: &mut [Goldilocks; 4]) { let t01 = x[0] + x[1]; let t23 = x[2] + x[3]; let t0123 = t01 + t23; let t01123 = t0123 + x[1]; let t01233 = t0123 + x[3]; x[3] = t01233 + x[0].double(); x[1] = t01123 + x[2].double(); x[0] = t01123 + t01; x[2] = t01233 + t23; }

/// Apply the external MDS layer for a width-16 state. /// /// Multiplies by the 16×16 circulant-of-4×4 matrix: /// [[2M M ... M], [M 2M ... M], ..., [M M ... 2M]] /// where M is the 4×4 MDS matrix. #[inline] pub fn mds_light_permutation(state: &mut [Goldilocks; 16]) { // Apply M4 to each consecutive 4-element chunk. for chunk in state.chunks_exact_mut(4) { apply_mat4(chunk.try_into().unwrap()); }

// Compute column sums (one per M4 column position).
let sums: [Goldilocks; 4] = core::array::from_fn(|k| {
    (0..16).step_by(4).map(|j| state[j + k]).sum()
});

// Add the appropriate column sum to each element.
for (i, elem) in state.iter_mut().enumerate() {
    *elem += sums[i % 4];
}

}

/// Diagonal elements of the internal diffusion matrix for Goldilocks t=16. /// /// The full matrix is M_I = 1 + diag(d), where 1 is the all-ones matrix. pub const MATRIX_DIAG_16: [Goldilocks; 16] = [ Goldilocks::new(0xde9b91a467d6afc0), Goldilocks::new(0xc5f16b9c76a9be17), Goldilocks::new(0x0ab0fef2d540ac55), Goldilocks::new(0x3001d27009d05773), Goldilocks::new(0xed23b1f906d3d9eb), Goldilocks::new(0x5ce73743cba97054), Goldilocks::new(0x1c3bab944af4ba24), Goldilocks::new(0x2faa105854dbafae), Goldilocks::new(0x53ffb3ae6d421a10), Goldilocks::new(0xbcda9df8884ba396), Goldilocks::new(0xfc1273e4a31807bb), Goldilocks::new(0xc77952573d5142c0), Goldilocks::new(0x56683339a819b85e), Goldilocks::new(0x328fcbd8f0ddc8eb), Goldilocks::new(0xb5101e303fce9cb7), Goldilocks::new(0x774487b8c40089bb), ];

/// Apply the internal diffusion matrix: M_I = 1 + diag(d). /// /// Computes state'[i] = d[i] * state[i] + sum(state). #[inline] pub fn matmul_internal(state: &mut [Goldilocks; 16]) { let sum: Goldilocks = state.iter().copied().sum(); for i in 0..16 { state[i] *= MATRIX_DIAG_16[i]; state[i] += sum; } }

#[cfg(test)] mod tests { use super::*;

/// The addition chain must equal naive x^(p-2) everywhere — checked
/// against x*inv(x)==1 over a spread of values including edge cases.
#[test]
fn inv_chain_matches_fermat() {
    let mut v = [0u64; 72];
    v[..8].copy_from_slice(&[1, 2, 3, P - 1, P - 2, 0xFFFF_FFFF, 1 << 32, u64::MAX % P]);
    let mut x = 0x9e3779b97f4a7c15u64;
    for slot in v[8..].iter_mut() {
        x = x.wrapping_mul(0xbf58476d1ce4e5b9).rotate_left(31);
        *slot = x % P;
    }
    for &raw in &v {
        if raw == 0 {
            continue;
        }
        let a = Goldilocks::new(raw);
        assert_eq!(
            (a * a.inv()).as_canonical_u64(),
            1,
            "inv broken at {raw}"
        );
    }
    assert_eq!(Goldilocks::ZERO.inv().as_canonical_u64(), 0);
}

#[test]
fn field_add_basic() {
    let a = Goldilocks::new(1);
    let b = Goldilocks::new(2);
    assert_eq!((a + b).as_canonical_u64(), 3);
}

#[test]
fn field_add_wrap() {
    let a = Goldilocks::new(P - 1);
    let b = Goldilocks::new(1);
    assert_eq!((a + b).as_canonical_u64(), 0);
}

#[test]
fn field_sub_basic() {
    let a = Goldilocks::new(5);
    let b = Goldilocks::new(3);
    assert_eq!((a - b).as_canonical_u64(), 2);
}

#[test]
fn field_sub_wrap() {
    let a = Goldilocks::new(0);
    let b = Goldilocks::new(1);
    assert_eq!((a - b).as_canonical_u64(), P - 1);
}

#[test]
fn field_mul_basic() {
    let a = Goldilocks::new(3);
    let b = Goldilocks::new(7);
    assert_eq!((a * b).as_canonical_u64(), 21);
}

#[test]
fn field_mul_large() {
    // (P-1) * (P-1) mod P = 1
    let a = Goldilocks::new(P - 1);
    assert_eq!((a * a).as_canonical_u64(), 1);
}

#[test]
fn pow7_basic() {
    let x = Goldilocks::new(2);
    assert_eq!(x.pow7().as_canonical_u64(), 128);
}

#[test]
fn pow7_zero() {
    assert_eq!(Goldilocks::ZERO.pow7().as_canonical_u64(), 0);
}

#[test]
fn pow7_one() {
    assert_eq!(Goldilocks::new(1).pow7().as_canonical_u64(), 1);
}

#[test]
fn inv_basic() {
    // 2 * inv(2) = 1
    let x = Goldilocks::new(2);
    let x_inv = x.inv();
    assert_eq!((x * x_inv).as_canonical_u64(), 1);
}

#[test]
fn inv_one() {
    assert_eq!(Goldilocks::new(1).inv().as_canonical_u64(), 1);
}

#[test]
fn inv_zero() {
    assert_eq!(Goldilocks::ZERO.inv().as_canonical_u64(), 0);
}

#[test]
fn inv_roundtrip() {
    let x = Goldilocks::new(42);
    let x_inv = x.inv();
    assert_eq!((x * x_inv).as_canonical_u64(), 1);
    assert_eq!(x_inv.inv().as_canonical_u64(), x.as_canonical_u64());
}

#[test]
fn inv_p_minus_one() {
    // (p-1)^(-1) = p-1 since (p-1)^2 = 1 mod p
    let a = Goldilocks::new(P - 1);
    assert_eq!(a.inv().as_canonical_u64(), P - 1);
}

#[test]
fn canonical_reduces() {
    // A non-canonical value >= P
    let a = Goldilocks::new(P);
    assert_eq!(a.as_canonical_u64(), 0);
    let b = Goldilocks::new(P + 1);
    assert_eq!(b.as_canonical_u64(), 1);
}

}

===== 069 END =====

===== 070 BEGIN Hemera rs/src/encoding.rs | 7759 bytes | SHA256 4da69b468a5276a6ed32092e0ed6149b67bf16ded2e6aba2c405af805291701e ===== // --- // tags: hemera, rust // crystal-type: source // crystal-domain: comp // --- use crate::field::Goldilocks;

use crate::params::{ INPUT_BYTES_PER_ELEMENT, OUTPUT_BYTES, OUTPUT_BYTES_PER_ELEMENT, OUTPUT_ELEMENTS, RATE, };

/// Encode arbitrary bytes into Goldilocks field elements. /// /// Each element holds 7 bytes (little-endian). The last element may hold fewer bytes, /// zero-padded in the high positions. #[cfg(test)] pub(crate) fn bytes_to_elements(bytes: &[u8]) -> alloc::vec::Vec { bytes .chunks(INPUT_BYTES_PER_ELEMENT) .map(|chunk| { let mut buf = [0u8; 8]; buf[..chunk.len()].copy_from_slice(chunk); Goldilocks::new(u64::from_le_bytes(buf)) }) .collect() }

/// Encode exactly count elements from a byte slice into a fixed-size array, /// writing into out[offset..]. Returns the number of bytes consumed. /// /// This is the hot-path version used by the sponge absorb. pub(crate) fn bytes_to_rate_block(bytes: &[u8], out: &mut [Goldilocks; RATE]) -> usize { let mut consumed = 0; for elem in out.iter_mut() { if consumed >= bytes.len() { *elem = Goldilocks::new(0); } else { let end = (consumed + INPUT_BYTES_PER_ELEMENT).min(bytes.len()); let mut buf = [0u8; 8]; buf[..end - consumed].copy_from_slice(&bytes[consumed..end]); *elem = Goldilocks::new(u64::from_le_bytes(buf)); consumed = end; } } consumed }

/// Convert output field elements to a hash byte array. /// /// Uses the full canonical u64 representation (8 bytes LE) per element. pub(crate) fn hash_to_bytes(elements: &[Goldilocks; OUTPUT_ELEMENTS]) -> [u8; OUTPUT_BYTES] { let mut out = [0u8; OUTPUT_BYTES]; for (i, elem) in elements.iter().enumerate() { let val = elem.as_canonical_u64(); out[i * OUTPUT_BYTES_PER_ELEMENT..(i + 1) * OUTPUT_BYTES_PER_ELEMENT] .copy_from_slice(&val.to_le_bytes()); } out }

/// Convert a hash byte array back into Goldilocks elements. /// /// Inverse of hash_to_bytes. Used by hash_node in the tree module. pub(crate) fn bytes_to_cv(bytes: &[u8; OUTPUT_BYTES]) -> [Goldilocks; OUTPUT_ELEMENTS] { let mut out = [Goldilocks::new(0); OUTPUT_ELEMENTS]; for (i, elem) in out.iter_mut().enumerate() { let start = i * OUTPUT_BYTES_PER_ELEMENT; let val = u64::from_le_bytes( bytes[start..start + OUTPUT_BYTES_PER_ELEMENT] .try_into() .unwrap(), ); *elem = Goldilocks::new(val); } out }

#[cfg(test)] mod tests { extern crate std; use std::vec; use super::*; use crate::params::RATE_BYTES;

#[test]
fn roundtrip_hash_bytes() {
    let elements = [
        Goldilocks::new(1),
        Goldilocks::new(2),
        Goldilocks::new(3),
        Goldilocks::new(4),
    ];
    let bytes = hash_to_bytes(&elements);
    let recovered = bytes_to_cv(&bytes);
    assert_eq!(elements, recovered);
}

#[test]
fn bytes_to_elements_empty() {
    let result = bytes_to_elements(&[]);
    assert!(result.is_empty());
}

#[test]
fn bytes_to_elements_short() {
    let result = bytes_to_elements(&[0x42]);
    assert_eq!(result.len(), 1);
    assert_eq!(result[0].as_canonical_u64(), 0x42);
}

#[test]
fn bytes_to_elements_exact_7() {
    let input = [1, 2, 3, 4, 5, 6, 7];
    let result = bytes_to_elements(&input);
    assert_eq!(result.len(), 1);
    let expected = u64::from_le_bytes([1, 2, 3, 4, 5, 6, 7, 0]);
    assert_eq!(result[0].as_canonical_u64(), expected);
}

#[test]
fn bytes_to_elements_8_bytes_splits() {
    let input = [1, 2, 3, 4, 5, 6, 7, 8];
    let result = bytes_to_elements(&input);
    assert_eq!(result.len(), 2);
}

#[test]
fn rate_block_fill() {
    let input = vec![0xAB; RATE_BYTES];
    let mut block = [Goldilocks::new(0); RATE];
    let consumed = bytes_to_rate_block(&input, &mut block);
    assert_eq!(consumed, RATE_BYTES);
    // All 8 elements should be non-zero
    for elem in &block {
        assert_ne!(elem.as_canonical_u64(), 0);
    }
}

#[test]
fn seven_byte_values_fit_in_goldilocks() {
    // Max 7-byte value: 2^56 - 1 = 0x00FF_FFFF_FFFF_FFFF
    let max_7byte: u64 = (1u64 << 56) - 1;
    // Goldilocks prime: p = 2^64 - 2^32 + 1 = 0xFFFF_FFFF_0000_0001
    let p: u64 = 0xFFFF_FFFF_0000_0001;
    assert!(max_7byte < p, "7-byte max must be less than Goldilocks prime");
}

#[test]
fn bytes_to_elements_exact_rate_block() {
    // 56 bytes = 8 elements of 7 bytes each
    let input = vec![0x42u8; RATE_BYTES];
    let result = bytes_to_elements(&input);
    assert_eq!(result.len(), RATE);
}

#[test]
fn bytes_to_elements_one_extra() {
    // 57 bytes = 8 full elements + 1 element with 1 byte
    let input = vec![0x42u8; RATE_BYTES + 1];
    let result = bytes_to_elements(&input);
    assert_eq!(result.len(), RATE + 1);
}

#[test]
fn rate_block_partial_fill() {
    // Fewer than RATE_BYTES: remaining elements should be zero
    let input = vec![0xAB; 10]; // 10 bytes = 2 elements (7+3)
    let mut block = [Goldilocks::new(99); RATE]; // pre-fill with non-zero
    let consumed = bytes_to_rate_block(&input, &mut block);
    assert_eq!(consumed, 10);
    // First two elements non-zero, rest zero
    assert_ne!(block[0].as_canonical_u64(), 0);
    assert_ne!(block[1].as_canonical_u64(), 0);
    for elem in &block[2..] {
        assert_eq!(elem.as_canonical_u64(), 0);
    }
}

#[test]
fn rate_block_empty() {
    let mut block = [Goldilocks::new(99); RATE];
    let consumed = bytes_to_rate_block(&[], &mut block);
    assert_eq!(consumed, 0);
    for elem in &block {
        assert_eq!(elem.as_canonical_u64(), 0);
    }
}

#[test]
fn roundtrip_hash_bytes_max_canonical() {
    // Use values near the Goldilocks prime to test canonicity
    let p: u64 = 0xFFFF_FFFF_0000_0001;
    let elements = [
        Goldilocks::new(p - 1), // max canonical value
        Goldilocks::new(0),
        Goldilocks::new(1),
        Goldilocks::new(p - 2),
    ];
    let bytes = hash_to_bytes(&elements);
    let recovered = bytes_to_cv(&bytes);
    for (i, (orig, rec)) in elements.iter().zip(recovered.iter()).enumerate() {
        assert_eq!(
            orig.as_canonical_u64(),
            rec.as_canonical_u64(),
            "mismatch at element {i}"
        );
    }
}

#[test]
fn bytes_to_cv_with_above_prime_value() {
    // If bytes encode a value >= p, Goldilocks::new reduces it.
    // This is expected behavior for internal use (hash outputs are always canonical).
    let p: u64 = 0xFFFF_FFFF_0000_0001;
    let above_prime = p + 1; // should reduce to 1
    let mut bytes = [0u8; OUTPUT_BYTES];
    bytes[..8].copy_from_slice(&above_prime.to_le_bytes());
    let recovered = bytes_to_cv(&bytes);
    // p+1 mod p = 1 (Goldilocks wraps, not panics)
    assert_eq!(recovered[0].as_canonical_u64(), above_prime % p);
}

#[test]
fn bytes_to_elements_max_7byte_boundary() {
    // Exactly 7 bytes of 0xFF should encode to (2^56 - 1), which is < p
    let input = [0xFF; 7];
    let result = bytes_to_elements(&input);
    assert_eq!(result.len(), 1);
    assert_eq!(result[0].as_canonical_u64(), (1u64 << 56) - 1);
}

}

===== 070 END =====

===== 071 BEGIN hemera specs/tree.md:8-113 | 4738 bytes | SHA256 8f5d0d260b564d9efbf1cdc1da5b7fb0a994d412e43938001838d43ad8ee72f6 =====

canonical tree hashing

Chunk Size: 4 KB (4096 bytes)

Content is split into fixed 4 KB chunks (4096 bytes). Each chunk is hashed via hash_leaf(data, counter, is_root). At 56 input bytes per rate block, one 4 KB chunk requires ⌈4096/56⌉ = 74 absorptions. The last chunk may be shorter. No content-defined chunking — every boundary is deterministic.

See docs/explanation/chunk-size.md for rationale.

Leaf Hashing: hash_leaf(data, counter, is_root) → Hash

Two-pass construction separates content hashing from structural binding:

Pass 1 — content hashing:
    hasher ← Hasher::new()              (plain sponge, domain_tag = 0x00)
    hasher.absorb(data)
    base_hash ← hasher.finalize()       (32-byte sponge output)

Pass 2 — structural binding:
    state ← [0; 16]
    state[0..4] ← bytes_to_elements(base_hash)    (4 Goldilocks elements)
    state[8]    ← counter                          (chunk position, 0-based)
    state[9]    ← FLAG_CHUNK | (FLAG_ROOT if is_root)
    state ← permute(state)
    output ← elements_to_bytes(state[0..4])        (32-byte chaining value)

Two passes exist for three reasons. The sponge remains a pure hash — no tree metadata contaminates its input stream. Tree logic is layered on top via the capacity region. The base_hash is cacheable: if a chunk appears at multiple positions, the expensive 74-absorption pass runs once and the cheap 1-permutation binding runs per position.

Counter prevents chunk reordering. CHUNK flag prevents leaf/node confusion. ROOT flag distinguishes root finalization from subtree chaining.

Cost: N absorptions + 1 permutation. At 4096 bytes: 74 + 1 = 75 permutations per leaf.

Internal Node Hashing: hash_node(left, right, is_root) → Hash

state ← [0; 16]
state[9] ← FLAG_PARENT | (FLAG_ROOT if is_root)

// Absorb both children (4 + 4 = 8 elements = one full rate block)
state[0..4] += bytes_to_elements(left)     (field addition, element-wise)
state[4..8] += bytes_to_elements(right)    (field addition, element-wise)
state ← permute(state)

output ← elements_to_bytes(state[0..4])    (32-byte chaining value)

No padding needed — inputs are always exactly two 32-byte hashes (4 + 4 = 8 elements = one rate block). PARENT flag lives in the capacity region. Order matters: hash_node(A, B) ≠ hash_node(B, A).

Cost: 1 permutation per internal node.

Namespace-Aware Parent: hash_node_nmt(left, right, ns_min, ns_max, is_root) → Hash

Same as hash_node but with namespace bounds in the capacity:

state[12] ← ns_min        (minimum namespace in subtree)
state[13] ← ns_max        (maximum namespace in subtree)

When ns_min = ns_max = 0, reduces to hash_node. Only NMT uses non-zero namespace bounds.

Verifier checks: parent.ns_min ≤ left.ns_max < right.ns_min ≤ parent.ns_max (for sorted NMT).

Cost: 1 permutation (same as hash_node).

Tree Shape

Binary, left-balanced, in-order indexed:

If N = 1:     hash_leaf(data, 0, is_root=true)  is the root
If N > 1:     split = 2^(⌈log₂(N)⌉ - 1)
              left  = tree_hash(chunks[0..split],       is_root=false)
              right = tree_hash(chunks[split..N],        is_root=false)
              root  = hash_node(left, right, is_root=true)

Left-balanced: the left subtree is always a complete binary tree (power-of-2 leaves). The right subtree absorbs the remainder and recurses with the same rule.

In-order indexing: Leaves at even positions (0, 2, 4, ...). Parents at odd positions with level = trailing_ones(index). This indexing is compatible with Merkle Mountain Range append operations.

Root Finalization

Case Function Flags Value
Single-chunk file hash_leaf(data, 0, is_root=true) CHUNK | ROOT 0x05
Multi-chunk file hash_node(left, right, is_root=true) PARENT | ROOT 0x03

The ROOT flag ensures that a file's identity hash is never equal to any internal chaining value. A subtree hash with is_root=false is structurally distinct from the same tree computed as a standalone file with is_root=true.

Security Properties

Attack Defense Mechanism
Leaf/node confusion Prevented CHUNK (0x04) vs PARENT (0x02) in capacity
Chunk reordering Prevented Counter in state[8] binds position
Chunk duplication Prevented Counter distinguishes identical chunks at different offsets
Subtree substitution Prevented ROOT flag separates file identity from subtree identity
Length extension Prevented Length in state[10] (sponge) + counter (binding)
Second preimage via tree Prevented All of the above, combined

Complete Example

A 12 KB file (3 chunks):

===== 071 END =====

===== 072 BEGIN hemera specs/encoding.md:29-42 | 646 bytes | SHA256 363137dc01965e7f856c3e70005fd0cfc5706a23fda1e52ae85b90600542bf82 =====

Output uses the full canonical u64 representation: 8 bytes per element, little-endian. Output elements are guaranteed to be in [0, p) by the permutation — no reduction needed.

element 0 → bytes[0..8]     (u64 to LE bytes)
element 1 → bytes[8..16]
element 2 → bytes[16..24]
element 3 → bytes[24..32]   (= 32-byte hash output)

The asymmetry — 7 bytes in, 8 bytes out — is deliberate. Input encoding must be injective for collision resistance. Output encoding must preserve full field element fidelity for algebraic composability. These are different constraints with different optima.

Padding (Hemera: 0x01 ∥ 0x00*)

===== 072 END =====

===== 073 BEGIN hemera specs/capacity.md:11-48 | 1342 bytes | SHA256 1211c21b4e65c077476581faf6a4b353a064483593280d2e71a65c0a55ebb311 =====

layout

state[0..8]   rate       input absorption / output squeezing
state[8..16]  capacity   structural context, never touched by input

state[8]      counter    chunk position in file (0-based, u64)
state[9]      flags      structural role (bitfield)
state[10]     msg_length total input byte count (sponge finalization)
state[11]     domain_tag   API mode selector (PLANNED FOR REMOVAL — see roadmap/one-pure-hash.md)
state[12]     ns_min     namespace lower bound (NMT only, zero otherwise)
state[13]     ns_max     namespace upper bound (NMT only, zero otherwise)
state[14]     reserved   must be zero
state[15]     reserved   must be zero

flags (state[9])

three single-bit flags, combined via bitwise OR:

FLAG_ROOT   = 0x01    this hash finalizes a tree root
FLAG_PARENT = 0x02    this hash combines two child hashes (internal node)
FLAG_CHUNK  = 0x04    this hash derives a leaf chaining value

valid combinations:

context flags value
plain sponge hash (none) 0x00
non-root leaf CHUNK 0x04
root leaf (single-chunk file) CHUNK | ROOT 0x05
non-root internal node PARENT 0x02
root internal node (tree root) PARENT | ROOT 0x03

flags encode what the hash IS, not what it contains. a flag combination that does not appear in the table is invalid.

===== 073 END =====

===== 074 BEGIN hemera rs/src/field.rs:10-44 | 964 bytes | SHA256 454a53173d2f33e639acfdc8b7ff9c0a2a5556cc11d391932992dde26f42e03c =====

use core::ops::{Add, AddAssign, Mul, MulAssign, Sub, SubAssign};

/// The Goldilocks prime: p = 2^64 - 2^32 + 1. pub const P: u64 = 0xFFFF_FFFF_0000_0001;

/// Two's complement of P modulo 2^64: 2^32 - 1. const NEG_ORDER: u64 = P.wrapping_neg(); // 0xFFFF_FFFF

/// A Goldilocks field element. /// /// Internal value may be non-canonical (in [0, 2^64)). /// Use as_canonical_u64() to reduce to [0, p). #[derive(Clone, Copy, Default, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct Goldilocks { value: u64, }

impl Goldilocks { pub const ZERO: Self = Self { value: 0 };

#[inline]
pub const fn new(value: u64) -> Self {
    Self { value }
}

/// Reduce to canonical form in [0, p).
#[inline]
pub fn as_canonical_u64(self) -> u64 {
    // Mask, not branch: hash outputs of secret inputs pass through here.
    self.value.wrapping_sub(P & u64::from(self.value >= P).wrapping_neg())
}

/// Compute x^2.

===== 074 END =====

===== 075 BEGIN hemera rs/src/encoding.rs:47-79 | 1132 bytes | SHA256 816c01ae13817285054db8500ee1f80f6d3250d4f6d650800ee5e6b33a22cea4 =====

/// Convert output field elements to a hash byte array. /// /// Uses the full canonical u64 representation (8 bytes LE) per element. pub(crate) fn hash_to_bytes(elements: &[Goldilocks; OUTPUT_ELEMENTS]) -> [u8; OUTPUT_BYTES] { let mut out = [0u8; OUTPUT_BYTES]; for (i, elem) in elements.iter().enumerate() { let val = elem.as_canonical_u64(); out[i * OUTPUT_BYTES_PER_ELEMENT..(i + 1) * OUTPUT_BYTES_PER_ELEMENT] .copy_from_slice(&val.to_le_bytes()); } out }

/// Convert a hash byte array back into Goldilocks elements. /// /// Inverse of hash_to_bytes. Used by hash_node in the tree module. pub(crate) fn bytes_to_cv(bytes: &[u8; OUTPUT_BYTES]) -> [Goldilocks; OUTPUT_ELEMENTS] { let mut out = [Goldilocks::new(0); OUTPUT_ELEMENTS]; for (i, elem) in out.iter_mut().enumerate() { let start = i * OUTPUT_BYTES_PER_ELEMENT; let val = u64::from_le_bytes( bytes[start..start + OUTPUT_BYTES_PER_ELEMENT] .try_into() .unwrap(), ); *elem = Goldilocks::new(val); } out }

#[cfg(test)] mod tests {

===== 075 END =====

===== 076 BEGIN hemera rs/src/sponge.rs:22-43 | 697 bytes | SHA256 e12b1722dacbc3910760480cf1c5e2daf9bb6c753a3b9b8ada926069b4007df0 ===== #[derive(Clone, Copy, PartialEq, Eq, Hash)] pub struct Hash([u8; OUTPUT_BYTES]);

impl Hash { /// Create a hash from a raw byte array. pub const fn from_bytes(bytes: [u8; OUTPUT_BYTES]) -> Self { Self(bytes) }

/// Return the hash as a byte slice.
pub fn as_bytes(&self) -> &[u8; OUTPUT_BYTES] {
    &self.0
}

/// Convert the hash to a hex string.
#[cfg(feature = "std")]
#[allow(unknown_lints, rs_no_string)]
pub fn to_hex(&self) -> alloc::string::String {
    let mut s = alloc::string::String::with_capacity(OUTPUT_BYTES * 2);
    for byte in &self.0 {
        use core::fmt::Write;
        write!(s, "{byte:02x}").unwrap();

===== 076 END =====

===== 077 BEGIN hemera rs/src/tree.rs:95-148 | 1908 bytes | SHA256 d9cfe6eb1f01008be0503e13e2b68657599d4cbd521ce15f63fd305732951756 ===== } } }

/// Combine two child chaining values into a parent chaining value. /// /// With Hemera parameters (output=4 elements, rate=8), each child hash is 4 elements. /// Both children together (4 + 4 = 8 elements) fit in one rate block. /// Flags are set in the capacity before the absorption. /// /// The is_root flag domain-separates the tree root from interior nodes. pub fn hash_node(left: &Hash, right: &Hash, is_root: bool) -> Hash { let mut state = node_state(left, right, is_root); params::permute(&mut state); state_digest(&state) }

/// Pre-permutation state of hash_node: flags in the capacity, both /// children absorbed into the rate (4 + 4 = 8 elements = one rate block). #[inline] fn node_state(left: &Hash, right: &Hash, is_root: bool) -> [Goldilocks; WIDTH] { let left_elems = bytes_to_cv(left.as_bytes()); let right_elems = bytes_to_cv(right.as_bytes());

let mut state = [Goldilocks::new(0); WIDTH];

// Set flags in capacity before absorbing.
let mut flags = FLAG_PARENT;
if is_root {
    flags |= FLAG_ROOT;
}
state[CAPACITY_FLAGS_IDX] = Goldilocks::new(flags);

// Absorb both children (4 + 4 = 8 elements = one full rate block).
for i in 0..OUTPUT_ELEMENTS {
    state[i] += left_elems[i];
}
for i in 0..OUTPUT_ELEMENTS {
    state[OUTPUT_ELEMENTS + i] += right_elems[i];
}
state

}

/// Digest of a permuted state: the first OUTPUT_ELEMENTS, canonical LE. #[inline] fn state_digest(state: &[Goldilocks; WIDTH]) -> Hash { let output: [Goldilocks; OUTPUT_ELEMENTS] = state[..OUTPUT_ELEMENTS].try_into().unwrap(); Hash::from_bytes(hash_to_bytes(&output)) }

/// out[i] = hash_node(&pairs[i].0, &pairs[i].1, is_root) for every i. /// /// Runs permutation::BATCH_LANES compressions interleaved per kernel /// call (see permutation::permute_batch); no allocation. Use it where

===== 077 END =====

===== 078 BEGIN hemera rs/src/tree.rs:870-884 | 402 bytes | SHA256 19a3aab1d05dab34ce97703deedbb2f3d202b0c51e82ff6062cf1e00ba3cc14b ===== } }

/// Alias for hash_leaf — compatible with BAO chaining value terminology. #[inline] pub fn chunk_cv(data: &[u8], counter: u64, is_root: bool) -> Hash { hash_leaf(data, counter, is_root) }

/// Alias for hash_node — compatible with BAO chaining value terminology. #[inline] pub fn parent_cv(left: &Hash, right: &Hash, is_root: bool) -> Hash { hash_node(left, right, is_root) }

===== 078 END =====

===== 079 BEGIN soft3 release/components.toml:250-260 | 149 bytes | SHA256 c8981791a8d1a7860703afece8f14943f7e2f2629d297415392fa15db72db984 ===== component name = "radio" kind = "crate" repo = "radio" verb = "transmit" facet = "space" layer = 7 part_of = "soft3" phase = "1" state = "live"

===== 079 END =====

===== 080 BEGIN soft3 release/components.toml:653-662 | 221 bytes | SHA256 c4476d92f9f50efd9080cad9bdd24f49845b274d9376e3a0eb4ce0686b6d5aac ===== component name = "kadek" kind = "part" repo = "kadek" verb = "decode" facet = "play" layer = 8 part_of = "cyb" phase = "1" state = "pure rust media: decode what a file renders to; specs aligned with soft3 2026-09-25"

===== 080 END =====

===== 081 BEGIN radio iroh-blobs/src/api/blobs.rs:1011-1020 | 316 bytes | SHA256 6d551f1b8f840ae0b99e44c4e71ba605a38e1bbc07343fc733858871a55f5652 ===== }

fn encode_parent_pair(pair: &(hemera::Hash, hemera::Hash)) -> [u8; 2 * hemera::OUTPUT_BYTES] { let mut data = [0; 2 * hemera::OUTPUT_BYTES]; let (left, right) = data.split_at_mut(hemera::OUTPUT_BYTES); left.copy_from_slice(pair.0.as_bytes()); right.copy_from_slice(pair.1.as_bytes()); data }

===== 081 END =====

===== 082 BEGIN radio iroh-blobs/src/api/blobs.rs:14-38 | 619 bytes | SHA256 c70793944bf4f0bff427176b97a7c1140822794e5ba34d24d38257791e762be8 ===== pin::Pin, };

pub use cyber_bao::io::mixed::EncodedItem; use cyber_bao::{ io::{ fsm::{ResponseDecoder, ResponseDecoderNext}, BaoContentItem, Leaf, }, BaoTree, ChunkNum, ChunkRanges, }; use bytes::Bytes; use genawaiter::sync::Gen; use iroh_io::AsyncStreamWriter; use irpc::channel::{mpsc, oneshot}; use n0_error::AnyError; use n0_future::{future, stream, Stream, StreamExt}; use range_collections::{range_set::RangeSetRange, RangeSet2}; use ref_cast::RefCast; use serde::{Deserialize, Serialize}; use tracing::trace; #[cfg(test)] mod export_pairs; mod reader; pub use reader::BlobReader;

===== 082 END =====

===== 083 BEGIN kadek specs/runtime.md:36-57 | 1529 bytes | SHA256 50e3fadc2a6d1bd5b6f70f78d0705a157251f3442ceb535ea119ab9053f7a3f1 ===== information. Negative timestamps remain valid.

  • Rescale from a/b to c/d as floor(t*a*d/(b*c)), including negative values, with checked widened arithmetic. Rescale interval endpoints, then subtract; independently rounded durations accumulate drift.
  • Random access, discontinuity, corrupt input and decode-only/preroll are distinct flags. An intra picture alone does not establish a complete recovery point.
  • Packet provenance names the file's particle and ordered byte intervals covering its coded bytes exactly once; preserve repeated/reordered source occurrences. Reassembly copies verified source bytes. Radio inputs carry cyber-bao slice proofs; verify before admission, leaving codec state unchanged on failure. Proofless packets require a verified complete body. Seek/partial load open ranges against the particle; bindings map indexes to ranges and never fetch.

A verified complete body may derive a sealed in-process BAO anchor binding its plain particle, complete length and canonical fixed-4096 Hemera tree root. Derivation borrows the same immutable body and yields under persistent work limits; the completed fixed value retains no byte allocation. Only derivation creates authority. Raw or restored mappings require independent authentication or complete-body reverification. The anchor alone admits no range or packet.

Preserve ordered codec headers and semantic mapping fields; audio bindings own Vorbis/Opus/PCM normalization. Validate transport syntax first.

===== 083 END =====

===== 084 BEGIN Hemera leaf/parent kernels complete region rs/src/tree.rs:1-143 | 5344 bytes | SHA256 900dbe8002a35b2df11adf8fa2814bc262a896840f785005a544ff9d9f1e2228 ===== // --- // tags: hemera, rust // crystal-type: source // crystal-domain: comp // --- //! Hash tree construction. //! //! hash_leaf hashes leaf data into a chaining value. //! hash_node combines two child chaining values into a parent node.

use crate::encoding::{bytes_to_cv, hash_to_bytes}; use crate::field::Goldilocks; use crate::params::{self, CHUNK_SIZE, MAX_TREE_DEPTH, OUTPUT_ELEMENTS, RATE, WIDTH}; use crate::permutation::{BATCH_LANES, permute_batch}; use crate::sponge::Hash;

/// Flags encoded in the capacity for tree operations. const FLAG_ROOT: u64 = 1 << 0; const FLAG_PARENT: u64 = 1 << 1; const FLAG_CHUNK: u64 = 1 << 2;

/// Capacity index for chunk counter (position in the file). const CAPACITY_COUNTER_IDX: usize = RATE; // state[8]

/// Capacity index for tree flags. const CAPACITY_FLAGS_IDX: usize = RATE + 1; // state[9]

/// Capacity index for namespace lower bound (NMT only). const CAPACITY_NS_MIN_IDX: usize = RATE + 4; // state[12]

/// Capacity index for namespace upper bound (NMT only). const CAPACITY_NS_MAX_IDX: usize = RATE + 5; // state[13]

/// Compute the chaining value for a leaf chunk. /// /// The counter is the chunk's position index within the file (0-based), /// used for ordering in tree construction. The is_root flag /// domain-separates root finalization (single-chunk inputs) from interior /// finalization. pub fn hash_leaf(chunk: &[u8], counter: u64, is_root: bool) -> Hash { let mut hasher = crate::sponge::Hasher::new(); hasher.update(chunk); let base_hash = hasher.finalize(); let mut state = leaf_state(&base_hash, counter, is_root); params::permute(&mut state); state_digest(&state) }

/// Re-derivation state of hash_leaf: the base digest in the rate, the /// counter and flags in the capacity. #[inline] fn leaf_state(base_hash: &Hash, counter: u64, is_root: bool) -> [Goldilocks; WIDTH] { let base_elems = bytes_to_cv(base_hash.as_bytes()); let mut state = [Goldilocks::new(0); WIDTH]; state[..OUTPUT_ELEMENTS].copy_from_slice(&base_elems);

let mut flags = FLAG_CHUNK;
if is_root {
    flags |= FLAG_ROOT;
}
state[CAPACITY_COUNTER_IDX] = Goldilocks::new(counter);
state[CAPACITY_FLAGS_IDX] = Goldilocks::new(flags);
state

}

/// out[i] = hash_leaf(leaves[i].0, leaves[i].1, is_root) for every i. /// /// Leaves of equal length (the Merkle trees of a PCS) are hashed /// permutation::BATCH_LANES at a time with every permutation of the /// sponge and of the re-derivation batched; a group of unequal lengths /// falls back to hash_leaf. No allocation. pub fn hash_leaf_batch(leaves: &[(&[u8], u64)], is_root: bool, out: &mut [Hash]) { assert_eq!(leaves.len(), out.len(), "hash_leaf_batch: length mismatch"); let mut states = [[Goldilocks::new(0); WIDTH]; BATCH_LANES]; let mut msgs: [&[u8]; BATCH_LANES] = [&[]; BATCH_LANES]; for (lc, oc) in leaves.chunks(BATCH_LANES).zip(out.chunks_mut(BATCH_LANES)) { let n = lc.len(); if lc.iter().any(￿(m, _)￿ m.len() != lc[0].0.len()) { for (o, (m, ctr)) in oc.iter_mut().zip(lc) { *o = hash_leaf(m, *ctr, is_root); } continue; } for (slot, (m, )) in msgs.iter_mut().zip(lc) { *slot = m; } crate::sponge::finalize_states_equal_len(&msgs[..n], &mut states[..n]); for (st, (, ctr)) in states.iter_mut().zip(lc) { let base = state_digest(st); *st = leaf_state(&base, *ctr, is_root); } permute_batch(&mut states[..n]); for (o, st) in oc.iter_mut().zip(&states) { *o = state_digest(st); } } }

/// Combine two child chaining values into a parent chaining value. /// /// With Hemera parameters (output=4 elements, rate=8), each child hash is 4 elements. /// Both children together (4 + 4 = 8 elements) fit in one rate block. /// Flags are set in the capacity before the absorption. /// /// The is_root flag domain-separates the tree root from interior nodes. pub fn hash_node(left: &Hash, right: &Hash, is_root: bool) -> Hash { let mut state = node_state(left, right, is_root); params::permute(&mut state); state_digest(&state) }

/// Pre-permutation state of hash_node: flags in the capacity, both /// children absorbed into the rate (4 + 4 = 8 elements = one rate block). #[inline] fn node_state(left: &Hash, right: &Hash, is_root: bool) -> [Goldilocks; WIDTH] { let left_elems = bytes_to_cv(left.as_bytes()); let right_elems = bytes_to_cv(right.as_bytes());

let mut state = [Goldilocks::new(0); WIDTH];

// Set flags in capacity before absorbing.
let mut flags = FLAG_PARENT;
if is_root {
    flags ￿= FLAG_ROOT;
}
state[CAPACITY_FLAGS_IDX] = Goldilocks::new(flags);

// Absorb both children (4 + 4 = 8 elements = one full rate block).
for i in 0..OUTPUT_ELEMENTS {
    state[i] += left_elems[i];
}
for i in 0..OUTPUT_ELEMENTS {
    state[OUTPUT_ELEMENTS + i] += right_elems[i];
}
state

}

/// Digest of a permuted state: the first OUTPUT_ELEMENTS, canonical LE. #[inline] fn state_digest(state: &[Goldilocks; WIDTH]) -> Hash { let output: [Goldilocks; OUTPUT_ELEMENTS] = state[..OUTPUT_ELEMENTS].try_into().unwrap(); Hash::from_bytes(hash_to_bytes(&output)) }

===== 084 END =====

Homonyms

soft3/radio/audit/2026-10-12-bao-bounded-proof/plan-input/context.txt
ProofVerifier::new(proof: &[u8], root: [u8; 32], size: u64, block: BlockSize, request: Range) -> Result ProofVerifier::is_finished(&self) -> bool ProofVerifier::step(&mut self) -> Result>, ProofError> VerifiedProof::{root, size, block_size, request}…
soft3/radio/audit/2026-10-13-audit-cargo-packaging/plan-input-v2/context.txt
warning: skipping duplicate package `cyber-bao v0.1.0 (...#ce0fb312)`: /tmp/radio-bao-proof-parent-b933/cyber-bao/Cargo.toml in favor of .../git/checkouts/radio-1a8d5f25084d9866/ce0fb31/cyber-bao/Cargo.toml audit/2026-10-09-kadek-slice-traversal/Cargo.toml…
soft3/radio/audit/2026-10-13-audit-cargo-packaging/code-input/context.txt
audit/2026-10-09-kadek-slice-traversal/Cargo.toml audit/2026-10-12-bao-proof-research/probe/Cargo.toml audit/2026-10-12-bao-proof-research/primary-probe/Cargo.toml audit/2026-10-12-bao-bounded-proof/fixture-probe/Cargo.toml audit/2026-10-12-bao-bounded-proof/nostd/Cargo.toml…
soft3/radio/audit/2026-10-13-audit-cargo-packaging/plan-input/context.txt
warning: skipping duplicate package `cyber-bao v0.1.0 (...#ce0fb312)`: /tmp/radio-bao-proof-parent-b933/cyber-bao/Cargo.toml in favor of .../git/checkouts/radio-1a8d5f25084d9866/ce0fb31/cyber-bao/Cargo.toml audit/2026-10-09-kadek-slice-traversal/Cargo.toml…

Graph