Skip to content

Publish attested release binaries with provenance and SBOMs - #1435

Open
prk-Jr wants to merge 36 commits into
mainfrom
feature/binary-attestations-phase1
Open

prk-Jr wants to merge 36 commits into
mainfrom
feature/binary-attestations-phase1

Conversation

@prk-Jr

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

Copy link
Copy Markdown
Collaborator

Summary

  • Publish seven raw release binaries with verifiable build provenance, SPDX 2.3 dependency inventories and Sigstore bundles so operators can authenticate downloaded bytes before running or deploying them.
  • Separate read-only builds, isolated signing and immutable publication; keep operator configuration external and retain exact source/package/target/variant build facts.
  • Deliver Phase 1 of Publish attested release binaries with build provenance and SBOMs #1235 with documented GitHub CLI verification. Full composition, reproducibility and the custom verifier remain later work.

Changes

55 files, +11,037/−58 lines against main after the approved base update. The retained design, plans, policies and candidate reports describe future phases as well as this implementation; their presence does not claim those phases are implemented or qualified.

All changed files and their purpose
File Change
.github/workflows/format.yml Lint the Phase 1 release shell helper.
.github/workflows/release-build.yml Build seven assets with pinned tools; isolate tag-only provenance/SBOM signing.
.github/workflows/release.yml Call the local builder/signer; validate handoffs and publish/verify one immutable release.
.github/workflows/test.yml Run development and release-mode CLI build-facts regression checks.
AGENTS.md Document the release helper test/lint gate.
CHANGELOG.md Describe attested release binaries and operator verification.
crates/trusted-server-adapter-axum/src/main.rs Resolve and validate runtime host/port settings; preserve loopback defaults and visible startup refusals.
crates/trusted-server-adapter-axum/tests/startup.rs Prove invalid binding fails visibly with logging disabled.
crates/trusted-server-adapter-fastly/build.rs Validate release source control and retain the owning Cargo target.
crates/trusted-server-adapter-fastly/src/main.rs Report immutable build facts in reuse diagnostics; preserve single-mode source headers.
crates/trusted-server-cli/build.rs Validate release identity and derive the owning CLI target.
crates/trusted-server-cli/release-policy.json Carry the reviewed destination consumer policy; no Phase 1 reader.
crates/trusted-server-cli/src/commands/dev/lint/domains.rs Add justified exact reference hosts and lookalike-host regression coverage.
crates/trusted-server-cli/src/lib.rs Make the build-facts test seam available without broadening the public API.
crates/trusted-server-cli/src/run.rs Label package/source/target/variant in CLI version output.
crates/trusted-server-cli/tests/release_build_facts.rs Check real CLI identity, owner build scripts, external tag/run independence and standalone execution.
crates/trusted-server-core/build.rs Use the shared release-aware Git resolver and track its inputs.
crates/trusted-server-core/build_support/git_version.rs Require a full lowercase source SHA in release mode; retain development fallbacks.
crates/trusted-server-core/src/build_info.rs Represent immutable package/source/target/variant facts.
crates/trusted-server-core/src/constants.rs Expose sanitized source identity through existing version constants.
crates/trusted-server-core/src/lib.rs Export the build-info module.
crates/trusted-server-core/src/settings.rs Exclude inherited release controls from legacy test-only configuration overlays; cover case variants.
crates/trusted-server-core/tests/git_version_resolve.rs Cover valid, invalid, missing and non-Unicode release inputs plus development fallback.
docs/.vitepress/config.mts Link the release verification guide.
docs/guide/cli.md Explain source-built versus verified downloaded CLI installation.
docs/guide/release-verification.md Document online/offline checks, native startup limits, verified-byte deployment and maintainer recovery/settings.
docs/superpowers/plans/2026-10-13-attested-release-implementation.md Define Phase 1 acceptance and retain the deferred destination implementation plan.
docs/superpowers/plans/2026-10-13-cli-packaging-attestation-integration.md Carry the future packaged-CLI integration plan; packaging is not implemented here.
docs/superpowers/plans/2026-10-13-fastly-prebuilt-edgezero-integration.md Carry the future typed EdgeZero deployment/recovery plan.
docs/superpowers/plans/binary-attestations-phase1-compatibility.md Record contract alignment, phased limits and revision-specific rehearsal history.
docs/superpowers/plans/binary-attestations-slice-map.json Assign retained future work to subsequent slices.
docs/superpowers/specs/2026-01-15-attestation-design.md Mark the historical binary-attestation proposal as superseded.
docs/superpowers/specs/2026-10-09-1235-release-attestation-design.md Define the Phase 1 boundary, compile-time inputs and retained destination contract.
docs/superpowers/specs/2026-10-12-1235-release-attestation-feasibility.md Carry historical feasibility measurements and their qualification limits.
docs/superpowers/specs/2026-10-14-release-tooling-rust-migration.md Carry the future Rust producer migration contract.
docs/superpowers/specs/schemas/release-index-v1.schema.json Preserve the destination index schema; Phase 1 emits no index.
scripts/release/js-composition.md Carry future JS composition design/evidence; no claim of Phase 1 complete composition.
scripts/release/phase1-build.sh Build from the expected source with fresh JS and reject development overrides/config canaries.
scripts/release/phase1.mjs Validate inputs/binaries, form conservative SPDX inventories and run platform startup checks.
scripts/release/phase1.test.mjs Exercise release helpers and the actual inline publisher, including negative/failure paths.
scripts/release/qualification/2026-10-15-consumer-real-fixtures.md Carry revision-pinned historical candidate evidence and explicit qualification gaps; not current Phase 1 proof.
scripts/release/qualification/2026-10-15-js-two-builds.md Carry revision-pinned historical candidate evidence and explicit qualification gaps; not current Phase 1 proof.
scripts/release/qualification/2026-10-16-confined-cargo-candidate.md Carry revision-pinned historical candidate evidence and explicit qualification gaps; not current Phase 1 proof.
scripts/release/qualification/2026-10-16-fastly-canonical-reproduction-equality.md Carry revision-pinned historical candidate evidence and explicit qualification gaps; not current Phase 1 proof.
scripts/release/qualification/2026-10-16-fastly-runtime-gate.md Carry revision-pinned historical candidate evidence and explicit qualification gaps; not current Phase 1 proof.
scripts/release/qualification/2026-10-16-linux-cli-candidate.md Carry revision-pinned historical candidate evidence and explicit qualification gaps; not current Phase 1 proof.
scripts/release/qualification/2026-10-16-producer-normalized-manifests.md Carry revision-pinned historical candidate evidence and explicit qualification gaps; not current Phase 1 proof.
scripts/release/qualification/2026-10-19-apple-sdk-inputs.md Carry revision-pinned historical candidate evidence and explicit qualification gaps; not current Phase 1 proof.
scripts/release/qualification/2026-10-20-apple-cli-candidates.md Carry revision-pinned historical candidate evidence and explicit qualification gaps; not current Phase 1 proof.
scripts/release/qualification/2026-10-20-linux-cli-gnu-follow-up.md Carry revision-pinned historical candidate evidence and explicit qualification gaps; not current Phase 1 proof.
scripts/release/qualification/2026-10-21-candidate-release-index.md Carry revision-pinned historical candidate evidence and explicit qualification gaps; not current Phase 1 proof.
scripts/release/qualification/2026-10-21-four-asset-candidate-join.md Carry revision-pinned historical candidate evidence and explicit qualification gaps; not current Phase 1 proof.
scripts/release/qualification/2026-10-21-native-reproduction-schedule.md Carry revision-pinned historical candidate evidence and explicit qualification gaps; not current Phase 1 proof.
scripts/release/release-cohort.json Retain four original assets and describe three Axum additions; no checked Phase 1 policy reader.
scripts/release/release-tools.json Carry destination tool/qualification records; unqualified/null entries grant no release authority.

Closes

Part of #1235. Keep the issue open: spec/merge approval and upstream immutable-release/tag-ruleset settings remain maintainer obligations. This partial delivery intentionally does not use an auto-closing keyword.

Spec

Phased spec · Implementation plan · Compatibility audit and rehearsal history.

The carried design originated in #1262; its review history and disposition appendix remain linked from the spec. Spec and implementation are combined here by the recorded delivery agreement; maintainer approval is still required. The required Review log now records two fresh independent AI source-review rounds, both without blocking Phase 1 findings. The historical-adapter advisory was addressed with an append-only baseline clarification; original spec bytes remain intact.

How it works

  1. Build: a PR exercises seven hosted builds with pinned Rust/Node tools and locked dependencies. A release starts from a v* tag. The release helper checks the supplied full source SHA, requires fresh npm/JS output, rejects skip/prebuilt/test controls and scans for planted operator values. It produces Fastly wasm, three CLI binaries and three Axum binaries, each with a conservative Cargo/npm SPDX inventory tied to the final executable hash.
  2. Sign: the local, input-free release-build.yml reusable workflow owns signing. Signing runs only for tag pushes with RELEASE_PUBLICATION_ENABLED=true; these jobs do not check out source, compile, or execute the binaries. Provenance covers the executable and its SPDX document. The separate SBOM attestation uses the executable as its subject and the SPDX document as its predicate. Both real action-produced bundles are retained.
  3. Publish: release.yml checks exact build/signer file sets and signed-input digests. It refuses existing matching releases/drafts, creates one draft and retains its release ID through upload/publication. Mutations are single-shot. The distribution contains 7 binaries + 7 SPDX documents + 14 bundles + SHA256SUMS = 29 assets; the checksum file covers the other 28 files. The publisher verifies immutability, release identity, cryptographic membership and a fresh download of every asset against the validated handoff bytes. Only bounded transient read failures may retry.
  4. Consume: operators use independently trusted GitHub CLI/source pins to verify immutable membership and both provenance/SBOM predicates before execution. Separate signer-workflow and exact certificate-identity checks pin release-build.yml at the approved tag. Offline bundle verification uses independently obtained roots and proves build evidence; it does not establish current release membership or authorize deployment. The Fastly route packages the verified wasm without rebuilding it.

Runtime identity stays distinct from release metadata: ts --version labels package/source/target/variant; Fastly reports the full source SHA in x-ts-version. Axum host/port choices remain runtime inputs, preserve the loopback default, and reject invalid or conflicting values with a visible refusal even when logging is off.

Review corrections — 2026-10-29

Current head: 79b1188587cfadc0d193544a3a5c0008666727df. This signed merge includes main 5b4e7e872eb30300cb7db3d973773884ea46bc87 and the scoped review corrections.

  • Require a lightweight raw tag reference at the expected source commit before release create/upload/publish; reject annotated, mismatched, missing and malformed references without mutations.
  • Normalize SPDX creation timestamps to whole-second UTC before signing. Strict SPDX tools-java 2.0.7 rejects the historical fractional sample and accepts actual-helper output with only the creation timestamp changed.
  • Install cleanup before canary config writes; remove generated inventory on success/failure while preserving existing files and dangling symlinks.
  • Exclude the inherited release build control from legacy test settings; document non-loopback binding and narrow the GitHub CLI other-tag availability guarantee.
  • Keep all seven PR builds. The upstream GitHub CLI filter-before-fetch fix and qualification remain follow-up work.

Final-tree local verification: all required Rust/JS/docs/script/Node/domain gates passed; all eight Clippy aliases, adapter/parity/CLI tests, build-digest checks, builds, inherited release controls and 12 Chrome fixtures passed. The first concurrent JS run timed out in unchanged Prebid code; the final full single-worker run passed 1232 tests with original timeouts. Sandbox-blocked Viceroy launches are recorded separately from their successful host-access retries. Current-head hosted evidence: 34 checks passed, with two expected tag-only signing/publication skips. The authorized fresh fork rehearsal .21 is blocked: GitHub cancelled its ARM macOS job with no runner assigned, citing hosted macOS ARM capacity. Five builds passed; Intel macOS was still active at readback. No signing/publication has run, and no matching draft/release exists. Tag .21 remains unchanged at this exact source; no new attempt was made. Five independent review threads are resolved; the annotated-tag and SPDX threads remain open for signed-release qualification.

The PR is ready for review. Release qualification remains pending; no successful new tag/release publication, deployment, administrator-setting audit or release rehearsal is claimed. .15 remains historical evidence for 68eef902a8bddd9024676cc3806fa5377ed67fee; it does not qualify this updated source or the corrected SPDX documents. Maintainer settings/spec decisions and fresh release qualification remain separate obligations.

Test plan

Verification summary and evidence

Historical pre-review head: 4940928e800fed00e4bddd8f3727fb52dcb2b296, the later web merge of main 054c7b777 after review-log commit c9a6117dd. Its tree exactly matches the already tested synthetic merge 52978c5b5146f0c008108a9b0bfb2bf2c5de2bb2; fresh CI on this new head also passed. The spec’s two fresh review rounds and their append-only clarification remain intact. Rehearsed implementation: 68eef902a8bddd9024676cc3806fa5377ed67fee in .15. The later main merge includes upstream application changes, with unchanged release machinery, and is not described as docs-only since that rehearsal. No new tag-rehearsal result is claimed. PR release-matrix binaries identify their tested merge ref and remain distinct from the recorded tag assets.

Verification Result and what it establishes Evidence
Historical pre-review PR checks 32 successful checks; two expected signing/publication skips. PR builds establish build/test coverage, not tag publication. All checks, seven release builds
Rust tests and release identity Adapter/reuse/parity/CLI/build-digest and HTML EOF suites passed. CLI identity tests exercise both development and release modes with an exact supplied fictional source control. Run Tests, Linux CLI job and merge checkout, macOS CLI job
Formatting and lint Rust formatting, target-matched adapter Clippy, CLI/codegen/build-digest Clippy, wasm-clock lint, JS/docs/Markdown formatting, docs build and script lint passed. Run Format
Browser and adapter integration Integration, browser and Fastly EC lifecycle checks passed. Integration Tests
Release failure/regression fixtures 19 helper tests passed, covering handoff corruption, partial uploads, tag/permission/action pins, bad build controls, platform inspection and bounded read/retry behavior. Preflight test log
Actual tag build → sign → publish Fork rehearsal .15 passed all 16 jobs at 68eef902a; seven builds and seven signers produced an immutable prerelease, not Latest. Rehearsal attempt 1, publisher log, immutable release
Downloaded release integrity All 29 immutable assets and all 28 checksum entries verified; publisher re-download matched every signed-handoff byte. Release ID 425726260 currently reports immutable=true, draft=false, prerelease=true. Independent transcript 1/2, transcript 2/2
Signatures, source and SPDX binding All seven binaries passed both predicates and both signer identity checks online without bundles and offline with retained bundles/roots. Exact source/ref/signer pins were enforced; 14 online/offline SPDX comparisons matched the shipped documents. Transcript 1/2, transcript 2/2
Native executable behavior CLI version/source identity, GNU baseline startup, static-musl startup, macOS architecture/minimum OS checks and Axum host-published /health success/invalid-port refusal passed in the recorded rehearsal. These are startup checks, not full platform qualification. Build job logs, runtime results in transcript 2/2

Together, these demonstrate the intended Phase 1 path: reviewed source produces runnable bytes; real tag-only signers attest those bytes and their inventory; the publisher releases the exact immutable distribution; independent verification authenticates the downloaded assets. They do not establish reproducibility, complete native dependency coverage, SLSA Build Level 3 or production deployment.

Completed checks

These checked items refer to the linked hosted evidence, not a claim that every suite was rerun locally.

  • cargo test-fastly, reuse tests, cargo test-axum, Cloudflare, Spin, native CLI and cross-adapter parity checks.
  • All target-matched Clippy aliases, CLI/codegen and native core build-digest lint.
  • cargo fmt --all -- --check.
  • JS build/tests and formatting.
  • Docs/Markdown formatting and VitePress link/build checks.
  • Production Fastly WASM build and all six native release builds.
  • Release helper tests and shellcheck; configuration/source/build-control negative cases.
  • Actual fork tag signing/publication, immutable membership, checksums and online/offline predicate verification.
  • New Fastly provider deployment at this revision — not performed; the documented verified-byte operator route is the selected Phase 1 delivery path.

Historical evidence: .12 success applies to ab6e54936 only. .11 draft-create denial and .14 hosted ARM64 runner-capacity failure remain failures for those attempts; .15 supplies the successful current-implementation rehearsal. No tag or immutable release was reused or overwritten.

Exact signer verification and issue acceptance

