Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
a077c60
release: prepare v0.4.0-rc.5 metadata (local draft)
ErenAri Oct 18, 2026
12fe465
release: add a read-only release-candidate preflight inventory
ErenAri Oct 18, 2026
ba5723c
release: address review of the rc.5 draft and the preflight inventory
ErenAri Oct 18, 2026
bd6f60b
release: check the canary's Action pin; no silent exits in rc-preflight
ErenAri Oct 18, 2026
115a374
release: parse active workflow pins in the RC preflight
ErenAri Oct 18, 2026
135889f
release: let the RC preflight build its pin parser with a cached tool…
ErenAri Oct 18, 2026
334ce96
release: close review findings on the RC preflight pin parser
ErenAri Oct 18, 2026
a6b0918
release: count only pins that can run in the RC preflight parser
ErenAri Oct 18, 2026
87889aa
release: let the stable PR and tag build pass the stable canary-pin c…
ErenAri Oct 18, 2026
0f8f3b2
release: match GitHub's if and needs semantics in the RC preflight pa…
ErenAri Oct 18, 2026
462287d
docs: list the stable-only tag gates and the operator-note order
ErenAri Oct 18, 2026
3eb880c
release: check the canary schedule and campaign digests in the RC pre…
ErenAri Oct 18, 2026
5d444e7
docs: bind manual verification commands to the exact release tag
ErenAri Oct 18, 2026
b9f3aa1
action: document the ./ prefix and workspace binary precedence in inputs
ErenAri Oct 18, 2026
f61c291
release: let the stable PR document its own unreleased tag
ErenAri Oct 18, 2026
425335b
readiness: date the Falco run from its first target, not the report
ErenAri Oct 18, 2026
cc36c70
install.sh: name the missing gh capability instead of reporting a fai…
ErenAri Oct 18, 2026
35d6ebe
docs: state the gh minimum and correct when RC verification features …
ErenAri Oct 18, 2026
e1cbd97
release: refuse schedule keys and cron forms the preflight cannot judge
ErenAri Oct 18, 2026
df47e0f
readiness: ignore unbooted optional profiles when dating the Falco run
ErenAri Oct 18, 2026
e033fe6
readiness: look up the drill and incident runs it is given
ErenAri Oct 18, 2026
2273204
release: let SHA-pinned templates keep the previous stable during the…
ErenAri Oct 18, 2026
f8809a9
install.sh: report a gh that cannot run; test that every gh verify ca…
ErenAri Oct 18, 2026
7f7a4ef
readiness: bind the looked-up drill run to this repository, dispatch …
ErenAri Oct 18, 2026
6de1bb7
docs: the v0.3.8 candidates' Action fails without attestation support
ErenAri Oct 18, 2026
2269647
docs: gh reports unknown command "attestation" only before 2.47.0
ErenAri Oct 18, 2026
b9149e7
release: bind the stable window to the canary pin; fix the channel test
ErenAri Oct 18, 2026
4cb4516
release: read the canary's first version comment, as check-canary-pin…
ErenAri Oct 18, 2026
723b5e2
install.sh: report gh auth and API failures apart from a refused veri…
ErenAri Oct 19, 2026
17adeab
security(release): bind release provenance to the exact tag and candi…
ErenAri Oct 19, 2026
6705bb1
install.sh: retry the API probe on a 5xx or no response only
ErenAri Oct 19, 2026
4a72097
test(release): pin the exact promotion signer identity and ref anchors
ErenAri Oct 19, 2026
5794ee4
fix(action): bound the release tag resolution in time
ErenAri Oct 19, 2026
69cebea
install.sh: bind gh-path installs to the release's attested names
ErenAri Oct 19, 2026
fdae550
readiness: look up the canary runs, their attempts and the release
ErenAri Oct 19, 2026
9c92411
Merge #269 (claude/installer-gh-capability) at 69cebeae6791 into the …
ErenAri Oct 19, 2026
6caa005
Merge #267 (claude/docs-tag-bound-verification) at 2269647bdb10 into …
ErenAri Oct 19, 2026
8fd92e7
Merge #268 (claude/readiness-falco-earliest-target) at fdae550d4d24 i…
ErenAri Oct 19, 2026
9be6f7c
Merge #266 (claude/stable-canary-pin-bootstrap) at 4cb4516bda42 into …
ErenAri Oct 19, 2026
d45ede6
Merge claude/release-provenance-binding (no PR) at 5794ee48babe into …
ErenAri Oct 19, 2026
dd4164a
Merge #265 (claude/rc5-preflight-toolchain) at e1cbd9748e28 into the …
ErenAri Oct 19, 2026
4a1466d
security(release): refuse stable readiness records without the canary…
ErenAri Oct 19, 2026
94f0333
docs: state the Action's tag-bound prebuilt verification and canary r…
ErenAri Oct 19, 2026
0826cde
docs(changelog): reconcile the v0.4.0-rc.5 section with the landing b…
ErenAri Oct 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,12 @@ jobs:
# v0.3.6 shipped a broken action; the docs kept pointing at it for two
# weeks because nothing checked the pins a reader copy-pastes.
run: bash scripts/check-doc-pins.sh
- name: Documented action pins regression
# The stable release window: docs may name vX.Y.Z before its tag
# exists (only that tag, only in the stable channel, only when the
# remote positively lacks it), and SHA-pinned templates may stay on
# the release the consumer canary's stable pin names until the tag.
run: bash scripts/check-doc-pins_test.sh
- name: Action OCI-artifact detection regression
# Guards the fix that lets the action accept remote OCI references
# (ghcr.io/...) as `artifact`. Extracts is_remote_artifact() from
Expand Down Expand Up @@ -108,6 +114,10 @@ jobs:
# missing or inconsistent inputs; open distribution decisions withhold
# optional assets and block stable builds.
run: bash scripts/distribution-bundle_test.sh
- name: RC preflight regression
# The read-only release-candidate inventory reports VERIFIED, MISSING
# or PENDING from observed state only; lookup failures abort it.
run: bash scripts/rc-preflight_test.sh
- name: Image prefetch reliability regression
# The public matrix lane lost five of seven weekly runs (Aug-Oct 2026)
# to a single failed image download aborting the whole prefetch. These
Expand Down Expand Up @@ -156,6 +166,13 @@ jobs:
run: bash scripts/check-production-code-scanning_test.sh
- name: Production-readiness evidence regression
run: bash scripts/production-readiness-report_test.sh
- name: Release-workflow gate regression
# Run by a tag's own copy, so they cannot be fixed for a release after
# it is tagged: the stable gate requires a completed rollback drill of
# the release's own candidate; promotion requires the candidate run's
# signature files and SBOM, this tag's exact signer identity, and
# tag- and commit-bound attestations.
run: bash scripts/release-workflow-gates_test.sh
- name: Campaign-to-candidate binding regression
# A scheduled campaign must test the designated immutable release
# candidate (tag, commit, signed assets, attestations), not whatever
Expand Down
21 changes: 16 additions & 5 deletions .github/workflows/promote-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,12 @@ jobs:

