Repository navigation
Read Copilot's Excluded-Files Refusal as Its Own Kind and Align Merge Gate Item 2 - #3775
Conversation
… Gate Item 2 With the Local Cover Read Copilot's "wasn't able to review any files" refusal as an `excluded` refusal kind. It no longer blocks the local cover, so the attested local pass covers such a head into a non-default branch, and `wait` names its own remedy where no local pass can. State in pr-review-conduct Merge Gate item 2 that a later-head attested local pass clears an earlier-head quota or error refusal on a pull request into a non-default branch, as the code already reads it. Add the `open review findings:` and `review findings remain:` labels to the Copilot reader, and state the lineless-file table allowance in item 2, the canonical copilot-instructions, and PR Review Etiquette. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The body-less liveness read takes a head refusal for a finished round, so the hold for an excluded-files refusal is decided on the full read after it. The tests now give `wait` a body-less liveness read first. Scope the remaining-refusal sentence in pr-review-conduct to where no local pass stands in, and drop an unscoped claim about a moved head. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Read the full payload when the body-less liveness read calls the head done, and let `polled_past` decide whether an excluded-files refusal holds the head for a local pass or waits on a pending request. A held head then gets the same check poll as any other, and a pending request reads as pending rather than as the refusal. Name the file-count refusal as the one splitting clears in pr-review-conduct's remaining-refusal sentence. 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.
|
An excluded-files refusal landing after a real round on the same head left that round's coverage unread. Both branches of `polled_past` now require that no Copilot round covers the head. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
A recorded local strict-review pass covers head |
There was a problem hiding this comment.
🟡 Changes recommended
A moderate active finding remains in scripts/pr_review_rounds.py that can cause an unattested feature PR to rely on an excluded-files refusal and exit incorrectly instead of using the real head review.
1 open issue
What changed in this PR
This pull request adds explicit handling for Copilot reviews refused because all files are excluded, aligns review-gate guidance with existing behavior, and expands Copilot finding-label recognition.
Changes:
- Adds the
excludedrefusal kind, dedicated wait statuses, local-pass handling, and regression tests. - Documents earlier-head refusal coverage and lineless-file allowances across governance and review instructions.
- Adds Copilot finding-label spellings and validates reviewer refusal vocabulary.
- An unresolved edge case remains in
polled_past: an excluded refusal after a genuine review of the current head can incorrectly force an unattested feature pull request to await a local pass.
This pull request requires changes.
| File | Description |
|---|---|
tests/test_pr_review.py |
Tests excluded-file refusals, local coverage, polling, and stale refusals. |
tests/test_pr_review_copilot.py |
Tests refusal vocabulary and additional finding-list labels. |
scripts/reviewers/copilot.json |
Adds the excluded refusal kind and Copilot finding-label spellings. |
scripts/pr_review.py |
Updates wait behavior, statuses, and excluded-refusal handling. |
scripts/pr_review_rounds.py |
Adds excluded-refusal detection, polling behavior, and local coverage rules. |
scripts/pr_review_copilot.py |
Adds excluded to the refusal vocabulary. |
GOVERNANCE.md |
Documents lineless-file table coverage. |
.github/skills/pr-review-conduct/SKILL.md |
Aligns merge-gate guidance with refusal and coverage behavior. |
.github/copilot-instructions.md |
Documents lineless-file allowances and excluded-refusal handling. |
.claude-plugin/fleet-skills/skills/pr-review-conduct/SKILL.md |
Updates the generated review-conduct skill distribution. |
.claude-plugin/fleet-skills/.source-digests/pr-review-conduct |
Updates the generated skill source digest. |
.agents/skills/pr-review-conduct/SKILL.md |
Updates the authored review-conduct skill source. |
Review effort: Lite
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #3775 +/- ##
===========================================
+ Coverage 82.31% 82.34% +0.02%
===========================================
Files 28 28
Lines 9438 9454 +16
===========================================
+ Hits 7769 7785 +16
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:
|
…xcluded-Files Refusal, and Fix backlog-burndown and Prose Gate Gaps (#3778) Promotes the changes merged into `develop` since promotion #3762 to `main`, the first round of a backlog burndown. - [#3764](#3764) reads a bare push whose branch the write guard cannot read as writing every protected default (`main`, `master`, `develop`), as `--all` is. That covers a run-time `cd`, `git -C` or `env -C`, an exported `GIT_DIR`, and a command that can switch the branch before the push. It also drops the unused `_bare_push_branch` parameters. Naming the branch in the refspec is the remedy, per the maintainer's decisions on #3729 and #3730. - [#3765](#3765) has the prose gate's diff mode report what a move adds by checking a moved file at its old path and its new path, replacing the hand-kept `path_readings` table. It also reads a script whole when an edited shebang changes its lexer. - [#3776](#3776) fixes `backlog-burndown`'s ranking, claim, liveness and cleanup gaps: - An attended run holds an unapproved agent-safety issue. - Claim comments name their branch in backticks and are released by an edit. - A silent worker counts as finished only with a merged pull request. - The orchestrator removes a standalone clone after its merge. - An abandoned worker discards its own uncommitted edits. - [#3775](#3775) reads Copilot's excluded-files refusal as its own `excluded` kind, which an attested local pass covers on a pull request into a non-default branch. It aligns Merge Gate item 2 with the code on an earlier-head refusal, adds two Copilot label spellings, and states the lineless-file allowance where the prose describes table coverage. - [#3779](#3779) deletes an abandoned group's pushed branch with a checked remote delete before its claim is released, and says the claim lookup's `<branch>` is replaced before it runs. It answers this promotion's first review round. - [#3781](#3781) has a release open the claim comment with `**Released (<date>):**`, and has the claim lookup skip a comment that opens with it. It answers this promotion's second review round. - [#3782](#3782) has `pr_review.py wait` poll a pending review request past an excluded-files refusal under `--request` as well. It answers this promotion's second review round. Fixes #3729 Fixes #3730 Fixes #3723 Fixes #3711 Fixes #3714 Fixes #3761 Fixes #1275 Fixes #1274 Fixes #1306 Fixes #1301 Fixes #3733 Fixes #3571 Fixes #2180 Fixes #3732 Fixes #3713 Fixes #3726 🤖 Generated with [Claude Code](https://claude.com/claude-code)

Summary
uv.lock), when Copilot posts "wasn't able to review any files? #3740). Copilot's "wasn't able to review any files in this pull request" refusal now reads as its ownexcludedrefusal kind inscripts/reviewers/copilot.json. It no longer blockslocal_cover, so on a pull request into a non-default branch the attested local pass covers the head.waitexits49until that pass is attested and0after. Where no local pass can cover the head, as on a promotion,waitexits41with its ownstatus=REVIEW_EXCLUDED_FILES_ONLYline. That line says neither re-requesting nor splitting clears it and hands it to the maintainer.waitreads the full payload once and reuses it for the final read. The newpolled_pasthelper then decides whether an excluded-files refusal holds the head for its local pass, or waits on a pending request. A held head gets the same check poll as any other.coverage=local. Thewaithelp text says the same. A test pins the error-refusal case beside the existing quota one.review findings remain:andopen review findings:are added to the Copilot reader'slabelsandfinding_lists, with test cases..github/copilot-instructions.mdcoverage paragraph, andGOVERNANCE.md"PR Review Etiquette" now say a file table may leave out a file with no changed line, such as a binary. The same sentence was missing from thatGOVERNANCE.mdsection, so it is fixed there too. The copilot-instructions paragraph also names the excluded-files refusal as the one refusal on the head that does not block the local-pass reading.REFUSALS, with Copilot's file carrying all of them. That lets the CodeRabbit and Qodo files leave out a kind their reviewer never posts.Local pass findings
introduced, scripts/pr_review_rounds.pypolled_past: the excluded branch did not require that no Copilot round covers the head. Fixed in 6a0b134, with a test that fails without it.Deferred, filed
introduced, scripts/pr_review_digest.pyrefusal_field: an excluded-files refusal printsrefusal=YES, like a file-count one. Deferred to Describe the Excluded-Files Refusal Kind in scripts/README.md and the Digest's refusal= Field #3777, since that file sits outside this change's file claim.introduced, scripts/README.md lines 232 and 254: the refusal kinds list and thewaitexit41paragraph leave out the excluded kind and the later-head local cover. Deferred to Describe the Excluded-Files Refusal Kind in scripts/README.md and the Digest's refusal= Field #3777 for the same reason.Not fixed here
#3758 stays open.
run_waitalready requests nothing on a pull request into a non-default branch, attested or not (test_a_feature_pull_request_with_no_round_is_never_requested). On the recent feature pull requests sampled, the Copilot request lands about two seconds after the pull request is created, before anywaitruns, and the develop ruleset carries no Copilot rule. So the request comes from the platform when the pull request is created rather than frompr_review.py. The evidence is on the issue.Closes on promotion: #3571, #2180, #3732, #3713, #3726
🤖 Generated with Claude Code