Plan
A staged spec → plan → coding → review workflow for shipping AI-assisted code. Works with Claude Code, Codex, Cursor & Antigravity.
npx -y skills add bonnguyenitc/specship --skill planAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Design an implementation plan from an understood spec before writing code. Use after the spec is understood, when asked to "plan this feature", "how should we implement X", or "break this down into steps". Produces an ordered, verifiable step-by-step plan with files to touch, approach, tradeoffs, and per-step success checks. Second stage of the spec → plan → coding workflow.
SKILL.md
8.9 KB, as published. Nobody here has run it
Plan
Goal: turn an understood spec into a concrete, ordered implementation plan — small steps, each independently verifiable — before any code is written.
When to use
- The spec is understood (ideally via the
specskill) and you're ready to design. - You're asked to break a feature into steps or weigh implementation approaches.
- Second stage of the workflow: spec → plan → coding → review (+
debug).
Shared task state
Part of the task pipeline — see ../WORKFLOW.md for the full contract.
- Hydrate: resolve the active
TASK-<ID>, readtasks/TASK-<ID>/task.md+spec.md, plusdocs/onboarding/{source-structure,how-to-code}.mdif present. Ifspec.mdis missing orstatus: draftwith open blockers, runspecfirst. - Checkpoint: write
plan.md, then updatetask.md— setstage: plan,planartifactdraft→approved, bumpupdated:, append a Pipeline Log line carrying your agent label (format:../WORKFLOW.md→ Agent handoff). - Blocked? If planning can't be finalized because of an unresolved blocker
Q#or an external dependency (an API/data/decision the plan hinges on), setstatus: blocked, note it inBlocked by:, and log it; flip back toactivewhen it clears.blockedis involuntary — to set the task aside by choice, usepause-task. See../WORKFLOW.md→ Status values. - Lessons: read
tasks/LESSONS.mdat hydrate and apply its rules; if you detect a process mistake, fix it and append anL#entry there (see../WORKFLOW.md→ Lessons).
Method
1. Read the inputs
- Read
tasks/TASK-<ID>/spec.md(produced byspec) — every step must trace to a requirement or acceptance criterion in it, and its Assumptions can decide the design, so read them too. If it's missing, runspecfirst. - Know where the code will live and the patterns to follow: reuse
docs/onboarding/source-structure.mdandhow-to-code.mdif present, or runexplore-sourceif the project is unfamiliar. - Open the actual files the plan will touch — confirm the functions, signatures, and patterns the steps rely on really exist as you believe. A plan referencing imagined code doesn't fail now; it fails at
coding, where it's more expensive. - Delegate wide reads to a subagent. If confirming the plan's assumptions requires broad exploration (an unfamiliar area, many candidate files), spawn the built-in Explore agent for the fan-out and keep only its conclusions in this thread - but still open the specific files the steps touch yourself, and verify any path or symbol an agent reports before the plan relies on it. If your platform can't spawn subagents, do the exploration inline in this thread instead (
../WORKFLOW.md→ In-stage subagents: delegation is an optimization, never a precondition).
2. Choose an approach
- If multiple designs are viable, lay out the options with tradeoffs and pick one with a clear reason. Don't silently choose.
- Prefer the simplest design that satisfies the spec — no speculative abstractions or unrequested flexibility.
- Reuse existing patterns/utilities instead of inventing new ones.
- Elegance checkpoint: before locking the approach in, pause and ask "is there a simpler way to do this?" - a smaller diff, an existing utility, a design that removes a whole step. This is the cheapest moment to change course; at
codingit costs a rewrite. Skip the ceremony for tiny fixes (a one- or two-step plan) - forcing it there invites over-engineering.
3. Break into steps
- Order steps so each leaves the code in a working, testable state.
- Size each step like a commit: one coherent change, independently verifiable. Too big: it mixes refactoring with behavior change, or its
verify:can only pass once later steps land — split it (prep/refactor steps first, behavior steps after). Too small: it can't be verified on its own — merge it into the step that makes it observable. - Turn unknowns into spike steps, not guesses. If an approach hinges on something you can't know without trying (a library's behavior, a perf ceiling, an undocumented API), make the first step a time-boxed spike whose
verify:is the question answered — and note that its outcome may revise the later steps. - For each step define: what changes, which files (
path), and a verify check. Theverify:must be executable, not a description — a concrete command or test the coding loop can run and read a pass/fail from (<test-runner> path::case,tsc --noEmit,curl … | grep, an assertion), not prose like "behavior works" or "looks correct". If a step's only honest check is a manual observation, name the exact action and expected output so it's still a binary check, not a vibe. A vagueverify:hands the coding stage a strong loop pointed at a blurry target — it'll report "done" without proof. - For a step that covers an
AC#, itsverify:should run (or extend) that AC's ownverify:check fromspec.md— don't invent a parallel one. This is what carries the spec's acceptance check through to executable code and back up toreview. - Call out data/schema migrations, API contract changes, and anything irreversible early.
- Note risks, unknowns, and where you might need to revisit the spec.
Output: write the plan to the task folder
Write the plan to tasks/TASK-<ID>/plan.md (same TASK-<ID> as spec.md) using the exact template below — coding and review parse it. Then show the user a short summary.
Rules for the IDs: steps are S1, S2, … and never renumbered (only appended). Each step's covers: field references the R#/AC# IDs from spec.md it satisfies — this is how every step traces to a requirement, and how review checks nothing was missed. Coverage runs both ways: before approval, sweep spec.md and confirm every R# and AC# appears in at least one step's covers: — an uncovered ID means a missing step, or a scope question to raise with the user. Don't leave the gap for review to find.
---
task: TASK-<ID>
title: <short title>
type: plan
status: draft # draft | approved
created: <YYYY-MM-DD HH:MM +TZ>
updated: <YYYY-MM-DD HH:MM +TZ>
---
# Plan: <title>
## Approach
<chosen design + key tradeoffs, and why if alternatives existed>
## Files to Touch
- `path/to/file` — <one-line role of the change>
## Steps
<!-- verify: must be a runnable command/test with a pass/fail, not a description -->
- [ ] S1 — <change> (covers: R1, AC1) → verify: <exact command/test to run, e.g. `vitest run auth.test.ts`>
- [ ] S2 — <change> (covers: R2) → verify: ...
## Risks / Open Questions
- <anything that could change the plan>
## Change History
- <YYYY-MM-DD HH:MM +TZ>: Created.
Keep it minimal and surgical, and right-size it: a small task gets a small plan — two or three steps and - none in the empty sections, never steps invented to fill the template. Approval gate: every step lists at least one covers: ID and an executable verify:, and every R#/AC# in spec.md is covered by at least one step — a plan failing either check is not ready to approve. For non-trivial plans, present it for approval before coding (use EnterPlanMode when appropriate). Set status: approved once the user approves. (Under ship, approval is delegated: set status: approved directly and log it.)
When the plan changes (including after a spec.md update), edit it in place: bump updated:, append a dated Change History line, keep S# IDs stable.
External phase execution
If an orchestrator launched you for the plan phase only (../WORKFLOW.md → External phase execution), the rules there override the handoff below. In short: confirm the envelope with specship check TASK-<ID> --phase plan --actor <codex|claude-code> --expect-revision <n> --json (exit 0 or stop), work from the named task's spec.md alone, write plan.md, then checkpoint task.md last with revision +1 and stop. Don't ask about coding, don't invoke coding, don't call ship — skip "Next step" entirely and let the orchestrator decide.
Next step
Once the plan is approved, ask the user whether they want to start implementing — e.g. "Bạn có muốn tôi code theo plan này luôn không?".
- If the user agrees, immediately invoke the
codingskill (via the Skill tool) and continue into implementation in the same flow — don't make them ask again. - If the user declines or wants to revise the plan first, stop here.
- Under
ship(autopilot), skip the question and invokecodingdirectly.