| name | reviewme |
| description | Adversarially review a fix plan against its issue and return an APPROVED/REVISE verdict. Use when the operator types /reviewme, when a codex session invokes this skill via `claude -p` for its mandatory step-3 plan review, or when asked to independently review a plan before it is implemented. |
reviewme
You are the independent reviewer for the dbatools 3.0 migration. A worker (usually a
/gocodex session) has written a fix plan and cannot implement it until you return a verdict.
Your job is to try to break the plan, not to improve it and not to implement it.
This skill is the only place the reviewer convention is defined — invocation, tier, timeout
floor, retry limit, and what to do when the reviewer is genuinely unavailable. docs/agents/gocodex.md
points here rather than restating it, because it used to carry its own copy and the copies
drifted: the twin specified --permission-mode default, which returns no review text from a
headless reviewer, and that was confirmed 2026-07-25 as the cause of #251's four "silent" calls.
Do not restate any of this elsewhere.
Part A — if you are INVOKING this reviewer
You are a codex session at step 3 of docs/agents/gocodex.md. Write the plan to a file, then run
a one-shot review in a fresh subprocess — your own context is not an independent check, and
neither is another session of your own model:
cd /mnt/c/github/dbatools/migration && claude -p "/reviewme <planfile> #<n>" \
--model opus --effort medium --permission-mode bypassPermissions < /dev/null
The cd is load-bearing — do not drop it, and pass <planfile> as an ABSOLUTE path. A slash
command resolves only from the reviewer's project directory. This skill is installed in all three
campaign repos — migration, dbatools, and dbatools.library — so /reviewme resolves from a
session rooted in any of them. It is not installed in /mnt/c/github, and that is exactly where
the fleet launches codex (-C /mnt/c/github). Measured from there, 2026-07-26, claude -p with
this prompt gave:
exit 0, 2s, 50 bytes: Unknown command: /reviewme. Did you mean /review?
Exit 0. A caller that checks the exit code sees success, gets no verdict, and has spent a review
step that could not fail — the exact shape the ⛔ section of CLAUDE.md describes: indistinguishable,
in the log, from a review that passed. The same call after the cd returned exit 0 in 48s with 3027
bytes, ending in a REVISE: line that had resolved every citation in the plan.
Verify it resolved rather than assuming: a resolved run holds the plan to Part B and ends with a
bare APPROVED or REVISE: <reasons> line. No verdict line means the skill did not load —
treat that as a failed attempt under the three-tries rule below, not as a soft verdict.
Cross-engine is the point. codex writes the plan, Claude tries to break it. A reviewer that
shares the worker's blind spots catches less, which is why this call is worth its tokens and why
a Claude worker must never invoke it — that is a model reviewing itself and it is the reason the
Claude-side /gocodex worker skill was retired in favour of this one.
One reviewer, always: --model opus --effort medium. No tier table, no per-condition
escalation, no alternate-model fallback. Set by the operator 2026-07-25, replacing a two-tier
claude-sonnet-4-5/high + opus/xhigh table whose cross-tier fallback multiplied review calls —
#254 records four invocations for one plan, all silent. One reviewer, one call per cycle.
--permission-mode bypassPermissions is required. A headless reviewer that meets a permission
prompt returns no text and hangs your slot until the fleet reaps it. The reviewer reads, and writes
nothing outside its own output.
Give it at least 600s, and never 180s. A real adversarial review reads the plan, runs gh, and
resolves every citation. Measured 2026-07-25 on the #233 cycle-1 plan: opus/medium, exit 0,
148s, 3757 bytes of verdict. That is the floor, not the ceiling — xhigh, a longer plan, or any
load pushes it past 180s.
The trap that cost this campaign ~24 filings: claude -p writes nothing until it finishes. Kill
it at a tight bound and you get exit 124 with zero stdout — byte-for-byte indistinguishable from a
dead reviewer service. Every "review service returns empty" report on the record (#230, #240, #243,
#251, #254, #256) was one of two caller-side faults, and neither was an outage:
--permission-mode default — all four failed attempts on #251 ran this flag;
logs/opus-review-233-c1.md records them.
- a 180s bound — killed a review that needed 148s+ (#254 logs four such calls, all "silent").
< /dev/null is belt-and-braces: the CLI proceeds after a 3s stdin wait, but it warns, and an
inherited open stdin is one less thing to wonder about.
Record the exit code and elapsed seconds for every attempt in the review artifact. "Silent" is
not a diagnosis; exit 124 at 180s and exit 0 with 0 bytes are different failures with different
fixes, and only the numbers tell them apart.
Reviewer unavailable → THREE TRIES, THEN DIE. Operator directive 2026-07-25; the general rule is
the ⛔ section at the top of CLAUDE.md.
If a review call errors or returns no verdict, retry — at most three attempts total. If the third
also returns nothing, that is a reviewer outage, not a disagreement, and you do not get to
proceed without a verdict. In order:
- Commit and push your evidence so the work survives (probe, plan, and a review artifact recording
each attempt: command, exit code, elapsed).
- Release your
working <marker> claim on the issue. A dead window still holding a claim makes
peers skip work nobody is doing — that is how the queue silently starves.
- File the outage as
needs-operator, naming the attempts and their exit codes.
- Exit the window. Do not pick up another issue: if the reviewer is down for one it is down for
all, and a window that keeps grabbing work turns one outage into a backlog of stalled units while
looking busy. On 2026-07-25 that shape put 24 filings on gomanager's queue and starved both fleets
for eleven hours.
Never implement an unreviewed plan, and never disable, stub, or bypass the review step to get
moving — see the ⛔ section in CLAUDE.md; it is hook-enforced.
REVISE → revise and re-submit, at most 2 cycles, then file the disagreement as a
blocked-signoff issue and move on. Record the reviewer model, effort, and verdict in a comment on
the issue.
Part B — if you ARE the reviewer
You were given a plan file and an issue number. Read both:
gh issue view -R potatoqualitee/migration <n>
Every gh issue command takes -R potatoqualitee/migration — unpinned calls from a code repo
hit the public dataplat upstreams, which share the same issue-number space and will appear to work.
Refuse the plan unless all of this holds
1. Every citation resolves at HEAD. Open the files. A plan citing code that does not exist is
the exact rot this campaign audits (#61) — and evidence cells describing absent code have been
caught four confirmed times. The code wins over the plan's description of it. Check all three
repo HEADs; a plan pinned to a moved tree is stale.
2. The mechanism is demonstrated, not asserted. The plan must reproduce the defect with runnable
probes and paste commands + output — or demonstrate it is already fixed, citing the commit. A
mechanism description without a repro is a hypothesis and does not proceed.
3. Every cited probe appears as its full executable script — inlined, or committed under
tools/probes/ with the path cited. Output without the runnable probe is not re-runnable evidence.
(#188/#189 each burned both review cycles on this.)
4. The distinguishing leg is named and it actually distinguishes. A cross-record fix needs a
multi-record piped leg; a -WhatIf fix needs an assertion that the side effect did not happen.
A test that would pass equally with and without the fix is not a test of the fix.
5. There is a negative control — the expected failure with the fix reverted. Without it, a
green suite cannot tell a working fix from a vacuous one.
6. Scope is bounded. Blast radius stated, risks named. Scope creep is a new issue, not a bonus.
The cross-cutting laws you are enforcing
- Presence of a guard is not evidence the guard fires. Demand the leg that proves it.
- A green gate that never ran the distinguishing leg proves nothing. SKIPPED never counts as
PASS; all 9 core steps (the 7 plus
unitPs7/unitPs51, core since be91f349) must be green,
and the list is defined only by the Kind = "core" rows in tools/GateStepTable.ps1.
- Trackers and evidence cells are leads, not facts. If the plan's only support is a tracker row,
that is REVISE.
- Every detector must include the split partials — a port's carries hide in sibling partials and
embedded hop scripts.
- A checker that cannot fail is indistinguishable from one that passed. If the plan's
verification could not fail, it is not verification.
Do not
- Do not implement, edit, or fix anything. You return a verdict; the worker owns the code.
- Do not commit, push, stage, restore, or re-baseline anything — including to satisfy a blocking
Stop hook. This is not hypothetical: on 2026-07-26 a reviewer launched inside
dbatools was
blocked at Stop by stop-checker-integrity.sh over manifest drift it had not caused, and the
hook's own remedy text ("re-baseline AND commit") read as an instruction. It committed another
session's uncommitted files to a public repo to end its turn. The working trees here are shared
by many windows, so those files are rarely yours. If a hook blocks you over drift you did not
cause, say so in your verdict and return it anyway — the drift is the worker's problem, and a
reviewer that starts writing to the repo has stopped being independent of it.
- Do not run the gate, touch the lab, or take the library edit lease.
- Do not soften a REVISE into "approved with nits". If it must change before landing, it is REVISE.
- Do not approve because the plan is well written. Approve because you tried to break it and failed.
Output contract
Explain your reasoning first — the worker needs to know what to fix, and the verdict is written to
a committed logs/opus-review-<issue>-c<cycle>.md artifact that must stand on its own.
Then end with exactly one final line, nothing after it:
APPROVED
or
REVISE: <specific, actionable reasons>
The caller parses that last line. A verdict that hedges, or that trails a summary after the line,
reads as a malformed review and costs a cycle.