Use independently approved REPO, TAG and full COMMIT values from the operator guide. For each asset, run both predicates (https://slsa.dev/provenance/v1 and https://spdx.dev/Document/v2.3) with each mutually exclusive identity option separately:

checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json"
  --source-ref "refs/tags/$TAG" --source-digest "$COMMIT"
  --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
gh attestation verify "$asset" "${checks[@]}" \
  --signer-workflow "$REPO/.github/workflows/release-build.yml"
gh attestation verify "$asset" "${checks[@]}" \
  --cert-identity "https://github.com/$REPO/.github/workflows/release-build.yml@refs/tags/$TAG"

The guide includes complete loops, release membership checks, offline roots and SPDX comparisons. The issue's original release.yml signer example is superseded by the reusable release-build.yml identity. artifact-metadata: write is intentionally unnecessary for file attestations.

  • D1: maintainer spec/merge approval remains pending; the required two-round spec review log is complete.
  • D2: no-config requirement and compile-time inventory documented, with audit limits.
  • D3/D4: immutable publication and every binary/predicate/asset verified in fork rehearsal .15; upstream settings remain D7.
  • D5: fresh npm/JS and refusal of development skip/prebuilt controls.
  • D6: verified-release-byte deployment route documented; no production deployment claimed.
  • D7: upstream immutable releases and restricted v* tags configured by maintainers.
  • D8: operator/CLI docs and changelog updated.

Checklist

  • Feature spec ends in a Review log recording two fresh independent AI review rounds and their dispositions.
  • No production unwrap() introduced; release/config error paths are explicit.
  • Application instrumentation uses log; Axum deliberately writes startup refusals to stderr so RUST_LOG=off cannot hide them. This is a disclosed exception to the general logging convention.
  • New release/build-facts/runtime behavior has regression coverage.
  • No new secrets or credentials identified in the reviewed changes.
  • Maintainer review of new reference-host allowlist entries and per-line suppressions completed.

Maintainer decisions and Phase 1 limits

The two-round spec review-log requirement is complete. The review-log fix and subsequent main-merge head both passed CI; this PR is ready for human review. Spec/code approval remains the purpose of human review. Before enabling production publication, maintainers must enable immutable releases and the restricted v* tag ruleset, then explicitly set RELEASE_PUBLICATION_ENABLED=true and authorize the first production tag. RC-branch tag eligibility remains a maintainer decision. Upstream production publication and provider deployment are not claimed by the fork rehearsal.

Reference hosts requiring review: actions.github.io, slsa.dev, spdx.dev, cli.github.com. Per-line suppressions: cyclonedx.org (intermediate-format reference, removed from the allowlist), api.github.com, uploads.github.com.

Phase 1 SBOMs are conservative build dependency inventories, not complete retained-code/native composition or vulnerability scans. Producing-job transfer binding, checked policy consumption, source-branch ancestry enforcement, reproducibility, custom verification/indexes, integrated EdgeZero recovery and further Axum production hardening remain deferred. A compromised build dependency could replace another job's artifact; exact handoff checks do not close that later transfer-binding boundary. Historical candidate reports and frozen policies grant no present release qualification.

@prk-Jr prk-Jr self-assigned this Oct 22, 2026
@prk-Jr

prk-Jr commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator Author

Rehearsal record at 41896cb0798f98e759c020965ed675fe1e8808dc, lightweight fork tag v0.0.0-rehearsal.2.

Run · immutable release. Release ID 420703797, 17 exact assets, no index/build-evidence/build-recipe/rebuild-check/inventory companions.

All four builds and signers passed. Publication, initial release-ID/immutability validation, gh release verify, and all 17 publisher asset checks passed. The job then failed at its final read-only API check with UND_ERR_SOCKET (other side closed). No publication retry, tag reuse or deletion has occurred. A minimal connection-header fix is being validated; the next workflow attempt needs a separately approved fresh tag.

Independent verification below completed with exit status 0: one release verification, 17 asset verifications, 16 attestation verifications (four binaries × provenance/SPDX × signer-prefix/exact tag-ref identity), 16 checksum entries and four signed-SPDX predicate comparisons. It uses the guide commands with only repository/tag/commit substitutions. Workflow CLI: 2.102.0; independent CLI: 2.97.0.

Full independent verification transcript — commands and output
gh version 2.97.0 (2026-07-31)
https://github.com/cli/cli/releases/tag/v2.97.0
+ set -euo pipefail
+ REPO=prk-Jr/trusted-server
+ TAG=v0.0.0-rehearsal.2
+ COMMIT=41896cb0798f98e759c020965ed675fe1e8808dc
+ ASSETS=(trusted-server-fastly.wasm ts-x86_64-unknown-linux-gnu ts-aarch64-apple-darwin ts-x86_64-apple-darwin)
+ gh release download v0.0.0-rehearsal.2 --repo prk-Jr/trusted-server --dir .
++ gh api repos/prk-Jr/trusted-server/releases/tags/v0.0.0-rehearsal.2 --jq .immutable
+ test true = true
+ gh release verify v0.0.0-rehearsal.2 --repo prk-Jr/trusted-server
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API
✓ Release v0.0.0-rehearsal.2 verified!

Assets
SHA256SUMS	sha256:476fb3a4f484fbd869ef2999641fec71bda78cbc7060869d781293bf6864f1a5
trusted-server-fastly.wasm	sha256:8631ba5258f70d5379bfa2d760c6942273567c49ca12e8bb887435c1252df544
trusted-server-fastly.wasm.provenance.sigstore.json	sha256:893330290b769329c3086e96cda7e8d26ab79f64e233598f80f21142d631e48b
trusted-server-fastly.wasm.sbom.sigstore.json	sha256:9e573493fcbc26ab5bc24a4be32319da1b0626dc51a24fc940a68f072682a45f
trusted-server-fastly.wasm.spdx.json	sha256:488ecb5253eb92b0ad0781f8cd96cd8c380acc45c05d25eeaf673c6846aec2c5
ts-aarch64-apple-darwin	sha256:e9c304e55fceb4d0e2f6ac14ac5be9bed368b2628d1a90d6f4539757e129469a
ts-aarch64-apple-darwin.provenance.sigstore.json	sha256:e760be21e32de4e56f3ff5f1fc010e9a1f868541a3c4a4b4ae85a6e6b57be94e
ts-aarch64-apple-darwin.sbom.sigstore.json	sha256:3ae4012afd48713ee795b9901bd82073477479e685a27f084a2fe562d8db7daf
ts-aarch64-apple-darwin.spdx.json	sha256:d2d91805e717da7e98535c99536b7040eafd308f793dfda01698f8388a05be1f
ts-x86_64-apple-darwin	sha256:5f7ac1d7f7cf879a08ac8a767aa5dc9f9c92994f2188b2613f2b4739e86de3b0
ts-x86_64-apple-darwin.provenance.sigstore.json	sha256:c7205112b4423c03112a119325a64c13f81ea64308b9112dea828ea7c56887a9
ts-x86_64-apple-darwin.sbom.sigstore.json	sha256:48f523a296fec23e65a87e7294690ae23cd3c5627b8c282714c370976b4e5b73
ts-x86_64-apple-darwin.spdx.json	sha256:d1febe34dc5be26837c9f7cdbbbaabfcf32ced4e18bcbde2e5117f46ae292725
ts-x86_64-unknown-linux-gnu	sha256:18a8ee34706eda39991991b3d69667aa368850e7995d8124389adad9c062794d
ts-x86_64-unknown-linux-gnu.provenance.sigstore.json	sha256:6a96392a7ab2257b51cef295ca755069e408e0fd14d31bee0839262d2fe40136
ts-x86_64-unknown-linux-gnu.sbom.sigstore.json	sha256:5b3f309286752369d3e6485283ffaa8b848d8322ed42e9ef5a4460a83cd175e6
ts-x86_64-unknown-linux-gnu.spdx.json	sha256:e30af27a8dc1df5b348c1a0c6e17bad9d7735178bda342fd857c660f299e464f

+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 trusted-server-fastly.wasm --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm: sha256:8631ba5258f70d5379bfa2d760c6942273567c49ca12e8bb887435c1252df544
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm is present in release v0.0.0-rehearsal.2
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 trusted-server-fastly.wasm.spdx.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.spdx.json: sha256:488ecb5253eb92b0ad0781f8cd96cd8c380acc45c05d25eeaf673c6846aec2c5
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.spdx.json is present in release v0.0.0-rehearsal.2
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 trusted-server-fastly.wasm.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.provenance.sigstore.json: sha256:893330290b769329c3086e96cda7e8d26ab79f64e233598f80f21142d631e48b
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.provenance.sigstore.json is present in release v0.0.0-rehearsal.2
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 trusted-server-fastly.wasm.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.sbom.sigstore.json: sha256:9e573493fcbc26ab5bc24a4be32319da1b0626dc51a24fc940a68f072682a45f
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.sbom.sigstore.json is present in release v0.0.0-rehearsal.2
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-unknown-linux-gnu: sha256:18a8ee34706eda39991991b3d69667aa368850e7995d8124389adad9c062794d
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu is present in release v0.0.0-rehearsal.2
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 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:e30af27a8dc1df5b348c1a0c6e17bad9d7735178bda342fd857c660f299e464f
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.spdx.json is present in release v0.0.0-rehearsal.2
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 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:6a96392a7ab2257b51cef295ca755069e408e0fd14d31bee0839262d2fe40136
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.provenance.sigstore.json is present in release v0.0.0-rehearsal.2
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 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:5b3f309286752369d3e6485283ffaa8b848d8322ed42e9ef5a4460a83cd175e6
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.sbom.sigstore.json is present in release v0.0.0-rehearsal.2
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 ts-aarch64-apple-darwin --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin: sha256:e9c304e55fceb4d0e2f6ac14ac5be9bed368b2628d1a90d6f4539757e129469a
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin is present in release v0.0.0-rehearsal.2
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 ts-aarch64-apple-darwin.spdx.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.spdx.json: sha256:d2d91805e717da7e98535c99536b7040eafd308f793dfda01698f8388a05be1f
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.spdx.json is present in release v0.0.0-rehearsal.2
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 ts-aarch64-apple-darwin.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.provenance.sigstore.json: sha256:e760be21e32de4e56f3ff5f1fc010e9a1f868541a3c4a4b4ae85a6e6b57be94e
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.provenance.sigstore.json is present in release v0.0.0-rehearsal.2
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 ts-aarch64-apple-darwin.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.sbom.sigstore.json: sha256:3ae4012afd48713ee795b9901bd82073477479e685a27f084a2fe562d8db7daf
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.sbom.sigstore.json is present in release v0.0.0-rehearsal.2
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 ts-x86_64-apple-darwin --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-apple-darwin: sha256:5f7ac1d7f7cf879a08ac8a767aa5dc9f9c92994f2188b2613f2b4739e86de3b0
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin is present in release v0.0.0-rehearsal.2
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 ts-x86_64-apple-darwin.spdx.json --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-apple-darwin.spdx.json: sha256:d1febe34dc5be26837c9f7cdbbbaabfcf32ced4e18bcbde2e5117f46ae292725
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.spdx.json is present in release v0.0.0-rehearsal.2
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 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:c7205112b4423c03112a119325a64c13f81ea64308b9112dea828ea7c56887a9
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.provenance.sigstore.json is present in release v0.0.0-rehearsal.2
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.2 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:48f523a296fec23e65a87e7294690ae23cd3c5627b8c282714c370976b4e5b73
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.sbom.sigstore.json is present in release v0.0.0-rehearsal.2
+ gh release verify-asset v0.0.0-rehearsal.2 SHA256SUMS --repo prk-Jr/trusted-server
Calculated digest for SHA256SUMS: sha256:476fb3a4f484fbd869ef2999641fec71bda78cbc7060869d781293bf6864f1a5
Resolved tag v0.0.0-rehearsal.2 to sha1:41896cb0798f98e759c020965ed675fe1e8808dc
Loaded attestation from GitHub API

✓ Verification succeeded! SHA256SUMS is present in release v0.0.0-rehearsal.2
+ shasum -a 256 --check SHA256SUMS
trusted-server-fastly.wasm: OK
trusted-server-fastly.wasm.spdx.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
+ WORKFLOW=prk-Jr/trusted-server/.github/workflows/release-build.yml
+ for asset in "${ASSETS[@]}"
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ IDENTITY=https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.2
+ for asset in "${ASSETS[@]}"
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.2 --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.2 --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ jq -e --slurpfile document trusted-server-fastly.wasm.spdx.json 'length == 1 and .[0].verificationResult.statement.predicate == $document[0]' trusted-server-fastly.wasm.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.2 --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.2 --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ 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.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.2 --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.2 --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ jq -e --slurpfile document ts-aarch64-apple-darwin.spdx.json 'length == 1 and .[0].verificationResult.statement.predicate == $document[0]' ts-aarch64-apple-darwin.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.2 --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.2 --source-ref refs/tags/v0.0.0-rehearsal.2 --source-digest 41896cb0798f98e759c020965ed675fe1e8808dc --signer-digest 41896cb0798f98e759c020965ed675fe1e8808dc --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ 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.sbom-verification.json
true

Verification exit status: 0

@prk-Jr

prk-Jr commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator Author

Successful rehearsal at ca902b6fea57f6cc37d2054687b4996687e9c476, explicitly approved lightweight fork tag v0.0.0-rehearsal.3.

Workflow — all jobs passed · immutable release · publisher log.

Release ID 420812096: immutable=true, draft=false, 17 exact nonempty assets (four binaries, four SPDX2.3 documents, eight real action-produced bundles and SHA256SUMS). No index, inventory, build-evidence, build-recipe or rebuild-check companions.

All four builds, all four isolated signing jobs, publication, cryptographic release/membership verification and the final release-ID/API read passed. The connection fix is exercised successfully; no mutation retry or tag reuse occurred. Immutable .2 remains untouched. No IAB tags, releases or settings were changed.

Independent verification completed with exit status 0 using checksum-verified GitHub CLI2.102.0, matching the publisher's recorded version: one release verification, 17 asset verifications, 16 attestation verifications (four binaries × provenance/SPDX × signer-prefix/exact tag-ref identity), all16 checksum entries and four signed-SPDX predicate comparisons. Commands are the guide's verification blocks with only repository/tag/commit substitutions.

Full verification transcript — commands and output
gh version 2.102.0 (2026-09-30)
https://github.com/cli/cli/releases/tag/v2.102.0
+ set -euo pipefail
+ REPO=prk-Jr/trusted-server
+ TAG=v0.0.0-rehearsal.3
+ COMMIT=ca902b6fea57f6cc37d2054687b4996687e9c476
+ ASSETS=(trusted-server-fastly.wasm ts-x86_64-unknown-linux-gnu ts-aarch64-apple-darwin ts-x86_64-apple-darwin)
+ gh release download v0.0.0-rehearsal.3 --repo prk-Jr/trusted-server --dir .
++ gh api repos/prk-Jr/trusted-server/releases/tags/v0.0.0-rehearsal.3 --jq .immutable
+ test true = true
+ gh release verify v0.0.0-rehearsal.3 --repo prk-Jr/trusted-server
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API
✓ Release v0.0.0-rehearsal.3 verified!

Assets
SHA256SUMS	sha256:29686a2ae6ada2c3fd0ac199ae6de311f911833a8c54fa440dd1ea7b96af80fa
trusted-server-fastly.wasm	sha256:89d37e3c609352c02db926f84855207cced5bdbf20ebe64e749508201930839a
trusted-server-fastly.wasm.provenance.sigstore.json	sha256:5496be6f043325eb48825f7b4a47cad8101ece122b8079dd6de9cd0b594de027
trusted-server-fastly.wasm.sbom.sigstore.json	sha256:ed1cc14bc191263001bc223450d5e927f6190f94a87287fa91f0675248789685
trusted-server-fastly.wasm.spdx.json	sha256:39ce9539a54c3b429c63703bddcdad8003b7f82acee9fa65cb64f3dc7f1389fa
ts-aarch64-apple-darwin	sha256:e9c304e55fceb4d0e2f6ac14ac5be9bed368b2628d1a90d6f4539757e129469a
ts-aarch64-apple-darwin.provenance.sigstore.json	sha256:5077668b55b4d60c9da64e128898d168c40b08d4b0ed8c056f0b1cddcd4e03b9
ts-aarch64-apple-darwin.sbom.sigstore.json	sha256:abfdb64938a232d8bda4c9dea6a033b17ce8d99180bb45f0ff04f85db216ecc3
ts-aarch64-apple-darwin.spdx.json	sha256:829d68025e1819349df37f48dfc920f077987aafaae295be1dad3745c465b82b
ts-x86_64-apple-darwin	sha256:5f7ac1d7f7cf879a08ac8a767aa5dc9f9c92994f2188b2613f2b4739e86de3b0
ts-x86_64-apple-darwin.provenance.sigstore.json	sha256:33bff32c9168afd637f05d42dfebf5868f56df67bdb78311bbd10d3c94a95887
ts-x86_64-apple-darwin.sbom.sigstore.json	sha256:27fb0981574dccad90fd3727722791efa9f652c11123c582c6e0531c0a330e96
ts-x86_64-apple-darwin.spdx.json	sha256:4c526f338f566d390df2ed86161b77d5d56b7fef97f381200dbfd41e8b1e111c
ts-x86_64-unknown-linux-gnu	sha256:2e734d6373ff472eb9799cbdefff5c235c97a3689c2e9a41adbc9f6df3b36c22
ts-x86_64-unknown-linux-gnu.provenance.sigstore.json	sha256:090fa5ed56e352571ba8d56b7599ad315fdcf77c8227fd1aeb4dc320f3f6f150
ts-x86_64-unknown-linux-gnu.sbom.sigstore.json	sha256:c34a77631639638b47b779096fa866633e4a37fd8b19d52339e1b35362348ba1
ts-x86_64-unknown-linux-gnu.spdx.json	sha256:da354431226d3dd9f51bc9ec09cc8ab560cfa0bc231657dc3fde3b6b3d6ff549

+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 trusted-server-fastly.wasm --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm: sha256:89d37e3c609352c02db926f84855207cced5bdbf20ebe64e749508201930839a
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm is present in release v0.0.0-rehearsal.3
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 trusted-server-fastly.wasm.spdx.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.spdx.json: sha256:39ce9539a54c3b429c63703bddcdad8003b7f82acee9fa65cb64f3dc7f1389fa
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.spdx.json is present in release v0.0.0-rehearsal.3
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 trusted-server-fastly.wasm.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.provenance.sigstore.json: sha256:5496be6f043325eb48825f7b4a47cad8101ece122b8079dd6de9cd0b594de027
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.provenance.sigstore.json is present in release v0.0.0-rehearsal.3
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 trusted-server-fastly.wasm.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.sbom.sigstore.json: sha256:ed1cc14bc191263001bc223450d5e927f6190f94a87287fa91f0675248789685
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.sbom.sigstore.json is present in release v0.0.0-rehearsal.3
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-unknown-linux-gnu: sha256:2e734d6373ff472eb9799cbdefff5c235c97a3689c2e9a41adbc9f6df3b36c22
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu is present in release v0.0.0-rehearsal.3
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 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:da354431226d3dd9f51bc9ec09cc8ab560cfa0bc231657dc3fde3b6b3d6ff549
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.spdx.json is present in release v0.0.0-rehearsal.3
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 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:090fa5ed56e352571ba8d56b7599ad315fdcf77c8227fd1aeb4dc320f3f6f150
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.provenance.sigstore.json is present in release v0.0.0-rehearsal.3
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 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:c34a77631639638b47b779096fa866633e4a37fd8b19d52339e1b35362348ba1
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.sbom.sigstore.json is present in release v0.0.0-rehearsal.3
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 ts-aarch64-apple-darwin --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin: sha256:e9c304e55fceb4d0e2f6ac14ac5be9bed368b2628d1a90d6f4539757e129469a
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin is present in release v0.0.0-rehearsal.3
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 ts-aarch64-apple-darwin.spdx.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.spdx.json: sha256:829d68025e1819349df37f48dfc920f077987aafaae295be1dad3745c465b82b
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.spdx.json is present in release v0.0.0-rehearsal.3
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 ts-aarch64-apple-darwin.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.provenance.sigstore.json: sha256:5077668b55b4d60c9da64e128898d168c40b08d4b0ed8c056f0b1cddcd4e03b9
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.provenance.sigstore.json is present in release v0.0.0-rehearsal.3
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 ts-aarch64-apple-darwin.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.sbom.sigstore.json: sha256:abfdb64938a232d8bda4c9dea6a033b17ce8d99180bb45f0ff04f85db216ecc3
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.sbom.sigstore.json is present in release v0.0.0-rehearsal.3
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 ts-x86_64-apple-darwin --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-apple-darwin: sha256:5f7ac1d7f7cf879a08ac8a767aa5dc9f9c92994f2188b2613f2b4739e86de3b0
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin is present in release v0.0.0-rehearsal.3
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 ts-x86_64-apple-darwin.spdx.json --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-apple-darwin.spdx.json: sha256:4c526f338f566d390df2ed86161b77d5d56b7fef97f381200dbfd41e8b1e111c
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.spdx.json is present in release v0.0.0-rehearsal.3
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 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:33bff32c9168afd637f05d42dfebf5868f56df67bdb78311bbd10d3c94a95887
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.provenance.sigstore.json is present in release v0.0.0-rehearsal.3
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.3 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:27fb0981574dccad90fd3727722791efa9f652c11123c582c6e0531c0a330e96
Resolved tag v0.0.0-rehearsal.3 to sha1:ca902b6fea57f6cc37d2054687b4996687e9c476
Loaded attestation from GitHub API

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

✓ Verification succeeded! SHA256SUMS is present in release v0.0.0-rehearsal.3
+ shasum -a 256 --check SHA256SUMS
trusted-server-fastly.wasm: OK
trusted-server-fastly.wasm.spdx.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
+ WORKFLOW=prk-Jr/trusted-server/.github/workflows/release-build.yml
+ for asset in "${ASSETS[@]}"
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ IDENTITY=https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.3
+ for asset in "${ASSETS[@]}"
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.3 --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.3 --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ jq -e --slurpfile document trusted-server-fastly.wasm.spdx.json 'length == 1 and .[0].verificationResult.statement.predicate == $document[0]' trusted-server-fastly.wasm.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.3 --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.3 --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ 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.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.3 --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.3 --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ jq -e --slurpfile document ts-aarch64-apple-darwin.spdx.json 'length == 1 and .[0].verificationResult.statement.predicate == $document[0]' ts-aarch64-apple-darwin.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.3 --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.3 --source-ref refs/tags/v0.0.0-rehearsal.3 --source-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --signer-digest ca902b6fea57f6cc37d2054687b4996687e9c476 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ 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.sbom-verification.json
true

Verification exit status: 0

@prk-Jr

prk-Jr commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator Author

Rehearsal v0.0.0-rehearsal.4 — offline verification and local Fastly execution at 922c2211c0cc7941bfc8ffa9f775ef8ac0971232.

GitHub CLI 2.102.0 matches the publisher log. Its official macOS ARM archive was checksum-verified (SHA-256 da922c20d1792e5b2cbf375593d7a658acf034c12c84e007e71c76ef959c337e). Public trust roots were fetched once while online; SHA-256 65ca537f6ed8a47fd0e560c421baa1f6c1efb8b25fc200d8c5c02c0e92eb2b9c. Local directory paths below are normalized; flags, identities, digests and results are unchanged.

Offline proof

All four binaries passed provenance and SPDX verification under OS-enforced network denial, with both signer identity forms, exact source/ref/signer digest pins, self-hosted runners denied, and published-SPDX predicate equality. No --offline flag is used.

gh --version
gh attestation trusted-root > trusted_root.jsonl
shasum -a 256 trusted_root.jsonl
/usr/bin/sandbox-exec -p '(version 1)(allow default)(deny network*)' env GH_TOKEN=offline-verification-no-network bash -x offline-verify.sh
gh version 2.102.0 (2026-09-30)
https://github.com/cli/cli/releases/tag/v2.102.0

curl: (6) Could not resolve host: api.github.com
SUCCESS: network-denial control refused an external HTTPS request (curl exit 6).
Full offline commands and success output
+ set -euxo pipefail
+ REPO=prk-Jr/trusted-server
+ TAG=v0.0.0-rehearsal.4
+ COMMIT=922c2211c0cc7941bfc8ffa9f775ef8ac0971232
+ WORKFLOW=prk-Jr/trusted-server/.github/workflows/release-build.yml
+ IDENTITY=https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4
+ ASSETS=(trusted-server-fastly.wasm ts-x86_64-unknown-linux-gnu ts-aarch64-apple-darwin ts-x86_64-apple-darwin)
+ for asset in "${ASSETS[@]}"
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ provenance == sbom ]]
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ [[ provenance == sbom ]]
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ sbom == sbom ]]
+ predicate=https://spdx.dev/Document/v2.3
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ [[ sbom == sbom ]]
+ 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-verification.json
true
+ for asset in "${ASSETS[@]}"
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ provenance == sbom ]]
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ [[ provenance == sbom ]]
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ sbom == sbom ]]
+ predicate=https://spdx.dev/Document/v2.3
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ [[ sbom == sbom ]]
+ 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-verification.json
true
+ for asset in "${ASSETS[@]}"
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ provenance == sbom ]]
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ [[ provenance == sbom ]]
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ sbom == sbom ]]
+ predicate=https://spdx.dev/Document/v2.3
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ [[ sbom == sbom ]]
+ 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-verification.json
true
+ for asset in "${ASSETS[@]}"
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ provenance == sbom ]]
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source pins
+ [[ provenance == sbom ]]
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ sbom == sbom ]]
+ predicate=https://spdx.dev/Document/v2.3
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --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.4 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source pins
+ [[ sbom == sbom ]]
+ 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-verification.json
true
+ printf '%s\n' 'SUCCESS: all four binaries verified offline for provenance and SPDX, both signer identities, exact source pins, and SPDX predicate equality.'
SUCCESS: all four binaries verified offline for provenance and SPDX, both signer identities, exact source pins, and SPDX predicate equality.

Local verified Fastly route

The downloaded wasm and host CLI first passed provenance and immutable release membership checks. Viceroy 0.21.0, pinned in the source tree, served a real configured page: HTTP 200, fixture origin marker, injected JS and the exact full source SHA in x-ts-version. This is local execution only; no Fastly service was contacted or deployed. The first fixture attempt was correctly rejected for unchanged example-domain placeholders; the successful fixture below uses loopback publisher values and public development secrets. Both release binaries remain byte-identical to the published assets.

Complete local commands and output
set -euxo pipefail
REPO_ROOT=<source-checkout>
EVIDENCE=<evidence-directory>
WORK="$EVIDENCE/viceroy-smoke-2"
TS="$EVIDENCE/ts-aarch64-apple-darwin"
WASM="$EVIDENCE/trusted-server-fastly.wasm"
VICEROY=<pinned-runtime-tools>/viceroy
mkdir "$WORK"
for port in 18888 17676; do
  if lsof -nP -iTCP:"$port" -sTCP:LISTEN; then exit 1; fi
done
cp "$REPO_ROOT/edgezero.toml" "$REPO_ROOT/fastly.toml" "$WORK/"
cp "$REPO_ROOT/trusted-server.example.toml" "$WORK/app.toml"
ln -s "$REPO_ROOT/crates" "$WORK/crates"
node - "$WORK" <<'JS'
const fs=require('node:fs');const root=process.argv[2];
const path=`${root}/app.toml`;let text=fs.readFileSync(path,'utf8');text=text.replace('domain = "example.com"','domain = "127.0.0.1"').replace('cookie_domain = ".example.com"','cookie_domain = "127.0.0.1"');text=text.replace('origin_url = "https://origin.example.com"','origin_url = "http://127.0.0.1:18888"');if(!text.includes('origin_url = "http://127.0.0.1:18888"'))throw Error('Origin fixture replacement failed');fs.writeFileSync(path,text);
const fastly=`${root}/fastly.toml`;text=fs.readFileSync(fastly,'utf8').replace('env = "FASTLY_KEY"','data = "fictional-local-api-key"');fs.writeFileSync(fastly,text);
JS
chmod u+x "$TS"
"$TS" --version
(cd "$WORK" && "$TS" config push --adapter fastly --local \
 --manifest "$WORK/edgezero.toml" --app-config "$WORK/app.toml" --no-diff --yes)
"$VICEROY" --version
cat > "$WORK/origin.mjs" <<'JS'
import http from 'node:http';
http.createServer((req,res)=>{res.writeHead(200,{'content-type':'text/html'});res.end('<!doctype html><html><head><title>Local release proof</title></head><body>phase1-verified-origin-marker</body></html>');}).listen(18888,'127.0.0.1');
JS
node "$WORK/origin.mjs" > "$WORK/origin.log" 2>&1 &
origin_pid=$!
cleanup() {
  if [[ -n "${viceroy_pid:-}" ]]; then kill "$viceroy_pid" 2>/dev/null || true; wait "$viceroy_pid" 2>/dev/null || true; fi
  kill "$origin_pid" 2>/dev/null || true
  wait "$origin_pid" 2>/dev/null || true
}
trap cleanup EXIT
"$VICEROY" serve -C "$WORK/fastly.toml" --addr 127.0.0.1:17676 "$WASM" > "$WORK/viceroy.log" 2>&1 &
viceroy_pid=$!
curl --fail --silent --show-error --retry 20 --retry-connrefused --retry-delay 1 \
 --retry-max-time 45 --max-time 30 -H 'Host: 127.0.0.1' \
 -D "$WORK/headers.txt" -o "$WORK/body.html" http://127.0.0.1:17676/
cat "$WORK/headers.txt"
node - "$WORK" <<'JS'
const fs=require('node:fs');const assert=require('node:assert/strict');const crypto=require('node:crypto');const work=process.argv[2];const headers=fs.readFileSync(`${work}/headers.txt`,'utf8');const body=fs.readFileSync(`${work}/body.html`);assert.match(headers,/^HTTP\/1\.1 200/m);assert.match(headers,/^x-ts-version: 922c2211c0cc7941bfc8ffa9f775ef8ac0971232\r?$/im);assert.ok(body.includes('phase1-verified-origin-marker'));assert.ok(body.includes('/static/tsjs=tsjs-unified.min.js'));console.log(`SUCCESS: configured Viceroy page returned HTTP200, origin marker, injected JS and exact release source header; ${body.length} bytes, sha256=${crypto.createHash('sha256').update(body).digest('hex')}`);
JS
+ for asset in trusted-server-fastly.wasm ts-aarch64-apple-darwin
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh release verify-asset v0.0.0-rehearsal.4 trusted-server-fastly.wasm --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm: sha256:de00f637e3f2e7d85c86a4f4af3efb74b9f44db1932ceae9cfd7afb527cf2acc
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm is present in release v0.0.0-rehearsal.4
+ for asset in trusted-server-fastly.wasm ts-aarch64-apple-darwin
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ gh release verify-asset v0.0.0-rehearsal.4 ts-aarch64-apple-darwin --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin: sha256:e9c304e55fceb4d0e2f6ac14ac5be9bed368b2628d1a90d6f4539757e129469a
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin is present in release v0.0.0-rehearsal.4
+ REPO_ROOT=<source-checkout>
+ EVIDENCE=<evidence-directory>
+ WORK=<evidence-directory>/viceroy-smoke-2
+ TS=<evidence-directory>/ts-aarch64-apple-darwin
+ WASM=<evidence-directory>/trusted-server-fastly.wasm
+ VICEROY=<pinned-runtime-tools>/viceroy
+ mkdir <evidence-directory>/viceroy-smoke-2
+ for port in 18888 17676
+ lsof -nP -iTCP:18888 -sTCP:LISTEN
+ for port in 18888 17676
+ lsof -nP -iTCP:17676 -sTCP:LISTEN
+ cp <source-checkout>/edgezero.toml <source-checkout>/fastly.toml <evidence-directory>/viceroy-smoke-2/
+ cp <source-checkout>/trusted-server.example.toml <evidence-directory>/viceroy-smoke-2/app.toml
+ ln -s <source-checkout>/crates <evidence-directory>/viceroy-smoke-2/crates
+ node - <evidence-directory>/viceroy-smoke-2
+ chmod u+x <evidence-directory>/ts-aarch64-apple-darwin
+ <evidence-directory>/ts-aarch64-apple-darwin --version
ts 0.1.0
+ cd <evidence-directory>/viceroy-smoke-2
+ <evidence-directory>/ts-aarch64-apple-darwin config push --adapter fastly --local --manifest <evidence-directory>/viceroy-smoke-2/edgezero.toml --app-config <evidence-directory>/viceroy-smoke-2/app.toml --no-diff --yes
wrote 1 physical entries (1 logical) to `[local_server.config_stores.trusted_server_config.contents]` in <evidence-directory>/viceroy-smoke-2/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
+ <pinned-runtime-tools>/viceroy --version
viceroy 0.21.0
+ cat
+ origin_pid=74910
+ trap cleanup EXIT
+ node <evidence-directory>/viceroy-smoke-2/origin.mjs
+ viceroy_pid=74911
+ curl --fail --silent --show-error --retry 20 --retry-connrefused --retry-delay 1 --retry-max-time 45 --max-time 30 -H 'Host: 127.0.0.1' -D <evidence-directory>/viceroy-smoke-2/headers.txt -o <evidence-directory>/viceroy-smoke-2/body.html http://127.0.0.1:17676/
+ <pinned-runtime-tools>/viceroy serve -C <evidence-directory>/viceroy-smoke-2/fastly.toml --addr 127.0.0.1:17676 <evidence-directory>/trusted-server-fastly.wasm
curl: (7) Failed to connect to 127.0.0.1 port 17676 after 0 ms: Couldn't connect to server
curl: (7) Failed to connect to 127.0.0.1 port 17676 after 0 ms: Couldn't connect to server
+ cat <evidence-directory>/viceroy-smoke-2/headers.txt
HTTP/1.1 200 OK
content-type: text/html
date: Thu, 22 Oct 2026 16:53:48 GMT
connection: keep-alive
keep-alive: timeout=5
x-ts-fastly-version: 0
x-geo-city: San Francisco
x-geo-country: US
x-geo-continent: NorthAmerica
x-geo-coordinates: 37.77869,-122.39557
x-geo-region: CA
x-geo-info-available: true
x-ts-version: 922c2211c0cc7941bfc8ffa9f775ef8ac0971232
transfer-encoding: chunked

+ node - <evidence-directory>/viceroy-smoke-2
SUCCESS: configured Viceroy page returned HTTP200, origin marker, injected JS and exact release source header; 262 bytes, sha256=faafc52e92b3981f7a899b5bb3f6d85cebcb045618bce3727bbd1be3f1b869e2
+ cleanup
+ [[ -n 74911 ]]
+ kill 74911
+ wait 74911
+ true
+ kill 74910
+ wait 74910
+ true

@prk-Jr

prk-Jr commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator Author

Rehearsal v0.0.0-rehearsal.4 passed at 922c2211c0cc7941bfc8ffa9f775ef8ac0971232.

  • Build/sign/publication run: success; all four builds and signing jobs passed. Read-only publisher checks passed; no transient retry was observed in this run.
  • Published immutable release: ID 420956687, draft=false, immutable=true, exactly 17 nonempty assets.
  • Independent GitHub CLI 2.102.0 verification passed: release, every one of 17 assets, all 16 checksum entries, provenance + SPDX for each binary with both signer checks and exact source pins, and all four SPDX predicate comparisons.
  • Complete offline verification and local Viceroy page proof also passed. Offline verification used OS-enforced network denial, with an external-request denial control.

