Skip to content

Publish attested release binaries with provenance and SBOMs - #1435

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

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

Conversation

@prk-Jr

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

Copy link
Copy Markdown
Collaborator

Summary

Phase 1 of #1235: a v* tag push builds four binaries, attests SLSA provenance and an SPDX 2.3 SBOM for each, and publishes them in one immutable GitHub release (17 assets with SHA256SUMS). Operators verify with gh attestation verify --signer-workflow and gh release verify-asset.

Asset Target
trusted-server-fastly.wasm wasm32-wasip1
ts-x86_64-unknown-linux-gnu x86_64-unknown-linux-gnu
ts-aarch64-apple-darwin aarch64-apple-darwin
ts-x86_64-apple-darwin x86_64-apple-darwin

Reproducibility, other adapters (Axum, Cloudflare, Spin), the custom verifier and the publication owner are later phases; their destination design stays at frozen 122b78664.

Changes

File Change
.github/workflows/release.yml Caller on main pushes and v* tags; publisher job (sparse checkout, pinned gh and Node)
.github/workflows/release-build.yml Reusable signer: tag checks (SemVer, lightweight tag at the commit, commit on a branch), 4 builds, tag-only signing with actions/attest
.github/workflows/format.yml release scripts job: shellcheck and the release Node suite on PRs
.github/workflows/test.yml Release build-facts test, and a check that release mode refuses a branch source
scripts/release/phase1-build.sh Clean-environment build, canary planting, GNU container, startup smokes, SBOM generation
scripts/release/phase1.mjs Canary scan, final-byte checks, CycloneDX merge, SPDX completion and validation, smoke
scripts/release/publish.mjs Verifies handoffs and signing bundles, creates one draft, uploads, publishes, verifies immutability and the release attestation
scripts/release/release-notes.md Release body linking to the verification guide
scripts/release/phase1.test.mjs Release suite (producer, workflows, publisher fixtures)
crates/trusted-server-core/build.rs, build_support/git_version.rs Release-mode validation of the full source commit
crates/trusted-server-core/src/build_info.rs Immutable package/source/target/variant facts
crates/trusted-server-cli/build.rs, src/run.rs CLI target fact; ts --version prints labelled build facts (breaking output change)
crates/trusted-server-cli/tests/release_build_facts.rs Checks the facts embedded in the real binary
crates/trusted-server-core/tests/git_version_resolve.rs Source resolution tests
crates/trusted-server-core/src/settings.rs Ignore the release control as a settings variable
crates/trusted-server-cli/src/commands/dev/lint/domains.rs Allowlist cli.github.com, slsa.dev, spdx.dev
docs/guide/release-verification.md Operator verification, offline verification, Fastly manual deploy, maintainer checklist
docs/superpowers/specs/2026-10-09-1235-release-attestation-design.md Phase 1 specification
docs/superpowers/specs/2026-01-15-attestation-design.md Mark binary sections superseded
docs/guide/cli.md, docs/.vitepress/config.mts, AGENTS.md, CHANGELOG.md Links, gate list, changelog

Maintainer gates before publication

