Skip to content

ci: attach .intoto.jsonl provenance bundles as release assets (Scorecard Signed-Releases) - #332

Merged
jensholdgaard merged 1 commit into
mainfrom
scorecard-intoto-release-assets
Jul 2, 2026
Merged

ci: attach .intoto.jsonl provenance bundles as release assets (Scorecard Signed-Releases)#332
jensholdgaard merged 1 commit into
mainfrom
scorecard-intoto-release-assets

Conversation

@jensholdgaard

Copy link
Copy Markdown
Owner

What

The Scorecard Signed-Releases fix (PR B of the signing work; follows #329).

Scorecard scores Signed-Releases 0 because it scans release assets for
signature/provenance files (*.intoto.jsonl, *.sig, …) — it never queries
the GitHub attestation store. Our artifacts are genuinely attested (verified
via gh attestation verify), but in a form the scanner can't see; and the
unsigned corpus/* releases drag the 5-release scoring window regardless.

This ships the existing attestations as release assets too:

  • release.yml — both attest steps get an id; each step's bundle-path
    output (Sigstore-bundle JSON Lines carrying the DSSE-wrapped SLSA-provenance
    statements, verification material included) is staged into target/distrib
    as ourios-server-<target>.intoto.jsonl / ourios-global-artifacts.intoto.jsonl
    and added to the uploaded set — the host job's gh release create artifacts/*
    attaches them. Staging runs after attest, so the bundle can't self-attest
    (the local attest glob would otherwise match its own name).
  • capture-otel-demo-corpus.yml — the publish job (gains
    attestations/id-token write; still runs no third-party code — the attest
    action is GitHub first-party) attests the exact assets it releases
    (logs.jsonl.gz + manifest.md; gzip split into its own step so the .gz
    exists at attest time) and attaches otel-demo-corpus.intoto.jsonl on both
    the create and re-mint/clobber paths — corpus releases signed in place
    from their next mint, per the maintainer's call.
  • SECURITY.md — documents the bundle assets and fully-offline verification:
    gh attestation verify <artifact> --repo … --bundle <file>.intoto.jsonl.

What this does not change

The attestation-store copies (online gh attestation verify) and the cosign
image signature are untouched — the asset is an additional, offline/scanner-
visible form of the same Sigstore material. Per the maintainer's decision,
no cosign sign-blob (.sig) variant.

Validation caveat (stated up front)

The check can only flip on real releases: the next v0.1.x tag and the
next corpus re-mint, followed by Scorecard's next scan. A branch run cannot
prove it — pr-run-mode is plan, so the build/attest jobs don't execute on
PRs (see the #329 discussion). Also, older unsigned releases (v0.1.0,
existing corpus/*) stay as they are until they age out of Scorecard's
5-release window or the corpus tags re-mint.

Verification

  • Both workflows parse as valid YAML; actionlint reports no new findings
    (the SC2086/SC2129 notes are pre-existing in dist-generated steps,
    line-shifted).
  • actions/attest's bundle-path output confirmed against the pinned SHA's
    action.yml.

🤖 Generated with Claude Code

…ard Signed-Releases)

OpenSSF Scorecard's Signed-Releases check scores 0: it scans release *assets*
for signature/provenance files (*.intoto.jsonl, *.sig, …) and never queries the
GitHub attestation store, so our releases — genuinely attested since #329 —
still read as unsigned, and the unsigned corpus/* releases drag the 5-release
window regardless.

Ship the existing attestations as assets too:

- release.yml: give both attest steps an id and stage each step's bundle-path
  output — Sigstore-bundle JSON Lines carrying the DSSE-wrapped SLSA-provenance
  statements — into target/distrib as
  `ourios-server-<target>.intoto.jsonl` / `ourios-global-artifacts.intoto.jsonl`,
  added to the uploaded artifact set; the host job's `gh release create
  artifacts/*` attaches them to the release. Staging runs after attest, so the
  bundle cannot self-attest (the local attest glob would otherwise match it).

- capture-otel-demo-corpus.yml: the publish job (gains attestations/id-token
  write) now attests the exact assets it releases (logs.jsonl.gz + manifest.md;
  gzip split into its own step so the .gz exists at attest time) and attaches
  `otel-demo-corpus.intoto.jsonl` on both the create and re-mint paths — corpus
  releases are signed in place from their next mint on.

- SECURITY.md: document the bundle assets + fully-offline verification
  (`gh attestation verify … --bundle <file>.intoto.jsonl`).

The attestation-store copy stays (online `gh attestation verify`); the asset is
the offline/scanner-visible form. Validation caveat: the check can only flip on
real releases — the next v0.1.x tag and the next corpus re-mint — followed by
Scorecard's next scan; a branch run cannot prove it.

Verified: both workflows parse; actionlint reports no new findings (baseline
SC2086/SC2129 notes in dist-generated steps only, line-shifted).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@jensholdgaard
jensholdgaard requested a review from Copilot July 2, 2026 16:40
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@jensholdgaard, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 11 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6ba8abe8-8a11-4ece-bbab-76f5d6f1070f

📥 Commits

Reviewing files that changed from the base of the PR and between cedef37 and fd5b3a1.

📒 Files selected for processing (3)
  • .github/workflows/capture-otel-demo-corpus.yml
  • .github/workflows/release.yml
  • SECURITY.md
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch scorecard-intoto-release-assets

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR makes GitHub release provenance more scanner-visible (not just stored in GitHub’s attestation store) by attaching the existing actions/attest Sigstore bundle outputs (*.intoto.jsonl) as release assets. This aligns the project’s release signing posture with OpenSSF Scorecard’s Signed-Releases check behavior, which scans release assets rather than querying the attestation store.

Changes:

  • Stage and upload actions/attest bundle-path outputs as *.intoto.jsonl artifacts in the main release workflow (per-target bundles + a global-artifacts bundle).
  • Add attestation + bundle-asset attachment to the corpus/* release workflow, attesting the exact assets it publishes.
  • Document fully-offline verification using gh attestation verify ... --bundle <file>.intoto.jsonl.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

File Description
SECURITY.md Documents the new *.intoto.jsonl release assets and how to verify assets offline with gh attestation verify --bundle.
.github/workflows/release.yml Adds id to attest steps and copies bundle-path outputs into target/distrib/ so they’re uploaded and attached as release assets.
.github/workflows/capture-otel-demo-corpus.yml Adds permissions and steps to gzip before attesting, then attaches otel-demo-corpus.intoto.jsonl alongside corpus assets on create/update.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@jensholdgaard
jensholdgaard merged commit ec134e7 into main Jul 2, 2026
21 checks passed
@jensholdgaard
jensholdgaard deleted the scorecard-intoto-release-assets branch July 2, 2026 16:45
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.

2 participants