Repository navigation
Read a Closed Read-Back as Unmerged in pr_review.py merge - #3737
Conversation
…erge The base was last checked before the gate's read, so a pull request retargeted while the gate ran could still be squashed into its new base. A pull request that reads back closed after the merge call cannot merge later, so it is a refusal rather than an unconfirmed merge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ready() already refuses a retargeted base on the read after the gate, so the second check only narrowed a window no check can close, since the merge call cannot pin a base. The closed read-back subtests now read only their own output. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
A recorded local strict-review pass covers head |
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars.
|
There was a problem hiding this comment.
🟢 Approval recommended
No active review issues remain, with the refusal contract documented and regression coverage addressing both gh merge outcomes.
No open issues 🎉
What changed in this PR
Updates pr_review.py merge so a post-merge CLOSED pull request read-back is treated as a definitive refusal rather than an unconfirmed merge.
Changes:
- Returns
status=REFUSEDwith exit code1forCLOSEDread-backs. - Documents the updated refusal and exit-code contract.
- Adds regression coverage for both successful and failed
ghmerge responses.
| File | Summary |
|---|---|
tests/test_pr_merge.py |
Verifies closed read-backs for both gh exit codes. |
scripts/README.md |
Documents the closed read-back and refusal behavior. |
scripts/pr_merge.py |
Classifies closed pull requests as confirmed refusals after the merge call. |
Review effort: Lite
The separate branch took pr_merge.py past its size ceiling. A closed read-back now shares the branch an open one already takes, so the line names the state it read and the file stays under the ceiling. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The folded branch printed MERGE_REFUSED after a gh exit of 0 and "exit None" after a call that never finished. A closed read-back now prints REFUSED with the state it read and what gh answered, nothing included. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
A recorded local strict-review pass covers head |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #3737 +/- ##
========================================
Coverage 82.31% 82.31%
========================================
Files 28 28
Lines 9437 9438 +1
========================================
+ Hits 7768 7769 +1
Misses 1669 1669
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
…nd Add a backlog-burndown Away Mode (#3736) Promotes the changes merged into `develop` since promotion #3715 to `main`. - [#3704](#3704): squash-merges a gate-met feature pull request through `pr_review.py merge`, and the host-safety kit now owns its `autoMode` entries. - [#3735](#3735) adds an away mode to `backlog-burndown`: - Parallel file-claimed rounds with no maintainer present, run by a lean orchestrator. - A group meeting a question parks behind a `decision` issue instead of asking. - Merges go only as far as the `develop`, `main` or `release` scope named at invocation. - The end report names each held-back issue's real reason. It also adds the attended `decision-triage` skill, which researches and asks every open question at once, and retires `unattended-handoff`. - [#3737](#3737) reads a pull request that reads back closed after `pr_review.py merge`'s merge call as a refusal that merged nothing, rather than as an unconfirmed merge. It answers this promotion's first review round. After the release, the host-safety installer re-run that #3704 needs is still the maintainer's, per its handoff #3734. That handoff's step 3 names an `unattended-handoff` worker. That skill is retired here, so the verification runs from a `backlog-burndown` worker instead. Fixes #3375 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Why
Copilot's round on promotion #3736 found that
pr_review.py mergereports a pull request read backCLOSEDafter the merge call asMERGE_NOT_CONFIRMED, exit2, "may still land on the server". A closed pull request cannot merge later, so a driver followingdrive-prstep 4 was sent to read back a merge that cannot have happened.What
CLOSEDisstatus=REFUSED, exit1, nothing merged, whateverghanswered. Thescripts/README.mdcontract says so.OPENrefusal already takes, sopr_merge.pystays under its size ceiling. The first push's separate branch trippedtest_pr_review_size.pyin CI. The line now names the state it read and whatghanswered, ornothingwhere the call never finished.ghexit0, exit1, and a call that never finished. It fails on the previous code, which returned exit2for each.The same round's other two findings are answered on #3736 rather than changed here:
ready()already re-checks the base on the read after the gate, atscripts/pr_merge.pyinmerge().PEER_MERGED:scripts/README.md"pr_merge.py" anddrive-prstep 4 state this as the contract.Local review
Two
local-strict-reviewpasses ran at thefrontiertier.ghrefusal that had not happened. The fourth raised nothing.🤖 Generated with Claude Code