| name | planning-and-task-breakdown |
| description | Break clear requirements into ordered tasks. Use for multi-step work and dependencies; not for a single obvious edit. |
Planning and Task Breakdown
Overview
Decompose work into small, verifiable tasks with explicit acceptance criteria. Good task breakdown is the difference between an agent that completes work reliably and one that produces a tangled mess. Every task should be small enough to implement, test, and verify in a single focused session.
Planning is not a rubber-stamp phase. Preserve the user's desired outcome and explicit constraints, but independently evaluate any implementation approach the user proposed. If a materially better route exists, recommend it before turning the weaker route into tasks.
When to Use
- You have a spec and need to break it into implementable units
- A task feels too large or vague to start
- Work needs to be parallelized across multiple agents or sessions
- You need to communicate scope to a human
- The implementation order isn't obvious
When NOT to use: Single-file changes with obvious scope, or when the spec already contains well-defined tasks.
The Planning Process
Step 1: Enter Plan Mode
Before writing any code, operate in read-only mode:
- Read the spec and relevant codebase sections
- Identify existing patterns and conventions
- Map dependencies between components
- Note risks and unknowns
- Separate the user's desired outcome/hard constraints from their suggested implementation method
Do NOT write code during planning. The output is a plan document saved to tasks/plan.md and a task list saved to tasks/todo.md, not implementation.
Step 1.5: Challenge the proposed method when it matters
Do not automatically convert the user's proposed approach into the plan.
If inspection shows another approach is materially better on correctness, simplicity, maintainability, security, reversibility, performance, UX, cost, migration risk, or fit with the existing architecture:
- state the concern with the requested approach;
- propose the better alternative concretely;
- compare the important trade-offs;
- recommend one clearly;
- if both remain safe and feasible, let the user keep the original approach after seeing the trade-offs.
Do not disagree merely to sound independent. If the user's method is reasonable and no alternative has a material advantage, proceed without ceremony.
Do not silently replace a user-owned decision. A recommendation changes the plan only when the user accepts it, when the method was not actually fixed as a requirement, or when project/safety rules make the original path invalid.
Step 2: Identify the Dependency Graph
Map what depends on what:
Database schema
│
├── API models/types
│ │
│ ├── API endpoints
│ │ │
│ │ └── Frontend API client
│ │ │
│ │ └── UI components
│ │
│ └── Validation logic
│
└── Seed data / migrations
Implementation order follows the dependency graph bottom-up: build foundations first.
Step 3: Slice Vertically
Instead of building all the database, then all the API, then all the UI — build one complete feature path at a time:
Bad (horizontal slicing):
Task 1: Build entire database schema
Task 2: Build all API endpoints
Task 3: Build all UI components
Task 4: Connect everything
Good (vertical slicing):
Task 1: User can create an account (schema + API + UI for registration)
Task 2: User can log in (auth schema + API + UI for login)
Task 3: User can create a task (task schema + API + UI for creation)
Task 4: User can view task list (query + API + UI for list view)
Each vertical slice delivers working, testable functionality.
Step 4: Write Tasks (junior-proof)
Write for an implementer with zero project chat history, mediocre taste, and a bias against testing. If a fresh worker with only this task card cannot finish safely, the task is under-specified.
Each task follows this structure:
## Task [N]: [Short descriptive title]
**Description:** One paragraph explaining what this task accomplishes and where it sits in the feature.
**Acceptance criteria:**
- [ ] [Specific, testable condition]
- [ ] [Specific, testable condition]
**Verification (exact commands):**
- [ ] `npm test -- --grep "feature-name"` — expect 0 failures
- [ ] `npm run build` — expect exit 0
- [ ] Manual check: [exact steps]
**Dependencies:** [Task numbers this depends on, or "None"]
**Files to create/modify (ownership):**
- write: `src/path/to/file.ts`
- write: `tests/path/to/test.ts`
- read-only context: `docs/spec.md`
**Invariants / do not:**
- [e.g. do not change public API of X]
- [e.g. no new dependencies]
**TDD:** yes | no (if yes: failing test first at seam [name])
**Escalate when (NEEDS_CONTEXT / BLOCKED):**
- architectural choice between A and B is required
- required file/API is missing or contradicts the plan
- acceptance criteria cannot be met without expanding scope
**Estimated scope:** [Small: 1-2 files | Medium: 3-5 files | Large: 5+ files — split if Large]
YAGNI / DRY: each task builds only what its acceptance criteria require. No drive-by refactors.
Step 5: Order and Checkpoint
Arrange tasks so that:
- Dependencies are satisfied (build foundation first)
- Each task leaves the system in a working state
- Verification checkpoints occur after every 2-3 tasks
- High-risk tasks are early (fail fast)
Add explicit checkpoints:
## Checkpoint: After Tasks 1-3
- [ ] All tests pass
- [ ] Application builds without errors
- [ ] Core user flow works end-to-end
- [ ] Review with human before proceeding
Task Sizing Guidelines
| Size | Files | Scope | Example |
|---|
| XS | 1 | Single function or config change | Add a validation rule |
| S | 1-2 | One component or endpoint | Add a new API endpoint |
| M | 3-5 | One feature slice | User registration flow |
| L | 5-8 | Multi-component feature | Search with filtering and pagination |
| XL | 8+ | Too large — break it down further | — |
If a task is L or larger, it should be broken into smaller tasks. An agent performs best on S and M tasks.
When to break a task down further:
- It would take more than one focused session (roughly 2+ hours of agent work)
- You cannot describe the acceptance criteria in 3 or fewer bullet points
- It touches two or more independent subsystems (e.g., auth and billing)
- You find yourself writing "and" in the task title (a sign it is two tasks)
Output Files
- Plan document: Save the implementation plan to
tasks/plan.md.
- Task list: Save the checklist-style task list to
tasks/todo.md.
Create the tasks/ directory if it does not exist. These paths are the convention expected by the /build command and other downstream tooling.
Plan Document Template
# Implementation Plan: [Feature/Project Name]
## Overview
[One paragraph summary of what we're building]
## Architecture Decisions
- [Key decision 1 and rationale]
- [Key decision 2 and rationale]
## Alternatives / User trade-offs
- [If the user's proposed method was challenged, record the original option, recommended alternative, trade-offs and final user choice]
## Task List
### Phase 1: Foundation
- [ ] Task 1: ...
- [ ] Task 2: ...
### Checkpoint: Foundation
- [ ] Tests pass, builds clean
### Phase 2: Core Features
- [ ] Task 3: ...
- [ ] Task 4: ...
### Checkpoint: Core Features
- [ ] End-to-end flow works
### Phase 3: Polish
- [ ] Task 5: ...
- [ ] Task 6: ...
### Checkpoint: Complete
- [ ] All acceptance criteria met
- [ ] Ready for review
## Risks and Mitigations
| Risk | Impact | Mitigation |
|------|--------|------------|
| [Risk] | [High/Med/Low] | [Strategy] |
## Open Questions
- [Question needing human input]
Parallelization Opportunities
When multiple agents or sessions are available:
- Safe to parallelize: Independent feature slices, tests for already-implemented features, documentation
- Must be sequential: Database migrations, shared state changes, dependency chains
- Needs coordination: Features that share an API contract (define the contract first, then parallelize)
Common Rationalizations
| Rationalization | Reality |
|---|
| "The user suggested it, so I should just plan it" | The user owns the outcome and final choice; the agent still owes them technical/product judgment before commitment. |
| "I'll figure it out as I go" | That's how you end up with a tangled mess and rework. 10 minutes of planning saves hours. |
| "The tasks are obvious" | Write them down anyway. Explicit tasks surface hidden dependencies and forgotten edge cases. |
| "Planning is overhead" | Planning is the task. Implementation without a plan is just typing. |
| "I can hold it all in my head" | Context windows are finite. Written plans survive session boundaries and compaction. |
Red Flags
- Starting implementation without a written task list
- Rubber-stamping a materially weaker user-proposed implementation without surfacing a better alternative
- Overriding a safe, explicit final user choice merely because the agent prefers another design
- Tasks that say "implement the feature" without acceptance criteria
- No verification steps in the plan
- All tasks are XL-sized
- No checkpoints between tasks
- Dependency order isn't considered
Verification
Before starting implementation, confirm:
See Also
Acceptance criteria are per-task and answer "did we build the right thing?". They sit on top of the project-wide Definition of Done, the standing bar every task clears before it counts as done. See references/definition-of-done.md.