Build
A personal Claude Code skills library built around one deliberate, gated workflow: /spec → /plan → /build → /test → /review → /ship
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.
What its author says it does
Copied from the file, not written here
Implements tasks from an approved plan, one at a time. Only runs when the user explicitly types /build.
SKILL.md
8.9 KB, 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.