mirror of
https://github.com/Comfy-Org/github-workflows.git
synced 2026-11-05 00:17:37 +00:00
[PR #79] [MERGED] fix(bump-callers): target the github-workflows pin token and assert both pins moved (BE-4662) #89
Labels
No labels
cursor-review-catalog-drift
groom
groom
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Comfy-Org/github-workflows#89
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/Comfy-Org/github-workflows/pull/79
Author: @mattmillerai
Created: 7/26/2026
Status: ✅ Merged
Merged: 8/4/2026
Merged by: @mattmillerai
Base:
main← Head:matt/be-4662-bump-callers-precise-pin📝 Commits (8)
62fa54cfeat(groom): own the max_prs dispatch override in the reusable + add the groom caller fleet (BE-4346)ac575f8fix(bump-callers): SHA-pin checkout, scope the bot token, anchor the pin-comment rewrite (BE-4346)46abc9ffix(bump-callers): anchor the pin-comment rewrite to workflows_ref too (BE-4346)d4d807dfix(bump-callers): target the github-workflows pin token and assert both pins moved (BE-4662)b929a00fix(bump-callers): bound the pin token's edges — sibling repo, owner case, key boundary (BE-4662)84f5a32Merge origin/main into matt/groom-max-prs-reusable (BE-4346)fc8e2b9Merge origin/matt/groom-max-prs-reusable into matt/be-4662-bump-callers-precise-pina2bf511Merge origin/main into matt/be-4662-bump-callers-precise-pin📊 Changes
4 files changed (+517 additions, -57 deletions)
View changed files
📝
.github/bump-callers/README.md(+56 -5)📝
.github/bump-callers/bump-callers.sh(+182 -49)📝
.github/bump-callers/tests/test_bump_callers.sh(+273 -0)📝
.github/workflows/bump-groom-callers.yml(+6 -3)📄 Description
ELI-5
When one of this repo's reusable workflows changes, a bot opens a "bump the pin" PR in every repo that uses it. A repo pins us in two places: the
uses:line and aworkflows_ref:input that loads our prompts/briefs/scripts at run time. Both have to point at the same commit, or the run uses one version's workflow with another version's briefs.The bot used to find those pins by looking for "any 40-character hex string on a line that mentions github-workflows." That's the wrong thing to look for, and it never checked its own work. So if a repo pinned
workflows_ref: v1(a tag, not 40 hex), the bot bumped theuses:line, left the tag alone, and happily opened a green-looking PR that splits the caller. And if some unrelated 40-hex value happened to sit on a line that mentioned github-workflows, the bot overwrote it.Now the bot looks for the pin token —
Comfy-Org/github-workflows…@and theworkflows_ref:key — and takes whatever comes right after it, whatever shape it is. Then, before it stages anything, it re-reads the file and checks that every pin really did move. If one didn't, it says so out loud and fails that repo instead of opening a half-bumped PR.What changed
Comfy-Org/github-workflows[^@\s]*@<ref>andworkflows_ref: <ref>(optionally quoted). Whatever sits right after the token is the ref, so a full sha, a short sha, or a tag all move — and an unrelated SHA sharing the line is unreachable.workflows_refrule is^-anchored to a block-mapping key, so a prose comment mentioning the input (# workflows_ref: keep in sync with uses:) is not rewritten into a sentence with a SHA spliced through it.::warning::naming the file and the stale value and fails that repo. Same posture line 203 already takes for a transient fetch error — a partial bump is worse than no bump (BE-3896). Nothing is written to the caller repo before this point (all API writes are in Pass 2), so the failure is genuinely all-or-nothing.# main @ <40hex>pin comment. That comment used to be corrected as collateral of the old line-scoped 40-hex substitution. With the substitution now precise, it needs its own rule or it would be left naming the old commit — a regression against #77's intent. Verified by deleting the rule and watching #77'sgroomcase go red (2 failures)..github/bump-callers/README.mdgains a "How the pin rewrite is scoped" section;bump-groom-callers.yml's header no longer describes the old line-keying.Tests
.github/bump-callers/tests/test_bump_callers.sh— 99 → 130 cases, all green, plusshellcheck -xclean on the script and the suite. Five new cases:reftagworkflows_ref: v1moves in lock-step withuses:refshort'2222222'moves, and the closing quote survivescolocgithub-workflowsline and one on aworkflows_refline are both untouched; exactly one pin is rewrittenassertfireworkflows_ref: ${{ inputs.workflows_ref }}fails the repo — no blob, no commit, no PR,bump failed for 1 repo, and the warning names both the file and the stale valueprosecomment# workflows_ref: …prose note neither trips the assertion nor gets mangled, while the real pin below it still bumpsRan:
shellcheck -x .github/bump-callers/bump-callers.sh .github/bump-callers/tests/test_bump_callers.shandbash .github/bump-callers/tests/test_bump_callers.sh.Judgment calls
main. #77 is open and rewrites this exactsedblock (it added the# main @comment rules). Building onmainwould have conflicted and effectively reverted them. Banner at the top; base ismatt/groom-max-prs-reusable.uses:pin at a tag is now rewritten to the SHA too. The ticket specified shape-agnostic matching forworkflows_refonly, but applying it touses:as well is what makes the pair coherent — and it is required, because the assertion demands everyuses:pin equal the new SHA, so a@v1pin would otherwise fail the repo forever. It also matches the repo standard ("pin everything by full commit SHA"; bare@v1fails consumers'pinact/zizmor).workflows_refis a${{ … }}expression, or in flow style (with: {workflows_ref: v1}), will fail its repo on every run until a human fixes the config. That is deliberate — there is no literal ref for the bumper to move in those shapes, and rewriting them would break the caller. Comments are stripped before the assertion scans, so prose can never cause that failure.workflows_refusage in the repo: the${{ inputs.workflows_ref }}forms all live inside the reusable workflows themselves (never in a caller list), and every documented caller pattern (workflows_ref: <sha>,workflows_ref: main,workflows_ref: <same-sha>) is a literal the new rewrite moves. So no caller shape that works today is newly denied — the shapes that fail are the ones that previously produced a silently half-bumped PR.Risk
The change is confined to one script that backs all five bump fleets, so blast radius is "every fleet" — but every write to a caller repo happens in Pass 2, after the assertion, and the suite covers each fleet's fixture shape. The riskiest line is the
workflows_refsubstitution, which replaces whatever token follows the key; that is safe becauseworkflows_refis this repo's own input and its only meaning is "the github-workflows ref to load assets from."Closes BE-4662.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.