iterative-plan-review
SkillFiles & storageSharpens and stress-tests an existing plan file through multiple codebase-grounded review passes, editing it in place and recording every finding and iteration in cross-referenced companion files. Use this skill whenever the user wants to iterate on, refine, tighten, or improve a plan. Also use it when the user asks to verify, validate, or confirm feasibility of an approach. Does not implement plan steps, write test plans, review code, or investigate bugs, and does not generate new plans from scratch — use plan-a-feature for a new plan. Runs its review rounds to completion without pausing between them; to review each round as it lands, use pairing.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the iterative-plan-review skill
What this skill tells your AI
The instructions your AI receives, as published by testdouble/han in han-planning/skills/iterative-plan-review/SKILL.md and read by ahel’s review.
Project Context
- CLAUDE.md: !
find . -maxdepth 1 -name "CLAUDE.md" -type f - project-discovery.md: !
find . -maxdepth 3 -name "project-discovery.md" -type f - personal config directory: !
bash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh" 2>/dev/null || echo "$HOME/.claude" - project .han/config.md: !
cat .han/config.md 2>/dev/null || echo ""
As your first action, use the Read tool on .han/config.md inside the personal config directory path above. A read
that returns no file is no personal configuration: continue silently. When that file or the project .han/config.md
probe supplies content, apply it per config-rule.md, which governs precedence
between the two files, relative-path resolution, and what to do with a file that reads but cannot be used.
Review Approach
- Source the shared readability standard early. Invoke
han-communication:readability-guidancebefore you edit, and apply it to any plan prose this review rewrites. Hold the named audience: the reader of the plan this review refines. The frame governs how a fact is said, never whether a required fact appears — keep the evidence citations, file:line references, and IDs the plan depends on. - Read the full plan before challenging — an assumption that looks wrong in isolation may make sense in context.
- Ground challenges in codebase evidence: "The API handler at
src/api/handler.go:47returns XML, not JSON" is actionable; "This assumes the API returns JSON" is not. - Check overlap against existing code, not just the plan — the most valuable overlap findings are external utilities or patterns the codebase already has.
- Ask practical ambiguity questions — "Should this handle concurrent access?" is only useful if there's evidence concurrent access actually happens.
- YAGNI is a first-class review pillar. Apply the evidence-based YAGNI rule from
../../references/yagni-rule.md to every plan item the review touches — every
behavior, plan step, abstraction, configuration knob, runbook, observability hook, infrastructure component, test
category, ADR clause, or coding-standard line. Items that fail the evidence test or have a strictly simpler version
available are first-class findings (
Category: YAGNI candidate), not polish. Resolution paths: cite missing evidence and keep, replace with simpler version, or move to the plan's## Deferred (YAGNI)section with the reopening trigger named. YAGNI candidates are surfaced visibly to the user — never silently dropped, never silently kept. Every plan item is ongoing maintenance and a pattern future agents will copy. - Evidence quality is a first-class review pillar. Apply the companion evidence rule from ../../references/evidence-rule.md alongside the YAGNI gate. YAGNI asks whether a plan item has any evidence at all; the evidence rule asks how strong that evidence is. Specifically: name the trust class of each citation a plan item rests on (codebase, web, provided); apply the corroboration gate to web-source claims that drive a recommendation (single-source web claims get marked and cannot stand alone); and label claims with no evidence at any tier as a distinct state rather than treating them as weak evidence. The proximity-to-origin principle is a heuristic, not a strict tier list; do not raise findings purely because a plan item cites docs instead of running code.
- The review lives in three cross-referenced files. The plan file is the primary artifact edited in place and stays
at the root of
{plan-dir}/;review-findings.mdrecords every finding and how it was resolved, andreview-iteration-history.mdrecords each iteration or round — both companion artifacts live in{plan-dir}/artifacts/to keep the plan folder uncluttered. The plan gets a standardized## Review Historysection at the bottom pointing to the companion files. Inline(F#)markers are NOT added to plan sentences — forward traceability lives in the findings file'sChanged in plan:field. (Inline([T#](...))markers in spec-aware mode remain — they tag load-bearing mechanic-driven spec sentences and are not finding markers.) The findings and iteration files (siblings insideartifacts/) cross-link throughRaised in round:/Findings raised:fields and both recordChanged in plan:sections. Any edit to one file requires updating the matching fields in the others.
Iterative Plan Review
Step 1: Locate the Plan and Set Up Companion Files
Find the plan file from the user's argument. If no path was provided, use Glob to find ~/.claude/plans/*.md — Glob
returns files sorted by modification time, so the first result is the most recent plan. Read the full plan file and
understand its structure, scope, and current state before proceeding.
Resolve project config: read CLAUDE.md's ## Project Discovery section for language, framework, docs, ADR, and
coding-standards directories; fall back to project-discovery.md; fall back to Glob defaults (docs/, docs/adr/,
docs/coding-standards/). This context informs assumption evaluation and overlap checks in later steps.
Spec-aware mode detection
After reading the plan file, determine whether it is a feature-specification.md produced by (or compatible with)
han-planning:plan-a-feature. Engage spec-aware mode when either signal holds:
- Primary signal — the plan's filename is exactly
feature-specification.md. - Fallback signal — the file contains the canonical top-level headings of a feature spec:
## Outcome,## Actors and Triggers,## Primary Flow, and## Coordinations(at least three of these four).
When spec-aware mode engages, state one line to the user:
Detected feature specification; applying spec-stage rules to this review. Say "general mode" to override if this file is not a behavioral spec.
This confirmation lets the user correct a misclassification (e.g., the file was renamed, or is a document that happens to share headings but isn't a spec). If the user overrides, drop spec-aware mode for the rest of the session.
When spec-aware mode is engaged, detect whether {plan-dir}/artifacts/feature-technical-notes.md already exists. If it
does NOT exist, the file is treated as absent for the duration of this review unless a load-bearing finding causes it to
be created lazily. When the file is absent, omit every T#-related sentence from agent briefs, the spec-maturity tag
set, and the round entry's Changed in tech-notes: field — do not add boilerplate qualifiers like "if it exists."
When the file is present (or once it has been created lazily), restore the T# instructions for the agents from that
point forward.
When spec-aware mode is engaged, the following apply across later steps:
- Content rule — the spec must obey
plan-a-feature's operating-principles rule: no language primitives, file/line references, function/class names, library mechanics, implementation patterns, or internal flag names in behavioral sentences. Any finding that surfaces a mechanic in the spec is routed per the rule. - Mechanic routing — a finding that requires a mechanic to explain a behavior is classified as:
- Load-bearing (affects observable behavior) → extract the mechanic to a new
T#entry in{plan-dir}/artifacts/feature-technical-notes.md(creating the file lazily if this is the first qualifying note). Restate the spec sentence behaviorally and add an inline([T#](artifacts/feature-technical-notes.md#...))link. Record the write in the F# entry'sChanged in tech-notes:field. - Discoverable from code repo → restate the spec sentence behaviorally and cite the evidence source on the related
D#entry in{plan-dir}/artifacts/decision-log.md(if the spec has a decision log). Do not write aT#. - Pure implementation → remove from the spec entirely. Record as an F# with
Resolved by: deferred to open item, noting that the mechanic belongs toplan-implementation.
- Load-bearing (affects observable behavior) → extract the mechanic to a new
"mechanics leaking into spec"finding class — specialists (and self-review) tag any behavioral sentence that leaks implementation mechanics asCategory: mechanics leaking into spec. Resolution of this class rewrites the offending sentence behaviorally and, when needed, extracts the mechanic per the routing above.
Determine the companion file paths. They live in the artifacts/ subfolder of the plan's directory (create the
subfolder when the first companion file is written):
{plan-dir}/artifacts/review-findings.md{plan-dir}/artifacts/review-iteration-history.md{plan-dir}/artifacts/feature-technical-notes.md— spec-aware mode only, and lazily created. Written only when the review produces at least one load-bearingT#. Follow the cross-reference invariants in feature-technical-notes-template.md as applied byplan-a-feature.
For legacy reviews produced before the artifacts layout was introduced, the companion files may exist at
{plan-dir}/review-findings.md and {plan-dir}/review-iteration-history.md. When those legacy paths are found,
continue appending to them at their existing location rather than migrating — keep the cross-references stable and note
the legacy path in the plan's Review History section.
If any companion file already exists (prior review of the same plan), read it and append new F# / R# / T# entries
continuing from the highest existing ID — do not overwrite. Numbering must be globally unique across all review sessions
of the same plan so cross-references remain stable.
If the companion files do not exist, defer creation until the first iteration or round actually produces content. Do not
write empty stub files. When the first companion file is written, create the artifacts/ subfolder if it does not
already exist.
Step 2: Choose Review Mode and Size
Default to small. Start the classification at small and only escalate to medium or large when the signals below clearly require it. When a signal is borderline, stay at the smaller band. Use these signals:
- Small (default) — 2–3 files affected, single system, no cross-cutting concerns. Defaults to lightweight mode (no team review). Iteration cap: 1 round.
- Medium — 3–5 files, one or two adjacent systems, may touch a single cross-cutting concern (e.g., one API contract or one new permission check). Defaults to team mode with 1 chosen specialist. Round cap: 2.
- Large — more than 5 files, multiple systems, architectural changes, security or data implications, or the user explicitly requests full agent review. Defaults to team mode with 2 chosen specialists. Round cap: 3.
The cap is counted in chosen specialists, not in total seats. han-core:junior-developer and
han-core:adversarial-validator are seated on every team before any specialist is chosen, and
han-core:evidence-based-investigator joins them whenever the plan makes claims about code, so counting seats would hide
how much domain coverage a band actually buys.
| Size | Mode | Chosen specialists | Round cap |
|---|---|---|---|
| Small | lightweight | n/a (self-review only) | 1 |
| Medium | team | 1 | 2 |
| Large | team | 2 | 3 |
Size override. If $size is non-empty (the user passed small, medium, large, or dynamic as the first
argument), use it: a band value is the size and skips the signal-based classification above, while dynamic forces the
signal-based classification even when the project config sets a default band. If $size is empty and the project
config supplies a band via default-swarm-size (per the config rule in
../../references/config-rule.md), use that band and skip the signal-based
classification. State the chosen size and mode to the user in one line with the justification (e.g., "Medium: 4 files,
one auth surface", "Medium: passed via $size", or "Medium: from the project .han/config.md default-swarm-size", naming whichever of the two files supplied it). If the user
asked for team review on a plan that would otherwise be small, honor the request and treat it as medium-or-larger. If
the user explicitly names a size in conversation, accept the override.
In lightweight mode, skip Step 3 and run the checklist-based iteration loop in Step 4 alone. In team mode, proceed to Step 3 to assemble a team and Step 5 to run team iterations.
Step 3: Select the Team (team mode only)
Read team-selection.md. It carries the roster, the signals that select each specialist, and the caps each size band sets.
Select against the size chosen in Step 2, state the team and the reason in one short message before launching, and accept the user's override of the size, the specialists, or both.
Step 4: Lightweight Iteration Loop (lightweight mode only)
Each iteration follows the checklist at iteration-checklist.md. Complete every
section of the checklist before moving to the next iteration. If an iteration reveals changes are needed, make them to
the plan file using Edit.
For each iteration: identify and classify assumptions as primary or secondary, and evaluate them against the codebase by reading code, checking existing patterns, or verifying against project documentation. Assumptions may be about user behavior, system behavior, scope boundaries, or ordering. If an assumption is refuted, the plan must change in this iteration to address it.
Check for internal overlap (redundant steps within the plan) and external overlap (patterns, utilities, or
infrastructure that already exist in the codebase — use Grep and Glob to search). If overlap exceeds 80%, propose
consolidation. If overlap is intentional, document why in the plan.
Surface any ambiguity as contextual questions that state the impact, describe the tradeoffs, and allow nuanced follow-up.
Self-review also runs the YAGNI sweep on every iteration. Walk every plan item and apply the rule from
../../references/yagni-rule.md: does the item cite accepted evidence (user-described
need, named direct dependency, existing code path that breaks, applicable regulation, documented incident/metric)? When
evidence applies, is there a strictly simpler version that satisfies the same evidence? Items that fail are raised as
Category: YAGNI candidate findings with one of three resolution paths: cite missing evidence and keep, replace with
simpler version (update the plan in-place and record the rationale), or move to the plan's ## Deferred (YAGNI) section
with the reopening trigger named. Apply the named anti-patterns as auto-flags — runbooks for never-fired alerts,
observability for non-flowing telemetry, single-implementation interfaces, configuration knobs no caller sets, "for
future flexibility", symmetry/completeness, etc.
When spec-aware mode is engaged, self-review also scans the plan for behavioral sentences that leak implementation
mechanics. For each such sentence, raise a Category: mechanics leaking into spec finding and route the mechanic per
the spec-aware rules in Step 1 (load-bearing → new T#; discoverable from code → cite evidence; pure implementation →
defer to plan-implementation). The lightweight loop handles the extraction in-line — self-review is not a specialist,
and there is no mandatory agent consultation for these findings.
Record the iteration's findings and round entry before closing the iteration:
-
Classify each finding as major or minor before recording. Major: changes a behavioral commitment, edge-case rule, alternate flow, or failure mode in the plan; touches security/auth/PII/secrets/supply-chain; touches a coordination across actors, services, or subsystems; is a
T#-contradiction; or is a "mechanics leaking into spec" finding. Minor: typo, wording, naming, formatting, citation cleanup. Force-up to major if the finding text contains keywords like "auth", "PII", "race", "ordering", "coordination", "edge case", "T#". When in doubt, major.For each refuted assumption, overlap finding, ambiguity, or edge case that required attention, append an
F#entry to{plan-dir}/artifacts/review-findings.mdusing the review-findings-template.md format (create theartifacts/subfolder if it does not already exist; if a legacy{plan-dir}/review-findings.mdfrom a prior session is in use, append there instead). Major findings go under## Major findingswith the full structured fields (Agent:self-review, Category, Finding, Evidence considered, Resolution, Resolved by, Raised in round, Changed in plan, Changed in tech-notes). Minor findings go under## Minor editsas a single bullet (F#: {one-line description} — self-review — {section changed, or —}). The F# counter is shared across both classes. -
Append an
R#entry to{plan-dir}/artifacts/review-iteration-history.mdusing the review-iteration-history-template.md format (or the legacy{plan-dir}/review-iteration-history.mdif the prior session used that path). SetMode:tolightweight,Specialists engaged:toself-review, list theF#IDs produced this iteration underFindings raised:, fillChanged in plan:with the plan sections edited, and record the stability assessment and next-step recommendation.
Deterministic stop rule: stop iterating when the most recent iteration produced ≤ 2 new findings AND zero major findings (security, T#-contradiction, missing coordination, unhandled failure mode in a primary flow path). The size cap from Step 2 sets the upper bound: small = 1 iteration, medium = 2, large = 3. Never exceed the size cap.
Skip to Step 6.
Step 5: Team Iteration Rounds (team mode only)
Run rounds up to the round cap from Step 2: two at medium, three at large. The deterministic stop rule below ends the loop earlier whenever a round goes quiet, so the cap is a ceiling rather than a target. Each round:
- Parallel team review with domain-scoped briefs. Launch every team agent in a single message so they run concurrently. Use domain-scoped briefs — do not hand every agent the full plan and every companion file. Pass each agent only the plan sections relevant to its domain plus pointers, and instruct it to read further on demand only if its domain needs it. Default mapping:
Shortened here. Read the whole file on GitHub.
Signals
- GitHub stars
- 263
- Forks
- 23
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
iterative-plan-review- Source
- github.com/testdouble/han