Download record

The ordinary release download was interrupted because transfer throughput was too low. Read-only bounded range downloads fetched the same release URLs; complete assembled files matched the published SHA-256 metadata before verification. No binary was substituted from a CI artifact or another release. Small companions were independently digest-checked as well. Commands and output follow; scripts existed only in the temporary evidence directory.

Download commands and complete digest results
gh api repos/prk-Jr/trusted-server/releases/tags/v0.0.0-rehearsal.4 > release-metadata.json
node range-download.mjs
node small-download.mjs
import fs from 'node:fs';
import {promisify} from 'node:util';
import {execFile} from 'node:child_process';
import crypto from 'node:crypto';
const run=promisify(execFile);
const release=JSON.parse(fs.readFileSync('release-metadata.json'));
const binaries=release.assets.filter(a=> !a.name.includes('.') || a.name.endsWith('.wasm'));
fs.mkdirSync('ranges',{recursive:true});
const tasks=[]; const chunk=2*1024*1024;
for(const a of binaries) for(let offset=0;offset<a.size;offset+=chunk) tasks.push({a,offset,end:Math.min(a.size-1,offset+chunk-1)});
let done=0;
async function worker(){while(tasks.length){const {a,offset,end}=tasks.shift();const out=`ranges/${a.name}.${offset}`; await run('curl',['--fail','--silent','--show-error','--location','--retry','2','--max-time','180','--range',`${offset}-${end}`,'--max-filesize',String(end-offset+1),'--output',out,a.browser_download_url]);if(fs.statSync(out).size!==end-offset+1)throw Error(`Range size mismatch: ${a.name} ${offset}`);done++;if(done%16===0)console.log(`Downloaded ${done} ranges`);}}
await Promise.all(Array.from({length:16},worker));
for(const a of binaries){const dest=fs.openSync(`${a.name}.assembled`,'w');const hash=crypto.createHash('sha256');for(let o=0;o<a.size;o+=chunk){const b=fs.readFileSync(`ranges/${a.name}.${o}`);fs.writeSync(dest,b);hash.update(b);}fs.closeSync(dest);if(`sha256:${hash.digest('hex')}`!==a.digest)throw Error(`Digest mismatch: ${a.name}`);fs.renameSync(`${a.name}.assembled`,a.name);console.log(`SUCCESS: ${a.name}: ${a.size} bytes match ${a.digest}`);}
import fs from 'node:fs';import crypto from 'node:crypto';import {promisify} from 'node:util';import {execFile} from 'node:child_process';
const run=promisify(execFile);const {assets}=JSON.parse(fs.readFileSync('release-metadata.json'));await Promise.all(assets.filter(a=>a.size<2*1024*1024).map(async a=>{const valid=()=>fs.existsSync(a.name)&&`sha256:${crypto.createHash('sha256').update(fs.readFileSync(a.name)).digest('hex')}`===a.digest;if(!valid())await run('curl',['--fail','--silent','--show-error','--location','--max-time','180','--output',a.name,a.browser_download_url]);if(!valid())throw Error(`Bad asset: ${a.name}`);console.log(`SUCCESS: ${a.name} matches published digest`);}));
Downloaded 16 ranges
Downloaded 32 ranges
Downloaded 48 ranges
Downloaded 64 ranges
Downloaded 80 ranges
Downloaded 96 ranges
Downloaded 112 ranges
Downloaded 128 ranges
Downloaded 144 ranges
Downloaded 160 ranges
Downloaded 176 ranges
Downloaded 192 ranges
Downloaded 208 ranges
Downloaded 224 ranges
SUCCESS: SHA256SUMS: 1680 bytes match sha256:c8b4b31749f129f129030ccb5537291fe9252812ede3ed411e0bd5b23302fa11
SUCCESS: trusted-server-fastly.wasm: 79205388 bytes match sha256:de00f637e3f2e7d85c86a4f4af3efb74b9f44db1932ceae9cfd7afb527cf2acc
SUCCESS: ts-aarch64-apple-darwin: 41016160 bytes match sha256:e9c304e55fceb4d0e2f6ac14ac5be9bed368b2628d1a90d6f4539757e129469a
SUCCESS: ts-x86_64-apple-darwin: 43716264 bytes match sha256:5f7ac1d7f7cf879a08ac8a767aa5dc9f9c92994f2188b2613f2b4739e86de3b0
SUCCESS: ts-x86_64-unknown-linux-gnu: 301367192 bytes match sha256:31939021aae813bd9235f9e2d5e19b8aff2df829b802f3e231bb4218edddcd23

SUCCESS: SHA256SUMS matches published digest
SUCCESS: trusted-server-fastly.wasm.provenance.sigstore.json matches published digest
SUCCESS: trusted-server-fastly.wasm.sbom.sigstore.json matches published digest
SUCCESS: trusted-server-fastly.wasm.spdx.json matches published digest
SUCCESS: ts-aarch64-apple-darwin.provenance.sigstore.json matches published digest
SUCCESS: ts-aarch64-apple-darwin.sbom.sigstore.json matches published digest
SUCCESS: ts-aarch64-apple-darwin.spdx.json matches published digest
SUCCESS: ts-x86_64-apple-darwin.provenance.sigstore.json matches published digest
SUCCESS: ts-x86_64-apple-darwin.sbom.sigstore.json matches published digest
SUCCESS: ts-x86_64-apple-darwin.spdx.json matches published digest
SUCCESS: ts-x86_64-unknown-linux-gnu.provenance.sigstore.json matches published digest
SUCCESS: ts-x86_64-unknown-linux-gnu.sbom.sigstore.json matches published digest
SUCCESS: ts-x86_64-unknown-linux-gnu.spdx.json matches published digest

Full online verification transcript

A small shell wrapper prints an explicit success line after each successful attestation command; JSON results remain separate for predicate comparison.

gh version 2.102.0 (2026-09-30)
https://github.com/cli/cli/releases/tag/v2.102.0

+ set -euxo pipefail
+ REPO=prk-Jr/trusted-server
+ TAG=v0.0.0-rehearsal.4
+ COMMIT=922c2211c0cc7941bfc8ffa9f775ef8ac0971232
+ ASSETS=(trusted-server-fastly.wasm ts-x86_64-unknown-linux-gnu ts-aarch64-apple-darwin ts-x86_64-apple-darwin)
++ gh api repos/prk-Jr/trusted-server/releases/tags/v0.0.0-rehearsal.4 --jq .immutable
++ command gh api repos/prk-Jr/trusted-server/releases/tags/v0.0.0-rehearsal.4 --jq .immutable
++ [[ api repos/prk-Jr/trusted-server/releases/tags/v0.0.0-rehearsal.4 == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ test true = true
+ gh release verify v0.0.0-rehearsal.4 --repo prk-Jr/trusted-server
+ command gh release verify v0.0.0-rehearsal.4 --repo prk-Jr/trusted-server
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API
✓ Release v0.0.0-rehearsal.4 verified!

Assets
SHA256SUMS	sha256:c8b4b31749f129f129030ccb5537291fe9252812ede3ed411e0bd5b23302fa11
trusted-server-fastly.wasm	sha256:de00f637e3f2e7d85c86a4f4af3efb74b9f44db1932ceae9cfd7afb527cf2acc
trusted-server-fastly.wasm.provenance.sigstore.json	sha256:1bb8bc84fce4ea8fac5aa25d6c17d07e2414dce03f21ac83601612bd35a11b0f
trusted-server-fastly.wasm.sbom.sigstore.json	sha256:11e72f0e7cd734ccf00474dfc9286e8d17026b9a749eacd0ffaeb26fc72ef399
trusted-server-fastly.wasm.spdx.json	sha256:0061b1312ecc193f708443f4eb3e1331aeca29e37359f86b7fbacae80259d28a
ts-aarch64-apple-darwin	sha256:e9c304e55fceb4d0e2f6ac14ac5be9bed368b2628d1a90d6f4539757e129469a
ts-aarch64-apple-darwin.provenance.sigstore.json	sha256:72af781b8d2e78dad49cda954d6353c592ec26fbb4b1352a4ca8bc044887a546
ts-aarch64-apple-darwin.sbom.sigstore.json	sha256:904c2dbbabef22767b5410c214e5a7408e2cba7fed4257b4e87d6a6571616b6c
ts-aarch64-apple-darwin.spdx.json	sha256:cffc12d7a497e28351f55b983fe4597c8de403ffaae47a2710f15517c02420ca
ts-x86_64-apple-darwin	sha256:5f7ac1d7f7cf879a08ac8a767aa5dc9f9c92994f2188b2613f2b4739e86de3b0
ts-x86_64-apple-darwin.provenance.sigstore.json	sha256:b7c4bf502d821cd9394b51964cf0ebaaae1e80065612d331ac8259bfdad8da47
ts-x86_64-apple-darwin.sbom.sigstore.json	sha256:cd5b5825949fc766908d9642f73d21f694e6017e043d316e1a67a1285e0fa708
ts-x86_64-apple-darwin.spdx.json	sha256:e50e59da87302c2580cb913fd139536eae6e7ee25355d99aaf423f0523955302
ts-x86_64-unknown-linux-gnu	sha256:31939021aae813bd9235f9e2d5e19b8aff2df829b802f3e231bb4218edddcd23
ts-x86_64-unknown-linux-gnu.provenance.sigstore.json	sha256:290204585ee557d7f597ff0733ac2b0b4430b1ede1a19020f0a9f2c1aa55c15a
ts-x86_64-unknown-linux-gnu.sbom.sigstore.json	sha256:4faf079fdf6bfea38f13fde5bda87e295bfe0570ff3a78ce700d59edb6b4c6bd
ts-x86_64-unknown-linux-gnu.spdx.json	sha256:d6374385364d06cc6a35223c71b586ba265a8af93084547690085378e394909c

+ [[ release verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 trusted-server-fastly.wasm --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 trusted-server-fastly.wasm --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm: sha256:de00f637e3f2e7d85c86a4f4af3efb74b9f44db1932ceae9cfd7afb527cf2acc
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 trusted-server-fastly.wasm.spdx.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 trusted-server-fastly.wasm.spdx.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.spdx.json: sha256:0061b1312ecc193f708443f4eb3e1331aeca29e37359f86b7fbacae80259d28a
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.spdx.json is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 trusted-server-fastly.wasm.provenance.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 trusted-server-fastly.wasm.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.provenance.sigstore.json: sha256:1bb8bc84fce4ea8fac5aa25d6c17d07e2414dce03f21ac83601612bd35a11b0f
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.provenance.sigstore.json is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 trusted-server-fastly.wasm.sbom.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 trusted-server-fastly.wasm.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.sbom.sigstore.json: sha256:11e72f0e7cd734ccf00474dfc9286e8d17026b9a749eacd0ffaeb26fc72ef399
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.sbom.sigstore.json is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-unknown-linux-gnu: sha256:31939021aae813bd9235f9e2d5e19b8aff2df829b802f3e231bb4218edddcd23
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 ts-x86_64-unknown-linux-gnu.spdx.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 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:d6374385364d06cc6a35223c71b586ba265a8af93084547690085378e394909c
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.spdx.json is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 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:290204585ee557d7f597ff0733ac2b0b4430b1ede1a19020f0a9f2c1aa55c15a
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.provenance.sigstore.json is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 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:4faf079fdf6bfea38f13fde5bda87e295bfe0570ff3a78ce700d59edb6b4c6bd
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.sbom.sigstore.json is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 ts-aarch64-apple-darwin --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 ts-aarch64-apple-darwin --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin: sha256:e9c304e55fceb4d0e2f6ac14ac5be9bed368b2628d1a90d6f4539757e129469a
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 ts-aarch64-apple-darwin.spdx.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 ts-aarch64-apple-darwin.spdx.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.spdx.json: sha256:cffc12d7a497e28351f55b983fe4597c8de403ffaae47a2710f15517c02420ca
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.spdx.json is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 ts-aarch64-apple-darwin.provenance.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 ts-aarch64-apple-darwin.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.provenance.sigstore.json: sha256:72af781b8d2e78dad49cda954d6353c592ec26fbb4b1352a4ca8bc044887a546
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.provenance.sigstore.json is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 ts-aarch64-apple-darwin.sbom.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 ts-aarch64-apple-darwin.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.sbom.sigstore.json: sha256:904c2dbbabef22767b5410c214e5a7408e2cba7fed4257b4e87d6a6571616b6c
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.sbom.sigstore.json is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 ts-x86_64-apple-darwin --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 ts-x86_64-apple-darwin --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-apple-darwin: sha256:5f7ac1d7f7cf879a08ac8a767aa5dc9f9c92994f2188b2613f2b4739e86de3b0
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 ts-x86_64-apple-darwin.spdx.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 ts-x86_64-apple-darwin.spdx.json --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-apple-darwin.spdx.json: sha256:e50e59da87302c2580cb913fd139536eae6e7ee25355d99aaf423f0523955302
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.spdx.json is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 ts-x86_64-apple-darwin.provenance.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 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:b7c4bf502d821cd9394b51964cf0ebaaae1e80065612d331ac8259bfdad8da47
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.provenance.sigstore.json is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.4 ts-x86_64-apple-darwin.sbom.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 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:cd5b5825949fc766908d9642f73d21f694e6017e043d316e1a67a1285e0fa708
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.sbom.sigstore.json is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ gh release verify-asset v0.0.0-rehearsal.4 SHA256SUMS --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.4 SHA256SUMS --repo prk-Jr/trusted-server
Calculated digest for SHA256SUMS: sha256:c8b4b31749f129f129030ccb5537291fe9252812ede3ed411e0bd5b23302fa11
Resolved tag v0.0.0-rehearsal.4 to sha1:922c2211c0cc7941bfc8ffa9f775ef8ac0971232
Loaded attestation from GitHub API

✓ Verification succeeded! SHA256SUMS is present in release v0.0.0-rehearsal.4
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ shasum -a 256 --check SHA256SUMS
trusted-server-fastly.wasm: OK
trusted-server-fastly.wasm.spdx.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
+ WORKFLOW=prk-Jr/trusted-server/.github/workflows/release-build.yml
+ for asset in "${ASSETS[@]}"
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source pins
+ IDENTITY=https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4
+ for asset in "${ASSETS[@]}"
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ jq -e --slurpfile document trusted-server-fastly.wasm.spdx.json 'length == 1 and .[0].verificationResult.statement.predicate == $document[0]' trusted-server-fastly.wasm.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source 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.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ jq -e --slurpfile document ts-aarch64-apple-darwin.spdx.json 'length == 1 and .[0].verificationResult.statement.predicate == $document[0]' ts-aarch64-apple-darwin.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.4 --source-ref refs/tags/v0.0.0-rehearsal.4 --source-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --signer-digest 922c2211c0cc7941bfc8ffa9f775ef8ac0971232 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source 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.sbom-verification.json
true
+ printf '%s\n' 'SUCCESS: release, all 17 assets, 16 checksums, both predicates and both signer identities for each binary, and four SPDX predicate comparisons verified.'
SUCCESS: release, all 17 assets, 16 checksums, both predicates and both signer identities for each binary, and four SPDX predicate comparisons verified.

@prk-Jr

prk-Jr commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator Author

Rehearsal v0.0.0-rehearsal.5 passed at exact implementation SHA 937214a632f9387601dba94f996de78b2e6ee424.

Build/sign/publication run passed all seven builds/signing jobs and immutable publication. Published release: ID 421431085, draft=false, immutable=true, exactly 29 nonempty assets. The 28 checksum entries exclude SHA256SUMS itself. Local directory paths are normalized below; commands, flags, identities, digests and results are unchanged.

Full online verification transcript, part 1. A wrapper prints explicit success after each successful attestation command; JSON output stays separate for SPDX equality.

+ REPO=prk-Jr/trusted-server
+ TAG=v0.0.0-rehearsal.5
+ COMMIT=937214a632f9387601dba94f996de78b2e6ee424
+ ASSETS=(trusted-server-fastly.wasm ts-x86_64-unknown-linux-gnu ts-aarch64-apple-darwin ts-x86_64-apple-darwin trusted-server-axum-x86_64-unknown-linux-gnu trusted-server-axum-x86_64-unknown-linux-musl trusted-server-axum-aarch64-unknown-linux-gnu)
++ gh api repos/prk-Jr/trusted-server/releases/tags/v0.0.0-rehearsal.5 --jq .immutable
++ command gh api repos/prk-Jr/trusted-server/releases/tags/v0.0.0-rehearsal.5 --jq .immutable
++ [[ api repos/prk-Jr/trusted-server/releases/tags/v0.0.0-rehearsal.5 == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ test true = true
+ gh release verify v0.0.0-rehearsal.5 --repo prk-Jr/trusted-server
+ command gh release verify v0.0.0-rehearsal.5 --repo prk-Jr/trusted-server
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API
✓ Release v0.0.0-rehearsal.5 verified!

Assets
SHA256SUMS	sha256:3f38663ad78cef4c1ea44c44efad58f406946382f5b2f997df556eada1d56c79
trusted-server-axum-aarch64-unknown-linux-gnu	sha256:f8f7c3cfd7853f545a38e08bf0a396dd201d241bd3c6b0511d99d0f938022079
trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json	sha256:4b76d82e6b093a46ce43c014e42056c8aed9fd8172fc7993831178bd34af6cc7
trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json	sha256:a8a3002e5e693efd21f467dea052d7f1b22c7e65589fb47b7b0321657b2e805b
trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json	sha256:a46a7f00fe0618d0d158e56629eb0a4fc73771658bf946addb605cf48e8855d0
trusted-server-axum-x86_64-unknown-linux-gnu	sha256:b85a2cc54c8639d66d79186cf49771161e712762631596cb6f213afa83abd030
trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json	sha256:9df3528ad8ec7857c713abe7a3b2bfdc29311eecf7b43d1ff84b2a533233aab2
trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json	sha256:bcfa163bf41792a363adfbe47b43675fcc2093c97585d8d3917c636d0de55568
trusted-server-axum-x86_64-unknown-linux-gnu.spdx.json	sha256:a02059e57b64245d046385cdedb93a767f8153fadfb887fec2fdd230e91dee9f
trusted-server-axum-x86_64-unknown-linux-musl	sha256:0216ea9f103a0d79db666ff6351bb29d5391921fa29e971b4d68a76359a40210
trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json	sha256:28a3f816f399d8fcad31e687eb895c0f4157e75798d493c73e50f72dbb3fe714
trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json	sha256:552f9f3278327a5ce2a3b28479afacd2271fb77c5e49ddf43ad23e901d5932de
trusted-server-axum-x86_64-unknown-linux-musl.spdx.json	sha256:28ea8ffd121056a2f51accfd4b19a9c1e20cf4001e9850ae1d5c15c6f059b1be
trusted-server-fastly.wasm	sha256:bed94df95e5cb29e8ab3255321bd8bf00aa56ffd60e5de60875323ad433169f0
trusted-server-fastly.wasm.provenance.sigstore.json	sha256:ada20d6cfab75df65c806f0d409a94e20fc98d530f37b8754793bfc4b9675f7b
trusted-server-fastly.wasm.sbom.sigstore.json	sha256:09df79d511a245eef3ecc475b4aed2fbee6fb5d5f28ecffce080786b4ae67734
trusted-server-fastly.wasm.spdx.json	sha256:8a9151f823605956b1e5cb6a71f7b3c44b30326daa1fc71e0efc74a7fe47d861
ts-aarch64-apple-darwin	sha256:e9c304e55fceb4d0e2f6ac14ac5be9bed368b2628d1a90d6f4539757e129469a
ts-aarch64-apple-darwin.provenance.sigstore.json	sha256:6c8457aca6a32ad2ee1aaacc3e487cd128f91ddde01a8fd890cb44c1445ec28e
ts-aarch64-apple-darwin.sbom.sigstore.json	sha256:9381d35091d84d584abaa2e818faa5669412c5cd9a7577835d6ab4185dea7d1d
ts-aarch64-apple-darwin.spdx.json	sha256:2f84d645eea59ec314d1f7c4ab14b2be3bc430b783bfa09dfadb97c02d428934
ts-x86_64-apple-darwin	sha256:5f7ac1d7f7cf879a08ac8a767aa5dc9f9c92994f2188b2613f2b4739e86de3b0
ts-x86_64-apple-darwin.provenance.sigstore.json	sha256:0dadcf76761adbb724be84959ce7fcae745ac53707947d005f02efa414570378
ts-x86_64-apple-darwin.sbom.sigstore.json	sha256:9621f16ffaef815664aeefcb3af8185e83ac676c87af018c365cbae75f1eb0a5
ts-x86_64-apple-darwin.spdx.json	sha256:31e1e2356e5bdcb2390147cdf4b0eaef2f2c317ac4abc7eb7c0ff2e6873cdf8b
ts-x86_64-unknown-linux-gnu	sha256:1a5945133d5270855c501176cdc098da00d5439f9ecc33a0c07b3c84bf574944
ts-x86_64-unknown-linux-gnu.provenance.sigstore.json	sha256:e798fe2f208c1d2946b38cb6da8b426c90901581298d2125dffa65a69e889484
ts-x86_64-unknown-linux-gnu.sbom.sigstore.json	sha256:6efad56f336a17c1ca68cde1e38b97dac80446d95570f3afdaecfe45d291f606
ts-x86_64-unknown-linux-gnu.spdx.json	sha256:7e930e468e6b7cfd0726fabccd00be11e24286a54bc4f9c814baa82eb4058387

+ [[ release verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-fastly.wasm --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 trusted-server-fastly.wasm --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm: sha256:bed94df95e5cb29e8ab3255321bd8bf00aa56ffd60e5de60875323ad433169f0
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-fastly.wasm.spdx.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 trusted-server-fastly.wasm.spdx.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.spdx.json: sha256:8a9151f823605956b1e5cb6a71f7b3c44b30326daa1fc71e0efc74a7fe47d861
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.spdx.json is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-fastly.wasm.provenance.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 trusted-server-fastly.wasm.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.provenance.sigstore.json: sha256:ada20d6cfab75df65c806f0d409a94e20fc98d530f37b8754793bfc4b9675f7b
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.provenance.sigstore.json is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-fastly.wasm.sbom.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 trusted-server-fastly.wasm.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm.sbom.sigstore.json: sha256:09df79d511a245eef3ecc475b4aed2fbee6fb5d5f28ecffce080786b4ae67734
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-fastly.wasm.sbom.sigstore.json is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-unknown-linux-gnu: sha256:1a5945133d5270855c501176cdc098da00d5439f9ecc33a0c07b3c84bf574944
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 ts-x86_64-unknown-linux-gnu.spdx.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:7e930e468e6b7cfd0726fabccd00be11e24286a54bc4f9c814baa82eb4058387
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.spdx.json is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:e798fe2f208c1d2946b38cb6da8b426c90901581298d2125dffa65a69e889484
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.provenance.sigstore.json is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:6efad56f336a17c1ca68cde1e38b97dac80446d95570f3afdaecfe45d291f606
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.sbom.sigstore.json is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 ts-aarch64-apple-darwin --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 ts-aarch64-apple-darwin --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin: sha256:e9c304e55fceb4d0e2f6ac14ac5be9bed368b2628d1a90d6f4539757e129469a
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 ts-aarch64-apple-darwin.spdx.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 ts-aarch64-apple-darwin.spdx.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.spdx.json: sha256:2f84d645eea59ec314d1f7c4ab14b2be3bc430b783bfa09dfadb97c02d428934
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.spdx.json is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 ts-aarch64-apple-darwin.provenance.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 ts-aarch64-apple-darwin.provenance.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.provenance.sigstore.json: sha256:6c8457aca6a32ad2ee1aaacc3e487cd128f91ddde01a8fd890cb44c1445ec28e
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.provenance.sigstore.json is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 ts-aarch64-apple-darwin.sbom.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 ts-aarch64-apple-darwin.sbom.sigstore.json --repo prk-Jr/trusted-server
Calculated digest for ts-aarch64-apple-darwin.sbom.sigstore.json: sha256:9381d35091d84d584abaa2e818faa5669412c5cd9a7577835d6ab4185dea7d1d
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! ts-aarch64-apple-darwin.sbom.sigstore.json is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 ts-x86_64-apple-darwin --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 ts-x86_64-apple-darwin --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-apple-darwin: sha256:5f7ac1d7f7cf879a08ac8a767aa5dc9f9c92994f2188b2613f2b4739e86de3b0
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 ts-x86_64-apple-darwin.spdx.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 ts-x86_64-apple-darwin.spdx.json --repo prk-Jr/trusted-server
Calculated digest for ts-x86_64-apple-darwin.spdx.json: sha256:31e1e2356e5bdcb2390147cdf4b0eaef2f2c317ac4abc7eb7c0ff2e6873cdf8b
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.spdx.json is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 ts-x86_64-apple-darwin.provenance.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:0dadcf76761adbb724be84959ce7fcae745ac53707947d005f02efa414570378
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.provenance.sigstore.json is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 ts-x86_64-apple-darwin.sbom.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:9621f16ffaef815664aeefcb3af8185e83ac676c87af018c365cbae75f1eb0a5
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.sbom.sigstore.json is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:b85a2cc54c8639d66d79186cf49771161e712762631596cb6f213afa83abd030
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-x86_64-unknown-linux-gnu is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-axum-x86_64-unknown-linux-gnu.spdx.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:a02059e57b64245d046385cdedb93a767f8153fadfb887fec2fdd230e91dee9f
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
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.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:9df3528ad8ec7857c713abe7a3b2bfdc29311eecf7b43d1ff84b2a533233aab2
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
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.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:bcfa163bf41792a363adfbe47b43675fcc2093c97585d8d3917c636d0de55568
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
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.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:0216ea9f103a0d79db666ff6351bb29d5391921fa29e971b4d68a76359a40210
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-x86_64-unknown-linux-musl is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-axum-x86_64-unknown-linux-musl.spdx.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:28ea8ffd121056a2f51accfd4b19a9c1e20cf4001e9850ae1d5c15c6f059b1be
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
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.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:28a3f816f399d8fcad31e687eb895c0f4157e75798d493c73e50f72dbb3fe714
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
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.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:552f9f3278327a5ce2a3b28479afacd2271fb77c5e49ddf43ad23e901d5932de
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
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.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for asset in "${ASSETS[@]}"
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-aarch64-unknown-linux-gnu: sha256:f8f7c3cfd7853f545a38e08bf0a396dd201d241bd3c6b0511d99d0f938022079
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-aarch64-unknown-linux-gnu is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:a46a7f00fe0618d0d158e56629eb0a4fc73771658bf946addb605cf48e8855d0
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:4b76d82e6b093a46ce43c014e42056c8aed9fd8172fc7993831178bd34af6cc7
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
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.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ for suffix in '' .spdx.json .provenance.sigstore.json .sbom.sigstore.json
+ gh release verify-asset v0.0.0-rehearsal.5 trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 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:a8a3002e5e693efd21f467dea052d7f1b22c7e65589fb47b7b0321657b2e805b
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
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.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ gh release verify-asset v0.0.0-rehearsal.5 SHA256SUMS --repo prk-Jr/trusted-server
+ command gh release verify-asset v0.0.0-rehearsal.5 SHA256SUMS --repo prk-Jr/trusted-server
Calculated digest for SHA256SUMS: sha256:3f38663ad78cef4c1ea44c44efad58f406946382f5b2f997df556eada1d56c79
Resolved tag v0.0.0-rehearsal.5 to sha1:937214a632f9387601dba94f996de78b2e6ee424
Loaded attestation from GitHub API

✓ Verification succeeded! SHA256SUMS is present in release v0.0.0-rehearsal.5
+ [[ release verify-asset == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ 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.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
+ WORKFLOW=prk-Jr/trusted-server/.github/workflows/release-build.yml
+ for asset in "${ASSETS[@]}"
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source pins
+ for asset in "${ASSETS[@]}"
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ for asset in "${ASSETS[@]}"
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-musl
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl with requested predicate, signer and source pins
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-musl
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl with requested predicate, signer and source pins
+ for asset in "${ASSETS[@]}"
+ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-aarch64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ command gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-aarch64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu with requested predicate, signer and source pins
+ IDENTITY=https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5
+ for asset in "${ASSETS[@]}"
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ jq -e --slurpfile document trusted-server-fastly.wasm.spdx.json 'length == 1 and .[0].verificationResult.statement.predicate == $document[0]' trusted-server-fastly.wasm.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"

@prk-Jr

prk-Jr commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator Author

Rehearsal v0.0.0-rehearsal.5 passed at exact implementation SHA 937214a632f9387601dba94f996de78b2e6ee424.

Build/sign/publication run passed all seven builds/signing jobs and immutable publication. Published release: ID 421431085, draft=false, immutable=true, exactly 29 nonempty assets. The 28 checksum entries exclude SHA256SUMS itself. Local directory paths are normalized below; commands, flags, identities, digests and results are unchanged.

Full online verification transcript, part 2.

+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source 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.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ jq -e --slurpfile document ts-aarch64-apple-darwin.spdx.json 'length == 1 and .[0].verificationResult.statement.predicate == $document[0]' ts-aarch64-apple-darwin.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source 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.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu with requested predicate, signer and source 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.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-musl
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl with requested predicate, signer and source pins
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-musl
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl with requested predicate, signer and source 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.sbom-verification.json
true
+ for asset in "${ASSETS[@]}"
+ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ command gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-aarch64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ command gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json --cert-identity https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5 --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-aarch64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu with requested predicate, signer and source 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.sbom-verification.json
true
+ printf '%s\n' 'SUCCESS: release, all 29 assets, 28 checksums, both predicates and both signer identities for each binary, and seven SPDX predicate comparisons verified.'
SUCCESS: release, all 29 assets, 28 checksums, both predicates and both signer identities for each binary, and seven SPDX predicate comparisons verified.

@prk-Jr

prk-Jr commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator Author

Rehearsal v0.0.0-rehearsal.5 passed at exact implementation SHA 937214a632f9387601dba94f996de78b2e6ee424.

Build/sign/publication run passed all seven builds/signing jobs and immutable publication. Published release: ID 421431085, draft=false, immutable=true, exactly 29 nonempty assets. The 28 checksum entries exclude SHA256SUMS itself. Local directory paths are normalized below; commands, flags, identities, digests and results are unchanged.

All seven binaries passed provenance and SPDX verification with both signer identity forms, exact source/ref/signer pins, self-hosted runners denied and published-SPDX predicate equality under OS-enforced network denial. No --offline flag is used. GitHub CLI 2.102.0 matches the publisher; its official ARM macOS archive SHA-256 is da922c20d1792e5b2cbf375593d7a658acf034c12c84e007e71c76ef959c337e. Public trust roots were fetched once online.

gh version 2.102.0 (2026-09-30)
https://github.com/cli/cli/releases/tag/v2.102.0

65ca537f6ed8a47fd0e560c421baa1f6c1efb8b25fc200d8c5c02c0e92eb2b9c  <evidence-directory>/trusted_root.jsonl
gh attestation trusted-root > trusted_root.jsonl
shasum -a 256 trusted_root.jsonl
/usr/bin/sandbox-exec -p '(version 1)(allow default)(deny network*)' env GH_TOKEN=offline-verification-no-network bash -x offline-verify.sh
curl: (6) Could not resolve host: example.com
SUCCESS: OS network-denial control blocked external HTTPS; curl exit 6
+ REPO=prk-Jr/trusted-server
+ TAG=v0.0.0-rehearsal.5
+ COMMIT=937214a632f9387601dba94f996de78b2e6ee424
+ WORKFLOW=prk-Jr/trusted-server/.github/workflows/release-build.yml
+ IDENTITY=https://github.com/prk-Jr/trusted-server/.github/workflows/release-build.yml@refs/tags/v0.0.0-rehearsal.5
+ ASSETS=(trusted-server-fastly.wasm ts-x86_64-unknown-linux-gnu ts-aarch64-apple-darwin ts-x86_64-apple-darwin trusted-server-axum-x86_64-unknown-linux-gnu trusted-server-axum-x86_64-unknown-linux-musl trusted-server-axum-aarch64-unknown-linux-gnu)
+ for asset in "${ASSETS[@]}"
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ provenance == sbom ]]
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ [[ provenance == sbom ]]
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ sbom == sbom ]]
+ predicate=https://spdx.dev/Document/v2.3
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ command gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --bundle trusted-server-fastly.wasm.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-fastly.wasm
SUCCESS: gh attestation verify trusted-server-fastly.wasm with requested predicate, signer and source pins
+ [[ sbom == sbom ]]
+ 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-verification.json
true
+ for asset in "${ASSETS[@]}"
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ provenance == sbom ]]
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ [[ provenance == sbom ]]
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ sbom == sbom ]]
+ predicate=https://spdx.dev/Document/v2.3
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ command gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle ts-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify ts-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ [[ sbom == sbom ]]
+ 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-verification.json
true
+ for asset in "${ASSETS[@]}"
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ provenance == sbom ]]
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ [[ provenance == sbom ]]
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ sbom == sbom ]]
+ predicate=https://spdx.dev/Document/v2.3
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ command gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-aarch64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-aarch64-apple-darwin
SUCCESS: gh attestation verify ts-aarch64-apple-darwin with requested predicate, signer and source pins
+ [[ sbom == sbom ]]
+ 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-verification.json
true
+ for asset in "${ASSETS[@]}"
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ provenance == sbom ]]
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source pins
+ [[ provenance == sbom ]]
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ sbom == sbom ]]
+ predicate=https://spdx.dev/Document/v2.3
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source pins
+ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ command gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --bundle ts-x86_64-apple-darwin.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' ts-x86_64-apple-darwin
SUCCESS: gh attestation verify ts-x86_64-apple-darwin with requested predicate, signer and source pins
+ [[ sbom == sbom ]]
+ 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-verification.json
true
+ for asset in "${ASSETS[@]}"
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ provenance == sbom ]]
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ [[ provenance == sbom ]]
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ sbom == sbom ]]
+ predicate=https://spdx.dev/Document/v2.3
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu with requested predicate, signer and source pins
+ [[ sbom == sbom ]]
+ 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-verification.json
true
+ for asset in "${ASSETS[@]}"
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ provenance == sbom ]]
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-musl
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl with requested predicate, signer and source pins
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-musl
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl with requested predicate, signer and source pins
+ [[ provenance == sbom ]]
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ sbom == sbom ]]
+ predicate=https://spdx.dev/Document/v2.3
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-musl
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl with requested predicate, signer and source pins
+ gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ command gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl --repo prk-Jr/trusted-server --bundle trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-x86_64-unknown-linux-musl
SUCCESS: gh attestation verify trusted-server-axum-x86_64-unknown-linux-musl with requested predicate, signer and source pins
+ [[ sbom == sbom ]]
+ 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-verification.json
true
+ for asset in "${ASSETS[@]}"
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ provenance == sbom ]]
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://slsa.dev/provenance/v1 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-aarch64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ command gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-aarch64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu with requested predicate, signer and source pins
+ [[ provenance == sbom ]]
+ for kind in provenance sbom
+ predicate=https://slsa.dev/provenance/v1
+ [[ sbom == sbom ]]
+ predicate=https://spdx.dev/Document/v2.3
+ checks=(--repo "$REPO" --bundle "$asset.$kind.sigstore.json" --custom-trusted-root trusted_root.jsonl --source-ref "refs/tags/$TAG" --source-digest "$COMMIT" --signer-digest "$COMMIT" --deny-self-hosted-runners --predicate-type "$predicate")
+ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ command gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --deny-self-hosted-runners --predicate-type https://spdx.dev/Document/v2.3 --signer-workflow prk-Jr/trusted-server/.github/workflows/release-build.yml
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-aarch64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu with requested predicate, signer and source pins
+ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ command gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --bundle trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json --custom-trusted-root trusted_root.jsonl --source-ref refs/tags/v0.0.0-rehearsal.5 --source-digest 937214a632f9387601dba94f996de78b2e6ee424 --signer-digest 937214a632f9387601dba94f996de78b2e6ee424 --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.5 --format json
+ [[ attestation verify == \a\t\t\e\s\t\a\t\i\o\n\ \v\e\r\i\f\y ]]
+ printf 'SUCCESS: gh attestation verify %s with requested predicate, signer and source pins\n' trusted-server-axum-aarch64-unknown-linux-gnu
SUCCESS: gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu with requested predicate, signer and source pins
+ [[ sbom == sbom ]]
+ 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-verification.json
true
+ printf '%s\n' 'SUCCESS: all seven binaries verified offline for provenance and SPDX, both signer identities, exact source pins, and SPDX predicate equality.'
SUCCESS: all seven binaries verified offline for provenance and SPDX, both signer identities, exact source pins, and SPDX predicate equality.

