Iterative multi-model review-and-fix loop. Repeatedly runs the review-multi-model panel over the working tree, applies the verified fixes, and re-reviews - review → fix → review → fix - until a pass f
Run the [review-multi-model](../review-multi-model/SKILL.md) panel in a loop: review → apply verified fixes → re-review → fix → … until a pass finds nothing that matters (defined below). This exists because a fix can introduce a new defect - the review that clears one issue often surfaces another the previous pass couldn't see, so a single review+fix is rarely a fixpoint.
This large 2,318-word instruction set is purpose-built for testing & qa work in AI coding agents. Paste directly into your CLAUDE.md or AI agent settings.
Run the [review-multi-model](../review-multi-model/SKILL.md) panel in a loop: review → apply
verified fixes → re-review → fix → … until a pass finds nothing that matters
(defined below). This exists because a fix can introduce a new defect - the
review that clears one issue often surfaces another the previous pass couldn't see,
so a single review+fix is rarely a fixpoint.
Why loops run long, and what prevents it. Without discipline, rounds past ~4 keep
surfacing real but small gaps one or two at a time - a state with no story in round
5, another in round 7, a stale comment in nearly every round. Missing stories and false
comments are real defects (a state with no story is invisible to visual testing). The
failure is the drip: reviewers hunt and report what catches their eye, and each fix
creates new states and comments nobody sweeps. So the reviewer brief makes completeness
an enumerated sweep (list every state, behavior and affected comment/doc, then check
each), and the fix step below sweeps its own fixes. Gaps should arrive in round 1 in
bulk, not trickle out. Scope creep feeds the loop too: out-of-scope fixes are new
surface each round reviews fresh.
CRITICAL: Do NOT enter plan mode. Execute directly, iterate, and present the
per-iteration progress and a final convergence summary inline. Do not write
results anywhere except review-multi-model's own scratch dir.
The loop's whole premise is that round N re-reviews exactly the code round N-1
just edited. review-multi-model's fix step (--fix) writes to the working tree, so
the loop only round-trips fixes when the thing being _reviewed_ is also the working
tree - i.e. review-multi-model's branch mode (working tree vs. merge-base).
release/1.x), which may not be
the repo default. Prefix review-multi-model's branch-mode block (in the same Bash
call - shell vars don't persist between calls) with its base override set to that
branch: REVIEW_BASE=$(gh pr view <n> --json baseRefName -q .baseRefName) || exit 1
- abort if that lookup fails rather than letting the base silently fall back to the
repo default. Fetch that base fresh once before looping (git fetch origin
"$REVIEW_BASE") so a stale local origin/<base> doesn't fold already-merged
changes into the diff. Do not loop on gh pr diff: that reflects the _pushed_
PR, never the local uncommitted fixes (which this loop does not commit), so no round
could observe its own fixes.
--staged is not supported and is not a pass-through flag. review-multi-model fixesgit diff --staged would show the
unchanged index every round and the loop would never converge. For a one-shot
staged review, run /review-multi-model --staged (its --fix writes to the working
tree, so git add the result afterward if you want it back in the index).If the user passes a PR that is not checked out, say so and stop before iteration 1
(gh pr checkout <n> first) - do not switch their branch/worktree yourself, and a
fix loop that cannot see its own fixes is pointless anyway. --claude-only /--codex-only pass through unchanged; the fix step is always on (it's a fix loop).
The panel is Claude + Codex. When Codex is unavailable (usage limit, not logged in), run
a second independent Claude reviewer (a fresh agent with its own context, your
strongest model) as the second seat rather than stalling the loop. Two passes with
independent context still catch complementary defects. Say in the report that Codex
didn't run (see review-multi-model's degraded-panel rule).
Classify every verified finding into one of two buckets - this, not the raw count,
drives the loop:
When unsure, ask: "Would I block the PR on this if a human reviewer raised it?" If
not, it's polish.
Fix findings that are in the change the user asked for. A finding about adjacent
code the branch didn't set out to change - a pre-existing gap, a related subsystem, a
"while we're here" hardening - goes on a follow-up list in the final report, not
into the diff. Every out-of-scope fix is new surface the next round reviews fresh, which
is exactly how a loop keeps "finding new things" forever.
One iteration = one complete review-multi-model run with its fixes applied: its review
phase (compute the working-tree diff → dual reviewers → adjudicate → present)
followed by its fix step (--fix - apply the verified, agreed fixes). Follow
the [review-multi-model](../review-multi-model/SKILL.md) skill verbatim each round - do not reimplement the
review; this skill only wraps it in a loop. Every round starts fresh (new diff,
new scratch dir, two fresh reviewers), so a regression a fix introduced shows up
next round.
Each iteration is a review followed - only if needed - by a fix:
--max-iterations bounds the run; it defaults to 5. Convergence is decided by a
review with nothing that matters, never assumed after a behavior fix. If you reach the cap
and the last review still had findings, you will have applied that round's fixes
without a further review to confirm them - report those as applied but
unconfirmed, list the findings open as of the last review, and suggest re-running
with a higher --max-iterations to confirm.
Fingerprint a finding by the defect and where it lives - the file plus the
specific construct/region it points at (or the thing a fix would change) - matched
semantically. Two findings are "the same" if they describe the same defect in
the same place, even if the two rounds word it differently ("missing null
guard" vs. "nullable value dereferenced") or the line number drifted because
edits above it shifted the file. Do not match on exact wording or line number - that
lets one persistent defect masquerade as a new one and churn to the cap.
--max-iterations, or if round 5
itself found a matters bug (then one more confirming round, and stop).
{A}→{A,B}→{A,B,C} where the fixes for A, B never take does trip
it - A alone stalls the loop.)
- Oscillation - a finding you applied a fix for disappeared and then
reappeared in a later round. Because the reviewers are non-deterministic, key
this on _fixed-then-returned_, not mere absence (a finding missed in one pass and
re-found later was never fixed - that's not oscillation, keep going). A genuine
fixed→gone→back flip-flop means two fixes are fighting; stop and flag it.Report the stuck or flip-flopping finding(s) so the user can break the cycle.
Never loop forever. If you are unsure whether the set is shrinking, err toward
stopping and reporting - a human deciding on 2 residual findings beats an agent
burning tokens on an infinite churn.
Report the trajectory and final state plainly - what each round caught that mattered
(one line each), why it stopped, the polish applied in bulk, and anything left
unresolved, including the out-of-scope follow-up list. If it converged, say the diff is clean per the panel. If it stopped
on the cap or a stuck finding, list what remains open and recommend the next step (a
human decision or a targeted manual fix). Then - only if the user asks - commit the
accumulated fixes.
Read the trajectory as data about the rules, not just about the diff. A small change
that took several rounds is telling you which defect classes the conventions currently
fail to prevent - each matters finding is one a rule or lint guard could have caught
before the first round ran. End the report by naming the recurring classes and offering
[add-rule](../add-rule/SKILL.md) for the ones that generalize.
Review Loop is a free testing & qa skill for AI coding agents. Iterative multi-model review-and-fix loop. Repeatedly runs the review-multi-model panel over the working tree, applies the verified fixes, and re-reviews - review → fix → review → fix - until a pass f. It provides a specialized system prompt that configures your agent with testing & qa expertise.
Copy the system prompt below and paste it into your CLAUDE.md file or Claude Code's custom instructions to activate Review Loop.
Review Loop is compatible with Claude Code, Cursor, GitHub Copilot, Windsurf, OpenClaw, Cline, and any AI agent that supports custom system prompts or .cursorrules files.
Yes, Review Loop is completely free and open source. The full source is available on GitHub at https://github.com/uiverify/uiverify/blob/main/packages/skills/skills/review-loop/SKILL.md. You only need a subscription to the AI agent you use it with.
Weekly roundup of top Claude Code skills, MCP servers, and AI coding tips.