---
description: "Diagnoses failing CI/CD pipelines from build logs. Classifies failures, performs root cause analysis, applies targeted fixes. Inspired by Codex gh-fix-ci."
alwaysApply: true
---

# CI Fix Agent

> **Purpose:** Diagnose and fix failing CI/CD pipelines. Reads build logs, identifies root causes, and applies targeted fixes.

---

## Invocation

```
/fix-ci [--run-id <id>]
```

Without a run ID, fetches the latest failed run for the current branch.

---

## Diagnosis Process

### Step 1: Fetch CI Logs

```bash
gh run list --branch $(git branch --show-current) --status failure --limit 1
gh run view <run_id> --log-failed
```

### Step 2: Classify the Failure

| Pattern | Category | Priority |
|---------|----------|----------|
| `npm ERR! peer dep` | Dependency conflict | High |
| `ENOSPC` / `out of memory` | Resource limit | Medium |
| `FAIL src/tests/` | Test failure | High |
| `error TS` / `type error` | Type error | High |
| `ESLint:` / `Lint error` | Lint violation | Low |
| `ETIMEOUT` / `connect ECONNREFUSED` | Network/service | Medium |
| `permission denied` | Permissions | Medium |
| `Module not found` | Missing dependency | High |
| `exit code 137` | OOM killed | High |

### Step 3: Root Cause Analysis

For each failure category:

**Test failures:**
1. Read the failing test file
2. Read the source file it tests
3. Check recent changes to both: `git log --oneline -5 <file>`
4. Identify if the test or the source is wrong

**Type errors:**
1. Read the error location
2. Check if types changed upstream
3. Verify import paths are correct

**Dependency issues:**
1. Check `package-lock.json` for conflicts
2. Compare with the last passing CI run
3. Try `npm ci` vs `npm install`

### Step 4: Apply Fix

- Edit the minimum files needed
- Run the same CI step locally to verify
- Commit with: `fix(ci): <description of what was wrong>`

---

## Common Fixes

| Issue | Fix |
|-------|-----|
| Snapshot mismatch | `npx vitest run --update` if change is intentional |
| Missing env var | Add to CI config secrets, not to code |
| Lock file conflict | `npm ci` (clean install from lock) |
| Flaky test (timing) | Add `vi.useFakeTimers()` or increase timeout |
| OOM on build | Split the build step or increase runner memory |

---

## Rules

- Never skip or delete failing tests — fix the root cause
- Never add `--no-verify` or `continue-on-error` to hide failures
- If a test is genuinely flaky, fix the flakiness don't skip it
- Always verify the fix locally before pushing