Build Tasks Skill (work through the plan)
You work through the backlog: pick the next task, hand it to run-task, record the outcome,
continue. You choose which task, never how it is built — the cycle lives in run-task and is not
repeated here. Work is sequential on a single working tree on the current branch. The backlog is
the source of truth, so a killed run resumes without losing anything.
check the plan isn't stale → compute ready set → lowest id → /run-task → regen board → next (max 8)
Language & git
Respond and reason in the user's language. Never translate code, identifiers,
commands, or file paths.
Workflow vocabulary follows ../_shared/glossary.md exactly — what is translated, what
stays Latin, no hybrid verbs, template anchors verbatim.
One branch — the current one, normally main. Never create a branch, switch branch, or open
a worktree on your own initiative; only an explicit request in this session changes that, and a
request to commit, fix or ship is not one. Full rule: ../_shared/git-workflow.md.
Every agent you spawn inherits this and the language rule — pass both down; an agent that
thinks the work needs a branch reports it to you instead of creating one.
Modes
Read .dev-skills/build-plan/.build-config.md for mode (write it if absent, default
interactive). Full rules: ../_shared/build-pipeline/build-config.md. Backlog schema,
ready, and the board: ../_shared/build-pipeline/backlog-format.md.
- Straight through (default). Between tasks you do not stop and do not ask permission. The only
real reasons to pause: a task where the human has something to check by hand (
run-task handles
that), a needs_human escalation, a red gate, or the per-run limit.
- One at a time (opt-in, argument
one-at-a-time) — confirm before each task.
- Acceptance every N (opt-in, argument
review every N; suggest N=5) — only the human turns
this on, never you. Manual acceptance then happens on every Nth task and always on the run's last
task; the rest are passed to run-task with "acceptance deferred, manual review at TXX". Nothing
else softens: the verifier, the fix round, the green gate, and the needs_human stop are unchanged.
At the next manual acceptance, show the batch — one line per auto-accepted task since the last one
(what was built + what proved it) — so the human can spot and undo something wrong. The mode lasts
for this run only.
Procedure (copy this checklist into your response and check off as you go)
- [ ] Step 0: Intake — backlog present? spec moved ahead of the plan? mode? interrupted run?
- [ ] Loop: ready set → lowest id → /run-task → regen board → acceptance if due → next (stop at 8 tasks)
- [ ] Done: report built / needs_human / blocked / spec_sync pending; at the limit, ask for /compact
Step 0: Intake
- No
.dev-skills/build-plan/tasks/ → stop: there is nothing to run. Offer /plan-development
first. A single task from a sentence, with no plan at all, is /run-task "<request>".
- Has the spec moved ahead of the plan? Read the Reconciled with spec anchor in the header of
.dev-skills/build-plan/board.md and check whether the spec changed since:
git log <anchor-commit>..HEAD -- .dev-skills/project-spec/. If it did, stop and offer
/plan-development to reconcile first — otherwise the run will confidently build what the user has
already dropped. If the human says "go anyway", agree, but name which spec files diverged.
- Interrupted run. A task left
in_progress is not restarted blindly: show its ## Log and offer
to continue it through run-task (which re-verifies before committing). Finished tasks are never
rebuilt.
- Also reclaim a stale env lock left by a killed run
(
../_shared/build-pipeline/env-access.md).
- Is another session working here? List the tasks whose
claim.heartbeat is fresher than 30
minutes and say so in one line — those are skipped, not waited for. The user does run two sessions on
one repository, and a run that quietly re-does another's task is worse than one that stops
(../_shared/build-pipeline/backlog-format.md → claim). If a "study only, don't write" mode is
asked for, read the tasks and plan them, and change no file until the other session's claim clears.
- Does the scoped test target exist? Confirm the
make test-scoped equivalent named in
verification.md is there and really selects. Missing or fake → say it once, now: every hand-off
will otherwise pay for the whole suite, and /setup-dev-environment is the fix. Then proceed — the
run is not blocked on it (../_shared/build-pipeline/quality-gate.md).
- An argument that is a task id → start from that task (its blockers must still be
done).
The loop
Repeat while ready tasks remain:
- Compute the ready set —
todo tasks whose blocked_by are all done. Empty → go to Done.
If the open count (todo + in_progress + needs_human) is over 15, say so once and offer
/plan-development consolidate before continuing — the ceiling is the backlog's, not just the
planner's, and it is what keeps tasks coarse (../_shared/build-pipeline/planning-method.md).
The human decides; the run is not blocked on it.
- Take one — the lowest
id among them, so two runs produce the same order. Announce it in
one line and continue without asking; wait for confirmation only in one-at-a-time mode.
- Run it through
/run-task (via the Skill tool) — the whole cycle, no steps skipped and no
logic of your own; a green gate is mandatory in autopilot too — the static gate plus that task's
scoped test selection, never the whole suite
(../_shared/build-pipeline/quality-gate.md). In acceptance every N mode, tell
it whether this task's acceptance is deferred and where the manual one lands.
- A task that went
needs_human → don't take it again; show it to the human and move to the next
ready task. One stuck task must not stop the whole plan.
- Regenerate
.dev-skills/build-plan/board.md from the task files — the progress header
(done/total, %, and the Now line) included. run-task already refreshes it at each stage
boundary; here you refresh the totals.
- Acceptance, when the human asked for it. In acceptance every N mode, if this was the Nth
task of the run — or the run's last one — do the manual acceptance now, before taking anything
else: show the batch (one line per auto-accepted task since the previous acceptance: what was built
- what proved it) and wait. Skipping this silently turns the mode the human switched on into a
promise nobody kept.
- Next task — unless you hit the limit. Count the tasks handled this run (including escalated
ones): at 8, stop even if ready tasks remain, and go to Done. An argument
run N lowers the
limit to N.
Done: report
Report as a table: how many tasks finished this run · which went needs_human (the human's action
list, one line each on where it got stuck) · which remain blocked and by what · and which tasks sit at
spec_sync: pending — done, but not yet reflected in the spec. Point at
.dev-skills/build-plan/board.md for the detail.
Give each task a time column from its timings.total, and one line under the table splitting the
run into build / verify / fix / solve plus the time spent waiting on you, so the parts reconcile
with the total. Report the numbers flat, with no verdict attached
(../_shared/build-pipeline/backlog-format.md). End the report with the «What you should do»
block — imperative, one line per item, no pipeline jargon
(../_shared/build-pipeline/report-format.md).
Stopped at the limit with ready tasks left — ask the human to compact and re-run:
Ran 8 tasks; ready tasks remain. Continuing in this session isn't wise — the context is full of
diffs and reports, and tasks start blurring together. Run /compact (or /clear for a fully fresh
start) and call /build-tasks again: the plan, statuses, and logs live in .dev-skills/build-plan/,
so the run picks up at the next task and nothing is lost.
You cannot compact the context yourself — the human runs that command. Your job here is to stop in
time and say so.
If no ready tasks remain but unfinished ones do, explain why (they wait on needs_human tasks). If
everything is done, say so plainly and point at the release phase (/release-product) — and add one
line saying that the whole test suite has not been run yet: the build loop only ever ran each
task's own selection, and the full run happens in the release pipeline
(../_shared/build-pipeline/quality-gate.md). Say it as a fact about where the suite gets run, not
as a warning to act on now.
Rules
- Don't duplicate the cycle. All per-task work is
/run-task's. You choose the next task and
keep the books.
- One task at a time, one working tree. No parallel tasks, no worktrees, no new branch.
- The plan sets the order — ready tasks, lowest id. Never reshuffle "by importance".
- A task with unmet blockers is never taken.
needs_human is never retried automatically and is always surfaced, in both modes.
- Don't stop between tasks and don't ask permission; only the human slows it down, by choosing
one-at-a-time.
- Acceptance every N is the human's switch, never yours. Every Nth task and the run's last task
are always manual, with the batch of auto-accepted ones shown. A failure, a red gate, or
needs_human stops the run in any mode.
- At most 8 tasks per run. At the limit, stop and ask for
/compact — you don't compact anything
yourself.
- A spec that moved past the plan means
/plan-development first. Running a plan that disagrees
with the spec is confidently building the wrong thing.
- Finished work is never rebuilt; an interrupted run continues rather than restarts.
- The board is regenerated from the task files after every task, never hand-edited.
1---2name: build-tasks3description: Work through the development plan: take tasks from .dev-skills/build-plan/ one at a time and run each through run-task. The order is deterministic, not a judgement call — the ready task (status todo, all blocked_by done) with the lowest id; no parallel tasks, one working tree. It refuses to start when the spec has moved ahead of the plan and offers plan-development first, skips tasks another session has claimed, and never retries a needs_human task. By default it runs straight through, pausing only for a real reason; one-at-a-time and thinned acceptance are opt-in. Resumable — the backlog is the source of truth. Use after plan-development. It writes no code and duplicates no cycle.4---56# Build Tasks Skill (work through the plan)78You work through the backlog: pick the next task, hand it to **`run-task`**, record the outcome,9continue. You choose *which* task, never *how* it is built — the cycle lives in `run-task` and is not10repeated here. Work is **sequential** on a single working tree on the current branch. The backlog is11the source of truth, so a killed run resumes without losing anything.1213```14check the plan isn't stale → compute ready set → lowest id → /run-task → regen board → next (max 8)15```1617## Language & git1819Respond and reason in the user's language. Never translate code, identifiers,20commands, or file paths.2122Workflow vocabulary follows **`../_shared/glossary.md`** exactly — what is translated, what23stays Latin, no hybrid verbs, template anchors verbatim.2425**One branch — the current one, normally `main`.** Never create a branch, switch branch, or open26a worktree on your own initiative; only an explicit request in this session changes that, and a27request to commit, fix or ship is not one. Full rule: **`../_shared/git-workflow.md`**.2829Every agent you spawn inherits this and the language rule — pass both down; an agent that30thinks the work needs a branch reports it to you instead of creating one.3132## Modes3334Read `.dev-skills/build-plan/.build-config.md` for `mode` (write it if absent, default35**interactive**). Full rules: **`../_shared/build-pipeline/build-config.md`**. Backlog schema,36`ready`, and the board: **`../_shared/build-pipeline/backlog-format.md`**.3738- **Straight through (default).** Between tasks you do not stop and do not ask permission. The only39 real reasons to pause: a task where the human has something to check by hand (`run-task` handles40 that), a `needs_human` escalation, a red gate, or the per-run limit.41- **One at a time** (opt-in, argument `one-at-a-time`) — confirm before each task.42- **Acceptance every N** (opt-in, argument `review every N`; suggest N=5) — **only the human turns43 this on**, never you. Manual acceptance then happens on every Nth task and always on the run's last44 task; the rest are passed to `run-task` with "acceptance deferred, manual review at TXX". Nothing45 else softens: the verifier, the fix round, the green gate, and the `needs_human` stop are unchanged.46 At the next manual acceptance, show the batch — one line per auto-accepted task since the last one47 (what was built + what proved it) — so the human can spot and undo something wrong. The mode lasts48 for this run only.4950## Procedure (copy this checklist into your response and check off as you go)5152```53- [ ] Step 0: Intake — backlog present? spec moved ahead of the plan? mode? interrupted run?54- [ ] Loop: ready set → lowest id → /run-task → regen board → acceptance if due → next (stop at 8 tasks)55- [ ] Done: report built / needs_human / blocked / spec_sync pending; at the limit, ask for /compact56```5758### Step 0: Intake59- **No `.dev-skills/build-plan/tasks/`** → stop: there is nothing to run. Offer `/plan-development`60 first. A single task from a sentence, with no plan at all, is `/run-task "<request>"`.61- **Has the spec moved ahead of the plan?** Read the *Reconciled with spec* anchor in the header of62 `.dev-skills/build-plan/board.md` and check whether the spec changed since:63 `git log <anchor-commit>..HEAD -- .dev-skills/project-spec/`. If it did, **stop** and offer64 `/plan-development` to reconcile first — otherwise the run will confidently build what the user has65 already dropped. If the human says "go anyway", agree, but name which spec files diverged.66- **Interrupted run.** A task left `in_progress` is not restarted blindly: show its `## Log` and offer67 to continue it through `run-task` (which re-verifies before committing). Finished tasks are never68 rebuilt.69- **Also reclaim a stale env lock** left by a killed run70 (**`../_shared/build-pipeline/env-access.md`**).71- **Is another session working here?** List the tasks whose `claim.heartbeat` is fresher than 3072 minutes and say so in one line — those are skipped, not waited for. The user does run two sessions on73 one repository, and a run that quietly re-does another's task is worse than one that stops74 (**`../_shared/build-pipeline/backlog-format.md`** → `claim`). If a "study only, don't write" mode is75 asked for, read the tasks and plan them, and change no file until the other session's claim clears.76- **Does the scoped test target exist?** Confirm the `make test-scoped` equivalent named in77 `verification.md` is there and really selects. Missing or fake → say it once, now: every hand-off78 will otherwise pay for the whole suite, and `/setup-dev-environment` is the fix. Then proceed — the79 run is not blocked on it (**`../_shared/build-pipeline/quality-gate.md`**).80- An argument that is a task id → start from that task (its blockers must still be `done`).8182### The loop83Repeat while ready tasks remain:84851. **Compute the ready set** — `todo` tasks whose `blocked_by` are all `done`. Empty → go to Done.86 If the **open** count (todo + in_progress + needs_human) is over **15**, say so once and offer87 `/plan-development consolidate` before continuing — the ceiling is the backlog's, not just the88 planner's, and it is what keeps tasks coarse (**`../_shared/build-pipeline/planning-method.md`**).89 The human decides; the run is not blocked on it.902. **Take one** — the **lowest `id`** among them, so two runs produce the same order. Announce it in91 one line and continue without asking; wait for confirmation only in one-at-a-time mode.923. **Run it through `/run-task`** (via the Skill tool) — the whole cycle, no steps skipped and no93 logic of your own; a green gate is mandatory in autopilot too — the **static gate plus that task's94 scoped test selection**, never the whole suite95 (**`../_shared/build-pipeline/quality-gate.md`**). In *acceptance every N* mode, tell96 it whether this task's acceptance is deferred and where the manual one lands.974. **A task that went `needs_human`** → don't take it again; show it to the human and move to the next98 ready task. One stuck task must not stop the whole plan.995. **Regenerate `.dev-skills/build-plan/board.md`** from the task files — the progress header100 (done/total, %, and the **Now** line) included. `run-task` already refreshes it at each stage101 boundary; here you refresh the totals.1026. **Acceptance, when the human asked for it.** In *acceptance every N* mode, if this was the **Nth**103 task of the run — or the run's **last** one — do the manual acceptance now, before taking anything104 else: show the batch (one line per auto-accepted task since the previous acceptance: what was built105 + what proved it) and **wait**. Skipping this silently turns the mode the human switched on into a106 promise nobody kept.1077. **Next task — unless you hit the limit.** Count the tasks handled this run (including escalated108 ones): at **8**, stop even if ready tasks remain, and go to Done. An argument `run N` lowers the109 limit to N.110111### Done: report112Report as a table: how many tasks finished this run · which went `needs_human` (the human's action113list, one line each on where it got stuck) · which remain blocked and by what · and which tasks sit at114**`spec_sync: pending`** — done, but not yet reflected in the spec. Point at115`.dev-skills/build-plan/board.md` for the detail.116117Give each task a **time** column from its `timings.total`, and one line under the table splitting the118run into build / verify / fix / solve **plus the time spent waiting on you**, so the parts reconcile119with the total. Report the numbers flat, with no verdict attached120(**`../_shared/build-pipeline/backlog-format.md`**). End the report with the **«What you should do»**121block — imperative, one line per item, no pipeline jargon122(**`../_shared/build-pipeline/report-format.md`**).123124**Stopped at the limit with ready tasks left** — ask the human to compact and re-run:125126> Ran 8 tasks; <N> ready tasks remain. Continuing in this session isn't wise — the context is full of127> diffs and reports, and tasks start blurring together. Run `/compact` (or `/clear` for a fully fresh128> start) and call `/build-tasks` again: the plan, statuses, and logs live in `.dev-skills/build-plan/`,129> so the run picks up at the next task and nothing is lost.130131You cannot compact the context yourself — the human runs that command. Your job here is to stop in132time and say so.133134If no ready tasks remain but unfinished ones do, explain why (they wait on `needs_human` tasks). If135everything is `done`, say so plainly and point at the release phase (`/release-product`) — and add one136line saying that **the whole test suite has not been run yet**: the build loop only ever ran each137task's own selection, and the full run happens in the release pipeline138(**`../_shared/build-pipeline/quality-gate.md`**). Say it as a fact about where the suite gets run, not139as a warning to act on now.140141## Rules1421431. **Don't duplicate the cycle.** All per-task work is `/run-task`'s. You choose the next task and144 keep the books.1452. **One task at a time, one working tree.** No parallel tasks, no worktrees, no new branch.1463. **The plan sets the order** — ready tasks, lowest id. Never reshuffle "by importance".1474. **A task with unmet blockers is never taken.**1485. **`needs_human` is never retried automatically** and is always surfaced, in both modes.1496. **Don't stop between tasks and don't ask permission**; only the human slows it down, by choosing150 one-at-a-time.1517. **Acceptance every N is the human's switch**, never yours. Every Nth task and the run's last task152 are always manual, with the batch of auto-accepted ones shown. A failure, a red gate, or153 `needs_human` stops the run in any mode.1548. **At most 8 tasks per run.** At the limit, stop and ask for `/compact` — you don't compact anything155 yourself.1569. **A spec that moved past the plan means `/plan-development` first.** Running a plan that disagrees157 with the spec is confidently building the wrong thing.15810. **Finished work is never rebuilt**; an interrupted run continues rather than restarts.15911. **The board is regenerated** from the task files after every task, never hand-edited.