Skip to content

Make pr_review.py and Merge Gate Item 2 Agree on an Earlier-Head Copilot Refusal #3571

Closed

Description

@ptr727

Summary

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.

🤖 Generated with Claude Code

Activity

  1. ptr727 commented on Nov 1, 2026

    @ptr727
    OwnerAuthor

    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.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?

    Options, recommended first:

    1. Rule text: a later-head local pass clears it (recommended): Matches the code's deliberate design: on a non-default-branch PR the local pass is the coverage, so a quota state should not stall every feature PR exactly when Copilot is unavailable, and a promotion into main still always needs a Copilot round on its head. The maintainer accepted this outcome on Drop the Registry Python Profile in Favor of Per-Directory Shape #3569. Skill text only; pr_merge.py (Merge a Gate-Met Feature Pull Request Through pr_review.py and Own the Kit's autoMode Entries #3704) keeps merging such PRs. No work in flight.
    2. 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.

    Blocks: none

  2. added
    decisionA question waiting on the maintainer, alone or beside whatever else the issue carries
    on Nov 1, 2026
  3. ptr727 commented on Nov 1, 2026

    @ptr727
    OwnerAuthor

    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.

  4. removed
    decisionA question waiting on the maintainer, alone or beside whatever else the issue carries
    on Nov 1, 2026
  5. ptr727 commented on Nov 1, 2026

    @ptr727
    OwnerAuthor

    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.json
    • tests/test_pr_review.py, tests/test_pr_review_copilot.py
    • .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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    scriptA defect in hub tooling

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions