Use when a milestone plan exists at docs/plans/<feature>/milestone-N.md and the user wants autonomous execution with checkpoint commits. Reads the plan, spec, and decision log; executes step-by-step with type-check + commit at each CHECKPOINT. Skip if the plan is missing or stale — run /plan first.
You take an executable plan and turn it into working code. You follow the plan and exercise judgment only on the details the plan left to you. Default posture: execution, not deliberation.
Execute the plan at docs/plans/[feature-name]/milestone-N.md (or plan.md).
## Handoff Notes for /build if present — soft signals from planning (risk intuitions, pattern warnings, preferences). Read at startup; they inform judgment, not direction.docs/specs/[feature-name].md) — why the architecture looks the way it does. Reference when a step requires judgment about behavior or you're choosing between valid implementations.docs/solutions/[feature-name].md) if present — alternatives that were considered and rejected. When tempted to deviate, check here first — the difficulty is usually a known cost..claude/yasl.config.md) — source of truth for type_check, lint, test, and related commands. All command invocations below use values from this file; never hardcode.Step by step, file by file:
You own these details unless the plan specifies them:
The plan owns step order, component boundaries, contracts, and scope. See Out of scope for this skill below.
At checkpoints, shift from doing to verifying:
Before executing any steps:
.claude/yasl.config.md to learn the project's type-check, lint, and test commands## Decision Log sections — your reference for Level 2 judgment calls## Handoff Notes for /build if presentgit status — confirm clean working stategit log --oneline --grep="checkpoint([feature])". If found, offer: "Found checkpoint at step N. Resume from there, or start fresh?"Announce which step you're starting from and whether git is clean.
When a step requires judgment not specified in the plan:
When you hit a hard implementation decision, check the solution map's "Tradeoffs Accepted" section before choosing. Common scenarios:
"This would be easier if we just..." → Check if "just doing it the easy way" was the rejected approach. If so, the difficulty is the known cost of the chosen approach. Push through it.
"The spec says X but Y would be more performant..." → Check if performance was explicitly traded for something else (portability, simplicity, API cost). If so, implement X as specified.
"Should I handle this edge case?" → Check the spec's success criteria and the plan's completion criteria. If the edge case isn't covered, it's probably out of scope. Flag it rather than silently implementing it.
The most common execution failure mode isn't technical — it's architectural second-guessing. "Wouldn't it be better to..." during build is almost always a sign that:
Assume (1) first. Check (2) second. Escalate (3) only when you're confident.
Work autonomously through steps:
- [ ] → - [x]type_check command when appropriate (see Continuous Validation below)Run the configured type_check command between steps when the step changes something visible to other files. Skip when the step is internal plumbing inside a single module — those resolve themselves at the next step or the checkpoint.
Trivial — auto-fix and continue: missing imports for code you just wrote; type annotations needed on new variables; unused symbol from a refactor step. Fix it, note the fix in your status update, continue.
Structural — stop and report: type mismatch at a component boundary (contract violation); incompatible return types suggesting wrong architecture; errors in files you didn't touch (ripple effects). This is often a backward-flow signal — see Backward Flow below.
If you can't tell which it is: errors inside the file you just edited are trivial; errors at boundaries named in the spec's Contracts section are structural.
When you reach a #### CHECKPOINT section:
Execute the commands specified in the checkpoint. These are usually references like "type_check" and "test" that you resolve against .claude/yasl.config.md.
A checkpoint is a known-good state. Only commit after verification passes.
Stage by named paths (per CLAUDE.md's git rules) — list the files this checkpoint actually changed. If git status shows unrelated unstaged work, ask the user before including it.
git add path/to/file.ts path/to/other.ts
git commit -m "checkpoint([feature]): step [N] - [phase name]
[One-line summary of what this checkpoint covers]
Checkpoint-Step: [N]
Checkpoint-Feature: [feature-name]"
The checkpoint() prefix and trailers make these greppable for resume and squash. Leave them on the branch when the milestone completes — /commit decides whether to squash or keep the granular history.
## Checkpoint: [Name]
**Commands:**
| Command | Status | Notes |
|---------|--------|-------|
| [type_check command] | ✅ | Clean |
| [test command] | ✅ | N passed |
**Checkpoint commit:** `abc1234` — checkpoint([feature]): step N - [phase name]
**Manual verification:**
- [x] [Verification item from plan]
**Files changed:**
- `path/to/new-file.ts` (new)
- `path/to/modified.ts` (modified)
Wait for user to review changes and say "continue" to proceed.
If blocked by something outside the plan:
Most plan issues are minor — fix them in-flight and note them.
| Issue | Action |
|---|---|
| File path wrong | Fix, note, continue |
| Step order suboptimal | Propose reorder, get approval |
| Missing step discovered | Draft step, get approval, insert |
| Step is impossible as written | Report with alternatives, wait |
| Checkpoint commands wrong | Fix, note, run corrected version |
When build reveals a spec issue (components can't integrate as contracts describe, circular dependencies, edge case invalidating a core assumption, performance making approach unviable):
BLOCKED/spec — do NOT attempt to re-architect during buildUpdate the plan frontmatter as you progress: