Skip to content

fix(ci): hold create-github-app-token at v1.x in the cross-repo caller bumpers (BE-5227) - #98

Merged
mattmillerai merged 1 commit into
mainfrom
mattmillerai/be-5227-fix-caller-bump-403
Jul 31, 2026
Merged

fix(ci): hold create-github-app-token at v1.x in the cross-repo caller bumpers (BE-5227)#98
mattmillerai merged 1 commit into
mainfrom
mattmillerai/be-5227-fix-caller-bump-403

Conversation

@mattmillerai

Copy link
Copy Markdown
Contributor

ELI-5

A robot's job is to go around to all our other repos and update a version number after we change the shared workflow. Last night an automatic dependency update gave that robot a newer keycard. The newer keycard doesn't open other repos' doors — only its own. So for the last three merges the robot has been quietly failing at every door, and every repo is still on an old version number. This puts the old keycard back for that one robot.

The break

bump-*-callers.yml mints a cross-repo App token (owner: Comfy-Org, no repositories:) and commits the rewritten caller file via the Git Data API. Since the 2026-07-30 major group (#95) bumped actions/create-github-app-token v1.12.0 → v3.2.0, every run 403s:

gh: Resource not accessible by integration (HTTP 403)
⚠ <repo>: tree create failed — skipping
✗ bump failed for 4 repo(s)

Three consecutive failures — 3b5886b (23:02), 6ed928c (02:51), 8eebe24 (04:10) — plus a manual workflow_dispatch re-run to rule out a transient. No consumer has been bumped since, so every caller repo is stranded on a stale pin, silently: the dispatcher's failure is a red run in this repo that says nothing about the repos actually left behind.

Why the version bump is the cause

Same repo, same token config, across the boundary:

when action result
2026-07-30T23:03:17Z v1.12.0 cloud-code-bot[bot] committed Comfy-Org/cloud (#5893)
2026-07-31T04:10Z v3.2.0 403 on Comfy-Org/cloud, tree create

Nothing else on the bump path changed in that window — the diff between the last green run and the first red one touches only the two action pins in these workflows. Neither the v2.0.0 release notes (removed deprecated app_id/private_key/skip_token_revoke) nor v3.0.0's (proxy handling) document a scoping change, so this is pinned on observed behavior, not a changelog entry — which is also why the ignore comment says lifting it needs a proven cross-repo write rather than a green CI run.

Scope

Deliberately narrow — only the six cross-repo bumpers revert to v1.12.0:

bump-agents-md-callers · bump-assign-reviewers-callers · bump-auto-label-callers · bump-cursor-review-callers · bump-groom-callers · bump-pr-size-callers

The current-repo minters stay on v3.2.0 and are untouched: groom.yml, cursor-review.yml, pr-size.yml, assign-reviewers.yml, cursor-review-auto-label.yml. None set owner:, so their tokens are scoped to the running repo and never crossed the boundary that broke. That split is the whole reason this is 6 files and not 11.

A dependabot.yml ignore holds majors only — v1.x patches still arrive.

Verification

  1. All 6 cross-repo minters confirmed off bcd2ba4; all current-repo minters confirmed still on it.
  2. dependabot.yml parses; ignore now has 2 entries.
  3. Nothing exercises the cross-repo path in CI, so the real check is firing bump-groom-callers after merge and confirming the three outstanding callers (comfy-cloud-mcp-server, comfy-local-mcp, comfy-infra) get bump PRs. I'll do that and report back on this PR.

Comfy-Org/cloud was already bumped by hand (cloud#5938) to unblock GROOM_CONFIG, so it will show as already at rather than as a new PR.

…r bumpers (BE-5227)

The v1.12.0 -> v3.2.0 jump in the 2026-07-30 major group (#95) broke the
owner:-without-repositories: token used by every bump-*-callers.yml. Since
that merge each run 403s with "Resource not accessible by integration" on
tree create for every caller repo, so no consumer has been bumped in three
merges and every one is stranded on a stale pin.

Evidence across the version boundary, same repo and same token config:
cloud-code-bot[bot] committed Comfy-Org/cloud at 2026-07-30T23:03:17Z under
v1.12.0, and 403'd on that same repo under v3.2.0. Neither the v2.0.0 nor the
v3.0.0 release notes document a scoping change, so this is pinned on observed
behavior rather than on a changelog entry.

Scope is deliberately narrow: only the six cross-repo bumpers are reverted.
The current-repo minters (groom.yml, cursor-review.yml, pr-size.yml) do not
set owner:, are scoped to the running repo, and are unaffected - they stay on
v3.2.0. A dependabot ignore keeps majors from silently reintroducing this.
@coderabbitai

coderabbitai Bot commented Jul 31, 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: 22 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: 15cf104d-82ad-43b0-97ab-66cc49f51bf9

📥 Commits

Reviewing files that changed from the base of the PR and between 8eebe24 and 683ff25.

📒 Files selected for processing (7)
  • .github/dependabot.yml
  • .github/workflows/bump-agents-md-callers.yml
  • .github/workflows/bump-assign-reviewers-callers.yml
  • .github/workflows/bump-auto-label-callers.yml
  • .github/workflows/bump-cursor-review-callers.yml
  • .github/workflows/bump-groom-callers.yml
  • .github/workflows/bump-pr-size-callers.yml

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

@mattmillerai mattmillerai added the cursor-review Multi-model cursor review label Jul 31, 2026
@mattmillerai
mattmillerai merged commit 72afd23 into main Jul 31, 2026
17 checks passed
@mattmillerai
mattmillerai deleted the mattmillerai/be-5227-fix-caller-bump-403 branch July 31, 2026 04:23

@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 6 finding(s).

Severity Count
🟠 High 1
🟡 Medium 4
🟢 Low 1

Panel: 8/8 reviewers contributed findings.

Comment thread .github/dependabot.yml
# NOTE: only the six bump-*-callers.yml workflows are held back. The
# current-repo minters (groom.yml, cursor-review.yml, pr-size.yml, ...) do
# not set `owner:`, are scoped to the running repo, and stay on v3.x.
- dependency-name: "actions/create-github-app-token"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟠 High — A Dependabot ignore condition is scoped to the enclosing updates: entry (github-actions, directory /) and keys only on dependency name — it cannot say "these six files but not those", so the NOTE on lines 103-105 is wrong. groom.yml (x3), cursor-review.yml, cursor-review-auto-label.yml, pr-size.yml, and assign-reviewers.yml are all equally frozen out of every future major of actions/create-github-app-token, meaning a future major carrying a fix to the token minter is silently never proposed for them either. Raised by 4 of 8 reviewers (claude-opus-5-thinking-max adversarial, claude-opus-5-thinking-max edge-case, gpt-5.6-sol-max adversarial + edge-case, kimi-k2.7-code adversarial).

Comment thread .github/dependabot.yml
# current-repo minters (groom.yml, cursor-review.yml, pr-size.yml, ...) do
# not set `owner:`, are scoped to the running repo, and stay on v3.x.
- dependency-name: "actions/create-github-app-token"
update-types: ["version-update:semver-major"]

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Mediumactions/create-github-app-token now appears at two refs in one directory (v1.12.0 in the six bumpers, v3.2.0 in five other occurrences), but Dependabot's github-actions parser treats same-named occurrences as one dependency and tends to rewrite all of its requirements to a single ref. Because only majors are ignored, the next v1.x or v3.x minor/patch release can rewrite every occurrence uniformly — either dragging the bumpers past the v2 boundary this pin exists to avoid, or pulling the v3.x current-repo minters back to v1.x. Raised by 1 of 8 reviewers (claude-opus-5-thinking-max edge-case).

Comment thread .github/dependabot.yml
# config, on v3.2.0. Neither the v2.0.0 nor the v3.0.0 release notes document
# a scoping change, so this is pinned by evidence, not by changelog.
#
# Scoped to majors only: v1.x patches still arrive. Lifting this needs 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 — "v1.x patches still arrive" overstates the safety margin: ignore suppresses security updates as well as version updates (this file documents exactly that at lines 81-83 for the other entry), and upstream does not backport to the dead v1 branch. In practice no update of any kind — including a security fix to the action or to the bundled @​octokit/undici code in its dist/ — will be offered for the six workflows that mint the org-scoped bot token, with no PR and no signal, and nothing in the repo gives this hold an expiry. Raised by 2 of 8 reviewers (claude-opus-5-thinking-max adversarial, claude-opus-5-thinking-max edge-case).


- name: Generate Cloud Code Bot token
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1.12.0 — pinned: see dependabot.yml ignore (v2+ breaks cross-repo `owner:` token scoping)

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 — Reverting to v1.12.0 restores the widest token scope: with owner: set and repositories: empty, v1 mints an installation token valid for every repo the app is installed on in the org, carrying contents/pull-requests/issues write — which is the most likely reason v2+ 403s here. Least privilege is still reachable without hardcoding caller names: repositories: accepts an expression and can be fed from the same vars.AUTO_LABEL_CALLERS list the next step already consumes via CALLERS_JSON. Applies identically to all six bumper files. Raised by 2 of 8 reviewers (claude-opus-5-thinking-max adversarial, kimi-k2.7-code adversarial).

Comment thread .github/dependabot.yml
# has 403'd with "Resource not accessible by integration" on `tree create`
# for every caller repo, silently stranding every consumer on a stale pin.
# Verified against one repo across the boundary: cloud-code-bot[bot] wrote
# Comfy-Org/cloud at 23:03 on v1.12.0 and 403'd on the same repo, same token

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 commits a specific consumer repo name (Comfy-Org/cloud), the bot identity that holds write access to it, and the timestamp of a write into a public file. AGENTS.md requires caller names to live only in the vars.*_CALLERS variables and never appear in workflow files, logs, or commit text; the same evidence reads fine with the repo anonymized ("one caller repo"). Raised by 2 of 8 reviewers (claude-opus-5-thinking-max adversarial, gpt-5.6-sol-max adversarial).


- name: Generate Cloud Code Bot token
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1.12.0 — pinned: see dependabot.yml ignore (v2+ breaks cross-repo `owner:` token scoping)

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 "do not upgrade" rationale lives in the trailing version comment, which is exactly the text Dependabot rewrites wholesale on a bump and pinact normalizes — the first permitted v1.x patch deletes the warning while the ignore silently stays in place. The free-form suffix also departs from the # vX.Y.Z form those tools parse. Put the guardrail somewhere automation will not erase. Raised by 2 of 8 reviewers (claude-opus-5-thinking-max adversarial, claude-opus-5-thinking-max edge-case).

@mattmillerai

Copy link
Copy Markdown
Contributor Author

Verified after merge — the cross-repo path works again.

Fired bump-groom-callers on main (run 30657157981): completed/success, groom bump complete for all callers. The token step is confirmed running create-github-app-token@d72941d (v1.12.0) and no tree create 403 appeared for any caller.

All four external callers now have an open bump PR to bcde90f, which closes out the three that had been stranded across the last three merges:

  1. Comfy-Org/cloud — #6000
  2. Comfy-Org/comfy-cloud-mcp-server — #1031
  3. Comfy-Org/comfy-local-mcp — #162
  4. Comfy-Org/comfy-infra — #529 (updated in place)

github-workflows' own ci-groom.yml reported already at bcde90f — skipping, as expected.

That is the cross-repo write this PR's dependabot-ignore comment asks for as the bar for ever lifting the pin — recording it here so the next person has the evidence rather than a green unit-test run.

One residual worth its own issue: the dispatcher's failure mode gave no signal about which consumers were left behind. Three merges passed with every caller stranded on a stale pin, and the only symptom was a red run in this repo. Reporting stranded callers by name — or failing loudly once a caller drifts more than one merge behind — would have surfaced this the same day.

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

Labels

cursor-review Multi-model cursor review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants