mirror of
https://github.com/Comfy-Org/github-workflows.git
synced 2026-11-05 00:17:37 +00:00
[PR #135] [MERGED] ci(bump-callers): move every caller roster from an Actions variable to a secret (BE-6472) #143
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#143
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/135
Author: @mattmillerai
Created: 8/5/2026
Status: ✅ Merged
Merged: 8/12/2026
Merged by: @mattmillerai
Base:
main← Head:matt/be-6472-callers-rosters-to-secrets📝 Commits (4)
f9dad3cci(bump-callers): move every caller roster from an Actions variable to a secret (BE-6472)113758aci(bump-callers): harden the roster fingerprint and fix stale roster docs (BE-6472)463933cMerge main into matt/be-6472-callers-rosters-to-secretsd983d47Merge main into matt/be-6472-callers-rosters-to-secrets📊 Changes
27 files changed (+579 additions, -256 deletions)
View changed files
📝
.github/bump-callers/README.md(+98 -36)📝
.github/bump-callers/bump-callers.sh(+79 -12)📝
.github/bump-callers/tests/test_bump_callers.sh(+74 -4)📝
.github/workflows/bump-agents-md-callers.yml(+28 -14)📝
.github/workflows/bump-assign-reviewers-callers.yml(+28 -15)📝
.github/workflows/bump-auto-label-callers.yml(+40 -25)📝
.github/workflows/bump-cursor-review-callers.yml(+26 -11)📝
.github/workflows/bump-detect-unreviewed-merge-callers.yml(+47 -41)📝
.github/workflows/bump-groom-callers.yml(+26 -12)📝
.github/workflows/bump-pr-risk-callers.yml(+33 -25)📝
.github/workflows/bump-pr-size-callers.yml(+28 -14)📝
.github/workflows/ci-assign-reviewers.yml(+1 -1)📝
.github/workflows/ci-groom.yml(+1 -1)📝
.github/workflows/test-bump-callers.yml(+19 -16)📝
AGENTS.md(+10 -5)📝
CONTRIBUTING.md(+6 -2)📝
README.md(+5 -3)📝
docs/callers/README.md(+13 -7)📝
docs/callers/agents-md-integrity.md(+1 -1)📝
docs/callers/assign-prs-to-author.md(+1 -1)...and 7 more files
📄 Description
ELI-5
The workflows that keep other repos' pins fresh need a list of which repos to bump. That list was stored as an Actions variable, and it was handed to the script through the step's
env:block — but GitHub prints a step's env block before the step runs, so the script's own name-masking could never run early enough. On a public repo like this one, that meant the whole roster was printed in the clear in a world-readable log on every run. This moves each roster to an Actions secret with the same name. The runner masks a secret everywhere, including that env dump, so the names stop being published. Nothing else about how the fleets work changes.What changed
bump-*-callers.ymlentrypoints:CALLERS_JSON: ${{ vars.X }}→${{ secrets.X }}.VAR_NAMEkeeps its historical key name (it exists only to name the roster in an error message) with a comment saying it now names a secret.callers.jsonin the private ops repo is the sole source of truth). The KNOWN GAP paragraphs are deleted; the gap is closed.gh variable set NAME --body "$(jq -c . callers.json)"→jq -c . callers.json | gh secret set NAME --repo Comfy-Org/github-workflows.bump-callers.sh: error wording says secret; after the parse/mask loop it logsroster: <N> caller(s), sha256 <digest>so ops can audit which roster ran without read-back. The per-repo::add-mask::is unchanged and still load-bearing — Actions masks the roster as one exact string, not each name inside it.tests/test_bump_callers.sh: a static guard iterating../../workflows/bump-*-callers.ymlasserting (a) noCALLERS_JSON: ${{ vars.binding and (b) everyCALLERS_JSON:binding is${{ secrets.<NAME> }}— plus assertions that the new fingerprint line has the right shape and carries no caller name.test-bump-callers.yml: path filter switched from eight enumerated entrypoints to thebump-*-callers.ymlglob, so a fleet added later is covered by the guard on day one instead of silently exempt.bump-callers/README.md(fleet table column + a "Why a secret and not a variable" section),AGENTS.md, and the caller-facing enrollment docs (README.md,CONTRIBUTING.md,docs/callers/*).Pre-flight already done
All six live rosters were mirrored into same-named secrets before this PR was opened, straight from the variables' API values in one command each, and verified present in
gh secret list. Unused secrets are inert, so there is no window in which a fleet has no roster. The reverse order would have broken every fleet between merge and seeding.Verification
bash .github/bump-callers/tests/test_bump_callers.sh— 210 passed, 0 failed.shellcheck -x .github/bump-callers/bump-callers.sh .github/bump-callers/tests/test_bump_callers.sh— clean..github/workflows/*.ymlparse;python3 .github/agents-md-integrity/check_agents_md.py --root .passes (two pre-existing warnings, unchanged).vars.binding in one entrypoint makes both of its sub-checks fail, and reverting restores green. A guard that cannot fail is not a guard.actions/create-github-app-tokenexposes 48permission-*inputs at the SHA pinned here (54 on its default branch) and the stringvariabappears nowhere in itsaction.ymlat either —permission-secretsexists,permission-variablesdoes not.Judgment calls (please sanity-check these)
bump-pr-risk-callers.ymlandbump-detect-unreviewed-merge-callers.ymlsince the ticket was written. Both rosters are unseeded, so${{ vars.X }}and${{ secrets.X }}both evaluate to empty and the flip is behaviourally inert for them today. I moved them anyway because the ticket's own guard test iterates the whole glob — leaving two behind would either fail the guard or force it into an allowlist that goes stale. Seeding the detect-unreviewed-merge roster remains out of scope; its header and the README now say the masking blocker is gone and seeding is the tracked follow-on.sha256sum <<<"$CALLERS_JSON". That is not reproducible in practice:gh secret setstores whatever bytes it is fed, andprintf '%s' "$v" | gh secret setand ajq -c … |pipe differ by a trailing newline, so the same roster could fingerprint two ways and an operator comparing them would see a phantom mismatch. It now hashesjq -cS . <<<"$CALLERS_JSON", which is reproducible with exactlyjq -cS . callers.json | sha256sum(documented in the README). Array order is deliberately preserved — that is semantic.Comfy-Org/prefix would register very common substrings, and::add-mask::replaces them everywhere — it would garble unrelated log lines and error messages for no gain, since the script only ever echoes the fullowner/nameform, which is already masked.README.md,CONTRIBUTING.mdanddocs/callers/*still told caller-repo owners to editvars.*_CALLERS, anddocs/callers/README.mdhanded out agh api …/actions/variables/GROOM_CALLERS --jq .valueread-back that stops working the moment the variables are deleted. Those are now instructions to ask a maintainer to set the roster secret. Left as-is: one stale claim indocs/callers/README.mdthatci-groom.ymlis absent fromGROOM_CALLERS(it is enrolled) — pre-existing and unrelated to this change.Merge-time runbook (ticket step 3 — cannot be done pre-merge)
gh workflow run bump-groom-callers.yml --repo Comfy-Org/github-workflows. Groom is the safe fleet to probe with (ALLOW_EMPTY: true, all pins current → clean no-op).CALLERS_JSON: ***and no unmaskedComfy-Org/caller name appears anywhere. The run should also print oneroster: <N> caller(s), sha256 …line — check<N>and the digest againstjq -cS . callers.json | sha256sumon the canonical file.gh variable delete <NAME> --repo Comfy-Org/github-workflowsfor each ofCURSOR_REVIEW_CALLERS,AUTO_LABEL_CALLERS,AGENTS_MD_CALLERS,PR_SIZE_CALLERS,ASSIGN_REVIEWERS_CALLERS,GROOM_CALLERS) so no stale unmasked copy remains readable. Note that merging this PR does not itself trip any bump fleet's path filter, so step 1 is the only thing that exercises the change.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.