mirror of
https://github.com/Comfy-Org/github-workflows.git
synced 2026-11-05 00:17:37 +00:00
[PR #102] [MERGED] fix(ci-groom): replace unreplaced REPLACE_AT_MERGE placeholder with a real main SHA pin (BE-5548) #112
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#112
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/102
Author: @mattmillerai
Created: 8/1/2026
Status: ✅ Merged
Merged: 8/4/2026
Merged by: @mattmillerai
Base:
main← Head:matt/be-5548-ci-groom-pin📝 Commits (2)
895242efix(ci-groom): replace unreplaced REPLACE_AT_MERGE placeholder with a real main SHA pin (BE-5548)c7ea3acdocs(ci-groom): correct the stale ORDERING note and record the pin's provenance📊 Changes
1 file changed (+27 additions, -13 deletions)
View changed files
📝
.github/workflows/ci-groom.yml(+27 -13)📄 Description
ELI-5
The daily "groom" janitor job in this repo was pointed at a signpost that read
REPLACE_AT_MERGE_WITH_THIS_PRS_SQUASH_SHAinstead of an actual address. GitHub couldn't find that address, so the job fell over before it even started — every single scheduled run for the last week. This PR writes the real address in (twice, because the job needs it in two places and they have to match).Problem
.github/workflows/ci-groom.ymlonmainstill carried the literal placeholder from the BE-4004 PR in both pins — theuses:ref (line 95) and theworkflows_ref:input (line 102). The "replace at merge" step never happened, so the caller referenced a nonexistent ref and failed at startup. The 6 most recentci-groom.ymlruns (2026-07-27 → 2026-08-01, allschedule) arefailure.This is the exact failure mode AGENTS.md calls out under "Enrolling a caller is TWO steps" — and it names this very file: "This repo did it to its own
ci-groom.yml."Change
Both occurrences replaced with
bcde90f4c5b0267d32583dc1d339ac8731c0da9a(themaintip at implementation time), annotated with the repo's# main @ <short>convention — the same formci-assign-reviewers.ymluses. The stale⚠️ BUMP-AT-MERGEinstruction block is replaced with the standard pin note; it was an instruction to do exactly what this PR does, and leaving it would describe a placeholder that no longer exists.Verification
grep -c REPLACE_AT_MERGE .github/workflows/ci-groom.yml→ 0; noREPLACE_AT_MERGEorBUMP-AT-MERGEreference remains anywhere in the repo.grep -oE '[0-9a-f]{40}'yields one unique value), andgit merge-base --is-ancestor bcde90f4… origin/mainconfirms the commit is onmain.groom.yml@bcde90fdeclares every input passed here (bot_app_id,workflows_ref,dry_run,interval_days,cadence,volume_gate) and both secrets (ANTHROPIC_API_KEYrequired,BOT_APP_PRIVATE_KEYoptional); the caller'spermissions:grant matches the union groom.yml documents as required.builderis left at itsfalsedefault, so nocontents: writeis needed.bump-callers.sh's actual rewrite rules against the edited file:GW_USESresolves togroom.ymlalone (soGW_ONLY_OURS=1, no attribution guard), and both 40-hex pins and both# main @annotations rewrite together in one pass. That is the real fix — see "Why the bumper never did this itself" below.python3 -c "import yaml; yaml.safe_load(...)"parses the file.bash .github/bump-callers/tests/test_bump_callers.sh123/123,shellcheck -xclean,check_agents_md.py --root .passed (1 pre-existing warning: no CODEOWNERS, unrelated to this change).Why the bumper never did this itself (roster check — step 3 of the ticket)
The ticket's hypothesis was that
ci-groom.ymlwas missing from theGROOM_CALLERSroster. It is not.GROOM_CALLERSis readable and already contains an entry for this repo pointing at.github/workflows/ci-groom.yml— so nogh variable setwas needed and none was made. (Roster contents are deliberately kept in repo variables because this repo is public; nothing beyond this repo's own self-entry is disclosed here or in the logs.)The actual reason the pin never moved is narrower and worth recording:
bump-callers.shanchors its rewrite tos/[0-9a-f]{40}/${NEW_SHA}/g. The literalREPLACE_AT_MERGE_WITH_THIS_PRS_SQUASH_SHAis not 40-hex, so no bump could ever match it — the caller was enrolled and the bumper was running, but the placeholder was structurally invisible to it. Enrollment was never the gap; a hand-bump that never happened was. After this PR the pins are 40-hex and the fleet takes over automatically.Judgment calls
maintip (bcde90f), not to this PR's own squash SHA. The original comment asked for the latter, but that only made sense while the interval gate lived in that PR; it has been onmainfor months. Pinning to a commit that exists today is what makes the ref resolvable the moment this merges — a self-referential pin would require a second hand-bump and reproduce the bug.⚠️ BUMP-AT-MERGEcomment block. It described a placeholder that no longer exists ("the placeholder below fails LOUD… until bumped"); keeping it would be a confident lie about the file's state. Nothing in the repo greps for that marker (verified).Not done in this PR
Ticket step 4 — dispatching
ci-groom.ymlwithdry_run=trueafter merge to confirm the run gets past startup — is not done and cannot be done from this PR, because the workflow that runs is the one on the default branch, so the check is only meaningful post-merge. Suggested one-liner for whoever merges:A
workflow_dispatchbypasses the interval gate, anddry_run: truealso bypasses the volume gate (volume_gate: ${{ github.event.inputs.dry_run != 'true' }}), so it exercises the full audit without filing issues. Otherwise the next daily 09:17 UTC tick will show it. This PR's own CI does not cover it:ci-groom.ymlisschedule/dispatch-only, so it never runs on a PR.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.