0.9.0
Fixed
-
Sync the attested-release permission + Syft contract into every
consumer-facing surface. 0.8.1 addedartifact-metadata: writeto the
attesting jobs and bumped Syft to 1.46.0 in the workflows and release
validator, but the caller-facing docs, examples, and catalog still showed
the old three-scope set and Syft 1.42.3. Because a caller'sGITHUB_TOKEN
permissions are the ceiling for a reusable workflow, a consumer copying the
stale three-scope example under-scopes the attest step. Update the
release-supply-chain.ymlcaller permissions inREADME.md,
examples/public-oss/release.yml, anddocs/04/docs/09; add
artifact-metadata: writeto theartifact-attestations,
slsa-build-provenance, and attestedreleases-packagescapabilities in
catalog/capabilities.yml; correct the Syft version inREADME.md,
docs/07, anddocs/13; and add a 0.8.1 caller migration note. Contract-
truth synchronization only — no workflow behavior change. -
Remove volatile GitHub tariffs from the
ci-free-tier-plannerskill and
guard against regression..agents/skills/ci-free-tier-planner/SKILL.md
hard-coded plan quotas (Actions minute allowances, storage/cache sizes, and
the attestation / dependency-review / secret-protection / environment plan
gates), contradicting the project rule that volatile plan/price/quota facts
live only in the freshness-enforcedcatalog/product-facts.yml. A product
fact could expire and correctly redden the ledger while the skill still
served the stale number. Rewrite section 4 to hold the durable procedure and
reference the facts by id (github-actions-*,github-attestations-*,
github-dependency-review-*,github-secret-scanning-*,
github-environments-*,github-code-quality-transition) with fail-closed
resolution, and add acheck_skills.pyguard (with self-test) that fails CI
if anySKILL.mdreintroduces a comma-grouped allowance,<n> minutes, or a
storage-size figure. Regenerate the.claude/skillsmirror. Found by an
independent forensic review (RVR-P2-010). -
Harden the runtime-coverage honesty gate against weak and stale proofs.
validate_runtime_coverage.pyaccepted anyhttpsURL for a
runtime-provenrecord (its own fixture usedexample.invalid), so a docs
page or a foreign-repo run would have passed, and it never noticed that the
release-supply-chain.ymlrecord still pointed at a 0.7.0 run
(…/29165402032ateda8ff7) taken two edits before the current file.
Requirelast_runto be a
github.com/NDDev-it-com/nddev-ci-workflows/actions/runs/<id>URL and add a
proven_digest(sha256 of the workflow file at the proving run) that the
validator recomputes and matches, so any later edit to a proven workflow
reddens CI until it is re-run and re-recorded (or downgraded) instead of
silently keeping the label. Repoint all three runtime-proven records to runs
that provably executed the current bytes (actionlint / zizmor-sarif → the
ci.ymlrun…/29172553315; release-supply-chain → the 0.8.1 release run
…/29167958787at8b8e3ea) and record each digest. Fixtures now cover
foreign-URL, non-run-URL, missing-digest, and stale-digest. Found by an
independent forensic review (RVR-P2-009). -
Bound the optional runtime bundle to the SBOM-covered source archive
(RVR-P2-011).release-supply-chain.ymland its byte-parallel free twin
attach an optional secondruntime_pathsbundle that received a
build-provenance attestation but no SBOM — and becauseruntime_pathswas
validated independently ofarchive_paths, it could ship tracked files the
Syft scan of the source payload never saw. Enforceruntime_paths ⊆ archive_pathsinside the deterministic-bundle program (both variants,
byte-identically) so every file in the runtime bundle is also in the source
archive thatsbom.spdx.jsoninventories — the source SBOM is now provably a
superset of everything the release ships. Add acheck_release_supply_chain.py
fixture (the runtime-bundle program was previously the one embedded program
with no hermetic test) covering subset-accepted and outside-archive / absolute
/ unmatched / empty-archive-refused. Therelease-supply-chain.yml
runtime-coverage record drops tostatic-only(its contract validator stands
in) until the next release re-proves it live. Found by an independent forensic
review.
Changed
- Catalog tool inventory + currency (
catalog/tools.yml). Add the seven
in-use actions that were absent from the catalog —actions/setup-node,
actions/setup-go,actions-rust-lang/setup-rust-toolchain,
actions/setup-dotnet,actions/setup-java,hashicorp/setup-terraform,
andaquasecurity/trivy-action— and correctgithub/codeql-action's
used_by(it also runs inzizmor-sarif.ymlandpublic-scorecard.yml).
Bump drifted pins to latest across the workflows and catalog in lockstep:
codeql-action v4.36.3→v4.37.0, lychee-action v2.8.0→v2.9.0, labeler
v6.1.0→v6.2.0, stale v10.3.0→v10.4.0, setup-java v5.4.0→v5.5.0, and the
documented semgrep CLI version v1.168.0→v1.169.0. All remain full-SHA pinned
with# vX.Y.Zcomments; no workflow behavior change.