cmp candidate/run-assets/SHA256SUMS candidate/draft-assets/SHA256SUMS
cmp "$evidence" candidate/draft-assets/release-candidate-evidence.json
# The SBOM and the signature files are not listed in SHA256SUMS:
# the draft must carry the exact candidate run's copies.
for signed in SHA256SUMS.sig SHA256SUMS.crt \
bpfcompat.sbom.cdx.json bpfcompat.sbom.cdx.sig bpfcompat.sbom.cdx.crt; do
cmp "candidate/run-assets/${signed}" "candidate/draft-assets/${signed}"
done

assets=(
bpfcompat-linux-amd64
Expand All @@ -170,23 +176,28 @@ jobs:
if [[ "$channel" == "stable" ]]; then
assets+=(production-readiness.json production-readiness.md)
fi
# Attestations and signatures must come from this tag's release
# run at the expected commit, not from any v* tag's run.
export BPFCOMPAT_EXPECTED_SOURCE_SHA="$EXPECTED_COMMIT"
export BPFCOMPAT_EXPECTED_SOURCE_REF="refs/tags/$RELEASE_TAG"
bash scripts/verify-release-assets.sh \
candidate/draft-assets "$GITHUB_REPOSITORY" "${assets[@]}"
gh attestation verify "$evidence" \
--repo "$GITHUB_REPOSITORY" \
--signer-workflow "${GITHUB_REPOSITORY}/.github/workflows/release-artifacts.yml"
--signer-workflow "${GITHUB_REPOSITORY}/.github/workflows/release-artifacts.yml" \
--source-digest "$EXPECTED_COMMIT" --source-ref "refs/tags/$RELEASE_TAG"

identity_regexp="^https://github.com/${GITHUB_REPOSITORY}/.github/workflows/release-artifacts.yml@refs/tags/v"
identity="https://github.com/${GITHUB_REPOSITORY}/.github/workflows/release-artifacts.yml@refs/tags/${RELEASE_TAG}"
cosign verify-blob \
--certificate candidate/draft-assets/SHA256SUMS.crt \
--signature candidate/draft-assets/SHA256SUMS.sig \
--certificate-identity-regexp "$identity_regexp" \
--certificate-identity "$identity" \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
candidate/draft-assets/SHA256SUMS
cosign verify-blob \
--certificate candidate/draft-assets/bpfcompat.sbom.cdx.crt \
--signature candidate/draft-assets/bpfcompat.sbom.cdx.sig \
--certificate-identity-regexp "$identity_regexp" \
--certificate-identity "$identity" \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
candidate/draft-assets/bpfcompat.sbom.cdx.json

Expand Down Expand Up @@ -219,7 +230,7 @@ jobs:
version --json | jq -r .version)"
test "$actual_version" = "$expected_version"
cosign verify \
--certificate-identity-regexp "^https://github.com/${GITHUB_REPOSITORY}/.github/workflows/release-artifacts.yml@refs/tags/v" \
--certificate-identity "https://github.com/${GITHUB_REPOSITORY}/.github/workflows/release-artifacts.yml@refs/tags/${RELEASE_TAG}" \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
"${IMAGE}@${EXPECTED_DIGEST}"

