Plan
Strict 3-stage handoff workflow (plan → execute → verify) for coding agents. Disk-backed state lets verify run in a fresh chat.
npx -y skills add WillowRyu/agent-handoff --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
- 0 stars0 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
Use when starting a new feature, fix, or refactor that needs explicit planning before code changes. Reads .handoff/config.md (and backlog if present) and writes a structured plan.md to .handoff/. Supports multi-phase plans for large work, and risk tags on change list items. Does NOT modify code or run build commands. Pair with /execute and /verify. Part of the agent-handoff bundle (4 skills) — install /setup-handoff, /plan, /execute, /verify together.
SKILL.md
7.5 KB, ~1.7k tokens by cl100k_base, as published. Nobody here has run it
Plan
Investigate the codebase, design the change, and write .handoff/plan.md. No code modification, no command execution.
Gate (run first)
-
Read
.handoff/config.md. If missing, abort:❌ No config found. Run
/setup-handofffirst. -
Re-entry check. Inspect
.handoff/for retained state:State Mode Action plan.mdANDreview.mdexistBlocked cycle Read both. The previous plan attempted work; review.md lists blockers. The new plan must address the blockers. Preserve the existing structure: keep ## Background, keep## Phases(if any) including the current[🔄]marker — verify did not advance because blocking retains state and this phase's work isn't done. Replace only the parts that review.md identifies as broken. If previous plan had> Addresses backlog: ..., carry the marker forward (🔄 items in backlog stay 🔄).plan.mdexists with## Phasesand a[🔄]marker,review.mdabsentPhase advance Read previous plan to inherit context. Inherit ## Backgroundand## Phases(with markers already advanced by verify). Replace the previous phase's## Change list,## Sync commands,## Test strategy,## Verification plan, and## Compile check(if any) with the new[🔄]phase's content. Carry forward> Addresses backlog: ...if present.plan.mdexists, no Phases section,review.mdabsentUnusual Verify normally cleans up after pass. This state suggests manual edit. Ask the user: "Found retained plan.md without phases or review. Continue editing it, or start fresh?" None exist Fresh plan Proceed normally. -
If
.handoff/backlog.mdexists and has any open items: see backlog-handling.md.
Output language
All output from this skill — conversational replies to the user, status/progress messages, AND the written plan.md — uses the language specified by config.md's response_language. Default if config missing or field absent: en. Code, file paths, command syntax, and identifiers stay in their native language regardless.
Workflow
-
Determine task scope based on Gate's matched re-entry mode:
- Fresh plan: resolve task description from
/plan "<arg>"if provided; otherwise the user typed/planalone and we may need to surface the backlog (see backlog-handling.md). - Blocked cycle: task is "address the blockers from review.md". Do NOT redesign Background or Phases — preserve them. Only revise
## Change list(and dependent sections like## Sync commands,## Verification plan) where review.md says they were wrong. - Phase advance: task is "design the
[🔄]phase's change list". Inherit## Backgroundand## Phasesfrom the previous plan.md as-is. Skip step 3 (scope assessment — phases are already declared). - Unusual: stop and ask user (per Gate's instruction).
- Fresh plan: resolve task description from
-
Investigate the codebase. Use the convention docs path and project doc index from config to guide what to read. Look at existing patterns the change must match.
-
Assess scope (skip if Gate matched Blocked cycle or Phase advance — scope was already decided in the original plan). If the work has clear, sequentially-dependent stages that are each independently verifiable (e.g., DB migration → API → frontend → cleanup), propose splitting into
## Phases. Confirm with user before committing to a multi-phase plan. Otherwise proceed as a single-cycle plan. -
Design the change list. Match the structure described in plan-template.md: change list, sync commands (if any), test strategy, verification plan.
- Verification scope decision. When filling the
## Verification plansection, look at the change list and pick ONLY the commands that actually apply./verifywill run exactly what's listed there. Typecheck is /execute's job — typically don't list it under verification. If the change is docs-only (or otherwise needs no command verification), write(none — <one-line rationale>). - Compile check opt-out. If the change should NOT trigger /execute's compile check (e.g., docs-only, intentional WIP), add a
## Compile checksection with body(none — <rationale>). Otherwise omit the section entirely (default = run config's typecheck).
- Verification scope decision. When filling the
-
Risk-tag the change list. For each change list item, decide whether to escalate:
Signal Suggested tag Path: migrations/,auth/,infra/,*.config.*,.github/workflows/, security-sensitive areasmedium-high Operations: delete / drop / alter / rotate / rename medium-high Public API or cross-package signature change (callers in other packages) medium > 5 files touched in one item, or > 20 in the plan medium Side effects: DB schema, fs writes, network calls, auth changes, concurrency primitives medium-high Plain logic edit, single file, no signature change low / untagged Default to leaving items untagged (= low). Suggest escalations to the user; require a one-line reason for any
high. Do NOT inflate tags "just to be safe" — everyhighslows execute and surfaces in review.Non-interactive flows: when no user input channel is available (scripted invocation, headless agent, CI), default all items to untagged (low) and skip the suggestion step. Do NOT auto-assign
mediumorhighwithout confirmation — auto-tagging would either over-cautiously slow every execute or under-tag missed signals. Keep the safe default and let an interactive re-run upgrade tags when warranted. -
Identify independent units. Look at the change list: are there subsets of files/changes that can be applied independently (no shared types, no shared sync command, no sequential dependency)? If yes, list them as parallelizable groups in plan.md's optional
## Parallelizationsection. If everything is sequential or tightly coupled, omit the section.Do NOT include
high-risk items in parallelizable groups. Parallel dispatch (handled by /execute) skips per-item compile checks — only the final safety-net check runs.highitems are tagged precisely because they need per-item discipline; putting them in a parallel group silently strips that safety. Either keep high items sequential (omit them from## Parallelization) or — if parallel execution truly outweighs per-item check — downgrade them to medium with a one-line justification. -
Write
.handoff/plan.md. -
If backlog items are being addressed, also mark them 🔄 in
.handoff/backlog.md(see backlog-handling.md §3). For multi-phase plans, the marker stays 🔄 across all phases until the final phase passes verify. -
Print:
✅ Plan written to .handoff/plan.md <if multi-phase:> Active phase: [N] <title> Next step: /execute (recommended in a fresh chat to keep context clean)
Boundaries
- Allowed: read any file, web search, write
.handoff/plan.md, mark items in.handoff/backlog.md. - Forbidden: modify code, run build/test/lint commands, create or delete project files.
What ships with it: 2 files
6.6 KB alongside SKILL.md
- backlog-handling.md1.3 KB
- plan-template.md5.3 KB