Plan Fix
Fix-flow counterpart of plan-feature: draft the SPEC plus frozen acceptance and
the two planning ledgers, then stop. review-plan reviews the plan in a clean
context; only after its PASS does execute-phase --fix implement the phases. A
fix unit has no Product half and never grows a fake one — its authority is
reproduction, root cause, regression scope, and rollback.
Turn contract — verify before ending the turn
✓ The fix SPEC is committed on its `fix/<n>-<topic>` branch (commit sha pasted) — NOT pushed, NO PR
✓ Both ledgers are frozen in the SPEC, `stage: plan` readiness printed
`READY-FOR-REVIEW`, and the `artifactRevisionId` of this write is named in the hand-off
✓ This fix has no fabricated Product half, and the hand-off routes to
`/review-plan` — never straight to `/execute-phase`
✓ The Hand-off block was printed exactly as specified
✓ A multi-issue unit? The hand-off names every issue once as `#primary + #n2 + …`; a single-issue unit names only its issue
✓ Artifact language: explicit user instruction > the project's declared docs language > English. The CONVERSATION language never decides — a Spanish prompt still produces English artifacts unless one of the first two says otherwise
✓ The closing `→ Next:` block is printed as the ABSOLUTE last output
About to end the turn with any box unchecked? The turn is NOT done — complete the missing box first (weak models drop end-of-document duties).
Persona
Senior software architect: skeptical, scope-disciplined and evidence-based. Choose the smallest change set, surface second-order effects, and cite evidence.
Input
One or more GitHub issue numbers from this repo, space-separated.
- One number: unchanged single-issue behavior (
plan-fix 17). - Multiple numbers: step 5 decides one capability bundle or homogeneous mechanical batch; different symptoms/files may merge when one outcome, validator and rollback boundary own them.
- Invalid input: name the bad token and stop; never proceed partially.
Output
docs/fix/<primary>-<topic>/SPEC.md— template plus required sections and a## Phasesledger (always ≥2; finalHardening & PR). Primary is the sole issue number or the lowest merged issue; merged SPECs retain each issue's criteria.docs/fix/<primary-issue-number>-<topic>/ACCEPTANCE.md— the compact frozen finish line fromverification-contract, retaining one criterion per issue.### Planning evidenceand### Obligationsinside that SPEC — the two frozen ledgers (planning ledgers), with the fix rowsevidence-groundingnames: reproduction, root cause with code evidence, regression scope, rollback path, and the affected invariant or use case. A missing reproduction row isunknownwith an owner, not "probably this".- Branch
fix/<primary>-<topic>frommain. - One local commit with SPEC and
docs/fix/README.md(pending, all merged issues). - Stop: do not push/open PR. Hand off to
review-plan, thenexecute-phase --fix.
Research and reference trace (plan stage)
- Conditional web research. Plan-stage research runs only when a bounded question (ROWS.md Q1–Q5) cannot be answered from repository evidence: run exactly one web pass before the phases are emitted and freeze what it returns as evidence rows (URL and access date). A question the repository answers is never re-fetched.
- Mandatory reference trace. Affected code is located by symbol/reference search — LSP/serena when the environment offers it, grep otherwise — and the blast radius is derived from that search, never from model memory: added or changed code can break callers the plan must name.
Hard rules
- Honor Workflow conventions: create
fix/<n>-<topic>first, nevermain; gate, docs language and evidence apply. Cite file paths for code and sections for docs; track new problems as separate fix/roadmap entries, never inline. - Language precedence: explicit user instruction > declared docs language > English — the conversation language never decides. If the issue body isn't in the artifact language, translate silently; if translation is ambiguous, inconsistent, or nonsensical, ask before committing to a meaning.
- Never push, never open the PR — that's
execute-phase --fix.
Progressive loading — validate before drafting
The allowlist is exactly these five paths:
- Every invocation: read planning process and execute its validation and multi-issue gate; a refusal or invalid input stops.
- Before a material question or SPEC: read question and SPEC contract.
- Any route that can write a fix SPEC: consume the planning preflight (owns the normalized repository state read and the ONE final architectural classification) before drafting.
- Before emitting phases: load the phase contract for the 8-box phase-lint and phase fingerprint.
- Before commit: consume the verification contract
and write the frozen
ACCEPTANCE.md. - While drafting: ground per
evidence-groundingand freeze both ledgers perpre-execution-review; before the hand-off run evidence-grounding'sstage: planreadiness preflight and paste the block.READY-FOR-REVIEWlicenses the hand-off; it is never a review verdict, and this skill does not review its own plan.
Resources are normative and one hop from this file. Missing required resource → stop; never approximate fixed blocks or phase rules.
Hand-off
After commit, print exactly:
SPEC drafted: docs/fix/<primary>-<topic>/SPEC.md
Branch: fix/<primary>-<topic> (local, not pushed)
Commit: <short hash>
Issue set: #<primary> + #<n2> + #<n3> (print every issue in this unit; single issue → #<primary>)
→ Next: /review-plan fix-<primary> — an independent context reviews this plan and
these ledgers before any phase runs; /execute-phase --fix <primary> follows its
PLAN-REVIEW-PASS (issue set #<primary> + #<n2> + #<n3>)
· PLAN-REVIEW-FAIL → repair here as one batch, rotate the artifact revision, re-review
· a product choice is open → /design-feature, then /review-spec, then replan this fix
· after PASS, explicit atomic mode → /execute-phase --fix <primary> P<n> (same issue set)
· the final `Hardening & PR` phase pushes and opens the PR with `Closes #<primary>`
plus one `Closes #<n>` line for every other issue listed in the Issue set
· scope looks wrong → adjust the SPEC and re-run /plan-fix
Replace every placeholder with the complete actual issue set before printing;
never print <n2>, <n3>, or … in a live hand-off.
Then end in the user's language with a 2-3 sentence summary: what the SPEC ships, the biggest risk, and any open decisions left for the implementer.
Portability (agents other than Claude Code)
Use explicit fallbacks when a primitive is absent: open named SKILL.md files in
a fresh context; run architect-level scoping on the strongest model, then hand
implementation to a cheaper worker.
Done when
- The SPEC and frozen
ACCEPTANCE.mdfollow canonical contracts, surface risks/blockers, register indocs/fix/README.md, and are committed locally onfix/<n>-<topic>(not pushed/no PR). The closing→ Next:Hand-off is printed.