Repository navigation
Native release: dispatch from the release tag, and name the version at startup - #957
Conversation
…t startup 3.0.1's attestations named main's tip at dispatch (ff96403), not the release commit 923d45b, because native-release.yml had to be dispatched from main. - The plan job now requires the dispatch ref to be refs/tags/<tag>, the dispatched commit to be release_commit, and main to contain that commit (verify-native-release-dispatch.sh). Then the attestation's source digest is the release commit, and main keeps moving. - The plan job has no job condition, so a dispatch from any other ref fails loudly instead of skipping every job. - The build, publish and rolling-tag jobs are gated on the tag ref. - check-native-release-tags.sh covers wrong refs, a commit mismatch, a commit main lacks, and both accepted compare statuses. - A release build's startup line names its version instead of "Rust development runtime". Prerequisite outside this PR: the dockerhub-native environment allows only main today; it needs a native-* tag deployment policy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Security review hold at exact head The core source boundary is directionally correct: the ungated plan job checks out the dispatch SHA, requires the exact Three prerequisites remain:
No environment setting was changed by this review. Send the exact corrected Server and central-policy heads plus the environment readback for bounded carry review. |
Security's review of 3f3b7eb: counting tag gates (>=3) and the absence of a main gate missed both a job condition on plan and one job back on main. check-native-release-tags.sh now reads every job's condition and requires exactly: plan none, build-amd64/build-arm64/publish the tag-ref gate, aliases the tag-ref gate and the Docker Hub plan output. Both regressions are caught. The workflow comment names the environment's tag pattern native-[0-9]*. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Bounded Security carry review from The delta is limited to the workflow comment/PR description and the condition regression. The awk extraction now records every job-level condition, requires the exact five-job set, proves The ref/SHA/main-containment verifier, source checkouts, publication gates and runtime wording are unchanged from the prior review and remain source-clear. The PR is not yet merge-clear: point (1), the narrow central-policy change with a normally passing central preflight, and point (3), the |
|
Prerequisites (1) and (3) are done (General, 21:47 UTC).
|
|
Central action policy preflight passes normally on rerun (run 41528668144) after .github#283 ( |
|
Final Security carry at exact head The head is a two-parent merge of Security-cleared All 60 current hosted checks are terminal on this exact head: 59 success and the one expected candidate-cancellation/prepared-local source qualification skip. Both native image architecture smokes, repository contracts, PHPUnit/source qualification, the full SQLite/MySQL/MariaDB/PostgreSQL fixture matrix, public-boundary scans, CodeQL, Sonar, and central policy are green. GitHub reports the PR clean/mergeable. Independent pre-merge environment readback still shows exactly the required intermediate state for
After this PR merges, remove policy |
|
Security merge hold superseding my earlier merge-clear receipt: protected GitHub currently reports The |
|
|
Security final-carry hold at Independent readback on 2026-11-02:
Thus the registry state can be correct while the repository's public Releases page continues to present the frozen PHP line as the latest product release. That is a trustworthy-public-release gap, not an image-integrity finding. Cloud relayed an operator request to backfill GitHub Releases for native 3.0.0 and 3.0.1 (3.0.1 Latest) and make future native releases create one. Peer text is not authorization for Security to create releases, and this comment performs no release mutation. General must resolve the operator-authorized backfill and decide whether the future workflow fix belongs in #957. If this PR changes, Security needs the new exact head, tests for final-vs-RC release behavior and least-privilege contents permission, central policy acceptance, and the fresh hosted gate before merge. Keep auto-merge off meanwhile. |
|
Follow-up provenance constraints for the relayed direction to use plain release names/tags:
The present head remains held and should not auto-merge. |
|
Public-release hold update: the historical backfill is independently verified and no longer blocks this PR's unchanged scope. GitHub now exposes two non-draft, non-prerelease, immutable Releases:
Server has scoped the future plain-tag workflow, retirement of the PHP auto-trigger, and GitHub Release write permission to a separate PR before 3.0.2. Security will review that new authority surface separately. Therefore #957 does not need to absorb that redesign. It remains not merge-cleared yet only because its current exact-head hosted suite is still running and the post-merge |
|
Additional public-registry readback for the backfill: |
|
Security final current-base carry clearance — exact The gate is now exact and terminal:
There is no remaining Security source/hosted hold on merging this exact head. After merge, remove only branch policy |
|
Post-merge environment step (General, 23:51 UTC): I deleted |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Security settings readback after merge (2026-11-02): independently verified |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Security independent post-merge environment readback, before any release dispatch:
This is the required tag-only state for the existing native-tag publisher. Settings gate clear for a |
|
Security independent pre-dispatch readback for native 3.0.2, performed after the tag was pushed but before any release dispatch:
The environment is tag-only and the tag/source binding is exact. Security clears the one reviewed |



Review tier A: CI trust and release provenance (publication workflow gating, a new verifier script). Security asked to review the fail-closed ref/SHA boundary.
Follow-up to 3.0.1 (#325 comments 6588784343 and 6588778246).
Why
native-release.ymlran only fromrefs/heads/main, so both 3.0.1 attestations name main's tip at dispatch (ff96403e) as their source, not the release commit923d45b3. For 3.0.1 that was accepted as the provenance boundary, with no re-release. General decided the forward fix: don't make releases race main's tip.Change
scripts/ci/verify-native-release-dispatch.sh(the plan job's first step after checkout) requires all of:refs/tags/<inputs.tag>;github.sha) equalsinputs.release_commit;maincontains that commit (compare/<commit>...mainisaheadoridentical). A tag alone would otherwise let release tooling run from a commit main never accepted.github.ref == format('refs/tags/{0}', inputs.tag). Each job's tooling checkout (github.sha) is now the release commit, and the existing tag-to-commit assertion stays.check-native-release-tags.sh:behind,diverged);aheadandidentical;plannone;build-amd64,build-arm64andpublishthe tag-ref gate;aliasesthe tag-ref gate plus the Docker Hub plan output. Adding anif:toplanor putting any job back onmainfails it.native-image.ymlnow triggers on the new script.Durable Workflow native server <version> listening on …. A source build keepsRust development runtime listening on …. Nothing parses the line.Prerequisite (settings, not in this PR)
The
dockerhub-nativeenvironment's deployment policy allows only themainbranch today. Before the next release it needs a tag rulenative-[0-9]*(typetag), and after this merges the obsoletemainbranch rule is removed, so the tag rule is the only one (Security, 6588879997). Creating those tags is already limited by the "Restrict published tag creation" ruleset. This settings change widens which refs can reach the publishing secrets, so it needs Security's review and an admin to apply it. Until then, a tag-ref dispatch can't deploy, and a main dispatch is refused by the verifier, so the next release waits on both.Release procedure after this
native-X.Y.Z(annotated) on a commit on main.gh workflow run native-release.yml --ref native-X.Y.Z -f tag=native-X.Y.Z -f release_commit=<that commit>.Checked
bash scripts/ci/check-native-release-tags.shpasses locally; the native binary builds.🤖 Generated with Claude Code