@prk-Jr

prk-Jr commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator Author

Rehearsal v0.0.0-rehearsal.5 passed at exact implementation SHA 937214a632f9387601dba94f996de78b2e6ee424.

Build/sign/publication run passed all seven builds/signing jobs and immutable publication. Published release: ID 421431085, draft=false, immutable=true, exactly 29 nonempty assets. The 28 checksum entries exclude SHA256SUMS itself. Local directory paths are normalized below; commands, flags, identities, digests and results are unchanged.

Verified release wasm and host CLI were executed locally with pinned Viceroy 0.21.0, fictional loopback configuration and a local Node origin. A real page returned HTTP200, origin marker, injected JS and the exact full source SHA in x-ts-version. No Fastly service was contacted or deployed. GNU startup smokes cover Debian12/Ubuntu22.04/UBI9; ARM uses native Debian12; static musl uses pinned Alpine and a scratch-like rootfs with read-only runtime CA data. These are startup checks, not complete runtime/load qualification.

set -euxo pipefail
REPO_ROOT=<source-checkout>
EVIDENCE=<evidence-directory>
WORK="$EVIDENCE/viceroy-smoke"
TS="$EVIDENCE/ts-aarch64-apple-darwin"
WASM="$EVIDENCE/trusted-server-fastly.wasm"
VICEROY=<pinned-runtime-tools>/viceroy
mkdir "$WORK"
for port in 18888 17676; do
  if lsof -nP -iTCP:"$port" -sTCP:LISTEN; then exit 1; fi
done
cp "$REPO_ROOT/edgezero.toml" "$REPO_ROOT/fastly.toml" "$WORK/"
cp "$REPO_ROOT/trusted-server.example.toml" "$WORK/app.toml"
ln -s "$REPO_ROOT/crates" "$WORK/crates"
node - "$WORK" <<'JS'
const fs=require('node:fs');const root=process.argv[2];
const path=`${root}/app.toml`;let text=fs.readFileSync(path,'utf8');text=text.replace('domain = "example.com"','domain = "127.0.0.1"').replace('cookie_domain = ".example.com"','cookie_domain = "127.0.0.1"');text=text.replace('origin_url = "https://origin.example.com"','origin_url = "http://127.0.0.1:18888"');if(!text.includes('origin_url = "http://127.0.0.1:18888"'))throw Error('Origin fixture replacement failed');fs.writeFileSync(path,text);
const fastly=`${root}/fastly.toml`;text=fs.readFileSync(fastly,'utf8').replace('env = "FASTLY_KEY"','data = "fictional-local-api-key"');fs.writeFileSync(fastly,text);
JS
chmod u+x "$TS"
"$TS" --version
(cd "$WORK" && "$TS" config push --adapter fastly --local \
 --manifest "$WORK/edgezero.toml" --app-config "$WORK/app.toml" --no-diff --yes)
"$VICEROY" --version
cat > "$WORK/origin.mjs" <<'JS'
import http from 'node:http';
http.createServer((req,res)=>{res.writeHead(200,{'content-type':'text/html'});res.end('<!doctype html><html><head><title>Local release proof</title></head><body>phase1-verified-origin-marker</body></html>');}).listen(18888,'127.0.0.1');
JS
node "$WORK/origin.mjs" > "$WORK/origin.log" 2>&1 &
origin_pid=$!
cleanup() {
  if [[ -n "${viceroy_pid:-}" ]]; then kill "$viceroy_pid" 2>/dev/null || true; wait "$viceroy_pid" 2>/dev/null || true; fi
  kill "$origin_pid" 2>/dev/null || true
  wait "$origin_pid" 2>/dev/null || true
}
trap cleanup EXIT
"$VICEROY" serve -C "$WORK/fastly.toml" --addr 127.0.0.1:17676 "$WASM" > "$WORK/viceroy.log" 2>&1 &
viceroy_pid=$!
curl --fail --silent --show-error --retry 20 --retry-connrefused --retry-delay 1 \
 --retry-max-time 45 --max-time 30 -H 'Host: 127.0.0.1' \
 -D "$WORK/headers.txt" -o "$WORK/body.html" http://127.0.0.1:17676/
cat "$WORK/headers.txt"
node - "$WORK" <<'JS'
const fs=require('node:fs');const assert=require('node:assert/strict');const crypto=require('node:crypto');const work=process.argv[2];const headers=fs.readFileSync(`${work}/headers.txt`,'utf8');const body=fs.readFileSync(`${work}/body.html`);assert.match(headers,/^HTTP\/1\.1 200/m);assert.match(headers,/^x-ts-version: 937214a632f9387601dba94f996de78b2e6ee424\r?$/im);assert.ok(body.includes('phase1-verified-origin-marker'));assert.ok(body.includes('/static/tsjs=tsjs-unified.min.js'));console.log(`SUCCESS: configured Viceroy page returned HTTP200, origin marker, injected JS and exact release source header; ${body.length} bytes, sha256=${crypto.createHash('sha256').update(body).digest('hex')}`);
JS
+ REPO_ROOT=<source-checkout>
+ EVIDENCE=<evidence-directory>
+ WORK=<evidence-directory>/viceroy-smoke
+ TS=<evidence-directory>/ts-aarch64-apple-darwin
+ WASM=<evidence-directory>/trusted-server-fastly.wasm
+ VICEROY=<pinned-runtime-tools>/viceroy
+ mkdir <evidence-directory>/viceroy-smoke
+ for port in 18888 17676
+ lsof -nP -iTCP:18888 -sTCP:LISTEN
+ for port in 18888 17676
+ lsof -nP -iTCP:17676 -sTCP:LISTEN
+ cp <source-checkout>/edgezero.toml <source-checkout>/fastly.toml <evidence-directory>/viceroy-smoke/
+ cp <source-checkout>/trusted-server.example.toml <evidence-directory>/viceroy-smoke/app.toml
+ ln -s <source-checkout>/crates <evidence-directory>/viceroy-smoke/crates
+ node - <evidence-directory>/viceroy-smoke
+ chmod u+x <evidence-directory>/ts-aarch64-apple-darwin
+ <evidence-directory>/ts-aarch64-apple-darwin --version
ts 0.1.0
+ cd <evidence-directory>/viceroy-smoke
+ <evidence-directory>/ts-aarch64-apple-darwin config push --adapter fastly --local --manifest <evidence-directory>/viceroy-smoke/edgezero.toml --app-config <evidence-directory>/viceroy-smoke/app.toml --no-diff --yes
wrote 1 physical entries (1 logical) to `[local_server.config_stores.trusted_server_config.contents]` in <evidence-directory>/viceroy-smoke/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
+ <pinned-runtime-tools>/viceroy --version
viceroy 0.21.0
+ cat
+ origin_pid=10234
+ trap cleanup EXIT
+ node <evidence-directory>/viceroy-smoke/origin.mjs
+ viceroy_pid=10235
+ curl --fail --silent --show-error --retry 20 --retry-connrefused --retry-delay 1 --retry-max-time 45 --max-time 30 -H 'Host: 127.0.0.1' -D <evidence-directory>/viceroy-smoke/headers.txt -o <evidence-directory>/viceroy-smoke/body.html http://127.0.0.1:17676/
+ <pinned-runtime-tools>/viceroy serve -C <evidence-directory>/viceroy-smoke/fastly.toml --addr 127.0.0.1:17676 <evidence-directory>/trusted-server-fastly.wasm
curl: (7) Failed to connect to 127.0.0.1 port 17676 after 0 ms: Couldn't connect to server
curl: (7) Failed to connect to 127.0.0.1 port 17676 after 0 ms: Couldn't connect to server
+ cat <evidence-directory>/viceroy-smoke/headers.txt
HTTP/1.1 200 OK
content-type: text/html
date: Fri, 23 Oct 2026 04:21:06 GMT
connection: keep-alive
keep-alive: timeout=5
x-ts-fastly-version: 0
x-geo-city: San Francisco
x-geo-country: US
x-geo-continent: NorthAmerica
x-geo-coordinates: 37.77869,-122.39557
x-geo-region: CA
x-geo-info-available: true
x-ts-version: 937214a632f9387601dba94f996de78b2e6ee424
transfer-encoding: chunked

+ node - <evidence-directory>/viceroy-smoke
SUCCESS: configured Viceroy page returned HTTP200, origin marker, injected JS and exact release source header; 262 bytes, sha256=faafc52e92b3981f7a899b5bb3f6d85cebcb045618bce3727bbd1be3f1b869e2
+ cleanup
+ [[ -n 10235 ]]
+ kill 10235
+ wait 10235
+ true
+ kill 10234
+ wait 10234
+ true
Rehearsal .5 build/startup output at 937214a632f9387601dba94f996de78b2e6ee424.
Extracts retain every final-byte/version/health SUCCESS and image identity line; full job logs are linked. Axum receives a fictional runtime envelope/secrets and a read-only system CA bundle; no operator values enter build inputs.

trusted-server-fastly.wasm
https://github.com/prk-Jr/trusted-server/actions/runs/39894486002/job/120221655801
2026-10-23T03:23:39.4388773Z SUCCESS: final-byte checks wasm32-wasip1 

ts-x86_64-unknown-linux-gnu
https://github.com/prk-Jr/trusted-server/actions/runs/39894486002/job/120221655819
2026-10-23T03:21:32.9161053Z GNU builder: registry.access.redhat.com/ubi9/ubi:9.6@sha256:dec374e05cc13ebbc0975c9f521f3db6942d27f8ccdf06b180160490eef8bdbc sha256:3bc5d61e715a6a4591cd1736ef9af2f3cec3e3006545b48ac3fc01f82dfbe202
2026-10-23T03:21:33.1134831Z ldd (GNU libc) 2.34
2026-10-23T03:28:36.0807215Z 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
2026-10-23T03:28:36.0842547Z SUCCESS: ts 0.1.0
2026-10-23T03:28:37.7940213Z Runtime image: debian:12-slim sha256:8da84df25d28176be84164040cd45e128c6b4c6a80b7d7cbe17fe2b9f198efc2
2026-10-23T03:28:38.6111438Z SUCCESS: ts 0.1.0
2026-10-23T03:28:40.2337502Z Runtime image: ubuntu:22.04 sha256:cee13550f97b8a595506e8e4ca74263ba44924248779a4ba4f942e197652acff
2026-10-23T03:28:40.4147597Z SUCCESS: ts 0.1.0
2026-10-23T03:28:42.3890028Z Runtime image: registry.access.redhat.com/ubi9/ubi-minimal:9.6 sha256:a2c5a85865a585c3bc8b10f6c269358fdf89fe32be4232885166889d85c76421
2026-10-23T03:28:42.5618567Z SUCCESS: ts 0.1.0

ts-aarch64-apple-darwin
https://github.com/prk-Jr/trusted-server/actions/runs/39894486002/job/120221655878
2026-10-23T03:28:41.3891200Z SUCCESS: final-byte checks aarch64-apple-darwin 
2026-10-23T03:28:41.4092670Z SUCCESS: ts 0.1.0

ts-x86_64-apple-darwin
https://github.com/prk-Jr/trusted-server/actions/runs/39894486002/job/120221655820
2026-10-23T03:45:58.2123180Z SUCCESS: final-byte checks x86_64-apple-darwin 
2026-10-23T03:45:58.2307710Z SUCCESS: ts 0.1.0

trusted-server-axum-x86_64-unknown-linux-gnu
https://github.com/prk-Jr/trusted-server/actions/runs/39894486002/job/120221655935
2026-10-23T03:21:44.0810858Z GNU builder: registry.access.redhat.com/ubi9/ubi:9.6@sha256:dec374e05cc13ebbc0975c9f521f3db6942d27f8ccdf06b180160490eef8bdbc sha256:436362b004a1b2e1aad25ecd39169461d46ea5804516c634890ff627b8b03a21
2026-10-23T03:21:44.2780888Z ldd (GNU libc) 2.34
2026-10-23T03:25:42.9566707Z 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
2026-10-23T03:25:45.5004618Z Runtime image: debian:12-slim sha256:8da84df25d28176be84164040cd45e128c6b4c6a80b7d7cbe17fe2b9f198efc2
2026-10-23T03:25:45.9554948Z SUCCESS: configured Axum health returned 200 ok: debian:12-slim sha256:8da84df25d28176be84164040cd45e128c6b4c6a80b7d7cbe17fe2b9f198efc2
2026-10-23T03:25:48.4541057Z Runtime image: ubuntu:22.04 sha256:cee13550f97b8a595506e8e4ca74263ba44924248779a4ba4f942e197652acff
2026-10-23T03:25:48.6225796Z SUCCESS: configured Axum health returned 200 ok: ubuntu:22.04 sha256:cee13550f97b8a595506e8e4ca74263ba44924248779a4ba4f942e197652acff
2026-10-23T03:25:51.2992569Z Runtime image: registry.access.redhat.com/ubi9/ubi-minimal:9.6 sha256:a2c5a85865a585c3bc8b10f6c269358fdf89fe32be4232885166889d85c76421
2026-10-23T03:25:51.4595006Z SUCCESS: configured Axum health returned 200 ok: registry.access.redhat.com/ubi9/ubi-minimal:9.6 sha256:a2c5a85865a585c3bc8b10f6c269358fdf89fe32be4232885166889d85c76421

trusted-server-axum-x86_64-unknown-linux-musl
https://github.com/prk-Jr/trusted-server/actions/runs/39894486002/job/120221655764
2026-10-23T03:21:18.2570786Z 13.3.0
2026-10-23T03:23:42.7273213Z SUCCESS: final-byte checks x86_64-unknown-linux-musl 
2026-10-23T03:23:43.6509821Z Runtime image: alpine:3.22.2@sha256:4b7ce07002c69e8f3d704a9c5d6fd3053be500b7f1c69fc0d80990c2ad8dd412 sha256:706db57fb2063f39f69632c5b5c9c439633fda35110e65587c5d85553fd1cc38
2026-10-23T03:23:46.1214767Z SUCCESS: configured Axum health returned 200 ok: alpine:3.22.2@sha256:4b7ce07002c69e8f3d704a9c5d6fd3053be500b7f1c69fc0d80990c2ad8dd412 sha256:706db57fb2063f39f69632c5b5c9c439633fda35110e65587c5d85553fd1cc38
2026-10-23T03:23:46.1958094Z Runtime image: scratch sha256:adc64582cbdfe5d17151d1937d4aac3a35f1d9f1dd71993e977b710d1efc9fb6
2026-10-23T03:23:46.2787583Z SUCCESS: configured Axum health returned 200 ok: scratch sha256:adc64582cbdfe5d17151d1937d4aac3a35f1d9f1dd71993e977b710d1efc9fb6

