You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
GStack publishes/reuses GitHub Container Registry CI images, but the image-producing workflows do not generate GitHub artifact attestations. That leaves maintainers without a first-party provenance record tying ghcr.io/garrytan/gstack/ci:* images back to the workflow run, commit, and build inputs that produced them.
GitHub's artifact attestation flow is designed for this exact build-provenance gap: GitHub Actions can generate attestations for binaries and container images, and the action requires explicit OIDC/attestation permissions (id-token: write, attestations: write).
Repo-local evidence
origin/main:.github/workflows/ci-image.yml builds and pushes the reusable CI image:
packages: write at line 21
docker/build-push-action@v6 at line 34
push: true at line 38
tags ghcr.io/${{ github.repository }}/ci:latest and ghcr.io/${{ github.repository }}/ci:${{ github.sha }} at lines 40-41
origin/main:.github/workflows/evals.yml and origin/main:.github/workflows/evals-periodic.yml can also build/push the cached eval image when it is missing:
packages: write at line 21 in both workflows
docker/build-push-action@v6 at line 49 in both workflows
push: true at line 53 in both workflows
Repo grep found no artifact-attestation wiring in the current default branch:
Maintainers can verify that CI images consumed by eval jobs were built by this repo's GitHub Actions workflow from the expected commit.
Raises the bar against CI-image substitution/poisoning, especially because the eval workflows run tests inside ghcr.io/${{ github.repository }}/ci:* containers.
Add artifact attestation to image-producing workflows, starting with .github/workflows/ci-image.yml and then mirroring into the on-demand image build path in evals.yml / evals-periodic.yml if maintainers want those images attested too.
Concrete shape:
Add least-privilege attestation permissions to the image build job:
Keep it non-blocking only if the repository plan/permissions do not support attestations yet; otherwise fail the image build if provenance generation fails.
Duplicate check performed
Inspected 200 open issues with:
gh issue list -R garrytan/gstack --state open --limit 200 --json number,title,body,url,labels,createdAt,updatedAt
Inspected 200 open PRs with:
gh pr list -R garrytan/gstack --state open --limit 200 --json number,title,body,url,labels,createdAt,updatedAt,isDraft,headRefName,baseRefName
Searched the inspected open issue/PR title+body set for:
Summary
GStack publishes/reuses GitHub Container Registry CI images, but the image-producing workflows do not generate GitHub artifact attestations. That leaves maintainers without a first-party provenance record tying
ghcr.io/garrytan/gstack/ci:*images back to the workflow run, commit, and build inputs that produced them.GitHub's artifact attestation flow is designed for this exact build-provenance gap: GitHub Actions can generate attestations for binaries and container images, and the action requires explicit OIDC/attestation permissions (
id-token: write,attestations: write).Repo-local evidence
origin/main:.github/workflows/ci-image.ymlbuilds and pushes the reusable CI image:packages: writeat line 21docker/build-push-action@v6at line 34push: trueat line 38ghcr.io/${{ github.repository }}/ci:latestandghcr.io/${{ github.repository }}/ci:${{ github.sha }}at lines 40-41origin/main:.github/workflows/evals.ymlandorigin/main:.github/workflows/evals-periodic.ymlcan also build/push the cached eval image when it is missing:packages: writeat line 21 in both workflowsdocker/build-push-action@v6at line 49 in both workflowspush: trueat line 53 in both workflowsgit grep -n -E 'attest-build-provenance|artifact attestation|attestation|provenance|id-token: write|attestations: write' origin/main -- .github package.json bun.lock README.md CONTRIBUTING.md docsprovenancewere returned.None of those asks for GHCR image artifact attestations.
Expected impact
ghcr.io/${{ github.repository }}/ci:*containers.Suggested fix
Add artifact attestation to image-producing workflows, starting with
.github/workflows/ci-image.ymland then mirroring into the on-demand image build path inevals.yml/evals-periodic.ymlif maintainers want those images attested too.Concrete shape:
docker/build-push-actionanidso the pushed digest can be referenced.actions/attest-build-provenanceafter the push, pinned to a full commit SHA in the same style requested by CI hardening: provider API keys exposed on pull_request (evals.yml) + third-party actions pinned to mutable tags #1948, withsubject-name: ghcr.io/${{ github.repository }}/ciandsubject-digestfrom the build step.Duplicate check performed
gh issue list -R garrytan/gstack --state open --limit 200 --json number,title,body,url,labels,createdAt,updatedAtgh pr list -R garrytan/gstack --state open --limit 200 --json number,title,body,url,labels,createdAt,updatedAt,isDraft,headRefName,baseRefNameattestation,provenance,SLSA,artifact integrity,attest-build-provenance,build provenanceghcr,ci image,container image,docker/build,packages: writeid-token,OIDC,OpenID Connectgh search issues --repo garrytan/gstackfor:artifact attestationattest-build-provenancebuild provenanceghcr provenancecontainer image attestationid-token attestationsartifact integrityCommands/files inspected
README.mdCONTRIBUTING.mddocs/ADDING_A_HOST.mddocs/OPENCLAW.md.github/workflows/skill-docs.yml.github/workflows/evals.yml.github/workflows/evals-periodic.yml.github/workflows/ci-image.yml.github/workflows/actionlint.ymlpackage.jsongit fetch origin main --prunegit ls-tree -r --name-only origin/main .github/workflowsgit grep -n -E 'attest-build-provenance|artifact attestation|attestation|provenance|id-token: write|attestations: write|dependency-review|osv-scanner|semgrep|ossf/scorecard|scorecard-action|codeql-action' origin/main -- .github package.json bun.lock README.md CONTRIBUTING.md docsgit grep -n -E 'packages: write|docker/build-push-action|push: true|ghcr.io|IMAGE:' origin/main -- .github/workflowsUsing artifact attestations to establish provenance for builds,actions/attest-build-provenance