Expand Down
12 changes: 12 additions & 0 deletions .github/workflows/release-artifacts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,14 @@ jobs:
.slo.campaign_count == 4 and
.slo.infrastructure_errors == 0 and
(.canaries | length == 3) and
([.canaries[] |
(.workflow_run_attempt | type == "number" and . >= 1 and . == floor) and
(.attempt_started_at | type == "string" and test("^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$"))
] | all) and
($c.published_at | type == "string" and test("^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$")) and
.rollback.completed == true and
.rollback.alias == (($c.image | sub("@[^@]*$"; "")) + ":rollback-drill-" + $c.tag) and
.rollback.candidate_digest == ($c.image | sub("^.*@"; "")) and
.incident.completed == true and
.operator.approval_mode == "solo-maintainer" and
.operator.confirmed == true
Expand Down Expand Up @@ -329,6 +337,8 @@ jobs:
- name: Verify candidate attestations
env:
GH_TOKEN: ${{ github.token }}
BPFCOMPAT_EXPECTED_SOURCE_SHA: ${{ github.sha }}
BPFCOMPAT_EXPECTED_SOURCE_REF: ${{ github.ref }}
run: >
bash scripts/verify-release-assets.sh
dist Kernel-Guard/bpfcompat
Expand Down Expand Up @@ -427,6 +437,8 @@ jobs:
- name: Verify ARM64 candidate attestation
env:
GH_TOKEN: ${{ github.token }}
BPFCOMPAT_EXPECTED_SOURCE_SHA: ${{ github.sha }}
BPFCOMPAT_EXPECTED_SOURCE_REF: ${{ github.ref }}
run: >
bash scripts/verify-release-assets.sh
dist Kernel-Guard/bpfcompat
Expand Down
Loading
Loading