بنقرة واحدة
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.