Skip to content

pr_review.py: a PARTIAL coverage verdict can contradict the review's own file table #623

Description

@ptr727

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:

  1. 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.
  2. 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.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions