You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Make pr_review.py and Merge Gate Item 2 Agree on an Earlier-Head Copilot Refusal #3571
pr_review.py and pr-review-conduct "Merge Gate" item 2 disagree on a pull request into develop whose Copilot error refusal landed on an earlier head.
The rule says refusal=QUOTA or refusal=ERROR is "the one nothing the loop does clears". That holds when the newest Copilot review is such a refusal, "on this head or an earlier one".
The tool reads an attested local pass on the current head as coverage=local and review_on_head=local even then. wait exits 0, and the digest still prints refusal=ERROR.
Failure
Take a constructed feature pull request into develop. Copilot posts an error refusal on head A. The driver pushes head B and attests a local pass on it. status prints coverage=local refusal=ERROR, wait exits 0, and the driver merges. By the rule's text the item was unmet, so the merge needed the maintainer.
This happened on #3569. The maintainer accepted that merge on 2026-10-28 and asked for this issue.
Expected
The tool and the rule state one behavior. Either the tool holds item 2 unmet under an earlier-head refusal, or the rule says what clears it. That would be an attested local pass on a later head, for a pull request into a non-default branch.
Question: When a pull request into a non-default branch has a Copilot error or quota refusal on an earlier head and an attested local pass on its current head, should pr_review.py hold Merge Gate item 2 unmet, or should pr-review-conduct's Merge Gate text say the later-head attested local pass clears it?
Tool holds item 2 unmet on any-head refusal: local_cover also refuses when the newest Copilot review on any head is a QUOTA or ERROR refusal. Makes the text literally true, but under quota exhaustion every feature PR goes to the maintainer and pr_merge.py stops auto-merging them. No work in flight.
Evidence: pr-review-conduct SKILL.md:42 "every head can carry an attested local pass instead, coverage=local"; lines 69, 74-79 "A refusal is not that coverage ... can sit on this head or an earlier one". scripts/pr_review_rounds.py:638-656 local_cover requires not refusing_review(pr), which checks only the newest review on the current head (line 242, docstring line 649). scripts/pr_merge.py:35 includes "local" in MET_COVERAGE and ignores refusal=, so since #3704 this disagreement also decides automated merges into develop. Overlaps #2180.
Maintainer answer (decision triage, 2026-11-01): Option 1: change the pr-review-conduct Merge Gate text to say a later-head attested local pass clears item 2 on a pull request into a non-default branch, even after an earlier-head Copilot quota or error refusal. A promotion into main still always needs a Copilot round on its head. This is now work for the next burndown round.
Released (2026-11-01): worktree and branch removed, so this claim holds no files. Its fix merged to develop in PR #3775. The issue closes when that is promoted.
.agents/skills/pr-review-conduct/SKILL.md and its generated trees (.github/skills/pr-review-conduct/, .claude-plugin/fleet-skills/skills/pr-review-conduct/, .claude-plugin/fleet-skills/.source-digests/pr-review-conduct)
drive-pr generated trees (included section), GOVERNANCE.md "PR Review Etiquette", .github/copilot-instructions.md
Activity
ptr727 commentedon Nov 1, 2026
Decision needed (decision triage, 2026-11-01)
Question: When a pull request into a non-default branch has a Copilot error or quota refusal on an earlier head and an attested local pass on its current head, should
pr_review.pyhold Merge Gate item 2 unmet, or should pr-review-conduct's Merge Gate text say the later-head attested local pass clears it?Options, recommended first:
local_coveralso refuses when the newest Copilot review on any head is a QUOTA or ERROR refusal. Makes the text literally true, but under quota exhaustion every feature PR goes to the maintainer and pr_merge.py stops auto-merging them. No work in flight.Evidence: pr-review-conduct SKILL.md:42 "every head can carry an attested local pass instead,
coverage=local"; lines 69, 74-79 "A refusal is not that coverage ... can sit on this head or an earlier one". scripts/pr_review_rounds.py:638-656local_coverrequiresnot refusing_review(pr), which checks only the newest review on the current head (line 242, docstring line 649). scripts/pr_merge.py:35 includes "local" in MET_COVERAGE and ignoresrefusal=, so since #3704 this disagreement also decides automated merges into develop. Overlaps #2180.Blocks: none
ptr727 commentedon Nov 1, 2026
Maintainer answer (decision triage, 2026-11-01): Option 1: change the pr-review-conduct Merge Gate text to say a later-head attested local pass clears item 2 on a pull request into a non-default branch, even after an earlier-head Copilot quota or error refusal. A promotion into main still always needs a Copilot round on its head. This is now work for the next burndown round.
ptr727 commentedon Nov 1, 2026
Released (2026-11-01): worktree and branch removed, so this claim holds no files. Its fix merged to develop in PR #3775. The issue closes when that is promoted.
Backlog burndown claim (round 1, group G1). Branch:
feature/burn-3758. Issues: #3758, #3571, #2180, #3732, #3713, #3726.Predicted file set:
scripts/pr_review.py,scripts/pr_review_rounds.py,scripts/pr_review_copilot.py,scripts/reviewers/copilot.jsontests/test_pr_review.py,tests/test_pr_review_copilot.py.agents/skills/pr-review-conduct/SKILL.mdand its generated trees (.github/skills/pr-review-conduct/,.claude-plugin/fleet-skills/skills/pr-review-conduct/,.claude-plugin/fleet-skills/.source-digests/pr-review-conduct)drive-prgenerated trees (included section),GOVERNANCE.md"PR Review Etiquette",.github/copilot-instructions.mdRead Copilot's Excluded-Files Refusal as Its Own Kind and Align Merge…