## Scenario 1 — PR opened, no `ultrareview` label most common path

### Before #1569

✗ Workflow triggers on `opened` event
✗ Installs Claude Code (~6s CI)
✗ Calls `claude ultrareview "origin/main..HEAD"`
✗ CLI rejects in 400ms: "is not a branch in this repo"
✗ Empty `review.json` → fallback writes `{"verdict":"skipped"}`
✗ Posts a "verdict: skipped · 0s" PR comment
cost: ~15s CI minutes + 1 spam comment per PR

### After #1569

✓ Workflow gate: `label.name == 'ultrareview'` is false
✓ Job skipped immediately — no checkout, no install, no API
cost: ~0 CI minutes, 0 comments

## Scenario 2 — PR labeled `ultrareview` opt-in path

### Before #1569

✗ Same broken arg path as Scenario 1
✗ Reviewer adds label hoping for a real review
✗ Workflow runs, CLI rejects arg, posts "skipped"
✗ Reviewer confused — was a review run? Was it empty?

### After #1569

✓ Workflow gate fires (label match)
✓ Calls `claude ultrareview ${{ pr.number }}` — valid arg
✓ CLI fetches diff itself, runs review, returns JSON
✓ Comment step gates on `verdict != 'skipped'` → posts real findings

## Scenario 3 — Review legitimately empty (no findings) edge case

### Before #1569

✗ Comment step had no `verdict` awareness
✗ Always posted a comment, even empty/skipped ones
✗ Indistinguishable from "broken arg" failure mode

### After #1569

✓ Run step extracts `verdict` via `jq -r '.verdict'` as step output
✓ Comment step `if:` includes `steps.review.outputs.verdict != 'skipped'`
✓ Empty/skipped runs stay silent, real findings get posted

## Net impact

Past API spend on auto-runs | $0 CLI rejected args before any API call
Past CI minutes wasted | ~15s × every PR since #1542 merged
Past comment spam | 1 useless comment per PR
After #1569 | opt-in only · real reviews when triggered · no spam when skipped
Trigger today | Add the ultrareview label to any PR