task-pipeline-skill 0.12.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +477 -0
- package/LICENSE +47 -0
- package/README.md +369 -171
- package/cursor/rules/task-pipeline.mdc +125 -20
- package/package.json +8 -4
- package/plugins/task-pipeline/.claude-plugin/plugin.json +15 -4
- package/plugins/task-pipeline/commands/task-pipeline.md +20 -8
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +112 -39
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.example.json +35 -16
- package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +119 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +47 -14
- package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +108 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/build.md +365 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +72 -31
- package/plugins/task-pipeline/skills/task-pipeline/references/conventions.md +27 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/decomposition.md +139 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +78 -7
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +159 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +100 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/planning.md +195 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/review.md +174 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +144 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +190 -35
- package/plugins/task-pipeline/skills/task-pipeline/references/tdd.md +110 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/README.md +5 -3
- package/plugins/task-pipeline/skills/task-pipeline/templates/brief.md +50 -2
- package/plugins/task-pipeline/skills/task-pipeline/templates/carryover.md +36 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
# Build — stage 5, built in
|
|
2
|
+
|
|
3
|
+
Executing the plan: an isolated workspace, one fresh implementer subagent per task,
|
|
4
|
+
a review after each task, a whole-branch review at the end. Built into this skill;
|
|
5
|
+
nothing to install.
|
|
6
|
+
|
|
7
|
+
> Ported from the `using-git-worktrees` and `subagent-driven-development` skills in
|
|
8
|
+
> [obra/superpowers](https://github.com/obra/superpowers) (MIT — see `LICENSE` →
|
|
9
|
+
> *Third-party*), rewritten for this pipeline: no external scripts, the ledger
|
|
10
|
+
> lives under `.task-pipeline/`, and model choice defers to the run's single
|
|
11
|
+
> confirmed model ([`model-tiering.md`](model-tiering.md)).
|
|
12
|
+
|
|
13
|
+
**Why subagents:** each task goes to an agent with a constructed context — its
|
|
14
|
+
brief, its interfaces, the global constraints, nothing else. It never inherits the
|
|
15
|
+
session's history, so it stays focused; your context stays free for coordination.
|
|
16
|
+
|
|
17
|
+
**Continuous execution:** don't check in between tasks. The operator asked for the
|
|
18
|
+
plan to be executed — execute it. Stop only for BLOCKED you can't resolve, a
|
|
19
|
+
genuine ambiguity, or completion. "Should I continue?" between tasks is noise.
|
|
20
|
+
|
|
21
|
+
**Narration:** at most one short line between tool calls. The ledger and the tool
|
|
22
|
+
results are the record.
|
|
23
|
+
|
|
24
|
+
**No subagents available?** (a harness without them, or a plan so small that
|
|
25
|
+
dispatching costs more than it saves) — run the same loop inline: same isolation,
|
|
26
|
+
same ledger, same TDD per task, and after each task review your own diff against
|
|
27
|
+
the rubric in [`review.md`](review.md) before moving on. What changes is who does
|
|
28
|
+
the work; the gates, the artifacts and the review discipline do not. Say plainly
|
|
29
|
+
that the run is inline, since a self-review is weaker evidence than a fresh
|
|
30
|
+
reviewer's.
|
|
31
|
+
|
|
32
|
+
## 1. Isolation
|
|
33
|
+
|
|
34
|
+
Work never starts on `main`/`master` without the operator's explicit consent
|
|
35
|
+
(the stage-0 brief usually records the branch policy — read it, don't re-ask).
|
|
36
|
+
|
|
37
|
+
**Detect existing isolation first:**
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
GIT_DIR=$(cd "$(git rev-parse --git-dir)" && pwd -P)
|
|
41
|
+
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" && pwd -P)
|
|
42
|
+
git rev-parse --show-superproject-working-tree # non-empty ⇒ submodule, not a worktree
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
- `GIT_DIR != GIT_COMMON` and **not** a submodule → you are already in a linked
|
|
46
|
+
worktree. Do not create another. Report the path and branch, go to *Setup*.
|
|
47
|
+
- Otherwise you are in a normal checkout. Honor the brief's worktree preference; if
|
|
48
|
+
none was recorded, ask once before creating one.
|
|
49
|
+
|
|
50
|
+
**Creating one — native tool first.** If the harness offers a worktree tool
|
|
51
|
+
(`EnterWorktree`, a `/worktree` command, a `--worktree` flag), use it: it owns
|
|
52
|
+
placement, branch creation and cleanup. Reaching for raw `git worktree add` when a
|
|
53
|
+
native tool exists creates state the harness can't see or clean up.
|
|
54
|
+
|
|
55
|
+
**Git fallback**, only when there is no native tool:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# both scratch roots MUST be ignored before anything is created
|
|
59
|
+
git check-ignore -q .worktrees || printf '.worktrees/\n' >> .gitignore
|
|
60
|
+
git check-ignore -q .task-pipeline || printf '.task-pipeline/\n' >> .gitignore
|
|
61
|
+
git diff --quiet .gitignore || git commit -m "chore: ignore build scratch dirs" .gitignore
|
|
62
|
+
git worktree add ".worktrees/$BRANCH" -b "$BRANCH"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Directory priority: an explicit operator preference → an existing `.worktrees/` →
|
|
66
|
+
an existing `worktrees/` → default `.worktrees/`. An unignored worktree directory
|
|
67
|
+
commits the entire tree into the repo — verify before creating. If creation fails
|
|
68
|
+
on a sandbox permission error, say so plainly and work in place.
|
|
69
|
+
|
|
70
|
+
**Setup + baseline.** Install dependencies the way the project does (`npm install`,
|
|
71
|
+
`cargo build`, `pip install -r requirements.txt`, `poetry install`, `go mod
|
|
72
|
+
download`), then run the test command from the brief's autonomy sweep. A dirty
|
|
73
|
+
baseline makes every later failure ambiguous: report failures and let the operator
|
|
74
|
+
decide whether to proceed.
|
|
75
|
+
|
|
76
|
+
## 2. Workspace and ledger
|
|
77
|
+
|
|
78
|
+
Conversation memory does not survive compaction. A controller that lost its place
|
|
79
|
+
re-dispatches completed tasks — the most expensive failure this stage has.
|
|
80
|
+
**Track progress in a file, not only in todos.**
|
|
81
|
+
|
|
82
|
+
- Each plan owns a git-ignored workspace: `.task-pipeline/build/<plan-basename>/`
|
|
83
|
+
at the repo root. Everything for THIS plan lives there — ledger, task briefs,
|
|
84
|
+
implementer reports, review packages. Another plan's directory is never yours to
|
|
85
|
+
read or write. `.task-pipeline/` must be git-ignored — the isolation step above
|
|
86
|
+
adds and commits it; if you skipped that step, do it now, in its own commit, so
|
|
87
|
+
scratch files never land in a task's diff.
|
|
88
|
+
- Ledger: `<workspace>/progress.md`, first line = its identity:
|
|
89
|
+
`# build ledger — plan: <plan file path>`.
|
|
90
|
+
- **Resuming:** a task with a `Task <N>: complete` line is DONE — never
|
|
91
|
+
re-dispatch it; resume at the first task without one. A task whose last line is a
|
|
92
|
+
fix round is mid-loop: continue at the next round. A ledger naming a different
|
|
93
|
+
plan belongs to that plan — leave it and start your own.
|
|
94
|
+
- After compaction, trust the ledger and `git log` over your recollection: the
|
|
95
|
+
commits it names exist even when your context no longer remembers them.
|
|
96
|
+
|
|
97
|
+
Read the plan **once**, note its context and Global Constraints, create a todo per
|
|
98
|
+
task.
|
|
99
|
+
|
|
100
|
+
**Pre-flight conflict scan.** Before Task 1, scan the plan for tasks that
|
|
101
|
+
contradict each other or the Global Constraints, and for anything the plan mandates
|
|
102
|
+
that the review rubric ([`review.md`](review.md)) treats as a defect. Present
|
|
103
|
+
everything you find as **one batched question** — each finding beside the plan text
|
|
104
|
+
that mandates it, asking which governs. Clean scan → proceed silently.
|
|
105
|
+
|
|
106
|
+
## 3. Models
|
|
107
|
+
|
|
108
|
+
**Default: the run's one confirmed model** ([`model-tiering.md`](model-tiering.md))
|
|
109
|
+
for every subagent — implementers, reviewers, fixers. Pin it explicitly on each
|
|
110
|
+
dispatch; an omitted model silently inherits the session's and defeats whatever the
|
|
111
|
+
operator recorded.
|
|
112
|
+
|
|
113
|
+
**Deviate only from the operator's recorded override map.** If the stage-0 brief
|
|
114
|
+
carries per-stage or per-role overrides, apply them: mechanical transcription tasks
|
|
115
|
+
(the plan carries the complete code, 1–2 files) can take a cheaper tier, while
|
|
116
|
+
integration, design and review work stays on the confirmed model. No map recorded →
|
|
117
|
+
no deviation, and never a silent downgrade. Turn count beats token price: the
|
|
118
|
+
cheapest tier routinely takes 2–3× the turns on multi-step work and costs more
|
|
119
|
+
overall.
|
|
120
|
+
|
|
121
|
+
**Two moments deserve more capability than the run's default** — both are
|
|
122
|
+
*recommendations you state out loud*, never silent switches:
|
|
123
|
+
|
|
124
|
+
- **The final whole-branch review.** If the run is on a tier below the most capable
|
|
125
|
+
one available, say so and offer to run this one review there; if the operator
|
|
126
|
+
declines or the tier doesn't exist, run it on the confirmed model and note it.
|
|
127
|
+
- **Fix-loop rounds 4–5.** One tier above the implementer that got stuck, when the
|
|
128
|
+
environment has one and the override map or the operator allows it; otherwise
|
|
129
|
+
say so and rely on fresh eyes alone.
|
|
130
|
+
|
|
131
|
+
## 4. The task loop
|
|
132
|
+
|
|
133
|
+
Everything you paste into a dispatch prompt — and everything a subagent prints back
|
|
134
|
+
— stays in your context for the rest of the session. **Hand artifacts over as
|
|
135
|
+
files.**
|
|
136
|
+
|
|
137
|
+
### 4.1 Dispatch the implementer
|
|
138
|
+
|
|
139
|
+
Record `BASE=$(git rev-parse HEAD)` before dispatching; the review package and the
|
|
140
|
+
fix-round diffs need it.
|
|
141
|
+
|
|
142
|
+
**Write the task brief to a file** — extract the task's full text from the plan to
|
|
143
|
+
`<workspace>/task-<N>-brief.md`. The brief is the single source of requirements;
|
|
144
|
+
exact values (numbers, strings, signatures, test cases) live **only** there.
|
|
145
|
+
Include the task's `Implements:` ids **with each REQ's one-line statement quoted
|
|
146
|
+
verbatim** — an implementer who sees only an instruction optimises the
|
|
147
|
+
instruction; one who sees the requirement behind it catches the case the
|
|
148
|
+
instruction didn't cover.
|
|
149
|
+
|
|
150
|
+
The dispatch prompt contains exactly five things:
|
|
151
|
+
|
|
152
|
+
1. One line on where this task fits in the project.
|
|
153
|
+
2. The brief path — "read this first; it is your requirements, use its values
|
|
154
|
+
verbatim".
|
|
155
|
+
3. Interfaces and decisions from earlier tasks the brief can't know.
|
|
156
|
+
4. Your resolution of any ambiguity you spotted in the brief.
|
|
157
|
+
5. The report path (`<workspace>/task-<N>-report.md`) and the report contract.
|
|
158
|
+
|
|
159
|
+
Never paste accumulated history ("state after tasks 1–3") into later dispatches.
|
|
160
|
+
Never make a subagent read the whole plan. If an earlier task parked a finding in
|
|
161
|
+
the area this task touches, carry a pointer to that ledger line.
|
|
162
|
+
|
|
163
|
+
Record the implementer's agent identity: fix rounds 1–3 resume it.
|
|
164
|
+
|
|
165
|
+
**Implementer contract** (put this in the prompt):
|
|
166
|
+
|
|
167
|
+
> Read `<brief path>` first — it is your requirements. Work TDD, and no production
|
|
168
|
+
> code exists before a test you **watched fail**: write the failing test → run it
|
|
169
|
+
> and confirm it fails for the right reason → write the minimal code that passes →
|
|
170
|
+
> run it and confirm it passes, with the rest of the suite still green → commit.
|
|
171
|
+
> Assert on real behavior, never on mock behavior. Commit as you go, conventional
|
|
172
|
+
> commits. When done, self-review your diff, then write the full report to
|
|
173
|
+
> `<report path>`:
|
|
174
|
+
> what you built, the files touched, the commits, the test command and its
|
|
175
|
+
> output, decisions you made, anything you're unsure about. Return **only**:
|
|
176
|
+
> status (`DONE` / `DONE_WITH_CONCERNS` / `NEEDS_CONTEXT` / `BLOCKED`), the
|
|
177
|
+
> commit range, a one-line test summary, and your concerns. Ask before starting
|
|
178
|
+
> if anything in the brief is ambiguous — questions are cheaper than rework.
|
|
179
|
+
|
|
180
|
+
### 4.2 Parallel groups — when fan-out is allowed
|
|
181
|
+
|
|
182
|
+
The plan's parallel groups ([`planning.md`](planning.md)) describe what *may* run
|
|
183
|
+
concurrently. Whether it actually does is this stage's call, and the constraint is
|
|
184
|
+
physical: **two implementers writing one working tree corrupt each other's state.**
|
|
185
|
+
|
|
186
|
+
- **Default: sequential.** One implementer at a time, review after each. Correct for
|
|
187
|
+
every group, and always correct when the tasks are small.
|
|
188
|
+
- **Fan out only when all three hold:** the tasks are in the same group (no
|
|
189
|
+
`depends:` between them), their file ownership is exclusive per the plan, and
|
|
190
|
+
**each implementer gets its own isolated worktree**. Then dispatch them together,
|
|
191
|
+
review each one against its own diff, and integrate the worktrees back to the
|
|
192
|
+
build branch one at a time, running the suite after each merge.
|
|
193
|
+
- **Any conflict on integration** means the plan's file ownership was wrong: stop
|
|
194
|
+
fanning out, finish the group sequentially, and record it in the ledger.
|
|
195
|
+
- Never fan out the fix loop — a task under repair belongs to one implementer.
|
|
196
|
+
|
|
197
|
+
### 4.3 Handle the report
|
|
198
|
+
|
|
199
|
+
| Status | Action |
|
|
200
|
+
|---|---|
|
|
201
|
+
| `DONE` | Build the review package, dispatch the task review ([`review.md`](review.md)). |
|
|
202
|
+
| `DONE_WITH_CONCERNS` | Read the concerns first. Correctness or scope → resolve before review. Observations ("this file is getting large") → **append to the carry-over ledger**, then proceed. A concern that stays only in the report dies with the workspace. |
|
|
203
|
+
| `NEEDS_CONTEXT` | Supply exactly what's missing, re-dispatch. |
|
|
204
|
+
| `BLOCKED` | Diagnose: missing context → re-dispatch with it; needs more reasoning → a more capable model; too large → split the task; the plan itself is wrong → escalate to the operator. |
|
|
205
|
+
|
|
206
|
+
**Never** ignore an escalation, and never re-dispatch the same model with the same
|
|
207
|
+
prompt after a BLOCKED. If the implementer says it's stuck, something must change.
|
|
208
|
+
If the implementer asks a question — before or mid-task — answer it completely; do
|
|
209
|
+
not rush it into implementation.
|
|
210
|
+
|
|
211
|
+
### 4.4 Review the task
|
|
212
|
+
|
|
213
|
+
Every task gets a review with **all three** verdicts — spec compliance, **REQ
|
|
214
|
+
satisfied**, and code quality. The implementer's self-review never substitutes for
|
|
215
|
+
it. Rubric, inputs, prompt templates and how to build the diff package:
|
|
216
|
+
[`review.md`](review.md).
|
|
217
|
+
|
|
218
|
+
The REQ verdict is the one the other two can't produce: a task can meet every line
|
|
219
|
+
of its brief and still miss the requirement it was written to deliver. A ❌ there
|
|
220
|
+
enters the fix loop like any Important finding.
|
|
221
|
+
|
|
222
|
+
A review may report **"cannot verify from diff"** items — requirements that live in
|
|
223
|
+
unchanged code or span tasks. They don't block the review, but you resolve each one
|
|
224
|
+
yourself before completing the task; you hold the cross-task context the reviewer
|
|
225
|
+
lacks. A confirmed gap becomes a failed spec review and enters the fix loop.
|
|
226
|
+
|
|
227
|
+
### 4.5 The fix loop
|
|
228
|
+
|
|
229
|
+
Triggered by: spec ❌, any Critical or Important finding, or a "cannot verify" item
|
|
230
|
+
you confirmed as a real gap.
|
|
231
|
+
|
|
232
|
+
Two routes leave before the loop starts:
|
|
233
|
+
|
|
234
|
+
- **Minor findings** never enter it. Record each in the ledger
|
|
235
|
+
(`Task <N>: minor (deferred): <one-liner>`) and point the final review at that
|
|
236
|
+
list. A roll-up nobody reads is a silent discard.
|
|
237
|
+
- **A finding that conflicts with what the plan mandates** is the operator's
|
|
238
|
+
call: present the finding beside the plan text and ask which governs. Don't
|
|
239
|
+
dismiss the finding because the plan mandated it; don't fix against the plan
|
|
240
|
+
without asking.
|
|
241
|
+
|
|
242
|
+
Everything else loops. One round = one fix dispatch + one scoped re-review.
|
|
243
|
+
**Five rounds maximum per task.**
|
|
244
|
+
|
|
245
|
+
**The loop guard runs alongside the counter** ([`loop-guard.md`](loop-guard.md)):
|
|
246
|
+
log every repeat touch (`touch: <file> — round N — reason: <finding id>`) and trip
|
|
247
|
+
*before* the cap when a fix undoes an earlier fix, when the same file returns for
|
|
248
|
+
the same reason, or when a finding already ADDRESSED reappears. A tripped guard is
|
|
249
|
+
not another round: stop, name the two shapes, escalate to the layer that owns the
|
|
250
|
+
conflict, then re-check in a planned order.
|
|
251
|
+
|
|
252
|
+
- **Rounds 1–3:** resume the original implementer with the open findings verbatim —
|
|
253
|
+
its context is intact. If the harness can't message a live subagent, dispatch a
|
|
254
|
+
fresh one with the brief path, the report path and the findings; the report file
|
|
255
|
+
is the persistent memory either way.
|
|
256
|
+
- **Rounds 4–5:** fresh implementer, one tier up if available, framed as: "a prior
|
|
257
|
+
implementer attempted this task N times; you own it now — read the report file
|
|
258
|
+
for what was tried." A loop that survives three resumes usually means the
|
|
259
|
+
implementer can't see its own problem.
|
|
260
|
+
- **Every round:** the implementer fixes, re-runs the tests covering the amended
|
|
261
|
+
code, appends its fix report to the same report file, returns the short contract.
|
|
262
|
+
Before re-dispatching the reviewer, confirm the fix report names the covering
|
|
263
|
+
tests, the command run and the output.
|
|
264
|
+
- **The re-review is scoped** to the fix diff (`FIX_BASE`..`HEAD`, where `FIX_BASE`
|
|
265
|
+
is the head the previous review saw). It verdicts each finding ADDRESSED / NOT
|
|
266
|
+
ADDRESSED and flags new breakage in the fix diff only. New Critical/Important
|
|
267
|
+
breakage joins the open list; out-of-scope observations go to the ledger as
|
|
268
|
+
deferred minors — they never extend the loop.
|
|
269
|
+
- **Ledger, every round:**
|
|
270
|
+
`Task <N>: fix round <R>/5 (<X> addressed, <Y> open — <one-liners>; commits <a7>..<b7>)`
|
|
271
|
+
|
|
272
|
+
**In a subagent run, never fix findings yourself in the controller session** —
|
|
273
|
+
controller fixes skip review and pollute the context you need for coordination. In a
|
|
274
|
+
declared inline run you do fix them, and you still review the fix diff against the
|
|
275
|
+
rubric before closing the round.
|
|
276
|
+
|
|
277
|
+
**The breaker.** If round 5's re-review still leaves findings open, stop
|
|
278
|
+
dispatching and adjudicate each one yourself:
|
|
279
|
+
|
|
280
|
+
- **Reviewer wrong or the point contestable** → park it:
|
|
281
|
+
`Task <N>: parked — <finding> — ruling: <why the code stands>`.
|
|
282
|
+
- **Real, but nothing downstream builds on it** → park it the same way, with a
|
|
283
|
+
ruling saying it's real and deferred.
|
|
284
|
+
- **Real and load-bearing** (a later task builds on it, or it exposes a plan defect)
|
|
285
|
+
→ **STOP**. Append `Task <N>: BLOCKED — <reason>` and report to the operator with
|
|
286
|
+
the finding, the plan text it collides with, and the fix history. Parking a
|
|
287
|
+
structural failure lets every dependent task build on it.
|
|
288
|
+
|
|
289
|
+
Adjudicate **only at the cap**. Adjudicating earlier to end a loop is pre-judging
|
|
290
|
+
with a nicer name. Every adjudication is a ledger line; silent discards are
|
|
291
|
+
forbidden.
|
|
292
|
+
|
|
293
|
+
### 4.6 Complete the task
|
|
294
|
+
|
|
295
|
+
When the review is clean — or every open finding is parked with a ruling at the cap
|
|
296
|
+
— append:
|
|
297
|
+
|
|
298
|
+
- `Task <N>: complete (commits <base7>..<head7>, review clean)`, or
|
|
299
|
+
- `Task <N>: complete (commits <base7>..<head7>, <K> parked)`
|
|
300
|
+
|
|
301
|
+
Mark the todo complete, move on. Never start the next task while Critical/Important
|
|
302
|
+
findings are neither fixed nor parked-with-ruling at the cap.
|
|
303
|
+
|
|
304
|
+
## 5. Final whole-branch review
|
|
305
|
+
|
|
306
|
+
After the last task: build a package over `MERGE_BASE`..`HEAD`
|
|
307
|
+
(`git merge-base "$BASE_BRANCH" HEAD`, where `$BASE_BRANCH` is the base recorded in
|
|
308
|
+
the stage-0 brief — never a hardcoded `main`), dispatch the whole-branch review
|
|
309
|
+
([`review.md`](review.md) → *Final review*; on the run's model, escalation offered
|
|
310
|
+
out loud per *Models* above), and point it at the
|
|
311
|
+
ledger's deferred-minor and parked lines so it can triage what must be fixed before
|
|
312
|
+
merge.
|
|
313
|
+
|
|
314
|
+
If it returns findings, dispatch **ONE** fix subagent with the complete list — not
|
|
315
|
+
one fixer per finding; per-finding fixers each rebuild context and re-run suites.
|
|
316
|
+
Then exactly **one** scoped re-review of the fix wave. Adjudicate residuals as in
|
|
317
|
+
the breaker: park with rulings, or stop on load-bearing ones. There is no second
|
|
318
|
+
fix wave.
|
|
319
|
+
|
|
320
|
+
## 6. Integrate, then finish
|
|
321
|
+
|
|
322
|
+
The work is in a worktree on its own branch; stages 7–9 lint, deploy and document
|
|
323
|
+
the **integrated** result. Close that gap here, honoring the branch policy recorded
|
|
324
|
+
in the stage-0 brief:
|
|
325
|
+
|
|
326
|
+
1. **Sync with the base branch** (rebase or merge, whichever the project uses) and
|
|
327
|
+
re-run the full suite on the result. A branch that was green in isolation and red
|
|
328
|
+
after integration is red — fix it here, not at stage 7.
|
|
329
|
+
2. **Land it the project's way:** merge into the base branch, or open a PR when the
|
|
330
|
+
project requires review. Opening a PR is outward-facing — do it only with the
|
|
331
|
+
operator's go or the brief's specific standing authorization.
|
|
332
|
+
3. **Never force-push a shared branch**, and never land on `main` when the brief put
|
|
333
|
+
it off-limits.
|
|
334
|
+
4. **Remove the worktree** once merged (`git worktree remove <path>`, or the native
|
|
335
|
+
tool that created it), and delete this plan's workspace
|
|
336
|
+
(`rm -rf .task-pipeline/build/<plan-basename>`) — git history is the record now.
|
|
337
|
+
Sibling directories belong to other plans; leave them.
|
|
338
|
+
|
|
339
|
+
If the operator's policy is "leave the branch, I'll merge it myself", stop after
|
|
340
|
+
step 1, say exactly where the branch is and what state it's in, and record that
|
|
341
|
+
stages 7–9 run against an unintegrated branch.
|
|
342
|
+
|
|
343
|
+
## GATE (auto)
|
|
344
|
+
|
|
345
|
+
All plan tasks DONE with all three review verdicts (spec compliance, REQ satisfied,
|
|
346
|
+
code quality); the full test suite green; every open finding either fixed or parked
|
|
347
|
+
with a ruling; **every parked finding and implementer concern harvested into the
|
|
348
|
+
carry-over ledger** — the workspace is deleted, so nothing may stay only there;
|
|
349
|
+
no task left BLOCKED; the branch integrated per the brief's policy — or the
|
|
350
|
+
operator explicitly told you to leave it, and that is recorded. Verify it yourself;
|
|
351
|
+
a red suite or an unresolved BLOCKED does not advance to stage 6.
|
|
352
|
+
|
|
353
|
+
## Rationalizations
|
|
354
|
+
|
|
355
|
+
| Excuse | Reality |
|
|
356
|
+
|---|---|
|
|
357
|
+
| "Close enough on spec compliance" | The reviewer found spec gaps ⇒ not done. Fix, or hit the cap and adjudicate. Those are the only exits. |
|
|
358
|
+
| "I'll fix it myself, dispatching is overhead" | In a subagent run, controller fixes skip review and pollute your context — resume the implementer. (Inline runs are the declared exception, and still review the fix diff.) |
|
|
359
|
+
| "One more round will converge" | Past the cap, rounds don't converge — the failure is structural. Adjudicate and route. |
|
|
360
|
+
| "The fix was small, skip the re-review" | Unreviewed fixes are how regressions land. Every round ends with a scoped re-review. |
|
|
361
|
+
| "This finding is obviously wrong, drop it" | You adjudicate at the cap, in writing. Silent discards are forbidden. |
|
|
362
|
+
| "Ledger bookkeeping is overhead" | The ledger is what survives compaction. Without one, controllers re-run entire completed task sequences. |
|
|
363
|
+
| "Two implementers in parallel will be faster" | One working tree, two writers = corrupted state. Parallel needs one worktree each. |
|
|
364
|
+
| "I'll paste the earlier tasks so it has context" | A fresh subagent needs its task, its interfaces and the constraints. Pasted history is pure cost. |
|
|
365
|
+
| "Stage 7 can merge the branch" | Stage 7 lints and deploys what is integrated. An unmerged branch means lint, deploy and docs all ran against something that is not what ships. |
|
|
@@ -1,39 +1,71 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Companions — what's built in, what's optional, what to install
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
**The pipeline's doctrine is entirely built into this skill.** Stages 0, 2, 3, 4, 5,
|
|
4
|
+
6 and 10 run from `references/*.md` — no companion plugin, no resolution step, no
|
|
5
|
+
fallback path, no version skew, and no failure mode where a stage can't run because
|
|
6
|
+
something isn't installed.
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
What remains is a short list of **optional** companions that make individual stages
|
|
9
|
+
better, plus one that is required only for user-facing work.
|
|
10
|
+
|
|
11
|
+
## Built in — nothing to install
|
|
12
|
+
|
|
13
|
+
| Stage | Doctrine |
|
|
14
|
+
|---|---|
|
|
15
|
+
| 0 Knowledge harvest (pre-grill) | `references/knowledge-sources.md` |
|
|
16
|
+
| 0 Intake grill | `references/grill.md` |
|
|
17
|
+
| 2 Brainstorm | `references/brainstorm.md` |
|
|
18
|
+
| 2 Decompose (platforms only) | `references/decomposition.md` |
|
|
19
|
+
| 3 Spec | `references/spec.md` |
|
|
20
|
+
| 4 Plan | `references/planning.md` |
|
|
21
|
+
| 5 Build (isolation, subagents, fix loop) | `references/build.md` + `references/review.md` |
|
|
22
|
+
| 5–6 TDD + suite gate | `references/tdd.md` |
|
|
23
|
+
| 10 Acceptance (REQ close-out) | `references/acceptance.md` |
|
|
24
|
+
| any repeating loop | `references/loop-guard.md` |
|
|
11
25
|
|
|
12
26
|
## The matrix
|
|
13
27
|
|
|
14
28
|
| Skill / tool | Needed for | Required? | Install |
|
|
15
29
|
|---|---|---|---|
|
|
16
|
-
| **superpowers** (`brainstorming`, `writing-plans`, `subagent-driven-development`, `using-git-worktrees`, `test-driven-development`) | stages 2, 4, 5, 6 | **Required** (always) | `/plugin marketplace add obra/superpowers` → `/plugin install superpowers@superpowers` |
|
|
17
30
|
| **super-ux** (`ux-foundation`, `ux-flows`, `ux-scenarios`, `ux-audit`, `/ux`, `/ux-lint`) | stage 3 UX track | **Required for any user-facing task** | `/plugin marketplace add ssheleg/super-ux` → `/plugin install super-ux@super-ux` (or `npx skills add ssheleg/super-ux`) |
|
|
18
|
-
| ~~grill-me / grilling~~ | — | **Not a dependency.** The stage-0 grill is **built into this skill** (`references/grill.md`) — nothing to install, nothing to resolve, no fallback path | — |
|
|
19
31
|
| **context7** (MCP) | stage 1 docs study | Recommended (web-search fallback) | connect the context7 MCP server |
|
|
20
|
-
| **wiki-
|
|
32
|
+
| **[obsidian-wiki](https://github.com/ar9av/obsidian-wiki)** (`wiki-query`, `wiki-update`) | **stage 0 harvest** (query what's already known) **+ stage 9 sync** | **Recommended** — never a gate; absent → harvest runs on repo docs alone | `pip install obsidian-wiki` → `obsidian-wiki setup --vault /path/to/your/vault` |
|
|
33
|
+
| ~~superpowers~~ | — | **Not a dependency.** Stages 2/4/5/6 run on the built-in doctrine above. See *Optional bridge* | — |
|
|
34
|
+
| ~~grill-me / grilling~~ | — | **Not a dependency.** The stage-0 grill is built in (`references/grill.md`) | — |
|
|
35
|
+
|
|
36
|
+
## Optional bridge — substituting an external skill set
|
|
37
|
+
|
|
38
|
+
An operator who already runs an equivalent skill set may map it onto stages 2/4/5/6
|
|
39
|
+
in their `pipeline.json` → `skills[]`, e.g. `superpowers:brainstorming`,
|
|
40
|
+
`superpowers:writing-plans`, `superpowers:using-git-worktrees`,
|
|
41
|
+
`superpowers:subagent-driven-development`, `superpowers:test-driven-development`.
|
|
42
|
+
|
|
43
|
+
Rules for that bridge:
|
|
44
|
+
|
|
45
|
+
- **It is a substitution, never a requirement.** Nothing detects it, nothing
|
|
46
|
+
recommends it, nothing waits for it, and its absence is never an error.
|
|
47
|
+
- **The gates still govern.** Whatever runs a stage, `stages.md` decides when the
|
|
48
|
+
stage is done.
|
|
49
|
+
- **Never mix providers inside one stage** — either the built-in doctrine runs it or
|
|
50
|
+
the substitute does; interleaving two review loops produces neither.
|
|
21
51
|
|
|
22
52
|
## Preflight (emit before stage 0)
|
|
23
53
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
54
|
+
Detect the optional companions and print ONE block — companions **plus the model
|
|
55
|
+
decision** (`model-tiering.md`), so the operator arms the whole run in a single
|
|
56
|
+
exchange:
|
|
27
57
|
|
|
28
58
|
```
|
|
29
|
-
Pipeline companions:
|
|
30
|
-
|
|
31
|
-
✗ super-ux — this task looks user-facing; recommended. Install:
|
|
59
|
+
Pipeline companions (stage doctrine is built in — nothing to install for it):
|
|
60
|
+
✗ super-ux — this task looks user-facing; required for the UX track:
|
|
32
61
|
/plugin marketplace add ssheleg/super-ux
|
|
33
62
|
/plugin install super-ux@super-ux
|
|
34
63
|
✓ context7 — ready
|
|
35
|
-
|
|
36
|
-
|
|
64
|
+
✗ obsidian-wiki — recommended: stage 0 queries it before grilling you,
|
|
65
|
+
stage 9 syncs back what this run learned:
|
|
66
|
+
pip install obsidian-wiki
|
|
67
|
+
obsidian-wiki setup --vault /path/to/your/vault
|
|
68
|
+
(running without it — the harvest uses repo docs only)
|
|
37
69
|
|
|
38
70
|
🧠 Model for this run: recommended <top tier available>. You're on <current>.
|
|
39
71
|
/model <id> to switch, or "keep current", or name per-stage overrides.
|
|
@@ -42,11 +74,14 @@ Install the ✗ items you want, answer the model line, then say "continue".
|
|
|
42
74
|
```
|
|
43
75
|
|
|
44
76
|
Rules:
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
- **
|
|
49
|
-
|
|
77
|
+
|
|
78
|
+
- Only flag **super-ux** when the task implies a UI (the stage-0 grill decides;
|
|
79
|
+
when unsure, flag it — a false positive costs one install).
|
|
80
|
+
- **obsidian-wiki**: detect via `~/.obsidian-wiki/config` or a resolving
|
|
81
|
+
`wiki-query`/`wiki-update`. Present → say `✓ ready` and use it in the harvest.
|
|
82
|
+
Absent → print the two install lines **once** and continue; never ask twice in a
|
|
83
|
+
run and never block a stage on it ([`knowledge-sources.md`](knowledge-sources.md)).
|
|
84
|
+
- **Never gate any stage on an install** except the stage-3 UX track on a UI task.
|
|
50
85
|
- Optional tools missing → state the fallback, don't block.
|
|
51
86
|
- Re-detect after the operator installs; don't assume.
|
|
52
87
|
- The model answer goes into the brief. Don't ask again per stage
|
|
@@ -54,13 +89,19 @@ Rules:
|
|
|
54
89
|
|
|
55
90
|
## Credit
|
|
56
91
|
|
|
57
|
-
The built-in
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
92
|
+
The built-in doctrine is **ported, not depended on**:
|
|
93
|
+
|
|
94
|
+
- The stage-0 grill is adapted from Matt Pocock's `grilling` / `grill-with-docs`
|
|
95
|
+
skills (MIT, https://github.com/mattpocock/skills).
|
|
96
|
+
- Stages 2–6 are adapted from the `brainstorming`, `writing-plans`,
|
|
97
|
+
`using-git-worktrees`, `subagent-driven-development`, `test-driven-development`
|
|
98
|
+
and `requesting-code-review` skills in obra/superpowers (MIT,
|
|
99
|
+
https://github.com/obra/superpowers).
|
|
100
|
+
|
|
101
|
+
Both notices live in the repo `LICENSE` → *Third-party*.
|
|
61
102
|
|
|
62
103
|
## Hand-off the other direction
|
|
63
104
|
|
|
64
|
-
super-ux's `/ux` menu can hand off *to* this pipeline (its "execute
|
|
65
|
-
|
|
66
|
-
|
|
105
|
+
super-ux's `/ux` menu can hand off *to* this pipeline (its "execute autonomously"
|
|
106
|
+
action). When entered that way the UX chain already exists — see `stages.md` → 0
|
|
107
|
+
*Entry-from-super-ux short-circuit*: verify, don't rebuild.
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
# Host conventions (stages 6–
|
|
1
|
+
# Host conventions (stage 0 harvest, stages 6–10)
|
|
2
2
|
|
|
3
3
|
The orchestrator is project-agnostic. For tests / lint / deploy / docs / wiki it reads the
|
|
4
4
|
**host project's `CLAUDE.md` / `AGENTS.md` first**, then falls back to detection.
|
|
5
|
+
The same files are the stage-0 harvest's first stop — they are where a project
|
|
6
|
+
names its doc repos, its knowledge base and its house rules
|
|
7
|
+
([`knowledge-sources.md`](knowledge-sources.md)).
|
|
5
8
|
Prefer explicit host instructions over detection; if a step's convention can't be
|
|
6
9
|
found, surface it and **ask** rather than guessing.
|
|
7
10
|
|
|
@@ -30,6 +33,27 @@ found, surface it and **ask** rather than guessing.
|
|
|
30
33
|
CI: the workflow run. Hit the health endpoint if one is defined.
|
|
31
34
|
|
|
32
35
|
## Docs + wiki
|
|
36
|
+
- **Start from the stage-0 source ledger** ([`knowledge-sources.md`](knowledge-sources.md)):
|
|
37
|
+
the sources the harvest read are the sources this stage updates. Anything the run
|
|
38
|
+
proved stale is already listed there with what's wrong.
|
|
33
39
|
- Host self-update rules (module docs, runbooks, agent-self cards, etc.) — update
|
|
34
|
-
in the same change.
|
|
35
|
-
|
|
40
|
+
in the same change. Fix dangling links.
|
|
41
|
+
- **Wiki:** [obsidian-wiki](https://github.com/ar9av/obsidian-wiki) — the
|
|
42
|
+
`wiki-update` skill (resolves the vault via `~/.obsidian-wiki/config`). Detect it
|
|
43
|
+
the same way the harvest does; if absent, recommend it once
|
|
44
|
+
(`pip install obsidian-wiki` → `obsidian-wiki setup --vault <path>`) and continue.
|
|
45
|
+
A project may of course use a different knowledge base — then its own
|
|
46
|
+
`CLAUDE.md` names the sync command, and that wins.
|
|
47
|
+
- **Docs in another repository** (a docs repo, a submodule, a sibling checkout the
|
|
48
|
+
project names): updating it is **outward** — propose the change, get an explicit
|
|
49
|
+
operator go, open a PR there. Never push to a repo the task didn't name.
|
|
50
|
+
|
|
51
|
+
## Issue tracker (stage 10)
|
|
52
|
+
|
|
53
|
+
Acceptance parks what wasn't delivered: every `deferred` REQ and every unresolved
|
|
54
|
+
carry-over row needs a **home** — an issue, a backlog entry, a ticket id. Read the
|
|
55
|
+
host's convention (`CLAUDE.md` usually names the tracker and the id format; else
|
|
56
|
+
detect: a `.github/ISSUE_TEMPLATE/`, a Linear/Jira reference in recent commits, a
|
|
57
|
+
`TODO.md`). Never invent a tracker, and never close a run on "we'll remember it" —
|
|
58
|
+
if no tracker exists, write the row into the repo's backlog file and say where it
|
|
59
|
+
went.
|