mirror of
https://github.com/Comfy-Org/github-workflows.git
synced 2026-11-05 00:17:37 +00:00
[PR #389] [MERGED] fix(cursor-approve): keep a red panel cell from skipping the axes #388
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#388
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/389
Author: @mattmillerai
Created: 10/9/2026
Status: ✅ Merged
Merged: 10/9/2026
Merged by: @mattmillerai
Base:
main← Head:matt/cursor-approve-axes-skip-on-red-panel📝 Commits (2)
5e12caefix(cursor-approve): keep a red panel cell from skipping the axesb3db43efix(cursor-approve): pin the caller guards as exact conjuncts, and say what!cancelled()gives up📊 Changes
5 files changed (+347 additions, -18 deletions)
View changed files
➕
.github/cursor-approve/tests/test_caller_doc_pattern.py(+227 -0)📝
.github/workflows/cursor-review.yml(+23 -4)📝
.github/workflows/test-cursor-review-scripts.yml(+19 -4)📝
docs/callers/cursor-approve.md(+74 -9)📝
docs/callers/cursor-review.md(+4 -1)📄 Description
What this fixes
cursor-review's called job goes red whenever a panel cell errors — the leg fails by design ("Fail the leg when the cell did not submit") and
Panel integrityfails alongside it.approve_max_failed_reviewersdoes not change that: it governs theapprove_gateverdict, not the job's conclusion.The caller pattern this repo publishes chained
approve-startand every axis off that job with a bareneeds:. So GitHub's default rule skipped them on the red job, the axes never ran, andcursor-approve's decide — which runs onalways()— rendered every axis as⚠️ no resultand withheld the approval.A caller that sets
approve_max_failed_reviewers: 1precisely to tolerate one dead cell therefore never got the tolerance it configured. One errored cell out of six withheld every round, and nothing on the card said why.Observed
A consumer repo's PR (a private caller, so not linked here):
The cell died on Cursor-side capacity after three reconnects. It had already written two medium findings to
findings.json, but never reached the MCP submit tool, so status stayederrorand the leg went red.approve_gatewaspassthe whole time — decide's ownif:requires it, and decide ran — so the gate had already tolerated the cell exactly as the caller asked. Only theneeds:propagation one job earlier threw that away.Across the 81 preceding completed panel runs on that consumer,
approve-starthad never once run.The change
docs/callers/cursor-approve.md—!cancelled()on the start phase and all five axes.!cancelled()rather thanalways()so a superseded run never goes on to decide.needs.approve-start.result == 'success', which!cancelled()would otherwise drop. The documented invariant is unchanged: a start phase that failed to withdraw cursor-review's standing approval still skips them, and decide reads that as "no result".### A red panel cell must not skip the axessection explains why the guard is load-bearing rather than stylistic.docs/callers/cursor-review.md'snext:approve_gate example gets the same!cancelled()guard..github/cursor-approve/tests/test_caller_doc_pattern.pypins the guards as exact top-level conjuncts, including the exactapprove_gate == 'pass'/'capped'comparison. A top-level||, a!= 'pass', a bare truthy gate, and a stale second copy of a job all fail. It covers every occurrence of each job across all yaml blocks, and cursor-review.md'snext:example too.test-cursor-review-scripts.yml's path filter, so a docs-only revert runs the test.Panel integritydescribed itself as "advisory — red here fails no other job", which is true of check-runs and of this workflow but not of a caller'sneeds:; andapprove_max_failed_reviewerspromised a round "decided normally" without saying what the caller must do for that to hold (now including that!cancelled()drops the implicit success requirement on otherneeds:, which must be restated). Step 1 of cursor-approve.md's "What it does" no longer says a failed run skips the start phase.What this does and does not change about approval
approve_gateremains the only authority on whether a round may be decided, and it already fails closed tountrustedon a degraded judge, more errored cells than the caller tolerates, an undelivered review, a moved head, or any upstream decision job that did not succeed. That covers everyPanel integrityfailure that is not simply a short panel. Reading the gate off a red cursor-review job cannot approve a round the gate itself rejected.It does give up one incidental backstop, and the doc now says so. The gate trusts each cell's self-reported
status. Artifact names are run-global, so a prompt-injected cell could upload a forged clean record under another cell's name: that cell's leg goes red while consolidate reads the forgery. A bareneeds:used to skip the axes on that red leg. Now the axes still review the change independently, and decide still withholds on any red axis. Closing the gap at the source (consolidate cross-checking each leg's conclusion) is a runtime change to cursor-review, so it is deferred to a follow-up.Dropping
Panel integrityinstead would not have helped: a red matrix leg fails the caller's job on its own.Scope
No runtime behaviour in this repo changes — the workflow edits are comments. The fix each caller needs is the
if:guards.Follow-up, not in this PR: the one consumer running the axes today needs the same guards applied to its
approve-start/axis-correctness/axis-conformancejobs (this repo's ownci-cursor-review.ymldoes not run them).Separately worth noting:
kimi-k3-highresource_exhaustedis recurring, not a one-off — four other recent consumer panels went red on kimi cells, twice with both legs.Tests
Provenance
Authored by: agent-work loop
Verified:
b3db43e(counts above). Pin lint, AGENTS.md integrity and the org-repo-literal lint pass.test_caller_doc_pattern.pywas mutation-checked onb3db43e. Each of these fails the suite:||for&&,!= 'pass', the start phase's parentheses dropped, and a stale bareif:on a second copy of a job.b3db43e: every GitHub Actions and Socket check passed, and CodeRabbit completed with no actionable comments. The cursor-review panel last ran on5e12cae, and all six of its findings are answered onb3db43e. Every review thread is resolved.b3db43ewith mainc37492cis conflict-free, and the cursor-review (1210) and cursor-approve (174) suites, the pin lint and the AGENTS.md integrity check pass on that merged tree.Deviations:
5e12cae) still names it, and this repo's squash message is built from the commit messages, so whoever merges should delete that reference from the squash message (it is not rewritten here to avoid force-pushing the branch).🤖 Generated with Claude Code
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.