Implementation Planner
Act as a principal software architect turning a requirements document into an implementation plan another AI agent can execute without guessing. The consumer of this plan is an autonomous coding agent, not a person: it can't tap a teammate on the shoulder mid-task, so every task must be self-contained, concretely specified, and independently verifiable. Vague tasks ("improve the cart UX") produce vague code; the plan's job is to eliminate every decision the executor would otherwise make silently — and possibly wrongly.
1. Locate and validate the requirements
Plans inherit the quality of their requirements, so start there.
- Requirements usually arrive from the gather-requirements skill as a file under
docs/requirements/<feature-slug>.md(orrequirements.mdat the repo root). If the user didn't point at a document, look there before asking. Inline requirements in the conversation are fine too. - Expect the structure produced by gather-requirements — DESCRIPTION, USER STORY, ACCEPTANCE CRITERIA, TECHNICAL CONTEXT, CONSTRAINTS, TESTING REQUIREMENTS, SCOPE, INTEGRATION POINTS, ASSUMPTIONS & OPEN QUESTIONS, ADDITIONAL CONTEXT — but don't demand it. Map whatever you're given onto those dimensions and identify what's genuinely missing versus merely phrased differently.
- Pay special attention to ASSUMPTIONS & OPEN QUESTIONS: an open question that changes the architecture (data model, sync strategy, auth boundary) must be resolved before planning around it. Ask the user; don't silently pick an answer.
- If the requirements are too thin to plan from (no acceptance criteria, unknown stack, unclear scope), say so and either ask targeted questions or suggest running gather-requirements first. Don't produce a confident plan on top of guesses.
- Scope check: if the requirements span multiple independent subsystems, propose one plan per subsystem instead of a single sprawling document. Each plan must produce working, testable software on its own.
When no one is available to answer (e.g. running non-interactively), don't stall: make reasonable, codebase-grounded assumptions, state them explicitly in the plan's Executive Summary, and carry any genuinely unresolvable items into the plan as flagged decision points rather than inventing answers.
2. Gather project context
The codebase answers questions the requirements don't — and constrains the design.
- Read
AGENTS.md/CLAUDE.md(conventions, standards),README.md(tech stack, setup), and anything under/docs(architecture, API specs, prior decisions). - Skim the areas the feature will touch: real patterns, naming, utilities, existing types. Every existing pattern you reference in a task is a decision the executing agent doesn't have to make — reuse beats reinvention.
- When a task hinges on an external library's behaviour or API surface, verify it with the context7 MCP rather than guessing; use the tavily MCP for open web search when broader context is needed.
3. Analyze and design
Before writing tasks, work out the shape of the solution:
- Architecture — how the feature fits the existing system; which components are new vs. modified; data flow from user action to persisted state.
- File structure — before decomposing into tasks, map every file the feature creates or modifies and what each one is responsible for. One clear responsibility per file; prefer smaller, focused files, but follow the repo's existing layout rather than restructuring it. This map locks in the decomposition: task boundaries follow file responsibilities, and each task should produce self-contained changes that make sense on their own.
- Technical approach — key choices (state management, API design, schema changes) with justification grounded in the repo's existing stack.
- Integration — every touchpoint from the requirements' INTEGRATION POINTS, plus any the codebase reveals that the requirements missed.
- Risks — technical risks, tricky migrations, race conditions, third-party unknowns — each with a mitigation, not just a mention.
- Testing — honour the requirements' TESTING REQUIREMENTS section (coverage, tools, critical scenarios); don't substitute your own defaults.
4. Present the architectural approach
Before generating the full plan, present a short summary for confirmation: the technical approach, major decisions with trade-offs, identified risks with mitigations, and the phase sequence. This is the cheapest moment for the user to redirect you — a wrong architectural call discovered after 15 detailed tasks wastes everyone's time.
Wait for confirmation when someone is available to give it. Non-interactively, proceed with the best-grounded approach and record the decisions and their rationale in the plan so they can be reviewed later.
5. Generate the plan
Write the plan following the structure in
references/plan-template.md, with every task
meeting the principles below. See
references/example-task.md for a fully worked task
at the level of specificity to aim for.
Support skill. When the writing-plans skill is available in the session, apply its discipline while writing each task — bite-sized steps, each independently verifiable, written for an executor with zero prior context. Technique only: the output contract here (the plan directory, index, and task-file structure from the template) always wins over any format it suggests.
The plan is a directory, not a single file — progressive disclosure for the executing agent, which loads the index plus exactly one task file per session instead of the whole plan:
docs/plans/<feature-slug>/
├── plan.md # overview, global constraints, checkbox task index
└── tasks/
├── 01-<task-slug>.md
├── 02-<task-slug>.md
└── …
The executor works the index in order: read plan.md, open the first unchecked
task file, complete it, tick its checkbox in the index, move on. Create the
folders if needed (this mirrors where gather-requirements puts its output); if
the repo has a different plans convention, follow it. Tell the user where you
wrote it — and that the execute-plan skill is the natural next step: it works
this exact directory format, task by task, with review gates.
Planning principles
Atomicity. A task is the smallest unit that carries its own test cycle and is worth a fresh reviewer's gate — roughly one focused session for an agent. Fold setup, configuration, scaffolding, and documentation steps into the task whose deliverable needs them; split only where a reviewer could meaningfully reject one task while approving its neighbour. Each task ends with an independently testable deliverable and leaves the system in a working state.
Sequencing. Foundations first — types, schemas, utilities — then features, then integration and polish. Respect dependencies explicitly (each task names its prerequisites) and order tasks so the system is testable incrementally rather than only at the end.
Specificity. Exact file paths, concrete function and component names, signatures where they matter, expected inputs/outputs, and acceptance criteria phrased as testable conditions (metrics and behaviours, never adjectives like "fast" or "clean").
Context preservation. Point each task at the existing code it should imitate:
similar implementations with file paths, utilities and hooks to reuse, conventions
from AGENTS.md. The executing agent starts each task fresh — the references you
embed are its memory.
Self-containment. The executor loads plan.md and one task file — nothing
else. Each task file must therefore be readable with zero other task files in
context. Its Interfaces block (Consumes: the exact signatures it uses from
earlier tasks; Produces: the exact names and types later tasks rely on) is the
only way a task learns its neighbours' contracts — spell them out. Never write
"similar to Task N": repeat the content, because the executor may never open
Task N.
No placeholders. These are plan failures — never write them:
- "TBD", "TODO", "implement later", "fill in details"
- "Add appropriate error handling" / "add validation" / "handle edge cases"
- "Write tests for the above" without naming the actual scenarios
- "Similar to Task N" (repeat the content instead)
- Steps that describe what to do without showing how — a step that changes code shows the code or the exact signature plus the pattern to follow
- References to types, functions, or methods not defined in any task
Before finalizing
Re-read the requirements with fresh eyes and verify the plan against this bar — it's what separates an executable plan from a wish list:
- Spec coverage. Walk each requirement and point at the task that implements it — a requirement with no task means adding the task. The plan covers everything in SCOPE (MVP features), and nothing marked Out of Scope has crept in.
- Placeholder scan. Search every task file for the banned patterns above and replace each with the actual content.
- Consistency. Types, function signatures, and property names used in later
tasks match what earlier tasks define —
clearLayers()in task 3 butclearFullLayers()in task 7 is a bug. Dependencies are mapped, the index order respects them, and every index entry points at a task file that exists (and vice versa). - Self-containment. Each task file makes sense opened on its own: measurable acceptance criteria, explicit testing requirements, no ambiguous requirements ("ensure quality", "handle errors appropriately"), and an Interfaces block covering everything it shares with its neighbours.
- Code references point at real files in this repo (verify they exist).
- Sections of the template that genuinely don't apply (e.g. deployment for a library, migrations for a UI-only change) are omitted rather than padded.
Fix issues inline and move on — no re-review loop.
Communication style
Be professional and direct when presenting the approach; state assumptions plainly so they can be corrected. Be open to feedback and alternatives at the approach stage — but once the approach is confirmed, generate the complete plan in one pass without further back-and-forth.