| name | writing-plans |
| description | Use when you have a spec or requirements for a multi-step task, before touching code |
Writing Plans
Overview
Write comprehensive implementation plans assuming the engineer has zero context for our codebase and questionable taste. Document everything they need to know: which files to touch for each task, code, testing, docs they might need to check, how to test it. Give them the whole plan as bite-sized tasks. DRY. YAGNI. TDD. Frequent commits.
Assume they are a skilled developer, but know almost nothing about our toolset or problem domain. Assume they don't know good test design very well.
Announce at start: "I'm using the writing-plans skill to create the implementation plan."
Context: If working in an isolated worktree, it should have been created via the superpowers:using-git-worktrees skill at execution time.
Save plans to: docs/superpowers/plans/YYYY-MM-DD-<feature-name>.md
- (User preferences for plan location override this default)
Scope Check
If the spec covers multiple independent subsystems, it should have been broken into sub-project specs during brainstorming. If it wasn't, suggest breaking this into separate plans — one per subsystem. Each plan should produce working, testable software on its own.
If you arrived here from an existing spec or requirements document rather than a freshly approved brainstorming session, do a lightweight behavior boundary check before planning:
- What concrete example exposes the intended behavior?
- What expected result, failure signal, invariant, and observable evidence would show the behavior is right or drifting?
- If the evidence fails, should correction return to the spec, plan, implementation, or human decision?
- Are you still at the user behavior / architecture-boundary level, or have you prematurely turned implementation machinery into the behavior owner?
If the spec already answers these questions, carry those answers into Behavior Coverage. If it does not, add the missing behavior questions to the plan notes or return to the spec before writing implementation tasks. Do not invent a Behavior Coverage section for purely technical work.
File Structure
Before defining tasks, map out which files will be created or modified and what each one is responsible for. This is where decomposition decisions get locked in.
- Design units with clear boundaries and well-defined interfaces. Each file should have one clear responsibility.
- You reason best about code you can hold in context at once, and your edits are more reliable when files are focused. Prefer smaller, focused files over large ones that do too much.
- Files that change together should live together. Split by responsibility, not by technical layer.
- In existing codebases, follow established patterns. If the codebase uses large files, don't unilaterally restructure - but if a file you're modifying has grown unwieldy, including a split in the plan is reasonable.
This structure informs the task decomposition. Each task should produce self-contained changes that make sense independently.
Task Right-Sizing
A task is the smallest unit that carries its own test cycle and is worth a
fresh reviewer's gate. When drawing task boundaries: 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 neighbor. Each task ends with an
independently testable deliverable.
Bite-Sized Task Granularity
Each step is one action (2-5 minutes):
- "Write the failing test" - step
- "Run it to make sure it fails" - step
- "Implement the minimal code to make the test pass" - step
- "Run the tests and make sure they pass" - step
- "Commit" - step
Plan Document Header
Every plan MUST start with this header:
# [Feature Name] Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** [One sentence describing what this builds]
**Architecture:** [2-3 sentences about approach]
**Tech Stack:** [Key technologies/libraries]
## Global Constraints
[The spec's project-wide requirements — version floors, dependency limits,
naming and copy rules, platform requirements — one line each, with exact
values copied verbatim from the spec. Every task's requirements implicitly
include this section.]
---
Behavior Coverage
If the spec includes Behavior Evaluation, add this section after the header and before the task list. Behavior Coverage turns behavior scenarios from the spec into reviewable checks for the plan. It helps catch cases where local implementation is correct but the overall behavior or flow drifts.
## Behavior Coverage
### Scenarios
| Scenario | Example | Observable evidence | Expected result | Failure signal | If it fails |
| --- | --- | --- | --- | --- | --- |
| Scenario 1 | Concrete example from the spec | What a test or human can observe | How to judge alignment | What proves drift | Return to spec, plan, implementation, or human decision |
### Automation / Observation / Correction
| Scenario | Automated check | Human observation | Failure response |
| --- | --- | --- | --- |
| Scenario 1 | Test, command, integration check, or none | What the human reviews if not fully automated | What to revisit if this fails |
### Cross-Task Invariants
- Invariant 1: Invariant from the spec that must remain true across tasks.
A behavior scenario is a concrete example or user-observable flow turned into a reviewable control point. It is not a task, module boundary, milestone, approval gate, or replacement for TDD.
When a behavior scenario has an automated check, make it concrete: one behavior, clear expected result, real code or real artifact where possible, exact command, and expected output. If the check would pass immediately without proving the scenario's failure signal, choose a better check.
Do not require every task to have a behavior scenario. A task only gets a behavior coverage line if it connects to a scenario or invariant:
**Behavior coverage:** implements Scenario 1 | observes Scenario 1 | corrects Scenario 1 | preserves Invariant 1 | technical-only
Use technical-only when the task has no direct connection to a behavior scenario or invariant. Technical-only tasks still follow TDD, regression testing, or static verification as appropriate.
Task Structure
### Task N: [Component Name]
**Files:**
- Create: `exact/path/to/file.py`
- Modify: `exact/path/to/existing.py:123-145`
- Test: `tests/exact/path/to/test.py`
**Behavior coverage:** implements Scenario 1 | observes Scenario 1 | corrects Scenario 1 | preserves Invariant 1 | technical-only
(Only include this line when the plan has Behavior Coverage.)
**Interfaces:**
- Consumes: [what this task uses from earlier tasks — exact signatures]
- Produces: [what later tasks rely on — exact function names, parameter
and return types. A task's implementer sees only their own task; this
block is how they learn the names and types neighboring tasks use.]
- [ ] **Step 1: Write the failing test**
```python
def test_specific_behavior():
result = function(input)
assert result == expected
```
- [ ] **Step 2: Run test to verify it fails**
Run: `pytest tests/path/test.py::test_name -v`
Expected: FAIL with "function not defined"
- [ ] **Step 3: Write minimal implementation**
```python
def function(input):
return expected
```
- [ ] **Step 4: Run test to verify it passes**
Run: `pytest tests/path/test.py::test_name -v`
Expected: PASS
- [ ] **Step 5: Commit**
```bash
git add tests/path/test.py src/path/file.py
git commit -m "feat: add specific feature"
```
No Placeholders
Every step must contain the actual content an engineer needs. 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 actual test code)
- "Similar to Task N" (repeat the code — the engineer may be reading tasks out of order)
- Steps that describe what to do without showing how (code blocks required for code steps)
- References to types, functions, or methods not defined in any task
Remember
- Exact file paths always
- Complete code in every step — if a step changes code, show the code
- Exact commands with expected output
- DRY, YAGNI, TDD, frequent commits
Self-Review
After writing the complete plan, look at the spec with fresh eyes and check the plan against it. This is a checklist you run yourself — not a subagent dispatch.
1. Spec coverage: Skim each section/requirement in the spec. Can you point to a task that implements it? List any gaps.
2. Behavior coverage: If the spec includes Behavior Evaluation, does the plan turn those behavior scenarios into observable evidence/oracles, failure signals, correction paths, and any cross-task invariants? Do tasks only reference behavior coverage when they connect to a scenario or invariant?
3. Placeholder scan: Search your plan for red flags — any of the patterns from the "No Placeholders" section above. Fix them.
4. Type consistency: Do the types, method signatures, and property names you used in later tasks match what you defined in earlier tasks? A function called clearLayers() in Task 3 but clearFullLayers() in Task 7 is a bug.
5. Architecture ownership: Do plan tasks preserve the spec's intended owners instead of turning adapters, caches, fallback paths, eval artifacts, debug scaffolding, fixed file names, or exact choreography into product contract? If a task introduces support machinery, verify it remains an internal implementation aid and does not become a product contract, authority surface, or owner of user-visible behavior.
If you find issues, fix them inline. If you find a spec requirement with no task, add the task.
Then run the plan document reviewer using skills/writing-plans/plan-document-reviewer-prompt.md. If your platform supports subagents or reviewer dispatch, dispatch it as a separate reviewer. Otherwise, run the same reviewer prompt inline and state that no separate reviewer was available.
Treat the reviewer as initial filtering only. If the reviewer finds issues, fix them and run the reviewer again. Repeat until the reviewer approves or a human decision is needed. Fix real issues before offering execution options.
Execution Handoff
After saving the plan, offer execution choice:
"Plan complete and saved to docs/superpowers/plans/<filename>.md. Two execution options:
1. Subagent-Driven (recommended) - I dispatch a fresh subagent per task, review between tasks, fast iteration
2. Inline Execution - Execute tasks in this session using executing-plans, batch execution with checkpoints
Which approach?"
If Subagent-Driven chosen:
- REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development
- Fresh subagent per task + two-stage review
If Inline Execution chosen:
- REQUIRED SUB-SKILL: Use superpowers:executing-plans
- Batch execution with checkpoints for review