Output: JSON only, with no prefix, no markdown fences, and no explanations. It must conform to critique.schema.json.
-
evidence is required. A short quote from the plan or a file:line reference. Without evidence the issue is dropped by the validator as a hallucination.
-
claim is one sentence. A concrete statement, not "think about X".
-
suggested_fix is an action. "Add a Definition of Done section with criteria A/B/C", not "improve testability".
-
severity:
blocker โ the plan cannot be executed as-is: logical contradiction, violated hard constraint, missing critical precondition, or data loss risk.
major โ significant gap that reduces confidence in execution: missing test strategy, unaddressed dependency, or incorrect technical claim verified via Read.
minor โ improvement that increases plan quality but does not block execution: clarity, missing detail, or incomplete but non-critical spec.
nit โ stylistic, subjective, or very low impact.
Calibration rule: for each issue, ask "can the plan be executed successfully without this fix?" If yes, use minor or nit. If the fix is needed for correct execution, use major. If the plan is broken without it, use blocker. Do not target a severity distribution; calibrate each issue from evidence and execution impact only.
-
category โ pick exactly one from the schema enum: correctness, scope, risk, testability, clarity, convention, missing_context, assumption.
-
confidence โ your confidence 0..1. If the evidence is weak, set <0.7 โ the plan author decides.
-
duplicate_of โ if your issue repeats an entry in the rejected log in substance, set its id and lower the severity to nit. Better still โ do not repeat it.
-
addresses โ if the issue refines or re-raises a concern from a previous iteration, set addresses to the immediate parent's versioned id, for example v2.C1. Reference the most recent iteration that covered this concern, not the original root. If the issue is genuinely new, set addresses: null.
-
Separate facts from conclusions. If a conclusion depends on context that is missing even after inspecting code and sources, mark it as an assumption in evidence and set category: assumption.
-
Calibrate severity from evidence. Neither pessimism nor optimism by default. blocker requires strong evidence of impact on delivery/data/security/stability. Under-rated severity is as harmful as over-rated.
If the plan references external systems, APIs, products, standards, or infrastructure providers:
Before walking the Checklist, enumerate every acceptance gate from the Work Plan table:
Walk it explicitly. If you find nothing for an item, skip it โ do not invent issues.
-
Definition of Done. Are there explicit, verifiable success criteria? Does each Work Plan step carry its own acceptance gate (an observable readiness condition)? Does verification rest on pnpm run check for broad or contract-touching changes, or a justified narrower repo script for documentation-only or tightly scoped changes?
-
Scope. Are the boundaries clearly drawn? Are there explicit non-goals? Does scope creep along the way?
-
Correctness. Are technical claims verifiable? Do the named files, flags, and APIs exist? (Check via Read.)
-
Failure handling. What if step N fails โ is that case covered by a STOP trigger? What gets migrated?
-
Migrations and consumers. When public API, CLI, config, schema, artifact, package, or role-skill contracts change: are consumers identified, docs/tests updated, and any authorized removal or migration sequence made explicit?
-
Testability. How exactly will the author verify each step? Commands, metrics, manual checks?
-
Assumptions. Are there hidden assumptions presented as facts?
-
Security, privacy, data integrity, cost. Does the plan add new attack surfaces, handle PII, change data schemas, or add meaningful runtime/infra cost? If so, is it addressed?
-
Conventions. If the repo has CLAUDE.md / conventions (no-comments, English-only, two-commit pattern, etc.), does the plan follow them?
-
Sequencing. Is the step order correct? Does step N depend on step N+M?
-
Clean target state. Does the plan leave behind unnecessary compatibility layers, crutches, rollback paths, or un-removed old code branches as technical debt, while still preserving public contracts unless a breaking change is explicit?
-
Impact Graph completeness. Does the bottom graph cover the indirect channels from the contract's coverage checklist (generated artifacts, package contents, exports/bin, lockfiles, CLI flags, config keys, schemas/artifact shapes, role skills, provider/runtime behavior, summary/status/run metadata, CI/release gates, docs, explicitly named downstream consumers)? Evidence โ a changed surface present in the Work Plan but absent from the graph.
-
Structural target rendered. When the plan changes file/directory layout, module structure, or component topology, does ## Target State render the target as a diagram (a directory tree โ ideally before โ/after โ for file moves and renames, or a structural diagram for topology changes), not prose or a flat table alone? Evidence โ a structural change in the Work Plan with no visualizable target shape. Severity minor by default; major only when the absent structure makes the move sequence or final placement genuinely ambiguous to execute.
-
At a Glance present. Does the plan open with a short ## At a Glance orientation block (outcome, blast radius, phase count, top risk) that a reader absorbs in ten seconds, before Context? Evidence โ the document jumps from the title straight into Context. Severity nit/minor only โ readability, never a blocker.
-
Self-contained sections. Does a section depend on another by position rather than by name โ "as noted above", "the file mentioned earlier", a dangling "it"/"this" โ so it loses meaning when read in isolation? Evidence โ quote the dangling back-reference. minor by default; major only when the ambiguity makes a Work Plan step genuinely unexecutable.
-
Split-readiness. Is each Work Plan phase split-ready โ self-contained enough to become a standalone plan.package/ phase doc (goal, prerequisites, touch surfaces, ordered steps, local verification, acceptance gate, common pitfalls, stop conditions)? Has the plan omitted material execution detail to stay under the size policy, instead of leaving the detail in (the orchestrator splits large plans into a plan.package/)? Evidence โ a phase a weaker model could not execute without reading other phases or the original prompt. minor by default; major only when a phase is genuinely unexecutable in isolation.
-
Frontmatter presence. Does the plan begin with a valid leading YAML frontmatter block (---โฆ---) containing all four required keys (phase_count, effort_total, phases with โฅ1 item, status)? If the block is absent or structurally malformed (missing a required key, missing the closing ---), flag as severity: blocker, category: missing_context, citing the document head in evidence. A missing frontmatter block is the upgrade trigger: a blocker here routes the plan through the creator's update mode, which adds the block rather than letting a header-less plan reach plan.final.md blocked.
-
Effort-cell coverage. Does every Work Plan phase row carry a non-empty Effort cell? Flag a missing or empty Effort cell as severity: minor, category: missing_context, citing the phase row in evidence.
-
Status coherence. Is the frontmatter status consistent with the plan body? Flag a status: clean when an Open Question lists a blocking decision, or a status: clean when a STOP trigger is already satisfied, as severity: minor, category: correctness, citing the frontmatter line and the conflicting section. (The shape gate already rejects out-of-enum values; this rule checks readiness coherence.)
-
FrontmatterโWork-Plan coherence. Does the phase_count match the number of Work Plan phase rows? Does each phases[].name correspond 1:1 to a Work Plan phase label, and does each phases[].effort match the Effort cell? Flag a mismatch as severity: minor, category: correctness, citing the frontmatter line and the Work Plan table. (The shape gate cannot cross-check these without a YAML parser; the critic is the consistency check that makes the machine-readable header reliable.)
Calibrating the structural and readability checks (clean cutover, Impact Graph completeness, structural target, At a Glance, self-contained sections): use major only when the gap genuinely blocks confident execution, and keep the pure-readability checks (At a Glance, self-contained sections) at nit/minor. Never let these displace a correctness, scope, or sequencing finding under the 8-issue limit โ raise them only when real issues leave room.