trusted-server-axum-aarch64-unknown-linux-gnu
https://github.com/prk-Jr/trusted-server/actions/runs/39894486002/job/120221656167
2026-10-23T03:21:29.3448553Z GNU builder: registry.access.redhat.com/ubi9/ubi:9.6@sha256:dec374e05cc13ebbc0975c9f521f3db6942d27f8ccdf06b180160490eef8bdbc sha256:0391b18e549b49d4296a8de7fd651884f26ab6029dc1a297446d0cdae96f738f
2026-10-23T03:21:29.4912420Z ldd (GNU libc) 2.34
2026-10-23T03:24:19.9998959Z 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
2026-10-23T03:24:21.6483013Z Runtime image: debian:12-slim sha256:28fe65558df3e10c89e7d685cb86544cdc138f242d12100c5b0981f92aae0853
2026-10-23T03:24:22.4995813Z SUCCESS: configured Axum health returned 200 ok: debian:12-slim sha256:28fe65558df3e10c89e7d685cb86544cdc138f242d12100c5b0981f92aae0853

@prk-Jr

prk-Jr commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator Author

Rehearsal v0.0.0-rehearsal.5 passed at exact implementation SHA 937214a632f9387601dba94f996de78b2e6ee424.

Build/sign/publication run passed all seven builds/signing jobs and immutable publication. Published release: ID 421431085, draft=false, immutable=true, exactly 29 nonempty assets. The 28 checksum entries exclude SHA256SUMS itself. Local directory paths are normalized below; commands, flags, identities, digests and results are unchanged.

All 29 published files were downloaded from this release. Bounded range downloads were assembled and checked against the published SHA-256 metadata; small companions were independently digest-checked. No earlier release or CI artifact substituted for a binary.

gh api repos/prk-Jr/trusted-server/releases/tags/v0.0.0-rehearsal.5 > release-metadata.json
node range-download.mjs
node small-download.mjs
node check-downloads.mjs
import fs from 'node:fs';
import {promisify} from 'node:util';
import {execFile} from 'node:child_process';
import crypto from 'node:crypto';
const run=promisify(execFile);
const release=JSON.parse(fs.readFileSync('release-metadata.json'));
const binaries=release.assets.filter(a=> a.size>=2*1024*1024);
fs.mkdirSync('ranges',{recursive:true});
const tasks=[]; const chunk=2*1024*1024;
for(const a of binaries) for(let offset=0;offset<a.size;offset+=chunk) tasks.push({a,offset,end:Math.min(a.size-1,offset+chunk-1)});
let done=0;
async function worker(){while(tasks.length){const {a,offset,end}=tasks.shift();const out=`ranges/${a.name}.${offset}`; await run('curl',['--fail','--silent','--show-error','--location','--retry','2','--max-time','180','--range',`${offset}-${end}`,'--max-filesize',String(end-offset+1),'--output',out,a.browser_download_url]);if(fs.statSync(out).size!==end-offset+1)throw Error(`Range size mismatch: ${a.name} ${offset}`);done++;if(done%32===0)console.log(`Downloaded ${done} ranges`);}}
await Promise.all(Array.from({length:32},worker));
for(const a of binaries){const dest=fs.openSync(`${a.name}.assembled`,'w');const hash=crypto.createHash('sha256');for(let o=0;o<a.size;o+=chunk){const b=fs.readFileSync(`ranges/${a.name}.${o}`);fs.writeSync(dest,b);hash.update(b);}fs.closeSync(dest);if(`sha256:${hash.digest('hex')}`!==a.digest)throw Error(`Digest mismatch: ${a.name}`);fs.renameSync(`${a.name}.assembled`,a.name);console.log(`SUCCESS: ${a.name}: ${a.size} bytes match ${a.digest}`);}
import fs from 'node:fs';import crypto from 'node:crypto';import {promisify} from 'node:util';import {execFile} from 'node:child_process';
const run=promisify(execFile);const {assets}=JSON.parse(fs.readFileSync('release-metadata.json'));await Promise.all(assets.filter(a=>a.size<2*1024*1024).map(async a=>{const valid=()=>fs.existsSync(a.name)&&`sha256:${crypto.createHash('sha256').update(fs.readFileSync(a.name)).digest('hex')}`===a.digest;if(!valid())await run('curl',['--fail','--silent','--show-error','--location','--max-time','180','--output',a.name,a.browser_download_url]);if(!valid())throw Error(`Bad asset: ${a.name}`);console.log(`SUCCESS: ${a.name} matches published digest`);}));
import fs from'node:fs';import assert from'node:assert/strict';import crypto from'node:crypto';
const release=JSON.parse(fs.readFileSync('release-metadata.json'));const expected=JSON.parse(fs.readFileSync('expected-assets.json'));
assert.equal(release.immutable,true);assert.equal(release.draft,false);assert.deepEqual(release.assets.map(a=>a.name).sort(),expected);assert.equal(expected.length,29);
for(const a of release.assets){assert(fs.lstatSync(a.name).isFile());const bytes=fs.readFileSync(a.name);assert(bytes.length>0);assert.equal(bytes.length,a.size);assert.equal('sha256:'+crypto.createHash('sha256').update(bytes).digest('hex'),a.digest);}
const sums=fs.readFileSync('SHA256SUMS','utf8').trim().split('\n');assert.equal(sums.length,28);assert.deepEqual(sums.map(line=>line.match(/^[a-f0-9]{64}  (.+)$/)[1]).sort(),expected.filter(a=>a!=='SHA256SUMS'));
console.log('SUCCESS: immutable published release contains exactly29 nonempty assets with published digests; SHA256SUMS covers exactly28 companions and binaries, excluding itself.');
Downloaded 32 ranges
Downloaded 64 ranges
Downloaded 96 ranges
Downloaded 128 ranges
Downloaded 160 ranges
Downloaded 192 ranges
Downloaded 224 ranges
Downloaded 256 ranges
Downloaded 288 ranges
Downloaded 320 ranges
Downloaded 352 ranges
Downloaded 384 ranges
Downloaded 416 ranges
SUCCESS: trusted-server-axum-aarch64-unknown-linux-gnu: 136522176 bytes match sha256:f8f7c3cfd7853f545a38e08bf0a396dd201d241bd3c6b0511d99d0f938022079
SUCCESS: trusted-server-axum-x86_64-unknown-linux-gnu: 136384928 bytes match sha256:b85a2cc54c8639d66d79186cf49771161e712762631596cb6f213afa83abd030
SUCCESS: trusted-server-axum-x86_64-unknown-linux-musl: 135732912 bytes match sha256:0216ea9f103a0d79db666ff6351bb29d5391921fa29e971b4d68a76359a40210
SUCCESS: trusted-server-fastly.wasm: 79205388 bytes match sha256:bed94df95e5cb29e8ab3255321bd8bf00aa56ffd60e5de60875323ad433169f0
SUCCESS: ts-aarch64-apple-darwin: 41016160 bytes match sha256:e9c304e55fceb4d0e2f6ac14ac5be9bed368b2628d1a90d6f4539757e129469a
SUCCESS: ts-x86_64-apple-darwin: 43716264 bytes match sha256:5f7ac1d7f7cf879a08ac8a767aa5dc9f9c92994f2188b2613f2b4739e86de3b0
SUCCESS: ts-x86_64-unknown-linux-gnu: 299996528 bytes match sha256:1a5945133d5270855c501176cdc098da00d5439f9ecc33a0c07b3c84bf574944

SUCCESS: trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json matches published digest
SUCCESS: SHA256SUMS matches published digest
SUCCESS: trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json matches published digest
SUCCESS: trusted-server-fastly.wasm.provenance.sigstore.json matches published digest
SUCCESS: trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json matches published digest
SUCCESS: ts-aarch64-apple-darwin.provenance.sigstore.json matches published digest
SUCCESS: ts-x86_64-unknown-linux-gnu.provenance.sigstore.json matches published digest
SUCCESS: ts-x86_64-apple-darwin.provenance.sigstore.json matches published digest
SUCCESS: trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json matches published digest
SUCCESS: trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json matches published digest
SUCCESS: trusted-server-fastly.wasm.sbom.sigstore.json matches published digest
SUCCESS: trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json matches published digest
SUCCESS: trusted-server-axum-x86_64-unknown-linux-gnu.spdx.json matches published digest
SUCCESS: trusted-server-axum-x86_64-unknown-linux-musl.spdx.json matches published digest
SUCCESS: trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json matches published digest
SUCCESS: ts-x86_64-unknown-linux-gnu.sbom.sigstore.json matches published digest
SUCCESS: trusted-server-fastly.wasm.spdx.json matches published digest
SUCCESS: ts-aarch64-apple-darwin.sbom.sigstore.json matches published digest
SUCCESS: ts-x86_64-unknown-linux-gnu.spdx.json matches published digest
SUCCESS: ts-aarch64-apple-darwin.spdx.json matches published digest
SUCCESS: ts-x86_64-apple-darwin.spdx.json matches published digest
SUCCESS: ts-x86_64-apple-darwin.sbom.sigstore.json matches published digest

SUCCESS: immutable published release contains exactly29 nonempty assets with published digests; SHA256SUMS covers exactly28 companions and binaries, excluding itself.

@prk-Jr

prk-Jr commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator Author

Rehearsal v0.0.0-rehearsal.5 passed at exact implementation SHA 937214a632f9387601dba94f996de78b2e6ee424. The fresh tag is lightweight.

  • Implementation CI: 31 checks passed; signing/publication correctly skipped on the PR.
  • Fork rehearsal: all seven builds, seven signing jobs, immutable publication and post-publish checks passed. No transient read retry was observed.
  • Immutable release, ID 421431085: draft=false, immutable=true, exactly 29 nonempty assets. No upstream tags, releases or settings changed.
  • Independent GitHub CLI 2.102.0 verification passed immutable membership for every asset, 28 checksum entries, provenance + SPDX for each of seven binaries, both exact signer identity forms, source/ref/signer digest pins, self-hosted runners denied, and seven published-SPDX predicate comparisons.
  • Offline attestation verification passed under OS-enforced network denial, including both signer forms and SPDX equality for all seven binaries.
  • Startup/image-ID evidence passed for the GNU baseline, static musl and native CLI targets. Verified release wasm and host CLI served a real configured page in pinned Viceroy 0.21.0: HTTP200, origin marker, injected JS and exact full source header. Runtime CA data is explicitly supplied to Axum smokes.

Full commands and explicit success output:

  1. Online verification: part 1, part 2.
  2. Complete offline verification and network-denial control.
  3. All build/startup outputs, image IDs and local Viceroy proof.
  4. Download commands, complete file digests and checksum coverage.

Any following documentation-only head retains this exact rehearsed implementation SHA. The PR remains draft; no reviewers requested. Maintainer production-release/settings and allowlist review gates remain.

- Supply a fictional commit to the release-mode CLI test so a
  fallback to local git cannot pass, and assert release mode
  matches the supplied control
- Anchor the publication gate assertion to the job-level if
- Document the read timeout and job-bounded mutations
@prk-Jr

prk-Jr commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator Author

Phase 1 rehearsal .11 failed before draft creation

Exact reviewed head ab6e5493636fd3d1db4b22a071189070f90a189a; fork run. All seven builds and all seven signing jobs succeeded. The release job had Contents: write, then the single draft-create POST returned HTTP 403. No release or matching draft exists; .11 remains a lightweight tag at the reviewed SHA. No mutation was retried and the tag will not be reused. This does not clear the publication rehearsal gate.

success build / checks
success build / Build ts-aarch64-apple-darwin
success build / Build trusted-server-axum-x86_64-unknown-linux-musl
success build / Build trusted-server-axum-x86_64-unknown-linux-gnu
success build / Build ts-x86_64-unknown-linux-gnu
success build / Build trusted-server-axum-aarch64-unknown-linux-gnu
success build / Build trusted-server-fastly.wasm
success build / Build ts-x86_64-apple-darwin
success build / sign (trusted-server-axum-aarch64-unknown-linux-gnu)
success build / sign (ts-x86_64-unknown-linux-gnu)
success build / sign (trusted-server-axum-x86_64-unknown-linux-musl)
success build / sign (ts-x86_64-apple-darwin)
success build / sign (ts-aarch64-apple-darwin)
success build / sign (trusted-server-axum-x86_64-unknown-linux-gnu)
success build / sign (trusted-server-fastly.wasm)
failure release
GITHUB_TOKEN permissions: Contents: write; Metadata: read
release	Verify handoff, create once, publish by release ID and verify	2026-10-27T10:35:39.6017955Z Error: GitHub API failed: POST releases 403
release	Verify handoff, create once, publish by release ID and verify	2026-10-27T10:35:39.6021355Z   status: 403,
release	Verify handoff, create once, publish by release ID and verify	2026-10-27T10:35:39.6022018Z   retryAfter: null
release	Verify handoff, create once, publish by release ID and verify	2026-10-27T10:35:39.6124287Z ##[error]Process completed with exit code 1.
GET release by tag: HTTP 404
List releases including drafts: no matching .11 record

Read-only diagnosis found that this SHA is referenced only by the new tag in the fork; the successful Phase 2 .10 SHA was also a fork branch head. That is a recovery hypothesis, not an established cause. No source, token permissions or settings have changed. A fresh-tag rehearsal decision is required before another attempt.

@prk-Jr

prk-Jr commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator Author

Phase 1 exact-head rehearsal .12 passed — transcript 1/2

Reviewed source ab6e5493636fd3d1db4b22a071189070f90a189a; green first attempt. Fresh lightweight tag, seven binaries / 29 immutable prerelease files, not Latest. Full source/ref/signer/certificate pins are retained, including online no-bundle and offline bundle checks. .11 was left untouched after its draft-create denial; .12 also placed the same reviewed SHA at the fork Phase 1 branch head. No source, settings or token permissions changed. This clears the exact-head rehearsal verification gate; the PR remains draft with maintainer settings/spec approval still required.

Independent trust-root acquisition:
$ 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

Full independent release verification:
$ export GODEBUG=http2client=0
$ gh --version
gh version 2.102.0 (2026-09-30)
https://github.com/cli/cli/releases/tag/v2.102.0
Phase 1 source: ab6e5493636fd3d1db4b22a071189070f90a189a
Tag: v0.0.0-rehearsal.12
Run: https://github.com/prk-Jr/trusted-server/actions/runs/40490785393
$ gh release download v0.0.0-rehearsal.12 --repo prk-Jr/trusted-server --dir .
$ gh api repos/prk-Jr/trusted-server/releases/tags/v0.0.0-rehearsal.12 > release-metadata.json
$ jq -e --arg tag v0.0.0-rehearsal.12 .immutable\ ==\ true\ and\ .prerelease\ ==\ true\ and\ .draft\ ==\ false\ and\ .tag_name\ ==\ \$tag\ and\ \(.assets\|length\)\ ==\ 29 release-metadata.json
true
PASS: exact29 uploaded assets; all API sizes/digests match; checksum coverage exactly28; no Phase2 companions
$ gh api repos/prk-Jr/trusted-server/releases/latest > latest-release.json
$ jq -e --arg tag v0.0.0-rehearsal.12 .tag_name\ \!=\ \$tag latest-release.json
true
PASS: prerelease is not Latest
$ gh release verify v0.0.0-rehearsal.12 --repo prk-Jr/trusted-server
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
Loaded attestation from GitHub API
✓ Release v0.0.0-rehearsal.12 verified!

Assets
SHA256SUMS	sha256:a822122e079f00b6507887f049c089669f76ed23ccc23f0fe548e9c53048ceaa
trusted-server-axum-aarch64-unknown-linux-gnu	sha256:a0aa8058f7e906ee359299868c7e38fe0a350d124585b872a52cd57e626a731d
trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json	sha256:8b709137014cdff8bb07cefe10260cfcd1e4846057c09e598afae4dbd7e7736a
trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json	sha256:a735bd7f445fdfbc521522e42237145e208218fd7cd457d9d02340dd50f99980
trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json	sha256:4c5e93f257940755cf7a6f11e1f23a6632ddcc45ddfdc2afceddbd2492e17d4f
trusted-server-axum-x86_64-unknown-linux-gnu	sha256:ac12b412db56dbc655a4678a1a47ea1433bb78b54ebd65343a3d165f170f43d1
trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json	sha256:5f2113f586e86b23370994755e4324576e29d6e2e735a63aa1819a6e3b9f4cc0
trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json	sha256:2b639fd727439883f6b99b89c88fe0e0717eeedefa456a76ab58bd3caef86f8f
trusted-server-axum-x86_64-unknown-linux-gnu.spdx.json	sha256:114f8d1f87d2fe1197cc8566ee4ed3dfc7e296f9fc3709a94aff3daa95064915
trusted-server-axum-x86_64-unknown-linux-musl	sha256:d41b33af1d29711ccbc90f2563e5ec1df5c85828df39ef692259df305ad7e5ae
trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json	sha256:9cdccad0dbde6432b76cadb687ee58e4ecd1c2c72e554a07fea8622b4a02d077
trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json	sha256:b199eda8c32e3cc78e809b286e0de469e1536de91a88d9e6d14e646e0baced4b
trusted-server-axum-x86_64-unknown-linux-musl.spdx.json	sha256:97166e7086a3b978635a6cededf7e01c37c3a92a1939f43f4c802c400b4ef35d
trusted-server-fastly.wasm	sha256:1a97cb5aa6b61395eab80abfecb56c795843a92d037311f8ab70f4de299e3c58
trusted-server-fastly.wasm.provenance.sigstore.json	sha256:45a617e963ae05ce0b7b7ab3945fbb01339589e23049aa6de2eedb13924d0e06
trusted-server-fastly.wasm.sbom.sigstore.json	sha256:ae7f9bdacd7098bee1697a71ff6760fc92ad75338ba6de1bf1c6388213efd6af
trusted-server-fastly.wasm.spdx.json	sha256:199f5b50fb08ce7d60ea27d10c6d04f4d3b14351f81204b2c924928aeea8737e
ts-aarch64-apple-darwin	sha256:e27113e91a119553815e4a94e4c25f851719a62487d71940f9ced6b87750e528
ts-aarch64-apple-darwin.provenance.sigstore.json	sha256:55b6579cdf77ddf1b839f8a990dea4de3a0f5ea5a7972d9628dda7e0dc985322
ts-aarch64-apple-darwin.sbom.sigstore.json	sha256:74ac098890dcd5c3eeabc3f4222cc0618a68e8ecb10a62702c49af60c61c2024
ts-aarch64-apple-darwin.spdx.json	sha256:a2e49403188c2da16aa67df1582418f9887c6e3308b5e4cd69cbb420de2550b9
ts-x86_64-apple-darwin	sha256:a6524adbab4fc0984995e13a593c37abfb36d3ee6cdca6709b29543b0784a480
ts-x86_64-apple-darwin.provenance.sigstore.json	sha256:c68c8e73e13868b9025e372791675a79491a3532cd39a3338c4e9fbf57244ea8
ts-x86_64-apple-darwin.sbom.sigstore.json	sha256:c7be8e1e912ba6adc5542e316e97236373a0abfb7005bc3921c29e7a1923edc2
ts-x86_64-apple-darwin.spdx.json	sha256:f70f40e498e5f3562d7772e201a5605b6ccbd22e3e8f73e96b2c112325af928b
ts-x86_64-unknown-linux-gnu	sha256:5ebf0932dac531885e8f417e0ddb34137e0e8b8da7b74a7ea4c80205617dfc22
ts-x86_64-unknown-linux-gnu.provenance.sigstore.json	sha256:d644d5cb102012d1fc9ee9efc97976bcdd340bb03b284f1f5a1cc1f66afa46f4
ts-x86_64-unknown-linux-gnu.sbom.sigstore.json	sha256:60e298e6ce4c6c39dd884f864db55d439e3845e905dc23786d92a530feefe799
ts-x86_64-unknown-linux-gnu.spdx.json	sha256:4be0b67dbc098523d0f51217f826210329c09572bb3dbd2cc8b9db368a252c58

$ gh release verify-asset v0.0.0-rehearsal.12 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:ac12b412db56dbc655a4678a1a47ea1433bb78b54ebd65343a3d165f170f43d1
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-x86_64-unknown-linux-gnu is present in release v0.0.0-rehearsal.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:114f8d1f87d2fe1197cc8566ee4ed3dfc7e296f9fc3709a94aff3daa95064915
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
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.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:5f2113f586e86b23370994755e4324576e29d6e2e735a63aa1819a6e3b9f4cc0
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
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.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:2b639fd727439883f6b99b89c88fe0e0717eeedefa456a76ab58bd3caef86f8f
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
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.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:d41b33af1d29711ccbc90f2563e5ec1df5c85828df39ef692259df305ad7e5ae
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-x86_64-unknown-linux-musl is present in release v0.0.0-rehearsal.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:97166e7086a3b978635a6cededf7e01c37c3a92a1939f43f4c802c400b4ef35d
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
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.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:9cdccad0dbde6432b76cadb687ee58e4ecd1c2c72e554a07fea8622b4a02d077
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
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.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:b199eda8c32e3cc78e809b286e0de469e1536de91a88d9e6d14e646e0baced4b
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
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.12
$ gh release verify-asset v0.0.0-rehearsal.12 trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-aarch64-unknown-linux-gnu: sha256:a0aa8058f7e906ee359299868c7e38fe0a350d124585b872a52cd57e626a731d
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-aarch64-unknown-linux-gnu is present in release v0.0.0-rehearsal.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:4c5e93f257940755cf7a6f11e1f23a6632ddcc45ddfdc2afceddbd2492e17d4f
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json is present in release v0.0.0-rehearsal.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:8b709137014cdff8bb07cefe10260cfcd1e4846057c09e598afae4dbd7e7736a
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
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.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:a735bd7f445fdfbc521522e42237145e208218fd7cd457d9d02340dd50f99980
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
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.12
$ gh release verify-asset v0.0.0-rehearsal.12 trusted-server-fastly.wasm --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm: sha256:1a97cb5aa6b61395eab80abfecb56c795843a92d037311f8ab70f4de299e3c58
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
Loaded attestation from GitHub API

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

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

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

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

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

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

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

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

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

✓ Verification succeeded! ts-x86_64-apple-darwin.spdx.json is present in release v0.0.0-rehearsal.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:c68c8e73e13868b9025e372791675a79491a3532cd39a3338c4e9fbf57244ea8
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.provenance.sigstore.json is present in release v0.0.0-rehearsal.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:c7be8e1e912ba6adc5542e316e97236373a0abfb7005bc3921c29e7a1923edc2
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
Loaded attestation from GitHub API

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

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu is present in release v0.0.0-rehearsal.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:4be0b67dbc098523d0f51217f826210329c09572bb3dbd2cc8b9db368a252c58
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.spdx.json is present in release v0.0.0-rehearsal.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:d644d5cb102012d1fc9ee9efc97976bcdd340bb03b284f1f5a1cc1f66afa46f4
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.provenance.sigstore.json is present in release v0.0.0-rehearsal.12
$ gh release verify-asset v0.0.0-rehearsal.12 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:60e298e6ce4c6c39dd884f864db55d439e3845e905dc23786d92a530feefe799
Resolved tag v0.0.0-rehearsal.12 to sha1:ab6e5493636fd3d1db4b22a071189070f90a189a
Loaded attestation from GitHub API

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

✓ Verification succeeded! SHA256SUMS is present in release v0.0.0-rehearsal.12
$ 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.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_SHA256SUMS
trusted-server-axum-aarch64-unknown-linux-gnu: OK
trusted-server-axum-x86_64-unknown-linux-gnu: OK
trusted-server-axum-x86_64-unknown-linux-musl: OK
trusted-server-fastly.wasm: OK
ts-aarch64-apple-darwin: OK
ts-x86_64-apple-darwin: OK
ts-x86_64-unknown-linux-gnu: OK
$ shasum -a 256 trusted_root.jsonl
65ca537f6ed8a47fd0e560c421baa1f6c1efb8b25fc200d8c5c02c0e92eb2b9c  trusted_root.jsonl
$ gh attestation verify trusted-server-axum-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-axum-x86_64-unknown-linux-gnu.offline-provenance.verified.json
$ jq -e length\ ==\ 1 trusted-server-axum-x86_64-unknown-linux-gnu.offline-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40490785393/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId\ ==\ \$invocation\) trusted-server-axum-x86_64-unknown-linux-gnu.offline-provenance.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu offline provenance exact reusable signer and source 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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-axum-x86_64-unknown-linux-gnu.online-provenance.verified.json
$ jq -e length\ ==\ 1 trusted-server-axum-x86_64-unknown-linux-gnu.online-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40490785393/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId\ ==\ \$invocation\) trusted-server-axum-x86_64-unknown-linux-gnu.online-provenance.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu online provenance exact reusable signer and source 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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-axum-x86_64-unknown-linux-gnu.offline-sbom.verified.json
$ jq -e length\ ==\ 1 trusted-server-axum-x86_64-unknown-linux-gnu.offline-sbom.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu offline sbom exact reusable signer and source 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.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu offline verified SPDX equals shipped 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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-axum-x86_64-unknown-linux-gnu.online-sbom.verified.json
$ jq -e length\ ==\ 1 trusted-server-axum-x86_64-unknown-linux-gnu.online-sbom.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu online sbom exact reusable signer and source 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.online-sbom.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu online verified SPDX equals shipped 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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-axum-x86_64-unknown-linux-musl.offline-provenance.verified.json
$ jq -e length\ ==\ 1 trusted-server-axum-x86_64-unknown-linux-musl.offline-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40490785393/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId\ ==\ \$invocation\) trusted-server-axum-x86_64-unknown-linux-musl.offline-provenance.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl offline provenance exact reusable signer and source 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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-axum-x86_64-unknown-linux-musl.online-provenance.verified.json
$ jq -e length\ ==\ 1 trusted-server-axum-x86_64-unknown-linux-musl.online-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40490785393/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId\ ==\ \$invocation\) trusted-server-axum-x86_64-unknown-linux-musl.online-provenance.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl online provenance exact reusable signer and source 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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-axum-x86_64-unknown-linux-musl.offline-sbom.verified.json
$ jq -e length\ ==\ 1 trusted-server-axum-x86_64-unknown-linux-musl.offline-sbom.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl offline sbom exact reusable signer and source 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.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl offline verified SPDX equals shipped 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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-axum-x86_64-unknown-linux-musl.online-sbom.verified.json
$ jq -e length\ ==\ 1 trusted-server-axum-x86_64-unknown-linux-musl.online-sbom.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl online sbom exact reusable signer and source 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.online-sbom.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl online verified SPDX equals shipped SPDX
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-axum-aarch64-unknown-linux-gnu.offline-provenance.verified.json
$ jq -e length\ ==\ 1 trusted-server-axum-aarch64-unknown-linux-gnu.offline-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40490785393/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId\ ==\ \$invocation\) trusted-server-axum-aarch64-unknown-linux-gnu.offline-provenance.verified.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu offline provenance exact reusable signer and source pins
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-axum-aarch64-unknown-linux-gnu.online-provenance.verified.json
$ jq -e length\ ==\ 1 trusted-server-axum-aarch64-unknown-linux-gnu.online-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40490785393/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId\ ==\ \$invocation\) trusted-server-axum-aarch64-unknown-linux-gnu.online-provenance.verified.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu online provenance exact reusable signer and source pins
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-axum-aarch64-unknown-linux-gnu.offline-sbom.verified.json
$ jq -e length\ ==\ 1 trusted-server-axum-aarch64-unknown-linux-gnu.offline-sbom.verified.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu offline sbom exact reusable signer and source 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.verified.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu offline verified SPDX equals shipped SPDX
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-axum-aarch64-unknown-linux-gnu.online-sbom.verified.json
$ jq -e length\ ==\ 1 trusted-server-axum-aarch64-unknown-linux-gnu.online-sbom.verified.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu online sbom exact reusable signer and source 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.online-sbom.verified.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu online verified SPDX equals shipped SPDX
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-fastly.wasm.offline-provenance.verified.json
$ jq -e length\ ==\ 1 trusted-server-fastly.wasm.offline-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40490785393/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId\ ==\ \$invocation\) trusted-server-fastly.wasm.offline-provenance.verified.json
true
PASS: trusted-server-fastly.wasm offline provenance exact reusable signer and source pins

