DEV Community

Cover image for I built an unattended Claude Code loop that reviews PRs and works my Jira backlog
Alvaro Valarezo de la Fuente
Alvaro Valarezo de la Fuente

Posted on AI-assisted

I built an unattended Claude Code loop that reviews PRs and works my Jira backlog

Every developer knows this Tuesday: you're deep in a bug, Slack pings with "can you review this PR?", and by the time you get back to your own code you've lost the thread. Meanwhile the Jira backlog sits there — every ticket in it legitimate, and every one losing to whatever's on fire that day.

flowchart LR
    S["Slack ping"] --> C1["stop coding"] --> R["review PR"] --> C2["lost the thread"]
    B["Jira backlog"] -.->|"loses to\nwhatever's urgent"| N["stays untouched"]

Neither task needs me specifically — just consistent judgment, on a schedule that doesn't depend on how busy I am. So I built ultracode-live-engineer, a Claude Code plugin that wakes up on its own and handles both.

What it does

flowchart TD
    W(("⏰ Wake")) --> P1 & P2 & P3
    P1["👀 Slack Review<br/>mention + PR link → review"]
    P2["🔁 PR Follow-up<br/>fix feedback on own PRs"]
    P3["🎫 Jira Selection<br/>pick up a ticket"]
    P3 --> I["🛠️ Implement<br/>isolated worktree"]
    I -->|success| PR["✅ Open PR"]
    I -->|ambiguous| H["🚧 Escalate<br/>Jira comment + Slack DM"]
    H -.human replies.-> P3

One rule is non-negotiable: when it's not sure, it doesn't guess. Ambiguous cases get parked and handed to a human — never merged, never silently skipped.

Three weeks of real numbers

I let it run and log every pass. 163 wake-ups later:

flowchart TD
    subgraph Totals["Zero interrupts to me"]
        direction LR
        A["32 PRs reviewed"]
        B["4 PR follow-ups fixed"]
        C["13 tickets moved forward"]
    end

Partway through, I noticed the "nothing to do" pass — the most common one — was the slow one. Three independent checks were running one after another instead of at once, and mechanical yes/no checks were each burning a full AI call. Fixing both:

flowchart LR
    subgraph Before["Idle pass — before"]
        direction TB
        d1["190s median"]
        d2["10 agent calls"]
    end
    subgraph After["Idle pass — after"]
        direction TB
        e1["79s median"]
        e2["7 agent calls"]
    end
    Before -->|parallelize + batch| After

58% faster, 30% fewer agent calls — for the case that happens most.

How that compares to doing it by hand

The industry numbers aren't about typing speed — they're about waiting to be noticed. LinearB's 2026 benchmarks (8.1M PRs) put average-team PR pickup at 4–16 hours before review even starts; SmartBear's review research puts a manual review session at 60–90 minutes once someone sits down with it.

flowchart LR
    subgraph Industry["Industry (LinearB / SmartBear)"]
        direction TB
        i1["Pickup: 4-16h average team"]
        i2["Review session: 60-90 min"]
    end
    subgraph Loop["This loop"]
        direction TB
        l1["Pickup: next wake (minutes)"]
        l2["Full pass incl. review: 8.5 min"]
    end

One honest twist: DORA's 2025 report found that as AI-authored code volume rises industry-wide, human review time has actually gone up 441%, and 31% more PRs merge with zero review. AI made writing code faster — it didn't remove the review bottleneck. That's exactly why the escalate-to-human rule exists here instead of an autopilot that just merges.

Try it

claude
/plugin marketplace add AlvaroRaul7/ultracode-live-engineer
Enter fullscreen mode Exit fullscreen mode

Repo: https://github.com/AlvaroRaul7/ultracode-live-engineer

Top comments (0)