원클릭으로
draft-plan
Use when you have a spec or requirements for a multi-step task, before touching code
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Use when you have a spec or requirements for a multi-step task, before touching code
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Use when the user wants to view, change, or reset their persistent preferences, or when triggered by "/caliper-settings", "my settings", "change defaults".
Use when asked to audit a codebase, find DRY/YAGNI/complexity issues repo-wide, or perform periodic code quality review
Use when a design doc has been written and before draft-plan is dispatched
Use when creating features, building components, adding functionality, or modifying behavior - before any creative or implementation work begins
Use when implementing a small or medium change directly in the current session, without a multi-task plan — via design's fast-path routing, or direct invocation ("/implement", "just implement this", "quick fix").
Use when a multi-task implementation is complete and ready for holistic review before merging, or asked to review the current branch/diff as a whole
| name | draft-plan |
| description | Use when you have a spec or requirements for a multi-step task, before touching code |
Subagent dispatch: Use
subagent_type: "claude-caliper:plan-drafter". The agent definition contains the full planning methodology. The invocation prompt needs only the design doc path, working directory, and plan directory.
A plan is plan.json — a structured manifest of phases and tasks. Each task carries intent, not code: enough for a fresh Claude, reading the codebase directly at full context, to execute it unambiguously. Plans never paste implementation code and never spawn per-task .md files. plan.md is rendered from plan.json; you don't write it by hand.
Save to: the absolute $PLAN_DIR injected by the dispatcher (resolves to $MAIN_ROOT/.claude/claude-caliper/YYYY-MM-DD-<topic>/ in the main repo, not the worktree). Plans are gitignored but persist across worktree cleanup.
TaskList to check for prior session contextvalidate-plan --check-entry $PLAN_DIR/plan.json --stage draft-plan (exits early if design-review hasn't passed; plan.json need not exist yet — only reviews.json is read)intent can be terse and precise.intent and avoid (see Task Structure)$MAIN_ROOT/.claude/claude-caliper/ (gitignored)Directory layout:
.claude/claude-caliper/YYYY-MM-DD-topic/
├── plan.json # Structured manifest (source of truth)
└── plan.md # Generated outline (DO NOT edit)
plan.json is the only artifact you write. plan.md is rendered. Per-phase completion.md files are created later by the orchestrate lead as the reviewer's aggregation point — not by draft-plan.
plan.json shape:
{
"schema": 2,
"status": "Not Yet Started",
"workflow": "pr-create",
"goal": "One sentence",
"architecture": "2-3 sentences",
"tech_stack": "Key technologies",
"phases": [
{
"letter": "A",
"name": "Core API",
"status": "Not Started",
"depends_on": [],
"rationale": "Foundation layer needed first",
"tasks": [
{
"id": "A1",
"name": "Setup route handlers",
"status": "pending",
"intent": "Add the HTTP route handlers exposing health and auth endpoints so downstream consumers have a stable surface. Foundation task — nothing else in the phase wires up until these routes return well-formed responses.",
"depends_on": [],
"complexity": "medium",
"files": { "create": ["src/routes.ts"], "modify": [], "test": ["tests/routes.test.ts"] },
"verification": "npx jest tests/routes.test.ts",
"done_when": "Handler returns 200, 2/2 tests pass",
"avoid": [
{ "rule": "Don't use express", "why": "we're on Hono for edge-runtime compatibility" }
]
}
]
}
]
}
workflow (pr-create | pr-merge | orchestrate | plan-only) is set by the design skill, not chosen here. success_criteria is optional at plan/phase/task levels.
See: schema-reference.md for the full field reference, status lifecycle, and validate-plan modes.
Multi-phase when: dependency layers, verification gates, or independent shipping. Single-phase when: tasks are independent. Use A-prefix (A1, A2...).
Gates: 8+ tasks single-phase → look for hidden boundary. 7+ tasks per phase → examine cut points.
Phase boundaries = meaningful "run full suite" points. depends_on (phase level) declares phase ordering. Tasks within a phase execute in parallel — file sets must be disjoint (validate-plan --schema enforces this).
Inherit phases from design doc if approved.
Each task carries fixed overhead: worktree creation, subagent dispatch, and its share of the phase review. Trivial tasks (single-line changes, import additions, config updates) don't justify that cost individually. Before finalizing, scan for consolidation:
intent would be shorter than the rest of its metadata, it's too small — look for neighbors to merge with.intent (e.g., "run the full test suite and confirm no regressions") rather than step-by-step TDD. The implementer follows whatever the task prescribes.Every task is a single plan.json entry — no split prose file. The two fields that carry direction:
| Field | Requirement | Good |
|---|---|---|
| intent | 2–4 sentences: what to build and why. Names the component and its behavior; states how it fits the phase. No pasted code. | "Add JWT validation middleware that rejects expired/invalid tokens before the handler runs, so protected routes can trust req.user. Consumed by every task in Phase B." |
| avoid | Array of {rule, why} — each pitfall with its reason | {"rule": "Use jose not jsonwebtoken", "why": "jsonwebtoken has CJS/Edge issues on the target runtime"} |
| files | Exact paths (create/modify/test) | {"create": ["src/auth/login.ts"], "test": ["tests/auth/login.test.ts"]} |
| verification | Runnable command, <60s | pytest tests/auth/ -v |
| done_when | Measurable end state | login returns JWT, 4/4 tests pass |
| depends_on | Task IDs this consumes | ["A1"] (same phase for ordering, prior phase for cross-phase deps) |
| complexity | Enum: low, medium, high | "medium" |
The implementer reads the codebase directly, so intent states the outcome and seams — not line-by-line code.
Interface-first ordering: Define contracts first, implement in middle tasks, wire consumers last.
Integration tests for cross-task seams: When the design's ## Test Strategy section names a seam (producer module → consumer module), the plan must include at least one task whose done_when exercises that seam end-to-end with no mock at the seam under test. The Test Strategy section is the trigger — the seams it names map 1:1 to integration tasks. Multi-phase plans and plans with cross-task depends_on are where seams typically exist, but the design doc, not the plan structure, is the source of truth.
Placement rules — same-phase vs cross-phase seams:
Either placement works as long as the seam is exercised without mocking the producer. Each integration task's done_when should name the seam explicitly: "kv_launcher → kv_fetch seam runs end-to-end with real subprocess spawn, 1/1 test passes" — not just "integration tests pass". The named seam links the task back to design's Test Strategy and lets plan-review verify the contract.
Handoff notes: When a task depends on a prior phase's task, the orchestrate lead records the shipped-interface note into plan.json via validate-plan --add-handoff at the source phase's wrap-up (post-review, so it reflects the real interface). Draft-plan doesn't write these — just declare the depends_on.
Before handoff, re-read every task entry and the plan.json. The plan-reviewer downstream applies a checklist; catch these items here so review is pass/fail, not an editing pass. Goal at handoff: zero or one remaining issues.
Per task:
intent names the component and its behavior.done_when — "4/4 tests pass" or "endpoint returns 200", not "auth works" or "feature complete".avoid entry gives the reason, not just the prohibition.intent, files, avoid, and done_when. Every path referenced exists in files.Across the plan:
done_when. Missing criterion → add a task.## Test Strategy maps to a task whose done_when names the seam and the non-mocking constraint.intent is shorter than the rest of its metadata should merge with a neighbor.