@prk-Jr

prk-Jr commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator Author

Phase 1 exact-head rehearsal .12 passed — transcript 2/2

Reviewed source ab6e5493636fd3d1db4b22a071189070f90a189a; green first attempt. Fresh lightweight tag, seven binaries / 29 immutable prerelease files, not Latest. Full source/ref/signer/certificate pins are retained, including online no-bundle and offline bundle checks. .11 was left untouched after its draft-create denial; .12 also placed the same reviewed SHA at the fork Phase 1 branch head. No source, settings or token permissions changed. This clears the exact-head rehearsal verification gate; the PR remains draft with maintainer settings/spec approval still required.

$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-fastly.wasm.online-provenance.verified.json
$ jq -e length\ ==\ 1 trusted-server-fastly.wasm.online-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40490785393/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId\ ==\ \$invocation\) trusted-server-fastly.wasm.online-provenance.verified.json
true
PASS: trusted-server-fastly.wasm online provenance exact reusable signer and source pins
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-fastly.wasm.offline-sbom.verified.json
$ jq -e length\ ==\ 1 trusted-server-fastly.wasm.offline-sbom.verified.json
true
PASS: trusted-server-fastly.wasm offline sbom exact reusable signer and source 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.verified.json
true
PASS: trusted-server-fastly.wasm offline verified SPDX equals shipped SPDX
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > trusted-server-fastly.wasm.online-sbom.verified.json
$ jq -e length\ ==\ 1 trusted-server-fastly.wasm.online-sbom.verified.json
true
PASS: trusted-server-fastly.wasm online sbom exact reusable signer and source pins
$ jq -e --slurpfile document trusted-server-fastly.wasm.spdx.json length\ ==\ 1\ and\ .\[0\].verificationResult.statement.predicate\ ==\ \$document\[0\] trusted-server-fastly.wasm.online-sbom.verified.json
true
PASS: trusted-server-fastly.wasm online verified SPDX equals shipped SPDX
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > ts-aarch64-apple-darwin.offline-provenance.verified.json
$ jq -e length\ ==\ 1 ts-aarch64-apple-darwin.offline-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40490785393/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId\ ==\ \$invocation\) ts-aarch64-apple-darwin.offline-provenance.verified.json
true
PASS: ts-aarch64-apple-darwin offline provenance exact reusable signer and source pins
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > ts-aarch64-apple-darwin.online-provenance.verified.json
$ jq -e length\ ==\ 1 ts-aarch64-apple-darwin.online-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40490785393/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId\ ==\ \$invocation\) ts-aarch64-apple-darwin.online-provenance.verified.json
true
PASS: ts-aarch64-apple-darwin online provenance exact reusable signer and source pins
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > ts-aarch64-apple-darwin.offline-sbom.verified.json
$ jq -e length\ ==\ 1 ts-aarch64-apple-darwin.offline-sbom.verified.json
true
PASS: ts-aarch64-apple-darwin offline sbom exact reusable signer and source 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.verified.json
true
PASS: ts-aarch64-apple-darwin offline verified SPDX equals shipped SPDX
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > ts-aarch64-apple-darwin.online-sbom.verified.json
$ jq -e length\ ==\ 1 ts-aarch64-apple-darwin.online-sbom.verified.json
true
PASS: ts-aarch64-apple-darwin online sbom exact reusable signer and source pins
$ jq -e --slurpfile document ts-aarch64-apple-darwin.spdx.json length\ ==\ 1\ and\ .\[0\].verificationResult.statement.predicate\ ==\ \$document\[0\] ts-aarch64-apple-darwin.online-sbom.verified.json
true
PASS: ts-aarch64-apple-darwin online verified SPDX equals shipped SPDX
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > ts-x86_64-apple-darwin.offline-provenance.verified.json
$ jq -e length\ ==\ 1 ts-x86_64-apple-darwin.offline-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40490785393/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId\ ==\ \$invocation\) ts-x86_64-apple-darwin.offline-provenance.verified.json
true
PASS: ts-x86_64-apple-darwin offline provenance exact reusable signer and source pins
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > ts-x86_64-apple-darwin.online-provenance.verified.json
$ jq -e length\ ==\ 1 ts-x86_64-apple-darwin.online-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40490785393/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId\ ==\ \$invocation\) ts-x86_64-apple-darwin.online-provenance.verified.json
true
PASS: ts-x86_64-apple-darwin online provenance exact reusable signer and source pins
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > ts-x86_64-apple-darwin.offline-sbom.verified.json
$ jq -e length\ ==\ 1 ts-x86_64-apple-darwin.offline-sbom.verified.json
true
PASS: ts-x86_64-apple-darwin offline sbom exact reusable signer and source 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.verified.json
true
PASS: ts-x86_64-apple-darwin offline verified SPDX equals shipped SPDX
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > ts-x86_64-apple-darwin.online-sbom.verified.json
$ jq -e length\ ==\ 1 ts-x86_64-apple-darwin.online-sbom.verified.json
true
PASS: ts-x86_64-apple-darwin online sbom exact reusable signer and source 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.online-sbom.verified.json
true
PASS: ts-x86_64-apple-darwin online verified SPDX equals shipped SPDX
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > ts-x86_64-unknown-linux-gnu.offline-provenance.verified.json
$ jq -e length\ ==\ 1 ts-x86_64-unknown-linux-gnu.offline-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40490785393/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId\ ==\ \$invocation\) ts-x86_64-unknown-linux-gnu.offline-provenance.verified.json
true
PASS: ts-x86_64-unknown-linux-gnu offline provenance exact reusable signer and source pins
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > ts-x86_64-unknown-linux-gnu.online-provenance.verified.json
$ jq -e length\ ==\ 1 ts-x86_64-unknown-linux-gnu.online-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40490785393/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId\ ==\ \$invocation\) ts-x86_64-unknown-linux-gnu.online-provenance.verified.json
true
PASS: ts-x86_64-unknown-linux-gnu online provenance exact reusable signer and source pins
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > ts-x86_64-unknown-linux-gnu.offline-sbom.verified.json
$ jq -e length\ ==\ 1 ts-x86_64-unknown-linux-gnu.offline-sbom.verified.json
true
PASS: ts-x86_64-unknown-linux-gnu offline sbom exact reusable signer and source 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.verified.json
true
PASS: ts-x86_64-unknown-linux-gnu offline verified SPDX equals shipped SPDX
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --source-digest ab6e5493636fd3d1db4b22a071189070f90a189a --signer-digest ab6e5493636fd3d1db4b22a071189070f90a189a --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.12 --format json > ts-x86_64-unknown-linux-gnu.online-sbom.verified.json
$ jq -e length\ ==\ 1 ts-x86_64-unknown-linux-gnu.online-sbom.verified.json
true
PASS: ts-x86_64-unknown-linux-gnu online sbom exact reusable signer and source 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.online-sbom.verified.json
true
PASS: ts-x86_64-unknown-linux-gnu online verified SPDX equals shipped SPDX
$ file trusted-server-axum-x86_64-unknown-linux-gnu trusted-server-axum-x86_64-unknown-linux-musl trusted-server-axum-aarch64-unknown-linux-gnu trusted-server-fastly.wasm ts-aarch64-apple-darwin ts-x86_64-apple-darwin ts-x86_64-unknown-linux-gnu
trusted-server-axum-x86_64-unknown-linux-gnu:  ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=e6d23d7ec8af3bb4cfea1b9b928e0411c5e3a7d7, with debug_info, not stripped
trusted-server-axum-x86_64-unknown-linux-musl: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), static-pie linked, with debug_info, not stripped
trusted-server-axum-aarch64-unknown-linux-gnu: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=4755048e25bb9ac4e0888599cc24537830a72486, for GNU/Linux 3.7.0, with debug_info, not stripped
trusted-server-fastly.wasm:                    WebAssembly (wasm) binary module version 0x1 (MVP)
ts-aarch64-apple-darwin:                       Mach-O 64-bit executable arm64
ts-x86_64-apple-darwin:                        Mach-O 64-bit executable x86_64
ts-x86_64-unknown-linux-gnu:                   ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=c934e04f78e8ca7754a48dad58429e899dba28a3, with debug_info, not stripped
$ ./ts-aarch64-apple-darwin --version
ts package=0.1.0 source=ab6e5493636fd3d1db4b22a071189070f90a189a target=aarch64-apple-darwin variant=default
PASS: exact Phase1 release verification at ab6e5493636fd3d1db4b22a071189070f90a189a with v0.0.0-rehearsal.12

Same-source native and publisher evidence:

macos-intel:
build / Build ts-x86_64-apple-darwin	UNKNOWN STEP	2026-10-27T11:07:05.1652600Z SUCCESS: Mach-O target and macOS minimum OS 13.0: x86_64-apple-darwin
build / Build ts-x86_64-apple-darwin	UNKNOWN STEP	2026-10-27T11:07:05.1660100Z SUCCESS: final-byte checks x86_64-apple-darwin 
build / Build ts-x86_64-apple-darwin	UNKNOWN STEP	2026-10-27T11:07:05.1869330Z SUCCESS: ts package=0.1.0 source=ab6e5493636fd3d1db4b22a071189070f90a189a target=x86_64-apple-darwin variant=default

macos-arm:
build / Build ts-aarch64-apple-darwin	UNKNOWN STEP	2026-10-27T10:54:03.6565060Z SUCCESS: Mach-O target and macOS minimum OS 13.0: aarch64-apple-darwin
build / Build ts-aarch64-apple-darwin	UNKNOWN STEP	2026-10-27T10:54:03.6567570Z SUCCESS: final-byte checks aarch64-apple-darwin 
build / Build ts-aarch64-apple-darwin	UNKNOWN STEP	2026-10-27T10:54:03.6726650Z SUCCESS: ts package=0.1.0 source=ab6e5493636fd3d1db4b22a071189070f90a189a target=aarch64-apple-darwin variant=default

cli-linux:
build / Build ts-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:52:33.0991925Z 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	UNKNOWN STEP	2026-10-27T10:52:33.1028743Z SUCCESS: ts package=0.1.0 source=ab6e5493636fd3d1db4b22a071189070f90a189a target=x86_64-unknown-linux-gnu variant=default
build / Build ts-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:52:35.4624869Z SUCCESS: ts package=0.1.0 source=ab6e5493636fd3d1db4b22a071189070f90a189a target=x86_64-unknown-linux-gnu variant=default
build / Build ts-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:52:37.0626121Z SUCCESS: ts package=0.1.0 source=ab6e5493636fd3d1db4b22a071189070f90a189a target=x86_64-unknown-linux-gnu variant=default
build / Build ts-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:52:38.6062591Z SUCCESS: ts package=0.1.0 source=ab6e5493636fd3d1db4b22a071189070f90a189a target=x86_64-unknown-linux-gnu variant=default

axum:
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:47:57.2143857Z 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
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:48:00.2183885Z 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	UNKNOWN STEP	2026-10-27T10:48:00.3195328Z SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:8da84df25d28176be84164040cd45e128c6b4c6a80b7d7cbe17fe2b9f198efc2
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:48:00.4701200Z 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-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:48:02.5330613Z SUCCESS: Axum rejects EDGEZERO__ADAPTER__PORT=0; exit 1, ports must be 1–65535: sha256:cee13550f97b8a595506e8e4ca74263ba44924248779a4ba4f942e197652acff
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:48:02.6710136Z SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:cee13550f97b8a595506e8e4ca74263ba44924248779a4ba4f942e197652acff
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:48:02.7868698Z SUCCESS: Axum bound to 0.0.0.0:8080; host reached published container port, HTTP 200 ok: ubuntu:22.04@sha256:0a9887931b0e38af2e3487ed39e29436b0535c4f3f52e57745baaf79d1898956 sha256:cee13550f97b8a595506e8e4ca74263ba44924248779a4ba4f942e197652acff
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:48:05.5344405Z SUCCESS: Axum rejects EDGEZERO__ADAPTER__PORT=0; exit 1, ports must be 1–65535: sha256:a2c5a85865a585c3bc8b10f6c269358fdf89fe32be4232885166889d85c76421
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:48:05.6364699Z SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:a2c5a85865a585c3bc8b10f6c269358fdf89fe32be4232885166889d85c76421
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:48:05.7863405Z SUCCESS: Axum bound to 0.0.0.0:8080; host reached published container port, HTTP 200 ok: registry.access.redhat.com/ubi9/ubi-minimal:9.6@sha256:34880b64c07f28f64d95737f82f891516de9a3b43583f39970f7bf8e4cfa48b7 sha256:a2c5a85865a585c3bc8b10f6c269358fdf89fe32be4232885166889d85c76421

axum-arm:
build / Build trusted-server-axum-aarch64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:48:18.6394066Z 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	UNKNOWN STEP	2026-10-27T10:48:21.8037384Z 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	UNKNOWN STEP	2026-10-27T10:48:21.9269358Z SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:28fe65558df3e10c89e7d685cb86544cdc138f242d12100c5b0981f92aae0853
build / Build trusted-server-axum-aarch64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T10:48:22.2998229Z SUCCESS: Axum bound to 0.0.0.0:8080; host reached published container port, HTTP 200 ok: debian:12-slim@sha256:7ff6ba31527b9e336162fa061746c366c4b2032f4d2cff2078bea43f78efe3f8 sha256:28fe65558df3e10c89e7d685cb86544cdc138f242d12100c5b0981f92aae0853

axum-musl:
build / Build trusted-server-axum-x86_64-unknown-linux-musl	UNKNOWN STEP	2026-10-27T10:47:40.4714020Z SUCCESS: final-byte checks x86_64-unknown-linux-musl 
build / Build trusted-server-axum-x86_64-unknown-linux-musl	UNKNOWN STEP	2026-10-27T10:47:44.0438969Z 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	UNKNOWN STEP	2026-10-27T10:47:44.1870531Z SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:706db57fb2063f39f69632c5b5c9c439633fda35110e65587c5d85553fd1cc38
build / Build trusted-server-axum-x86_64-unknown-linux-musl	UNKNOWN STEP	2026-10-27T10:47:44.3526215Z 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-axum-x86_64-unknown-linux-musl	UNKNOWN STEP	2026-10-27T10:47:44.5905060Z SUCCESS: Axum rejects EDGEZERO__ADAPTER__PORT=0; exit 1, ports must be 1–65535: sha256:bfe50f82a1ac91084d2c7ef8af86fc075427270a89899d8076caa5c90797bfd5
build / Build trusted-server-axum-x86_64-unknown-linux-musl	UNKNOWN STEP	2026-10-27T10:47:44.6943305Z SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:bfe50f82a1ac91084d2c7ef8af86fc075427270a89899d8076caa5c90797bfd5
build / Build trusted-server-axum-x86_64-unknown-linux-musl	UNKNOWN STEP	2026-10-27T10:47:44.8170886Z SUCCESS: Axum bound to 0.0.0.0:8080; host reached published container port, HTTP 200 ok: scratch sha256:bfe50f82a1ac91084d2c7ef8af86fc075427270a89899d8076caa5c90797bfd5

fastly:
build / Build trusted-server-fastly.wasm	UNKNOWN STEP	2026-10-27T10:47:25.3590024Z SUCCESS: final-byte checks wasm32-wasip1 

release	Verify handoff, create once, publish by release ID and verify	2026-10-27T11:13:15.2636313Z Verified post-publish re-download: all 29 assets byte-identical to signed checksums and handoff

@prk-Jr

prk-Jr commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator Author

Phase 1 rehearsal .14 did not complete — hosted ARM64 runner unavailable.

Source: 68eef902a8bddd9024676cc3806fa5377ed67fee (signed main merge). Exact-head IAB CI passed; fork rehearsal attempt 1 failed because the macOS ARM64 CLI job never acquired a runner.

GitHub job annotation:
The job was not acquired by Runner of type hosted even after multiple attempts

GitHub capacity notice:
Due to capacity constraints, jobs targeting macOS arm64 runners may experience longer queue times.

Result:
Build/check preflight: passed
Fastly, all three Axum builds, Linux CLI, Intel macOS CLI: passed (six builds)
ARM64 macOS CLI: cancelled before any steps; no runner assigned
Signing: skipped
Publication: skipped
Release/draft for v0.0.0-rehearsal.14: none

The lightweight .14 tag remains unchanged. No source, workflow, runner selection, token permissions or settings changed; no signing/publication was attempted. This is a failed rehearsal, not exact-head release evidence. Historical .12 remains attributed to ab6e5493636fd3d1db4b22a071189070f90a189a. A successful fresh rehearsal is still required before proceeding with the Phase 2 merge. The PR remains draft with no reviewers; no IAB tags, releases or settings were touched.

@prk-Jr

prk-Jr commented Oct 28, 2026

Copy link
Copy Markdown
Collaborator Author

Phase 1 main-merge rehearsal .15 passed — transcript 1/2

Source 68eef902a8bddd9024676cc3806fa5377ed67fee; green first attempt, all 16 jobs successful. Fresh lightweight v0.0.0-rehearsal.15: seven binaries / 29 immutable prerelease assets, not Latest. Independent verification passed all assets, 28 checksum entries, both predicates and both signer identities online without bundles and offline with published bundles/custom trusted roots. All source/ref/signer pins remain enforced; 14 SPDX comparisons, native smokes, macOS minimum OS and CLI source identity passed. Full commands and explicit results follow.

Prior .12 stays attributed to ab6e5493636fd3d1db4b22a071189070f90a189a. .14 failed solely on hosted ARM64 runner availability, without signing/publication; its tag remains untouched. Release machinery/source/settings were unchanged between .14 and .15. Local temporary evidence was cleared after interruption, so this independent read-only transcript was reacquired from the existing immutable .15 release; the release workflow was not rerun. The PR remains draft with no reviewers. No IAB tags, releases or settings changed.

Pinned GitHub CLI 2.102.0 archive verified against its official checksums: gh_2.102.0_macOS_arm64.zip: OK.
Independent trusted roots acquired using gh attestation trusted-root; digest follows.

$ gh --version
gh version 2.102.0 (2026-09-30)
https://github.com/cli/cli/releases/tag/v2.102.0
Source 68eef902a8bddd9024676cc3806fa5377ed67fee; tag v0.0.0-rehearsal.15; run https://github.com/prk-Jr/trusted-server/actions/runs/40536697334
$ shasum -a 256 trusted_root.jsonl
65ca537f6ed8a47fd0e560c421baa1f6c1efb8b25fc200d8c5c02c0e92eb2b9c  trusted_root.jsonl
$ gh release download v0.0.0-rehearsal.15 --repo prk-Jr/trusted-server --dir .
$ gh api repos/prk-Jr/trusted-server/releases/tags/v0.0.0-rehearsal.15 > release.json
$ jq -e --arg tag v0.0.0-rehearsal.15 .tag_name==\$tag\ and\ .immutable==true\ and\ .prerelease==true\ and\ .draft==false\ and\ \(.assets\|length\)==29 release.json
true
PASS: exact 29 assets; every API size/digest matches downloaded bytes; checksum coverage exactly 28; no index or deferred companions
$ gh api repos/prk-Jr/trusted-server/releases/latest > latest.json
$ jq -e --arg tag v0.0.0-rehearsal.15 .tag_name\!=\$tag latest.json
true
PASS: prerelease is not Latest
$ gh release verify v0.0.0-rehearsal.15 --repo prk-Jr/trusted-server
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
Loaded attestation from GitHub API
✓ Release v0.0.0-rehearsal.15 verified!

Assets
SHA256SUMS	sha256:5b01b2421548a3c0b6a5c5f311b8ae73299bee6d853b6aa2ef3d6cc5466dff9c
trusted-server-axum-aarch64-unknown-linux-gnu	sha256:cbe4bb6c4dff626defcd89737d1517be3b147ba2a24d0eb155d2668c0324094c
trusted-server-axum-aarch64-unknown-linux-gnu.provenance.sigstore.json	sha256:46f7ac2c2e333c69284f6bd7363bc7b27df404e3c4d25c19e37262bfe4e7287c
trusted-server-axum-aarch64-unknown-linux-gnu.sbom.sigstore.json	sha256:10f057195936573a96810a7ee1d276666f8f2c8ed3b70e31b8d4f55d715086fe
trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json	sha256:eff68da8310fe25257431a44f2803f7d75ee68c4785c5d632cc9deeaa0aa0a42
trusted-server-axum-x86_64-unknown-linux-gnu	sha256:612d453f50f9ad1c68c550e5aa83c812a266865a8bb359f4e374a71156a0a280
trusted-server-axum-x86_64-unknown-linux-gnu.provenance.sigstore.json	sha256:8763144ff711dde42669c1ec96abb7bdd288b36cdf9d1d7d40bc8b174f5f9d9c
trusted-server-axum-x86_64-unknown-linux-gnu.sbom.sigstore.json	sha256:30b2814635d6f8d07b9c184212f8ae3f47a15fd0d3505863cf778ecc1592759d
trusted-server-axum-x86_64-unknown-linux-gnu.spdx.json	sha256:59ea1369044618e7d1e1b5c64243479e8bdbb1b1f26c880302e9d4b919d2cbd8
trusted-server-axum-x86_64-unknown-linux-musl	sha256:09a4e1a7c054fb7b1770e158f5bc64d977e0e559197b3f52cbb078c4900bcccf
trusted-server-axum-x86_64-unknown-linux-musl.provenance.sigstore.json	sha256:4da4ddcbc1ca0de8c2273e0a66ba8c75cf13f4d33d7b10e3a27e011df50ab7e8
trusted-server-axum-x86_64-unknown-linux-musl.sbom.sigstore.json	sha256:e12a46fb1a9343905f17c6c4a0e60e35c02c63feab7da601c1f5e964ba076125
trusted-server-axum-x86_64-unknown-linux-musl.spdx.json	sha256:aad6840f37f9a5484af06472c06aab18ab9038cb635e953223807caef8211b83
trusted-server-fastly.wasm	sha256:c97f63ea298f73c0e7750d84f9ae6f4ca8d798fb830474f7709f46b4d2d11a9b
trusted-server-fastly.wasm.provenance.sigstore.json	sha256:574ef31c13583f1b5fcaed51745a8fef19cec06f2e314d2c53db91b9324b746a
trusted-server-fastly.wasm.sbom.sigstore.json	sha256:4d298ab4dcc9de2ea18947db4665619e0841826da8b52bab92dc783cf965bacb
trusted-server-fastly.wasm.spdx.json	sha256:65b7686b9e25e7f72728a88ac3c11df067b94b6d8b0af2c0fcb7903d34c49e7f
ts-aarch64-apple-darwin	sha256:34abc1165ff37c02af3a708c47ddca2451417bec3362dee0f19419e4617fd39a
ts-aarch64-apple-darwin.provenance.sigstore.json	sha256:6f53d968ba3ec06e5236245dbcaa9b81b9eb7e9b7d398e634156edcf9805552b
ts-aarch64-apple-darwin.sbom.sigstore.json	sha256:06c8a8edced92cd55771c32d57bb3974a49ace348f080a4eb09429c6c59b4170
ts-aarch64-apple-darwin.spdx.json	sha256:eb0fe1316d86601ed8d90d960e15a7b8af2bd36738496be83999b3d2c9823826
ts-x86_64-apple-darwin	sha256:150a024b10b76166f7531ec2924c5d36c49b53e05ae3ba45abb4a292b223b0c5
ts-x86_64-apple-darwin.provenance.sigstore.json	sha256:344c478f23a4666257e9ea4b0bd6c4c5cabfb58b7913697983fd9a4fc043f34c
ts-x86_64-apple-darwin.sbom.sigstore.json	sha256:30d11a848ba856d1df47dbd9cc0693602e8dc73e55f54f052104e64ce6a265be
ts-x86_64-apple-darwin.spdx.json	sha256:e90de12e0bed6aa908d085615243a8ee05dd2c0526e512a1ac08f9f80ca9af5e
ts-x86_64-unknown-linux-gnu	sha256:4857b4dccc0c35673da3286d65c793e8e4ba3dd07db386f099b45e7fe4656418
ts-x86_64-unknown-linux-gnu.provenance.sigstore.json	sha256:f253c7e51add0a52327b8699f5b00bd85da3fe84fc89138763fbb0565d55ecda
ts-x86_64-unknown-linux-gnu.sbom.sigstore.json	sha256:528b9c4bdd2fbd8e4f6e72bf66b5f60f0e0d11887855edfc3f49f30189288537
ts-x86_64-unknown-linux-gnu.spdx.json	sha256:e843c1eb2018b21b8f741d97c48eb5b9611046c96bf63d7b4a1adf5a10059fdf

