fix: replace release.yml with a local script - #2
Merged
Conversation
GitHub Actions cannot bypass the v* tag ruleset. The API rejects it: Actor GitHub Actions integration must be part of the ruleset source or owner organization Actions is built into the platform rather than installed as an org integration, so it can never satisfy that condition. Verified empirically — release.yml failed with GH013 "Cannot create ref due to creations being restricted". The alternatives were to relax the ruleset, or to stand up a custom org-owned GitHub App whose private key lives in repo secrets. Relaxing it would let any account with plain write access move v1, which is the ref 16 repos execute -- that is the one thing the ruleset exists to prevent. A GitHub App means keeping a standing private key in order to automate two git commands. So: script/cut-release.sh, run locally by a team member. It keeps every guard the workflow had (semver format, refuse to overwrite an existing version tag) and adds clean-tree, on-main and level-with-origin checks that a workflow did not need. README updated -- it documented a release path and a `release` environment that no longer exist. Co-Authored-By: Claude <noreply@anthropic.com>
RobFaustLZ
approved these changes
Jul 28, 2026
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.
release.ymlcannot work. Removing it rather than leaving a workflow that provably fails.What happened
The
v*tag ruleset restricts creation and update.release.ymlpushes asgithub-actions[bot], which is not covered by the@labelzoom/labelzoomteam bypass, so the run failed:Adding GitHub Actions to the bypass list is not possible. The picker doesn't offer it, and the API rejects it outright:
Actions is built into the platform rather than installed as an org integration, so it can never satisfy that condition.
Why a script rather than the alternatives
Relax the ruleset — would let any account with plain write access create or move
v1, which is the ref 16 repos execute. That is the single thing this ruleset exists to prevent, and it is not hypothetical: the@FaustClawagent account has write on every repo in the org and is deliberately not on the team.Custom org-owned GitHub App — would work, since a custom app is installed in the org and does appear in the bypass picker. It also means a standing private key in repo secrets, in order to automate two
gitcommands, on a repo that releases rarely. Poor trade, especially while we're removing long-lived credentials elsewhere.So the promotion stays a deliberate local act by a human, which is the semantic the
releaseenvironment was reaching for anyway — and with a single human in the org, a required-reviewer gate was never going to be real review.What
script/cut-release.shkeeps and addsKeeps the workflow's guards: semver format validation, and refusing to overwrite an existing version tag. Adds three a workflow didn't need — clean working tree, on
main, and level withorigin/main— plus a confirmation prompt that states the blast radius.Also in this PR
README.mddocumented a release path and areleaseenvironment that no longer exist. The@v1safety argument is rewritten around the two controls that are actually in place:mainrequires a PR with code-owner review and a passingcicheck under an empty-bypass org ruleset, and thev*tag ruleset limits tag creation to the team.Verification
shellcheckclean oncut-release.sh; guard paths exercised (no arg,1.2.3,v1.2all rejected).actionlintandzizmorclean on the remaining workflows.release.ymlor thereleaseenvironment left in the tree.Do not create the
releaseenvironment — it has no consumer now.🤖 Generated with Claude Code