Architect Review — Adversarial Completeness & Wiring
An architect-level adversarial review for completeness and integration, run on a
finished implementation. It answers the question the other review skills don't:
"Do a deep pass at everything you built and make sure it's wired properly and works
as intended. Find gaps, bits we didn't implement, code created but never wired,
failure cases, edge cases."
This skill finds first, then fixes what is CRITICAL — the same review-then-fix shape
/ship-it Step 6 drives around /review-pr. The reviewer subagent is a pure finder: it
reports ranked, evidence-backed findings and edits nothing. Then the main loop applies
a fix for each CRITICAL finding and re-dispatches a fresh reviewer to verify, converging
or capping at 3 passes like /spec-review-codex. IMPORTANT and below stay report-only.
Pass a bare report-only token to skip the fix loop entirely (/ship-it Step 7 does —
its conductor owns its own fix/commit loop).
Where it sits in the family:
/code-review, /review-pr — line-level correctness on the diff.
/spec-review-codex / -local — harden the spec, before any code exists.
/architect-review-pr — completeness & wiring of the finished feature. This skill.
Why a fresh subagent (the adversarial mechanism). The main loop built this code,
so it shares the author's blind spots — the same gap in reasoning that left code unwired
also prevents noticing it on self-review. A fresh Agent subagent re-derives "is this
actually reachable / complete?" from the code alone, with no memory of how it got
written. Same independence rationale as spec-review-codex, but a Claude subagent
instead of the codex CLI, so the skill has no external CLI dependency and installs
anywhere.
Why the reviewer never fixes. The finder's value is a static tree and a clean
adversarial stance — a reviewer that edits mid-review reviews a moving target and starts
defending its own patches. So fixing is the main loop's job, between passes, and every
verification pass is a new fresh-context subagent reading the tree as it now stands.
Findings below CRITICAL are the user's call, never auto-fixed.
Flow
Step 0 — Preflight & scope
In a git repo? Run git rev-parse --is-inside-work-tree. If it fails, STOP with:
"Not in a git repository — nothing to review."
Split the argument before reading any of it as scope. Strip two tokens first:
- a
report-path=<absolute path> token (that is how /ship-it passes
$RUN_DIR/architect-review.md) — take it as the report path;
- a bare
report-only token — it disables the fix loop (Step 4).
Remove both from the argument. Whatever remains — possibly nothing — is the scope.
Doing this first is the point: read in the other order, a caller's report-path=…
looks exactly like "the user named a target" in step 3, and the skill reviews its own
output path instead of the branch.
An explicit argument overrides everything. If what remains names a target (a file, a
directory, or a feature description), that IS the scope — skip diff computation and
review exactly what was named (still trace the whole repo for reachability).
Otherwise, scope to the branch diff. Resolve the base branch: use main if it exists, else master (git rev-parse --verify <name>). Then compute:
- changed-file list:
git diff --name-only <base>...HEAD
- full diff:
git diff <base>...HEAD
(Three-dot <base>...HEAD diffs against the merge-base — only what this branch
changed, not unrelated drift on the base.)
No diff AND no scope left after the split (you are on the base branch, or nothing is
committed) → ask the user what to review. This is the only blocking question — do not
guess. Bare tokens with nothing else count as "no argument": report-path=… says where
to write and report-only says not to fix — neither says what to review.
Finish resolving the report path. If step 2 found a report-path=, use it verbatim.
Otherwise mint it:
REPORT_PATH="${TMPDIR:-/tmp}/architect-review-pr-$(date +%s).md". Hold it in a variable —
the same value goes into the subagent prompt and is read back in Step 3. Never resolve
the report by globbing architect-review-pr-*.md: a stale report from an earlier session
on a different branch satisfies that glob, and presenting it as this run's findings is a
worse failure than having no report at all.
Announce the resolved scope in one line, then proceed:
"Architect-reviewing <scope><, oracle: path | code-only><, report-only>. Dispatching the subagent."
Step 1 — Discover the intent oracle (best-effort)
The reviewer tells "looks fine" from "incomplete feature" by knowing what was supposed
to exist. Auto-discover, best-effort — none of these is required:
- Newest design spec: the highest date-prefixed
docs/superpowers/specs/*-design.md.
- Implementation plan if present:
tasks/ (e.g. tasks/dex-plan.md, tasks/prd.json)
or the newest docs/superpowers/plans/*.md.
If found, pass it to the subagent as the intent oracle — the source of truth for
which promised features/tasks must be present and wired. If none is found, the review
proceeds code-only: completeness is judged purely from the code's own internal
promises (referenced-but-missing, defined-but-unwired). Note in the report whether an
oracle was used. The oracle is an enhancement, never a precondition.
Step 2 — Dispatch ONE architect-review-pr subagent
Dispatch a single fresh subagent via the Agent tool (subagent_type: general-purpose).
Compose the prompt from the template below, filling <BASE>, <SCOPE>, <ORACLE>, and
<REPORT_PATH>. The subagent writes the report file itself and reports only — the report
path is the one file it may create, and it must edit nothing else. One subagent, not a panel
(see Deliberate simplifications). This dispatch is review pass 1; the Step 4 fix loop reuses
this exact prompt for its verification passes.
Step 3 — Report
- Read the report at
REPORT_PATH — the exact path from Step 0.6, not a glob. The
subagent authors that file; the conductor does not write it from the return message. A
subagent that completes its review and then idles without returning sends no message, so a
conductor that writes what it "received" produces no report at all — and one that globs
a timestamped pattern silently picks up another branch's stale report.
- If
REPORT_PATH does not exist, say exactly that ("the subagent produced no report at
<path>") and stop. Do not re-dispatch, do not re-ask the subagent (a direct re-ask
does not recover a lost hand-off), and do not fall back to a glob.
- Present the ranked findings in chat: the summary counts, the findings most-severe
first, and the completeness verdict.
- No CRITICAL findings, or
report-only was passed → STOP here. Fix nothing.
IMPORTANT and below are never auto-fixed — they are the user's call. Otherwise
continue to the fix loop.
Step 4 — Fix loop (CRITICAL only; skipped by report-only)
CRITICAL findings are fixed by the main loop and verified by a fresh reviewer — the
fix/re-review shape of /spec-review-codex, capped at 3 review passes total (the
Step 2 dispatch counts as pass 1).
Each pass:
- Apply a fix for every CRITICAL finding in the latest report, in the main loop,
guided by the finding's Location / Evidence / Suggested fix. Announce each as you
apply it:
<location> — <one-line fix>. Working tree only — never commit; the
user owns git. Stay in scope: each fix answers its finding, nothing else. Skip a
CRITICAL only if you judge it a false positive despite the evidence gate — say so,
with your counter-evidence.
- If every CRITICAL was skipped (all judged false positives), stop — an unchanged
tree only re-yields the same report. Present the skips; the user arbitrates.
- Re-dispatch a fresh reviewer — Step 2's prompt verbatim, same scope and oracle,
plus one line appended to the scope block: "Uncommitted fixes in the working tree
are part of the feature under review." (The subagent reads the tree, so it sees
them; the line stops it from reporting the dirty tree itself as a finding.) New
report path per pass —
REPORT_PATH_N="${REPORT_PATH%.md}.pass-<N>.md" — never
overwrite an earlier pass's report, never glob.
- Read the new report from its exact path. Missing file → same rule as Step 3.2:
say so and stop; the previous pass's report plus the fixes applied stand as the
result. Otherwise:
- Zero CRITICALs → converged. Present the final report, the list of fixes
applied, and stop.
- A fixed CRITICAL comes back unchanged → the fix is contested; do not ratchet.
Present both positions (the fix you applied, the reviewer's re-finding) and stop —
the user arbitrates.
- New or remaining CRITICALs, and fewer than 3 passes run → next pass.
After 3 passes, stop even if CRITICALs remain: present the leftovers most-severe first
and say the cap was hit. Every pass's report stays on disk as the audit trail.
The subagent prompt
Compose this at dispatch, substituting <BASE>, <SCOPE>, <ORACLE>, and <REPORT_PATH>:
You are a fresh-context software architect reviewing a FINISHED implementation for
COMPLETENESS and WIRING. You did not write this code and have no memory of how it was
built — re-derive everything from the code itself. You are READ-ONLY on the repository:
trace, reason, and report. Do not edit or delete any file, and create exactly one — your
report at <REPORT_PATH> (see Output). Nothing else.
## What to review (scope)
<SCOPE>
# substitute exactly ONE of:
# (a) branch diff:
# "The feature is the change on this branch vs <BASE>. Get the changed files with
# `git diff --name-only <BASE>...HEAD` and the full diff with
# `git diff <BASE>...HEAD`. Changed files:
# <name-only list>"
# (b) explicit target:
# "Review this target: <argument>. Trace how it is (or isn't) integrated into the
# rest of the repository."
Focus your FINDINGS on the feature above, but trace the ENTIRE repository with Grep and
Read to confirm whether new code is actually reached. A diff-only review cannot tell
"created but not wired" from "wired elsewhere" — only whole-repo tracing can.
## Intent oracle
<ORACLE>
# substitute exactly ONE of:
# if found:
# "Here is the source of truth for what this feature was supposed to be. Anything it
# promises that is absent or unwired is a Missing/Incomplete finding:
# <spec/plan contents or path>"
# if none:
# "No design spec or plan was found. Review CODE-ONLY: judge completeness from the
# code's own internal promises (referenced-but-missing, defined-but-unwired). Do not
# invent requirements the code never implies."
## Findings taxonomy (run this fixed checklist)
- Unwired — a symbol / file / endpoint / handler / migration defined in the changeset
but never invoked, registered, exported, routed, or scheduled.
- Missing — referenced by the changeset (or promised by the oracle) but never defined.
- Incomplete — partial vs. stated intent: stub branches, TODO / pass / NotImplemented,
half-handled cases, a config flag/field read but never acted on, a code
path created but not finished.
- Bug/edge — null / empty / error / boundary paths the new code opens but never closes.
- Risk — wired but fragile: order-dependence, a missing migration/index, an
untested seam, a silent-failure path.
## Evidence gate (MANDATORY — this is what keeps the report trustworthy)
The signature failure of a wiring review is the FALSE POSITIVE: declaring code dead when
it is in fact reached indirectly. Before reporting ANY Unwired or Missing finding, you
MUST check for indirect wiring and CITE the search that proves the gap:
- callers / imports / references (grep the symbol across the repo)
- string-keyed dispatch (the symbol's name used as a string in a registry / map / config)
- dependency-injection / decorator / plugin-registration patterns
- barrel files / re-exports (index.*, __init__.py, mod.rs, ...)
- dynamic dispatch / reflection / convention-based discovery
- config, env, CI, or manifest references (for files, hooks, schedules)
A finding with no cited empty-result search is DOWNGRADED to a question, not reported as
a finding. Cite the actual command you ran and show that it returned nothing.
## Severity (CRITICAL gates the fix loop)
CRITICAL / IMPORTANT / ADVISORY / MINOR. Rank findings most-severe first. Mark CRITICAL
only what genuinely breaks the feature — an unreachable core path, promised behavior that
is absent, a data-loss edge — because the caller applies a fix for every CRITICAL you
report. IMPORTANT and below are informational; nothing loops on them.
## Output — WRITE the report to <REPORT_PATH>, then return it
Your report is delivered by **writing it to <REPORT_PATH>** with the `Write` tool. That exact
absolute path, and no other. Returning the report as a message is NOT how it is delivered.
Write it **incrementally, as you go**: create the file with the summary table as soon as you
have your first finding, then append each finding as its evidence gate passes. Do not hold the
report in your head until the end — if this invocation ends without the file on disk, the
review is lost, and no one can ask you for it afterwards.
When the file is complete, also return the same markdown as your final message (corroboration
only — the file is what gets read).
The document itself:
1. Summary table: counts per severity, and whether an intent oracle was used.
2. Findings, most-severe first. Each finding:
- **Type** (taxonomy) · **Severity**
- **Location**: `file:line`
- **What**: one sentence
- **Evidence**: the cited search / reasoning that proves it (for Unwired/Missing, the
empty-result command you ran)
- **Suggested fix**: one line, advisory only
3. **Completeness verdict**: COMPLETE or GAPS FOUND, in one sentence.
The document is consumed as-is, not machine-parsed — but it is consumed **from the file**.
The main loop parses nothing beyond the findings' severity markers — the report is prose,
and the fix loop works from the findings as written. It does depend on <REPORT_PATH>
existing, for the same reason ship-it's three-field hand-off is written to a file: a
subagent's final message is a single-delivery, unrecoverable channel that a
completed-but-idled subagent never sends. The file is the carrier; the return is
corroboration. (review-codebase has always worked this way — its audits write to
docs/audits/ and return only a summary.)
What this skill is NOT
- Not a general fixer — only CRITICAL findings are auto-fixed, by the main loop
between reviewer passes; the reviewer subagent never edits, and nothing is ever
committed.
report-only restores the pure-finder behavior.
- Not a correctness linter — line-level bugs unrelated to completeness are out of
scope; that is
/code-review / /review-pr. Overlap on integration-caused bugs is
intentional and fine.
- Not a whole-repo audit by default — scope is the feature on the branch;
/ponytail-audit already covers whole-repo over-engineering sweeps. (The subagent
traces the whole repo, but reports on the feature.)
Deliberate simplifications (ponytail)
- One subagent, not a panel. A single well-prompted architect covers the whole
taxonomy. Upgrade path: fan out one subagent per taxonomy dimension and merge — add
only if single-agent recall proves insufficient.
- Fix loop is main-loop + fresh re-review, capped at 3. No fixer subagent, no
contract files — the report is the hand-off, and never-committed keeps rollback
trivial (
git checkout). CRITICAL-only keeps the loop short; widen to IMPORTANT
only if leftovers prove chronic.
- No new CLI dependency. Subagent over
codex, so the skill installs anywhere.
- No on-disk state beyond the
/tmp report (audit trail), never committed —
consistent with the rest of the plugin.
1---2name: architect-review-pr3description: Use after a feature is built — e.g. the final step of a ship-it run, right after review-pr — to check it is actually complete and wired, not just line-correct. Dispatches a fresh-context Claude subagent that traces the whole repo to hunt completeness and integration gaps in the branch's changes, reports ranked, evidence-backed findings, then fixes the CRITICAL ones and verifies with a fresh re-review (capped at 3 passes; pass report-only to skip fixing). Triggers on: architect review, architecture review, completeness review, wiring review, is this wired, did we finish this, find the gaps, incomplete feature, created but not wired, dead code check, deep pass on what we built.4---56# Architect Review — Adversarial Completeness & Wiring78An **architect-level adversarial review for completeness and integration**, run on a9finished implementation. It answers the question the other review skills don't:1011> "Do a deep pass at everything you built and make sure it's wired properly and works12> as intended. Find gaps, bits we didn't implement, code created but never wired,13> failure cases, edge cases."1415This skill **finds first, then fixes what is CRITICAL** — the same review-then-fix shape16`/ship-it` Step 6 drives around `/review-pr`. The reviewer subagent is a pure finder: it17reports ranked, evidence-backed findings and **edits nothing**. Then the main loop applies18a fix for each CRITICAL finding and re-dispatches a *fresh* reviewer to verify, converging19or capping at 3 passes like `/spec-review-codex`. IMPORTANT and below stay report-only.20Pass a bare `report-only` token to skip the fix loop entirely (`/ship-it` Step 7 does —21its conductor owns its own fix/commit loop).2223**Where it sits in the family:**24- `/code-review`, `/review-pr` — line-level *correctness* on the diff.25- `/spec-review-codex` / `-local` — harden the *spec, before* any code exists.26- `/architect-review-pr` — *completeness & wiring* of the finished feature. This skill.2728**Why a fresh subagent (the adversarial mechanism).** The main loop *built* this code,29so it shares the author's blind spots — the same gap in reasoning that left code unwired30also prevents noticing it on self-review. A fresh `Agent` subagent re-derives "is this31actually reachable / complete?" from the code alone, with no memory of how it got32written. Same independence rationale as `spec-review-codex`, but a Claude subagent33instead of the `codex` CLI, so the skill has **no external CLI dependency** and installs34anywhere.3536**Why the reviewer never fixes.** The finder's value is a *static* tree and a clean37adversarial stance — a reviewer that edits mid-review reviews a moving target and starts38defending its own patches. So fixing is the main loop's job, *between* passes, and every39verification pass is a **new** fresh-context subagent reading the tree as it now stands.40Findings below CRITICAL are the user's call, never auto-fixed.4142---4344## Flow4546### Step 0 — Preflight & scope47481. **In a git repo?** Run `git rev-parse --is-inside-work-tree`. If it fails, STOP with:49 > "Not in a git repository — nothing to review."502. **Split the argument before reading any of it as scope.** Strip two tokens first:51 - a `report-path=<absolute path>` token (that is how `/ship-it` passes52 `$RUN_DIR/architect-review.md`) — take it as the report path;53 - a bare `report-only` token — it disables the fix loop (Step 4).5455 Remove both from the argument. Whatever remains — possibly nothing — is the scope.56 Doing this first is the point: read in the other order, a caller's `report-path=…`57 looks exactly like "the user named a target" in step 3, and the skill reviews its own58 output path instead of the branch.593. **An explicit argument overrides everything.** If what remains names a target (a file, a60 directory, or a feature description), that IS the scope — skip diff computation and61 review exactly what was named (still trace the whole repo for reachability).624. **Otherwise, scope to the branch diff.** Resolve the base branch: use `main` if it exists, else `master` (`git rev-parse --verify <name>`). Then compute:63 - changed-file list: `git diff --name-only <base>...HEAD`64 - full diff: `git diff <base>...HEAD`6566 (Three-dot `<base>...HEAD` diffs against the merge-base — only what this branch67 changed, not unrelated drift on the base.)685. **No diff AND no scope left after the split** (you are on the base branch, or nothing is69 committed) → **ask the user what to review.** This is the only blocking question — do not70 guess. Bare tokens with nothing else count as "no argument": `report-path=…` says where71 to write and `report-only` says not to fix — neither says what to review.726. **Finish resolving the report path.** If step 2 found a `report-path=`, use it verbatim.73 Otherwise mint it:74 `REPORT_PATH="${TMPDIR:-/tmp}/architect-review-pr-$(date +%s).md"`. Hold it in a variable —75 the same value goes into the subagent prompt and is read back in Step 3. **Never resolve76 the report by globbing `architect-review-pr-*.md`**: a stale report from an earlier session77 on a *different* branch satisfies that glob, and presenting it as this run's findings is a78 worse failure than having no report at all.7980Announce the resolved scope in one line, then proceed:81> "Architect-reviewing `<scope>`<, oracle: path | code-only><, report-only>. Dispatching the subagent."8283### Step 1 — Discover the intent oracle (best-effort)8485The reviewer tells "looks fine" from "incomplete feature" by knowing what was *supposed*86to exist. Auto-discover, best-effort — none of these is required:8788- Newest design spec: the highest date-prefixed `docs/superpowers/specs/*-design.md`.89- Implementation plan if present: `tasks/` (e.g. `tasks/dex-plan.md`, `tasks/prd.json`)90 or the newest `docs/superpowers/plans/*.md`.9192If found, pass it to the subagent as the **intent oracle** — the source of truth for93which promised features/tasks must be present and wired. If none is found, the review94proceeds **code-only**: completeness is judged purely from the code's own internal95promises (referenced-but-missing, defined-but-unwired). **Note in the report whether an96oracle was used.** The oracle is an enhancement, never a precondition.9798### Step 2 — Dispatch ONE architect-review-pr subagent99100Dispatch a single fresh subagent via the **Agent tool** (`subagent_type: general-purpose`).101Compose the prompt from the template below, filling `<BASE>`, `<SCOPE>`, `<ORACLE>`, and102`<REPORT_PATH>`. The subagent **writes the report file itself and reports only — the report103path is the one file it may create, and it must edit nothing else.** One subagent, not a panel104(see Deliberate simplifications). This dispatch is review pass 1; the Step 4 fix loop reuses105this exact prompt for its verification passes.106107### Step 3 — Report1081091. **Read the report at `REPORT_PATH`** — the exact path from Step 0.6, not a glob. The110 subagent authors that file; the conductor does not write it from the return message. A111 subagent that completes its review and then idles without returning sends no message, so a112 conductor that writes what it "received" produces **no report at all** — and one that globs113 a timestamped pattern silently picks up another branch's stale report.1142. **If `REPORT_PATH` does not exist**, say exactly that ("the subagent produced no report at115 `<path>`") and stop. Do **not** re-dispatch, do not re-ask the subagent (a direct re-ask116 does not recover a lost hand-off), and do not fall back to a glob.1173. Present the ranked findings in chat: the summary counts, the findings most-severe118 first, and the completeness verdict.1194. **No CRITICAL findings, or `report-only` was passed → STOP here. Fix nothing.**120 IMPORTANT and below are never auto-fixed — they are the user's call. Otherwise121 continue to the fix loop.122123### Step 4 — Fix loop (CRITICAL only; skipped by `report-only`)124125CRITICAL findings are fixed by the main loop and verified by a fresh reviewer — the126fix/re-review shape of `/spec-review-codex`, capped at **3 review passes total** (the127Step 2 dispatch counts as pass 1).128129Each pass:1301311. **Apply a fix for every CRITICAL finding in the latest report**, in the main loop,132 guided by the finding's Location / Evidence / Suggested fix. Announce each as you133 apply it: `<location> — <one-line fix>`. Working tree only — **never commit**; the134 user owns git. Stay in scope: each fix answers its finding, nothing else. Skip a135 CRITICAL only if you judge it a false positive despite the evidence gate — say so,136 with your counter-evidence.1372. **If every CRITICAL was skipped** (all judged false positives), stop — an unchanged138 tree only re-yields the same report. Present the skips; the user arbitrates.1393. **Re-dispatch a fresh reviewer** — Step 2's prompt verbatim, same scope and oracle,140 plus one line appended to the scope block: *"Uncommitted fixes in the working tree141 are part of the feature under review."* (The subagent reads the tree, so it sees142 them; the line stops it from reporting the dirty tree itself as a finding.) New143 report path per pass — `REPORT_PATH_N="${REPORT_PATH%.md}.pass-<N>.md"` — never144 overwrite an earlier pass's report, never glob.1454. **Read the new report from its exact path.** Missing file → same rule as Step 3.2:146 say so and stop; the previous pass's report plus the fixes applied stand as the147 result. Otherwise:148 - **Zero CRITICALs** → converged. Present the final report, the list of fixes149 applied, and stop.150 - **A fixed CRITICAL comes back unchanged** → the fix is contested; do not ratchet.151 Present both positions (the fix you applied, the reviewer's re-finding) and stop —152 the user arbitrates.153 - **New or remaining CRITICALs, and fewer than 3 passes run** → next pass.154155After 3 passes, stop even if CRITICALs remain: present the leftovers most-severe first156and say the cap was hit. Every pass's report stays on disk as the audit trail.157158---159160## The subagent prompt161162Compose this at dispatch, substituting `<BASE>`, `<SCOPE>`, `<ORACLE>`, and `<REPORT_PATH>`:163164```165You are a fresh-context software architect reviewing a FINISHED implementation for166COMPLETENESS and WIRING. You did not write this code and have no memory of how it was167built — re-derive everything from the code itself. You are READ-ONLY on the repository:168trace, reason, and report. Do not edit or delete any file, and create exactly one — your169report at <REPORT_PATH> (see Output). Nothing else.170171## What to review (scope)172173<SCOPE>174 # substitute exactly ONE of:175 # (a) branch diff:176 # "The feature is the change on this branch vs <BASE>. Get the changed files with177 # `git diff --name-only <BASE>...HEAD` and the full diff with178 # `git diff <BASE>...HEAD`. Changed files:179 # <name-only list>"180 # (b) explicit target:181 # "Review this target: <argument>. Trace how it is (or isn't) integrated into the182 # rest of the repository."183184Focus your FINDINGS on the feature above, but trace the ENTIRE repository with Grep and185Read to confirm whether new code is actually reached. A diff-only review cannot tell186"created but not wired" from "wired elsewhere" — only whole-repo tracing can.187188## Intent oracle189190<ORACLE>191 # substitute exactly ONE of:192 # if found:193 # "Here is the source of truth for what this feature was supposed to be. Anything it194 # promises that is absent or unwired is a Missing/Incomplete finding:195 # <spec/plan contents or path>"196 # if none:197 # "No design spec or plan was found. Review CODE-ONLY: judge completeness from the198 # code's own internal promises (referenced-but-missing, defined-but-unwired). Do not199 # invent requirements the code never implies."200201## Findings taxonomy (run this fixed checklist)202203- Unwired — a symbol / file / endpoint / handler / migration defined in the changeset204 but never invoked, registered, exported, routed, or scheduled.205- Missing — referenced by the changeset (or promised by the oracle) but never defined.206- Incomplete — partial vs. stated intent: stub branches, TODO / pass / NotImplemented,207 half-handled cases, a config flag/field read but never acted on, a code208 path created but not finished.209- Bug/edge — null / empty / error / boundary paths the new code opens but never closes.210- Risk — wired but fragile: order-dependence, a missing migration/index, an211 untested seam, a silent-failure path.212213## Evidence gate (MANDATORY — this is what keeps the report trustworthy)214215The signature failure of a wiring review is the FALSE POSITIVE: declaring code dead when216it is in fact reached indirectly. Before reporting ANY Unwired or Missing finding, you217MUST check for indirect wiring and CITE the search that proves the gap:218219- callers / imports / references (grep the symbol across the repo)220- string-keyed dispatch (the symbol's name used as a string in a registry / map / config)221- dependency-injection / decorator / plugin-registration patterns222- barrel files / re-exports (index.*, __init__.py, mod.rs, ...)223- dynamic dispatch / reflection / convention-based discovery224- config, env, CI, or manifest references (for files, hooks, schedules)225226A finding with no cited empty-result search is DOWNGRADED to a question, not reported as227a finding. Cite the actual command you ran and show that it returned nothing.228229## Severity (CRITICAL gates the fix loop)230231CRITICAL / IMPORTANT / ADVISORY / MINOR. Rank findings most-severe first. Mark CRITICAL232only what genuinely breaks the feature — an unreachable core path, promised behavior that233is absent, a data-loss edge — because the caller applies a fix for every CRITICAL you234report. IMPORTANT and below are informational; nothing loops on them.235236## Output — WRITE the report to <REPORT_PATH>, then return it237238Your report is delivered by **writing it to <REPORT_PATH>** with the `Write` tool. That exact239absolute path, and no other. Returning the report as a message is NOT how it is delivered.240241Write it **incrementally, as you go**: create the file with the summary table as soon as you242have your first finding, then append each finding as its evidence gate passes. Do not hold the243report in your head until the end — if this invocation ends without the file on disk, the244review is lost, and no one can ask you for it afterwards.245246When the file is complete, also return the same markdown as your final message (corroboration247only — the file is what gets read).248249The document itself:2502511. Summary table: counts per severity, and whether an intent oracle was used.2522. Findings, most-severe first. Each finding:253 - **Type** (taxonomy) · **Severity**254 - **Location**: `file:line`255 - **What**: one sentence256 - **Evidence**: the cited search / reasoning that proves it (for Unwired/Missing, the257 empty-result command you ran)258 - **Suggested fix**: one line, advisory only2593. **Completeness verdict**: COMPLETE or GAPS FOUND, in one sentence.260261The document is consumed as-is, not machine-parsed — but it is consumed **from the file**.262```263264The main loop parses nothing beyond the findings' severity markers — the report is prose,265and the fix loop works from the findings as written. It does depend on `<REPORT_PATH>`266existing, for the same reason ship-it's three-field hand-off is written to a file: a267subagent's final message is a single-delivery, unrecoverable channel that a268completed-but-idled subagent never sends. The file is the carrier; the return is269corroboration. (`review-codebase` has always worked this way — its audits write to270`docs/audits/` and return only a summary.)271272---273274## What this skill is NOT275276- **Not a general fixer** — only CRITICAL findings are auto-fixed, by the main loop277 between reviewer passes; the reviewer subagent never edits, and nothing is ever278 committed. `report-only` restores the pure-finder behavior.279- **Not a correctness linter** — line-level bugs unrelated to completeness are out of280 scope; that is `/code-review` / `/review-pr`. Overlap on integration-caused bugs is281 intentional and fine.282- **Not a whole-repo audit by default** — scope is the feature on the branch;283 `/ponytail-audit` already covers whole-repo over-engineering sweeps. (The subagent284 *traces* the whole repo, but *reports* on the feature.)285286## Deliberate simplifications (ponytail)287288- **One subagent, not a panel.** A single well-prompted architect covers the whole289 taxonomy. Upgrade path: fan out one subagent per taxonomy dimension and merge — add290 only if single-agent recall proves insufficient.291- **Fix loop is main-loop + fresh re-review, capped at 3.** No fixer subagent, no292 contract files — the report is the hand-off, and never-committed keeps rollback293 trivial (`git checkout`). CRITICAL-only keeps the loop short; widen to IMPORTANT294 only if leftovers prove chronic.295- **No new CLI dependency.** Subagent over `codex`, so the skill installs anywhere.296- **No on-disk state** beyond the `/tmp` report (audit trail), never committed —297 consistent with the rest of the plugin.