RELEASE_PUBLICATION_ENABLED=true only after immutable releases are enabled and an active v* tag ruleset is in place (the guide's checklist has read-only commands). Until both are set, any writer can push a v* tag whose release.yml runs.

Rehearsal status

  • v0.0.0-rehearsal.24 of 07c2bdf19: builds and signing passed. The publisher failed safely before creating anything, because the SBOM verification output exceeded Node's 1 MiB default buffer. Fixed in 739016b2a.
  • v0.0.0-rehearsal.25 of 739016b2a: passed (checks, 4 builds, 4 signing jobs, release). The publisher verified every signing bundle before creating the draft, then found the release attestation on its first check. The guide's verification block, run unchanged against the published release, passed for every binary, SPDX file, bundle and checksum.
  • 3e2dd4842 adds tests and rewords one shell comment only.
  • v0.0.0-rehearsal.28 of 861ed761c (current head): passed. The new checks step found the commit on a branch, and the guide's verification block passed against the release (17 assets, 16 checksum entries).
  • v0.0.0-rehearsal.29, a commit reachable only through its tag: refused in checks as intended, before any build or signing. No release or attestation exists for it.

A fork rehearsal does not qualify the upstream signer identity, settings or immutable-release state.

Test plan

  • node --test scripts/release/phase1.test.mjs and shellcheck scripts/release/phase1-build.sh
  • cargo fmt, the adapter clippy aliases, cargo test-fastly, cargo test-axum
  • CLI tests including release_build_facts, and the release-mode refusal step
  • Docs format and the changed-lines domain lint
  • Fork rehearsal of the current head (.28 passed; .29 confirmed the branch check refuses a tag-only commit)

🤖 Generated with Claude Code

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

@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

Comment thread .github/workflows/release.yml Resolved
Comment thread .github/workflows/release-build.yml Resolved
Comment thread .github/workflows/release.yml Resolved
Comment thread .github/workflows/release.yml Resolved
Comment thread .github/workflows/release.yml Resolved
Comment thread CHANGELOG.md Resolved
Comment thread docs/guide/release-verification.md Resolved
Comment thread docs/guide/release-verification.md Resolved
Comment thread docs/guide/release-verification.md Resolved
Comment thread docs/guide/release-verification.md Resolved
- Move the release publisher into scripts/release/publish.mjs with a
  release-notes template; tests import it instead of scraping YAML.
- Accept release-attestation records that carry only bundle_url, verify
  them through gh release verify output, and retry the list read and
  failed proof fetches within the availability checks.
- Install a checksummed GitHub CLI 2.102.0 and pinned Node for the
  publisher and checks job; refuse non-SemVer tags before building.
- Fix the signing-input symlink guard and bundle check, which set -e
  ignored inside && lists.
- Run release builds on main pushes and tags only; run the Node release
  suite on pull requests in format.yml. Reference actions by major tag.
- Leave REPO, TAG and COMMIT blank in release notes, with a guard that
  also works in bash 3.2.
- Extend the source audit to byte/C raw strings, astral chars and build
  helpers; drop the test-only CLI cfg and duplicate release validation.
- Remove carried #1262 data and docs (frozen at 122b786), frame Axum
  binaries as dev/evaluation builds, map Phase 1 spec scope by R-ID,
  and correct the guide, plan, compatibility record and changelog.
@prk-Jr

prk-Jr commented Nov 2, 2026

Copy link
Copy Markdown
Collaborator Author

Body-level items from the review, addressed in c827eb2:

  • Compatibility doc link (:94): now ../../guide/release-verification.md. I found no other root-relative links in the files this PR changes under docs/superpowers/.
  • release-index-v1.schema.json $schema / minContains: the schema is no longer in this PR. It stays frozen at 122b786, and the spec now links there.
  • Qualification reports (real third-party data, local tool paths, TS_RELEASE_NATIVE_REPRODUCTION): all 13 reports are removed from this PR. Nothing here references them except frozen-commit links.
  • Spec Status line: now says Add binary attestation contracts and release build guards #1262 is closed and frozen at 122b786, and that this PR carries the spec and implements Phase 1 only.
  • Spec Review log: now says both recorded rounds were author-initiated automated reviews of 20152315c. They do not cover 79b118858, the later main merges, or this response.

Before this push, I had three independent automated review passes cover the whole PR: the publication path, the source audit and Rust, and docs-versus-code. Their blocking finding was that the new notes guard did nothing on macOS bash 3.2. That and their should-fix findings are in this commit, along with these fixes:

  • recovery block hardening
  • retries for the attestation list read and the gh proof fetch
  • build metadata (+…) tags refused
  • non-SemVer tags refused before building
  • stale passages in the compatibility record

Local checks:

  • node --test scripts/release/phase1.test.mjs (28/28)
  • node scripts/release/phase1.mjs audit
  • actionlint on both release workflows
  • shellcheck
  • cargo fmt, clippy-cli and clippy-fastly
  • release_build_facts with and without the release env
  • the Prettier gates
  • the VitePress build
  • the changed-lines domain lint

Outstanding: a fresh fork rehearsal of this head (sparse-checkout publisher, pinned gh install, bundle_url path) before the first upstream release.

@prk-Jr
prk-Jr requested a review from aram356 November 2, 2026 06:56
@prk-Jr

prk-Jr commented Nov 2, 2026

Copy link
Copy Markdown
Collaborator Author

Phase 1 rehearsal v0.0.0-rehearsal.22 passed at the exact PR head 5f0139b167cd0619cccd9563e8aadca4436281ae (includes c827eb2). This is a fork rehearsal in the author's fork: its signer identity, settings and immutable-release state are the fork's, not upstream's.

  • Fork run, lightweight tag, immutable prerelease (release ID 431179455, not Latest).
  • Attempt 1: six builds and checks passed. The macOS Intel build failed in rustup toolchain install because a download from static.rust-lang.org errored on the hosted runner. Signing and publication were skipped.
  • Attempt 2: that job reran and passed, and all seven signing jobs passed. The publisher's first mutation, the draft-create POST, returned HTTP 403, and no draft or release was created. .11 (ab6e549) failed the same way. In both cases the tagged commit was reachable on the fork only through the new tag. After the fork's feature/binary-attestations-phase1 branch was fast-forwarded to this commit, the same POST succeeded: .12 for .11's commit, and attempt 3 here. That is a strong correlation, not a confirmed cause. A future upstream release tags a commit already on main, so this precondition holds there.
  • Attempt 3: only the publisher job reran, on the same artifacts. It confirmed the new release job end to end:
    • sparse checkout of publish.mjs and the template;
    • checksummed gh 2.102.0;
    • Node 24.20.0 from .tool-versions;
    • create, upload and publish, then the immutable readback;
    • the release attestation was available on the first check, and its proof statement and bundle matched;
    • all 29 verify-asset checks;
    • the byte-identical re-download.

The fork's API returned the release-attestation bundle inline. The bundle: null + bundle_url path is covered by fixtures and by the review check against real cli/cli data, not by this run.

Independent operator verification: run in a fresh directory with an official GitHub CLI 2.102.0 macOS ARM archive (checksum verified against cli/cli's checksums file). I used the published release notes' block and filled in REPO, TAG and COMMIT by hand. It exited 0 under set -euo pipefail:

  • gh release verify passed;
  • all 29 verify-asset checks passed;
  • all 28 provenance and SBOM gh attestation verify checks passed, each with both --signer-workflow and --cert-identity at the tag;
  • all 7 SBOM predicates equal the shipped SPDX documents;
  • shasum -a 256 --check SHA256SUMS reported 28 OK.

The published notes show the "stay editable" warning and the blank pins.

@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 read-only builds, isolated signing and immutable publication, with conservative SPDX inventories and operator verification instructions. Changes are requested for an availability-deadline bug; two documentation corrections are non-blocking.

Reviewed head: 029f2046784ab1732eaa571a1374fcd3f5691f72.

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 comments describe manual documentation corrections across multiple passages or files.

Blocking

🔧 wrench

  • Enforce the advertised availability deadline — see inline at scripts/release/publish.mjs:391-436.

Non-blocking

🏕 camp site

  • Correct the current-head rehearsal attribution — see inline at docs/superpowers/plans/binary-attestations-phase1-compatibility.md:349-351.
  • Distinguish Ctrl-C draining from missing SIGTERM handling — see inline at docs/guide/release-verification.md:43-44.

Verification

  • Read all 36 changed files and the removed code, with runtime, build-identity and documentation cross-checks.
  • Applied the exact approved suggestion alone in the isolated reviewer worktree. The clock-injected publisher reproduction accepted a proof at 73.5 seconds before the suggestion and rejects at the 60-second deadline afterward.
  • All 28 release-producer tests passed; JavaScript syntax, Prettier, shellcheck and JS formatting passed. JS suite: 73 files passed, 1,809 tests passed, 1 skipped, no type errors.
  • The complete patch was byte-identical before and after verification. Scratch changes were discarded; the reviewer worktree is clean at the reviewed head. No commits or pushes were made.
  • Passing hosted Rust, adapter and integration results were reused. No live tag publication, deployment or administrator-settings audit was performed; the deadline reproduction uses mocked external operations and an injected clock.

CI Status

The release-build/signing/publication workflow does not run on pull requests; the passing PR checks do not establish a current-head release rehearsal.

Comment thread scripts/release/publish.mjs Resolved
Comment thread docs/guide/release-verification.md Resolved
The availability loop checked its 60-second deadline only at the start of
each round, while the attestation list read and `gh release verify` proof
fetch retried under the 180-second post-publish window. A round could
therefore retry and accept a proof after the advertised deadline. Both now
use a retrier and command timeouts bound to the availability deadline.

Also correct the rehearsal attribution: fork rehearsal .22 covers source
5f0139b only, not the later main merge or this publisher change, and
distinguish Axum's Ctrl-C request draining from missing SIGTERM handling.

@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

Publishes seven release binaries with build provenance, SPDX dependency inventories, retained Sigstore bundles and immutable-release verification. No verified blocking or non-blocking findings in the Phase 1 changes.

Verification scope

Reviewed all 36 changed files and removed code, including correctness, security, WASM compatibility, architecture, maintainability and repository conventions.

  • The release producer suite passed 28/28 tests in CI for the reviewed head, including handoff corruption, partial uploads, tag validation and retry deadlines. Shellcheck also passed.
  • Locally, node scripts/release/phase1.mjs audit passed with repository-pinned Node 24.20.0, and git diff --check origin/main...refs/review/pr-1435/head passed.
  • No current-head release rehearsal, live deployment or upstream immutability/tag-settings audit was performed. The latest documented successful fork rehearsal, .22, covers 5f0139b167cd0619cccd9563e8aadca4436281ae, not the reviewed head. This approval is a code-review result, not release qualification or deployment authorization.

CI status

@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

Second review, at ba54b274f. The round-1 blockers are fixed. The publisher now accepts bundle_url-only release-attestation records, and the symlink guard fails closed on bash 3.2. The gh checksum matches cli/cli's digest, actions use version tags, and the PR trigger and the #1262 files are gone. 69b74e2ae also states rehearsal coverage per commit, which settles the coverage claims in the compatibility record. The remaining blockers are:

  • an incomplete fix to the build-script audit;
  • test gaps that let several release checks be deleted without a failing test, including half of the new availability-deadline bound;
  • docs that describe build-script and tagging behaviour that no longer holds.

4 of the 11 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 several files or lines outside the diff.

Blocking

🔧 wrench

  • Build helpers in nested modules escape the build-script rule: see inline at scripts/release/phase1.mjs:318
  • Several producer and publisher checks can be deleted with no failing test: see inline at scripts/release/phase1.test.mjs:1450
  • The availability-deadline test pins only the proof fetch: see inline at scripts/release/phase1.test.mjs:724
  • Spec, plan and record say the CLI and Fastly build scripts validate release inputs: see inline at docs/superpowers/specs/2026-10-09-1235-release-attestation-design.md:104
  • Maintainer checklist: tagging precondition missing, branch-check step impossible: see inline at docs/guide/release-verification.md:455

Non-blocking

♻️ refactor / 🤔 thinking / ⛏ nitpick

  • ♻️ Skip the build upload on main pushes: see inline at .github/workflows/release-build.yml:106
  • 🤔 Annotated or branchless tags are refused only after building and signing: see inline at .github/workflows/release-build.yml:23
  • 🤔 Linux release binaries carry debug info (132-282 MB): see inline at scripts/release/phase1-build.sh:94
  • ♻️ Release suite runs inside the "docs-proposal scripts" job: see inline at .github/workflows/format.yml:228
  • ♻️ Deadline errors drop the failure that caused the retry: see inline at scripts/release/publish.mjs:152
  • ⛏ Stale allowlist comment: see inline at crates/trusted-server-cli/src/commands/dev/lint/domains.rs:97

Cross-cutting / body-level findings

  • ⛏ Smaller doc fixes
    • binary-attestations-phase1-compatibility.md:383 says every other non-200 status "fails immediately" and that current-tag verification is "single-shot". The publisher retries transient list reads and proof fetches within a check, and re-runs a failed gh release verify at the next check, as the guide says at release-verification.md:384.
    • 2026-10-13-attested-release-implementation.md:110 says the source PR "remains frozen and open"; #1262 is closed (the plan says so at :7).
    • 2026-10-13-attested-release-implementation.md:159 and :185 describe #1262's trusted-server-release work as "implemented" in the present tense; none of it is in this PR.
    • release-verification.md:363 compares downloads "against the signed SHA256SUMS". No attestation covers SHA256SUMS until GitHub's release attestation after publication; "the validated SHA256SUMS" is accurate.
    • release-verification.md:366 lists the reads that may retry as release/asset metadata GETs and verify-asset calls. It leaves out the release-attestation list read, failed proof fetches and transport download failures (:384, :386).
    • binary-attestations-phase1-compatibility.md:166 puts current behaviour ("No PR builds; main pushes and tags queue") in the "#1435 value at audit" column.
    • .11 (ab6e54936, draft-create HTTP 403, nothing created) has no entry of its own. It appears only in passing at binary-attestations-phase1-compatibility.md:309; an entry beside .12 would complete the record.
    • binary-attestations-phase1-compatibility.md:335 says the publisher "retries verifyBundle"; no such function exists in publish.mjs.
    • binary-attestations-slice-map.json:678 still keys .github/workflows/release.yml inline publisher; the publisher is now scripts/release/publish.mjs.
    • Spec :475 says the operator guide verifies with GitHub CLI 2.102.0. The guide says "2.102.0 or later" at release-verification.md:72.
  • ⛏ PR description is stale. It still lists the deleted #1262 files (for example release-policy.json and the qualification/ records) and says a PR runs seven hosted builds ("Keep all seven PR builds"). It also describes the publisher as inline in release.yml, has no row for scripts/release/publish.mjs, and cites commits from before c827eb222.

CI Status

  • Analyze (actions): PASS
  • Analyze (javascript-typescript): PASS
  • Analyze (python): PASS
  • Analyze (rust): PASS
  • browser integration tests: PASS
  • cargo check (cloudflare native + wasm32-unknown-unknown): PASS
  • cargo check/build/test (spin native + wasm32-wasip1): PASS
  • cargo fmt: PASS
  • cargo test: 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
  • format-docs: PASS
  • format-typescript: PASS
  • HTML EOF runtime (Fastly): PASS
  • integration tests: PASS
  • integration tests (Fastly EC lifecycle): PASS
  • prepare integration artifacts: PASS
  • trace runtime and browser acceptance: PASS
  • ts dev lint domains (changed lines): PASS
  • vitest: PASS
  • worker-deadlines (cloudflare): PASS
  • worker-deadlines (spin): PASS

Comment thread scripts/release/phase1.mjs Resolved
Comment thread scripts/release/phase1.test.mjs Resolved
Comment thread scripts/release/phase1.test.mjs Resolved
Comment thread docs/guide/release-verification.md Resolved
Comment thread .github/workflows/release-build.yml Resolved
Comment thread scripts/release/phase1-build.sh Resolved
Comment thread .github/workflows/format.yml Resolved
Comment thread scripts/release/publish.mjs Resolved
Find build-script helpers that a non-mod.rs file loads from its own
directory, refuse custom package.build scripts and #[path] modules
outside the audited sources, and pin the producer and publisher checks
the review showed could be deleted without a failing test, including the
availability deadline bounds on list reads and proof fetches.

Keep the cause of a retry the availability deadline cut short and name
that window in the error. Refuse annotated tags before building, upload
build artifacts only for tags, run the release suite in its own job and
strip debug info from native release binaries.

Correct the spec, plan, record and guide where they described CLI and
Fastly build-script validation, tagging and retries that do not hold.
@prk-Jr

prk-Jr commented Nov 3, 2026

Copy link
Copy Markdown
Collaborator Author

Review-body doc fixes from the second review, in 54d10bb01:

  • Compatibility record:
    • In the .6 retry paragraph, transient list reads now retry within a check and other non-200 statuses fail.
    • A transient gh release verify failure retries within its check, and any failed proof fetch retries at the next check. This replaces "single-shot".
    • Fetched proofs that fail a check stop immediately.
    • The verifyBundle mention is removed.
    • The Concurrency row's audit column is restored to its audit value, "Same rule also applies to PR builds". The current behaviour moves to the alignment column.
    • .11 has its own entry before .12, with the run, the HTTP 403 draft-create failure and its record.
  • Implementation plan:
  • Guide: re-downloads compare against "the validated SHA256SUMS and handoff". The retry list now includes the release-attestation list read, failed proof fetches and re-download transport failures.
  • Slice map: the key is now scripts/release/publish.mjs.
  • Spec: the operator guide verifies with GitHub CLI "2.102.0 or later".

@prk-Jr
prk-Jr added this pull request to stack #1492 November 3, 2026 15:47
@prk-Jr
prk-Jr requested a review from aram356 November 3, 2026 15:47
@prk-Jr prk-Jr mentioned this pull request Nov 4, 2026
13 of 17 tasks

@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

Third review, at 54d10bb01. Every round-2 inline finding is fixed, and I re-verified each one by running it:

  • the nested-module plant is rejected;
  • the 22 earlier producer mutants, the publisher block deletions and the deadline mutants all fail the suite;
  • the availability label and the cause reach the log;
  • the tag-only upload and the annotated-tag check are in place;
  • the release suite runs in its own job.

The remaining blockers are:

  • two phase1-build.sh guards that never fire on the macOS jobs;
  • release checks that can still be removed without a failing test, including the create body's draft: true;
  • a compatibility record that says this head's workflows are unchanged, though no rehearsal covers its changes;
  • the PR description, which is still stale from round 2;
  • one question on the SBOM root version.

The larger point of this round is scope. Phase 2 replaces phase1-build.sh and phase1.mjs (slices 2.5 and 2.6) and publish.mjs (slice 2.8), so effort spent hardening them now is thrown away. Several comments below propose cutting code instead of fixing it. The largest cut is the documentation (see Cross-cutting).

17 of the 27 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. Each was verified on its own and all together: the suite, shellcheck, actionlint, prettier, cargo fmt, clippy, and the affected Rust tests all pass. The remaining comments describe the fix in prose, because it touches several files or lines outside the diff.

Blocking

🔧 wrench

  • Two build-script guards never stop the macOS jobs (bash 3.2): see inline at scripts/release/phase1-build.sh:59
  • Four producer checks can still be removed with no failing test: see inline at scripts/release/phase1.test.mjs:1294
  • Create and publish request bodies are not pinned (draft: true can be deleted): see inline at scripts/release/phase1.test.mjs:690
  • Compatibility record says this head's workflows are unchanged; no rehearsal covers its changes: see inline at docs/superpowers/plans/binary-attestations-phase1-compatibility.md:361
  • PR description is still stale: see Cross-cutting below

❓ question

  • Is the SBOM root version meant to be the release tag?: see inline at scripts/release/phase1.mjs:477

Non-blocking

♻️ refactor / 🤔 thinking / ⛏ nitpick

  • ♻️ Drop the post-publish checks that repeat checkProof: see inline at scripts/release/publish.mjs:529
  • ♻️ Drop the Rust source audit, or run it on PRs: see inline at scripts/release/phase1-build.sh:23
  • ♻️ Delete release-cohort.json: see inline at scripts/release/release-cohort.json:1
  • ♻️ No Phase 1 artifact emits the Fastly build-facts line: see inline at crates/trusted-server-adapter-fastly/src/main.rs:129
  • ♻️ Consider leaving the Axum assets out of Phase 1: see inline at .github/workflows/release-build.yml:78
  • 🤔 Signing bundles are not verified before the release becomes immutable: see inline at scripts/release/publish.mjs:210
  • ♻️ Last round's workflow changes have no tests: see inline at scripts/release/phase1.test.mjs:1460
  • ♻️ The three-minute window and the loop's deadline path have no tests: see inline at scripts/release/publish.mjs:336
  • ♻️ No CI step exercises the release-mode refusal: see inline at .github/workflows/test.yml:373
  • ♻️ Axum startup test cannot tell the variable names apart: see inline at crates/trusted-server-adapter-axum/tests/startup.rs:21
  • ⛏ No over-length all-hex source case: see inline at crates/trusted-server-core/tests/git_version_resolve.rs:163
  • ⛏ Non-Unicode development override skips the warning: see inline at crates/trusted-server-core/build.rs:170
  • ⛏ CHANGELOG bullet mixes two changes: see inline at CHANGELOG.md:16
  • ⛏ No release ID is logged when the created-identity check fails: see inline at scripts/release/publish.mjs:307
  • ⛏ Annotated-tag refusal prints nothing: see inline at .github/workflows/release-build.yml:39
  • ⛏ New SC2086 in the release scripts job: see inline at .github/workflows/format.yml:241
  • ⛏ Publisher step pins the gh version but not Node's: see inline at .github/workflows/release.yml:125
  • ⛏ Tagging steps: cancelled waiting runs, and the rerun conflicts with the recovery rule: see inline at docs/guide/release-verification.md:464
  • ⛏ Guide misstates the timeouts, read count and terminal errors: see inline at docs/guide/release-verification.md:386
  • ⛏ Immutable-releases endpoint does not return 404 when disabled: see inline at docs/guide/release-verification.md:482
  • ⛏ export VAR="$(jq -er ...)" hides a missing value: see inline at docs/guide/release-verification.md:219
  • ⛏ phase1.json is written beside every member, but only one path is guarded: see inline at scripts/release/phase1-build.sh:47

Cross-cutting / body-level findings

  • 🔧 The PR description is still stale.
    • It says 55 files and +11,037/−58; the diff is 36 files and +9,093/−57.
    • The file table has 21 rows for files that are no longer in the diff: release-policy.json, release-tools.json, both integration plans, the feasibility and migration specs, the index schema, js-composition.md and 13 qualification/ reports.
    • It has no rows for scripts/release/publish.mjs or scripts/release/release-notes.md.
    • The adapter-fastly/build.rs and cli/build.rs rows say they validate release inputs; only core's does.
    • It still describes an "inline publisher", says "a PR exercises seven hosted builds" and "Keep all seven PR builds", and names .15 as the latest rehearsal (it is .22).
  • ♻️ Ship a Phase 1 spec plus the operator guide, and move the destination documents to the first Phase 2 PR.
    • The implementation plan (1,636 lines) is about 93% Phase 2+ "historical destination" tasks. The slice map (682 lines) is about 95% #1262 path ownership. The compatibility record (400 lines) is history already recorded in PR comments. Spec lines 157-795 are the retained destination design.
    • A Phase 1 spec of about 250 lines, linking frozen 122b786 for later phases, keeps every Phase 1 guarantee. It removes about 3,300 lines (36% of the PR) and follows CONTRIBUTING's one-spec-per-phase guidance.
    • The actions.github.io allowlist entry would then be unused.
    • Each round so far has found documents that contradict the code, and this round's record finding is another; almost all of them came from these files.
  • ♻️ Trim the operator guide.
    • Keep one identity check per predicate. #1235 names --signer-workflow, and with the digests and source ref pinned, --cert-identity pins nothing more. Dropping it halves the operator's gh calls (28 to 14).
    • Link the release notes to the guide instead of copying its block, which also removes the equality test.
    • Drop the reviewer-facing material at release-verification.md:489-506; lines 500-506 are a verbatim copy of compat :373-379.
  • ⛏ Smaller doc fixes, if those files stay in this PR
    • compat:
      • :91 says "all three policies", but only the cohort file is carried;
      • :133 calls strict tag validation "additive later work", but publish.mjs:22-23, :276-278 and release-build.yml:23-39 implement it;
      • :167 says main-push runs are "never cancelled", but a newer push cancels a waiting run;
      • :385 says "at most five release-attestation GETs" (it is up to 15).
    • slice map :10: still says the publisher is "still keyed by that name below", but :678 is now keyed scripts/release/publish.mjs.
    • spec :150: says only the publisher rejects annotated tags; the build checks job now does too.
    • plan:
      • :72 is a self-link copied from the spec;
      • :152 and :155 say #1262 work "are implemented" and "pass ordinary CI";
      • :67 says "Hyphenated tags" where the spec and record say SemVer prerelease tags.
    • Drifted duplicates: the "Phase 1 review notes" copied into the spec, plan and record have drifted. The spec has the strict-SemVer and release-notes sentences; the other two do not.
    • guide :327: calls the input audit "current". It was made against main at f9281917a, and names EdgeZero v0.0.10, while the lock is now at v0.0.11.
    • spec :786: the allow-domain: cli.github.com marker is redundant now that the host is allowlisted, and ts dev lint domains warns about it.
  • ⛏ Producer notes
    • The merged CycloneDX repeats two bom-refs (phase1.mjs:474-476 keeps the root's components, and :495 copies them again). components: undefined in the root spread fixes it.
    • The ELF check verifies only the magic bytes, so an aarch64 ELF is accepted for an x86_64 target.
    • The sentinel scan sees verbatim ASCII only.
    • $tool_root/cargo-metadata.json is written but never read.
    • The published SHA256SUMS format is unpinned: changing the two spaces to one at publish.mjs:238 passes the suite, and macOS shasum -a 256 --check, the command the guide uses, rejects one-space lines.
  • 📝 Notes
    • release scripts is not a required check; the main ruleset requires four other checks.
    • The repository has no tag ruleset yet, and immutable releases are not enabled (the endpoint returns enabled: false). Until both are set, any writer can push a v* tag whose own release.yml runs. The guide's enablement checklist covers this.

CI Status

  • Analyze (actions): PASS
  • Analyze (javascript-typescript): PASS
  • Analyze (python): PASS
  • Analyze (rust): PASS
  • browser integration tests: PASS
  • cargo check (cloudflare native + wasm32-unknown-unknown): PASS
  • cargo check/build/test (spin native + wasm32-wasip1): PASS
  • cargo fmt: PASS
  • cargo test: 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
  • format-docs: PASS
  • format-typescript: PASS
  • HTML EOF runtime (Fastly): PASS
  • integration tests: PASS
  • integration tests (Fastly EC lifecycle): PASS
  • prepare integration artifacts: PASS
  • release scripts: PASS
  • trace runtime and browser acceptance: PASS
  • ts dev lint domains (changed lines): PASS
  • vitest: PASS
  • worker-deadlines (cloudflare): PASS
  • worker-deadlines (spin): PASS

Comment thread scripts/release/phase1-build.sh Resolved
Comment thread scripts/release/phase1.test.mjs Resolved
Comment thread scripts/release/phase1.test.mjs Resolved
Comment thread scripts/release/publish.mjs Resolved
Comment thread docs/guide/release-verification.md Resolved
Comment thread docs/guide/release-verification.md Resolved
Comment thread docs/guide/release-verification.md Resolved
Comment thread scripts/release/phase1-build.sh Resolved
Comment thread scripts/release/phase1.mjs Resolved
Narrow Phase 1 to the Fastly wasm and the three ts CLI binaries
(17 release assets). Drop the Axum assets, the Rust source audit, the
post-publish re-verification, the descriptive cohort file and the
Fastly build-facts line. Replace the destination spec, plan, slice map
and compatibility record with a Phase 1 spec that links the frozen
design, and trim the operator guide to one signer check per predicate.

The publisher now verifies every signing bundle before creating a
draft, logs the release ID before checking it, and keeps the SBOM root
at Cargo's package version. Build-script guards exit explicitly under
bash 3.2, every member's phase1.json is refused and cleaned, and the
Linux format check requires an x86-64 ELF.

Tests pin the create and publish bodies, the producer step order and
container passthrough, the workflow permissions and gates, the
post-publish deadlines and the checksum format. CI now checks that a
release build refuses a branch source.
@prk-Jr

prk-Jr commented Nov 5, 2026

Copy link
Copy Markdown
Collaborator Author

Round-3 body-level items, in 07c2bdf19. The inline threads each have their own reply.

  • Docs cut: taken. The spec at the same path is now a ~260-line Phase 1 spec that links the frozen 122b786 design and plan. The implementation plan, slice map and compatibility record are deleted, along with the actions.github.io allowlist entry. The listed smaller doc fixes went with those files.
  • Guide trim: one --signer-workflow check per predicate (--cert-identity is removed from the online, offline and recovery steps). The release notes now link to the guide instead of copying its block, so the equality test is gone. The reviewer-facing notes section is removed. The input-audit reference now says it was a one-time audit against an earlier main and is not re-run.
  • Producer notes:
    • The duplicated bom-refs are fixed (components: undefined, pinned by the merge test).
    • The ELF check requires an x86-64 e_machine.
    • cargo-metadata.json is no longer written; the step still pre-fetches sources.
    • SHA256SUMS two-space lines are pinned by the publisher test.
    • Sentinel scanning is still verbatim ASCII only; not changed.
  • PR description: I'll update it separately.
  • Rehearsal: no rehearsal covers this head. One against the final head is needed before the first production tag.

Rehearsal v0.0.0-rehearsal.24 failed before creating anything: the
SBOM verification result embeds the whole SPDX document, which exceeds
Node's default 1 MiB execFileSync buffer, so gh was killed with
ENOBUFS. Allow up to 256 MiB, and add a publisher mode that sends a
2 MiB result through a real child process with the publisher's options.

Also test the CLI version smoke check, the build checks' annotated-tag
comparison and the publisher step's pinned-Node assertion, which could
previously be removed without a failing test.
Cover three checks that could be removed without a failing test: API
calls closing their connection after a gh command leaves pooled sockets
idle, refusing a published asset whose name is not in the expected set,
and refusing an SPDX package that stands in for the described root.
Reword the bash 3.2 comment to state only what the guard needs.
In fork rehearsals, draft creation returned HTTP 403 when the tagged
commit was reachable only through its tag, after every build and
signing job had run and written public attestations. The checks job now
fetches full history and refuses such a tag before anything is built or
signed. Which branches may be released stays a maintainer decision.
@prk-Jr
prk-Jr requested a review from aram356 November 5, 2026 11:02

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