mirror of
https://github.com/Comfy-Org/github-workflows.git
synced 2026-11-05 00:17:37 +00:00
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#370
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/369
Author: @mattmillerai
Created: 10/7/2026
Status: ✅ Merged
Merged: 10/7/2026
Merged by: @mattmillerai
Base:
main← Head:matt/be-19527-fix-remedy📝 Commits (2)
136d4c7fix(cursor-approve): the remedy #366 advised does not exist — move the head instead (BE-19527)b43672bfix(cursor-approve): route the remaining unchanged-head paths to push_then_relabel (BE-19527)📊 Changes
9 files changed (+203 additions, -93 deletions)
View changed files
📝
.github/cursor-approve/card.py(+41 -18)📝
.github/cursor-approve/tests/test_card.py(+17 -2)📝
.github/cursor-review/auto-approve.py(+64 -29)📝
.github/cursor-review/post-review.py(+4 -1)📝
.github/cursor-review/tests/test_approve_external.py(+16 -6)📝
.github/cursor-review/tests/test_auto_approve.py(+32 -20)📝
.github/cursor-review/tests/test_post_review.py(+2 -2)📝
.github/workflows/cursor-approve.yml(+1 -1)📝
docs/callers/cursor-approve.md(+26 -14)📄 Description
Follow-up to #366, which merged with its review findings unaddressed. Its diagnosis was right; its remedy was not.
The bug #366 got right
On a round whose head never moved, "remove and re-add the label" is a no-op — the gate's
dupstep skips any head already carrying a bot-posted consolidated review, and a degraded round posts one too.The bug #366 introduced
It pointed at the dup step's
state != "DISMISSED"clause and told people to dismiss that review. They can't.post-review.pysubmits it with"event": "COMMENT"(4 call sites), and GitHub dismisses onlyAPPROVED/CHANGES_REQUESTED— 422 otherwise, no Dismiss control in the UI. That clause is unreachable for the one review it's matched against. One impossible remedy swapped for another.What actually clears the dedupe is moving the head. So:
push_then_relabel, "push a commit — an empty one is enough — then re-run the round." The relabel stays in the text because a label-gated caller no-ops onsynchronize.Reachable everywhere now, not from one site
no_decision_nextwas the only path that selected the new value. These still hardcodedrelabelon an unchanged head:card_for_none's card.py-unloadable fallbackcard.py's ownDECIDE_*maps, for an axes error and for an unknown outcomeretargetedoutcome (before the POST and in the post-POST race) instead ofsuperseded, which still means a head move and keepsrelabelpost-review.py's error review, which told people to relabel the head it sits onAll now share
next_for_unchanged_head(), and an unknown outcome falls back to the advice that works whether or not the head moved. The opposite case is handled too: when the deferred-approval path's re-check saw the head move, it advises a plain relabel, not an empty commit.Two more corrections
The relabel gate was over-narrow. It keyed on
auto_retry_eligible, which also requires every reason to be retryable — so a round where the head moved and the judge flaked got sent down the push path, although the live head carried no review and a plain relabel would have started a round. Now keyed onREASON_HEAD_MOVED.#366's body trim is reverted (now with the same threshold guard
render_standing_bodyhas). Dropping the scope note and threshold was my cosmetic preference and it cost real information: underdeltascope_trusted_decisioncan APPROVE with findings above the threshold, and the scope note was the only durable on-PR record that it waived them; and the axes path renders no threshold on its card, so for those blocks the line moved to neither artifact.Contract
cursor-approve-nextis now documented as an open set — treat an unrecognised value ashuman, so the next addition isn't a break either.push_then_relabelreplacesdismiss_then_relabel, which was on main for minutes and which no consumer has pinned (the bump PRs from #366 are unmerged).Provenance
Every finding here came from #366's own panel review. I verified the High against
post-review.pybefore acting on it. This PR's own panel review (8 findings) is addressed inb43672b. 7 were fixed. One was refuted with live evidence: older consolidated COMMENT reviews keep their owncommit_idacross pushes, so moving the head does clear the dedupe.Verified:
python3 -m unittest discover -s .github/cursor-review/tests -p 'test_*.py': 1147 passpython3 -m unittest discover -s .github/cursor-approve/tests -p 'test_*.py': 162 passcheck_workflow_pins.py(plus its unit tests),check_agents_md.pyandcheck-org-repo-literals.sh: passDeviations:
retargetedvalue to approve-external's internal step outputoutcome. It is not aworkflow_calloutput; the card and the docs map it.🤖 Generated with Claude Code
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.