| 1 | # Skill: Ralph — Two-Pass Issue Scanning |
| 2 | **Confidence:** high |
| 3 | **Domain:** work-monitoring |
| 4 | **Last validated:** 2026-03-24 |
| 5 | |
| 6 | ## Context |
| 7 | Cuts GitHub API calls from N+1 to ~7 per round (~72% reduction) by separating list scanning from full hydration. |
| 8 | Addresses the scanning inefficiency described in issue #596. |
| 9 | |
| 10 | ## Pattern |
| 11 | |
| 12 | ### Pass 1 — Lightweight Scan |
| 13 | |
| 14 | ``` |
| 15 | gh issue list --state open --json number,title,labels,assignees --limit 100 |
| 16 | ``` |
| 17 | |
| 18 | **Skip hydration if ANY of these match:** |
| 19 | |
| 20 | | Condition | Skip reason | |
| 21 | |-----------|-------------| |
| 22 | | `assignees` non-empty AND no `status:needs-review` | Already owned | |
| 23 | | Labels contain `status:blocked` or `status:waiting-external` | Externally gated | |
| 24 | | Labels contain `status:done` or `status:postponed` | Closed loop | |
| 25 | | Title matches stale/noisy pattern (`[chore]`, `[auto]`) | Low-signal | |
| 26 | |
| 27 | ### Pass 2 — Selective Hydration |
| 28 | |
| 29 | For each issue surviving Pass 1: |
| 30 | |
| 31 | ``` |
| 32 | gh issue view <number> --json number,title,body,labels,assignees,comments,state |
| 33 | ``` |
| 34 | |
| 35 | Then apply normal Ralph triage logic. Rule of thumb: hydrate ≤ 30% of scanned list. If more than 30% survive Pass 1, tighten filter rules. |