Finding
Every workflow run on the release-please--branches--main branch is created with conclusion
action_required and never starts. Branch protection requires cargo audit, cargo deny, and
gate / gate, so the release PR sits BLOCKED with zero checks — not pending ones, absent ones
— until a human approves the runs by hand. That is one manual intervention per release, forever, and
it is invisible: a release PR blocked on held runs looks exactly like one blocked on slow runs.
Evidence
gh run list --repo forkwright/akroasis immediately after release-please updated #430 to head
304754d6:
completed action_required release-please--branches--main Gate Attestation
completed action_required release-please--branches--main Dependabot Auto-Merge
completed action_required release-please--branches--main Security
The same command shows the contrast on an ordinary branch in the same repo — fix/231-vault-error-fidelity
returned success for Gate Attestation and Security with no approval step. So this is not a
repository-wide approval requirement; it is specific to the branch whose commits are authored by
github-actions[bot].
gh api repos/forkwright/akroasis/branches/main/protection gives the required contexts:
required checks: ['cargo audit', 'cargo deny', 'gate / gate']
strict(up-to-date): False
.github/workflows/release-please.yml:23 runs googleapis/release-please-action@45996ed1 # v5.0.0
with no token: input, so it authenticates as the default GITHUB_TOKEN.
Held runs on #430 were approved manually (32455351809, 32455351049, 32455351039) to unblock
v0.4.2. #427, #423, #416 and every earlier release merged, so this has been absorbed by hand each
time rather than noticed as a standing defect.
Why this matters
The release path is the one path that must work without a human at the keyboard, and it currently
cannot. Worse, the failure is silent and mimics a benign state: mergeStateStatus reads BLOCKED
and statusCheckRollup is empty, which is the same shape as a release PR whose checks have not been
scheduled yet. A seat polling for green has no way to tell "waiting" from "will wait forever" without
querying the run list separately, which is not part of any normal merge check.
It also interacts badly with the release policy: agents cut minor and patch releases, so the seat
expected to complete a release is the one that cannot, without reaching for a repository-admin
action.
Desired correction
Give release-please a credential whose pushes are not subject to the bot-approval gate — a
fine-grained PAT or a GitHub App installation token in secrets, passed as the action's token:
input. That is the upstream-documented remedy and it also fixes the related recursion caveat, where
GITHUB_TOKEN-authored events do not trigger downstream workflows at all.
This needs an operator action: provisioning the credential is outside an agent seat's authority.
Two things are worth deciding together — whether a PAT or an App is preferred fleet-wide, since every
repo running release-please has this same defect, and whether the token should be scoped per repo or
shared.
Until then the interim is mcp__kanon__ci_hold_sweep (or approving the current head's runs by hand,
after checking they belong to the current head — approving an older generation cancels the newest).
Done when: a release-please PR opened with no human present reaches a green required-check set on
its own, and the manual approval step is gone from the release path.
Finding
Every workflow run on the
release-please--branches--mainbranch is created with conclusionaction_requiredand never starts. Branch protection requirescargo audit,cargo deny, andgate / gate, so the release PR sitsBLOCKEDwith zero checks — not pending ones, absent ones— until a human approves the runs by hand. That is one manual intervention per release, forever, and
it is invisible: a release PR blocked on held runs looks exactly like one blocked on slow runs.
Evidence
gh run list --repo forkwright/akroasisimmediately after release-please updated #430 to head304754d6:The same command shows the contrast on an ordinary branch in the same repo —
fix/231-vault-error-fidelityreturned
successfor Gate Attestation and Security with no approval step. So this is not arepository-wide approval requirement; it is specific to the branch whose commits are authored by
github-actions[bot].gh api repos/forkwright/akroasis/branches/main/protectiongives the required contexts:.github/workflows/release-please.yml:23runsgoogleapis/release-please-action@45996ed1 # v5.0.0with no
token:input, so it authenticates as the defaultGITHUB_TOKEN.Held runs on #430 were approved manually (
32455351809,32455351049,32455351039) to unblockv0.4.2. #427, #423, #416 and every earlier release merged, so this has been absorbed by hand each
time rather than noticed as a standing defect.
Why this matters
The release path is the one path that must work without a human at the keyboard, and it currently
cannot. Worse, the failure is silent and mimics a benign state:
mergeStateStatusreadsBLOCKEDand
statusCheckRollupis empty, which is the same shape as a release PR whose checks have not beenscheduled yet. A seat polling for green has no way to tell "waiting" from "will wait forever" without
querying the run list separately, which is not part of any normal merge check.
It also interacts badly with the release policy: agents cut minor and patch releases, so the seat
expected to complete a release is the one that cannot, without reaching for a repository-admin
action.
Desired correction
Give release-please a credential whose pushes are not subject to the bot-approval gate — a
fine-grained PAT or a GitHub App installation token in
secrets, passed as the action'stoken:input. That is the upstream-documented remedy and it also fixes the related recursion caveat, where
GITHUB_TOKEN-authored events do not trigger downstream workflows at all.This needs an operator action: provisioning the credential is outside an agent seat's authority.
Two things are worth deciding together — whether a PAT or an App is preferred fleet-wide, since every
repo running release-please has this same defect, and whether the token should be scoped per repo or
shared.
Until then the interim is
mcp__kanon__ci_hold_sweep(or approving the current head's runs by hand,after checking they belong to the current head — approving an older generation cancels the newest).
Done when:a release-please PR opened with no human present reaches a green required-check set onits own, and the manual approval step is gone from the release path.