Repository navigation
ci(release): accept the release PR's CI when its push event is lost - #327
Merged
Merged
Conversation
GitHub never delivered the push event for v0.55.0's release commit 5f96a74: the commit has no workflow run, and the repository activity log has no merge entry for it. Release Please runs only on push, and verify-ci accepts only a CI push run on the exact release commit, which can no longer appear because ci.yml has no dispatch trigger. The release could not finish. A manual Release dispatch can now name the release PR's own CI run in a new ci_run_id input. verify-ci uses it only while the release commit has no CI push run, and only if the run is a completed pull_request run of ci.yml in this repository whose CI Success passed, its head is the head of the one merged pull request into main whose merge commit is the release commit, that head contains the release commit's single parent, and both commits share a tree. The new step needs pull-requests: read for commits/<sha>/pulls. When verify-ci took that path, publish-release checks again before it makes the release public: a CI push run that has appeared since, from a replayed event for example, must pass first. The push path is unchanged. check-ci-gate.sh now applies the exact-SHA rule to the push-run wait step itself and pins that step's condition, the dispatch-only condition of every step that reads ci_run_id, the new permission, and the publish-time check. release-ci-override.test.sh runs both new steps against a stub gh.
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## main #327 +/- ##
=======================================
Coverage 95.60% 95.60%
=======================================
Files 280 280
Lines 166327 166327
=======================================
+ Hits 159013 159015 +2
+ Misses 7314 7312 -2 see 1 file with indirect coverage changes 🚀 New features to boost your workflow:
|
sunerpy
added a commit
that referenced
this pull request
Oct 22, 2026
…329) Record the v0.55.0 release: #322 merged as 0796c8a, release PR #325 as 5f96a74, the push event GitHub never delivered for that merge, #327's dispatch path, Release run 39698634632, and the black-box acceptance of the downloaded binaries against v0.54.0, with the 24-cell benchmark and the older upgrade issue in default daemon mode. Close the v1.6.1 -> v1.6.2 sync: the tracked release moves to v1.6.2 with the owner's exceptions (COBOL, G16 and G17, OD-19, and the W7-W9 rows planned for the follow-up pull request). The audit's LANDED rows now name #322, and docs-check.py expects the new tracked release.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
GitHub never delivered the push event for the v0.55.0 release commit
5f96a74(merge of #325 at 2026-10-21T14:05:40Z). The commit has no workflow run and no check suite, and the repository activity log has nopr_mergeentry for it. Every earlier merge has one. Release Please runs only onpush, andverify-ciaccepts only a CIpushrun on the exact release commit. That run can no longer appear, becauseci.ymlhas no dispatch trigger, so the release is stuck before Release Please. This PR adds a guarded way out that keeps the exact-SHA gate in charge whenever it can decide.workflow_dispatchinputci_run_id(optional). On a manual rebuild,verify-ciruns a new step,pr_ci, that accepts the named run only while the release commit has no CI push run. The run must:pull_requestrun of.github/workflows/ci.ymlin this repository, withCI Successpassed in its latest attempt;mainwhose merge commit is the release commit;verify-cigainspull-requests: readforcommits/<sha>/pulls, and the exact-SHA wait step is skipped only when this step accepted.Publish-time check. When
verify-citook that path,publish-releasechecks again before the draft becomes public: a CI push run that has appeared since, from a replayed event for example, must pass first. It waits up to 7.5 minutes inside the job's timeout and otherwise fails, asking for a re-run. A run created in the few seconds between this check andgh release edit --draft=falsecannot be stopped; the owner accepted that window.Push path unchanged.
Structure gate.
scripts/check-ci-gate.shnow applies the exact-SHA rule to the push-run wait step itself and pins its condition. The newpr_cistep also containsselect(.name == "CI Success"), so the old whole-job string match would no longer have caught a weakened wait step. The gate also pins the dispatch-only condition of every step that readsci_run_id, the new permission, thepr_ci_acceptedoutput, and the publish-time check.After merge
Each step needs the owner's go-ahead.
v0.55.0and the draft at5f96a74. That run'sverify-cithen fails as expected: there is no push CI for5f96a74. The draft stays unpublished, and the run can be cancelled once the draft exists.mainwithtag_name=v0.55.0andci_run_id=39605156993. That is chore: release 0.55.0 #325's CI on head67a9a9d, attempt 2, all green, on tree029198bb…, the same tree as5f96a74.Testing
scripts/tests/release-ci-override.test.sh(new) extracts both steps fromrelease.ymland runs them against a stubgh. 31 cases: 23 forpr_ci(accept, defer to an existing push run, and every rejection) and 8 for the publish-time check (no run, later pass, later fail, running then pass or fail, never completes, API failures). Disabling each of the 20 guards one at a time makes its matching case fail.scripts/tests/ci-gate.test.sh: 16 cases. J is re-anchored on the wait step; L–P are new.run:blocks), shellcheck, oxfmt,docs-check.py,guardrail.shand every script test pass. The pre-push hook'smake pre-cipassed on the pinned 1.98.0 toolchain:make check, the viewer gate (svelte-check, vitest 574/574, rebuilt bundle byte-identical) and the archive smoke (codegraph 0.55.0).