PR Auto-Review And Merge (Closed Loop)
This skill implements the closed-loop workflow: Review via subagent -> ICC-REVIEW receipt -> merge when NO FINDINGS -> otherwise fix and restart.
Inputs
- •PR number (required):
<PR-number>
Safety Rules
- •Default base branch for PRs is
dev. Never auto-merge a PR targetingmainunless it is an explicitly requested release workflow. - •Never merge unless a merge-eligible
ICC-REVIEW-RECEIPTexists for the PR's current head SHA:- •
Reviewer-Stage: 3 (temp checkout) - •
Reviewer-Agent: ... (subagent) - •
Head-SHAmatchesheadRefOid - •
Findings: 0andNO FINDINGS - •
Result: PASS
- •
- •GitHub approvals are OPTIONAL by default (self-review-and-merge workflow). If you want to enforce GitHub-style approvals,
set
workflow.require_github_approval=true. - •Merge approval:
- •If
workflow.auto_merge=true(standing approval), the agent MAY merge once gates pass. - •Otherwise, stop and wait for explicit user approval.
- •If
Workflow (Loop Until Clean)
- •Read PR metadata:
- •base branch, head SHA, head branch
- •checks status
- •Run Stage 3 review via a dedicated reviewer subagent:
- •Use Task tool to create
@Reviewerand run Reviewer Stage 3 in a temp checkout. - •Reviewer must fix findings by pushing commits to the PR branch.
- •Reviewer must re-run Stage 3 until findings are zero and checks are green.
- •Reviewer must post
ICC-REVIEW-RECEIPTNO FINDINGS comment for the current head SHA. - •Pragmatic GitHub approval (best-effort; only if
workflow.require_github_approval=true): after posting NO FINDINGS receipt, reviewer subagent should:- •Skip if an
APPROVEDreview already exists. - •Otherwise, attempt:
gh pr review <PR-number> --approve --body "Approved based on ICC Stage 3 review receipt (NO FINDINGS)." - •If PR author == current authenticated
ghuser: GitHub forbids approving your own PR (server-side rule). Skip.- •If repo rules require approvals, merge will still be blocked; use a second GitHub identity/bot for approvals.
- •Skip if an
- •Use Task tool to create
- •Verify merge gates (receipt + head SHA + checks green).
- •If gates fail:
- •Restart from step 2 (fresh temp checkout).
- •If repeated failures or unclear/risky changes are required, pause for a human decision.
- •If gates pass:
- •If
workflow.auto_merge=trueand base isdev: merge the PR (agent-performed merge; do NOT use--auto). - •Else: stop and ask for explicit approval.
- •If
Command Snippets (Reference)
PR info:
bash
PR=<PR-number> gh pr view "$PR" --json number,baseRefName,headRefName,headRefOid,state,mergeable --jq . gh pr checks "$PR"
Approval check (optional gate):
bash
PR=<PR-number> PR_AUTHOR=$(gh pr view "$PR" --json author --jq .author.login) GH_USER=$(gh api user --jq .login) APPROVALS=$(gh pr view "$PR" --json reviews --jq '[.reviews[] | select(.state=="APPROVED")] | length') echo "Approvals: $APPROVALS" if [ "$PR_AUTHOR" = "$GH_USER" ]; then echo "Self-authored PR ($GH_USER): GitHub forbids self-approval; approvals may require a bot/second identity." fi
Receipt verification:
bash
PR=<PR-number>
HEAD_SHA=$(gh pr view "$PR" --json headRefOid --jq .headRefOid)
RECEIPT=$(gh pr view "$PR" --json comments --jq '.comments | map(select(.body | contains("ICC-REVIEW-RECEIPT"))) | last | .body // ""')
echo "$RECEIPT" | rg -q "Reviewer-Stage: 3 \\(temp checkout\\)"
echo "$RECEIPT" | rg -q "Reviewer-Agent:.*\\(subagent\\)"
echo "$RECEIPT" | rg -q "Head-SHA: $HEAD_SHA"
echo "$RECEIPT" | rg -q "Findings: 0"
echo "$RECEIPT" | rg -q "NO FINDINGS"
echo "$RECEIPT" | rg -q "Result: PASS"
Merge (agent-performed):
bash
gh pr merge <PR-number> --squash --delete-branch