Skip to content

ci(bump-callers): add bump-assign-reviewers-callers.yml dispatch flow (BE-3924) - #54

Merged
mattmillerai merged 1 commit into
mainfrom
matt/be-3924-bump-assign-reviewers-callers
Jul 21, 2026
Merged

ci(bump-callers): add bump-assign-reviewers-callers.yml dispatch flow (BE-3924)#54
mattmillerai merged 1 commit into
mainfrom
matt/be-3924-bump-assign-reviewers-callers

Conversation

@mattmillerai

Copy link
Copy Markdown
Contributor

ELI-5

Three of our reusable workflows (pr-size, cursor-review, agents-md) have a little robot that, whenever the workflow changes, goes around to every repo that "pins" it and opens a PR to update the pin. assign-reviewers was the odd one out — it had pinned users but no robot, so those repos silently fell behind. This adds the missing robot for assign-reviewers.

What & why

assign-reviewers.yml is a reusable workflow that downstream repos SHA-pin (today only Comfy-Org/cloud). Unlike pr-size / cursor-review / agents-md, it had no bump-*-callers dispatch flow, so when it changed on main, pinned callers drifted onto stale behavior and had to be re-pinned by hand.

This adds .github/workflows/bump-assign-reviewers-callers.yml, a thin entrypoint over the shared .github/bump-callers/bump-callers.sh (the same one-implementation script every other fleet uses — no forked logic). It mirrors the ALLOW_EMPTY siblings (bump-pr-size / bump-agents-md):

  • Triggers: push to main touching .github/workflows/assign-reviewers.yml, plus workflow_dispatch for manual re-bumps.
  • Caller list: the new repo-level Actions variable ASSIGN_REVIEWERS_CALLERS — a JSON array of {repo,file,label}, same shape as CURSOR_REVIEW_CALLERS / PR_SIZE_CALLERS. ALLOW_EMPTY: "true" makes an empty or unset variable a clean no-op (run stays green, dispatches to nobody).
  • Behavior: mints the Cloud Code Bot token, then opens/refreshes one sticky bump PR per caller re-pinning that repo's assign-reviewers.yml uses: SHA to the new main tip; pushes to the stable ci/bump-assign-reviewers branch; serialized via concurrency: bump-assign-reviewers-callers.

Judgment call: paths trigger is the workflow file only