$ gh release verify-asset v0.0.0-rehearsal.15 trusted-server-fastly.wasm --repo prk-Jr/trusted-server
Calculated digest for trusted-server-fastly.wasm: sha256:c97f63ea298f73c0e7750d84f9ae6f4ca8d798fb830474f7709f46b4d2d11a9b
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
Loaded attestation from GitHub API

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

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

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

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

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

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

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

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

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

✓ Verification succeeded! ts-x86_64-apple-darwin.spdx.json is present in release v0.0.0-rehearsal.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:344c478f23a4666257e9ea4b0bd6c4c5cabfb58b7913697983fd9a4fc043f34c
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-apple-darwin.provenance.sigstore.json is present in release v0.0.0-rehearsal.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:30d11a848ba856d1df47dbd9cc0693602e8dc73e55f54f052104e64ce6a265be
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
Loaded attestation from GitHub API

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

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu is present in release v0.0.0-rehearsal.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:e843c1eb2018b21b8f741d97c48eb5b9611046c96bf63d7b4a1adf5a10059fdf
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.spdx.json is present in release v0.0.0-rehearsal.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:f253c7e51add0a52327b8699f5b00bd85da3fe84fc89138763fbb0565d55ecda
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.provenance.sigstore.json is present in release v0.0.0-rehearsal.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:528b9c4bdd2fbd8e4f6e72bf66b5f60f0e0d11887855edfc3f49f30189288537
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
Loaded attestation from GitHub API

✓ Verification succeeded! ts-x86_64-unknown-linux-gnu.sbom.sigstore.json is present in release v0.0.0-rehearsal.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:612d453f50f9ad1c68c550e5aa83c812a266865a8bb359f4e374a71156a0a280
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-x86_64-unknown-linux-gnu is present in release v0.0.0-rehearsal.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:59ea1369044618e7d1e1b5c64243479e8bdbb1b1f26c880302e9d4b919d2cbd8
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
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.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:8763144ff711dde42669c1ec96abb7bdd288b36cdf9d1d7d40bc8b174f5f9d9c
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
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.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:30b2814635d6f8d07b9c184212f8ae3f47a15fd0d3505863cf778ecc1592759d
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
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.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:09a4e1a7c054fb7b1770e158f5bc64d977e0e559197b3f52cbb078c4900bcccf
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-x86_64-unknown-linux-musl is present in release v0.0.0-rehearsal.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:aad6840f37f9a5484af06472c06aab18ab9038cb635e953223807caef8211b83
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
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.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:4da4ddcbc1ca0de8c2273e0a66ba8c75cf13f4d33d7b10e3a27e011df50ab7e8
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
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.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:e12a46fb1a9343905f17c6c4a0e60e35c02c63feab7da601c1f5e964ba076125
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
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.15
$ gh release verify-asset v0.0.0-rehearsal.15 trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server
Calculated digest for trusted-server-axum-aarch64-unknown-linux-gnu: sha256:cbe4bb6c4dff626defcd89737d1517be3b147ba2a24d0eb155d2668c0324094c
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-aarch64-unknown-linux-gnu is present in release v0.0.0-rehearsal.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:eff68da8310fe25257431a44f2803f7d75ee68c4785c5d632cc9deeaa0aa0a42
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
Loaded attestation from GitHub API

✓ Verification succeeded! trusted-server-axum-aarch64-unknown-linux-gnu.spdx.json is present in release v0.0.0-rehearsal.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:46f7ac2c2e333c69284f6bd7363bc7b27df404e3c4d25c19e37262bfe4e7287c
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
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.15
$ gh release verify-asset v0.0.0-rehearsal.15 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:10f057195936573a96810a7ee1d276666f8f2c8ed3b70e31b8d4f55d715086fe
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
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.15
$ gh release verify-asset v0.0.0-rehearsal.15 SHA256SUMS --repo prk-Jr/trusted-server
Calculated digest for SHA256SUMS: sha256:5b01b2421548a3c0b6a5c5f311b8ae73299bee6d853b6aa2ef3d6cc5466dff9c
Resolved tag v0.0.0-rehearsal.15 to sha1:68eef902a8bddd9024676cc3806fa5377ed67fee
Loaded attestation from GitHub API

✓ Verification succeeded! SHA256SUMS is present in release v0.0.0-rehearsal.15
$ 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.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 RELEASE_API_BINARY_SHA256SUMS
trusted-server-axum-aarch64-unknown-linux-gnu: OK
trusted-server-axum-x86_64-unknown-linux-gnu: OK
trusted-server-axum-x86_64-unknown-linux-musl: OK
trusted-server-fastly.wasm: OK
ts-aarch64-apple-darwin: OK
ts-x86_64-apple-darwin: OK
ts-x86_64-unknown-linux-gnu: OK
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-fastly.wasm.offline-provenance.verified.json
$ jq -e length\>0 trusted-server-fastly.wasm.offline-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40536697334/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId==\$invocation\) trusted-server-fastly.wasm.offline-provenance.verified.json
true
PASS: trusted-server-fastly.wasm offline provenance exact reusable signer and source pins
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-fastly.wasm.online-provenance.verified.json
$ jq -e length\>0 trusted-server-fastly.wasm.online-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40536697334/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId==\$invocation\) trusted-server-fastly.wasm.online-provenance.verified.json
true
PASS: trusted-server-fastly.wasm online provenance exact reusable signer and source pins
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-fastly.wasm.offline-sbom.verified.json
$ jq -e length\>0 trusted-server-fastly.wasm.offline-sbom.verified.json
true
PASS: trusted-server-fastly.wasm offline sbom exact reusable signer and source 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.verified.json
true
PASS: trusted-server-fastly.wasm offline verified SPDX equals shipped SPDX
$ gh attestation verify trusted-server-fastly.wasm --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-fastly.wasm.online-sbom.verified.json
$ jq -e length\>0 trusted-server-fastly.wasm.online-sbom.verified.json
true
PASS: trusted-server-fastly.wasm online sbom exact reusable signer and source pins
$ jq -e --slurpfile document trusted-server-fastly.wasm.spdx.json any\(.\[\]\;\ .verificationResult.statement.predicate==\$document\[0\]\) trusted-server-fastly.wasm.online-sbom.verified.json
true
PASS: trusted-server-fastly.wasm online verified SPDX equals shipped SPDX
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > ts-aarch64-apple-darwin.offline-provenance.verified.json
$ jq -e length\>0 ts-aarch64-apple-darwin.offline-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40536697334/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId==\$invocation\) ts-aarch64-apple-darwin.offline-provenance.verified.json
true
PASS: ts-aarch64-apple-darwin offline provenance exact reusable signer and source pins
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > ts-aarch64-apple-darwin.online-provenance.verified.json
$ jq -e length\>0 ts-aarch64-apple-darwin.online-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40536697334/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId==\$invocation\) ts-aarch64-apple-darwin.online-provenance.verified.json
true
PASS: ts-aarch64-apple-darwin online provenance exact reusable signer and source pins
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > ts-aarch64-apple-darwin.offline-sbom.verified.json
$ jq -e length\>0 ts-aarch64-apple-darwin.offline-sbom.verified.json
true
PASS: ts-aarch64-apple-darwin offline sbom exact reusable signer and source 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.verified.json
true
PASS: ts-aarch64-apple-darwin offline verified SPDX equals shipped SPDX
$ gh attestation verify ts-aarch64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > ts-aarch64-apple-darwin.online-sbom.verified.json
$ jq -e length\>0 ts-aarch64-apple-darwin.online-sbom.verified.json
true
PASS: ts-aarch64-apple-darwin online sbom exact reusable signer and source pins
$ jq -e --slurpfile document ts-aarch64-apple-darwin.spdx.json any\(.\[\]\;\ .verificationResult.statement.predicate==\$document\[0\]\) ts-aarch64-apple-darwin.online-sbom.verified.json
true
PASS: ts-aarch64-apple-darwin online verified SPDX equals shipped SPDX
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > ts-x86_64-apple-darwin.offline-provenance.verified.json
$ jq -e length\>0 ts-x86_64-apple-darwin.offline-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40536697334/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId==\$invocation\) ts-x86_64-apple-darwin.offline-provenance.verified.json
true
PASS: ts-x86_64-apple-darwin offline provenance exact reusable signer and source pins
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > ts-x86_64-apple-darwin.online-provenance.verified.json
$ jq -e length\>0 ts-x86_64-apple-darwin.online-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40536697334/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId==\$invocation\) ts-x86_64-apple-darwin.online-provenance.verified.json
true
PASS: ts-x86_64-apple-darwin online provenance exact reusable signer and source pins
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > ts-x86_64-apple-darwin.offline-sbom.verified.json
$ jq -e length\>0 ts-x86_64-apple-darwin.offline-sbom.verified.json
true
PASS: ts-x86_64-apple-darwin offline sbom exact reusable signer and source 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.verified.json
true
PASS: ts-x86_64-apple-darwin offline verified SPDX equals shipped SPDX
$ gh attestation verify ts-x86_64-apple-darwin --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > ts-x86_64-apple-darwin.online-sbom.verified.json
$ jq -e length\>0 ts-x86_64-apple-darwin.online-sbom.verified.json
true
PASS: ts-x86_64-apple-darwin online sbom exact reusable signer and source 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.verified.json
true
PASS: ts-x86_64-apple-darwin online verified SPDX equals shipped SPDX
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > ts-x86_64-unknown-linux-gnu.offline-provenance.verified.json
$ jq -e length\>0 ts-x86_64-unknown-linux-gnu.offline-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40536697334/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId==\$invocation\) ts-x86_64-unknown-linux-gnu.offline-provenance.verified.json
true
PASS: ts-x86_64-unknown-linux-gnu offline provenance exact reusable signer and source pins
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > ts-x86_64-unknown-linux-gnu.online-provenance.verified.json
$ jq -e length\>0 ts-x86_64-unknown-linux-gnu.online-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40536697334/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId==\$invocation\) ts-x86_64-unknown-linux-gnu.online-provenance.verified.json
true
PASS: ts-x86_64-unknown-linux-gnu online provenance exact reusable signer and source pins
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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

@prk-Jr

prk-Jr commented Oct 28, 2026

Copy link
Copy Markdown
Collaborator Author

Phase 1 main-merge rehearsal .15 passed — transcript 2/2

Source 68eef902a8bddd9024676cc3806fa5377ed67fee; green first attempt, all 16 jobs successful. Fresh lightweight v0.0.0-rehearsal.15: seven binaries / 29 immutable prerelease assets, not Latest. Independent verification passed all assets, 28 checksum entries, both predicates and both signer identities online without bundles and offline with published bundles/custom trusted roots. All source/ref/signer pins remain enforced; 14 SPDX comparisons, native smokes, macOS minimum OS and CLI source identity passed. Full commands and explicit results follow.

Prior .12 stays attributed to ab6e5493636fd3d1db4b22a071189070f90a189a. .14 failed solely on hosted ARM64 runner availability, without signing/publication; its tag remains untouched. Release machinery/source/settings were unchanged between .14 and .15. Local temporary evidence was cleared after interruption, so this independent read-only transcript was reacquired from the existing immutable .15 release; the release workflow was not rerun. The PR remains draft with no reviewers. No IAB tags, releases or settings changed.

$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > ts-x86_64-unknown-linux-gnu.offline-sbom.verified.json
$ jq -e length\>0 ts-x86_64-unknown-linux-gnu.offline-sbom.verified.json
true
PASS: ts-x86_64-unknown-linux-gnu offline sbom exact reusable signer and source 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.verified.json
true
PASS: ts-x86_64-unknown-linux-gnu offline verified SPDX equals shipped SPDX
$ gh attestation verify ts-x86_64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > ts-x86_64-unknown-linux-gnu.online-sbom.verified.json
$ jq -e length\>0 ts-x86_64-unknown-linux-gnu.online-sbom.verified.json
true
PASS: ts-x86_64-unknown-linux-gnu online sbom exact reusable signer and source 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.verified.json
true
PASS: ts-x86_64-unknown-linux-gnu online verified SPDX equals shipped 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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-axum-x86_64-unknown-linux-gnu.offline-provenance.verified.json
$ jq -e length\>0 trusted-server-axum-x86_64-unknown-linux-gnu.offline-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40536697334/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId==\$invocation\) trusted-server-axum-x86_64-unknown-linux-gnu.offline-provenance.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu offline provenance exact reusable signer and source 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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-axum-x86_64-unknown-linux-gnu.online-provenance.verified.json
$ jq -e length\>0 trusted-server-axum-x86_64-unknown-linux-gnu.online-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40536697334/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId==\$invocation\) trusted-server-axum-x86_64-unknown-linux-gnu.online-provenance.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu online provenance exact reusable signer and source 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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-axum-x86_64-unknown-linux-gnu.offline-sbom.verified.json
$ jq -e length\>0 trusted-server-axum-x86_64-unknown-linux-gnu.offline-sbom.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu offline sbom exact reusable signer and source 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.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu offline verified SPDX equals shipped 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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-axum-x86_64-unknown-linux-gnu.online-sbom.verified.json
$ jq -e length\>0 trusted-server-axum-x86_64-unknown-linux-gnu.online-sbom.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu online sbom exact reusable signer and source 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.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-gnu online verified SPDX equals shipped 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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-axum-x86_64-unknown-linux-musl.offline-provenance.verified.json
$ jq -e length\>0 trusted-server-axum-x86_64-unknown-linux-musl.offline-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40536697334/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId==\$invocation\) trusted-server-axum-x86_64-unknown-linux-musl.offline-provenance.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl offline provenance exact reusable signer and source 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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-axum-x86_64-unknown-linux-musl.online-provenance.verified.json
$ jq -e length\>0 trusted-server-axum-x86_64-unknown-linux-musl.online-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40536697334/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId==\$invocation\) trusted-server-axum-x86_64-unknown-linux-musl.online-provenance.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl online provenance exact reusable signer and source 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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-axum-x86_64-unknown-linux-musl.offline-sbom.verified.json
$ jq -e length\>0 trusted-server-axum-x86_64-unknown-linux-musl.offline-sbom.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl offline sbom exact reusable signer and source 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.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl offline verified SPDX equals shipped 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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-axum-x86_64-unknown-linux-musl.online-sbom.verified.json
$ jq -e length\>0 trusted-server-axum-x86_64-unknown-linux-musl.online-sbom.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl online sbom exact reusable signer and source 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.verified.json
true
PASS: trusted-server-axum-x86_64-unknown-linux-musl online verified SPDX equals shipped SPDX
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-axum-aarch64-unknown-linux-gnu.offline-provenance.verified.json
$ jq -e length\>0 trusted-server-axum-aarch64-unknown-linux-gnu.offline-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40536697334/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId==\$invocation\) trusted-server-axum-aarch64-unknown-linux-gnu.offline-provenance.verified.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu offline provenance exact reusable signer and source pins
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-axum-aarch64-unknown-linux-gnu.online-provenance.verified.json
$ jq -e length\>0 trusted-server-axum-aarch64-unknown-linux-gnu.online-provenance.verified.json
true
$ jq -e --arg invocation https://github.com/prk-Jr/trusted-server/actions/runs/40536697334/attempts/1 all\(.\[\]\;\ .verificationResult.statement.predicate.runDetails.metadata.invocationId==\$invocation\) trusted-server-axum-aarch64-unknown-linux-gnu.online-provenance.verified.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu online provenance exact reusable signer and source pins
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-axum-aarch64-unknown-linux-gnu.offline-sbom.verified.json
$ jq -e length\>0 trusted-server-axum-aarch64-unknown-linux-gnu.offline-sbom.verified.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu offline sbom exact reusable signer and source 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.verified.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu offline verified SPDX equals shipped SPDX
$ gh attestation verify trusted-server-axum-aarch64-unknown-linux-gnu --repo prk-Jr/trusted-server --source-ref refs/tags/v0.0.0-rehearsal.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --source-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --signer-digest 68eef902a8bddd9024676cc3806fa5377ed67fee --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.15 --format json > trusted-server-axum-aarch64-unknown-linux-gnu.online-sbom.verified.json
$ jq -e length\>0 trusted-server-axum-aarch64-unknown-linux-gnu.online-sbom.verified.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu online sbom exact reusable signer and source 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.verified.json
true
PASS: trusted-server-axum-aarch64-unknown-linux-gnu online verified SPDX equals shipped SPDX
$ file trusted-server-fastly.wasm ts-aarch64-apple-darwin ts-x86_64-apple-darwin ts-x86_64-unknown-linux-gnu trusted-server-axum-x86_64-unknown-linux-gnu trusted-server-axum-x86_64-unknown-linux-musl trusted-server-axum-aarch64-unknown-linux-gnu
trusted-server-fastly.wasm:                    WebAssembly (wasm) binary module version 0x1 (MVP)
ts-aarch64-apple-darwin:                       Mach-O 64-bit executable arm64
ts-x86_64-apple-darwin:                        Mach-O 64-bit executable x86_64
ts-x86_64-unknown-linux-gnu:                   ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=878dd4e889cf655bab62e84faf31e37a7ddc2541, with debug_info, not stripped
trusted-server-axum-x86_64-unknown-linux-gnu:  ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=69abb93e4b7b8082d31890ff7da8ae89046f2821, with debug_info, not stripped
trusted-server-axum-x86_64-unknown-linux-musl: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), static-pie linked, with debug_info, not stripped
trusted-server-axum-aarch64-unknown-linux-gnu: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=ff8608499729fcd62c45782768c230b1771a602a, for GNU/Linux 3.7.0, with debug_info, not stripped
$ ./ts-aarch64-apple-darwin --version
ts package=0.1.0 source=68eef902a8bddd9024676cc3806fa5377ed67fee target=aarch64-apple-darwin variant=default
PASS: complete independent verification of v0.0.0-rehearsal.15 at 68eef902a8bddd9024676cc3806fa5377ed67fee

Completed CI evidence (same source/run):

build / Build ts-x86_64-apple-darwin	UNKNOWN STEP	2026-10-27T16:35:06.4601200Z SUCCESS: Mach-O target and macOS minimum OS 13.0: x86_64-apple-darwin
build / Build ts-x86_64-apple-darwin	UNKNOWN STEP	2026-10-27T16:35:06.4605140Z SUCCESS: final-byte checks x86_64-apple-darwin 
build / Build ts-x86_64-apple-darwin	UNKNOWN STEP	2026-10-27T16:35:06.4805780Z SUCCESS: ts package=0.1.0 source=68eef902a8bddd9024676cc3806fa5377ed67fee target=x86_64-apple-darwin variant=default

build / Build ts-aarch64-apple-darwin	UNKNOWN STEP	2026-10-27T16:14:17.5156230Z SUCCESS: Mach-O target and macOS minimum OS 13.0: aarch64-apple-darwin
build / Build ts-aarch64-apple-darwin	UNKNOWN STEP	2026-10-27T16:14:17.5259770Z SUCCESS: final-byte checks aarch64-apple-darwin 
build / Build ts-aarch64-apple-darwin	UNKNOWN STEP	2026-10-27T16:14:17.5425490Z SUCCESS: ts package=0.1.0 source=68eef902a8bddd9024676cc3806fa5377ed67fee target=aarch64-apple-darwin variant=default

build / Build ts-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:11:21.4798689Z 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	UNKNOWN STEP	2026-10-27T16:11:21.4834526Z SUCCESS: ts package=0.1.0 source=68eef902a8bddd9024676cc3806fa5377ed67fee target=x86_64-unknown-linux-gnu variant=default
build / Build ts-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:11:24.6313770Z SUCCESS: ts package=0.1.0 source=68eef902a8bddd9024676cc3806fa5377ed67fee target=x86_64-unknown-linux-gnu variant=default
build / Build ts-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:11:27.1213347Z SUCCESS: ts package=0.1.0 source=68eef902a8bddd9024676cc3806fa5377ed67fee target=x86_64-unknown-linux-gnu variant=default
build / Build ts-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:11:29.8071559Z SUCCESS: ts package=0.1.0 source=68eef902a8bddd9024676cc3806fa5377ed67fee target=x86_64-unknown-linux-gnu variant=default

build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:07:38.7168632Z 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
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:07:41.4718236Z 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	UNKNOWN STEP	2026-10-27T16:07:41.6102415Z SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:8da84df25d28176be84164040cd45e128c6b4c6a80b7d7cbe17fe2b9f198efc2
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:07:41.8200261Z 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-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:07:44.3336907Z SUCCESS: Axum rejects EDGEZERO__ADAPTER__PORT=0; exit 1, ports must be 1–65535: sha256:cee13550f97b8a595506e8e4ca74263ba44924248779a4ba4f942e197652acff
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:07:44.4551040Z SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:cee13550f97b8a595506e8e4ca74263ba44924248779a4ba4f942e197652acff
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:07:44.6130480Z SUCCESS: Axum bound to 0.0.0.0:8080; host reached published container port, HTTP 200 ok: ubuntu:22.04@sha256:0a9887931b0e38af2e3487ed39e29436b0535c4f3f52e57745baaf79d1898956 sha256:cee13550f97b8a595506e8e4ca74263ba44924248779a4ba4f942e197652acff
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:07:46.9554106Z SUCCESS: Axum rejects EDGEZERO__ADAPTER__PORT=0; exit 1, ports must be 1–65535: sha256:a2c5a85865a585c3bc8b10f6c269358fdf89fe32be4232885166889d85c76421
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:07:47.0791100Z SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:a2c5a85865a585c3bc8b10f6c269358fdf89fe32be4232885166889d85c76421
build / Build trusted-server-axum-x86_64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:07:47.2296405Z SUCCESS: Axum bound to 0.0.0.0:8080; host reached published container port, HTTP 200 ok: registry.access.redhat.com/ubi9/ubi-minimal:9.6@sha256:34880b64c07f28f64d95737f82f891516de9a3b43583f39970f7bf8e4cfa48b7 sha256:a2c5a85865a585c3bc8b10f6c269358fdf89fe32be4232885166889d85c76421

build / Build trusted-server-axum-x86_64-unknown-linux-musl	UNKNOWN STEP	2026-10-27T16:07:35.8363184Z SUCCESS: final-byte checks x86_64-unknown-linux-musl 
build / Build trusted-server-axum-x86_64-unknown-linux-musl	UNKNOWN STEP	2026-10-27T16:07:38.0133811Z 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	UNKNOWN STEP	2026-10-27T16:07:38.1462444Z SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:706db57fb2063f39f69632c5b5c9c439633fda35110e65587c5d85553fd1cc38
build / Build trusted-server-axum-x86_64-unknown-linux-musl	UNKNOWN STEP	2026-10-27T16:07:38.3631763Z 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-axum-x86_64-unknown-linux-musl	UNKNOWN STEP	2026-10-27T16:07:38.6448786Z SUCCESS: Axum rejects EDGEZERO__ADAPTER__PORT=0; exit 1, ports must be 1–65535: sha256:717db5e3bd0408d32c01c727a02cc797a73a8be21ddb8100590e22c8188e4960
build / Build trusted-server-axum-x86_64-unknown-linux-musl	UNKNOWN STEP	2026-10-27T16:07:38.7708012Z SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:717db5e3bd0408d32c01c727a02cc797a73a8be21ddb8100590e22c8188e4960
build / Build trusted-server-axum-x86_64-unknown-linux-musl	UNKNOWN STEP	2026-10-27T16:07:38.9321342Z SUCCESS: Axum bound to 0.0.0.0:8080; host reached published container port, HTTP 200 ok: scratch sha256:717db5e3bd0408d32c01c727a02cc797a73a8be21ddb8100590e22c8188e4960

build / Build trusted-server-axum-aarch64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:06:58.0063334Z 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	UNKNOWN STEP	2026-10-27T16:07:00.6573301Z 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	UNKNOWN STEP	2026-10-27T16:07:00.7863043Z SUCCESS: Axum rejects PORT=0; exit 1, ports must be 1–65535: sha256:28fe65558df3e10c89e7d685cb86544cdc138f242d12100c5b0981f92aae0853
build / Build trusted-server-axum-aarch64-unknown-linux-gnu	UNKNOWN STEP	2026-10-27T16:07:00.9797027Z 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-fastly.wasm	UNKNOWN STEP	2026-10-27T16:06:12.6192250Z SUCCESS: final-byte checks wasm32-wasip1 

release	Verify handoff, create once, publish by release ID and verify	2026-10-27T16:42:45.1296767Z Verified post-publish re-download: all 29 assets byte-identical to signed checksums and handoff

Docs-only since rehearsed 68eef90 (v0.0.0-rehearsal.15).
@prk-Jr
prk-Jr removed this pull request from stack #1450 October 28, 2026 06:37
@prk-Jr prk-Jr changed the title Binary attestations: phase 1 – attested release binaries with provenance and SBOMs Publish attested release binaries with provenance and SBOMs Oct 28, 2026
Docs-only since rehearsed 68eef90. Append actual fresh review outcomes and clarify historical adapter investigation inputs.
@prk-Jr
prk-Jr marked this pull request as ready for review October 28, 2026 07:50

@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.

