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-SHAmatchesheadRefOidFindings: 0andNO FINDINGSResult: 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:
PR=<PR-number>
gh pr view "$PR" --json number,baseRefName,headRefName,headRefOid,state,mergeable --jq .
gh pr checks "$PR"
Approval check (optional gate):
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:
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):
gh pr merge <PR-number> --squash --delete-branch
Converted and distributed by TomeVault — claim your Tome and manage your conversions.