claude/plan-critic/skills/plan-critic/SKILL.md
Critique a Claude implementation plan before approving execution. Spawns parallel persona subagents (Skeptic, Architect, Verifier) to evaluate the plan against the codebase and return an Approve/Reject/Refine verdict with concrete refinements. Use when a plan has been generated (Plan Mode output, ExitPlanMode, pasted plan text, or plan file path) and needs review before code is written. Triggers on "critique this plan", "review this plan", "is this plan good", "poke holes in this plan", "should I approve this plan", or sharing a plan for evaluation.
npx skillsauth add smykla-skalski/sai plan-criticInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Critique a Claude implementation plan before any code is written. The cost of revising a plan is near-zero; the cost of revising executed code is hours of rework. This skill applies the plan-then-execute discipline rigorously: nothing gets approved until three independent personas have inspected it.
Core principle: A plan that names files generically has not been read. A plan that references verify_jwt_token at auth/middleware.go:42 has been read. The job of this skill is to tell those apart and force the second.
| Argument | Type | Description |
| :-- | :-- | :-- |
| [plan file path] | positional | Path to a markdown file containing the plan. Read with the Read tool. |
| [paste plan inline] | positional | Plan text pasted directly in the user's message. Use as-is. |
| --from-conversation | flag | Use the plan most recently produced in the current conversation (e.g., from ExitPlanMode or a planning response). |
If input is ambiguous (multiple candidates, unclear which plan), use AskUserQuestion to disambiguate before proceeding. Present these options:
--from-conversation — adopt the most recent plan produced in this conversationResolve the plan input first: read the file if a path was given, use the inline text if pasted, or fetch the most recent plan from the conversation if --from-conversation was passed. Then do a fast scope check:
If triage finds fundamental issues (not a plan, trivial, oversized), report and stop. Do not spawn subagents.
<example> Input: User pastes a one-line plan: "Fix typo in README.md line 42." Triage result: Trivial single-line change. Report "Planning overhead isn't warranted — execute directly." Skip Phase 2-5. </example> <example> Input: A plan touching 14 files across 4 packages with no symbol-level references. Triage result: Scope warning (7+ files) AND surface-level reading risk. Recommend splitting into sub-plans before review continues. </example>Spawn one Agent (subagent_type: Explore, thoroughness: medium) to build a Grounding Brief. All three review personas will share this brief — no redundant exploration.
The Grounding agent must:
path:line). Flag symbols the plan names that do not exist in the codebase.Grounding Brief output format:
## Grounding Brief
### File Verification
- `path/to/a.go` ✓ exists
- `path/to/b.go` ✗ NOT FOUND (plan references it as "the user service")
### Symbol Verification
- `verify_jwt_token` → `auth/middleware.go:42` ✓
- `UserStore.Save` → not found; closest match is `UserRepository.Persist` at `store/user.go:118`
### Callers (blast radius)
- `parseRequest()` — 23 callers (top: handler/api.go:55, handler/admin.go:88, ...)
- `newHelper()` — 0 callers (proposed but never used elsewhere)
### Existing Patterns
- HTTP handlers in `handler/` use `respondJSON()` helper — plan should match
- Error wrapping via `errors.Wrapf` is the convention — plan uses bare `fmt.Errorf`
### Related Tests
- `handler/api_test.go` covers happy path; no error-path tests
- No tests exist for the package the plan modifies most heavily
Read references/personas.md in full before spawning Phase 3 agents — it contains the exact instruction blocks for each persona.
Spawn three Agent subagents in parallel (single message, multiple Agent tool calls) using the prompts in personas.md. Parallelize because the personas are independent perspectives on the same inputs, so sequential spawning wastes wall time without improving quality:
Each persona receives the full plan text and the Grounding Brief from Phase 2.
Recall the Triage scope flags from Phase 1 and the Grounding Brief from Phase 2 before reading persona output, so the verdict stays anchored to verified evidence rather than persona assertions. After all three personas return, synthesize their output rather than concatenate it because raw concatenation hides duplication and obscures cross-cutting signals:
handler.go, Architect says the plan ignores 20 callers there, Skeptic says no test covers the new behavior — together, this is a much stronger blocker than any one alone.Produce the final report in this exact structure:
# Plan Review
## Verdict: [APPROVE | REFINE | REJECT]
**One-line summary:** [Why this verdict in one sentence]
**Plan stats:** [N files, M steps, depth: Deep/Surface/Shallow]
## Triage Notes
[Any flags from Phase 1 — scope warnings, size concerns, etc. Skip if clean.]
## Grounding Brief
[Full output from Phase 2 — file/symbol verification, callers, patterns, tests]
## Verifier Findings
[Output from Persona 1]
## Architect Findings
[Output from Persona 2]
## Skeptic Findings
[Output from Persona 3]
## Cross-Cutting Issues
[Findings that emerge only from combining all three persona perspectives. Skip if none.]
## Refinement List
[Only if verdict is REFINE. Concrete, ordered list of changes to the plan before approval:]
1. Read `path/to/file.go` lines X-Y to verify assumption about Z
2. Add step to update the 14 callers of `funcName` listed in the Grounding Brief
3. Specify success criterion for step 4 (e.g., "tests in `foo_test.go` pass")
4. ...
## Rejection Rationale
[Only if verdict is REJECT. What's fundamentally wrong and what Claude must do before re-planning.]
## Next Action
[One of:
- "Approved — proceed with execution."
- "Refine the plan using the list above, then re-submit for review."
- "Reject — Claude should read [specific files] and re-plan from scratch."]
<example>
Plan claims to update `UserStore.Save` callers. Grounding Brief reports `UserStore.Save` not found; closest is `UserRepository.Persist`. Verifier flags surface reading. Verdict: **REJECT**. Next action: Claude must read `store/user.go` and re-plan against the real symbol.
</example>
<example>
Plan touches 4 files, names 6 symbols with line numbers, all verified by the Grounding Brief. Architect confirms patterns match existing handlers. Skeptic finds one missing edge case (empty payload). Verdict: **REFINE**. Refinement list: one entry — add empty-payload handling in step 3.
</example>
These principles prevent common plan-review anti-patterns. Re-read this section before producing the verdict in Phase 4 to keep calibration consistent across reviews:
X exists and the Brief says X not found, the Brief wins because plans hallucinate and greps don't.auth/middleware.go:42 and the Verifier confirms it, call this out so good patterns get reinforced.This skill is not designed for, and you should avoid using it on:
staff-code-review insteadCommon failure modes and recovery:
Each anti-pattern lists the failure mode followed by the correct alternative:
development
Run the council workflow from a normal Copilot session only when the user explicitly asks for council review, multi-persona critique, debate, design review, code review, architecture feedback, UX review, or tradeoff analysis. Do not use it for commit, stage, merge, approval, or generic pre-commit requests. Accept the same mode syntax as the bundled council reviewers: `core|auto|core-eng|core-ux|core-mix|all|debate <problem|@file>`. During council slash-command use, the current session agent moderates reviewer agents directly. Runs broader than 6 reviewers require explicit AskUserQuestion approval before launch.
tools
Use when the user invokes $council, $council:council, Council review, or Council debate. Use loaded SKILL body or one direct installed `skills/council/SKILL.md` read. Direct read path must contain `/.codex/plugins/cache/sai/council/` and end `/skills/council/SKILL.md`. `cd <cwd> && sed -n ... <path>` is valid. Do not use `pwd`, `ls`, `find`, `rg`, `cat`, multiple `&&`, or `;`. Never use repo-local paths. If unavailable, stop exactly `Council not run: skill unavailable.` At most one pre-tool message, exact `Council progress:` line only. Non-final lines start `Council progress:`.
development
Run council reviews with sourced engineering, UX, reliability, performance, AI, and strategy persona lenses. Use when the user asks for council review, multi-persona critique, debate, design review, code review, architecture feedback, UX review, or tradeoff analysis.
development
Use when the user asks for council review, multi-persona critique, debate, design review, code review, architecture feedback, UX review, or tradeoff analysis. Bare invocations use `core` profile auto-detect; explicit `auto` selects the best-fit 6 personas from the sourced 27-persona engineering and UX roster. Users can still pin `core`, `core-eng`, `core-ux`, `core-mix`, `all`, or `debate`.