mirror of
https://github.com/Comfy-Org/github-workflows.git
synced 2026-11-05 00:17:37 +00:00
[PR #153] [MERGED] ci(bump-callers): multi-asset WATCHED_ASSETS; watch scripts/check-pr-size in the cursor-review fleet (BE-7045) #162
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#162
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/153
Author: @mattmillerai
Created: 8/11/2026
Status: ✅ Merged
Merged: 8/12/2026
Merged by: @mattmillerai
Base:
matt/be-6476-preflight-swap← Head:matt/be-7045-multi-asset-watched📝 Commits (3)
d991d98ci(bump-callers): multi-asset WATCHED_ASSETS; watch check-pr-size in the cursor-review fleet (BE-7045)ecda0a6ci(bump-callers): make the paths contract read WATCHED_ASSETS exactly as preflight does (BE-7045)57ab1e4ci(bump-callers): exclude check-pr-size *_test.go from the pr-size and cursor-review fleets (BE-7084) (#154)📊 Changes
7 files changed (+1984 additions, -95 deletions)
View changed files
📝
.github/bump-callers/README.md(+190 -27)📝
.github/bump-callers/preflight.sh(+577 -52)📝
.github/bump-callers/tests/test_paths_contract.sh(+456 -13)📝
.github/bump-callers/tests/test_preflight.sh(+690 -1)📝
.github/workflows/bump-cursor-review-callers.yml(+42 -1)📝
.github/workflows/bump-pr-size-callers.yml(+25 -0)📝
AGENTS.md(+4 -1)📄 Description
ELI-5
cursor-reviewdoesn't ship the "is this file generated?" classifier inside itself — it builds it at run time from whatever commit of this repo a consumer repo has pinned. So when we change that classifier, every pinned consumer keeps using the old one until something bumps their pin. Nothing did: the bump job for cursor-review wasn't watching the classifier's folder at all.Just adding the folder to the watch list would have quietly broken a different safety check, so this PR does both halves at once: it widens the watch list and teaches the preflight guard to compare more than one folder.
Why
cursor-review.yml:458-489checks out and buildsscripts/check-pr-sizefrom the caller's pinnedworkflows_ref— that classifier decides which of a PR's files count as generated and therefore skip review. Butbump-cursor-review-callers.yml'spush:paths:filter only watchedcursor-review.yml+.github/cursor-review/**. A classifier-only commit fired the pr-size fleet and left every pinned cursor-review caller on the stale classifier.Widening the filter alone would be unsound.
preflight.sh's re-point (pin callers to the verified main tip instead of this run'sgithub.sha) is only valid when the compared surface covers every entry in the fleet's trigger — the COUPLED TO THE PATH FILTER note.WATCHED_ASSETSheld a single path, so the re-point would have pinned callers to a tip whosecheck-pr-sizecontent was never compared. Hence both halves in the same commit.What changed
preflight.sh—WATCHED_ASSETSis now a newline-separated list. Each entry is validated (glob / trailing-slash rejection, same error text), OID-compared against the tip, and decommission-checked independently, with per-entry semantics identical to the old single-asset behavior: any one entry absent at HEAD → decommission; absent at the tip →tip_gonedecommission; differing from HEAD → stale run/re-run. Only if every entry matches does the re-point proceed. A single-line value parses to a one-element list, so every existing single-asset fleet is unchanged.bump-cursor-review-callers.yml— addsscripts/check-pr-size/**topaths:(with a comment mirroring the existing.github/cursor-review/**one) and passes both assets as a block scalar.test_paths_contract.sh—parse_preflight_envlearns the block-scalar shape;actualsplits a multi-line value into one entry per line.test_preflight.sh— a second fixture asset dir plus multi-asset cases..github/bump-callers/README.md— theWATCHED_ASSETSrow + multi-path section document the list form and name cursor-review as the two-asset fleet.Verification
test_preflight.shtest_paths_contract.shtest_bump_callers.shshellcheck -x(all 5 scripts)Red/green ordering property observed (acceptance criterion): with step 2 applied but steps 1/3 not,
test_paths_contract.shfailed exactly as required —(note the stray
|— the old single-line parser read the block indicator as the value.) After steps 1+3 it passes.The new cases prove the second entry is really checked — the failure mode a loop over entry 0 alone would ship. Each "only entry N changed" case is paired with an assertion that the other-entry-only config would wrongly re-point, so the verdict is demonstrably produced by the entry under test: either-entry-changed, either-entry deleted at the tip, either absent at HEAD, both-unchanged re-point, blank/padded lines, and a glob or trailing slash on the second line.
bash 3.2 compatibility verified.
"${arr[@]}"on an empty array underset -uis an unbound-variable error on macOS's bash 3.2 (the trappreflight.sh's own comments warn about), so both new loops are guarded with(( ${#asset_dirs[@]} > 0 )). Confirmed empirically that the unguarded form errors and the guarded form does not, and that the parse loop yields the right two entries under 3.2.Judgment calls
agent-blockedif #151 hadn't merged. #151 is open — but its branch carries the foundation code (test_paths_contract.shand theWATCHED_ASSETSpreflight step are both present on it), which is the standing always-stack case. Building on the real foundation is strictly better than waiting, and GitHub retargets this PR when #151 merges. Flagging it explicitly since it departs from the ticket's literal instruction..github/groomresolves to nothing exactly like the.github/groom/**globvalidate_pathalready rejects, i.e. it would silently verify nothing behind a green run. That is a hazard introduced by the new input shape, so each entry is trimmed and the reasoning is in a comment. No existing fleet's value is affected (all 107 pre-existing cases pass unchanged).scripts/check-pr-sizeis now watched by two fleets, verified conflict-free. Rather than take this on faith I checked it:bump-callers.sh:65derivesBRANCH="ci/bump-${TAG}", so the fleets pushci/bump-cursor-reviewvsci/bump-pr-size, with distinct concurrency groups (bump-cursor-review-callers/bump-pr-size-callers) and distinct rosters (CURSOR_REVIEW_CALLERS/PR_SIZE_CALLERS).bump-pr-size-callers.ymlis untouched, per the ticket.bump-pr-risk-callers.ymlkeeps its exemption — its!exclusions are out of scope and it is not migrated here.Out of scope, but noticed
AGENTS.mdis 208 lines, over the checker's 200-line hard ceiling (207onmain,208on #151's branch — pre-existing on both, untouched by this PR). It doesn't gate CI because this repo has no self-enrolledci-agents-md-integrity.ymlcaller, onlytest-agents-md-integrity.ymlfor the checker's unit tests. Worth a separate trim ticket.Acceptance criteria
All met — both suites pass locally (they are hermetic; CI runs them via
test-bump-callers.yml, whosepaths:filter already coversbump-cursor-review-callers.yml, so the contract test will run on this PR), the red/green ordering property was observed, pr-risk keeps its exemption, andbump-pr-size-callers.ymlwas not touched.Negative-claim falsification: n/a — this change denies no capability. It widens what
WATCHED_ASSETSsupports. The only rejection paths (glob / trailing-slash) are per-entry extensions of a rejection that already existed, and the premise that those shapes resolve to nothing is empirically covered by both the pre-existingglob_inputcase and the newmulti_globcase rather than asserted.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.