Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when asked to find bugs, hunt for correctness issues, sweep a codebase for defects, or verify a repo behaves as intended. Not for style or architecture review; this is defect-finding only.
.claude/skills/escoffier-labs-bug-hunt/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | -40% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 3% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-12 | ✗→✓ | ▲ Improved | -47% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 5% | 0% |
A correctness sweep that only reports bugs it failed to refute. Finders generate candidates; verifiers try to kill them; survivors make the report. The single biggest failure mode of agent bug-hunting is plausible-but-wrong findings, so verification is not optional.
Read-only. Finding bugs and fixing them are separate engagements.
Sweep with each lens. With parallel subagents available, one finder per lens; otherwise sequential passes.
| Lens | Hunting for | |------|-------------| | Logic | Inverted conditions, off-by-one, wrong operator, unreachable branches, broken invariants | | Error handling | Swallowed exceptions, missing error paths, errors that corrupt state before propagating, misleading messages | | Edge cases | Empty/nil/zero inputs, unicode, huge inputs, boundary values, first/last iteration | | Concurrency | Races, missing locks, shared mutable state, TOCTOU, async ordering assumptions | | API misuse | Contract violations against libraries and the project's own interfaces, ignored return values, resource leaks, lifecycle errors |
Focus finders on code that is reachable and load-bearing: entry points, hot paths, recently changed files (git log --since is a good prior). A bug in dead code is info, not a finding.
Two deep lenses live as their own skills: latent-premises for unguarded assumptions that hold today with no trigger yet, and retry-safety for side effects that double-apply on a re-run. Reach for them when the sweep keeps surfacing "could break later" candidates that fail the trigger rule.
Every candidate gets an adversarial pass before it may appear in the report. The verifier's job is to REFUTE the finding, default skeptical:
(unverified)).When tests can be run safely (no external dependencies, sandboxed), a failing reproduction test is the gold standard for confirmation and should be included in the finding as a sketch, not committed.
Same spine as line-check so findings compose. Severity: critical (data loss, corruption, security-adjacent) / high (wrong results on common inputs, crashes) / medium (wrong on edge cases) / low (latent, needs unlikely conditions) / info. Effort is the fix cost: S / M / L.
markdown# bug-hunt report: <repo> (<date>) ## Verdict Paragraph: overall correctness posture, the scariest confirmed bug. ## Scorecard | Lens | Score (0-5) | Summary | ## Findings ### [SEVERITY] Short imperative title - **Lens:** which lens found it - **Where:** file:line - **What:** the defect, concretely - **Trigger:** the concrete input or sequence that hits it - **Why it matters:** consequence - **Fix:** specific action - **Effort:** S / M / L ## Backlog Numbered, leverage-sorted: `N. [SEVERITY/EFFORT] title (lens)` ## Not checked Lenses or areas skipped and why; candidates that were refuted (count only).
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | pass→pass | 10,336 | 17,938 | +74% | 1 | 1 | 0% | 2,222 | 4,681 | +111% | 0 | 0 | — |
case-01 | fail→fail | 39,216 | 1,794 | -95% | 1 | 1 | 0% | 6,270 | 1,048 | -83% | 0 | 0 | — |
case-02 | fail→fail | 33,596 | 2,658 | -92% | 1 | 1 | 0% | 5,997 | 1,089 | -82% | 0 | 0 | — |
case-03 | pass→fail | 4,622 | 4,203 | -9% | 1 | 1 | 0% | 1,035 | 1,133 | +9% | 0 | 0 | — |
case-04 | pass→fail | 12,673 | 4,295 | -66% | 1 | 1 | 0% | 2,095 | 1,162 | -45% | 0 | 0 | — |
case-06 | fail→fail | 14,011 | 4,144 | -70% | 1 | 1 | 0% | 2,296 | 1,536 | -33% | 0 | 0 | — |
case-07 | fail→pass | 14,829 | 2,947 | -80% | 1 | 1 | 0% | 2,316 | 1,380 | -40% | 0 | 0 | — |
case-08 | fail→fail | 11,818 | 7,035 | -40% | 1 | 1 | 0% | 1,978 | 2,016 | +2% | 0 | 0 | — |
case-09 | fail→fail | 8,304 | 1,588 | -81% | 1 | 1 | 0% | 1,386 | 1,112 | -20% | 0 | 0 | — |
case-14 | fail→fail | 10,998 | 4,143 | -62% | 1 | 1 | 0% | 1,794 | 1,612 | -10% | 0 | 0 | — |
case-10 | fail→pass | 9,708 | 4,413 | -55% | 1 | 1 | 0% | 1,543 | 1,594 | +3% | 0 | 0 | — |
case-11 | fail→pass | 11,468 | 6,454 | -44% | 1 | 1 | 0% | 1,787 | 1,942 | +9% | 0 | 0 | — |
case-12 | fail→pass | 13,355 | 2,127 | -84% | 1 | 1 | 0% | 2,204 | 1,179 | -47% | 0 | 0 | — |
case-13 | fail→pass | 10,605 | 6,249 | -41% | 1 | 1 | 0% | 1,793 | 1,877 | +5% | 0 | 0 | — |
case-15 | fail→pass | 10,230 | 4,198 | -59% | 1 | 1 | 0% | 1,728 | 1,600 | -7% | 0 | 0 | — |
case-16 | fail→pass | 14,970 | 10,120 | -32% | 1 | 1 | 0% | 1,263 | 1,405 | +11% | 0 | 0 | — |
case-17 | pass→pass | 4,964 | 1,443 | -71% | 1 | 1 | 0% | 862 | 1,119 | +30% | 0 | 0 | — |
case-18 | pass→pass | 5,833 | 1,859 | -68% | 1 | 1 | 0% | 1,001 | 1,188 | +19% | 0 | 0 | — |
case-19 | pass→pass | 8,338 | 6,060 | -27% | 1 | 1 | 0% | 1,381 | 1,897 | +37% | 0 | 0 | — |
case-20 | fail→pass | 7,683 | 1,973 | -74% | 1 | 1 | 0% | 1,304 | 1,220 | -6% | 0 | 0 | — |
case-21 | pass→pass | 11,604 | 4,222 | -64% | 1 | 1 | 0% | 2,009 | 1,611 | -20% | 0 | 0 | — |
case-22 | pass→pass | 12,838 | 4,309 | -66% | 1 | 1 | 0% | 2,032 | 1,540 | -24% | 0 | 0 | — |
case-23 | fail→pass | 9,521 | 6,125 | -36% | 1 | 1 | 0% | 1,725 | 1,986 | +15% | 0 | 0 | — |
case-24 | pass→pass | 9,549 | 1,988 | -79% | 1 | 1 | 0% | 1,546 | 1,159 | -25% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 20 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +29 percentage points is the difference between those two pass rates over the 20 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.