---
name: loop-verifier
description: 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: loop-engineering
keywords: maker-checker, code-review, quality-gate, approval, evidence
---

# Loop Verifier

## 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](/skills/minimal-fix) — The maker half of this split; smallest diff per one problem.
- [test-to-completion](/skills/test-to-completion) — Supplies the test evidence this checker demands.
