iterate-pr — Claude Code skill: what it does, how to install
Iterates on a pull request until actionable CI passes and review comments are fixed. It handles test failures and feedback loops without waiting for human approval.
npx skills add getsentry/skills --skill iterate-pr -a claude-codeWhat iterate-pr does
The skill manages an automated feedback loop for open GitHub pull requests. It sorts review comments via scripts/fetch_pr_feedback.py into severity buckets, fixing high and medium priority items while asking how to handle low priority suggestions.
When tests fail, the workflow inspects full logs using gh run view <run-id> --log-failed. It diagnoses the cause and pushes new commits with git push after verifying changes locally.
You need authenticated gh and uv installed in the target repository root. If the branch needs a rebase or hits a required human approval gate, the skill stops immediately instead of waiting.
What it helps with
- fix failing CI checks on open pull requests
- triage review feedback by priority level
- inspect failed test logs with GitHub CLI
- push fixes after local verification
Example prompts for the agent
- Iterate on this PR until CI passes and review feedback is addressed
- Check failing CI checks for the current PR and fix them
- Run iterate-pr to resolve review comments and monitor test runs
How to install iterate-pr
1Skills CLI (Vercel)
npx skills add getsentry/skills --skill iterate-pr -a claude-code2Manually: put the files in place
~/.claude/skills/iterate-pr/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/iterate-pr/
1Skills CLI (Vercel)
npx skills add getsentry/skills --skill iterate-pr -a codex2Manually: put the files in place
.agents/skills/iterate-pr/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add getsentry/skills --skill iterate-pr -a cursor2Manually: put the files in place
.cursor/skills/iterate-pr/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install getsentry/skills iterate-pr2Manually: put the files in place
.github/skills/iterate-pr/SKILL.md1Skills CLI (Vercel)
npx skills add getsentry/skills --skill iterate-pr -a gemini-cli2Platform CLI
gemini skills install https://github.com/getsentry/skills --path skills/iterate-prManually: put the files in place
.devin/skills/iterate-pr/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add getsentry/skills --skill iterate-pr -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about iterate-pr
How to install iterate-pr in Claude Code?
Run npx skills add getsentry/skills --skill iterate-pr -a claude-code.
What does iterate-pr do?
It resolves actionable CI failures and addresses high and medium review feedback on pull requests. The skill updates code, verifies fixes locally, and pushes commits until checks pass.
What prerequisites are required for iterate-pr?
It requires authenticated gh, uv, and execution from the target repository root.
Source text
SKILL.md · Apache-2.0
---
name: iterate-pr
description: Iterate on a PR until actionable CI passes and high/medium review feedback is addressed. Use for PR CI failures, review feedback, or green-check loops; do not wait for human approval, draft status, or merge gates.
disable-model-invocation: false
---
# Iterate on PR Until CI Passes
Goal: fix actionable CI failures and high/medium review feedback. Stop and report human approval, draft-readiness, and merge-readiness gates.
Requires:
- authenticated `gh`
- `uv`
- target repository root as cwd
- skill-root-relative script paths, for example `scripts/fetch_pr_checks.py`
## Bundled Scripts
| Script | Run | Output |
|--------|-----|--------|
| `scripts/fetch_pr_checks.py` | `uv run scripts/fetch_pr_checks.py [--pr NUMBER]` | JSON: `pr`, `summary`, `checks`, failure snippets |
| `scripts/fetch_pr_feedback.py` | `uv run scripts/fetch_pr_feedback.py [--pr NUMBER]` | JSON buckets: `high`, `medium`, `low`, `bot`, `resolved` |
| `scripts/monitor_pr_checks.py` | `uv run scripts/monitor_pr_checks.py [--pr NUMBER]` | terminal marker plus tab-separated checks |
| `scripts/reply_to_thread.py` | `uv run scripts/reply_to_thread.py THREAD_ID BODY [...]` | JSON reply results |
Check summary fields include `failed`, `pending`, `actionable_pending`, and `human_gate_pending`.
Monitor markers:
- `ALL_CHECKS_PASSED`
- `CHECKS_DONE_WITH_FAILURES`
- `NO_CHECKS_REGISTERED`
- `DRAFT_PR_WITH_NO_CHECKS`
- `CHECKS_BLOCKED_BY_REVIEW_GATE`
## Workflow
### 1. Identify PR
Run:
```bash
gh pr view --json number,url,headRefName,isDraft,reviewDecision
```
Stop when:
- no PR exists
- draft PR has no checks after monitor grace period: report `DRAFT_PR_WITH_NO_CHECKS`
Draft rule: inspect existing checks/feedback only. Do not mark ready for review unless asked.
### 2. Handle Feedback
Run `uv run scripts/fetch_pr_feedback.py [--pr NUMBER]`.
| Bucket | Action |
|--------|--------|
| `high` | fix |
| `medium` | fix |
| `low` | ask user which to address |
| `bot` | skip informational comments |
| `resolved` | skip |
Feedback fix checklist:
- verify root cause
- search related code
- fix all instances
- for `review_bot: true`: fix real issues, explain false positives
Low-priority prompt format:
```text
Found 3 low-priority suggestions:
1. [l] "Consider renaming this variable" - @reviewer in api.py:42
2. [nit] "Could use a list comprehension" - @reviewer in utils.py:18
3. [style] "Add a docstring" - @reviewer in models.py:55
Which should I address? ("1,3", "all", or "none")
```
### 3. Check CI Status
Run `uv run scripts/fetch_pr_checks.py [--pr NUMBER]`.
| State | Action |
|-------|--------|
| `failed > 0` and `actionable_pending == 0` | fix failures |
| `actionable_pending > 0` | wait; poll feedback while waiting |
| `pending > 0` and `actionable_pending == 0` | report `CHECKS_BLOCKED_BY_REVIEW_GATE` |
| no checks after grace period | report `NO_CHECKS_REGISTERED` or `DRAFT_PR_WITH_NO_CHECKS` |
| all actionable checks passed | run post-CI feedback check |
Wait for actionable review bots: sentry, warden, cursor, bugbot, seer, codeql.
Do not wait for approval, `isDraft`, `REVIEW_REQUIRED`, Codecov, or informational bots.
### 4. Fix CI Failures
For each failure:
1. read full log: `gh run view <run-id> --log-failed`
2. trace from assertion/exception/lint rule to source
3. state the cause before editing: "fails because X, affected by Y"
4. search related call sites/patterns
5. fix root cause, not symptom
6. add focused test coverage when needed
### 5. Verify Locally, Then Commit and Push
Before commit:
- test fix: rerun specific test
- lint/type fix: rerun affected checker
- code fix: rerun covering tests
- local failure: fix before pushing
```bash
git add <files>
git commit -m "fix: <descriptive message>"
git push
```
### 6. Monitor CI and Address Feedback
Loop:
1. run `uv run scripts/fetch_pr_checks.py`
2. handle table in step 3
3. while `actionable_pending > 0`, run `uv run scripts/fetch_pr_feedback.py`
4. fix new high/medium feedback immediately
5. if changed, verify, commit, push, restart loop
6. otherwise sleep 30 seconds and repeat
7. after checks pass, wait 10 seconds, fetch feedback once more
8. if new high/medium feedback exists, return to step 4
Claude Code optional: run `uv run scripts/monitor_pr_checks.py` through `MonitorTool` with `persistent: false`; set timeout to normal repo CI duration. Restart the monitor after every push.
## Exit Conditions
| Exit | Conditions |
|------|------------|
| Success | actionable CI passed; post-CI feedback clean; low-priority choice handled |
| Ask user | same failure after 2 attempts; feedback unclear; infrastructure issue |
| Stop | no PR; branch needs rebase; no checks; draft no-checks; only human gates remain |
## Fallback
If scripts fail, use `gh` CLI directly:
- `gh pr view --json number,url,headRefName,isDraft,reviewDecision`
- `gh pr checks --json name,state,bucket,description,link`
- `gh run view <run-id> --log-failed`
- `gh api repos/{owner}/{repo}/pulls/{number}/comments`
© getsentry · Apache-2.0 · getsentry/skills