Skip to content

Binary attestations: phase 2 – reproducible Fastly builds - #1449

Open
prk-Jr wants to merge 65 commits into
feature/binary-attestations-phase1from
feature/binary-attestations-phase2
Open

prk-Jr wants to merge 65 commits into
feature/binary-attestations-phase1from
feature/binary-attestations-phase2

Conversation

@prk-Jr

@prk-Jr prk-Jr commented Oct 26, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • Require two fresh ordinary Fastly builds to produce identical complete wasm bytes before any release signing. Approved compiler-path normalization preserves debug information; a mismatch prevents release.
  • Publish a real, signed trusted-server-fastly.wasm.rebuild-check.json, with current-run transfer binding. Keep the four Phase 1 binary names, the reusable signer and the existing binary/SPDX verification commands; publication grows to 18 files.
  • Port the Add binary attestation contracts and release build guards #1262 producer graph with controlled qualification closed. Ordinary equality does not prove controlled-recipe qualification or complete composition; the frozen esbuild observer gap remains guarded and visibly skipped.

Changes

Files Change
crates/trusted-server-release/**; workspace manifests/lock Producer port; ordinary observation, authenticated transfer checks, comparison/writer and safe post-reap group observation
crates/trusted-server-js/**; CLI resource discovery Private JS inputs, guarded controlled preparation and runtime resource lookup
.github/workflows/{release,release-build,test,format}.yml; scripts/release/{phase1*,publish.mjs,release-notes.md,release-cohort.json}; AGENTS.md A/B gate, isolated companion signing, 18-file publisher with pre-publication checks of every bundle and the rebuild check, packaging checks and failure/process tests
Release guide, Phase 2 spec and plans; domain lint Verification contracts, compatibility and rehearsal record, approved reference-host entries

9eeccbb88 size versus Phase 1 3e2dd4842: 271 new files (one binary fixture), 91,299 new text lines; 42 existing files +3,270/−668. Rust: 79,236 new lines +374 existing additions. Remaining text is workflow/script/test support, docs, schemas and lockfile. Frozen source: 122b78664b1235c717e9208fd200f9a9b0c335df.

Closes

Part of #1235. This parent issue tracks the phased work; no separate tracking issue is pending. This PR does not close its remaining maintainer settings/approval requirements.

Spec / Plan

Phase 2 spec with its own two-round review log · Approved Gate 1 design, with the compatibility and rehearsal record · implementation and normalization plan · phase assignment.

Test plan

Current head 1858b6dd31c3190d4a953ebec2d0caf85c729eef: hosted CI PASS; release rehearsal not yet run. Review fixes only:

  • Removes the three ordinary negative canary jobs. Their condition read a hard-coded output, so they only showed that GitHub skips a false if:. The CI step still runs the exact Rust mismatch fixture, and the contract test now requires the real sign job to need fastly-comparison and forbids always()/failure()/cancelled() in the sign and release job conditions.
  • Restores scripts/docs-proposal/hunks*.mjs, crates/trusted-server-adapter-cloudflare/build.sh and the workflow quote style from the Phase 1 base (style-only churn).
  • Comments why the Fastly reproduction waits for canonical (the comparison rejects equal whole-second start times), drops a redundant success() from the rebuild-check upload, and restores the prebuild hint in the TSJS_SKIP_BUILD panic.

Hosted CI: 30 successful checks, no skips (the removed jobs were the two skipped canaries and their audit). Local: release Node suite 45/45, docs-proposal gate, cargo fmt, trusted-server-js clippy and tests, cargo check-axum, cargo clippy-fastly. The two release-build.yml edits (a comment and an equivalent step condition) have not been through a fresh rehearsal.

Previous rehearsed head 44557229af80720c689759ac180ee375696b667f: PASS. Merges Phase 1's new branch check (the checks job refuses a tag whose commit is on no branch). Fresh lightweight v0.0.0-rehearsal.30 at this exact commit passed all 13 jobs: both Fastly builds matched (3b18e5d0365af1b146a65149158df63205a0097ce6729ad10b07994ae994e914; canonical 411s, reproduction 373s, comparison 105s), 18 immutable prerelease assets were published, and the guide's verification block passed with all 17 checksum entries OK. Hosted CI: 31 successful checks, two expected skips. Phase 1's rehearsal .29 showed the new step refusing a tag-only commit before any build.

Previous rehearsed head 9eeccbb88cd75332bc95c6914e997ffca43e1939: PASS. Merges the narrowed Phase 1 (3e2dd4842, four binaries) in 3ddcd1996 and fixes the one break that merge caused. Fresh lightweight v0.0.0-rehearsal.27 at this exact commit passed all 13 jobs.

Validation at 9eeccbb88 Result
Two fresh Fastly builds and comparison Matched: canonical and reproduction SHA-256 8fc36bb49a06f2182512d57976b26ee763f0ef06e9a40635f24540ef7c7980eb; ordinary profile, release_qualification:false. Canonical 399s, reproduction 443s, comparison 129s
Publisher Verified every binary's provenance and SBOM bundle and the rebuild check before creating the release; release attestation available on the first check
Published release 18 immutable prerelease assets, not Latest
Documented guide block, run unchanged with the REPO/TAG/COMMIT filled in Exit 0: release verify; every binary, SPDX file, bundle and the rebuild check verified; SBOM predicate equality; rebuild-check profile/source/digest jq check; all 17 SHA256SUMS entries OK. Run locally with GitHub CLI 2.87.2, older than the guide's 2.102.0
Hosted CI 31 successful checks, two expected skips
Local Release crate tests (973 + 4 + 18) and clippy; release Node suite 44/44; cargo fmt; clippy for Fastly and the CLI; cargo test-fastly (Viceroy 0.21.0); cargo test-axum; CLI tests; shellcheck; prettier; domain lint

v0.0.0-rehearsal.26 of the merge commit 3ddcd1996 failed the canonical Fastly build before anything was signed: Phase 1 had stopped writing cargo-metadata.json (nothing in Phase 1 read it), but Phase 2's ordinary capture reads it. 9eeccbb88 writes it again, and a test now ties the capture's metadata path to the file the acquisition step writes.

Not repeated at 9eeccbb88: offline bundle verification, the online SBOM lookup, and the local Viceroy runtime check of the published wasm. Those remain recorded below for earlier sources.

Previous rehearsed source 5163241b947b1aa335987bd832b9205e4364e4bb: PASS. Fresh lightweight v0.0.0-rehearsal.20 passed all 18 jobs. Full independent verification: transcript 1, 2, 3.

Validation at 5163241b9 Result
Seven builds; two complete Fastly Wasm files; genuine rebuild-check and authenticated upload/API joins Passed; no excluded sections; ordinary qualification remains false
Documented release download; 30 immutable prerelease files, not Latest; release verify and all 30 verify-asset calls Passed; 29 checksums, exact API sizes/digests, published readback equals signed handoff
All seven binaries, provenance + SPDX, online + retained bundles, workflow + exact tag certificate identities Passed all 28 mode/predicate checks and 56 identity invocations; exact source/tag/signer/hosted-runner constraints
Published SPDX equality and companion verification 14 equalities; one-byte and empty-result negatives rejected; companion online/offline provenance and joins passed
Native smoke and pinned Fastly packaging macOS 13.0, full CLI source, Axum non-loopback/invalid ports; pinned Fastly 16 pack/validate/inspect/cmp passed
Exact published Fastly runtime under pinned Viceroy 0.21.0 Three publisher + injected JS responses 200/full source; three actual request/response log pairs, zero build-fact lines; negative controls and listener cleanup passed. Local scope only, no deployment/browser claim

5163241b9 CI: 29 successful checks, four expected skips. Binary, Tests, Format, Integration. Hosted coverage includes 952 Linux producer tests / nine existing ignores, three boundary tests, 18 command tests, 38 JS fixtures and 45 macOS process tests / zero ignores. Independent implementation/security and follow-up reviews found no remaining actionable findings; review limits remain documented. Local pure regressions, strict host checks/clippy and applicable formatting/domain/workflow/shell checks passed.

Previous head 0f89eae69 was docs-only after 5163241b9; its hosted CI passed (29 successful checks, four expected skips).

5163241b9 observed cost: reproduction 282s plus comparison 122s, overlapping native builds. Canonical/reproduction Wasm SHA-256 4fe7204f17df07a392f4e4b64f31eebf3b02179e57abee689ab0094990d0a572. Different checkout/target roots, job counts, umasks and start times; UID/locale/timezone stayed equal. Controlled qualification remains closed.

Historical evidence keeps its source: .16/runtime supplement at 5fa384336; .17/.18 capacity failures at 36454c526; .19 capacity failure at 5163241b9, no releases for those failed attempts. .10 rerun-all recovery remains at 3ccfe2971; .13 remains at 770a425df. Tags are preserved.

Checklist

  • Phase-specific spec with two fresh review rounds; independent implementation/security review and focused cleanup-fix review recorded.
  • Narrowed Phase 1 merged; the one merge break (cargo-metadata.json) fixed and tested.
  • Current 1858b6dd3 hosted CI green (30 success, no skips); 44557229a was green with 31 success and two expected skips.
  • Exact-head release rehearsal at 1858b6dd3.
  • Successful .30 exact-head release rehearsal and documented-guide verification at 44557229a (and .27 at 9eeccbb88).
  • Historical .20 full published-asset/attestation/runtime verification at 5163241b9 (seven-binary release).

Human gates and limits

Merging Phase 2 activates the equality gate on the next eligible tag: a second Fastly build plus comparison, no release on mismatch. Native release CI builds each asset once; controlled qualification, later index/SPDX/consumer gates and GNU masking remain closed. No IAB tags, releases or settings changes.

Decisions from merging the narrowed Phase 1, needing maintainer review:

  • Phase 2 now ships four binaries, matching Phase 1. The producer's ordinary artifact list and release-cohort.json drop the three Axum rows; the cohort file is restored byte-for-byte from the frozen design's four rows. An Axum row is now refused as unknown.
  • Phase 1 removed its Rust source audit and post-publish re-download; Phase 2 follows. The audit allowance for the checked JS inventory went with it.
  • The publisher verifies the rebuild check against the Fastly provenance bundle before creating the release, alongside every binary's bundles.
  • Phase 1's compatibility record is deleted; Phase 2's sections from it now live in its integration plan. The implementation plan link points to the frozen copy.
  • The actions.github.io allowlist entry returns, because the producer and the CLI release policy pin the GitHub Actions build-type URI.
  • Phase 2's new guards in phase1-build.sh exit explicitly, like Phase 1's.

Earlier merge decisions still standing:

  • Phase 1 removed the pull_request trigger from release.yml, so pull requests no longer run the two-build Fastly comparison. It runs on every push to main (adding a second Fastly build and comparison there) and on tags.
  • release-policy.json, release-tools.json and release-index-v1.schema.json are kept: the release crate compiles them in.
  • The CLI build script emits trusted_server_release_build, only from TRUSTED_SERVER__RELEASE_BUILD; core's build script still owns validation. Release ts binaries use it to drop the build-checkout fallback for JS resources.
  • The signing job sets up the pinned Node version, read by the checks job, before its inline validation.

Allowlist changes needing maintainer review: exact json-schema.org, spdx.org and actions.github.io entries, with justification and rejection tests; four per-line api.github.com suppressions, no wildcard/global API-host entry.

Outside-scope CI fix (mirrors main #1454): separate 886cf333a pins only the browser runner to Ubuntu 24.04 with the same comment; later merges retain the upstream fix.

🤖 Generated with Claude Code

Port the remaining slice 2.3 resource-discovery change from #1262 at 122b786. Preserve the build facts already carried in #1435.

Verify the three pure filesystem tests in development and release-build configurations with exact-name selection guards. CLI clippy, Rust formatting, domain lint and independent review pass.
Record Gate 1 for user approval: real A/B comparison and rebuild-check publication preserve Phase 1 identities while qualification remains closed. The narrower ordinary-release assurance claim requires explicit approval before implementation.
Port the closed producer primitives from #1262 at 122b786. Stage the manifest, error variants and fail-closed entrypoint; keep selection, signing and publication unavailable.

Run 49 audited pure tests locally and wire full process tests and strict clippy into existing Linux CI jobs. Carry schemas unchanged with approved exact reference-host entries and rejection coverage. Document required shared dependency upgrades.
@prk-Jr prk-Jr self-assigned this Oct 26, 2026
@prk-Jr
prk-Jr added this pull request to stack #1450 October 26, 2026 11:43
prk-Jr added 23 commits October 26, 2026 17:14
Record the approved merge activation, permanent companion profile contract, direct upload-action identity bridge, rerun rejection and read-only reusable-caller permissions before implementing the adapter.
Port the five remaining slice 2.3 comment/documentation paths from #1262 at 122b786. Runtime configuration and release-source facts already landed in Phase 1; no executable behavior changes.
Begin the separately approved Gate 1 adapter with strict observation shape, closed qualification claims and canonical/reproduction input/environment pairing. Keep the producer entrypoint closed while runtime pin, filesystem, transfer and equality stages remain pending.

Verify red-green observation, root-alias and bounded-diagnostic regressions; 58 audited pure tests, strict producer clippy, formatting and domain lint pass. Independent review approves this staged unit with explicit runtime preconditions.
Extend the approved ordinary adapter with bounded full-byte equality after input pairing and observed digest/size checks. Retain bounded exact mismatch diagnostics without normalized or excluded regions; keep command assembly and qualified paths closed.

Verify red-green equality coverage, custom-section and EOF differences, mutation-after-observation rejection, 62 audited pure tests and strict clippy. Independent review approves the staged comparison unit.
Reuse the reviewed ZIP32 primitive and negative fixtures from #1262 at 122b786 without moving collection authority into Phase 2. Enforce exact build/observation member sets and source-owned bounds before the original full integrity checks.

Verify red-green profile admission, 71 audited pure tests, strict clippy and an exact-ID read-only probe of the current Fastly archive against its recorded GitHub digest. Independent/security review approves this structural unit; transfer authentication remains pending.
Preserve the incoming main integration, HTML EOF checks and corrected Axum bind diagnostics alongside the reviewed Phase 2 producer work. Resolve the compatibility audit by retaining the diagnostic correction and fresh-rehearsal requirement together with the approved rebuild-check profile and activation notes.
Carry the frozen inspection implementation from 122b786. Render the future recipe reference as inline code until its module lands. Keep release commands closed.
Carry the approved Phase 2 source and staged evidence-test splits from 122b786. Validate all seven ordinary cohort rows while preserving four closed controlled destination contracts. Keep qualified selectors and release execution closed.
Implement the approved Gate 1 canonical source recipe and consumed-output hashing. Use the reviewed Cargo message parser from 122b786 without constructing qualified receipts or enabling release commands.
Carry the reviewed preparation helpers from 122b786 while preserving fresh ordinary npm output. Keep the lifecycle observer unchanged at esbuild 0.27.3, document the current-lock gap, and visibly disable its full collector fixture with an enabling guard. Retain newer npm dependency versions and run subprocess fixtures only in CI.
Carry the remaining reviewed prose and formatting hunks from 122b786. Preserve current runtime changes and describe immutable release metadata without claiming a signed index. Cloudflare shell diagnostics remain identical to its pre-existing baseline.
@prk-Jr

prk-Jr commented Oct 28, 2026

Copy link
Copy Markdown
Collaborator Author

Rehearsal .18 — repeated ARM64 hosted-runner acquisition failure

The source rehearsed by both tags is 36454c5 on Phase 1 base 4940928. The later documentation-only PR head 5163241 records the open gate; these tag runs do not attest that later head. All four IAB workflow runs for source 36454c5 completed successfully: 29 successful checks and four expected skips. Hosted macOS producer supervision passed all 45 selected tests; Linux producer unit tests passed 952 with nine explicitly ignored tests, boundary integration passed three, command integration passed 18, and the explicit comparison-failure sentinel passed.

Fresh fork rehearsals v0.0.0-rehearsal.17 (https://github.com/prk-Jr/trusted-server/actions/runs/40710926728) and v0.0.0-rehearsal.18 (https://github.com/prk-Jr/trusted-server/actions/runs/40714430928) both hit the same external blocker: the ARM macOS CLI job never acquired a hosted runner. The check annotations report “The job was not acquired by Runner of type hosted even after multiple attempts” and macOS arm64 capacity constraints. No steps ran for those ARM jobs. Rehearsal .17 settled with nine successful jobs, one cancelled job, and two expected skips for signing and release. Rehearsal .18 settled with the same nine successful jobs, one cancelled job, and two skips for signing and release. Neither tag has a published or draft release.

Both lightweight tags remain at the reviewed source commit. No workflow rerun, tag reuse, deletion, retargeting, or settings change was performed. Fresh immutable-publication, attestation and exact-release runtime verification remains pending a successful new rehearsal; the earlier .16 evidence remains historical and is not evidence for the new process cleanup change. The PR remains draft.

No .19 attempt is queued. A fresh successful seven-binary rehearsal remains the release-readiness gate once hosted ARM64 capacity is available; no cohort or verification requirement is waived. The original .16 exact-runtime evidence gap is separately closed: #1449 (comment)

@prk-Jr

prk-Jr commented Oct 29, 2026

Copy link
Copy Markdown
Collaborator Author

Rehearsal .19 — hosted ARM64 runner acquisition failure

Exact reviewed source: 5163241b947b1aa335987bd832b9205e4364e4bb; Phase 1 base: 4940928e800fed00e4bddd8f3727fb52dcb2b296. Current-head IAB CI remains 29 successful checks and four expected skips.

Final fork run 40726649596: 9 successful jobs, 1 cancelled job, 2 skipped jobs. Six binary builds, the second Fastly build and complete-byte comparison passed. The ARM64 macOS CLI job executed zero steps and never acquired a runner. Its annotations say “The job was not acquired by Runner of type hosted even after multiple attempts” and cite macOS ARM64 capacity constraints.

Signing and publication were skipped. Read-only checks found no draft or published .19 release and no leftover drafts. Consequently, published-asset, attestation and exact-release runtime verification could not run; no successful rehearsal is claimed. The lightweight .19 tag remains at the exact source above, untouched. No source, runner, cohort or settings changes were made.

The .16 runtime supplement remains historical evidence for 5fa3843364f247fdc261c438ab9257323637a42c only. The sole readiness gate remains a successful fresh seven-binary rehearsal and its full published-byte verification. Keep this PR draft, with no reviewers requested.

@prk-Jr

prk-Jr commented Oct 29, 2026

Copy link
Copy Markdown
Collaborator Author

Phase 2 exact-head rehearsal .20 — transcript 1/3

Source 5163241b947b1aa335987bd832b9205e4364e4bb; successful first-attempt fork run 40812416995. Tag v0.0.0-rehearsal.20, seven binaries / 30 immutable prerelease assets.

Rehearsal .20 passed at exact reviewed source 5163241b947b1aa335987bd832b9205e4364e4bb — first attempt, all 18 jobs successful. Seven binaries and 30 immutable prerelease assets, not Latest. This closes the successful current-implementation release rehearsal gate at that source. Keep #1449 draft; no reviewers requested. No IAB tag, release or settings changes. Historical .16/.17/.18/.19 records keep their original source/result attribution.

Verification summary:

  • Downloaded using the documented gh release download; verified immutable release membership and all 30 assets; API sizes/digests and 29 SHA256SUMS entries match the downloaded bytes. Published readback confirms all 30 files equal the signed handoff.
  • All seven binaries: provenance and SPDX, online without bundles and offline with published bundles/custom trusted roots. 28 binary mode/predicate checks and 56 signer identity invocations passed. Workflow-prefix and exact tag certificate identities were checked separately, with source ref/digest and signer digest, predicate, repository and hosted-runner constraints retained. All 30 verified binary/companion certificate result sets also pass explicit exact source-repository/ref/digest, signer-digest and runner-environment checks.
  • 14 SPDX equalities passed. Online equality uses jq -e --slurpfile document ... 'any(.[]; .verificationResult.statement.predicate == $document[0])' only after successful pinned verification; one-byte-changed valid JSON and empty-result controls both fail as required. Published offline bundles retain their exactly-one-result check.
  • Fastly rebuild-check provenance passed both online and offline, with both signer identities; exact source/binary/SPDX/recipe/lock/producing-job/upload/API joins pass. Its ordinary profile remains informational, with release_qualification:false.
  • Seven hosted native/format smokes, both macOS minimum OS 13.0 checks, CLI source-version output, Axum non-loopback and invalid-port checks, and checksum-pinned Fastly CLI 16 packaging/validation/archive inspection/byte comparisons passed. Canonical 362s; second Fastly build 282s; comparison 122s, overlapping native work.
  • Exact published WASM SHA-256 4fe7204f17df07a392f4e4b64f31eebf3b02179e57abee689ab0094990d0a572 ran under pinned Viceroy 0.21.0: three publisher responses plus injected JS returned 200 with full source headers; origin observed exactly three requests. Captured request/origin-response log records: 6/6 (logger forwards to endpoint and echoes stdout); build-facts lines: zero. Wrong-source and copied-log sensitivity controls passed; owned listeners stopped. Local Viceroy scope only: no deployed Fastly or browser-runtime claim.

Tool archive checksum validation (recomputed while preparing this record):

GitHub CLI 2.102.0 macOS ARM64 ZIP: SHA-256 da922c20d1792e5b2cbf375593d7a658acf034c12c84e007e71c76ef959c337e — matches the official pinned checksum
Node 24.20.0 Darwin ARM64 archive: SHA-256 40e5607e5ecb3db9192723776da2d75d966260fc74a7a9e731c1bd67dda96bc8 — matches the official pinned checksum
Viceroy 0.21.0 Darwin ARM64 archive: SHA-256 4ae726cf9686c77d16bf2b45db54cc2d295af746ff07a52e20342f4e2b40a8bc — matches the official pinned checksum

Exact published inventory (30 files):

SHA256SUMS	3294 bytes	sha256:86c22940956c7b3b88663c6ed8c8a667f0b2054edbfff76be23005a7f954cf6d
trusted-server-axum-aarch64-unknown-linux-gnu	137729280 bytes	sha256:9bb60b7890a275271efc5733634c093129cb2f8e4d9d754ed7daffd482511356
trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json	11506 bytes	sha256:f198e3eb7c66268fc618dff1ad701208a26118e4703287f091cf4333367572cb
trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json	797199 bytes	sha256:e672b55c691f68913c2f187e1df476ebf9b8108b63df7ada04c435372efc8f82
trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json	766910 bytes	sha256:166bf7c0abf0b791c5148a31b1d108744d1070ea770bcf41f310eb20e39fcc1b
trusted-server-axum-x86_64-unknown-linux-gnu	137532296 bytes	sha256:0622e7205955fa1d13a9c6b8cd86c18858c41bd366917a49bf2c8ca27bb6e54c
trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json	11447 bytes	sha256:895cbe21bf81a84bf1476bc99942135b3bcf1a50dc404413f1f4997bf1890196
trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json	798796 bytes	sha256:48ff42e75d16926d33b4d2732341d17ec5bc8865e870bdbf2f2327194544f65a
trusted-server-axum-x86_64-unknown-linux-gnu.spdx.json	768529 bytes	sha256:afe89f5a0e05e60c94558001f09ba829b256462273de32e2ef27e608cc274b86
trusted-server-axum-x86_64-unknown-linux-musl	136875880 bytes	sha256:905e8510268addbc95d83c6210468423120d0798e39bde77b9c4d730d270e339
trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json	11455 bytes	sha256:63c6f19403ce81832a0b4b1373fa26170eda95ef5c971c7dd654820858fa9ff4
trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json	798816 bytes	sha256:c15622144af0a8f595eb2bc594da64d3bb9b81b225cdd00cca2e833124267e29
trusted-server-axum-x86_64-unknown-linux-musl.spdx.json	768532 bytes	sha256:89df23f4643cf6fe927337147c0a5527b5a51df06648b6d89c6c21ac179a78d3
trusted-server-fastly.wasm	80207071 bytes	sha256:4fe7204f17df07a392f4e4b64f31eebf3b02179e57abee689ab0094990d0a572
trusted-server-fastly.wasm.provenance.sigstore.json	11540 bytes	sha256:1d4c6f19741ce8454b17b81e426e5ba7bcac3ae2d2eaf6747d3ff0a7cd84fde3
trusted-server-fastly.wasm.rebuild-check.json	2897 bytes	sha256:8fa32e3a674662160fdfb895fb01ae7dc45ffb1b496bb8a311cc764c2c85cb2e
trusted-server-fastly.wasm.sbom.sigstore.json	764108 bytes	sha256:4ff0373dead149f69e78368fc2eef3f8c1edaa04abbbf1ff2e15246b5a2898a5
trusted-server-fastly.wasm.spdx.json	734462 bytes	sha256:f9340b38c8ddfe199a393859f6bca8972f8b42e6be33f7a3a1513d69dd656d50
ts-aarch64-apple-darwin	41087408 bytes	sha256:8446cd69d66bea4e6e600899ee84139e8f429183bbc0a6b3861eb14ef6c934b0
ts-aarch64-apple-darwin.provenance.sigstore.json	11340 bytes	sha256:e271f1d1234ce84b610fb35e85ac4c4dcadc2846b371b8c4ae64c11fc55c232f
ts-aarch64-apple-darwin.sbom.sigstore.json	990063 bytes	sha256:9f7abf17aa284513d42449ec98ec318ef6ffa7dfcc4f4df8238d26016925790b
ts-aarch64-apple-darwin.spdx.json	957352 bytes	sha256:5f3de43658050b81a18db1966ae468855a6c03699eb62a64637a2f5446aa2235
ts-x86_64-apple-darwin	43806768 bytes	sha256:3a10a5c377149e37f32bba8804db7d0601a8d69c61741cfe6b2669855cca4bd8
ts-x86_64-apple-darwin.provenance.sigstore.json	11336 bytes	sha256:16dba2ce423a929a8216da0ca10672231895175e7b40aae342ac4aaf38c678f2
ts-x86_64-apple-darwin.sbom.sigstore.json	990791 bytes	sha256:2478b85de37689c7eaa8ff978772d805658292386cb2705436039384a0fc5fd8
ts-x86_64-apple-darwin.spdx.json	958083 bytes	sha256:d6283295993c71733e4ecacbccc391b62d67efe4d9824f184daef4e4fb9dd74c
ts-x86_64-unknown-linux-gnu	300958128 bytes	sha256:8d1277f8ef06e867294111d910af720d576fb5d847cdde66f412415917656ae5
ts-x86_64-unknown-linux-gnu.provenance.sigstore.json	11266 bytes	sha256:26b59039273d5106ed2b7b904b6be8c8a92367f37aef94ef0ba3d5cef58d64e4
ts-x86_64-unknown-linux-gnu.sbom.sigstore.json	990207 bytes	sha256:56f3b15bf445b2d98d4c4f71d924ad383f8dea39cc802173c5a312f8318fcf11
ts-x86_64-unknown-linux-gnu.spdx.json	957428 bytes	sha256:d30024ee9966d380ae73d00309b895b5fbb23cd63dcbd1e50e7979c1c21005f6

The following is the actual command/output transcript; private temporary roots are replaced with shell-style placeholders. JSON-formatted verification results were retained privately; the transcript includes their explicit boolean policy/equality results.

$ gh api repos/prk-Jr/trusted-server/actions/runs/40812416995 > run.json
true
$ gh api --paginate --slurp repos/prk-Jr/trusted-server/actions/runs/40812416995/jobs\?per_page=100 > jobs-pages.json
$ gh api --paginate --slurp repos/prk-Jr/trusted-server/actions/runs/40812416995/artifacts\?per_page=100 > artifact-pages.json
PASS: exact reviewed head; first attempt; all 18 jobs successful
$ gh run view 40812416995 --repo prk-Jr/trusted-server --log > all-job-logs.txt
$ gh api repos/prk-Jr/trusted-server/releases/tags/v0.0.0-rehearsal.20 > release.json
$ gh api repos/prk-Jr/trusted-server/releases/latest > latest.json
$ jq -e --arg tag v0.0.0-rehearsal.20 .tag_name\!=\$tag latest.json
true
$ gh --version
gh version 2.102.0 (2026-09-30)
https://github.com/cli/cli/releases/tag/v2.102.0
$ gh attestation trusted-root > trusted_root.jsonl
$ shasum -a 256 trusted_root.jsonl
65ca537f6ed8a47fd0e560c421baa1f6c1efb8b25fc200d8c5c02c0e92eb2b9c  trusted_root.jsonl
$ gh release download v0.0.0-rehearsal.20 --repo prk-Jr/trusted-server --dir .
$ node ../check-assets.mjs
PASS: exact 30 immutable prerelease assets; every API size and digest equals downloaded bytes; SHA256SUMS covers exactly the other 29; all seven SPDX roots have exact name/tag/binary digest
$ gh release verify v0.0.0-rehearsal.20 --repo prk-Jr/trusted-server
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API
✓ Release v0.0.0-rehearsal.20 verified!

Assets
SHA256SUMS	sha256:86c22940956c7b3b88663c6ed8c8a667f0b2054edbfff76be23005a7f954cf6d
trusted-server-axum-aarch64-unknown-linux-gnu	sha256:9bb60b7890a275271efc5733634c093129cb2f8e4d9d754ed7daffd482511356
trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json	sha256:f198e3eb7c66268fc618dff1ad701208a26118e4703287f091cf4333367572cb
trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json	sha256:e672b55c691f68913c2f187e1df476ebf9b8108b63df7ada04c435372efc8f82
trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json	sha256:166bf7c0abf0b791c5148a31b1d108744d1070ea770bcf41f310eb20e39fcc1b
trusted-server-axum-x86_64-unknown-linux-gnu	sha256:0622e7205955fa1d13a9c6b8cd86c18858c41bd366917a49bf2c8ca27bb6e54c
trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json	sha256:895cbe21bf81a84bf1476bc99942135b3bcf1a50dc404413f1f4997bf1890196
trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json	sha256:48ff42e75d16926d33b4d2732341d17ec5bc8865e870bdbf2f2327194544f65a
trusted-server-axum-x86_64-unknown-linux-gnu.spdx.json	sha256:afe89f5a0e05e60c94558001f09ba829b256462273de32e2ef27e608cc274b86
trusted-server-axum-x86_64-unknown-linux-musl	sha256:905e8510268addbc95d83c6210468423120d0798e39bde77b9c4d730d270e339
trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json	sha256:63c6f19403ce81832a0b4b1373fa26170eda95ef5c971c7dd654820858fa9ff4
trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json	sha256:c15622144af0a8f595eb2bc594da64d3bb9b81b225cdd00cca2e833124267e29
trusted-server-axum-x86_64-unknown-linux-musl.spdx.json	sha256:89df23f4643cf6fe927337147c0a5527b5a51df06648b6d89c6c21ac179a78d3
trusted-server-fastly.wasm	sha256:4fe7204f17df07a392f4e4b64f31eebf3b02179e57abee689ab0094990d0a572
trusted-server-fastly.wasm.provenance.sigstore.json	sha256:1d4c6f19741ce8454b17b81e426e5ba7bcac3ae2d2eaf6747d3ff0a7cd84fde3
trusted-server-fastly.wasm.rebuild-check.json	sha256:8fa32e3a674662160fdfb895fb01ae7dc45ffb1b496bb8a311cc764c2c85cb2e
trusted-server-fastly.wasm.sbom.sigstore.json	sha256:4ff0373dead149f69e78368fc2eef3f8c1edaa04abbbf1ff2e15246b5a2898a5
trusted-server-fastly.wasm.spdx.json	sha256:f9340b38c8ddfe199a393859f6bca8972f8b42e6be33f7a3a1513d69dd656d50
ts-aarch64-apple-darwin	sha256:8446cd69d66bea4e6e600899ee84139e8f429183bbc0a6b3861eb14ef6c934b0
ts-aarch64-apple-darwin.provenance.sigstore.json	sha256:e271f1d1234ce84b610fb35e85ac4c4dcadc2846b371b8c4ae64c11fc55c232f
ts-aarch64-apple-darwin.sbom.sigstore.json	sha256:9f7abf17aa284513d42449ec98ec318ef6ffa7dfcc4f4df8238d26016925790b
ts-aarch64-apple-darwin.spdx.json	sha256:5f3de43658050b81a18db1966ae468855a6c03699eb62a64637a2f5446aa2235
ts-x86_64-apple-darwin	sha256:3a10a5c377149e37f32bba8804db7d0601a8d69c61741cfe6b2669855cca4bd8
ts-x86_64-apple-darwin.provenance.sigstore.json	sha256:16dba2ce423a929a8216da0ca10672231895175e7b40aae342ac4aaf38c678f2
ts-x86_64-apple-darwin.sbom.sigstore.json	sha256:2478b85de37689c7eaa8ff978772d805658292386cb2705436039384a0fc5fd8
ts-x86_64-apple-darwin.spdx.json	sha256:d6283295993c71733e4ecacbccc391b62d67efe4d9824f184daef4e4fb9dd74c
ts-x86_64-unknown-linux-gnu	sha256:8d1277f8ef06e867294111d910af720d576fb5d847cdde66f412415917656ae5
ts-x86_64-unknown-linux-gnu.provenance.sigstore.json	sha256:26b59039273d5106ed2b7b904b6be8c8a92367f37aef94ef0ba3d5cef58d64e4
ts-x86_64-unknown-linux-gnu.sbom.sigstore.json	sha256:56f3b15bf445b2d98d4c4f71d924ad383f8dea39cc802173c5a312f8318fcf11
ts-x86_64-unknown-linux-gnu.spdx.json	sha256:d30024ee9966d380ae73d00309b895b5fbb23cd63dcbd1e50e7979c1c21005f6

$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-fastly.wasm --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm: sha256:4fe7204f17df07a392f4e4b64f31eebf3b02179e57abee689ab0094990d0a572
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-fastly.wasm.spdx.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.spdx.json: sha256:f9340b38c8ddfe199a393859f6bca8972f8b42e6be33f7a3a1513d69dd656d50
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.spdx.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-fastly.wasm.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.provenance.sigstore.json: sha256:1d4c6f19741ce8454b17b81e426e5ba7bcac3ae2d2eaf6747d3ff0a7cd84fde3
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.provenance.sigstore.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-fastly.wasm.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.sbom.sigstore.json: sha256:4ff0373dead149f69e78368fc2eef3f8c1edaa04abbbf1ff2e15246b5a2898a5
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.sbom.sigstore.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 ts-aarch64-apple-darwin --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin: sha256:8446cd69d66bea4e6e600899ee84139e8f429183bbc0a6b3861eb14ef6c934b0
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 ts-aarch64-apple-darwin.spdx.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.spdx.json: sha256:5f3de43658050b81a18db1966ae468855a6c03699eb62a64637a2f5446aa2235
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.spdx.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 ts-aarch64-apple-darwin.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.provenance.sigstore.json: sha256:e271f1d1234ce84b610fb35e85ac4c4dcadc2846b371b8c4ae64c11fc55c232f
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.provenance.sigstore.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 ts-aarch64-apple-darwin.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.sbom.sigstore.json: sha256:9f7abf17aa284513d42449ec98ec318ef6ffa7dfcc4f4df8238d26016925790b
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.sbom.sigstore.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 ts-x86_64-apple-darwin --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-apple-darwin: sha256:3a10a5c377149e37f32bba8804db7d0601a8d69c61741cfe6b2669855cca4bd8
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 ts-x86_64-apple-darwin.spdx.json --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-apple-darwin.spdx.json: sha256:d6283295993c71733e4ecacbccc391b62d67efe4d9824f184daef4e4fb9dd74c
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.spdx.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 ts-x86_64-apple-darwin.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-apple-darwin.provenance.sigstore.json: sha256:16dba2ce423a929a8216da0ca10672231895175e7b40aae342ac4aaf38c678f2
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.provenance.sigstore.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 ts-x86_64-apple-darwin.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-apple-darwin.sbom.sigstore.json: sha256:2478b85de37689c7eaa8ff978772d805658292386cb2705436039384a0fc5fd8
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.sbom.sigstore.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-unknown-linux-gnu: sha256:8d1277f8ef06e867294111d910af720d576fb5d847cdde66f412415917656ae5
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 ts-x86_64-unknown-linux-gnu.spdx.json --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-unknown-linux-gnu.spdx.json: sha256:d30024ee9966d380ae73d00309b895b5fbb23cd63dcbd1e50e7979c1c21005f6
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.spdx.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-unknown-linux-gnu.provenance.sigstore.json: sha256:26b59039273d5106ed2b7b904b6be8c8a92367f37aef94ef0ba3d5cef58d64e4
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.provenance.sigstore.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-unknown-linux-gnu.sbom.sigstore.json: sha256:56f3b15bf445b2d98d4c4f71d924ad383f8dea39cc802173c5a312f8318fcf11
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.sbom.sigstore.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-x86_64-unknown-linux-gnu: sha256:0622e7205955fa1d13a9c6b8cd86c18858c41bd366917a49bf2c8ca27bb6e54c
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-x86_64-unknown-linux-gnu is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-axum-x86_64-unknown-linux-gnu.spdx.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-x86_64-unknown-linux-gnu.spdx.json: sha256:afe89f5a0e05e60c94558001f09ba829b256462273de32e2ef27e608cc274b86
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-x86_64-unknown-linux-gnu.spdx.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json: sha256:895cbe21bf81a84bf1476bc99942135b3bcf1a50dc404413f1f4997bf1890196
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json: sha256:48ff42e75d16926d33b4d2732341d17ec5bc8865e870bdbf2f2327194544f65a
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-x86_64-unknown-linux-musl: sha256:905e8510268addbc95d83c6210468423120d0798e39bde77b9c4d730d270e339
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-x86_64-unknown-linux-musl is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-axum-x86_64-unknown-linux-musl.spdx.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-x86_64-unknown-linux-musl.spdx.json: sha256:89df23f4643cf6fe927337147c0a5527b5a51df06648b6d89c6c21ac179a78d3
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-x86_64-unknown-linux-musl.spdx.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json: sha256:63c6f19403ce81832a0b4b1373fa26170eda95ef5c971c7dd654820858fa9ff4
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json: sha256:c15622144af0a8f595eb2bc594da64d3bb9b81b225cdd00cca2e833124267e29
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-aarch64-unknown-linux-gnu: sha256:9bb60b7890a275271efc5733634c093129cb2f8e4d9d754ed7daffd482511356
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-aarch64-unknown-linux-gnu is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json: sha256:166bf7c0abf0b791c5148a31b1d108744d1070ea770bcf41f310eb20e39fcc1b
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json: sha256:f198e3eb7c66268fc618dff1ad701208a26118e4703287f091cf4333367572cb
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json: sha256:e672b55c691f68913c2f187e1df476ebf9b8108b63df7ada04c435372efc8f82
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 trusted-server-fastly.wasm.rebuild-check.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.rebuild-check.json: sha256:8fa32e3a674662160fdfb895fb01ae7dc45ffb1b496bb8a311cc764c2c85cb2e
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.rebuild-check.json is present in release v0.0.0-rehearsal.20
$ gh release verify-asset v0.0.0-rehearsal.20 SHA256SUMS --repo prk-Jr/trusted-server
Calculated digest for SHA256SUMS: sha256:86c22940956c7b3b88663c6ed8c8a667f0b2054edbfff76be23005a7f954cf6d
Resolved tag v0.0.0-rehearsal.20 to sha1:5163241b947b1aa335987bd832b9205e4364e4bb
Loaded attestation from GitHub API

✓ Verification succeeded! SHA256SUMS is present in release v0.0.0-rehearsal.20
$ shasum -a 256 --check SHA256SUMS
trusted-server-axum-x86_64-unknown-linux-gnu: OK
trusted-server-axum-x86_64-unknown-linux-gnu.spdx.json: OK
trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json: OK
trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json: OK
trusted-server-axum-x86_64-unknown-linux-musl: OK
trusted-server-axum-x86_64-unknown-linux-musl.spdx.json: OK
trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json: OK
trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json: OK
trusted-server-axum-aarch64-unknown-linux-gnu: OK
trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json: OK
trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json: OK
trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json: OK
trusted-server-fastly.wasm: OK
trusted-server-fastly.wasm.spdx.json: OK
trusted-server-fastly.wasm.rebuild-check.json: OK
trusted-server-fastly.wasm.provenance.sigstore.json: OK
trusted-server-fastly.wasm.sbom.sigstore.json: OK
ts-aarch64-apple-darwin: OK
ts-aarch64-apple-darwin.spdx.json: OK
ts-aarch64-apple-darwin.provenance.sigstore.json: OK
ts-aarch64-apple-darwin.sbom.sigstore.json: OK
ts-x86_64-apple-darwin: OK
ts-x86_64-apple-darwin.spdx.json: OK
ts-x86_64-apple-darwin.provenance.sigstore.json: OK
ts-x86_64-apple-darwin.sbom.sigstore.json: OK
ts-x86_64-unknown-linux-gnu: OK
ts-x86_64-unknown-linux-gnu.spdx.json: OK
ts-x86_64-unknown-linux-gnu.provenance.sigstore.json: OK
ts-x86_64-unknown-linux-gnu.sbom.sigstore.json: OK
$ shasum -a 256 --check ../APPROVED_BINARY_AND_COMPANION_SHA256SUMS
trusted-server-fastly.wasm: OK
ts-aarch64-apple-darwin: OK
ts-x86_64-apple-darwin: OK
ts-x86_64-unknown-linux-gnu: OK
trusted-server-axum-x86_64-unknown-linux-gnu: OK
trusted-server-axum-x86_64-unknown-linux-musl: OK
trusted-server-axum-aarch64-unknown-linux-gnu: OK
trusted-server-fastly.wasm.rebuild-check.json: OK
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle trusted-server-fastly.wasm.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle trusted-server-fastly.wasm.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-fastly.wasm.offline-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-fastly.wasm.offline-provenance.json
true
PASS: trusted-server-fastly.wasm offline provenance; both workflow and exact tag certificate identities with all source/signer pins
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-fastly.wasm.online-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-fastly.wasm.online-provenance.json
true
PASS: trusted-server-fastly.wasm online provenance; both workflow and exact tag certificate identities with all source/signer pins
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --bundle trusted-server-fastly.wasm.sbom.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --bundle trusted-server-fastly.wasm.sbom.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-fastly.wasm.offline-sbom.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-fastly.wasm.offline-sbom.json
true
PASS: trusted-server-fastly.wasm offline sbom; both workflow and exact tag certificate identities with all source/signer pins
$ jq -e --slurpfile document trusted-server-fastly.wasm.spdx.json length\ ==\ 1\ and\ .\[0\].verificationResult.statement.predicate\ ==\ \$document\[0\] ../trusted-server-fastly.wasm.offline-sbom.json
true
PASS: trusted-server-fastly.wasm offline verified SBOM predicate equals published SPDX
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-fastly.wasm.online-sbom.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-fastly.wasm.online-sbom.json
true
PASS: trusted-server-fastly.wasm online sbom; both workflow and exact tag certificate identities with all source/signer pins
$ jq -e --slurpfile document trusted-server-fastly.wasm.spdx.json any\(.\[\]\;\ .verificationResult.statement.predicate\ ==\ \$document\[0\]\) ../trusted-server-fastly.wasm.online-sbom.json
true
PASS: trusted-server-fastly.wasm online verified SBOM predicate equals published SPDX
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../ts-aarch64-apple-darwin.offline-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../ts-aarch64-apple-darwin.offline-provenance.json
true
PASS: ts-aarch64-apple-darwin offline provenance; both workflow and exact tag certificate identities with all source/signer pins
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../ts-aarch64-apple-darwin.online-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../ts-aarch64-apple-darwin.online-provenance.json
true
PASS: ts-aarch64-apple-darwin online provenance; both workflow and exact tag certificate identities with all source/signer pins
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../ts-aarch64-apple-darwin.offline-sbom.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../ts-aarch64-apple-darwin.offline-sbom.json
true
PASS: ts-aarch64-apple-darwin offline sbom; both workflow and exact tag certificate identities with all source/signer pins
$ jq -e --slurpfile document ts-aarch64-apple-darwin.spdx.json length\ ==\ 1\ and\ .\[0\].verificationResult.statement.predicate\ ==\ \$document\[0\] ../ts-aarch64-apple-darwin.offline-sbom.json
true
PASS: ts-aarch64-apple-darwin offline verified SBOM predicate equals published SPDX
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../ts-aarch64-apple-darwin.online-sbom.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../ts-aarch64-apple-darwin.online-sbom.json
true
PASS: ts-aarch64-apple-darwin online sbom; both workflow and exact tag certificate identities with all source/signer pins
$ jq -e --slurpfile document ts-aarch64-apple-darwin.spdx.json any\(.\[\]\;\ .verificationResult.statement.predicate\ ==\ \$document\[0\]\) ../ts-aarch64-apple-darwin.online-sbom.json
true
PASS: ts-aarch64-apple-darwin online verified SBOM predicate equals published SPDX
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../ts-x86_64-apple-darwin.offline-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../ts-x86_64-apple-darwin.offline-provenance.json
true
PASS: ts-x86_64-apple-darwin offline provenance; both workflow and exact tag certificate identities with all source/signer pins
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../ts-x86_64-apple-darwin.online-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../ts-x86_64-apple-darwin.online-provenance.json
true
PASS: ts-x86_64-apple-darwin online provenance; both workflow and exact tag certificate identities with all source/signer pins
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../ts-x86_64-apple-darwin.offline-sbom.json

@prk-Jr

prk-Jr commented Oct 29, 2026

Copy link
Copy Markdown
Collaborator Author

Phase 2 exact-head rehearsal .20 — transcript 2/3

Source 5163241b947b1aa335987bd832b9205e4364e4bb; successful first-attempt fork run 40812416995. Tag v0.0.0-rehearsal.20, seven binaries / 30 immutable prerelease assets.

Continued actual verification transcript; full source/tag pins are unchanged.

$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../ts-x86_64-apple-darwin.offline-sbom.json
true
PASS: ts-x86_64-apple-darwin offline sbom; both workflow and exact tag certificate identities with all source/signer pins
$ jq -e --slurpfile document ts-x86_64-apple-darwin.spdx.json length\ ==\ 1\ and\ .\[0\].verificationResult.statement.predicate\ ==\ \$document\[0\] ../ts-x86_64-apple-darwin.offline-sbom.json
true
PASS: ts-x86_64-apple-darwin offline verified SBOM predicate equals published SPDX
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../ts-x86_64-apple-darwin.online-sbom.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../ts-x86_64-apple-darwin.online-sbom.json
true
PASS: ts-x86_64-apple-darwin online sbom; both workflow and exact tag certificate identities with all source/signer pins
$ jq -e --slurpfile document ts-x86_64-apple-darwin.spdx.json any\(.\[\]\;\ .verificationResult.statement.predicate\ ==\ \$document\[0\]\) ../ts-x86_64-apple-darwin.online-sbom.json
true
PASS: ts-x86_64-apple-darwin online verified SBOM predicate equals published SPDX
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../ts-x86_64-unknown-linux-gnu.offline-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../ts-x86_64-unknown-linux-gnu.offline-provenance.json
true
PASS: ts-x86_64-unknown-linux-gnu offline provenance; both workflow and exact tag certificate identities with all source/signer pins
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../ts-x86_64-unknown-linux-gnu.online-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../ts-x86_64-unknown-linux-gnu.online-provenance.json
true
PASS: ts-x86_64-unknown-linux-gnu online provenance; both workflow and exact tag certificate identities with all source/signer pins
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../ts-x86_64-unknown-linux-gnu.offline-sbom.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../ts-x86_64-unknown-linux-gnu.offline-sbom.json
true
PASS: ts-x86_64-unknown-linux-gnu offline sbom; both workflow and exact tag certificate identities with all source/signer pins
$ jq -e --slurpfile document ts-x86_64-unknown-linux-gnu.spdx.json length\ ==\ 1\ and\ .\[0\].verificationResult.statement.predicate\ ==\ \$document\[0\] ../ts-x86_64-unknown-linux-gnu.offline-sbom.json
true
PASS: ts-x86_64-unknown-linux-gnu offline verified SBOM predicate equals published SPDX
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../ts-x86_64-unknown-linux-gnu.online-sbom.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../ts-x86_64-unknown-linux-gnu.online-sbom.json
true
PASS: ts-x86_64-unknown-linux-gnu online sbom; both workflow and exact tag certificate identities with all source/signer pins
$ jq -e --slurpfile document ts-x86_64-unknown-linux-gnu.spdx.json any\(.\[\]\;\ .verificationResult.statement.predicate\ ==\ \$document\[0\]\) ../ts-x86_64-unknown-linux-gnu.online-sbom.json
true
PASS: ts-x86_64-unknown-linux-gnu online verified SBOM predicate equals published SPDX
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-axum-x86_64-unknown-linux-gnu.offline-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-axum-x86_64-unknown-linux-gnu.offline-provenance.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu offline provenance; both workflow and exact tag certificate identities with all source/signer pins
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-axum-x86_64-unknown-linux-gnu.online-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-axum-x86_64-unknown-linux-gnu.online-provenance.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu online provenance; both workflow and exact tag certificate identities with all source/signer pins
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --bundle trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --bundle trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-axum-x86_64-unknown-linux-gnu.offline-sbom.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-axum-x86_64-unknown-linux-gnu.offline-sbom.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu offline sbom; both workflow and exact tag certificate identities with all source/signer pins
$ jq -e --slurpfile document trusted-server-axum-x86_64-unknown-linux-gnu.spdx.json length\ ==\ 1\ and\ .\[0\].verificationResult.statement.predicate\ ==\ \$document\[0\] ../trusted-server-axum-x86_64-unknown-linux-gnu.offline-sbom.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu offline verified SBOM predicate equals published SPDX
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-axum-x86_64-unknown-linux-gnu.online-sbom.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-axum-x86_64-unknown-linux-gnu.online-sbom.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu online sbom; both workflow and exact tag certificate identities with all source/signer pins
$ jq -e --slurpfile document trusted-server-axum-x86_64-unknown-linux-gnu.spdx.json any\(.\[\]\;\ .verificationResult.statement.predicate\ ==\ \$document\[0\]\) ../trusted-server-axum-x86_64-unknown-linux-gnu.online-sbom.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu online verified SBOM predicate equals published SPDX
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-axum-x86_64-unknown-linux-musl.offline-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-axum-x86_64-unknown-linux-musl.offline-provenance.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl offline provenance; both workflow and exact tag certificate identities with all source/signer pins
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-axum-x86_64-unknown-linux-musl.online-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-axum-x86_64-unknown-linux-musl.online-provenance.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl online provenance; both workflow and exact tag certificate identities with all source/signer pins
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --bundle trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --bundle trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-axum-x86_64-unknown-linux-musl.offline-sbom.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-axum-x86_64-unknown-linux-musl.offline-sbom.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl offline sbom; both workflow and exact tag certificate identities with all source/signer pins
$ jq -e --slurpfile document trusted-server-axum-x86_64-unknown-linux-musl.spdx.json length\ ==\ 1\ and\ .\[0\].verificationResult.statement.predicate\ ==\ \$document\[0\] ../trusted-server-axum-x86_64-unknown-linux-musl.offline-sbom.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl offline verified SBOM predicate equals published SPDX
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-axum-x86_64-unknown-linux-musl.online-sbom.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-axum-x86_64-unknown-linux-musl.online-sbom.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl online sbom; both workflow and exact tag certificate identities with all source/signer pins
$ jq -e --slurpfile document trusted-server-axum-x86_64-unknown-linux-musl.spdx.json any\(.\[\]\;\ .verificationResult.statement.predicate\ ==\ \$document\[0\]\) ../trusted-server-axum-x86_64-unknown-linux-musl.online-sbom.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl online verified SBOM predicate equals published SPDX
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-axum-aarch64-unknown-linux-gnu.offline-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-axum-aarch64-unknown-linux-gnu.offline-provenance.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu offline provenance; both workflow and exact tag certificate identities with all source/signer pins
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-axum-aarch64-unknown-linux-gnu.online-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-axum-aarch64-unknown-linux-gnu.online-provenance.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu online provenance; both workflow and exact tag certificate identities with all source/signer pins
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --bundle trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --bundle trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-axum-aarch64-unknown-linux-gnu.offline-sbom.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-axum-aarch64-unknown-linux-gnu.offline-sbom.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu offline sbom; both workflow and exact tag certificate identities with all source/signer pins
$ jq -e --slurpfile document trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json length\ ==\ 1\ and\ .\[0\].verificationResult.statement.predicate\ ==\ \$document\[0\] ../trusted-server-axum-aarch64-unknown-linux-gnu.offline-sbom.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu offline verified SBOM predicate equals published SPDX
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../trusted-server-axum-aarch64-unknown-linux-gnu.online-sbom.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../trusted-server-axum-aarch64-unknown-linux-gnu.online-sbom.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu online sbom; both workflow and exact tag certificate identities with all source/signer pins
$ jq -e --slurpfile document trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json any\(.\[\]\;\ .verificationResult.statement.predicate\ ==\ \$document\[0\]\) ../trusted-server-axum-aarch64-unknown-linux-gnu.online-sbom.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu online verified SBOM predicate equals published SPDX
$ gh attestation verify trusted-server-fastly.wasm.rebuild-check.json --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle trusted-server-fastly.wasm.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-fastly.wasm.rebuild-check.json --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --bundle trusted-server-fastly.wasm.provenance.sigstore.json --custom-trusted-root ../trusted_root.jsonl --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../companion.offline-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../companion.offline-provenance.json
true
PASS: rebuild-check offline provenance; existing binary commands passed unchanged
$ gh attestation verify trusted-server-fastly.wasm.rebuild-check.json --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
$ gh attestation verify trusted-server-fastly.wasm.rebuild-check.json --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.20 --source-digest 5163241b947b1aa335987bd832b9205e4364e4bb --signer-digest 5163241b947b1aa335987bd832b9205e4364e4bb --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.20 --format json > ../companion.online-provenance.json
$ jq -e --arg repo https://github.com/prk-Jr/trusted-server --arg ref refs/tags/v0.0.0-rehearsal.20 --arg source 5163241b947b1aa335987bd832b9205e4364e4bb length\ \>\ 0\ and\ all\(.\[\]\;\ .verificationResult.signature.certificate.sourceRepositoryURI==\$repo\ and\ .verificationResult.signature.certificate.sourceRepositoryRef==\$ref\ and\ .verificationResult.signature.certificate.sourceRepositoryDigest==\$source\ and\ .verificationResult.signature.certificate.buildSignerDigest==\$source\ and\ .verificationResult.signature.certificate.runnerEnvironment==\"github-hosted\"\) ../companion.online-provenance.json
true
PASS: rebuild-check online provenance; existing binary commands passed unchanged
Prepared one-byte-changed valid SPDX copy; published document unchanged
false
PASS: one-byte-changed SPDX rejected by already-verified online results
false
PASS: empty online results rejected
$ node ../verify-companion-joins.mjs
PASS: canonical artifact API-bound id=12871435870 size=18710584 sha256:1be5782fd708c6c590633e99d2f5de91726d8d3b6e324bf3818095e44fd840b0
PASS: canonical observation_artifact API-bound id=12870553555 size=997 sha256:33b4e5d212e93f790986f137ce8b3cf8874f57b25dd3c6a95d2dabac35c5b131
PASS: canonical job=123245651510 start=2026-10-29T03:30:14Z end=2026-10-29T03:36:16Z observed={"checkout_root":"/home/runner/work/trusted-server/trusted-server/ordinary-canonical-source","jobs":4,"locale":"C","started_at_seconds":1793244725,"target_root":"/home/runner/work/_temp/ordinary-fastly-canonical-target","timezone":"UTC","uid":1001,"umask":18}
PASS: reproduction artifact API-bound id=12871496824 size=18710582 sha256:8ed0286edf8c942b0cfd68ff5bfe8e7b5aee7d875147b526d62d25d0a0276dc6
PASS: reproduction observation_artifact API-bound id=12871417057 size=996 sha256:a4b5c3658e0b758d44409c19a81d4226545b68da12a280a392d96ab828e183ed
PASS: reproduction job=123247706874 start=2026-10-29T03:36:19Z end=2026-10-29T03:41:01Z observed={"checkout_root":"/home/runner/work/trusted-server/trusted-server/ordinary-reproduction-source","jobs":2,"locale":"C","started_at_seconds":1793245059,"target_root":"/home/runner/work/_temp/ordinary-fastly-reproduction-target","timezone":"UTC","uid":1001,"umask":23}
PASS: Build trusted-server-fastly.wasm elapsed 362s
PASS: Reproduce trusted-server-fastly.wasm elapsed 282s
PASS: Compare ordinary Fastly release bytes elapsed 122s
PASS: companion joins, source-owned recipe and lock hashes, actual binary/SPDX digests, deliberate ordinary environment variation; qualification remains false
$ node ../verify-hosted-evidence.mjs
build / Build ts-aarch64-apple-darwin: SUCCESS: final-byte checks aarch64-apple-darwin 
build / Build ts-aarch64-apple-darwin: SUCCESS: ts package=0.1.0 source=5163241b947b1aa335987bd832b9205e4364e4bb target=aarch64-apple-darwin variant=default
build / Build ts-aarch64-apple-darwin: SUCCESS: Mach-O target and macOS minimum OS 13.0: aarch64-apple-darwin
build / Build ts-x86_64-apple-darwin: SUCCESS: final-byte checks x86_64-apple-darwin 
build / Build ts-x86_64-apple-darwin: SUCCESS: ts package=0.1.0 source=5163241b947b1aa335987bd832b9205e4364e4bb target=x86_64-apple-darwin variant=default
build / Build ts-x86_64-apple-darwin: SUCCESS: Mach-O target and macOS minimum OS 13.0: x86_64-apple-darwin
build / Build ts-x86_64-unknown-linux-gnu: SUCCESS: final-byte checks x86_64-unknown-linux-gnu GLIBC_2.34 GLIBC_2.2.5 GLIBC_2.14 GLIBC_2.3 GLIBC_2.29 GLIBC_2.3.4 GLIBC_2.33 GLIBC_2.28 GLIBC_2.7 GLIBC_2.16 GLIBC_2.10 GLIBC_2.3.2 GLIBC_2.9 GLIBC_2.30 GLIBC_2.4 GLIBC_2.17 GLIBC_2.15 GLIBC_2.32 GLIBC_2.25 GLIBC_2.18 GLIBC_2.5 GLIBC_2.27
build / Build ts-x86_64-unknown-linux-gnu: SUCCESS: ts package=0.1.0 source=5163241b947b1aa335987bd832b9205e4364e4bb target=x86_64-unknown-linux-gnu variant=default
build / Build trusted-server-axum-x86_64-unknown-linux-gnu: SUCCESS: final-byte checks x86_64-unknown-linux-gnu GLIBC_2.34 GLIBC_2.2.5 GLIBC_2.14 GLIBC_2.3 GLIBC_2.27 GLIBC_2.29 GLIBC_2.7 GLIBC_2.16 GLIBC_2.33 GLIBC_2.3.4 GLIBC_2.10 GLIBC_2.3.2 GLIBC_2.9 GLIBC_2.30 GLIBC_2.17 GLIBC_2.32 GLIBC_2.28 GLIBC_2.25 GLIBC_2.18

@prk-Jr

prk-Jr commented Oct 29, 2026

Copy link
Copy Markdown
Collaborator Author

Phase 2 exact-head rehearsal .20 — transcript 3/3

Source 5163241b947b1aa335987bd832b9205e4364e4bb; successful first-attempt fork run 40812416995. Tag v0.0.0-rehearsal.20, seven binaries / 30 immutable prerelease assets.

Continued actual verification transcript; full source/tag pins are unchanged.

build / Build trusted-server-axum-x86_64-unknown-linux-gnu: SUCCESS: Axum rejects EDGEZERO__ADAPTER__PORT=0; exit 1, ports must be 1–65535: sha256:8da84df25d28176be84164040cd45e128c6b4c6a80b7d7cbe17fe2b9f198efc2
build / Build trusted-server-axum-x86_64-unknown-linux-gnu: SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:8da84df25d28176be84164040cd45e128c6b4c6a80b7d7cbe17fe2b9f198efc2
build / Build trusted-server-axum-x86_64-unknown-linux-gnu: SUCCESS: Axum bound to 0.0.0.0:8080; host reached published container port, HTTP 200 ok: debian:12-slim@sha256:7ff6ba31527b9e336162fa061746c366c4b2032f4d2cff2078bea43f78efe3f8 sha256:8da84df25d28176be84164040cd45e128c6b4c6a80b7d7cbe17fe2b9f198efc2
build / Build trusted-server-axum-aarch64-unknown-linux-gnu: SUCCESS: final-byte checks aarch64-unknown-linux-gnu GLIBC_2.17 GLIBC_2.33 GLIBC_2.34 GLIBC_2.29 GLIBC_2.28 GLIBC_2.30 GLIBC_2.27 GLIBC_2.18 GLIBC_2.25 GLIBC_2.32
build / Build trusted-server-axum-aarch64-unknown-linux-gnu: SUCCESS: Axum rejects EDGEZERO__ADAPTER__PORT=0; exit 1, ports must be 1–65535: sha256:28fe65558df3e10c89e7d685cb86544cdc138f242d12100c5b0981f92aae0853
build / Build trusted-server-axum-aarch64-unknown-linux-gnu: SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:28fe65558df3e10c89e7d685cb86544cdc138f242d12100c5b0981f92aae0853
build / Build trusted-server-axum-aarch64-unknown-linux-gnu: SUCCESS: Axum bound to 0.0.0.0:8080; host reached published container port, HTTP 200 ok: debian:12-slim@sha256:7ff6ba31527b9e336162fa061746c366c4b2032f4d2cff2078bea43f78efe3f8 sha256:28fe65558df3e10c89e7d685cb86544cdc138f242d12100c5b0981f92aae0853
build / Build trusted-server-axum-x86_64-unknown-linux-musl: SUCCESS: final-byte checks x86_64-unknown-linux-musl 
build / Build trusted-server-axum-x86_64-unknown-linux-musl: SUCCESS: Axum rejects EDGEZERO__ADAPTER__PORT=0; exit 1, ports must be 1–65535: sha256:706db57fb2063f39f69632c5b5c9c439633fda35110e65587c5d85553fd1cc38
build / Build trusted-server-axum-x86_64-unknown-linux-musl: SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:706db57fb2063f39f69632c5b5c9c439633fda35110e65587c5d85553fd1cc38
build / Build trusted-server-axum-x86_64-unknown-linux-musl: SUCCESS: Axum bound to 0.0.0.0:8080; host reached published container port, HTTP 200 ok: alpine:3.22.2@sha256:4b7ce07002c69e8f3d704a9c5d6fd3053be500b7f1c69fc0d80990c2ad8dd412 sha256:706db57fb2063f39f69632c5b5c9c439633fda35110e65587c5d85553fd1cc38
build / Build trusted-server-fastly.wasm: SUCCESS: final-byte checks wasm32-wasip1 
build / Build trusted-server-fastly.wasm: fastly_v16.0.0_linux-amd64.tar.gz: OK
build / Build trusted-server-fastly.wasm: Fastly CLI version v16.0.0 (34cef1b0)
build / Build trusted-server-fastly.wasm: + timeout 60 fastly compute pack --wasm-binary ./trusted-server-fastly.wasm
build / Build trusted-server-fastly.wasm: + timeout 30 fastly compute validate --package ./pkg/example-app.tar.gz
PASS: four exact Fastly package raw members, directories and files, no links/prefixes/hidden padding
build / Build trusted-server-fastly.wasm: + cmp trusted-server-fastly.wasm packaged.wasm
build / Build trusted-server-fastly.wasm: + cmp fastly.toml packaged.toml
build / Build trusted-server-fastly.wasm: SUCCESS: pinned Fastly route packed, validated, inspected and byte-compared without credentials or network
release: Verified post-publish re-download: all 30 assets byte-identical to signed checksums and handoff
PASS: seven binary smoke/format checks; both macOS minimum OS13.0; CLI source facts; Axum non-loopback and invalid ports; pinned Fastly16 offline route; thirty-file published readback
$ shasum -a 256 --check SHA256SUMS
trusted-server-axum-x86_64-unknown-linux-gnu: OK
trusted-server-axum-x86_64-unknown-linux-gnu.spdx.json: OK
trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json: OK
trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json: OK
trusted-server-axum-x86_64-unknown-linux-musl: OK
trusted-server-axum-x86_64-unknown-linux-musl.spdx.json: OK
trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json: OK
trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json: OK
trusted-server-axum-aarch64-unknown-linux-gnu: OK
trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json: OK
trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json: OK
trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json: OK
trusted-server-fastly.wasm: OK
trusted-server-fastly.wasm.spdx.json: OK
trusted-server-fastly.wasm.rebuild-check.json: OK
trusted-server-fastly.wasm.provenance.sigstore.json: OK
trusted-server-fastly.wasm.sbom.sigstore.json: OK
ts-aarch64-apple-darwin: OK
ts-aarch64-apple-darwin.spdx.json: OK
ts-aarch64-apple-darwin.provenance.sigstore.json: OK
ts-aarch64-apple-darwin.sbom.sigstore.json: OK
ts-x86_64-apple-darwin: OK
ts-x86_64-apple-darwin.spdx.json: OK
ts-x86_64-apple-darwin.provenance.sigstore.json: OK
ts-x86_64-apple-darwin.sbom.sigstore.json: OK
ts-x86_64-unknown-linux-gnu: OK
ts-x86_64-unknown-linux-gnu.spdx.json: OK
ts-x86_64-unknown-linux-gnu.provenance.sigstore.json: OK
ts-x86_64-unknown-linux-gnu.sbom.sigstore.json: OK
PASS: published assets, immutable membership, all online/offline signer/source predicates, SPDX equalities and negative controls, companion joins verified; exact-release runtime remains a separate required check

Exact published-byte runtime supplement:
Exact published Fastly runtime verification
$ ts-aarch64-apple-darwin config init --app-config $WORKSPACE/trusted-server.toml
Initialized config at $WORKSPACE/trusted-server.toml
$ ts-aarch64-apple-darwin config push --adapter fastly --local --manifest $WORKSPACE/edgezero.toml --app-config $WORKSPACE/trusted-server.toml --yes --no-diff --no-env
wrote 1 physical entries (1 logical) to `[local_server.config_stores.trusted_server_config.contents]` in $WORKSPACE/fastly.toml (logical id `trusted_server_config`); restart `fastly compute serve` to pick up changes
pushed-key=trusted_server_config
pushed-store=trusted_server_config
$ viceroy --version
viceroy 0.21.0
$ viceroy --config $WORKSPACE/fastly.toml --addr 127.0.0.1:56888 --log-stdout --log-stderr $ASSETS/trusted-server-fastly.wasm
PASS publisher 1: HTTP200, origin marker, injected TSJS, source 5163241b947b1aa335987bd832b9205e4364e4bb
PASS publisher 2: HTTP200, origin marker, injected TSJS, source 5163241b947b1aa335987bd832b9205e4364e4bb
PASS publisher 3: HTTP200, origin marker, injected TSJS, source 5163241b947b1aa335987bd832b9205e4364e4bb
PASS injected JS: HTTP200, 34617 bytes, source 5163241b947b1aa335987bd832b9205e4364e4bb
PASS actual request/origin-response log lines: 6/6; Build facts lines: 0
PASS wrong-source negative control and copied-log detector sensitivity control
PASS owned listeners stopped; connection-refused checks

Raw runtime log excerpt (three requests and three successful responses; each was also echoed to stdout):

tslog :: 2026-10-29T04:05:14.483Z DEBUG [publisher] Proxying request to publisher_origin
tslog :: 2026-10-29T04:05:14.492Z DEBUG [publisher] Publisher origin response received: status=200 OK, header_count=6
tslog :: 2026-10-29T04:05:14.495Z DEBUG [publisher] Proxying request to publisher_origin
tslog :: 2026-10-29T04:05:14.495Z DEBUG [publisher] Publisher origin response received: status=200 OK, header_count=6
tslog :: 2026-10-29T04:05:14.497Z DEBUG [publisher] Proxying request to publisher_origin
tslog :: 2026-10-29T04:05:14.497Z DEBUG [publisher] Publisher origin response received: status=200 OK, header_count=6

Runtime check: PASS at the exact published digest above; all owned listeners stopped. The release verifier’s earlier “runtime remains separate” line precedes the subsequently successful runtime supplement.

Integrate the Phase 1 maintainer-review changes with the Phase 2 ordinary
Fastly equality gate.

- Port the rebuild-check companion and its verification commands into the
  extracted scripts/release/publish.mjs publisher and release notes.
- Keep Phase 1's push-only triggers and major-tag action references for the
  Phase 2 jobs, and set up pinned Node in the signing job from the checks job.
- Build the trace viewer only from the build-all command line and move it out
  of the checked bundle directory in build.rs, so the strict bundle scan and
  release JS collection are unchanged.
- Keep the release-policy, release-tools and release-index schema data that
  the release crate compiles in, and rename its Axum capability to
  axum-evaluation to match the cohort.
- Emit the CLI release cfg from the release control without duplicating
  core's release-source validation.
- Fail build-all on Node before 24.2 instead of silently skipping the build.
- Drop pull_request fallbacks from the push-only release build workflow.
- Describe what the ordinary negative canaries prove.
@prk-Jr
prk-Jr added this pull request to stack #1492 November 3, 2026 15:47
Comment thread scripts/release/phase1.test.mjs Fixed
…tion or class'

Remove unused isDeepStrictEqual import from release tests

The Phase 1 merge dropped the node:util mock that used it but kept the import.

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
@prk-Jr
prk-Jr marked this pull request as ready for review November 4, 2026 05:39
@prk-Jr prk-Jr mentioned this pull request Nov 4, 2026
13 of 17 tasks
Adopt Phase 1's third and fourth review rounds: four release binaries,
no Rust source audit, no post-publish re-download, pre-publication
signing-bundle checks and the Phase 1 spec and guide trim.

Phase 2 keeps its Fastly A/B equality gate. The release is now four
binaries plus the rebuild check and SHA256SUMS (18 files). The
publisher also verifies the rebuild check against the Fastly provenance
bundle before creating a draft. The producer's ordinary artifact list
drops the three Axum rows, and the cohort file returns with the four
fixed rows from the frozen design. The actions.github.io allowlist
entry returns for the producer and CLI release policy. Phase 2's
compatibility notes move into its integration plan, and its new build
guards exit explicitly.
Phase 1 sends the locked workspace graph to /dev/null because nothing
in Phase 1 reads it, but Phase 2's Fastly ordinary capture records that
file. Rehearsal v0.0.0-rehearsal.26 failed the canonical build with
"ordinary Cargo capture path is missing or aliased". Write the file
again, and test that the capture's metadata path is the file the
acquisition step writes.
Docs only: the merged head 9eeccbb passed rehearsal v0.0.0-rehearsal.27 and the guide's verification block, so the Phase 2 records no longer ask for a fresh rehearsal.
Adopt the checks-job refusal of tags on commits that are on no branch. The step joins the checks job ahead of the Fastly build jobs.

@dhruv8sh dhruv8sh left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Adds a second, independently configured Fastly build plus a byte-equality comparison, and signs and publishes trusted-server-fastly.wasm.rebuild-check.json alongside the Phase 1 binaries. The gating design (path-remap scope, ambient-flag refusal, inline sign-time receipt checks, publisher bundle verification) looks solid. Two blocking items are scope/test-validity issues.

Scope note: the trusted-server-release crate was not reviewed line by line beyond src/ordinary/normalization.rs.

Blocking

  • 🔧 Unrelated reformatting conflicts with main — commit f721ddbe0 rewrites scripts/docs-proposal/hunks.mjs / hunks.test.mjs (~830 lines) and the quote style of format.yml / test.yml to single-quote/no-semicolon, while main and the Phase 1 base use double quotes and semicolons. This buries the real workflow changes and will conflict with main. Please restore from the base (git checkout origin/feature/binary-attestations-phase1 -- scripts/docs-proposal/) and revert the quote-only workflow hunks.
  • 🔧 Negative canaries can never fire — inline at .github/workflows/test.yml:214

Non-blocking

  • 🤔 Reproduction build serialized after canonical — inline at release-build.yml:201
  • ⛏ Lost prebuild hint in the TSJS_SKIP_BUILD panic — inline at build.rs:80 (suggestion, compile-unverified)
  • ⛏ Redundant success() — inline at release-build.yml:429 (suggestion)
  • 📌 crates/trusted-server-adapter-cloudflare/build.sh — comment move and flag reorder with no behavioural change; belongs outside this PR.
  • 👍 Ordinary remap normalization and scan — same four-entry remap for both roles, refusal of ambient RUSTFLAGS/extra config layers/existing remap flags, leftover-path scan, and sign-time re-checks of the rebuild file make the companion hard to fake.

CI Status

32 checks PASS; 2 ordinary negative canaries SKIPPED (see blocking item).

Comment thread .github/workflows/test.yml Resolved
Comment thread .github/workflows/release-build.yml Resolved
Comment thread crates/trusted-server-js/build.rs Resolved
Comment thread .github/workflows/release-build.yml Resolved
Remove the three ordinary negative canary jobs. Their condition read a
hard-coded output, so they only showed that GitHub skips a false `if:`.
The Rust mismatch fixture stays, and the contract test now requires the
real sign job to need the comparison and forbids status functions in the
sign and publication job conditions.

Restore the docs-proposal scripts, the Cloudflare build script and the
workflow quote style from the Phase 1 base. Explain why the Fastly
reproduction waits for the canonical build, drop a redundant success()
and restore the prebuild hint in the TSJS_SKIP_BUILD panic.
@prk-Jr

prk-Jr commented Nov 5, 2026

Copy link
Copy Markdown
Collaborator Author

Summary-level items from the review, fixed in 1858b6d:

  • Unrelated reformatting: scripts/docs-proposal/hunks.mjs and hunks.test.mjs are restored byte-for-byte from feature/binary-attestations-phase1 (the head versions were exactly prettier applied to the base). The quote-only hunks in format.yml and test.yml are reverted; both files now differ from the base only by the release-producer steps.
  • crates/trusted-server-adapter-cloudflare/build.sh: restored from the base.

Local: release Node suite 45/45, docs-proposal gate (shellcheck, hunks tests, test.sh), cargo fmt, trusted-server-js clippy and tests, cargo check-axum, cargo clippy-fastly. No release rehearsal has been run at this head yet.

@prk-Jr
prk-Jr requested a review from dhruv8sh November 5, 2026 13:01

@dhruv8sh dhruv8sh left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the release-signing gate path. sign now depends on fastly-comparison and runs only fixed inline checks: it requires a canonical, matched rebuild-check.json whose SHA-256, size, SPDX digest, run ID/attempt and two distinct job IDs all match the signed binary. The rebuild check is added as a provenance subject, and publish.mjs verifies it before anything is created. Producer and comparison tools build from the same pinned commit, and the new release-crate tests and clippy run in CI and are listed in AGENTS.md. No blocking issues; the inline comments are non-blocking.

Scope: this covers the workflows, the build/publish scripts and the two build.rs changes. I did not review the ~79k lines of the trusted-server-release crate line by line. A PR this size is very hard to review fully; if maintainers want the crate itself reviewed, splitting it out or reviewing it module by module would help.

Maintainer decisions listed in the PR body (removing the Axum rows, the actions.github.io / json-schema.org / spdx.org allowlist entries, and the extra Fastly build on every push to main) need explicit maintainer sign-off, separate from this code review.

Comment thread .github/workflows/release-build.yml Resolved
Comment thread crates/trusted-server-js/build.rs Resolved
Comment thread .github/workflows/release-build.yml Resolved
Comment thread scripts/release/phase1-build.sh Resolved
Comment thread .github/workflows/release-build.yml Resolved
Comment thread scripts/release/publish.mjs Resolved
Explain that HEAD_REPOSITORY_ID is the expected value matched against each artifact's API-reported head repository, note that pipefail guards the cargo | tee pipeline, and add a CHANGELOG entry for TSJS_SKIP_BUILD now failing whenever it is set.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Publish attested release binaries with build provenance and SBOMs

3 participants