Big-Work Adversarial Plan Review
Ported from a workflow validated on a real design (an ntfy ingestion +
persona memory pipeline) that went from roughly 3.5/10 to roughly
8.5/10 across 4 review rounds — each round finding genuine
production-breaking defects a single author missed: processed-before-persisted
data loss, an LLM call blocking a shared stream thread, mutable-JSONL
status corruption, an answer-handling path that let contradiction
answers poison an importance-rule store, and free-text LLM writes into
what should have been a structured graph.
This is a from-description port. It was written from a GitHub issue
proposal, not from the original Cursor-format draft it references
(~/.cursor/skills/big-work-plan-review/SKILL.md, on the proposing
operator's own machine) — that draft was unreachable from the session
that built this file. Reconcile against the original draft if it
surfaces later; treat this version as functionally complete in the
meantime, not as a placeholder.
When to use this
Big, stateful, or concurrent work: new systems, pipelines, daemons,
anything with multiple writers, ordering dependencies, or state that
outlives a single request. The cost of a design mistake here is a
production incident, not a failed test.
When NOT to use this: a scoped bug fix with one clear resolution, a
single-file change, or anything requirements-clarification already
covers by itself. Running a two-reviewer adversarial loop on a small
change is pure overhead — match the ceremony to the blast radius.
The loop
Research verified facts, not assumptions. Probe the live systems
this design touches — actual schemas, actual message shapes, actual
failure behavior — before writing a line of the plan. Record findings
in a "Current state (verified)" section so a reviewer can tell what
you checked from what you assumed.
Write the plan. One doc in docs/plans/, with these sections at
minimum:
- Goal
- Current state (verified)
- Architecture
- Exact schemas / DDL / message contracts
- Module contracts (inputs, outputs, invariants each module owns)
- Failure-modes table (what breaks, how it's detected, what happens
next)
- Testing approach
- Out of scope
Two independent reviewers, in parallel. Spawn two reviewer
subagents from different model families — not two instances of
the same model — so they don't share blind spots. Give each the same
structured brief: review headings to respond under, a word cap, and
an explicit "no file edits, review only" instruction. Resume the
same reviewer sessions across rounds rather than starting fresh
each time, so later rounds build on what a reviewer already flagged
instead of re-discovering it.
Embed reviews verbatim as plan appendices, one appendix per
round per reviewer. Do not summarize or paraphrase a reviewer's
findings into the body — the raw text is the audit trail.
Fold accepted fixes into the plan BODY, not just the appendix.
A stale body next to an up-to-date appendix is itself a defect class
reviewers will catch — the plan must read as internally consistent
after each round, not as an original draft plus a pile of unresolved
commentary.
Record dispositions. For every reviewer finding: adopted (folded
into the body), or deliberately rejected with a stated reason. A
rejected finding needs the same rationale discipline as an adopted
one — "reviewer flagged X, rejected because Y" — so a later reader
can tell a considered rejection from a missed comment.
Shift later rounds to closure verification. Once the body has
absorbed a round of fixes, the next round's brief changes: not "find
new problems" but "go item-by-item through the disposition list and
mark each CLOSED or NOT CLOSED." End each closure round with an
explicit verdict: READY or NOT READY. A verdict only counts
for the exact plan version the reviewer actually saw — re-verify
after any further edit, don't carry a verdict forward across a body
change.
Implement only after both reviewers issue READY on the same plan
version.
Defect checklist
Nine recurring defect classes that fell out of the validating run.
Point reviewers at this list explicitly in later rounds — it catches
categories, not just this-specific-bug instances:
- Ordering bugs — an operation assumes something upstream already
happened (e.g., data marked processed before it's actually
persisted).
- Blocking hot paths — a slow call (LLM, network, disk) running
inline on a thread that something else depends on staying
responsive (a shared stream, an event loop, a lock holder).
- Mutable append-only files — a file meant to be append-only
(JSONL, a log) that something also rewrites or truncates in place,
racing readers or losing data on a crash mid-write.
- Multi-writer artifacts — more than one process/thread writing the
same resource without a coordination story (locking, single-writer
ownership, CAS).
- Free-text references into structured stores — an LLM (or any
producer) writing natural-language references into a field a
structured system will later parse or join on.
- Missing join keys — two pieces of state that need to correlate
later (a request and its eventual result, an event and its replay)
with no stable key connecting them.
- Missing replay cursors — a consumer of a stream or log with no
durable position, so a restart either reprocesses everything or
silently skips a gap.
- Unbounded retries — a retry loop with no cap, backoff ceiling, or
dead-letter path, able to spin forever on a permanently-failing
input.
- Cross-contaminating handlers — a handler for one kind of event
able to affect state that a different event type also owns, with no
isolation between them.
See Also
requirements-clarification — for verifying a requirement's premise
and scoping ambiguity on ordinary-sized work; use before this skill
even applies, to confirm the work really is "big" and not just
underspecified.
code-review / security-review — post-implementation review, once
code exists. This skill is deliberately upstream of those: it reviews
the plan, not the diff.
1---2name: big-work-plan-review3description: Use before implementing big work — new systems, pipelines, daemons, or anything stateful/concurrent — where a bug would be expensive to find after code exists. Requires a written implementation plan to pass multi-round adversarial review by two independent LLM reviewers before any code is written. Not for scoped bug fixes or single-file changes; see requirements-clarification for those.4---56# Big-Work Adversarial Plan Review78Ported from a workflow validated on a real design (an ntfy ingestion +9persona memory pipeline) that went from roughly 3.5/10 to roughly108.5/10 across 4 review rounds — each round finding genuine11production-breaking defects a single author missed: processed-before-persisted12data loss, an LLM call blocking a shared stream thread, mutable-JSONL13status corruption, an answer-handling path that let contradiction14answers poison an importance-rule store, and free-text LLM writes into15what should have been a structured graph.1617**This is a from-description port.** It was written from a GitHub issue18proposal, not from the original Cursor-format draft it references19(`~/.cursor/skills/big-work-plan-review/SKILL.md`, on the proposing20operator's own machine) — that draft was unreachable from the session21that built this file. Reconcile against the original draft if it22surfaces later; treat this version as functionally complete in the23meantime, not as a placeholder.2425## When to use this2627Big, stateful, or concurrent work: new systems, pipelines, daemons,28anything with multiple writers, ordering dependencies, or state that29outlives a single request. The cost of a design mistake here is a30production incident, not a failed test.3132**When NOT to use this:** a scoped bug fix with one clear resolution, a33single-file change, or anything `requirements-clarification` already34covers by itself. Running a two-reviewer adversarial loop on a small35change is pure overhead — match the ceremony to the blast radius.3637## The loop38391. **Research verified facts, not assumptions.** Probe the live systems40 this design touches — actual schemas, actual message shapes, actual41 failure behavior — before writing a line of the plan. Record findings42 in a "Current state (verified)" section so a reviewer can tell what43 you checked from what you assumed.44452. **Write the plan.** One doc in `docs/plans/`, with these sections at46 minimum:47 - Goal48 - Current state (verified)49 - Architecture50 - Exact schemas / DDL / message contracts51 - Module contracts (inputs, outputs, invariants each module owns)52 - Failure-modes table (what breaks, how it's detected, what happens53 next)54 - Testing approach55 - Out of scope56573. **Two independent reviewers, in parallel.** Spawn two reviewer58 subagents from **different model families** — not two instances of59 the same model — so they don't share blind spots. Give each the same60 structured brief: review headings to respond under, a word cap, and61 an explicit "no file edits, review only" instruction. Resume the62 *same* reviewer sessions across rounds rather than starting fresh63 each time, so later rounds build on what a reviewer already flagged64 instead of re-discovering it.65664. **Embed reviews verbatim as plan appendices**, one appendix per67 round per reviewer. Do not summarize or paraphrase a reviewer's68 findings into the body — the raw text is the audit trail.69705. **Fold accepted fixes into the plan BODY, not just the appendix.**71 A stale body next to an up-to-date appendix is itself a defect class72 reviewers will catch — the plan must read as internally consistent73 after each round, not as an original draft plus a pile of unresolved74 commentary.75766. **Record dispositions.** For every reviewer finding: adopted (folded77 into the body), or deliberately rejected with a stated reason. A78 rejected finding needs the same rationale discipline as an adopted79 one — "reviewer flagged X, rejected because Y" — so a later reader80 can tell a considered rejection from a missed comment.81827. **Shift later rounds to closure verification.** Once the body has83 absorbed a round of fixes, the next round's brief changes: not "find84 new problems" but "go item-by-item through the disposition list and85 mark each CLOSED or NOT CLOSED." End each closure round with an86 explicit verdict: **READY** or **NOT READY**. A verdict only counts87 for the exact plan version the reviewer actually saw — re-verify88 after any further edit, don't carry a verdict forward across a body89 change.90918. **Implement only after both reviewers issue READY** on the same plan92 version.9394## Defect checklist9596Nine recurring defect classes that fell out of the validating run.97Point reviewers at this list explicitly in later rounds — it catches98categories, not just this-specific-bug instances:991001. **Ordering bugs** — an operation assumes something upstream already101 happened (e.g., data marked processed before it's actually102 persisted).1032. **Blocking hot paths** — a slow call (LLM, network, disk) running104 inline on a thread that something else depends on staying105 responsive (a shared stream, an event loop, a lock holder).1063. **Mutable append-only files** — a file meant to be append-only107 (JSONL, a log) that something also rewrites or truncates in place,108 racing readers or losing data on a crash mid-write.1094. **Multi-writer artifacts** — more than one process/thread writing the110 same resource without a coordination story (locking, single-writer111 ownership, CAS).1125. **Free-text references into structured stores** — an LLM (or any113 producer) writing natural-language references into a field a114 structured system will later parse or join on.1156. **Missing join keys** — two pieces of state that need to correlate116 later (a request and its eventual result, an event and its replay)117 with no stable key connecting them.1187. **Missing replay cursors** — a consumer of a stream or log with no119 durable position, so a restart either reprocesses everything or120 silently skips a gap.1218. **Unbounded retries** — a retry loop with no cap, backoff ceiling, or122 dead-letter path, able to spin forever on a permanently-failing123 input.1249. **Cross-contaminating handlers** — a handler for one kind of event125 able to affect state that a different event type also owns, with no126 isolation between them.127128## See Also129130- `requirements-clarification` — for verifying a requirement's premise131 and scoping ambiguity on ordinary-sized work; use before this skill132 even applies, to confirm the work really is "big" and not just133 underspecified.134- `code-review` / `security-review` — post-implementation review, once135 code exists. This skill is deliberately upstream of those: it reviews136 the plan, not the diff.