Skip to content

An Incomplete Copilot File Table Displaces an Attested Local Pass on a Develop Pull Request #3955

Closed

Description

@ptr727

Problem

On a pull request into develop, a Copilot round whose file table names only some of the changed files displaces the head's attested local pass. pr_review.py status then reads coverage=none. That leaves Merge Gate item 2 unmet, although the round states no partial coverage and the head carries a valid attestation.

pr-review-conduct Merge Gate item 2 says an attested local pass covers such a head "where the whole review history is in view and no round on record states partial coverage". A Lite-effort table that leaves files out is not a statement of partial coverage. Read literally, the rule keeps coverage=local here.

This is the table-carrying sibling of #2739, which fixed the same displacement for a round carrying no table at all.

Observed On

ptr727/NxWitness#665, a develop-based pull request that re-vendors the carried .github/skills tree (42 changed files, including one added and one deleted skill).

  1. local-strict-review was recorded on head fa116de0, and pr_review.py attest succeeded. status then read review_on_head=local coverage=local.
  2. Copilot then auto-reviewed the same head at Lite effort (effort=lite effort_source=explicit), with no coverage statement and a file table naming 30 paths.
  3. status now reads review_on_head=yes coverage=none with NO COVERAGE IS SHOWN: no round covering the head states coverage, and the table on fa116de0 names 30 path(s) where the pull request changes 42 file(s), and the two sets differ. It also prints no statement, file table, or attested local pass shows full coverage of this head.

The repository's .github/agent-policy.json lists Copilot with bases: ["@default"], so its review policy hands develop heads to the local pass. Copilot reviewed anyway because the repository's own Copilot auto-review setting fires on every base.

Expected

On a pull request whose review policy hands the head to a local pass, an attested local pass covering the head holds coverage=local whatever a table-carrying Copilot round names. A round that actually states partial coverage remains the only thing that withdraws it, as item 2 says.

Actual

The incomplete table wins over the attestation, and nothing the loop can do clears the gate short of the maintainer waiving item 2.

Audit context: hub c175d557, audit run 2026-11-09T16:22:15Z.

Activity

  1. ptr727 commented on Nov 9, 2026

    @ptr727
    OwnerAuthor

    Two more instances, from the Utilities resync against hub c175d557 (audit run 2026-11-09T16:22:11Z | hub c175d557). Both are develop-based pull requests whose .github/agent-policy.json gates Copilot on @default only, each with a recorded local pass and a successful attest on the head.

    The displacement comes from the final branch of coverage() in scripts/pr_review_rounds.py: local_cover(pr) and not any(reading(n).table is not None for n in rounds). Any table on a head round therefore suppresses local, including one table_cover has just rejected as not matching. That is stricter than both pr-review-conduct Merge Gate item 2 and the coverage= description in pr_review.py's own help, which name only a stated partial round, a truncated history, or a refusal as what blocks the local reading.

  2. added a commit that references this issue on Nov 9, 2026
  3. ptr727 commented on Nov 11, 2026

    @ptr727
    OwnerAuthor

    Backlog burndown claim, round 1 (2026-11-10). Branch feature/merge-gate-coverage-item2, group: #3955, #3909, #3901, #3905.

    Predicted files:

    • scripts/pr_review_rounds.py
    • scripts/pr_review_copilot.py
    • scripts/pr_review.py
    • scripts/pr_review_promotion.py
    • scripts/pr_review_digest.py
    • scripts/pr_review_answers.py
    • tests/test_pr_review.py
    • tests/test_pr_review_copilot.py
    • tests/test_pr_review_promotion.py
    • tests/test_pr_review_size.py
    • GOVERNANCE.md
    • .github/copilot-instructions.md
    • scripts/README.md
    • .agents/skills/pr-review-conduct/SKILL.md
    • .github/skills/pr-review-conduct/SKILL.md
    • .claude-plugin/fleet-skills/skills/pr-review-conduct/SKILL.md
    • .claude-plugin/fleet-skills/.source-digests/pr-review-conduct
    • .agents/skills/merge-and-release/SKILL.md
    • .github/skills/merge-and-release/SKILL.md
    • .claude-plugin/fleet-skills/skills/merge-and-release/SKILL.md
    • .claude-plugin/fleet-skills/.source-digests/merge-and-release
    • .agents/skills/drive-pr/SKILL.md
    • .github/skills/drive-pr/SKILL.md
    • .claude-plugin/fleet-skills/skills/drive-pr/SKILL.md
    • .claude-plugin/fleet-skills/.source-digests/drive-pr
  4. ptr727 commented on Nov 11, 2026

    @ptr727
    OwnerAuthor

    Another instance during a resync: audit run 2026-11-11T00:45:57Z | hub 1397e30, ptr727/HomeAssistant-Config PR 85 into develop. An attested local pass on the head read as coverage=local until a Copilot Lite round landed on the same head with a table naming 31 of the 44 changed files. The digest then read coverage=none, even though no round stated partial coverage. The carried tree there is byte-identical to the hub, so the attested pass is the stronger evidence. Expected: coverage=local to stand, as Merge Gate item 2 describes.

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