pr_review.py status reads coverage from the reviewer's Copilot reviewed N out of M changed files line and reports coverage=PARTIAL when N < M, with a caveat block saying part of the diff has no review at all and that the merge decision belongs to the maintainer. That is the right default. In at least one case the same review body contradicts that line, and the script has no way to notice.
Observed on ptr727/Blog#60, round 1, and on its predecessor ptr727/Blog#59 across six consecutive rounds at an identical 5-of-6 ratio.
The header says:
Copilot reviewed 5 out of 6 changed files in this pull request and generated no comments.
The <details> "Pull request overview" table in the same review body then names all six changed files with a one-line description each. Measured rather than eyeballed — the pull request's changed-file list and the paths named in that table are identical sets:
changed files table names
TODO.md TODO.md
checks/README.md checks/README.md
checks/build-redirects.py checks/build-redirects.py
checks/check-url-parity.py checks/check-url-parity.py
deploy/maps/slugs.map deploy/maps/slugs.map
hugo.yaml hugo.yaml
So on this evidence the 5 out of 6 count is a reporting artifact rather than a file that went unread, and the caveat's "files in the diff have no review at all" is stronger than what can be shown. That matters because the caveat is written to stop a merge, and the runbook's own note that a re-request never clears a partial is consistent with the count being wrong rather than with coverage genuinely being short — six rounds held the identical ratio while each round found a real defect in a different file.
Suggested change, in rough order of value:
- When the review body carries the overview table, compare the paths it names against the pull request's changed files. If they match, report the mismatch between the count and the table rather than a bare
PARTIAL — something like coverage=PARTIAL(count) table=full, so a caller can tell a counting artifact from missing coverage.
- Where the table names fewer paths than the diff, name the missing ones. The current caveat says which file went unread "cannot be read from the API", and where the table is present it can.
- Keep the maintainer-decision framing either way. This is about making the verdict checkable, not about clearing it automatically.
Happy to send the change if the shape above is wanted. Filed from ptr727/Blog, where the caveat came up on a real pull request and cost a round of investigation to bottom out.
pr_review.py statusreads coverage from the reviewer'sCopilot reviewed N out of M changed filesline and reportscoverage=PARTIALwhenN < M, with a caveat block saying part of the diff has no review at all and that the merge decision belongs to the maintainer. That is the right default. In at least one case the same review body contradicts that line, and the script has no way to notice.Observed on ptr727/Blog#60, round 1, and on its predecessor ptr727/Blog#59 across six consecutive rounds at an identical 5-of-6 ratio.
The header says:
The
<details>"Pull request overview" table in the same review body then names all six changed files with a one-line description each. Measured rather than eyeballed — the pull request's changed-file list and the paths named in that table are identical sets:So on this evidence the
5 out of 6count is a reporting artifact rather than a file that went unread, and the caveat's "files in the diff have no review at all" is stronger than what can be shown. That matters because the caveat is written to stop a merge, and the runbook's own note that a re-request never clears a partial is consistent with the count being wrong rather than with coverage genuinely being short — six rounds held the identical ratio while each round found a real defect in a different file.Suggested change, in rough order of value:
PARTIAL— something likecoverage=PARTIAL(count) table=full, so a caller can tell a counting artifact from missing coverage.Happy to send the change if the shape above is wanted. Filed from ptr727/Blog, where the caveat came up on a real pull request and cost a round of investigation to bottom out.