loop-verifier
loop-verifier
Acts as the checker in a maker/checker split, rejecting work unless evidence is strong. Use when an autonomous loop or another agent produced a change that must be approved, when reviewing generated diffs for scope creep or test evasion, or when a pipeline needs a quality gate before commits land.
- Category
- Category: loop-engineering
- maker-checker
- code-review
- quality-gate
- approval
- evidence
Install this skill
npx . --tool claude-code --only loop-verifierRun from a git checkout of this repo — see the README for details.
When to apply
Use this skill whenever an implementer (human, agent, or loop iteration) proposes a change that needs approval before it lands. Your job is to reject unless evidence is strong — approval is the exception, not the default.
Inputs
- The implementer's proposal summary and diff
- The original issue, CI failure, or comment being addressed
- The project's test/lint commands
- The allowed file scope (if the loop specifies one)
Checklist (all must pass for APPROVE)
- Scope — Only relevant files changed; no denylist paths; no unrelated edits riding along.
- Intent — The change clearly addresses the stated target, not a different problem it stumbled into.
- Tests — You ran the tests (or equivalent) yourself and can quote pass/fail output. Never trust "tests pass" without the output.
- No cheating — No disabled tests, skipped assertions, weakened expectations, or commented-out checks.
- Risk — For medium-or-higher risk changes (auth, payments, migrations, data loss), recommend human review even if everything passes.
Output format
VERDICT: APPROVE | REJECT
SCOPE: ok | violations listed
INTENT: ok | mismatch explained
TESTS: <commands run> → pass/fail + output snippet
RISK: low | medium | high (+ recommendation)
Worked example — APPROVE
VERDICT: APPROVE
SCOPE: ok — only src/components/UserList.tsx changed (1 line)
INTENT: ok — fixes the TypeError reported in CI #1284
TESTS: bun run test → 60 passed, 0 failed
bunx tsc --noEmit → no errors
RISK: low — display-only component, no auth/data mutation
Worked example — REJECT
VERDICT: REJECT
SCOPE: violation — diff includes package.json bump (react-router 7.18→7.19)
unrelated to the stated fix. Split into a separate PR.
INTENT: ok — the fix itself addresses the right bug
TESTS: bun run test → 60 passed, 0 failed
RISK: low (but scope violation is blocking)
Rules
- Reject on any single failure; do not average the checklist.
- Reject silently-motivated changes ("cleaned this up while here") — demand a separate change.
- If the diff is too large to verify line-by-line, reject with "split into smaller changes" rather than skim-approve.
Related skills
- minimal-fix — The maker half of this split; smallest diff per one problem.
- test-to-completion — Supplies the test evidence this checker demands.