| name | implement |
| description | Implement a technical design by decomposing it into dependency-ordered vertical slices, executing each with TDD red-green, reviewing each via an isolated sub-agent, and persisting progress to a state file so work survives session restarts. Use when the user has a tech design (doc or settled conversation) and says "implement", "start building", "let's code this", "实现吧", "开始实现", "按这个方案做", "把设计落地". |
Take a technical design and turn it into working, reviewed code — slice by
slice, test-first, with progress checkpointed to disk so a new session can
resume exactly where the last one stopped.
Inputs
One of:
- A path to a tech design document
- "implement the design" — use the design settled in conversation context
If neither exists, stop and ask for the design first.
State persistence
State file: .octo/implement-state.json in the repository root (create
.octo/ if needed; add it to .gitignore if not ignored — the state file
is session machinery, never committed).
On startup, always check for this file first.
- Exists → read it, summarize progress, ask: "Found an in-progress
implementation. Resume from where we left off?" Resume honors each
slice's status; "no" means ask whether to start fresh (overwrite) or
abort.
- Missing → start at Phase 1.
{
"tech_design_path": "path or '(conversation)'",
"branch": "feat/...",
"updated_at": "RFC3339",
"waves": [
{ "wave": 1, "mode": "sequential",
"slices": [
{ "slice": 1, "title": "...", "status": "pending|in_progress|review|done|skipped",
"acceptance_criteria": ["..."], "files_owned": ["..."],
"tests_added": 0, "review_summary": "", "deviations": "", "commit_sha": "" }
] }
]
}
Update the file on every status transition (slice starts, enters review,
done with commit SHA + review summary + deviations). Delete it when
everything is done — a clean exit leaves no state behind.
Resuming: done/skipped skip; review re-runs or finishes the review;
in_progress checks git log for partial commits and continues from them
or restarts the slice; pending starts normally.
Phase 1 — readiness gate, then decompose
Readiness gate. Before slicing, verify the design is concrete enough to
code from: every API has method + path + request/response shape, every
schema has fields + types, every external call names its counterpart. If
something is too vague to implement without guessing, list exactly what's
missing and ask the user (use ask_user_question for each decision) —
do NOT decompose on top of vague specs; slices built on guesses produce
guessed code.
Decompose into vertical slices. Each slice cuts through all layers
end-to-end (schema → logic → surface → tests), never a horizontal slab.
Group slices into waves by dependency:
- Wave 1 is always a tracer bullet: one thin end-to-end slice that
proves the architecture, run inline so its lessons inform the rest.
- Dependencies before dependents; data layer before consumers.
- Slices within a wave must own disjoint file sets — that's what makes
a wave parallelizable. If two slices need the same file, different waves.
- Honesty over parallelism: a tightly-coupled feature is often one
sequential wave per slice. Say so instead of forcing a fan-out.
Present the breakdown (slice titles, scope, acceptance criteria, wave
grouping) and confirm with the user before writing the state file —
unless the user has already told you to proceed autonomously.
Phase 2 — execute wave by wave
Branch discipline
Work on a fresh branch off the latest default branch. Never start a new
piece of work on a branch whose PR already has auto-merge armed — after a
PR is created, the next slice batch gets a new branch.
The TDD cadence (every slice, no exceptions)
(This section is the rhythm. Hold to the usual test-quality bar as you go:
test behavior over implementation, mock only what you don't own, and add
wire-contract tests for boundary structs.)
For EACH behavior in the slice:
- Write ONE failing test — actual test code, not a description.
- Run it; confirm RED (and that it fails for the right reason).
- Write the minimal implementation.
- Run it; confirm GREEN.
- Run the package's full tests; refactor if needed; still GREEN.
- Commit immediately — one behavior, one commit, bisectable.
Banned in any plan, prompt, or code you produce: "TODO", "TBD",
"implement later", "add proper error handling", "similar to slice N",
steps that describe WHAT without showing the code. If you can't write the
code, the design decision isn't made yet — go back and make it.
Sequential slices (the common case)
Run inline, full cadence above, then review (below), then next slice.
Parallel waves (only when file sets are truly disjoint)
Spawn one sub_agent per slice. Each sub-agent works in its own git
worktree — follow the absolute-path rule from the worktree-isolate
skill: octo has no session working directory, so every command is
git -C "$WT" … / cd "$WT" && … in a single terminal call, and every
file tool gets the worktree's absolute path. The sub-agent prompt must be
self-contained: slice scope, acceptance criteria, owned files (absolute
paths), interface contracts, the design doc path, the TDD cadence, and the
deviation rules below — sub-agents have no conversation context.
After a wave: review each slice, merge each worktree branch back, resolve
any conflict (a conflict means the slices weren't independent — note it),
run the full suite on the merged result.
If sub_agent is unavailable in this session, run the slices sequentially
inline and say so.
Verify external contracts before writing boundary code
Any code that talks to something outside this repo — an HTTP/RPC API, a
DB column, a wire format — must be verified against ground truth before
the struct or query is written, and the evidence shown (file:line or
fetched doc, with the verbatim field names):
- External API: read an existing client of the same service in this
codebase, or the upstream handler/spec itself. Prose descriptions in
the design doc are not evidence — they rot.
- DB column comparisons: grep the WRITE path (where the column is
assigned), not just the read path. A filter that compares a column to a
value no writer ever stores compiles, passes unit tests against fake
data, and matches zero rows in production.
- If no ground truth can be found, STOP and flag it rather than guess —
wrong contracts pass mocked tests and fail only in production.
Review (every slice, non-negotiable)
After a slice's code is complete, dispatch an isolated reviewer with the
code-review skill's sub-agent pattern: zero conversation context, given
only the git range, the design doc path, what the slice claims to do, and
any intentional deviations (so they aren't re-reported). Ask it to check
correctness, races, conventions, tests, security, and design compliance,
with severity-ranked findings.
Then: verify each finding before acting — reviewers are sometimes wrong;
push back with technical reasoning when they are. Fix Critical now,
Important before the next wave, Minor if cheap. Record the review summary
in the state file. No performative agreement — fix and show the result.
Deviation rules
| Situation | Action |
|---|
| Bug found while implementing | Fix now, note in the slice report |
| Design is missing a small detail | Decide, implement, note it |
| Environment/dependency blocker | Work around, note it, surface at the checkpoint |
| Architectural change (new boundary, changed contract/schema) | STOP and ask the user |
Update the design doc in the same branch when the implementation
legitimately diverges — the doc describes current state, and a doc that
lies is worse than no doc.
Phase 3 — verification before the PR
Four levels, in order:
- Exists — everything the design names is present.
- Substantive — no stubs: scan the diff for empty bodies,
panic("unimplemented"), tests without assertions, leftover TODOs.
- Wired — every new surface is reachable: handlers registered, tools
advertised, hooks attached, config read. Unwired code is a bug.
- Functional — the project's full test suite (with the race detector
if it's a Go project), formatter, and vet/linter all clean; every
acceptance criterion from Phase 1 checked off. Where feasible, one
real end-to-end smoke (run the binary, hit the endpoint, observe the
behavior) — unit-green is not the same as works.
Then: push the branch, open a PR whose description covers what landed,
review findings fixed, and deviations from the design. Delete the state
file. Report: slices completed, tests added, review findings (any
patterns?), deviations, anything left for manual verification.
Key principles
- Vertical over horizontal; tracer bullet first; learn before fanning out.
- One behavior = one commit; review every slice; verify, don't trust.
- The state file is always current — any session can crash and resume.
- Auto-fix bugs and blockers; stop and ask before architectural change.
- Match the codebase's conventions — comment density, naming, test style —
not your own defaults.