Plan Review
Adversarial critique of an implementation plan before implementation starts. This
skill examines premises, not mechanisms: whether the plan solves a real problem,
whether its assumptions hold, whether the chosen approach beats the alternatives —
including doing nothing — and whether its own verification steps are safe to run.
How this differs from ship-check: ship-check reviews the mechanism that was built.
Plan-review examines whether it is the right mechanism to build. The founding case:
a row cap on client registrations passed all four ship-check phases (9 code-level
findings, all mechanism-correct) — and only manual review noticed that one address
operating under the existing rate limit fills the cap in ~75 minutes and locks the
owner out. The design was a denial vector; no amount of code review would have said
so, because the code faithfully implemented the flawed premise.
What counts as a plan
Any of: a plan document (plans/*.md), a task note (## Problem + What + Done
when), a plan-mode plan, or an approach stated in conversation. The reviewer
produces findings only — never edits the plan. Revision belongs to the plan's
author, who holds context the reviewer doesn't.
Before starting
- Read the plan artifact IN FULL, plus the task note / card it implements and any
documents it links.
- Load the target repo's AGENTS.md (conventions the plan must fit).
- Load vault context where available (ToolSearch the
vault_* schemas if
deferred): vault_memory_recall({ query: "<plan's domain>" }) for dated
preferences, and read any session logs or research notes the plan cites.
- Load sequential thinking:
ToolSearch({ query: "select:mcp__sequential-thinking__sequentialthinking" })
- Read the code the plan touches — enough to check the plan's claims about
current behavior against what the code actually does. A premise audit that
trusts the plan's description of the existing system inherits its errors.
Pin the verification state: date the plan artifact, and when it isn't
fresh, verify claims against the repo as of that date (the last commit before
it), not HEAD — HEAD may have drifted, or may already contain the
implementation, and either direction poisons the premise audit. Fresh or not,
record the commit you verified against for the output's verification-basis
line.
- Classify the change: feature / guard-or-control / refactor / infra / docs.
Dimension 4 is conditional on that classification. In the same pass, note
whether the plan responds to a recent incident — that property, not the
class, is what makes dimension 6a run.
Dimensions
Run every applicable dimension. Dimension 2 gets the most time — false or
unverified premises are the highest-cost failures, because everything downstream
of them is wasted work.
Verb-to-severity mapping: Block always produces a blocker. A Flag lands
as must-answer or recommendation via the guess test defined under Output format
— unless the dimension assigns the severity itself (dimension 4's who-pays rule
and dimension 5's silent-writers rule do).
1. Problem framing
- Flag when the problem is stated as the absence of the proposed mechanism
("there is no cap", "we lack a guard") rather than as what goes wrong for whom
("the
clients table grows without bound, degrading X for Y"). Absence-framing
smuggles the solution into the problem and blocks alternative thinking.
Boundary: small mechanical tasks (a lint rule, a bump, a rename) need only
a one-sentence problem — don't demand ceremony.
- Flag when no one is named who experiences the problem. A problem no one has
is a mechanism looking for a justification.
Boundary: shares the mechanical-task carve-out above — a one-sentence
problem for small mechanical work names its sufferer implicitly (the failing
lint, the stale dependency); don't demand a cast list.
2. Premise and assumption audit
Proof-of-work rule: quote each load-bearing assumption verbatim before judging
it, then classify it: verified in the plan (evidence cited), checkable now
(a read, grep, or query would settle it), or deferred to implementation.
- Block on a deferred unknown that is go/no-go for the design. A plan that
says "assuming X holds, the simple approach works; if not, redesign" and defers
checking X has scheduled its redesign for the most expensive possible moment.
Checkable-now items get checked now — by you, if a read or grep settles it.
Stop condition: one honest, well-aimed search per item. If a referenced
document, rule, or constraint doesn't surface, the finding is the plan's
missing link, not your missing effort — report it and move on rather than
hunting exhaustively.
- Flag any asserted constraint with no stated source. Ask: where does this
rule come from? Agents have designed around constraints that turned out to be
invented; a constraint that can't be traced to a doc, a decision, or a
measurement is a hallucination until shown otherwise.
Boundary: if one read or search can trace the constraint, do that instead
of flagging (the checkable-now rule) — flag only what fails the search or
can't be checked from here.
- Flag observations promoted to requirements. "The system currently does X"
is a fact; "the system must keep doing X" is a decision — the plan must not
silently convert one into the other.
Boundary: an explicit decision to preserve current behavior, with a stated
reason, is legitimate — the flag is for the silent conversion only.
- For each premise, ask: how would we know if this is false? A premise with
no falsification path is not load-bearing evidence, it's hope. Example of a
premise that failed exactly this way: "a missing file needs bootstrapping" —
false in a sync-backed environment, where a missing file is usually one the
sync layer hasn't delivered yet, and acting on it races the delivery.
3. Alternatives and the do-nothing baseline
- Flag when the plan names only one mechanism. A plan with one option hasn't
compared — it has decided and decorated. At least one genuine alternative with
a stated reason for rejection.
Boundary: mechanical tasks are exempt (there is one way to bump a version).
- Always check the do-nothing baseline: what do existing layers already
cover? Post-incident planning has produced protective measures that duplicated
existing snapshots, and volume-split proposals whose "protection" defeated
legitimate layout changes. "Rejected: existing layer X already handles this" is
a valid — often the correct — outcome, and a plan that never considered it
can't reach it.
4. Guard and control arithmetic (conditional: the plan adds a guard, cap, limit, quota, lockout, or security control)
- Compute, don't gesture. Using the plan's own numbers (rate limits, cap
sizes, window lengths, timeouts), calculate the cheapest path for an
unauthorized party to trigger the control. If the plan supplies a rate and a
cap, the time-to-fill is one multiplication — do it in the review.
- Who pays when it fires? If tripping the control is cheap for an attacker
and expensive for the owner (lockout, data loss, manual recovery), the control
is a denial vector, not a defense. That is a blocker, not a nitpick.
- Boundary: controls that only constrain the owner's own automation (a
local-only sweep, a soft warning) get the same arithmetic but a lower default
severity — the failure mode is annoyance, not lockout.
5. Concurrent writers and async state
- For every piece of state the plan reads, writes, or assumes stable, name
every other writer: sync services, file watchers, other agent sessions, CI,
retention jobs, the user's own hands. A plan silent about the other writers of
contended state gets a must-answer finding. Real case: an edit tool matched
text against a note version that a sync layer reverted an hour later, garbling
the write — the plan for those tools had no concept of a concurrent writer.
- Two-sources-of-truth check: when the plan uses X as a proxy for Y
("tracked by the watcher" standing in for "present in the index"), demand the
invariant that keeps X and Y aligned — and who restores it when it breaks. A
proxy conflation of exactly this shape made files permanently invisible to
search, and every cheap patch failed because the proxy itself was the bug.
Docs variant: two documents asserting the same facts are two sources of
truth. A plan that creates a new document without stating the disposition of
an existing one covering the same ground (extend, replace, redirect) is
planning a divergence — readers will land on the stale one.
- What survives the reset? For any step that wipes, rebuilds, or migrates
state: enumerate the state that persists across the operation the plan treats
as clean. A test that wiped a data volume while adjacent sync-identity state
survived pushed 1,472 deletions to the cloud replica.
6. Scope and proportionality
- (6a) Overcompensation check (conditional: the plan responds to a recent
incident): walk each protective measure through the incident it's meant to
prevent AND through normal operations. Post-incident plans systematically
over-produce guards; the ones worth keeping survive both walks. Measures that
defend against the last incident by obstructing routine work get flagged.
- Scope creep: every deliverable traces back to the stated problem. Items
that don't are proposals to surface separately, not scope.
- Delivery mechanics (when the plan spans multiple PRs): PR boundaries,
merge strategy, and changelog/attribution consequences. A one-click stack
merge that collapses a breaking change's attribution into a neighboring PR's
entry is a plan defect, not a git trivia question.
7. Verification plan quality
- Flag verification sections without runnable commands or with checks that
cannot fail. "Manually verify it works" without a procedure is not a check.
- Destructive verification steps get their own blast-radius analysis. A test
that mutates real state IS a change and deserves the same premise scrutiny as
the feature — dimension 5's "what survives the reset?" applies to the test
plan itself. The 1,472-deletion incident above was caused by a verification
step, not by shipped code.
- Done-when criteria must be testable. "Works correctly" is vibes;
"
npm test passes and the reconciliation log shows zero skipped entries" is a
criterion.
8. Structure and open-question hygiene
House conventions, where the repo follows them (boundary: for repos without
these conventions, report as recommendations, never violations):
- Task notes open with
## Problem, sized to the task; plans that add behavior,
guards, or span sessions carry premise/assumptions and alternatives; guard
tasks carry the dimension-4 control test.
- Open questions are split into "verify before implementation" (technical
go/no-go — resolve them now, see dimension 2) and "for the user" (judgment
calls — surface them, don't guess them).
- Ratified plans carry a dated decision log; multi-file plans carry a module
map; fable-mode plans document their provenance (agents used, lookups made).
Rules that override intuition
- Quote before critiquing. Every finding cites the plan's own text — or, for
absence findings, names what's missing AND the concrete failure scenario the
absence permits. "The plan doesn't mention X" is only a finding if you can say
what goes wrong because of it.
- Compute when numbers exist. If the plan contains any two of rate, cap,
window, size, or timeout, do the arithmetic that connects them before deciding
the design is sound.
- Verify before asserting — the same rule you're enforcing. Check the code
or docs before claiming the plan contradicts them; an invented constraint in a
critique is exactly the failure this skill exists to catch.
- Premises over mechanisms. Flag code-level design only when it invalidates
a premise or a dimension above. Style, naming, and idiomatic concerns belong
to ship-check after the code exists.
- Findings, not edits. Never rewrite the plan, and never soften a blocker
into a recommendation to be agreeable. If genuine checking finds nothing, say
so plainly — do not manufacture findings to justify the review.
Sequential thinking triggers
Call sequentialthinking — mandatorily, before the action, not as vague habit:
- Before declaring any blocker. Input: the quoted premise, the evidence it
fails. Output: the failure scenario stated concretely enough to be wrong.
- Before dismissing a suspicion. Anything you considered flagging and are
about to drop — think through what would have to be true for it to bite.
- Before the overall verdict. Weigh blockers vs. the change's size; a
blocker on a two-line task usually means the review is miscalibrated.
Output format
Plan review complete:
- Plan: <path, or "stated in conversation">
- Change class: feature / guard-control / refactor / infra / docs
- Verified against: <commit or state actually checked, + which claims>
- Verdict: ready / ready with changes / not ready
- Blockers: N (false or unverified go/no-go premise, denial vector,
destructive verification without blast-radius analysis)
- Must-answer: N (an implementer following the plan as written would be
forced to guess — the answer doesn't invalidate the
design, but the plan must carry it)
- Recommendations: N (would improve the plan; an implementer could proceed
correctly without it)
- Dimensions passed: <list>
The must-answer / recommendation boundary is the guess test: if a competent
implementer without the author's context would have to guess, it's must-answer;
if they'd proceed correctly and the plan is merely weaker for the omission, it's
a recommendation. The verification-basis line is mandatory — a review that
doesn't say what it checked is indistinguishable from one that checked nothing,
which is the exact failure mode this skill exists to catch.
Then findings ordered by severity, each with: dimension, the quoted premise (or
the absence + its failure scenario), and what would resolve it. A finding without
a resolution path is a complaint, not a review. Close with a short proof of
dismissal for anything you seriously considered and dropped — the clean-bill
claims are part of the review.
1---2name: plan-review3description: Adversarial critique of an implementation plan BEFORE any code exists — premise audit, alternatives comparison, guard/control arithmetic, concurrent-writer analysis, and verification-plan quality. Derived from analysis of real planning failures that survived a full post-implementation review pipeline because review verifies mechanisms, not premises. Use when asked to "review this plan", "critique the plan", "plan check", "is this plan ready", "review the task note before I start", or before implementing any card that adds behavior, a guard, or spans sessions. NOT for: reviewing implemented code or PRs (use ship-check / pr-review), writing the plan itself (that's fable-mode + Plan agents), or auditing tests (test-audit).4---56# Plan Review78Adversarial critique of an implementation plan before implementation starts. This9skill examines **premises, not mechanisms**: whether the plan solves a real problem,10whether its assumptions hold, whether the chosen approach beats the alternatives —11including doing nothing — and whether its own verification steps are safe to run.1213How this differs from ship-check: ship-check reviews the mechanism that was built.14Plan-review examines whether it is the right mechanism to build. The founding case:15a row cap on client registrations passed all four ship-check phases (9 code-level16findings, all mechanism-correct) — and only manual review noticed that one address17operating under the existing rate limit fills the cap in ~75 minutes and locks the18owner out. The design was a denial vector; no amount of code review would have said19so, because the code faithfully implemented the flawed premise.2021## What counts as a plan2223Any of: a plan document (`plans/*.md`), a task note (`## Problem` + What + Done24when), a plan-mode plan, or an approach stated in conversation. The reviewer25produces **findings only — never edits the plan.** Revision belongs to the plan's26author, who holds context the reviewer doesn't.2728## Before starting29301. Read the plan artifact IN FULL, plus the task note / card it implements and any31 documents it links.322. Load the target repo's AGENTS.md (conventions the plan must fit).333. Load vault context where available (ToolSearch the `vault_*` schemas if34 deferred): `vault_memory_recall({ query: "<plan's domain>" })` for dated35 preferences, and read any session logs or research notes the plan cites.364. Load sequential thinking:37 `ToolSearch({ query: "select:mcp__sequential-thinking__sequentialthinking" })`385. Read the code the plan touches — enough to check the plan's claims about39 current behavior against what the code actually does. A premise audit that40 trusts the plan's description of the existing system inherits its errors.41 **Pin the verification state:** date the plan artifact, and when it isn't42 fresh, verify claims against the repo as of that date (the last commit before43 it), not HEAD — HEAD may have drifted, or may already contain the44 implementation, and either direction poisons the premise audit. Fresh or not,45 record the commit you verified against for the output's verification-basis46 line.476. Classify the change: feature / guard-or-control / refactor / infra / docs.48 Dimension 4 is conditional on that classification. In the same pass, note49 whether the plan responds to a recent incident — that property, not the50 class, is what makes dimension 6a run.5152## Dimensions5354Run every applicable dimension. Dimension 2 gets the most time — false or55unverified premises are the highest-cost failures, because everything downstream56of them is wasted work.5758Verb-to-severity mapping: **Block** always produces a blocker. A **Flag** lands59as must-answer or recommendation via the guess test defined under Output format60— unless the dimension assigns the severity itself (dimension 4's who-pays rule61and dimension 5's silent-writers rule do).6263### 1. Problem framing6465- **Flag** when the problem is stated as the absence of the proposed mechanism66 ("there is no cap", "we lack a guard") rather than as what goes wrong for whom67 ("the `clients` table grows without bound, degrading X for Y"). Absence-framing68 smuggles the solution into the problem and blocks alternative thinking.69 **Boundary:** small mechanical tasks (a lint rule, a bump, a rename) need only70 a one-sentence problem — don't demand ceremony.71- **Flag** when no one is named who experiences the problem. A problem no one has72 is a mechanism looking for a justification.73 **Boundary:** shares the mechanical-task carve-out above — a one-sentence74 problem for small mechanical work names its sufferer implicitly (the failing75 lint, the stale dependency); don't demand a cast list.7677### 2. Premise and assumption audit7879Proof-of-work rule: **quote each load-bearing assumption verbatim** before judging80it, then classify it: *verified in the plan* (evidence cited), *checkable now*81(a read, grep, or query would settle it), or *deferred to implementation*.8283- **Block** on a deferred unknown that is go/no-go for the design. A plan that84 says "assuming X holds, the simple approach works; if not, redesign" and defers85 checking X has scheduled its redesign for the most expensive possible moment.86 Checkable-now items get checked now — by you, if a read or grep settles it.87 **Stop condition:** one honest, well-aimed search per item. If a referenced88 document, rule, or constraint doesn't surface, the finding is the plan's89 missing link, not your missing effort — report it and move on rather than90 hunting exhaustively.91- **Flag** any asserted constraint with no stated source. Ask: where does this92 rule come from? Agents have designed around constraints that turned out to be93 invented; a constraint that can't be traced to a doc, a decision, or a94 measurement is a hallucination until shown otherwise.95 **Boundary:** if one read or search can trace the constraint, do that instead96 of flagging (the checkable-now rule) — flag only what fails the search or97 can't be checked from here.98- **Flag** observations promoted to requirements. "The system currently does X"99 is a fact; "the system must keep doing X" is a decision — the plan must not100 silently convert one into the other.101 **Boundary:** an explicit decision to preserve current behavior, with a stated102 reason, is legitimate — the flag is for the silent conversion only.103- For each premise, ask: **how would we know if this is false?** A premise with104 no falsification path is not load-bearing evidence, it's hope. Example of a105 premise that failed exactly this way: "a missing file needs bootstrapping" —106 false in a sync-backed environment, where a missing file is usually one the107 sync layer hasn't delivered yet, and acting on it races the delivery.108109### 3. Alternatives and the do-nothing baseline110111- **Flag** when the plan names only one mechanism. A plan with one option hasn't112 compared — it has decided and decorated. At least one genuine alternative with113 a stated reason for rejection.114 **Boundary:** mechanical tasks are exempt (there is one way to bump a version).115- **Always check the do-nothing baseline:** what do existing layers already116 cover? Post-incident planning has produced protective measures that duplicated117 existing snapshots, and volume-split proposals whose "protection" defeated118 legitimate layout changes. "Rejected: existing layer X already handles this" is119 a valid — often the correct — outcome, and a plan that never considered it120 can't reach it.121122### 4. Guard and control arithmetic *(conditional: the plan adds a guard, cap, limit, quota, lockout, or security control)*123124- **Compute, don't gesture.** Using the plan's own numbers (rate limits, cap125 sizes, window lengths, timeouts), calculate the cheapest path for an126 unauthorized party to trigger the control. If the plan supplies a rate and a127 cap, the time-to-fill is one multiplication — do it in the review.128- **Who pays when it fires?** If tripping the control is cheap for an attacker129 and expensive for the owner (lockout, data loss, manual recovery), the control130 is a denial vector, not a defense. That is a **blocker**, not a nitpick.131- **Boundary:** controls that only constrain the owner's own automation (a132 local-only sweep, a soft warning) get the same arithmetic but a lower default133 severity — the failure mode is annoyance, not lockout.134135### 5. Concurrent writers and async state136137- For every piece of state the plan reads, writes, or assumes stable, **name138 every other writer**: sync services, file watchers, other agent sessions, CI,139 retention jobs, the user's own hands. A plan silent about the other writers of140 contended state gets a must-answer finding. Real case: an edit tool matched141 text against a note version that a sync layer reverted an hour later, garbling142 the write — the plan for those tools had no concept of a concurrent writer.143- **Two-sources-of-truth check:** when the plan uses X as a proxy for Y144 ("tracked by the watcher" standing in for "present in the index"), demand the145 invariant that keeps X and Y aligned — and who restores it when it breaks. A146 proxy conflation of exactly this shape made files permanently invisible to147 search, and every cheap patch failed because the proxy itself was the bug.148 **Docs variant:** two documents asserting the same facts are two sources of149 truth. A plan that creates a new document without stating the disposition of150 an existing one covering the same ground (extend, replace, redirect) is151 planning a divergence — readers will land on the stale one.152- **What survives the reset?** For any step that wipes, rebuilds, or migrates153 state: enumerate the state that persists across the operation the plan treats154 as clean. A test that wiped a data volume while adjacent sync-identity state155 survived pushed 1,472 deletions to the cloud replica.156157### 6. Scope and proportionality158159- **(6a) Overcompensation check** *(conditional: the plan responds to a recent160 incident)*: walk each protective measure through the incident it's meant to161 prevent AND through normal operations. Post-incident plans systematically162 over-produce guards; the ones worth keeping survive both walks. Measures that163 defend against the last incident by obstructing routine work get flagged.164- **Scope creep:** every deliverable traces back to the stated problem. Items165 that don't are proposals to surface separately, not scope.166- **Delivery mechanics** *(when the plan spans multiple PRs)*: PR boundaries,167 merge strategy, and changelog/attribution consequences. A one-click stack168 merge that collapses a breaking change's attribution into a neighboring PR's169 entry is a plan defect, not a git trivia question.170171### 7. Verification plan quality172173- **Flag** verification sections without runnable commands or with checks that174 cannot fail. "Manually verify it works" without a procedure is not a check.175- **Destructive verification steps get their own blast-radius analysis.** A test176 that mutates real state IS a change and deserves the same premise scrutiny as177 the feature — dimension 5's "what survives the reset?" applies to the test178 plan itself. The 1,472-deletion incident above was caused by a *verification179 step*, not by shipped code.180- **Done-when criteria must be testable.** "Works correctly" is vibes;181 "`npm test` passes and the reconciliation log shows zero skipped entries" is a182 criterion.183184### 8. Structure and open-question hygiene185186House conventions, where the repo follows them (**boundary:** for repos without187these conventions, report as recommendations, never violations):188189- Task notes open with `## Problem`, sized to the task; plans that add behavior,190 guards, or span sessions carry premise/assumptions and alternatives; guard191 tasks carry the dimension-4 control test.192- Open questions are split into **"verify before implementation"** (technical193 go/no-go — resolve them now, see dimension 2) and **"for the user"** (judgment194 calls — surface them, don't guess them).195- Ratified plans carry a dated decision log; multi-file plans carry a module196 map; fable-mode plans document their provenance (agents used, lookups made).197198## Rules that override intuition199200- **Quote before critiquing.** Every finding cites the plan's own text — or, for201 absence findings, names what's missing AND the concrete failure scenario the202 absence permits. "The plan doesn't mention X" is only a finding if you can say203 what goes wrong because of it.204- **Compute when numbers exist.** If the plan contains any two of rate, cap,205 window, size, or timeout, do the arithmetic that connects them before deciding206 the design is sound.207- **Verify before asserting** — the same rule you're enforcing. Check the code208 or docs before claiming the plan contradicts them; an invented constraint in a209 critique is exactly the failure this skill exists to catch.210- **Premises over mechanisms.** Flag code-level design only when it invalidates211 a premise or a dimension above. Style, naming, and idiomatic concerns belong212 to ship-check after the code exists.213- **Findings, not edits.** Never rewrite the plan, and never soften a blocker214 into a recommendation to be agreeable. If genuine checking finds nothing, say215 so plainly — do not manufacture findings to justify the review.216217## Sequential thinking triggers218219Call `sequentialthinking` — mandatorily, before the action, not as vague habit:220221- **Before declaring any blocker.** Input: the quoted premise, the evidence it222 fails. Output: the failure scenario stated concretely enough to be wrong.223- **Before dismissing a suspicion.** Anything you considered flagging and are224 about to drop — think through what would have to be true for it to bite.225- **Before the overall verdict.** Weigh blockers vs. the change's size; a226 blocker on a two-line task usually means the review is miscalibrated.227228## Output format229230```231Plan review complete:232- Plan: <path, or "stated in conversation">233- Change class: feature / guard-control / refactor / infra / docs234- Verified against: <commit or state actually checked, + which claims>235- Verdict: ready / ready with changes / not ready236- Blockers: N (false or unverified go/no-go premise, denial vector,237 destructive verification without blast-radius analysis)238- Must-answer: N (an implementer following the plan as written would be239 forced to guess — the answer doesn't invalidate the240 design, but the plan must carry it)241- Recommendations: N (would improve the plan; an implementer could proceed242 correctly without it)243- Dimensions passed: <list>244```245246The must-answer / recommendation boundary is the guess test: if a competent247implementer without the author's context would have to guess, it's must-answer;248if they'd proceed correctly and the plan is merely weaker for the omission, it's249a recommendation. The verification-basis line is mandatory — a review that250doesn't say what it checked is indistinguishable from one that checked nothing,251which is the exact failure mode this skill exists to catch.252253Then findings ordered by severity, each with: dimension, the quoted premise (or254the absence + its failure scenario), and what would resolve it. A finding without255a resolution path is a complaint, not a review. Close with a short **proof of256dismissal** for anything you seriously considered and dropped — the clean-bill257claims are part of the review.