Solid Phase 1 for #1235. The trust boundaries hold up: builds run read-only with no caches; signing is tag-gated and isolated; it never checks out or runs build inputs; and before signing it checks how many files arrived, that none are symlinks, and their digests. The publisher creates the release once, refuses to touch an existing tag or draft, uploads by release ID, checks every asset digest and that the release is immutable, and re-downloads everything to compare bytes.

On the Rust side, release_source fails closed: the release flag must be exactly 1, it rejects non-Unicode input, it requires a full 40-character lowercase commit, and it never falls back to local git in release mode. Tests cover each of these. BuildInfo is a small, const, well-documented type, and the Fastly build facts only appear in reuse mode, so single-mode startup diagnostics don't change.

CI: all checks pass. release and build / sign are skipped because they need a v* tag.

The inline comments below are non-blocking.

🌱 About 7k of the +10.8k lines are design docs, plans, a slice map and qualification transcripts. The implementation is reviewable on its own, but in future, putting the spec and qualification material in a separate PR, with the implementation PR stacked on top, would keep code review focused.

Comment thread .github/workflows/release.yml Resolved
Comment thread scripts/release/phase1-build.sh Resolved
Comment thread scripts/release/phase1-build.sh Resolved

@ChristianPavilonis ChristianPavilonis 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

The seven-binary Phase 1 pipeline separates build, signing and publication permissions and keeps later assurance work explicitly scoped out. Changes are requested for annotated-tag failure after immutable publication and SPDX creation timestamps rejected by strict consumers.

Reviewed head: 4940928e800fed00e4bddd8f3727fb52dcb2b296.

One of the three inline comments carries a one-click GitHub suggestion. Use Commit suggestion or Add suggestion to batch to apply it. The other inline fixes require changes outside the suggested range or to additional fixtures.

Blocking

🔧 wrench

  • Reject unsupported annotated tags before publishing, or handle tag-object identity — see inline at .github/workflows/release.yml:227.
  • Normalize the SPDX creation timestamp — see inline at scripts/release/phase1.mjs:77.

Non-blocking

🏕 camp site

  • Exclude the new release control from legacy settings overlays — see inline at crates/trusted-server-core/build.rs:163-164.

Cross-cutting / body-level findings

📌 GitHub CLI still downloads unrelated tags' bundle URLs

The publisher filters other tags locally, but the GitHub CLI implementation it invokes fetches every returned bundle_url before filtering release attestations by tag. An older RC and a later release can share a commit, so a slow or unavailable older bundle can still fail current-release verification after immutable publication. This affects both gh release verify at .github/workflows/release.yml:219 and gh release verify-asset at line 266; the isolation guarantee in docs/guide/release-verification.md:362 is stronger than the dependency provides.

A temporary HTTPS fixture with the real installed CLI confirmed that an older tag's 503 bundle URL was fetched four times and caused failure before current-attestation verification. Removing that unrelated record allowed execution to reach the current verification stage. This is a routing/availability reproduction, not a cryptographic-validity claim. The relevant 2.102.0 client implementation fetches bundles before the release command filters tags; installed 2.103.3 exhibits the same behavior.

Track an upstream filter-before-fetch fix and qualify a CLI that supplies that behavior. This is a non-blocking dependency follow-up, not a request to implement the deferred custom Trusted Server verifier. Meanwhile, narrow the guide's guarantee:

Other-tag records are ignored by the publisher's own availability check, but GitHub CLI still fetches all returned bundle URLs before filtering by tag. An unavailable older bundle can therefore fail the current release's read-only verification. Preserve the immutable release and follow the read-only recovery procedure.

Apply manually — the behavioral fix belongs to GitHub CLI; dependency qualification and guide/test updates cannot be expressed as a single local suggestion.

Verification

  • Exact SPDX suggestion verified alone: 19 producer tests; three fractional/whole-second cases and existing incomplete-fixture behavior; strict SPDX tools-java 2.0.7 validation of output from the actual helper; syntax, Prettier 3.8.1, shellcheck and diff checks. No post-verification patch drift.
  • Focused publisher reproduction confirmed annotated-tag failure after one publication and 29 uploads. Read-only verification of a real signed annotated-tag release confirmed the distinct tag-object identity.
  • Downloaded .15 Fastly sample passed immutable membership, both predicates, both signer identity forms, source/ref/digest pins and SPDX predicate equality. This is evidence for its recorded 68eef902a source, not a current-head tag rehearsal.
  • Passing Rust, adapter and browser CI results were reused; their relevant inputs were unchanged by the release-helper suggestion. No current-head tag publication/deployment, administrator-settings audit or full local core settings test was performed.
  • Scratch edits were discarded; the worktree is clean at the reviewed head. No commits or pushes were made.

CI Status

Comment thread .github/workflows/release.yml Resolved
Comment thread scripts/release/phase1.mjs Resolved
Comment thread crates/trusted-server-core/build.rs Resolved
@prk-Jr
prk-Jr marked this pull request as draft October 29, 2026 15:47
@aram356 aram356 linked an issue Oct 29, 2026 that may be closed by this pull request
8 tasks
Merge current main to retain the required CI Node and domain guards.

Reject unsupported tag objects before release mutations, normalize SPDX
creation timestamps, and clean task-owned build files. Exclude release
controls from legacy test settings and clarify operator verification limits.
@prk-Jr

prk-Jr commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Addressed the body-level GitHub CLI follow-up from the current review in 79b118858. The operator guide, compatibility record and publisher comment now distinguish the publisher's own other-tag filtering from GitHub CLI's bundle fetching. An unavailable older bundle can still fail current-release read-only verification; preserve the immutable release and use the documented recovery procedure. Filter-before-fetch behavior and qualification of a CLI that supplies it remain a dependency follow-up; no upstream behavioral fix or custom Trusted Server verifier is claimed.

The same signed, GitHub-Verified update contains the inline corrections and approved merge of main. Required local checks passed, including the full 1232-test JS suite, adapter/CLI tests, Clippy, production Fastly WASM build, release-control regressions, 12 Chrome fixtures, Node/domain guards and strict SPDX timestamp interoperability probe. Initial sandbox-only keychain/listener failures were rerun successfully with host access. Linux-only NSS coverage remains hosted evidence. Exact-head upstream CI passed: 34 successful checks and two expected tag-only skips. Five independently verified threads are resolved. The annotated-tag and SPDX threads remain open: the authorized fork rehearsal .21 cannot qualify the release because GitHub cancelled the ARM macOS job without assigning a runner, citing hosted runner capacity. Five builds passed and Intel macOS was still running at readback; no signing/publication has run and no matching draft/release exists. The source/tag remain unchanged; no second attempt or settings change was made. Historical rehearsal .15 applies only to its recorded source, and does not qualify this updated release machinery. The PR is ready for review; fresh release qualification and maintainer settings/spec decisions remain outstanding.

@prk-Jr
prk-Jr marked this pull request as ready for review October 29, 2026 18:09

@aram356 aram356 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

This adds the Phase 1 release build, signing and publication workflows, build-identity facts and the operator verification guide. Two blocking problems are in the release path itself. The publisher rejects the attestation record shape GitHub returns for other repositories, and that failure comes after the release is already immutable. The signing job's symlink guard never fails. Several docs (the spec, the plan and the compatibility notes) also describe Phase 1 in ways the code contradicts.

7 of the inline comments below carry a one-click GitHub suggestion. Use Commit suggestion, or Add suggestion to batch for several at once, to apply them as commits on the PR branch. The remaining comments describe the fix in prose because it touches multiple files or lines outside the diff. Each suggestion was applied on its own and then all together on 990509bc8. In every case the release suite (node --test scripts/release/phase1.test.mjs, 21/21), docs Prettier, root Markdown Prettier, actionlint (no new warnings) and shellcheck passed.

Blocking

🔧 wrench

  • Publisher assumes an inline attestation bundle and fails after immutable publication: see inline at .github/workflows/release.yml:241
  • Signing input guard lets symlinks through (suggestion): see inline at .github/workflows/release-build.yml:132
  • Move the inline publisher into scripts/release/: see inline at .github/workflows/release.yml:111
  • Pin actions by version tag: see inline at .github/workflows/release.yml:45
  • Offline verification block can exit 0 without verifying (suggestion): see inline at docs/guide/release-verification.md:149
  • Spec labels contradicted MUSTs as Phase 1: see inline at docs/superpowers/specs/2026-10-09-1235-release-attestation-design.md:123
  • "Docs-only since 149754d35" is no longer true: see inline at docs/superpowers/plans/binary-attestations-phase1-compatibility.md:39
  • Plan checks off work that isn't here: see inline at docs/superpowers/plans/2026-10-13-attested-release-implementation.md:200
  • Unread copies of #1262 data and docs: see inline at crates/trusted-server-cli/release-policy.json:1
  • Release notes pre-fill the pins that need independent review: see inline at .github/workflows/release.yml:166
  • Source-audit tokenizer misses br#/cr# raw strings and astral chars (suggestion): see inline at scripts/release/phase1.mjs:249
  • Build-script audit rule skips #[path] helpers: see inline at scripts/release/phase1.mjs:350
  • Release-path test gaps (53 of 101 mutants survive): see inline at scripts/release/phase1.test.mjs:154
  • Unpinned gh/Node in the publisher; verifyBundle not retried: see inline at .github/workflows/release.yml:110
  • Test-only release cfg in the CLI build script: see inline at crates/trusted-server-cli/build.rs:20
  • ts --version change is not marked Breaking (suggestion): see inline at CHANGELOG.md:16
  • --signer-workflow is not a prefix match (suggestion): see inline at docs/guide/release-verification.md:108
  • Prerequisites omit auth, minimum gh and shasum (suggestion): see inline at docs/guide/release-verification.md:70
  • CLI link 404s from the release notes (suggestion): see inline at docs/guide/release-verification.md:183
  • Build-identity paragraph inaccuracies: see inline at docs/guide/release-verification.md:301

❓ question

  • Why run all seven release builds on PRs, with a hand-maintained path list?: see inline at .github/workflows/release.yml:5
  • Is Axum now a production deployment target?: see inline at CHANGELOG.md:12

Cross-cutting / body-level findings

  • 🔧 Smaller documentation fixes:
    • docs/superpowers/plans/binary-attestations-phase1-compatibility.md:94 links /guide/release-verification. docs/superpowers/** is excluded from the VitePress build, so this only renders on GitHub, where the root-relative link 404s. Use ../../guide/release-verification.md.
    • docs/superpowers/specs/schemas/release-index-v1.schema.json has no $schema. It uses minContains (:107, :119), which draft-07 evaluators, the common default, silently ignore. Declare 2020-12.
    • If the qualification reports stay (see the comment on release-policy.json): scripts/release/qualification/2026-10-15-consumer-real-fixtures.md embeds a real third-party project's repository, run IDs and signer identity (:30-52, :120), plus local tool paths (/opt/homebrew/bin/gh, :12, :106, :108). AGENTS.md asks for fictional data in docs. Also, TS_RELEASE_NATIVE_REPRODUCTION (2026-10-21-native-reproduction-schedule.md:10) breaks the TRUSTED_SERVER__ environment-variable prefix.
    • The spec's Status line (:129) still says the spec, plans and implementation "share PR #1262" and that "no separate implementation PR is opened". #1262 is closed, and this PR is the implementation.
    • The spec's Review log (:786) records a review of 20152315c, which predates the annotated-tag and SPDX-timestamp fixes in 79b118858, and doesn't say who or what reviewed it.

CI Status

  • cargo fmt: PASS (required)
  • cargo test: PASS (required)
  • format-docs: PASS (required)
  • format-typescript: PASS (required)
  • .github/dependabot.yml: PASS
  • Analyze (actions): PASS
  • Analyze (javascript-typescript): PASS
  • Analyze (python): PASS
  • Analyze (rust): PASS
  • browser integration tests: PASS
  • build / checks: PASS
  • build / Build trusted-server-axum-aarch64-unknown-linux-gnu: PASS
  • build / Build trusted-server-axum-x86_64-unknown-linux-gnu: PASS
  • build / Build trusted-server-axum-x86_64-unknown-linux-musl: PASS
  • build / Build trusted-server-fastly.wasm: PASS
  • build / Build ts-aarch64-apple-darwin: PASS
  • build / Build ts-x86_64-apple-darwin: PASS
  • build / Build ts-x86_64-unknown-linux-gnu: PASS
  • build / sign: SKIPPED (tag-only)
  • cargo check (cloudflare native + wasm32-unknown-unknown): PASS
  • cargo check/build/test (spin native + wasm32-wasip1): PASS
  • cargo test (axum native): PASS
  • cargo test (cross-adapter parity): PASS
  • cargo test (ts CLI, native) (macos-latest): PASS
  • cargo test (ts CLI, native) (ubuntu-latest): PASS
  • CI Node pin guard: PASS
  • CLAUDE.md symlink guard: PASS
  • CodeQL: PASS
  • docs-proposal scripts: PASS
  • HTML EOF runtime (Fastly): PASS
  • integration tests: PASS
  • integration tests (Fastly EC lifecycle): PASS
  • prepare integration artifacts: PASS
  • release: SKIPPED (tag-only)
  • ts dev lint domains (changed lines): PASS
  • vitest: PASS

for (const record of page.attestations) {
if (!record || typeof record.initiator !== 'string') throw Error('Malformed release attestation record');
if (record.initiator !== 'github') continue;
const envelope = record.bundle?.dsseEnvelope;

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.

🔧 wrench: The publisher assumes an inline bundle that the attestations API doesn't guarantee, and the failure lands after the release is immutable.

GitHub's list attestations response documents repository_id, bundle_url and initiator for each record. An inline bundle isn't guaranteed, and real release attestations come back both ways. The fork rehearsals and EnjoyableWork/mcp-doctor return an inline bundle. cli/cli returns "bundle": null with only bundle_url (checked for v2.102.0 and v2.103.3):

$ gh api "repos/cli/cli/attestations/sha1:fc4b137cdef0a6bd28fd461b7cf9c84a5812a8cd?predicate_type=release" \
    --jq '.attestations[] | {initiator, bundle_is_null: (.bundle == null), has_bundle_url: (.bundle_url != null)}'
{"bundle_is_null":true,"has_bundle_url":true,"initiator":"github"}

With bundle: null, envelope is undefined here, so line 242 throws Malformed release attestation bundle. That runs after the PATCH at line 189 has published the release. The job fails on a release that is already immutable, and line 161 refuses any rerun. Line 228 has the same dependency, because it compares proof.attestation?.bundle against a null record.bundle.

Proposed fix (apply manually; it spans lines 224-255): accept a record whose bundle is null when bundle_url is set. gh release verify --format json already returns the fetched bundle as attestation.bundle and the decoded statement as verificationResult.statement. Run it for the candidate record, apply the existing envelope, statement and subject checks to that output, and compare against record.bundle only when the API returned one inline. Add a fixture mode that returns bundle: null plus bundle_url so the suite covers both shapes.

The guide's recovery check at docs/guide/release-verification.md:383-384 makes the same assumption (.bundle.dsseEnvelope.payload). Reading .verificationResult.statement.predicate.tag from gh release verify "$TAG" --repo "$REPO" --format json works for both shapes.

set -euo pipefail
cd release-assets
test "$(find . -mindepth 1 -maxdepth 1 | wc -l)" -eq 2
for file in "$ASSET" "$ASSET.spdx.json"; do test -f "$file" && test ! -L "$file" && test -s "$file"; done

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.

🔧 wrench: This guard lets a symlinked or non-regular input through to signing.

set -e ignores a failure in any command of an && list except the last one. When test -f or test ! -L fails, the list stops but the step carries on, so test -s is the only test here that can fail the step. Reproduced on bash 3.2.57 and 5.2.15: with either $ASSET or $ASSET.spdx.json replaced by a symlink to a non-empty file, the original line exits 0 and the step continues to sha256sum and both attest steps. With || exit 1, both cases exit 1.

Suggested change
for file in "$ASSET" "$ASSET.spdx.json"; do test -f "$file" && test ! -L "$file" && test -s "$file"; done
for file in "$ASSET" "$ASSET.spdx.json"; do test -f "$file" && test ! -L "$file" && test -s "$file" || exit 1; done

run: |
set -euo pipefail
gh --version
node <<'NODE'

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.

🔧 wrench: Move the ~180-line inline publisher into a script under scripts/release/.

This step embeds a full Node program in a YAML heredoc, so Prettier can't format it, and 17 of its lines run past 200 characters. The tests have to regex it out of the workflow by its exact 10-space indent (publicationScript() at phase1.test.mjs:140-153, plus the scrapes at :778 and :1070). Re-indenting the step breaks the scrape. The wrapper at line 290 also falls outside the scraped range, so deleting its process.exitCode = 1 leaves the suite green (I checked with a mutation run). The release-notes builder at lines 164-177 has the same problem.

Proposed shape (apply manually; it adds new files):

  • Put the publication logic in scripts/release/publish.mjs as an exported function, with a thin entry point that sets a non-zero exit code on failure.
  • In the release job, sparse-check out only that script (and the notes template) at github.sha with persist-credentials: false, then run node scripts/release/publish.mjs. The script comes from the same commit as the workflow file, so the trust boundary doesn't change, and the job still never checks out build inputs.
  • Have the tests import the module instead of scraping YAML, and cover the entry point's exit code.
  • Make the release-notes body a template file. The guide-block comparison at phase1.test.mjs:378-392 can then read it directly.

permissions:
contents: write
steps:
- uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0

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.

🔧 wrench: Pin actions by version tag, as the rest of the repository does.

Every other workflow here references actions by major tag (actions/checkout@v4, actions/upload-artifact@v4, actions/setup-node@v4, and so on). These two workflows use commit SHAs instead, at mixed majors: checkout v5, setup-node v5, upload-artifact v6, download-artifact v7 and attest v4. Nothing will ever bump those SHAs either, because .github/dependabot.yml has no github-actions entry.

Use tags (actions/download-artifact@v7, actions/upload-artifact@v6, actions/checkout@v5, actions/setup-node@v5, actions/attest@v4) in both release.yml and release-build.yml. Update the /@[a-f0-9]{40} # v/ assertion at phase1.test.mjs:119-127 in the same change.

Optional, while these lines are being edited: the 14 download-artifact steps (lines 45-100) can collapse to two with pattern: release-* and pattern: signed-*. Each artifact then lands in a directory named after it, so the publisher's build/${name} and signed/${name} paths would need the release- and signed- prefixes.

on:
push:
tags: ['v*']
pull_request:

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.

❓ question: Why does every PR touching these paths run all seven release builds, and what keeps this list complete?

The earlier thread on line 16 was resolved by keeping the full matrix for Phase 1, with a smaller PR matrix left as a follow-up. That thread didn't cover two things:

  1. The list is hand-maintained and already misses an input. The shipped ts binary compiles in trusted-server.example.toml: crates/trusted-server-cli/src/commands/config/init.rs:5-8 pulls it in with include_str!. A PR that only edits that file doesn't trigger this workflow, and nothing keeps the list in sync as crates and embedded files change. If the goal is to catch release-build breakage before tagging, running on push to main (plus tags) does that without a path list.
  2. Fork and Dependabot PRs. The caller grants id-token: write and attestations: write to the reusable workflow (lines 33-36), and the sign job requests them. On fork and Dependabot PRs, GitHub caps GITHUB_TOKEN at read-only. Others have reported that a nested job requesting more than the caller can grant fails the whole run at startup (community discussion #121112, DataDog/orchestrion#866, posit-dev/images-shared#442). I couldn't confirm that for this exact shape, where sign is skipped by its if:. Has a fork PR run been observed? If it does fail, every external contribution touching crates/trusted-server-core/src/** gets a red check.

Proposal: keep the fast checks job (the Node suite) on pull_request, and run the seven builds on push to main and on tags. If the smaller PR matrix is still planned, please link the follow-up issue here.

Comment thread CHANGELOG.md

### Changed

- Attested release binaries report `x-ts-version` as the full 40-character source commit, rather than the release tag. CLI output labels package/source/target/variant, and Axum supports runtime `EDGEZERO__ADAPTER__HOST` and primary `EDGEZERO__ADAPTER__PORT` (legacy `PORT` must agree when both are set) binding with a loopback default.

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.

🔧 wrench: Mark the ts --version change as Breaking, and make this entry consistent with the next one.

This line says release binaries report the full commit "rather than the release tag". The existing Breaking entry just below says x-ts-version reports "the release tag, else the branch, else the first 6 characters". Both are true for different builds, but side by side they read as a contradiction.

The new ts --version format (ts package=… source=… target=… variant=default instead of ts <version>) breaks any script that parses the old output, so it belongs under Breaking:. Axum's new refusal to start on port 0 or an invalid value is also a behavior change worth listing.

Suggested change
- Attested release binaries report `x-ts-version` as the full 40-character source commit, rather than the release tag. CLI output labels package/source/target/variant, and Axum supports runtime `EDGEZERO__ADAPTER__HOST` and primary `EDGEZERO__ADAPTER__PORT` (legacy `PORT` must agree when both are set) binding with a loopback default.
- Attested release binaries report `x-ts-version` as the full 40-character source commit; deploy-pipeline builds keep the tag, branch or short-commit value described below. Axum supports runtime `EDGEZERO__ADAPTER__HOST` and primary `EDGEZERO__ADAPTER__PORT` (legacy `PORT` must agree when both are set) binding with a loopback default, and refuses to start on port `0` or an invalid value instead of falling back.
- **Breaking:** `ts --version` now prints `ts package=<version> source=<commit> target=<triple> variant=default` instead of `ts <version>`. Update scripts that parse the old output.


<!-- release-verification:end -->

Provenance covers the binary and its SPDX document; the SBOM attestation covers the binary. The verified SBOM predicate must equal the shipped SPDX document. `--signer-workflow` matches a prefix; the separate `--cert-identity` check pins the exact reusable workflow at the tag. GitHub CLI makes those two identity options mutually exclusive.

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.

🔧 wrench: --signer-workflow isn't a prefix match.

In GitHub CLI 2.102.0, --signer-workflow becomes an anchored pattern: ^, the quoted value, an optional @ ref, then $. It matches that workflow path at any ref, not any path that starts with it. Readers use this sentence to understand why the separate --cert-identity check is needed, so it should describe the actual behavior.

Suggested change
Provenance covers the binary and its SPDX document; the SBOM attestation covers the binary. The verified SBOM predicate must equal the shipped SPDX document. `--signer-workflow` matches a prefix; the separate `--cert-identity` check pins the exact reusable workflow at the tag. GitHub CLI makes those two identity options mutually exclusive.
Provenance covers the binary and its SPDX document; the SBOM attestation covers the binary. The verified SBOM predicate must equal the shipped SPDX document. `--signer-workflow` matches that workflow path at any ref; the separate `--cert-identity` check pins the exact reusable workflow at the tag. GitHub CLI makes those two identity options mutually exclusive.

Comment on lines +68 to +70
Use an independently trusted GitHub CLI installation with `gh attestation verify`,
`gh release verify`, and `gh release verify-asset`. Use the GitHub CLI version
recorded in the release job log. The SBOM comparison below also uses `jq`.

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.

🔧 wrench: The prerequisites leave out authentication, a minimum gh version and shasum.

  • gh release verify and gh attestation verify call the GitHub API. Without gh auth login or GH_TOKEN, gh release verify stops with "please run: gh auth login".
  • "The GitHub CLI version recorded in the release job log" is whatever unpinned gh the runner image had (release.yml:110), so it isn't a stable requirement. The compatibility doc records 2.102.0 as the verified version.
  • shasum isn't installed on slim Linux images, while sha256sum --check reads the same file format.
Suggested change
Use an independently trusted GitHub CLI installation with `gh attestation verify`,
`gh release verify`, and `gh release verify-asset`. Use the GitHub CLI version
recorded in the release job log. The SBOM comparison below also uses `jq`.
Use an independently trusted GitHub CLI 2.102.0 or later with `gh attestation verify`,
`gh release verify`, and `gh release verify-asset`, authenticated with
`gh auth login` or `GH_TOKEN`. The SBOM comparison below also uses `jq`, and the
checksum steps use `shasum` (use `sha256sum --check` where `shasum` is absent).

the `gh attestation verify` and `gh release verify-asset` commands above, then
copy that verified file into a directory on their `PATH` as `ts` and make it
executable. Verify before first execution. Individual commands may still require
a source checkout and provider tools; see [CLI](/guide/cli).

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.

🔧 wrench: This link 404s where the release notes send operators.

The release notes link to this guide's GitHub blob view (release.yml:165). There, the root-relative /guide/cli resolves to github.com/guide/cli. A relative ./cli.md link works both on GitHub and in VitePress.

Suggested change
a source checkout and provider tools; see [CLI](/guide/cli).
a source checkout and provider tools; see [CLI](./cli.md).


Release Fastly responses report `x-ts-version` as the full 40-character source
commit supplied by the release build. Development display fallbacks are not the
release identity. `ts --version` labels `package=<version> source=<commit> target=<triple> variant=default`. Release mode requires the full 40-character lowercase source commit; the package version is not the release tag. Attestation pins authenticate these inputs externally.

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.

🔧 wrench: A few inaccuracies in the build-identity paragraphs:

  • :299 says release Fastly responses report x-ts-version, but Axum sends the header too (CHANGELOG: "sent by every adapter").
  • :301 describes ts --version as package=… variant=default. The actual output starts with ts (ts package=…), which matters to anyone matching it.
  • :301 ends mid-sentence ("Attestation pins authenticate the") and runs into :302, so the rendered text reads "authenticate the The executable's SHA-256 …".
  • :303's bare #161 doesn't link anywhere in VitePress; use the issue URL.
  • :305 refers to "the spec's Phase 1 note" without a link.
  • :312's "release PR's compatibility audit" links to this PR rather than to docs/superpowers/plans/binary-attestations-phase1-compatibility.md, and the PR won't be the obvious place to look after merge.

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

4 participants