Skip to content
Back to skills

Pr Fix

ASecurity

Fix failing CI checks on a pull request

  • 2 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 29, 2026
toolsbashgitapi

Works with

  • api

Security analysis

A100/100

Scanned September 29, 2026

npx -y skills add abnegate/claudes --skill pr-fix --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Pr Fix?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Pr Fix
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/abnegate-pr-fix/badge)](https://www.skillsdirectory.com/skills/abnegate-pr-fix)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: pr-fix
description: Fix failing CI checks on a pull request
argument-hint: <url> [comments=true|false] [checks=true|false]
---

# Fix Failing PR Checks

Fix failing CI checks on a GitHub pull request, iterating until all checks pass. Uses parallel agents extensively to analyze failures and apply fixes simultaneously.

## Arguments

- `$ARGUMENTS` - PR URL or number (e.g., `https://github.com/owner/repo/pull/123` or `123`)
- `checks` (optional) - Whether to analyze and fix failing checks (default: true)
- `comments` (optional) - Whether to address comments in the PR (default: false)

## Parsing Arguments

Extract from `$ARGUMENTS`:
- **PR reference** — the URL or number (first positional value)
- **checks** — `checks=true` or `checks=false` (default: `true`)
- **comments** — `comments=true` or `comments=false` (default: `false`)

Example: `/pr-fix https://github.com/owner/repo/pull/123 comments=true checks=false`

## Workflow

### 1. Checkout the PR

```bash
gh pr checkout <pr-ref>
```

When checks=true and `gh pr checks <pr-ref>` lists pending checks, follow **Wait for CI** before step 2. If it lists no checks, follow it only when `git ls-files .github/workflows` prints a workflow file, and otherwise handle the PR as on exit 3.

#### Wait for CI

```bash
if [ -z "${PR_URL:-}" ] || [ -z "${REPO:-}" ]; then echo 'set PR_URL and REPO first'; exit 2; fi
HEAD_SHA=$(git -C "$REPO" rev-parse HEAD) || exit 2
PREVIOUS_COUNT=0
for _ in $(seq 1 30); do
  PR_HEAD=$(gh pr view "$PR_URL" --json headRefOid --jq .headRefOid)
  CHECK_COUNT=0
  if [ "$PR_HEAD" = "$HEAD_SHA" ]; then
    CHECK_COUNT=$(gh pr checks "$PR_URL" --json name --jq length 2>/dev/null || echo 0)
  fi
  if [ "$CHECK_COUNT" -gt 0 ] && [ "$CHECK_COUNT" = "$PREVIOUS_COUNT" ]; then break; fi
  PREVIOUS_COUNT=$CHECK_COUNT
  sleep 10
done
if [ "$CHECK_COUNT" -gt 0 ]; then
  exec gh pr checks "$PR_URL" --watch --fail-fast --interval 30
fi
if [ "$PR_HEAD" != "$HEAD_SHA" ]; then
  echo "PR head ${PR_HEAD:-unknown} never matched local HEAD $HEAD_SHA"
  exit 4
fi
echo "No CI checks registered for $HEAD_SHA after 5 minutes"
exit 3
```

Run the block in one Bash call with `run_in_background: true`, with the PR URL and the checkout's absolute path assigned on the line before it, for example `PR_URL=https://github.com/owner/repo/pull/123 REPO=/Users/me/Local/repo`. Both values are required because the Bash tool keeps no variables between calls and a subagent's cwd resets. `REPO` is the absolute path of the checkout from step 1; when the PR reference is a number, `gh pr view <pr-ref> --json url -q .url` prints the URL.

Exit codes: 0 means all checks passed; 1 means a check failed (`--fail-fast`) or `gh` failed during the watch; 3 means no checks registered within 5 minutes (the repo may have no CI); 4 means the PR head never matched the local HEAD: push, or fix the `gh pr view` error it printed, and run again; any other non-zero means the block could not start (unset `PR_URL` or `REPO`, or a path that is not a checkout): fix it and run again. Monitor is the alternative when per-check events are wanted.

On exit 3, skip step 3. With comments=false, report that the PR has no CI checks and stop.

### 2. Gather PR Context (Parallel)

Launch these agents in parallel to collect all PR information simultaneously:

**Agent 1 — PR Details:**
```bash
gh pr view <pr-ref> --json number,headRefName,baseRefName,statusCheckRollup,url,title,body
```

**Agent 2 — Check Status:**
```bash
gh pr checks <pr-ref>
```

**Agent 3 — PR Diff:**
```bash
gh pr diff <pr-ref>
```

**Agent 4 — Review Comments (when comments=true):**
```bash
gh pr view <pr-ref> --json reviews,comments
gh api repos/{owner}/{repo}/pulls/{number}/comments
```

### 3. Fix Failing Checks (when checks=true)

#### 3a. Parallel Failure Analysis

For each failing check, launch a separate analysis agent in parallel:

**Agent per failing check:**
```bash
gh run view <run-id> --log-failed
```

Each agent:
1. Downloads and reads the failure logs for its check
2. Identifies the root cause
3. Determines which files need changes
4. Outputs a structured diagnosis: `{check_name, root_cause, files_to_change, proposed_fix}`

#### 3b. Parallel Fixes (Consolidation Pattern)

Partition diagnosed failures into groups by root cause. Use the **consolidation pattern** — launch each fix group as a parallel agent in its own worktree. Agents can freely edit overlapping files; the consolidator handles merges.

Before launching them, record BASE: the SHA `git rev-parse HEAD` prints in the checkout from step 1 (the PR head). Give each group's `architect` agent that checkout's absolute path as the repo, BASE, its own branch and an absolute worktree path (explicit worktree mode: the architect follows its Worktree BASE protocol). Prompt the consolidator with that checkout as the integration worktree, BASE, and merge as the integration mode.

**Per worktree agent:**
1. Apply the proposed fix from the analysis
2. Verify the fix makes sense in context (read surrounding code)
3. Make minimal, focused changes
4. Commit before finishing

**After all worktree agents complete**, launch the **consolidator** agent (`subagent_type: "consolidator"`) to merge all branches. Then launch a **verifier** agent (`subagent_type: "verifier"`) to confirm tests pass.

#### 3c. Commit and Push

After all fix agents complete, delegate to the `skills:commit` command with a descriptive message, then push:

```
Skill(skill="skills:commit", args="fix(<scope>): <description of what was fixed>")
```

```bash
git push
```

#### 3d. Monitor Checks

Follow **Wait for CI** (step 1) for the pushed commit. If checks still fail, repeat from 3a. Escalate to the user only if the same failure persists after a fix attempt.

### 4. Address PR Comments (when comments=true)

#### 4a. Parallel Comment Analysis

Group review comments by file. Launch a separate agent per file (or per independent comment group) in parallel:

**Agent per file/group:**
1. Read the referenced code and the reviewer's feedback
2. Determine what change is needed
3. Output a structured plan: `{file, line, comment_summary, proposed_change}`

#### 4b. Parallel Comment Fixes (Consolidation Pattern)

Launch each comment group as a parallel agent in its own worktree. Agents can freely edit overlapping files; the consolidator handles merges.

Before launching them, record BASE: the SHA `git rev-parse HEAD` prints in the checkout from step 1 (the PR head). Give each group's `architect` agent that checkout's absolute path as the repo, BASE, its own branch and an absolute worktree path (explicit worktree mode: the architect follows its Worktree BASE protocol). Prompt the consolidator with that checkout as the integration worktree, BASE, and merge as the integration mode.

**Per worktree agent:**
1. Apply the requested change (or closest reasonable interpretation)
2. Respect the reviewer's intent — don't make superficial changes
3. Verify the fix is consistent with surrounding code
4. Commit before finishing

**After all worktree agents complete**, launch the **consolidator** agent (`subagent_type: "consolidator"`) to merge all branches. Then launch a **verifier** agent (`subagent_type: "verifier"`) to confirm tests pass.

#### 4c. Commit and Push

Delegate to the `skills:commit` command, then push:

```
Skill(skill="skills:commit", args="fix(<scope>): address review comments")
```

```bash
git push
```

#### 4d. Monitor Checks

Follow **Wait for CI** (step 1) for the pushed commit. If fixing comments introduces new check failures, loop back to step 3.

### 5. Iterate If Needed

Continue iterating until:
- All enabled checks pass
- All comments are addressed (if comments=true)
- Or the same failure persists after a fix attempt (escalate to user)

## Important Notes

- Read failure logs carefully — the error message usually contains the fix
- Common check failures:
  - **tests**: Check test output, fix code or test
  - **build**: Check compilation errors
- When addressing comments, respect the reviewer's intent — don't just make superficial changes
- After each fix, commit with: `fix(<scope>): <description of what was fixed>`

## Test Failure Policy

**IMPORTANT:** There is no such thing as a "pre-existing" test failure. If any test fails - whether it appears related to the PR changes or not - you must fix it. The task always completes with completely passing tests. Do not dismiss failures as "unrelated to this PR."

## Exit Conditions

Stop iterating when:
- All checks pass (required - no exceptions)
- The same failure persists after a fix attempt (escalate to user)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…