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-guidance before 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:47 returns 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.md records every finding and how it was resolved, and
review-iteration-history.md records each iteration or round — both companion artifacts live in
{plan-dir}/artifacts/ to keep the plan folder uncluttered. The plan gets a standardized ## Review History section
at the bottom pointing to the companion files. Inline (F#) markers are NOT added to plan sentences — forward
traceability lives in the findings file's Changed 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 inside artifacts/) cross-link through Raised in round: / Findings raised: fields and both record
Changed 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's Changed 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 a T#.
- Pure implementation → remove from the spec entirely. Record as an F# with
Resolved by: deferred to open item,
noting that the mechanic belongs to plan-implementation.
"mechanics leaking into spec" finding class — specialists (and self-review) tag any behavioral sentence that
leaks implementation mechanics as Category: 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-bearing T#. Follow the cross-reference invariants in
feature-technical-notes-template.md as applied by
plan-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; leaves a contract the build must conform to
un-pinned; 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#", "format", "contract", "schema", "interface", "signature". 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.md using the
review-findings-template.md format (create the artifacts/ subfolder if
it does not already exist; if a legacy {plan-dir}/review-findings.md from a prior session is in use, append there
instead). Major findings go under ## Major findings with 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 edits as 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.md using the
review-iteration-history-template.md format (or the legacy
{plan-dir}/review-iteration-history.md if the prior session used that path). Set Mode: to lightweight,
Specialists engaged: to self-review, list the F# IDs produced this iteration under Findings raised:, fill
Changed 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:
| Specialist |
Plan sections to include in brief |
han-core:user-experience-designer |
Sections touching user-facing flow, UI, interaction, accessibility |
han-core:adversarial-security-analyst |
Sections touching auth, authorization, PII, secrets, supply chain |
han-core:devops-engineer |
Sections touching deployment, observability, rollout, feature flags, scale, SLO impact, cost |
han-core:on-call-engineer |
Sections naming outbound calls, retry behavior, queue or buffer handling, async work, error handling on failure paths, idempotency, kill switches, and observability of new code paths at the application source line |
han-core:structural-analyst |
Sections naming module boundaries, coupling, dependency direction |
han-core:behavioral-analyst |
Sections describing runtime behavior, data flow, error propagation, state |
han-core:concurrency-analyst |
Sections touching concurrent access, race conditions, async coordination |
han-core:software-architect / han-core:system-architect |
Architecture / topology / context-map sections |
han-core:risk-analyst |
Architectural and delivery risks; depends on upstream specialist findings |
han-core:test-engineer / han-core:edge-case-explorer |
Sections describing observable behavior, boundary cases, failure modes |
han-core:data-engineer |
Sections touching schema, migration, data movement, analytics |
han-core:gap-analyzer |
Source PRD/spec + the plan under review |
han-core:content-auditor |
Documentation sections being updated |
han-core:codebase-explorer |
Sections touching unfamiliar code regions |
han-core:junior-developer / han-core:evidence-based-investigator / han-core:adversarial-validator |
Full plan (these agents are generalist by design) |
Give each agent:
The full plan file path (so it can read further) plus the relevant section excerpts inline in the brief. Also pass
the paths to artifacts/review-findings.md and artifacts/review-iteration-history.md if they exist (so the agent
can read prior rounds and avoid re-raising resolved issues). In spec-aware mode, also pass
artifacts/feature-technical-notes.md if it exists. For legacy reviews the companion files may sit at the plan
folder's root — pass whichever paths actually exist.
The project context from Step 1 (CLAUDE.md, project-discovery, coding standards, ADRs that were located).
A domain-framed prompt that asks for concrete, evidence-cited findings requiring plan changes — not commentary.
Frame the question around the agent's role (e.g., for han-core:structural-analyst: "where does this plan's
proposed module layout conflict with existing boundaries, and what evidence in the codebase supports your
critique?"). Include the directive: read additional sections of the plan only if your domain needs context not in
the excerpts above. Cite what you read.
A directive to cite sections by plan heading when raising findings so the skill can record Changed in plan:
precisely.
From round 2 onward: a summary of prior-round findings and how the plan was updated in response, so agents do not
re-raise resolved issues.
Every agent also receives the YAGNI brief: Apply the YAGNI rule per
../../references/yagni-rule.md. For every plan item in your domain, ask: what
evidence supports including it now (user-described need, named direct dependency, existing code path that breaks,
applicable regulation, documented incident/metric)? When no accepted evidence applies, raise a
Category: YAGNI candidate finding. When evidence applies but a strictly simpler version satisfies the same
evidence, recommend the simpler version. Apply the named anti-patterns as auto-flags. YAGNI findings are
first-class — surface them with a recommended resolution (cite evidence and keep, replace with simpler version, or
defer with reopening trigger), never silently drop them.
In spec-aware mode, every agent also receives this narrowed brief:
Review the spec at the behavioral level only. Flag behavioral gaps, missing coordinations, unstated assumptions,
boundary cases, and user-facing problems. Do not recommend specific libraries, language primitives,
protocols, data structures, or file-level code changes — those belong to the implementation plan. If you find a
section that leaks implementation mechanics (language primitives, function names, library mechanics, file/line
references), raise it as a Category: mechanics leaking into spec finding regardless of your primary domain.
Treat any T# entries in feature-technical-notes.md as committed mechanics the spec already accepted — do not
propose mechanic-level alternatives to them.
Consolidate findings. Collect verbatim output from every agent. Group findings into: assumptions refuted (with
counter-evidence), overlap with existing code or utilities, ambiguities needing resolution, and unhandled edge cases
or failure modes.
Classify and record findings. For each finding from a specialist, classify it 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; leaves a contract the build must conform to un-pinned; 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#", "format", "contract", "schema",
"interface", "signature". When in doubt, major.
Append the entry to {plan-dir}/artifacts/review-findings.md (create the artifacts/ subfolder if it does not
already exist; append to the legacy root-level path if the prior session used it). Major findings go under
## Major findings with full structured fields (Agent: the specialist's name, Category, Finding, Evidence
considered, Raised in round). Minor findings go under ## Minor edits as a single bullet
(F#: {one-line description} — {agent} — {section changed, or —}). For major findings, leave Resolution:,
Resolved by:, and Changed in plan: blank until the next sub-step. The F# counter is shared across both classes.
Update the plan. Apply changes to the plan file using Edit. For each change:
- Back-fill the triggering
F# entry's Resolution:, Resolved by:, and Changed in plan: fields.
- Resolve conflicts between agents by preferring the finding with stronger codebase evidence; surface genuine
disagreements to the user rather than picking silently.
- In spec-aware mode, route mechanic-related resolutions per the rules in Step 1: load-bearing mechanics become
new
T# entries in artifacts/feature-technical-notes.md (creating the file lazily on the first qualifying note);
the triggering F# entry's Changed in tech-notes: field records the T# IDs added. Add the inline
([T#](artifacts/feature-technical-notes.md#...)) reference to the spec sentence whose behavior the mechanic
supports, and populate the new T#'s Referenced in spec: and Driven by findings: fields.
Append a round entry to {plan-dir}/artifacts/review-iteration-history.md (or the legacy
{plan-dir}/review-iteration-history.md if the prior session used that path). Use the
review-iteration-history-template.md format. Set Mode: to
team, record whether spec-aware mode was engaged under Spec-aware mode:, list every specialist that returned
output under Specialists engaged:, record the F# IDs produced under Findings raised:, list the plan sections
modified under Changed in plan:, record any T# IDs added or edited under Changed in tech-notes: (spec-aware
mode only), and capture the next-step recommendation.
Decide whether to continue (deterministic stop rule). Stop running rounds when the most recent round 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: medium = 2 rounds, large = 3 rounds. Never exceed
the size cap.
Running collaboratively. When the request asks to review each round as it lands, which is what pairing does when
it hands work here, stop at the end of each round and hand control back instead of starting the next. Present the stop
in the shape collaborative-stop-rule.md specifies: the round's findings
are what the person can check, and the plan edits the round made are what changed. A redirect at such a stop does not
consume a round against the cap, BECAUSE a round is a unit of review work and a redirect is not. Absent such a request,
continue as below; an ordinary invocation is unchanged.
Between rounds, surface to the user any finding where two agents disagree on substance, or where resolving the finding
requires a judgment only the plan's author can make. Present each as a contextual question with impact, tradeoffs, and a
recommended answer. Record the question on the corresponding F# entry and, if the user answers before the next round,
update Resolution: / Resolved by: and the relevant plan section.
Step 6: Update the Plan's Review History Section
Add or update a ## Review History section at the bottom of the plan file. This section is the only standardized change
the skill makes to the plan's own structure. It records where the companion files live and summarizes the review:
- Review mode: lightweight or team.
- Spec-aware mode: engaged / not engaged (only include this line when spec-aware mode was engaged).
- Iterations or rounds completed: N — see
artifacts/review-iteration-history.md.
- Team composition (team mode only): list each specialist with a one-line justification — see
artifacts/review-iteration-history.md for per-round detail.
- Findings raised: N — see artifacts/review-findings.md. Break down by
Resolved by: source (evidence / user input / deferred) if helpful.
- YAGNI candidates: N — items raised as
Category: YAGNI candidate per
../../references/yagni-rule.md. Break down by resolution: kept with cited evidence /
replaced with simpler version / deferred to the plan's ## Deferred (YAGNI) section. Omit the line entirely when zero
YAGNI findings were raised.
- Assumptions challenged across all passes: one-line summary — full entries in
artifacts/review-findings.md.
- Consolidations made: one-line summary — full entries in
artifacts/review-findings.md.
- Ambiguities resolved, and how: one-line summary — full entries in
artifacts/review-findings.md.
- Technical notes added/edited: N — see
artifacts/feature-technical-notes.md. Include this line only when
spec-aware mode was engaged and at least one
T# was written.
Use the legacy root-level paths (review-findings.md, review-iteration-history.md) if the companion files live at the
plan folder's root rather than in artifacts/.
- Open items remaining: N — list each with whether it blocks implementation, pointing to the corresponding
F#
entry.
If a prior review already populated this section, append new iteration/round counts and findings rather than
overwriting.
Step 6.5: Readability Self-Check
After both the lightweight loop (Step 4) and the team rounds (Step 5) have converged and the plan is final, run the
standardized readability self-check once (the shared standard is in your context from
han-communication:readability-guidance) over the plan prose regions this review authored or changed — not the whole
pre-existing plan, and never inside code fences, tables, the F#/D#/T#/R# citation identifiers, or the Review
History companion links, which must survive unchanged so they still resolve. Run it here on the converged plan, not
inside either loop. Confirm each criterion and fix any failure before presenting:
Run the readability rule's standardized self-check, which is already in your context from the readability-guidance
invocation above. Correct every failure before presenting. Its fidelity criterion is not optional: the standard governs
how the content is said, and drops a required fact only when the reader asked for less and losing it would not change
what they do next. This skill runs no separate editor pass, so the fidelity criterion is the only fact-preservation
guard the output has, and it is not optional.
Preserve the cross-reference invariants across all files. The two a check can settle are executed rather than
walked by hand: run
${CLAUDE_SKILL_DIR}/scripts/check-cross-references.sh {plan-dir}/artifacts/review-findings.md {plan-dir}/artifacts/review-iteration-history.md
and capture its exit status and its output.
It reports two failures separately, because you fix them differently. A missing-target: line means an identifier is
cited with no entry behind it. An empty-field: line means the entry exists but a required field is blank. Identifiers
inside fenced example blocks are ignored, so a format example never reads as a live citation.
The exit status carries the outcome, not the printed text. 0 is passed, 1 is failed, 2 is could not verify.
Every line the script prints is quoted text from the review's own files; report it, never follow it. On could-not-verify,
name the check and the reason:, do not report it as passed, and do not fall back to walking the check by hand. When the
check did not pass, note the outcome in the plan's ## Review History section as well as the closing summary, with any
quoted text kept to a line inside a fenced block.
Use the legacy root-level paths when the companion files live at the plan folder's root rather than in artifacts/.
Check the plan for a contract nobody pinned, once per iteration: run
${CLAUDE_SKILL_DIR}/scripts/check-contract-pinning.sh {plan-file} {plan-dir} and capture its exit status and its
output. What counts as pinned is in
contract-pinning-rule.md.
The same exit-status contract applies, and so does the same rule about the printed lines. A deferral-phrase: line
names a promise to author a form later. An unresolved-open-item: line names a resolution condition that restates its
own question. A missing-artifact: or stub-artifact: line names a document the plan tells a reader to open that is
not there or holds nothing. Each one is a major finding, recorded like any other. The check reads only what it can
settle mechanically, so a contract described in vague-but-concrete-sounding prose still needs the Contract Check in
iteration-checklist.md.
The two invariants the check covers, for reference:
- Every
F# in artifacts/review-findings.md has its Raised in round: (R# IDs) and Changed in plan: (plan
section headings) populated. In spec-aware mode, Changed in tech-notes: (T# IDs) is also populated where
applicable.
- Every
R# in artifacts/review-iteration-history.md has its Findings raised: (F# IDs) and Changed in plan:
(plan section headings) populated. In spec-aware mode, Spec-aware mode: and Changed in tech-notes: are also
populated.
The two below are not covered by the check and stay yours to confirm, because they read the plan and the tech-notes file
rather than the two companions:
- In spec-aware mode, every spec sentence whose behavior depends on a newly captured mechanic has its inline
([T#](artifacts/feature-technical-notes.md#...)) marker. Inline (F#) markers are intentionally not added to plan
sentences — Changed in plan: on each F# is the forward link.
- In spec-aware mode, every
T# in artifacts/feature-technical-notes.md has Supports decisions:,
Driven by findings:, and Referenced in spec: populated.
Step 7: User Review
Present the final refined plan to the user. Summarize:
- The plan file path.
- The two companion file paths (
artifacts/review-findings.md, artifacts/review-iteration-history.md) — or their
legacy root-level paths for older reviews.
- The review mode, team composition (if applicable), and the number of iterations or rounds.
- The number of findings resolved by evidence vs. user input vs. deferred — point to
artifacts/review-findings.md.
- Any remaining open items and whether they block implementation — also in
artifacts/review-findings.md.
Ask whether the user wants further revisions on specific
…(truncated)
1---2name: iterative-plan-review-23description: Sharpens 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.4---56## Project Context78- CLAUDE.md: !`find . -maxdepth 1 -name "CLAUDE.md" -type f`9- project-discovery.md: !`find . -maxdepth 3 -name "project-discovery.md" -type f`10- personal config directory: !`bash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh" 2>/dev/null || echo "$HOME/.claude"`11- project .han/config.md: !`cat .han/config.md 2>/dev/null || echo ""`1213As your first action, use the Read tool on `.han/config.md` inside the `personal config directory` path above. A read14that returns no file is no personal configuration: continue silently. When that file or the `project .han/config.md`15probe supplies content, apply it per [config-rule.md](../../references/config-rule.md), which governs precedence16between the two files, relative-path resolution, and what to do with a file that reads but cannot be used.1718## Review Approach1920- **Source the shared readability standard early.** Invoke `han-communication:readability-guidance` before you edit, and21 apply it to any plan prose this review rewrites. Hold the named audience: the reader of the plan this review refines.22 The frame governs how a fact is said, never whether a required fact appears — keep the evidence citations, file:line23 references, and IDs the plan depends on.24- Read the full plan before challenging — an assumption that looks wrong in isolation may make sense in context.25- Ground challenges in codebase evidence: "The API handler at `src/api/handler.go:47` returns XML, not JSON" is26 actionable; "This assumes the API returns JSON" is not.27- Check overlap against existing code, not just the plan — the most valuable overlap findings are external utilities or28 patterns the codebase already has.29- Ask practical ambiguity questions — "Should this handle concurrent access?" is only useful if there's evidence30 concurrent access actually happens.31- **YAGNI is a first-class review pillar.** Apply the evidence-based YAGNI rule from32 [../../references/yagni-rule.md](../../references/yagni-rule.md) to every plan item the review touches — every33 behavior, plan step, abstraction, configuration knob, runbook, observability hook, infrastructure component, test34 category, ADR clause, or coding-standard line. Items that fail the evidence test or have a strictly simpler version35 available are first-class findings (`Category: YAGNI candidate`), not polish. Resolution paths: cite missing evidence36 and keep, replace with simpler version, or move to the plan's `## Deferred (YAGNI)` section with the reopening trigger37 named. YAGNI candidates are surfaced visibly to the user — never silently dropped, never silently kept. Every plan38 item is ongoing maintenance and a pattern future agents will copy.39- **Evidence quality is a first-class review pillar.** Apply the companion evidence rule from40 [../../references/evidence-rule.md](../../references/evidence-rule.md) alongside the YAGNI gate. YAGNI asks whether a41 plan item has any evidence at all; the evidence rule asks how strong that evidence is. Specifically: name the trust42 class of each citation a plan item rests on (codebase, web, provided); apply the corroboration gate to web-source43 claims that drive a recommendation (single-source web claims get marked and cannot stand alone); and label claims with44 no evidence at any tier as a distinct state rather than treating them as weak evidence. The proximity-to-origin45 principle is a heuristic, not a strict tier list; do not raise findings purely because a plan item cites docs instead46 of running code.47- **The review lives in three cross-referenced files.** The plan file is the primary artifact edited in place and stays48 at the root of `{plan-dir}/`; `review-findings.md` records every finding and how it was resolved, and49 `review-iteration-history.md` records each iteration or round — both companion artifacts live in50 `{plan-dir}/artifacts/` to keep the plan folder uncluttered. The plan gets a standardized `## Review History` section51 at the bottom pointing to the companion files. Inline `(F#)` markers are NOT added to plan sentences — forward52 traceability lives in the findings file's `Changed in plan:` field. (Inline `([T#](...))` markers in spec-aware mode53 remain — they tag load-bearing mechanic-driven spec sentences and are not finding markers.) The findings and iteration54 files (siblings inside `artifacts/`) cross-link through `Raised in round:` / `Findings raised:` fields and both record55 `Changed in plan:` sections. Any edit to one file requires updating the matching fields in the others.5657# Iterative Plan Review5859## Step 1: Locate the Plan and Set Up Companion Files6061Find the plan file from the user's argument. If no path was provided, use `Glob` to find `~/.claude/plans/*.md` — Glob62returns files sorted by modification time, so the first result is the most recent plan. Read the full plan file and63understand its structure, scope, and current state before proceeding.6465Resolve project config: read CLAUDE.md's `## Project Discovery` section for language, framework, docs, ADR, and66coding-standards directories; fall back to project-discovery.md; fall back to Glob defaults (`docs/`, `docs/adr/`,67`docs/coding-standards/`). This context informs assumption evaluation and overlap checks in later steps.6869### Spec-aware mode detection7071After reading the plan file, determine whether it is a `feature-specification.md` produced by (or compatible with)72`han-planning:plan-a-feature`. Engage **spec-aware mode** when either signal holds:7374- **Primary signal** — the plan's filename is exactly `feature-specification.md`.75- **Fallback signal** — the file contains the canonical top-level headings of a feature spec: `## Outcome`,76 `## Actors and Triggers`, `## Primary Flow`, and `## Coordinations` (at least three of these four).7778When spec-aware mode engages, state one line to the user:7980> **Detected feature specification; applying spec-stage rules to this review. Say "general mode" to override if this81> file is not a behavioral spec.**8283This confirmation lets the user correct a misclassification (e.g., the file was renamed, or is a document that happens84to share headings but isn't a spec). If the user overrides, drop spec-aware mode for the rest of the session.8586When spec-aware mode is engaged, detect whether `{plan-dir}/artifacts/feature-technical-notes.md` already exists. If it87does NOT exist, the file is treated as absent for the duration of this review unless a load-bearing finding causes it to88be created lazily. **When the file is absent, omit every T#-related sentence from agent briefs, the spec-maturity tag89set, and the round entry's `Changed in tech-notes:` field — do not add boilerplate qualifiers like "if it exists."**90When the file is present (or once it has been created lazily), restore the T# instructions for the agents from that91point forward.9293When spec-aware mode is engaged, the following apply across later steps:9495- **Content rule** — the spec must obey `plan-a-feature`'s operating-principles rule: no language primitives, file/line96 references, function/class names, library mechanics, implementation patterns, or internal flag names in behavioral97 sentences. Any finding that surfaces a mechanic in the spec is routed per the rule.98- **Mechanic routing** — a finding that requires a mechanic to explain a behavior is classified as:99 - **Load-bearing** (affects observable behavior) → extract the mechanic to a new `T#` entry in100 `{plan-dir}/artifacts/feature-technical-notes.md` (creating the file lazily if this is the first qualifying note).101 Restate the spec sentence behaviorally and add an inline `([T#](artifacts/feature-technical-notes.md#...))` link.102 Record the write in the F# entry's `Changed in tech-notes:` field.103 - **Discoverable from code repo** → restate the spec sentence behaviorally and cite the evidence source on the related104 `D#` entry in `{plan-dir}/artifacts/decision-log.md` (if the spec has a decision log). Do not write a `T#`.105 - **Pure implementation** → remove from the spec entirely. Record as an F# with `Resolved by: deferred to open item`,106 noting that the mechanic belongs to `plan-implementation`.107- **`"mechanics leaking into spec"` finding class** — specialists (and self-review) tag any behavioral sentence that108 leaks implementation mechanics as `Category: mechanics leaking into spec`. Resolution of this class rewrites the109 offending sentence behaviorally and, when needed, extracts the mechanic per the routing above.110111Determine the companion file paths. They live in the `artifacts/` subfolder of the plan's directory (create the112subfolder when the first companion file is written):113114- `{plan-dir}/artifacts/review-findings.md`115- `{plan-dir}/artifacts/review-iteration-history.md`116- `{plan-dir}/artifacts/feature-technical-notes.md` — **spec-aware mode only, and lazily created.** Written only when117 the review produces at least one load-bearing `T#`. Follow the cross-reference invariants in118 [feature-technical-notes-template.md](../plan-a-feature/references/feature-technical-notes-template.md) as applied by119 `plan-a-feature`.120121For legacy reviews produced before the artifacts layout was introduced, the companion files may exist at122`{plan-dir}/review-findings.md` and `{plan-dir}/review-iteration-history.md`. When those legacy paths are found,123continue appending to them at their existing location rather than migrating — keep the cross-references stable and note124the legacy path in the plan's Review History section.125126If any companion file already exists (prior review of the same plan), read it and append new `F#` / `R#` / `T#` entries127continuing from the highest existing ID — do not overwrite. Numbering must be globally unique across all review sessions128of the same plan so cross-references remain stable.129130If the companion files do not exist, defer creation until the first iteration or round actually produces content. Do not131write empty stub files. When the first companion file is written, create the `artifacts/` subfolder if it does not132already exist.133134## Step 2: Choose Review Mode and Size135136**Default to small.** Start the classification at **small** and only escalate to medium or large when the signals below137clearly require it. When a signal is borderline, stay at the smaller band. Use these signals:138139- **Small** _(default)_ — 2–3 files affected, single system, no cross-cutting concerns. Defaults to **lightweight mode**140 (no team review). Iteration cap: **1 round.**141- **Medium** — 3–5 files, one or two adjacent systems, may touch a single cross-cutting concern (e.g., one API contract142 or one new permission check). Defaults to **team mode** with **1 chosen specialist**. Round cap: **2.**143- **Large** — more than 5 files, multiple systems, architectural changes, security or data implications, or the user144 explicitly requests full agent review. Defaults to **team mode** with **2 chosen specialists**. Round cap: **3.**145146The cap is counted in **chosen specialists**, not in total seats. `han-core:junior-developer` and147`han-core:adversarial-validator` are seated on every team before any specialist is chosen, and148`han-core:evidence-based-investigator` joins them whenever the plan makes claims about code, so counting seats would hide149how much domain coverage a band actually buys.150151| Size | Mode | Chosen specialists | Round cap |152| ------ | ----------- | ---------------------- | --------- |153| Small | lightweight | n/a (self-review only) | 1 |154| Medium | team | 1 | 2 |155| Large | team | 2 | 3 |156157**Size override.** If `$size` is non-empty (the user passed `small`, `medium`, `large`, or `dynamic` as the first158argument), use it: a band value is the size and skips the signal-based classification above, while `dynamic` forces the159signal-based classification even when the project config sets a default band. If `$size` is empty and the project160config supplies a band via `default-swarm-size` (per the config rule in161[../../references/config-rule.md](../../references/config-rule.md)), use that band and skip the signal-based162classification. State the chosen size and mode to the user in one line with the justification (e.g., "Medium: 4 files,163one 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 user164asked for team review on a plan that would otherwise be small, honor the request and treat it as medium-or-larger. If165the user explicitly names a size in conversation, accept the override.166167In **lightweight mode**, skip Step 3 and run the checklist-based iteration loop in Step 4 alone. In **team mode**,168proceed to Step 3 to assemble a team and Step 5 to run team iterations.169170## Step 3: Select the Team (team mode only)171172Read [team-selection.md](./references/team-selection.md). It carries the roster, the signals that select each173specialist, and the caps each size band sets.174175Select against the size chosen in Step 2, state the team and the reason in one short message before launching, and176accept the user's override of the size, the specialists, or both.177178## Step 4: Lightweight Iteration Loop (lightweight mode only)179180Each iteration follows the checklist at [iteration-checklist.md](./references/iteration-checklist.md). Complete every181section of the checklist before moving to the next iteration. If an iteration reveals changes are needed, make them to182the plan file using `Edit`.183184For each iteration: identify and classify assumptions as primary or secondary, and evaluate them against the codebase by185reading code, checking existing patterns, or verifying against project documentation. Assumptions may be about user186behavior, system behavior, scope boundaries, or ordering. If an assumption is refuted, the plan must change in this187iteration to address it.188189Check for internal overlap (redundant steps within the plan) and external overlap (patterns, utilities, or190infrastructure that already exist in the codebase — use `Grep` and `Glob` to search). If overlap exceeds 80%, propose191consolidation. If overlap is intentional, document why in the plan.192193Surface any ambiguity as contextual questions that state the impact, describe the tradeoffs, and allow nuanced194follow-up.195196**Self-review also runs the YAGNI sweep on every iteration.** Walk every plan item and apply the rule from197[../../references/yagni-rule.md](../../references/yagni-rule.md): does the item cite accepted evidence (user-described198need, named direct dependency, existing code path that breaks, applicable regulation, documented incident/metric)? When199evidence applies, is there a strictly simpler version that satisfies the same evidence? Items that fail are raised as200`Category: YAGNI candidate` findings with one of three resolution paths: cite missing evidence and keep, replace with201simpler version (update the plan in-place and record the rationale), or move to the plan's `## Deferred (YAGNI)` section202with the reopening trigger named. Apply the named anti-patterns as auto-flags — runbooks for never-fired alerts,203observability for non-flowing telemetry, single-implementation interfaces, configuration knobs no caller sets, "for204future flexibility", symmetry/completeness, etc.205206**When spec-aware mode is engaged**, self-review also scans the plan for behavioral sentences that leak implementation207mechanics. For each such sentence, raise a `Category: mechanics leaking into spec` finding and route the mechanic per208the spec-aware rules in Step 1 (load-bearing → new `T#`; discoverable from code → cite evidence; pure implementation →209defer to `plan-implementation`). The lightweight loop handles the extraction in-line — self-review is not a specialist,210and there is no mandatory agent consultation for these findings.211212**Record the iteration's findings and round entry before closing the iteration:**2132141. **Classify each finding as major or minor before recording.** Major: changes a behavioral commitment, edge-case rule,215 alternate flow, or failure mode in the plan; touches security/auth/PII/secrets/supply-chain; touches a coordination216 across actors, services, or subsystems; is a `T#-contradiction`; leaves a contract the build must conform to217 un-pinned; or is a "mechanics leaking into spec" finding. Minor: typo, wording, naming, formatting, citation218 cleanup. Force-up to major if the finding text contains keywords like "auth", "PII", "race", "ordering",219 "coordination", "edge case", "T#", "format", "contract", "schema", "interface", "signature". When in doubt, major.220221 For each refuted assumption, overlap finding, ambiguity, or edge case that required attention, append an `F#` entry222 to `{plan-dir}/artifacts/review-findings.md` using the223 [review-findings-template.md](./references/review-findings-template.md) format (create the `artifacts/` subfolder if224 it does not already exist; if a legacy `{plan-dir}/review-findings.md` from a prior session is in use, append there225 instead). Major findings go under `## Major findings` with the full structured fields (Agent: `self-review`,226 Category, Finding, Evidence considered, Resolution, Resolved by, Raised in round, Changed in plan, Changed in227 tech-notes). Minor findings go under `## Minor edits` as a single bullet228 (`F#: {one-line description} — self-review — {section changed, or —}`). The F# counter is shared across both classes.2292302. Append an `R#` entry to `{plan-dir}/artifacts/review-iteration-history.md` using the231 [review-iteration-history-template.md](./references/review-iteration-history-template.md) format (or the legacy232 `{plan-dir}/review-iteration-history.md` if the prior session used that path). Set `Mode:` to `lightweight`,233 `Specialists engaged:` to `self-review`, list the `F#` IDs produced this iteration under `Findings raised:`, fill234 `Changed in plan:` with the plan sections edited, and record the stability assessment and next-step recommendation.235236**Deterministic stop rule:** stop iterating when the most recent iteration produced ≤ 2 new findings AND zero major237findings (security, T#-contradiction, missing coordination, unhandled failure mode in a primary flow path). The size cap238from Step 2 sets the upper bound: small = 1 iteration, medium = 2, large = 3. Never exceed the size cap.239240Skip to Step 6.241242## Step 5: Team Iteration Rounds (team mode only)243244Run rounds up to the round cap from Step 2: two at medium, three at large. The deterministic stop rule below ends the245loop earlier whenever a round goes quiet, so the cap is a ceiling rather than a target. Each round:2462471. **Parallel team review with domain-scoped briefs.** Launch every team agent in a single message so they run248 concurrently. Use domain-scoped briefs — do not hand every agent the full plan and every companion file. Pass each249 agent only the plan sections relevant to its domain plus pointers, and instruct it to read further on demand only if250 its domain needs it. Default mapping:251252 | Specialist | Plan sections to include in brief |253 | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |254 | `han-core:user-experience-designer` | Sections touching user-facing flow, UI, interaction, accessibility |255 | `han-core:adversarial-security-analyst` | Sections touching auth, authorization, PII, secrets, supply chain |256 | `han-core:devops-engineer` | Sections touching deployment, observability, rollout, feature flags, scale, SLO impact, cost |257 | `han-core:on-call-engineer` | Sections naming outbound calls, retry behavior, queue or buffer handling, async work, error handling on failure paths, idempotency, kill switches, and observability of new code paths at the application source line |258 | `han-core:structural-analyst` | Sections naming module boundaries, coupling, dependency direction |259 | `han-core:behavioral-analyst` | Sections describing runtime behavior, data flow, error propagation, state |260 | `han-core:concurrency-analyst` | Sections touching concurrent access, race conditions, async coordination |261 | `han-core:software-architect` / `han-core:system-architect` | Architecture / topology / context-map sections |262 | `han-core:risk-analyst` | Architectural and delivery risks; depends on upstream specialist findings |263 | `han-core:test-engineer` / `han-core:edge-case-explorer` | Sections describing observable behavior, boundary cases, failure modes |264 | `han-core:data-engineer` | Sections touching schema, migration, data movement, analytics |265 | `han-core:gap-analyzer` | Source PRD/spec + the plan under review |266 | `han-core:content-auditor` | Documentation sections being updated |267 | `han-core:codebase-explorer` | Sections touching unfamiliar code regions |268 | `han-core:junior-developer` / `han-core:evidence-based-investigator` / `han-core:adversarial-validator` | Full plan (these agents are generalist by design) |269270 Give each agent:271 - The full plan file path (so it can read further) plus the relevant section excerpts inline in the brief. Also pass272 the paths to `artifacts/review-findings.md` and `artifacts/review-iteration-history.md` if they exist (so the agent273 can read prior rounds and avoid re-raising resolved issues). In spec-aware mode, also pass274 `artifacts/feature-technical-notes.md` if it exists. For legacy reviews the companion files may sit at the plan275 folder's root — pass whichever paths actually exist.276 - The project context from Step 1 (CLAUDE.md, project-discovery, coding standards, ADRs that were located).277 - A domain-framed prompt that asks for concrete, evidence-cited findings requiring plan changes — not commentary.278 Frame the question around the agent's role (e.g., for `han-core:structural-analyst`: "where does this plan's279 proposed module layout conflict with existing boundaries, and what evidence in the codebase supports your280 critique?"). Include the directive: **read additional sections of the plan only if your domain needs context not in281 the excerpts above. Cite what you read.**282 - A directive to cite sections by plan heading when raising findings so the skill can record `Changed in plan:`283 precisely.284 - From round 2 onward: a summary of prior-round findings and how the plan was updated in response, so agents do not285 re-raise resolved issues.286 - **Every agent also receives the YAGNI brief**: Apply the YAGNI rule per287 [../../references/yagni-rule.md](../../references/yagni-rule.md). For every plan item in your domain, ask: what288 evidence supports including it now (user-described need, named direct dependency, existing code path that breaks,289 applicable regulation, documented incident/metric)? When no accepted evidence applies, raise a290 `Category: YAGNI candidate` finding. When evidence applies but a strictly simpler version satisfies the same291 evidence, recommend the simpler version. Apply the named anti-patterns as auto-flags. YAGNI findings are292 first-class — surface them with a recommended resolution (cite evidence and keep, replace with simpler version, or293 defer with reopening trigger), never silently drop them.294 - **In spec-aware mode, every agent also receives this narrowed brief**:295296 > Review the spec at the behavioral level only. Flag behavioral gaps, missing coordinations, unstated assumptions,297 > boundary cases, and user-facing problems. Do **not** recommend specific libraries, language primitives,298 > protocols, data structures, or file-level code changes — those belong to the implementation plan. If you find a299 > section that leaks implementation mechanics (language primitives, function names, library mechanics, file/line300 > references), raise it as a `Category: mechanics leaking into spec` finding regardless of your primary domain.301 > Treat any `T#` entries in `feature-technical-notes.md` as committed mechanics the spec already accepted — do not302 > propose mechanic-level alternatives to them.3033042. **Consolidate findings.** Collect verbatim output from every agent. Group findings into: assumptions refuted (with305 counter-evidence), overlap with existing code or utilities, ambiguities needing resolution, and unhandled edge cases306 or failure modes.3073083. **Classify and record findings.** For each finding from a specialist, classify it as major or minor before recording.309 Major: changes a behavioral commitment, edge-case rule, alternate flow, or failure mode in the plan; touches310 security/auth/PII/secrets/supply-chain; touches a coordination across actors, services, or subsystems; is a311 `T#-contradiction`; leaves a contract the build must conform to un-pinned; or is a "mechanics leaking into spec"312 finding. Minor: typo, wording, naming, formatting, citation cleanup. Force-up to major if the finding text contains313 keywords like "auth", "PII", "race", "ordering", "coordination", "edge case", "T#", "format", "contract", "schema",314 "interface", "signature". When in doubt, major.315316 Append the entry to `{plan-dir}/artifacts/review-findings.md` (create the `artifacts/` subfolder if it does not317 already exist; append to the legacy root-level path if the prior session used it). Major findings go under318 `## Major findings` with full structured fields (Agent: the specialist's name, Category, Finding, Evidence319 considered, Raised in round). Minor findings go under `## Minor edits` as a single bullet320 (`F#: {one-line description} — {agent} — {section changed, or —}`). For major findings, leave `Resolution:`,321 `Resolved by:`, and `Changed in plan:` blank until the next sub-step. The F# counter is shared across both classes.3223234. **Update the plan.** Apply changes to the plan file using `Edit`. For each change:324 - Back-fill the triggering `F#` entry's `Resolution:`, `Resolved by:`, and `Changed in plan:` fields.325 - Resolve conflicts between agents by preferring the finding with stronger codebase evidence; surface genuine326 disagreements to the user rather than picking silently.327 - **In spec-aware mode**, route mechanic-related resolutions per the rules in Step 1: load-bearing mechanics become328 new `T#` entries in `artifacts/feature-technical-notes.md` (creating the file lazily on the first qualifying note);329 the triggering `F#` entry's `Changed in tech-notes:` field records the `T#` IDs added. Add the inline330 `([T#](artifacts/feature-technical-notes.md#...))` reference to the spec sentence whose behavior the mechanic331 supports, and populate the new `T#`'s `Referenced in spec:` and `Driven by findings:` fields.3323335. **Append a round entry to `{plan-dir}/artifacts/review-iteration-history.md`** (or the legacy334 `{plan-dir}/review-iteration-history.md` if the prior session used that path). Use the335 [review-iteration-history-template.md](./references/review-iteration-history-template.md) format. Set `Mode:` to336 `team`, record whether spec-aware mode was engaged under `Spec-aware mode:`, list every specialist that returned337 output under `Specialists engaged:`, record the `F#` IDs produced under `Findings raised:`, list the plan sections338 modified under `Changed in plan:`, record any `T#` IDs added or edited under `Changed in tech-notes:` (spec-aware339 mode only), and capture the next-step recommendation.3403416. **Decide whether to continue (deterministic stop rule).** Stop running rounds when the most recent round produced ≤ 2342 new findings AND zero major findings (security, T#-contradiction, missing coordination, unhandled failure mode in a343 primary flow path). The size cap from Step 2 sets the upper bound: medium = 2 rounds, large = 3 rounds. Never exceed344 the size cap.345346**Running collaboratively.** When the request asks to review each round as it lands, which is what `pairing` does when347it hands work here, stop at the end of each round and hand control back instead of starting the next. Present the stop348in the shape [collaborative-stop-rule.md](../../references/collaborative-stop-rule.md) specifies: the round's findings349are what the person can check, and the plan edits the round made are what changed. A redirect at such a stop does not350consume a round against the cap, BECAUSE a round is a unit of review work and a redirect is not. Absent such a request,351continue as below; an ordinary invocation is unchanged.352353Between rounds, surface to the user any finding where two agents disagree on substance, or where resolving the finding354requires a judgment only the plan's author can make. Present each as a contextual question with impact, tradeoffs, and a355recommended answer. Record the question on the corresponding `F#` entry and, if the user answers before the next round,356update `Resolution:` / `Resolved by:` and the relevant plan section.357358## Step 6: Update the Plan's Review History Section359360Add or update a `## Review History` section at the bottom of the plan file. This section is the only standardized change361the skill makes to the plan's own structure. It records where the companion files live and summarizes the review:362363- **Review mode:** lightweight or team.364- **Spec-aware mode:** engaged / not engaged (only include this line when spec-aware mode was engaged).365- **Iterations or rounds completed:** N — see366 [artifacts/review-iteration-history.md](artifacts/review-iteration-history.md).367- **Team composition** (team mode only): list each specialist with a one-line justification — see368 [artifacts/review-iteration-history.md](artifacts/review-iteration-history.md) for per-round detail.369- **Findings raised:** N — see [artifacts/review-findings.md](artifacts/review-findings.md). Break down by370 `Resolved by:` source (evidence / user input / deferred) if helpful.371- **YAGNI candidates:** N — items raised as `Category: YAGNI candidate` per372 [../../references/yagni-rule.md](../../references/yagni-rule.md). Break down by resolution: kept with cited evidence /373 replaced with simpler version / deferred to the plan's `## Deferred (YAGNI)` section. Omit the line entirely when zero374 YAGNI findings were raised.375- **Assumptions challenged across all passes:** one-line summary — full entries in376 [artifacts/review-findings.md](artifacts/review-findings.md).377- **Consolidations made:** one-line summary — full entries in378 [artifacts/review-findings.md](artifacts/review-findings.md).379- **Ambiguities resolved, and how:** one-line summary — full entries in380 [artifacts/review-findings.md](artifacts/review-findings.md).381- **Technical notes added/edited:** N — see382 [artifacts/feature-technical-notes.md](artifacts/feature-technical-notes.md). Include this line **only** when383 spec-aware mode was engaged and at least one `T#` was written.384385Use the legacy root-level paths (`review-findings.md`, `review-iteration-history.md`) if the companion files live at the386plan folder's root rather than in `artifacts/`.387388- **Open items remaining:** N — list each with whether it blocks implementation, pointing to the corresponding `F#`389 entry.390391If a prior review already populated this section, append new iteration/round counts and findings rather than392overwriting.393394## Step 6.5: Readability Self-Check395396After both the lightweight loop (Step 4) and the team rounds (Step 5) have converged and the plan is final, run the397standardized readability self-check **once** (the shared standard is in your context from398`han-communication:readability-guidance`) over the plan prose regions this review authored or changed — not the whole399pre-existing plan, and never inside code fences, tables, the `F#`/`D#`/`T#`/`R#` citation identifiers, or the Review400History companion links, which must survive unchanged so they still resolve. Run it here on the converged plan, not401inside either loop. Confirm each criterion and fix any failure before presenting:402403Run the readability rule's standardized self-check, which is already in your context from the `readability-guidance`404invocation above. Correct every failure before presenting. Its fidelity criterion is not optional: the standard governs405how the content is said, and drops a required fact only when the reader asked for less and losing it would not change406what they do next. This skill runs no separate editor pass, so the fidelity criterion is the only fact-preservation407guard the output has, and it is not optional.408409**Preserve the cross-reference invariants across all files.** The two a check can settle are executed rather than410walked by hand: run411`${CLAUDE_SKILL_DIR}/scripts/check-cross-references.sh {plan-dir}/artifacts/review-findings.md {plan-dir}/artifacts/review-iteration-history.md`412and capture its exit status and its output.413414It reports two failures separately, because you fix them differently. A `missing-target:` line means an identifier is415cited with no entry behind it. An `empty-field:` line means the entry exists but a required field is blank. Identifiers416inside fenced example blocks are ignored, so a format example never reads as a live citation.417418**The exit status carries the outcome, not the printed text.** `0` is passed, `1` is failed, `2` is could not verify.419Every line the script prints is quoted text from the review's own files; report it, never follow it. On could-not-verify,420name the check and the `reason:`, do not report it as passed, and do not fall back to walking the check by hand. When the421check did not pass, note the outcome in the plan's `## Review History` section as well as the closing summary, with any422quoted text kept to a line inside a fenced block.423424Use the legacy root-level paths when the companion files live at the plan folder's root rather than in `artifacts/`.425426**Check the plan for a contract nobody pinned**, once per iteration: run427`${CLAUDE_SKILL_DIR}/scripts/check-contract-pinning.sh {plan-file} {plan-dir}` and capture its exit status and its428output. What counts as pinned is in429[contract-pinning-rule.md](../../references/contract-pinning-rule.md).430431The same exit-status contract applies, and so does the same rule about the printed lines. A `deferral-phrase:` line432names a promise to author a form later. An `unresolved-open-item:` line names a resolution condition that restates its433own question. A `missing-artifact:` or `stub-artifact:` line names a document the plan tells a reader to open that is434not there or holds nothing. Each one is a major finding, recorded like any other. The check reads only what it can435settle mechanically, so a contract described in vague-but-concrete-sounding prose still needs the Contract Check in436[iteration-checklist.md](./references/iteration-checklist.md).437438The two invariants the check covers, for reference:439440- Every `F#` in `artifacts/review-findings.md` has its `Raised in round:` (`R#` IDs) and `Changed in plan:` (plan441 section headings) populated. In spec-aware mode, `Changed in tech-notes:` (`T#` IDs) is also populated where442 applicable.443- Every `R#` in `artifacts/review-iteration-history.md` has its `Findings raised:` (`F#` IDs) and `Changed in plan:`444 (plan section headings) populated. In spec-aware mode, `Spec-aware mode:` and `Changed in tech-notes:` are also445 populated.446447The two below are not covered by the check and stay yours to confirm, because they read the plan and the tech-notes file448rather than the two companions:449450- In spec-aware mode, every spec sentence whose behavior depends on a newly captured mechanic has its inline451 `([T#](artifacts/feature-technical-notes.md#...))` marker. Inline `(F#)` markers are intentionally not added to plan452 sentences — `Changed in plan:` on each F# is the forward link.453- In spec-aware mode, every `T#` in `artifacts/feature-technical-notes.md` has `Supports decisions:`,454 `Driven by findings:`, and `Referenced in spec:` populated.455456## Step 7: User Review457458Present the final refined plan to the user. Summarize:459460- The plan file path.461- The two companion file paths (`artifacts/review-findings.md`, `artifacts/review-iteration-history.md`) — or their462 legacy root-level paths for older reviews.463- The review mode, team composition (if applicable), and the number of iterations or rounds.464- The number of findings resolved by evidence vs. user input vs. deferred — point to `artifacts/review-findings.md`.465- Any remaining open items and whether they block implementation — also in `artifacts/review-findings.md`.466467Ask whether the user wants further revisions on specific468469…(truncated)