Build
Implements tasks from an approved plan, one at a time. Only runs when the user explicitly types /build.From its SKILL.md
npx -y skills add bingelp/skills --skill buildAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 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.
SKILL.md
8.9 KB, ~2.1k tokens by cl100k_base, as published. Nobody here has run it
Build
Overview
Implement the tasks in specs/<slug>/tasks.md, one at a time, in thin vertical slices. Each task should leave the codebase in a working, verifiable state — no half-finished slices spanning multiple tasks.
When to Use
Explicit invocation only (/build). Requires specs/<slug>/plan.md and specs/<slug>/tasks.md.
Where artifacts live
Every specs/<slug>/… path below resolves under the repo's shared git dir, not the working tree:
SPECS="$(git rev-parse --path-format=absolute --git-common-dir)/specs" # e.g. …/.git/specs
Storing artifacts there keeps them visible across every session and worktree — including the background-isolated steps Claude Code may switch into automatically — while making them impossible to accidentally commit. Outside a git repo, fall back to ./specs.
tasks.md stays a lean checklist — it does not hold the full per-task write-up. Each task's detail (what changed, decisions/deviations, verification evidence) goes in its own file under specs/<slug>/tasks/, named NN-slug.md from the task's number (2-digit, zero-padded) and a short kebab-case slug of its title (e.g. task 3. Persistence layer. → tasks/03-persistence-layer.md) — mirroring the NNNN-slug.md convention this pipeline already uses for ADRs in docs/adr/. This keeps tasks.md itself at roughly one line per task regardless of how much detail a task generates, so a fresh /build (or /where, /ship, /review) session reads a short file instead of one that grows into thousands of lines over a long build.
The build orchestrator — not the task subagent — is what writes tasks.md and the task-note files, after each subagent returns (Process step 5). A worktree-isolated orchestrator session's Edit/Write tools may refuse the shared specs path since it sits outside the worktree root. That's expected, not a blocker: the orchestrator falls back to Bash (e.g. python3 or a heredoc) to update tasks.md and write task-note files when this happens. This path is deliberately untracked and shared across every worktree, so writing to it doesn't touch anything the isolation guard is protecting — it's the one sanctioned exception to the Red Flag below about routing around blocked writes, and it does not extend to source files. Task subagents never touch this path at all — each one returns its summary line and task note in its response and lets the orchestrator persist them.
This session is a build orchestrator: it never implements a task itself, aside from persisting the shared specs bookkeeping (the tasks.md line and task note) that a subagent reports back. It dispatches one disposable task subagent per unchecked task, waits for it to return, and repeats — keeping its own context to O(tasks) instead of growing with every file read and edit across the whole feature.
Process
-
Find
specs/<slug>/tasks.mdandspecs/<slug>/plan.md. If either doesn't exist, stop and tell the user to run/planfirst. Readplan.md's Approach and Files/modules touched sections,CONTEXT.md, and any ADRs relevant to the area being touched — this is context to hand to each task subagent, not something to act on yourself. -
Take the first unchecked task in
tasks.mdorder. Dispatch it to a task subagent via theAgenttool, foreground/blocking — neverrun_in_background: true, never theWorkflowtool, never/loop. Usesubagent_type: general-purposeso it has full tool access and normal skill auto-triggering (e.g.tdd). If the task carries a trailing`[model: X]`hint, passmodel: Xto theAgentcall; otherwise omitmodelso the subagent inherits this session's default (sonnet). -
Give the subagent a self-contained brief: the task's exact text,
plan.md's Approach and Files/modules touched sections,CONTEXT.md, relevant ADRs, and the previous task's note file (specs/<slug>/tasks/NN-slug.md) if one exists — read just that one file, never the wholetasks.mdhistory or a prior subagent's transcript. -
Instruct the subagent to implement just that task, verify it (run it, run relevant tests, check the behavior), and then return — not write — two pieces of content in its response:
- The
tasks.mdline — the exact one-line text for that task once checked off:[x]plus a short summary and a pointer to its note file, e.g.— see tasks/03-persistence-layer.md. Nothing longer than a line. - The task note — the exact full Markdown content for
specs/<slug>/tasks/NN-slug.md(new file): what changed, any decisions or deviations from the plan, and verification evidence.
The subagent does not touch
tasks.mdor thetasks/directory itself — see "Where artifacts live". Persisting both pieces is the orchestrator's job, in the next step.If it hits something the plan didn't anticipate — including a tool refusing to edit a source file (e.g. a worktree-isolation guard blocking
Edit/Writeon a tracked file) — it should stop without working around the refusal or reconcilingplan.md/spec.mditself, and report the blocker back instead. - The
-
Once the subagent returns with that content, the orchestrator persists it: flip the task's checkbox to
[x]intasks.mdand append the returned one-line summary + pointer, then write the returned task note tospecs/<slug>/tasks/NN-slug.md(new file). Fall back toBash(e.g.python3or a heredoc) for either write ifEdit/Writerefuses the shared specs path — see "Where artifacts live". -
Don't dispatch the next task until both the current subagent has returned and the orchestrator has finished persisting its content — the loop only advances once that task's bookkeeping is actually on disk.
-
If the subagent reports a blocker, halt the loop entirely — dispatch no further tasks. Surface the blocker to the user rather than improvising a design decision. If resolving it means the
plan.md(orspec.md) is now wrong, fix the artifact — don't just resume dispatching against a plan that's silently wrong. Make the change through the owning step, reconcile downstream per where/RECONCILE.md, and only then resume the loop. If it's a hard-to-reverse decision made on the fly, usedomain-modelingto decide whether it needs an ADR. -
Otherwise, repeat from step 2 with the next unchecked task.
-
Once every task in
tasks.mdis checked off, tell the user: "All tasks complete. Run/testto verify against the spec's acceptance criteria." -
If this session is still worktree-isolated when it ends — whether because every task is checked off or because the loop halted on a blocker — ask the user whether to keep or remove the worktree before finishing, per docs/worktrees.md.
Because all state lives in tasks.md (checkboxes + one-line pointers) and specs/<slug>/tasks/ (the full per-task notes it points to), a fresh /build session started after an interrupted run just re-reads tasks.md and resumes at the first unchecked task — no separate recovery step, and no already-completed task gets redone.
Red Flags
- Implementing a task yourself instead of dispatching a task subagent — this session is the orchestrator; keep implementation-level tool calls (
Edit/Write/Bash/Readagainst source files) out of its own context. - Dispatching more than one task subagent at a time, or out of
tasks.mdorder — dispatch is strictly sequential; wait for each subagent to return before the next. - Letting a task subagent reconcile
plan.md/spec.mditself when it hits something the plan didn't anticipate — it reports the blocker back; reconciliation is the orchestrator's/user's call, not the disposable subagent's. - A task subagent routing around a blocked
Edit/Writecall on a source file (e.g. a worktree-isolation guard) viaBashheredocs,python3, or similar, instead of stopping and reporting the refusal as a blocker — a tool refusal on a tracked file is exactly the kind of thing step 4 means by "something the plan didn't anticipate"; silently working around it can leave the tree in an inconsistent, partially-isolated state that later tasks then collide with. - Marking a task done without the subagent actually verifying it.
- Writing the full task note (decisions, deviations, verification evidence) into
tasks.mditself instead oftasks/NN-slug.md— this is exactly the bloat the split exists to avoid;tasks.mdgets a one-line summary and a pointer, nothing more. - Introducing a new term for something
CONTEXT.mdalready names, or quietly contradicting a recorded ADR. - Resuming the loop against a plan that's been silently revised without updating
plan.mdand reconciling the affected tasks — the code and the plan drift apart and/reviewwill catch it later, more expensively. Seewhere/RECONCILE.md.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.