copilot-review-loop

SKILL.md

Copilot Review Loop

Purpose

Automate an iterative Copilot-driven review loop: trigger a GitHub Copilot review, address its feedback one comment at a time, then re-trigger Copilot to review again. Repeat up to 2 cycles until all critical issues are resolved.

This is an in-session loop — one long agent context that iterates internally. It is not the Ralph Wiggum pattern, which is an external shell loop that spawns a fresh agent session per comment. For that, see the ralph-wiggum-loop skill instead.

Typical invocations

Users trigger this skill with prompts like:

  • "Request a Copilot review on this PR and address the feedback"
  • "Trigger a GitHub Copilot review and fix the issues it finds"
  • "Run copilot-review-loop on PR #42"
  • "Use copilot-review-loop to get and address Copilot's review comments"

Prerequisites

  • gh CLI (required)
  • gh-copilot-review extension (recommended — see references/gh-copilot-review-guide.md)
    gh extension install ChrisCarini/gh-copilot-review
    
    Fallback if not installed: gh pr review --request copilot
  • pr-review-loop skill (optional — if installed, the inner loop is delegated to it)
  • The PR branch must be checked out locally

Process

Step 1 — Pre-flight

Inspect the project for safeguard conventions by checking these files (if they exist):

  • CLAUDE.md, AGENTS.md
  • Makefile
  • .github/workflows/
  • README.md

Identify all required safeguards (tests, compilation, linting, formatting, etc.). Run all of them. If any fail, stop immediately and report — do not proceed.

Step 2 — Outer loop (max 2 iterations)

Repeat up to 2 times:

2a. Request Copilot review

Check if gh-copilot-review extension is installed:

gh extension list | grep copilot-review

If installed (preferred):

gh copilot-review [<number> | <url>]

If not installed (fallback):

gh pr review --request copilot

2b. Wait for Copilot to complete

Read references/gh-copilot-review-guide.md for the polling approach.

Record the current count of unresolved copilot[bot] comments before triggering. Poll every 30 seconds until new comments appear. If no new comments after 10 minutes, stop and report timeout — do not proceed.

2c. Collect unresolved Copilot comments

Fetch all unresolved comments authored by copilot[bot]. Ignore comments from human reviewers (those are handled by the pr-review-loop skill).

gh api repos/{owner}/{repo}/pulls/{pr}/comments \
  --jq '.[] | select(.user.login == "copilot[bot]")'

Fetch all Copilot comments. Use the count recorded before triggering (step 2b) to identify which are new.

If there are no unresolved Copilot comments, stop — nothing to do.

2d. Address comments — inner loop

If pr-review-loop skill is available: Invoke the pr-review-loop skill, passing only the Copilot comments collected in step 2c as the scope. It will handle triage, one-at-a-time fixes, and replies.

If pr-review-loop skill is NOT available: Follow this process for each comment, one at a time (MUST_FIX first, then SHOULD_FIX):

Triage using the four categories defined in references/triage-guide.md (MUST_FIX, SHOULD_FIX, PARK, OUT_OF_SCOPE). Read that file before triaging.

For each MUST_FIX and SHOULD_FIX comment:

  1. Assess complexity:

    • Trivial (rename, small fix): fix directly
    • Non-trivial: write plan to .pr-review/plan-<comment-id>.md first
  2. Run safeguards — all must pass before touching code

  3. Fix or park the comment

  4. Run safeguards again — all must pass

  5. Commit and push:

    git add <changed files>
    git commit -m "<conventional commit describing the fix>"
    git push
    
  6. Reply to the comment — explain fix, deferral, or rejection

  7. Resolve the comment on GitHub

  8. Delete plan file if one was created:

    rm .pr-review/plan-<comment-id>.md
    

2e. Check stop conditions

Stop iterating if any of:

  • No MUST_FIX Copilot comments remain after this pass
  • Only OUT_OF_SCOPE Copilot comments remain
  • This was the 10th iteration

Otherwise continue to the next iteration (back to step 2a).

Step 3 — Summary

Post a final comment on the PR:

## Copilot Review Loop — Summary

Completed N Copilot review cycle(s).

### Fixed
- [commit abc1234] <description> (Copilot comment #<id>)
- ...

### Parked
- <description> — deferred, tracked in #<issue>
- ...

### Rejected
- <description> — <reason>
- ...

Resumability

This skill can be interrupted and restarted in a fresh context at any point.

On restart:

  1. Run pre-flight (Step 1)
  2. Check for an existing .pr-review/plan-*.md — if found, continue mid-fix from step 2d
  3. Re-fetch unresolved Copilot comments — already-resolved ones won't appear
  4. Continue the outer loop from the current state

State Directory

.pr-review/ at the repo root (should be gitignored by the project).

  • plan-<comment-id>.md — plan for the comment currently in progress (deleted after resolution)

Do Not

  • Bundle all PR feedback into one large commit
  • Make multiple unrelated changes in a single commit
  • Push all changes at once without intermediate commits
  • Leave Copilot comments unresolved after addressing them
  • Proceed to the next Copilot review cycle if MUST_FIX items remain unresolved
Weekly Installs
6
First Seen
Feb 14, 2026
Installed on
claude-code6
mcpjam5
kilo5
junie5
windsurf5
zencoder5