The siblings also watch an asset dir (cursor-review/**, scripts/check-pr-size/**, agents-md-integrity/**). assign-reviewers.yml runs its entire selection logic inline via actions/github-script with no external prompt/script directory (confirmed: git ls-tree shows no assign-reviewers/ asset dir; the only scripts are inline script: blocks). So the workflow file itself is the only path whose change can alter behavior — documented in a comment on the trigger.

Out of scope (per ticket)

  • Seeding ASSIGN_REVIEWERS_CALLERS — a manual admin op (Actions variables aren't committed), done after this lands. Initial seed is cloud-only. Until then the flow is a documented clean no-op.
  • Rolling assign-reviewers out to more repos (per-repo caller work, tracked separately).

Tests

  • Registered the new entrypoint in the test-bump-callers.yml path filters (both pull_request and push) so a change to it runs the shared-script suite — analogous to the coverage the sibling bumpers already have.
  • Ran locally in the worktree: shellcheck clean; bash .github/bump-callers/tests/test_bump_callers.sh88 passed, 0 failed; both edited/new workflows parse as valid YAML; AGENTS.md integrity checker passes (123 lines, under the 200 gate).
  • Also updated the bump-callers README fleet table and the AGENTS.md catalog to keep docs in sync.

BE-3924

… (BE-3924)

assign-reviewers.yml was the one reusable with SHA-pinned callers but no
auto-bump flow (pr-size, cursor-review, agents-md all have one), so pinned
callers silently drift onto stale behavior when it changes on main.

Add a thin entrypoint over the shared bump-callers.sh, mirroring the
ALLOW_EMPTY siblings (bump-pr-size/agents-md): reads a new repo-level
ASSIGN_REVIEWERS_CALLERS variable (empty/unset is a clean no-op), triggers on
push to assign-reviewers.yml + workflow_dispatch, serializes via a concurrency
group, and opens/refreshes one sticky bump PR per caller. Paths trigger is the
workflow file alone since assign-reviewers.yml runs entirely inline via
actions/github-script (no external asset dir). Register it in the bump-callers
README table, AGENTS.md catalog, and the test-bump-callers.yml path filters.
@mattmillerai mattmillerai added agent-coded Authored by the agent-work loop cursor-review Multi-model cursor review labels Jul 21, 2026
@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 25 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 5d7311ae-a5b5-4db6-8969-bf6829e588a2

📥 Commits

Reviewing files that changed from the base of the PR and between 80941f6 and 2be88b2.

📒 Files selected for processing (4)
  • .github/bump-callers/README.md
  • .github/workflows/bump-assign-reviewers-callers.yml
  • .github/workflows/test-bump-callers.yml
  • AGENTS.md
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch matt/be-3924-bump-assign-reviewers-callers
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch matt/be-3924-bump-assign-reviewers-callers

Comment @coderabbitai help to get the list of available commands.

@mattmillerai
mattmillerai marked this pull request as ready for review July 21, 2026 20:23
@mattmillerai
mattmillerai merged commit 9a7e853 into main Jul 21, 2026
24 checks passed
@mattmillerai
mattmillerai deleted the matt/be-3924-bump-assign-reviewers-callers branch July 21, 2026 20:32

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Cursor Review — Consolidated panel

Triggered by @mattmillerai.

Found 8 finding(s).

Severity Count
🟠 High 3
🟡 Medium 3
🟢 Low 2

Panel: 8/8 reviewers contributed findings.

runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 Highactions/checkout is pinned to the mutable @​v6 tag instead of a full commit SHA, violating this repo's SHA-pin-everything policy (AGENTS.md) and inconsistent with the SHA-pinned create-github-app-token on line 72 of the same job. If that tag were retargeted it would run attacker-controlled checkout code in the very job that mints an org-scoped Cloud Code Bot token, and the bare tag also fails the pinact/zizmor pin-validation. Raised by 5 of 8 reviewers (claude-opus-4-8-thinking-max adversarial, gemini-3.1-pro adversarial, gpt-5.6-sol-max adversarial, kimi-k2.7-code adversarial, gemini-3.1-pro edge-case).

# specific home repo is intentionally not named here — this file is public.)

on:
workflow_dispatch: {} # allow on-demand runs (e.g. to re-bump callers)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 Highworkflow_dispatch here accepts any branch or tag ref, and the dispatched ref supplies both this workflow definition and the checked-out bump-callers.sh. A collaborator can dispatch a branch with a modified bumper and have it run with the org-scoped Cloud Code Bot token, bypassing main-branch review; add a job guard that fails unless github.ref == 'refs/heads/main'. Raised by 1 of 8 reviewers (gpt-5.6-sol-max adversarial).

# JSON array of {"repo","file","label"} — see the header comment for the
# update flow. Kept in a variable (not the file) so private caller names
# never land in this public repo or its logs.
CALLERS_JSON: ${{ vars.ASSIGN_REVIEWERS_CALLERS }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 HighCALLERS_JSON is populated from a non-secret Actions variable and set as step-level env, so the runner prints its value in the step's env: preamble before bump-callers.sh can ::add-mask:: the names, leaking the entire private caller list into this public repo's logs once the variable is populated. Register the masks in an earlier step, or feed the list via a file/stdin instead of a logged env var. Raised by 1 of 8 reviewers (gpt-5.6-sol-max adversarial).

- name: Bump SHA in caller repos
env:
GH_TOKEN: ${{ steps.token.outputs.token }}
NEW_SHA: ${{ github.sha }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 MediumNEW_SHA uses github.sha unconditionally, but that is not guaranteed to be the current main tip: a workflow_dispatch on a branch, a re-run of an old push (which keeps its original SHA), or an out-of-order concurrency run can each supply a stale/unmerged commit and pin callers to code that isn't on main — contradicting the 'latest SHA always wins' claim in the concurrency comment. Resolve the current main tip at run time (e.g. git rev-parse origin/main) instead of trusting github.sha. Raised by 3 of 8 reviewers (gpt-5.6-sol-max edge-case, kimi-k2.7-code edge-case, gpt-5.6-sol-max adversarial).

# CURSOR_REVIEW_CALLERS. Every repo name is `::add-mask::`ed out of the (public)
# run logs before it is ever echoed. The variable is seeded EMPTY (`[]`) — an
# empty list is a clean no-op here (ALLOW_EMPTY below); the rollout's per-repo
# caller tickets add entries as callers land (today only Comfy-Org/cloud pins a

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium — This comment hard-codes the caller repo name Comfy-Org/cloud, permanently disclosing a private consumer in this public repo's source history — the exact leak the surrounding design (variable-stored, ::add-mask::ed caller list) exists to prevent. Drop the repo name from the comment. Raised by 1 of 8 reviewers (gpt-5.6-sol-max adversarial).

with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.CLOUD_CODE_BOT_PRIVATE_KEY }}
owner: Comfy-Org

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium — The token is requested with only owner: Comfy-Org and no repositories: scope, so it grants every repository and permission in the App's org installation rather than just the caller repos the bumper touches. Scope it to the specific caller repositories to limit blast radius if the bumper or its token is misdirected or compromised. Raised by 1 of 8 reviewers (gpt-5.6-sol-max adversarial).

TAG: assign-reviewers
WORKFLOW_FILE: assign-reviewers.yml
# Seeded empty; an empty list is a clean no-op, not an error.
ALLOW_EMPTY: "true"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 LowALLOW_EMPTY: "true" is correct for the seeded-empty phase, but once callers are added it turns an accidentally-cleared or missing ASSIGN_REVIEWERS_CALLERS variable into a silent no-op, so SHA bumps would quietly stop with no failure signal. Consider requiring non-empty once the fleet has live callers, or at least warning when the list is empty. Raised by 1 of 8 reviewers (gpt-5.6-sol-max adversarial).

# runs inline via actions/github-script, with no external prompt/script
# asset dir (unlike cursor-review/** or scripts/check-pr-size/**). So the
# workflow file itself is the only path that can change its behavior.
- .github/workflows/assign-reviewers.yml

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Low — The push path filter also fires when assign-reviewers.yml is deleted or renamed; the bumper would then open PRs pinning callers to a commit where the referenced reusable workflow no longer exists, breaking those callers. Raised by 1 of 8 reviewers (gpt-5.6-sol-max edge-case).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent-coded Authored by the agent-work loop cursor-review Multi-model cursor review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant