warriors/trisha/audit/binary-packaging.md

Binary packaging gate

scripts/package-binaries.nu PREFIX OUTPUT --smoke WORK/smoke.json creates a fresh deterministic tar.gz locally. It does not publish or run a proof.

Before staging, the script requires a completed schema1 installed-compiler-warrior-v1 smoke receipt with all_checks_passed=true, matching source provenance and exactly three binary records. The current builder and smoke must also bind the exact source-verification.json SHA-256, including source/vendor manifest identities; source_verified must be true. Packaging rechecks the complete source/vendor inventories against that receipt. The smoke script must match the hash recorded during its execution and is copied from the verified source archive. It hashes each actual installed binary and requires equality with both candidate and smoke receipts. It also checks the current sources.json digest against the candidate. Missing receipt, wrong provenance, missing/duplicate binary records, changed binary or existing output aborts. Copied binary bytes are checked again before archiving; symlinks are materialized as ordinary executable files. The smoke fixture_files must name exactly the three state JSON files and match actual prefix fixture hashes; copied fixture bytes are checked again. Alternate smoke fixtures cannot authorize different bytes shipped from the prefix.

The archive root is cyber-tools, containing:

  • bin/trident, bin/trisha and bin/joy;
  • share/trisha-release-smoke with the three public state fixture JSON files and the current smoke-release.nu script;
  • candidate.json, source-verification.json and smoke.json;
  • licenses/trident.txt, licenses/trisha.txt and licenses/joy.txt;
  • README.txt with installation and test/platform limitations.

The packaged candidate receipt omits the build host's absolute source path. Installed smoke only needs its provenance and binary hashes. The archive helper normalizes metadata with epoch0 and the fixed cyber-tools root. Output must be new; the staging directory is removed on success or failure.

Initial mechanics validation, before the genuine installed proof run: Nushell syntax check passed; temporary missing-receipt and changed-binary cases both rejected without creating an archive. Changed fixture bytes and injected mktemp/chmod failures also rejected without an archive. External staging and permission commands have checked exit status. The combined temporary regression harness is /tmp/test-binary-packaging.py; all five negative gates passed. Synthetic-only positive fixtures produced byte-identical archives twice, with all three binaries, sanitized candidate receipt and shipped smoke script. These synthetic tests establish packager mechanics, not successful product smoke. A real binary archive still requires the genuine completed smoke receipt generated by the owner's full installed proof/check workflow.

The actual macOS arm64 archive subsequently passed that gate on 2026-09-12: /tmp/cyber-tools-v7-darwin-aarch64-20260912-rehearsal.tar.gz, SHA-256 3bc8a02090bd91e80364e0368f65a945391889c2ade078776dd7b96b0ca1d544. It contains the exact three binaries and public fixtures in the completed installed smoke receipt. The source remains rehearsal 1; later harness, tests, bootstrap and documentation edits must be included in the final source candidate without relabeling this build.

Receipts are trusted local test evidence, not signatures against a malicious operator who fabricates both receipts. Smoke coverage is limited to its explicit checks: it does not establish live Neptune admission, universal formal safety, GPU proving or arbitrary platform compatibility. Source/licenses are obtained from candidate.source before that local path is removed from the shipped receipt.

Graph