Skip to content

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-verifier

Run 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)

  1. Scope — Only relevant files changed; no denylist paths; no unrelated edits riding along.
  2. Intent — The change clearly addresses the stated target, not a different problem it stumbled into.
  3. Tests — You ran the tests (or equivalent) yourself and can quote pass/fail output. Never trust "tests pass" without the output.
  4. No cheating — No disabled tests, skipped assertions, weakened expectations, or commented-out checks.
  5. 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.