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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./pipeline.schema.json",
|
|
3
3
|
"version": 1,
|
|
4
|
-
"_note": "EXAMPLE ONLY — copy this file, rename to pipeline.json in your project, and rewrite it. This particular example encodes the plugin's own default flow (an up-front intake grill +
|
|
4
|
+
"_note": "EXAMPLE ONLY — copy this file, rename to pipeline.json in your project, and rewrite it. This particular example encodes the plugin's own default flow (an up-front intake grill + this skill's own built-in stage doctrine + a super-ux UX track for user-facing tasks); it is NOT a fixed contract. Reading skills[] in THIS example: a 'task-pipeline:<name>' entry is not an installable skill — it names this skill's own built-in doctrine file (references/<name>.md, e.g. task-pipeline:grill -> references/grill.md); a 'host:<name>' entry is the host project's own command for that job, resolved from its CLAUDE.md (see references/conventions.md); every other entry is a real skill/agent your environment resolves (super-ux:*, context7, wiki-query, wiki-update). In YOUR pipeline.json, put whatever names your environment actually resolves. Your project defines its own stages (any count), each executed by your own skills/agents, with your own gate types. Stage models use provider-agnostic tokens ('default' = the model confirmed for the run, 'inherit' = whatever the operator is on) — never hardcode a vendor model id, it goes stale. The universal contract is pipeline.schema.json; test/validate.py checks this example against it. gate.type: auto = orchestrator verifies the check itself (pass/fail); manual = wait for an explicit operator go. Which stages are manual vs auto is the operator's decision, not the plugin's. Any repeating loop in a run (fix loop, a re-entered stage, the per-module program loop) is bound by the loop guard: log every repeat touch, stop on oscillation, escalate to the layer that owns the conflict, then re-check in a planned order.",
|
|
5
5
|
"stages": [
|
|
6
6
|
{
|
|
7
7
|
"id": 0,
|
|
@@ -9,11 +9,13 @@
|
|
|
9
9
|
"name": "Intake grill",
|
|
10
10
|
"model": "default",
|
|
11
11
|
"skills": [
|
|
12
|
+
"task-pipeline:knowledge-harvest",
|
|
13
|
+
"wiki-query",
|
|
12
14
|
"task-pipeline:grill"
|
|
13
15
|
],
|
|
14
16
|
"gate": {
|
|
15
17
|
"type": "manual",
|
|
16
|
-
"check": "MANDATORY stage — never skipped (only sanctioned bypass: the entry-from-super-ux short-circuit).
|
|
18
|
+
"check": "MANDATORY stage — never skipped (only sanctioned bypass: the entry-from-super-ux short-circuit). PHASE 1, before the first question: harvest the knowledge sources (references/knowledge-sources.md) — code, CLAUDE.md/AGENTS.md, CONTEXT.md + docs/adr, docs/ + docs/ux, past pipeline briefs and carry-over ledgers, the knowledge wiki when installed (obsidian-wiki — recommended, never required; detect ~/.obsidian-wiki/config), and any other repo or hosted doc system the project names as its docs — queried by this task's own terms, with the SOURCE LEDGER written into the brief (a row per source consulted, or an explicit 'none found'). PHASE 2, the grill, built into the skill (references/grill.md) — no companion to install. Per its contract: one question at a time, a recommended answer with each, explore the codebase/docs before asking, depth-first, contradictions reconciled; EVERY answer that touches a harvested source is validated against that source — the operator outranks any document, but only out loud, and the losing side is logged for the stage-9 doc update; domain awareness applied (terms challenged against CONTEXT.md, ADRs recorded for hard-to-reverse calls). The autonomy sweep is covered — every stage 1-10 has its blockers pre-resolved (docs sources, branch/tracker policy, test + lint commands, deploy target and authorization, log/health locations, docs+wiki targets) or is explicitly marked 'stop and ask here'. UI verdict recorded (arms super-ux); model decision recorded. All of it locked into a committed task brief the operator confirms before stage 1. The REQ table is written — one row per independently verifiable deliverable, each naming how it is verified — and frozen: adding later is free, removing or narrowing needs the operator's explicit agreement. The carry-over ledger is seeded."
|
|
17
19
|
}
|
|
18
20
|
},
|
|
19
21
|
{
|
|
@@ -33,14 +35,15 @@
|
|
|
33
35
|
{
|
|
34
36
|
"id": 2,
|
|
35
37
|
"state": "brainstorm",
|
|
36
|
-
"name": "Brainstorm",
|
|
38
|
+
"name": "Brainstorm + decompose",
|
|
37
39
|
"model": "default",
|
|
38
40
|
"skills": [
|
|
39
|
-
"
|
|
41
|
+
"task-pipeline:brainstorm",
|
|
42
|
+
"task-pipeline:decompose"
|
|
40
43
|
],
|
|
41
44
|
"gate": {
|
|
42
45
|
"type": "manual",
|
|
43
|
-
"check": "the user approves the design AND the UI verdict is recorded (does the task touch a user-facing surface — web/mobile/CLI/TUI? this arms the stage-3 UX track)"
|
|
46
|
+
"check": "the user approves the design AND the UI verdict is recorded (does the task touch a user-facing surface — web/mobile/CLI/TUI? this arms the stage-3 UX track). Every REQ is answered by the design, or explicitly dropped by the operator into the carry-over ledger. For a platform (several independent capabilities or shippable surfaces): the module map specs/<topic>-modules.md is committed and approved — brick criteria met or excepted in writing, dependency graph acyclic, build order topological with the walking skeleton first, every REQ mapped to exactly one module, cross-module contracts named with their owner. Single-module work records 'single module: <name>' instead — a skipped decomposition is a recorded decision, never an omission"
|
|
44
47
|
}
|
|
45
48
|
},
|
|
46
49
|
{
|
|
@@ -49,14 +52,16 @@
|
|
|
49
52
|
"name": "Spec",
|
|
50
53
|
"model": "default",
|
|
51
54
|
"skills": [
|
|
55
|
+
"super-ux:ux",
|
|
52
56
|
"super-ux:ux-foundation",
|
|
53
57
|
"super-ux:ux-flows",
|
|
54
58
|
"super-ux:ux-scenarios",
|
|
55
|
-
"
|
|
59
|
+
"super-ux:ux-lint",
|
|
60
|
+
"task-pipeline:spec"
|
|
56
61
|
],
|
|
57
62
|
"gate": {
|
|
58
63
|
"type": "manual",
|
|
59
|
-
"check": "UX track ran FIRST for user-facing tasks (/ux -> ux-foundation CJM -> ux-flows screens -> ux-scenarios -> /ux-lint green); spec committed and user-reviewed; every user-facing requirement traces to a scenario ID"
|
|
64
|
+
"check": "UX track ran FIRST for user-facing tasks (/ux -> ux-foundation CJM -> ux-flows screens -> ux-scenarios -> /ux-lint green); spec committed and user-reviewed; every user-facing requirement traces to a scenario ID. Every spec section carries covers: REQ-... and every REQ appears in at least one section."
|
|
60
65
|
}
|
|
61
66
|
},
|
|
62
67
|
{
|
|
@@ -65,11 +70,11 @@
|
|
|
65
70
|
"name": "Plan",
|
|
66
71
|
"model": "default",
|
|
67
72
|
"skills": [
|
|
68
|
-
"
|
|
73
|
+
"task-pipeline:plan"
|
|
69
74
|
],
|
|
70
75
|
"gate": {
|
|
71
76
|
"type": "auto",
|
|
72
|
-
"check": "every spec requirement maps to a task; no placeholders; parallel-group tasks share no files; UI tasks name the scenario ID(s) and SCR- screen(s) they implement in their DoD"
|
|
77
|
+
"check": "SET EQUALITY: the REQ ids in the brief equal the union of Implements: across plan tasks — a non-empty difference fails the gate and is reported as the explicit list of dropped requirements. Plus: every spec requirement maps to a task; no placeholders; names and types consistent across tasks; every task carries a verifiable DoD; parallel-group tasks share no files; UI tasks name the scenario ID(s) and SCR- screen(s) they implement in their DoD"
|
|
73
78
|
}
|
|
74
79
|
},
|
|
75
80
|
{
|
|
@@ -78,12 +83,12 @@
|
|
|
78
83
|
"name": "Dev",
|
|
79
84
|
"model": "default",
|
|
80
85
|
"skills": [
|
|
81
|
-
"
|
|
82
|
-
"
|
|
86
|
+
"task-pipeline:build",
|
|
87
|
+
"task-pipeline:review"
|
|
83
88
|
],
|
|
84
89
|
"gate": {
|
|
85
90
|
"type": "auto",
|
|
86
|
-
"check": "all plan tasks DONE
|
|
91
|
+
"check": "all plan tasks DONE — the per-task review returns three verdicts (spec compliance, REQ satisfied, code quality); every finding fixed or parked with a written ruling; no task left BLOCKED; full test suite green; the branch integrated per the brief's branch policy (base synced, suite green on the result, worktree removed) — or the operator's explicit 'leave it unmerged' recorded. Every parked finding and implementer concern is harvested into the carry-over ledger before the scratch workspace is deleted."
|
|
87
92
|
}
|
|
88
93
|
},
|
|
89
94
|
{
|
|
@@ -92,11 +97,12 @@
|
|
|
92
97
|
"name": "Tests",
|
|
93
98
|
"model": "default",
|
|
94
99
|
"skills": [
|
|
95
|
-
"
|
|
100
|
+
"host:test-runner",
|
|
101
|
+
"task-pipeline:tdd"
|
|
96
102
|
],
|
|
97
103
|
"gate": {
|
|
98
104
|
"type": "auto",
|
|
99
|
-
"check": "full suite green (not just new tests); new/changed code covered; no skip/xfail smuggling a red suite past the gate"
|
|
105
|
+
"check": "full suite green (not just new tests); new/changed code covered including failure paths; no skip/xfail smuggling a red suite past the gate; tests assert real behavior, not mock behavior"
|
|
100
106
|
}
|
|
101
107
|
},
|
|
102
108
|
{
|
|
@@ -110,7 +116,7 @@
|
|
|
110
116
|
],
|
|
111
117
|
"gate": {
|
|
112
118
|
"type": "manual",
|
|
113
|
-
"check": "lint clean and full suite green before deploy; deploy is outward and needs explicit operator go — or the specific standing authorization recorded in the stage-0 brief (named target + named preconditions; a vague 'do everything' is not one)"
|
|
119
|
+
"check": "lint clean and full suite green before deploy; deploy is outward and needs explicit operator go — or the specific standing authorization recorded in the stage-0 brief (named target + named preconditions; a vague 'do everything' is not one). No REQ is still open; a partial ships only with the operator's explicit acceptance."
|
|
114
120
|
}
|
|
115
121
|
},
|
|
116
122
|
{
|
|
@@ -137,7 +143,20 @@
|
|
|
137
143
|
],
|
|
138
144
|
"gate": {
|
|
139
145
|
"type": "auto",
|
|
140
|
-
"check": "docs in sync with code in the same change; wiki synced; dangling links fixed"
|
|
146
|
+
"check": "the stage-0 source ledger is the work list — every source the harvest read is updated if this run changed or disproved it; docs in sync with code in the same change; wiki synced via wiki-update when obsidian-wiki is installed (absent → recommended once, never a blocker); docs living in another repository are outward — proposed with an explicit go, or carried over with the exact edit; dangling links fixed"
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"id": 10,
|
|
151
|
+
"state": "acceptance",
|
|
152
|
+
"name": "Acceptance",
|
|
153
|
+
"model": "default",
|
|
154
|
+
"skills": [
|
|
155
|
+
"task-pipeline:acceptance"
|
|
156
|
+
],
|
|
157
|
+
"gate": {
|
|
158
|
+
"type": "manual",
|
|
159
|
+
"check": "Close the circle: every REQ in the brief has a status (verified / partial / deferred / dropped) — none unknown; every verified carries evidence (a passing test name, file:line, a command and its output, or a scenario ID) — 'done' without evidence is downgraded to partial, not upgraded; every partial names what is missing and where it is tracked; every deferred/dropped has the operator's agreement and, for deferred, a tracker entry; no carry-over row is left unresolved; and the operator answers the closing question — here is what you asked for, here is what shipped, here is what is deferred, what is missing? — and signs off"
|
|
141
160
|
}
|
|
142
161
|
}
|
|
143
162
|
],
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Acceptance — stage 10, built in
|
|
2
|
+
|
|
3
|
+
The pipeline is a funnel: every gate before this one asks *"is this artifact
|
|
4
|
+
good?"* — is the spec committed, does the plan parallelize, is the suite green.
|
|
5
|
+
None of them asks *"does this still contain everything that was asked for?"*
|
|
6
|
+
|
|
7
|
+
That is this stage's only job: **go back to the brief and account for every
|
|
8
|
+
requirement.** It is what turns the pipeline from a funnel into a circle.
|
|
9
|
+
|
|
10
|
+
## Why a stage and not a gate
|
|
11
|
+
|
|
12
|
+
The loss this catches doesn't happen inside a stage — it happens **on the seams**.
|
|
13
|
+
Brief → spec → plan → task briefs is four rewrites by a model, and anything not
|
|
14
|
+
carried forward disappears silently because nothing compares the lists. Stage 4's
|
|
15
|
+
gate catches the brief→plan seam mechanically; stage 10 catches everything the
|
|
16
|
+
run itself decided, deferred, or quietly dropped along the way.
|
|
17
|
+
|
|
18
|
+
It runs **last** — after docs and wiki (stage 9), because those are deliverables
|
|
19
|
+
too and a requirement may name them.
|
|
20
|
+
|
|
21
|
+
## Inputs
|
|
22
|
+
|
|
23
|
+
Read all of them before writing anything:
|
|
24
|
+
|
|
25
|
+
- the brief's **REQ table** (`docs/superpowers/specs/<topic>-brief.md`)
|
|
26
|
+
- the **carry-over ledger** (`…-carryover.md`) — in full, every row
|
|
27
|
+
- the plan and its task statuses
|
|
28
|
+
- git log for the run's branch; the test suite's final output
|
|
29
|
+
- stage 8's post-deploy notes; stage 9's doc/wiki changes
|
|
30
|
+
- for UI tasks: `docs/ux/scenarios.md` statuses and the `/ux-lint` result
|
|
31
|
+
|
|
32
|
+
## Output — the coverage table
|
|
33
|
+
|
|
34
|
+
Write `docs/superpowers/specs/YYYY-MM-DD-<topic>-acceptance.md`:
|
|
35
|
+
|
|
36
|
+
```markdown
|
|
37
|
+
# Acceptance — <topic>
|
|
38
|
+
|
|
39
|
+
Run: <branch/commit range> · Date: YYYY-MM-DD
|
|
40
|
+
|
|
41
|
+
| REQ | Requirement | Status | Evidence |
|
|
42
|
+
|---|---|---|---|
|
|
43
|
+
| REQ-001 | CSV export from a report | verified | `test_export_csv` ✓ · `api/export.ts:88` |
|
|
44
|
+
| REQ-002 | Export respects active filters | verified | `test_export_respects_filters` ✓ · SCN-014 PASS |
|
|
45
|
+
| REQ-003 | Button disabled on an empty report | deferred | agreed 2026-07-28 → LIN-482 |
|
|
46
|
+
| REQ-004 | XLSX export | partial | CSV path done; XLSX missing → LIN-483 |
|
|
47
|
+
|
|
48
|
+
## Carry-over still open
|
|
49
|
+
|
|
50
|
+
- (rows from the ledger whose home is not an issue/backlog/`dropped`)
|
|
51
|
+
|
|
52
|
+
## What the operator should look at
|
|
53
|
+
|
|
54
|
+
- <anything the run judged, guessed, or deferred that deserves a second opinion>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### The four statuses
|
|
58
|
+
|
|
59
|
+
| Status | Means | Requires |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| `verified` | done and demonstrated | **evidence** — a passing test name, `file:line`, command output, or a scenario ID with PASS |
|
|
62
|
+
| `partial` | works for some of what was asked | an explicit list of what's missing + where it's tracked |
|
|
63
|
+
| `deferred` | agreed not to do it now | the operator's agreement **and** a tracker entry |
|
|
64
|
+
| `dropped` | agreed it isn't wanted | the operator's agreement + the reason |
|
|
65
|
+
|
|
66
|
+
Those four are the only ways a requirement may close. Anything that fits none of
|
|
67
|
+
them is `unknown`, and **`unknown` fails the gate** — that is the whole mechanism:
|
|
68
|
+
the run cannot end while a requirement is still unclassified.
|
|
69
|
+
|
|
70
|
+
## Evidence, not assertion
|
|
71
|
+
|
|
72
|
+
**"Done" without evidence is not done.** This is the same rule the review rubric
|
|
73
|
+
and the test-honesty rules apply one level down, raised to the level of intent:
|
|
74
|
+
|
|
75
|
+
- A passing test **name**, not "tests pass".
|
|
76
|
+
- A `file:line`, not "implemented in the export module".
|
|
77
|
+
- A command **and its output**, not "verified manually".
|
|
78
|
+
- For user-facing behavior, the scenario ID and its status.
|
|
79
|
+
|
|
80
|
+
If the evidence for a requirement is "I read the code and it looks right", the
|
|
81
|
+
status is `partial`, not `verified` — say so plainly rather than upgrading it.
|
|
82
|
+
|
|
83
|
+
## The closing question
|
|
84
|
+
|
|
85
|
+
The table is preparation. The stage exists for the question that follows it, asked
|
|
86
|
+
out loud, with the list in front of the operator:
|
|
87
|
+
|
|
88
|
+
> Here's what you asked for, here's what shipped, here's what's deferred and where
|
|
89
|
+
> it lives. **What's missing?**
|
|
90
|
+
|
|
91
|
+
Ask it even when the table is all green. The operator holds context the brief
|
|
92
|
+
never captured, and this is the cheapest moment in the whole run to hear it. An
|
|
93
|
+
answer here becomes new REQ rows or new ledger entries — not a new argument about
|
|
94
|
+
whether the run was finished.
|
|
95
|
+
|
|
96
|
+
## GATE (manual)
|
|
97
|
+
|
|
98
|
+
All of:
|
|
99
|
+
|
|
100
|
+
1. **Every REQ has a status** — none `unknown`, none blank.
|
|
101
|
+
2. **Every `verified` carries evidence** of the kind above.
|
|
102
|
+
3. **Every `partial` names what's missing** and where it's tracked.
|
|
103
|
+
4. **Every `deferred` / `dropped` has the operator's agreement** recorded (in the
|
|
104
|
+
ledger or here) and, for `deferred`, a tracker entry.
|
|
105
|
+
5. **No carry-over row is left `unresolved`** — every one has a home.
|
|
106
|
+
6. **The operator answers the closing question** and signs off.
|
|
107
|
+
|
|
108
|
+
Manual by design. An automated check can prove the table is *well-formed*; only
|
|
109
|
+
the person who asked can confirm it is *what they asked for*. Do not let a green
|
|
110
|
+
table substitute for that answer.
|
|
111
|
+
|
|
112
|
+
## When the answer is "something's missing"
|
|
113
|
+
|
|
114
|
+
Don't argue and don't re-litigate the gates. Add the missing thing as a new REQ
|
|
115
|
+
row (with its check) or a ledger entry, then say plainly what it costs: a fix now,
|
|
116
|
+
or a tracked follow-up. Both are legitimate outcomes of this stage. Closing the
|
|
117
|
+
run with a known gap is fine **if the gap is written down** — closing it with the
|
|
118
|
+
gap only in someone's memory is the failure mode this whole spine exists to
|
|
119
|
+
prevent.
|
|
@@ -15,7 +15,10 @@ docs/
|
|
|
15
15
|
superpowers/
|
|
16
16
|
specs/
|
|
17
17
|
YYYY-MM-DD-<topic>-brief.md # stage 0 — locked intake brief (grill output)
|
|
18
|
-
YYYY-MM-DD-<topic>-
|
|
18
|
+
YYYY-MM-DD-<topic>-carryover.md # stage 0 seeds it; EVERY stage appends; stage 10 reads it
|
|
19
|
+
YYYY-MM-DD-<topic>-modules.md # stage 2 — module map + build order (platforms only)
|
|
20
|
+
YYYY-MM-DD-<topic>-design.md # stage 3 — the spec / module dossier (locks shared contracts)
|
|
21
|
+
YYYY-MM-DD-<topic>-acceptance.md # stage 10 — REQ coverage table + evidence
|
|
19
22
|
plans/
|
|
20
23
|
YYYY-MM-DD-<topic>.md # stage 4 — the implementation plan
|
|
21
24
|
ux/ # super-ux, UI tasks only (see companion-skills.md)
|
|
@@ -29,16 +32,34 @@ docs/
|
|
|
29
32
|
```
|
|
30
33
|
|
|
31
34
|
Naming: date-prefixed `YYYY-MM-DD-<topic>` slugs, one topic per file, kebab-case.
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
Brief, carry-over, design, plan and acceptance share the **same `<topic>` slug**, so the chain is traceable
|
|
36
|
+
at a glance.
|
|
37
|
+
|
|
38
|
+
> The `docs/superpowers/` directory name is this pipeline's historical convention
|
|
39
|
+
> (kept so existing projects don't have to migrate) — **not a dependency on any
|
|
40
|
+
> external skill**. A host project may relocate the root via its `CLAUDE.md`; keep
|
|
41
|
+
> the shape, keep the slugs.
|
|
42
|
+
|
|
43
|
+
Loop-bearing runs also keep a **git-ignored** run ledger at `.task-pipeline/run.md` —
|
|
44
|
+
stage-level and program-level repeat touches, one line each, so the loop guard can
|
|
45
|
+
detect churn after a lost context (see [`loop-guard.md`](loop-guard.md)).
|
|
46
|
+
|
|
47
|
+
Stage 5 also creates a **git-ignored** scratch workspace per plan at
|
|
48
|
+
`.task-pipeline/build/<plan-basename>/` — ledger, task briefs, implementer reports,
|
|
49
|
+
review packages. It is deleted when the final review is clean; git history is the
|
|
50
|
+
record (see `build.md`).
|
|
34
51
|
|
|
35
52
|
## Stage → artifact map
|
|
36
53
|
|
|
37
54
|
| Stage | Writes | Consumed by |
|
|
38
55
|
|---|---|---|
|
|
39
|
-
| 0
|
|
56
|
+
| 0 Harvest | the brief's **Knowledge sources** ledger — every source consulted, its freshness, whether this run makes it stale | the grill (validation), **stage 9** (the update work list) |
|
|
57
|
+
| 0 Intake | `specs/<topic>-brief.md` — incl. the **REQ table** (seed from `templates/brief.md`) | stages 2–5, 7, 10 |
|
|
58
|
+
| 0→10 all | `specs/<topic>-carryover.md` — append-only ledger (seed from `templates/carryover.md`) | stage 10, in full |
|
|
59
|
+
| 10 Acceptance | `specs/<topic>-acceptance.md` — every REQ with a status and evidence | the operator |
|
|
40
60
|
| 0 Grill (domain) | `CONTEXT.md`, `docs/adr/NNNN-<slug>.md` — created **lazily**, only when a term resolves or a decision qualifies | stages 2–4 + the repo |
|
|
41
|
-
|
|
|
61
|
+
| 2 Decompose | `specs/<topic>-modules.md` — module map, build order, contracts, per-module status (platforms only) | stages 3–10, every module's run |
|
|
62
|
+
| 3 Spec | `specs/<topic>-design.md` — module dossier for a decomposed platform (+ links `docs/ux/*` for UI) | stage 4 |
|
|
42
63
|
| 4 Plan | `plans/<topic>.md` | stage 5 |
|
|
43
64
|
| 3 UX track | `docs/ux/{foundation,flows,screens,scenarios}.md` | stages 4–9 + `/ux-lint` |
|
|
44
65
|
| 8 Post-deploy | log/health notes (in the run, not a committed file) | stage 9 |
|
|
@@ -47,22 +68,34 @@ design → plan is traceable at a glance.
|
|
|
47
68
|
## This repo (task-pipeline itself), for reference
|
|
48
69
|
|
|
49
70
|
```
|
|
50
|
-
.claude-plugin/marketplace.json
|
|
71
|
+
.claude-plugin/marketplace.json # marketplace manifest
|
|
51
72
|
plugins/task-pipeline/
|
|
52
|
-
.claude-plugin/plugin.json
|
|
73
|
+
.claude-plugin/plugin.json # plugin manifest
|
|
53
74
|
commands/task-pipeline.md # /task-pipeline
|
|
54
75
|
skills/task-pipeline/
|
|
55
|
-
SKILL.md
|
|
76
|
+
SKILL.md # the orchestrator itself
|
|
56
77
|
pipeline.schema.json # generic pipeline contract
|
|
57
78
|
pipeline.example.json # this plugin's own flow, as config
|
|
58
|
-
references/
|
|
79
|
+
references/ # built-in stage doctrine:
|
|
80
|
+
knowledge-sources.md grill.md # stage 0 (harvest, then interview)
|
|
81
|
+
brainstorm.md decomposition.md # stage 2
|
|
82
|
+
spec.md planning.md # stages 3-4
|
|
83
|
+
build.md review.md tdd.md # stages 5-6
|
|
84
|
+
acceptance.md # stage 10
|
|
85
|
+
loop-guard.md # cross-cutting: churn detection
|
|
86
|
+
stages.md model-tiering.md # gates, model policy
|
|
87
|
+
conventions.md artifacts.md # host conventions, this layout
|
|
88
|
+
companion-skills.md # optional companions + preflight
|
|
89
|
+
templates/ # skeletons seeded into a host project
|
|
90
|
+
README.md brief.md carryover.md context.md adr.md
|
|
59
91
|
cursor/rules/task-pipeline.mdc # Cursor channel (self-contained rule)
|
|
60
|
-
plugins/task-pipeline/skills/task-pipeline/templates/{brief,context,adr}.md # stage-0 skeletons (ship on every channel)
|
|
61
92
|
bin/task-pipeline.js # npx installer (package task-pipeline-skill)
|
|
62
|
-
package.json
|
|
63
93
|
install.sh # POSIX installer
|
|
64
|
-
test/validate.py # structural validator
|
|
65
|
-
.github/workflows/{validate,release}.yml # CI + toggleable release
|
|
66
|
-
|
|
94
|
+
test/validate.py # structural validator (npm test)
|
|
95
|
+
.github/workflows/{validate,release}.yml # CI + toggleable release automation
|
|
96
|
+
.github/ISSUE_TEMPLATE/ .github/PULL_REQUEST_TEMPLATE.md
|
|
97
|
+
package.json .gitignore
|
|
98
|
+
README.md CHANGELOG.md LICENSE CLAUDE.md
|
|
99
|
+
CONTRIBUTING.md SECURITY.md CODE_OF_CONDUCT.md
|
|
67
100
|
docs/superpowers/{specs,plans}/ # this repo's own design history
|
|
68
101
|
```
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Brainstorm — stage 2, built in
|
|
2
|
+
|
|
3
|
+
The design conversation is **part of this skill**. No companion to install, no
|
|
4
|
+
provider to resolve, nothing to fall back to: this file is the implementation.
|
|
5
|
+
|
|
6
|
+
Stage 0 locked *what* is being built. Stage 2 decides *how*, and stops at an
|
|
7
|
+
approved design — not at code.
|
|
8
|
+
|
|
9
|
+
> Ported, with thanks, from the `brainstorming` skill in
|
|
10
|
+
> [obra/superpowers](https://github.com/obra/superpowers) (MIT — see this repo's
|
|
11
|
+
> `LICENSE` → *Third-party*), rewritten for this pipeline: the brief is the input,
|
|
12
|
+
> the UI verdict is a required output, and the spec write-up moved to stage 3
|
|
13
|
+
> ([`spec.md`](spec.md)).
|
|
14
|
+
|
|
15
|
+
## The hard gate
|
|
16
|
+
|
|
17
|
+
**No implementation action before the operator approves a design.** No code, no
|
|
18
|
+
scaffolding, no file creation "to see how it'd look", no invoking a
|
|
19
|
+
frontend/backend/build skill. This holds for every task regardless of how simple it
|
|
20
|
+
looks.
|
|
21
|
+
|
|
22
|
+
**"Too simple to need a design" is the trap, not the exception.** A one-function
|
|
23
|
+
utility, a config flip, a copy change — all of them go through this stage. Simple
|
|
24
|
+
tasks are where unexamined assumptions survive longest. The design may be three
|
|
25
|
+
sentences; it still gets presented and approved.
|
|
26
|
+
|
|
27
|
+
## Input: the brief, not a blank page
|
|
28
|
+
|
|
29
|
+
Read the stage-0 brief first (`…-brief.md`). Everything it locked — scope, users,
|
|
30
|
+
constraints, done-criteria, the autonomy sweep — is **settled**. Re-asking a
|
|
31
|
+
question the grill already answered is the single most common way to waste this
|
|
32
|
+
stage. If the brief and the codebase disagree, that's a contradiction to surface,
|
|
33
|
+
not a question to re-open from scratch.
|
|
34
|
+
|
|
35
|
+
## The loop
|
|
36
|
+
|
|
37
|
+
1. **Explore the current state.** Files, module docs, recent commits, the
|
|
38
|
+
conventions the repo already follows. Do this before asking anything.
|
|
39
|
+
2. **Scope check, early.** If the task actually describes several independent
|
|
40
|
+
capabilities or separately shippable surfaces, say so immediately: that is a
|
|
41
|
+
**platform**, and it gets cut into modules at the end of this stage by
|
|
42
|
+
[`decomposition.md`](decomposition.md), before any spec is written. Brainstorm
|
|
43
|
+
the platform's shape — the pieces, how they relate, what order they land in —
|
|
44
|
+
not the details of one corner; those belong to each module's own stage-3
|
|
45
|
+
dossier. Don't refine something that needs splitting first.
|
|
46
|
+
3. **Questions one at a time.** Never bundle. Multiple choice where it fits, open
|
|
47
|
+
where it doesn't. Purpose, constraints, success criteria — anything the brief
|
|
48
|
+
left at design level.
|
|
49
|
+
4. **Propose 2–3 approaches with trade-offs**, lead with your recommendation and
|
|
50
|
+
the reason for it. **YAGNI ruthlessly** — strip anything the task doesn't need
|
|
51
|
+
from every option before presenting.
|
|
52
|
+
5. **Present the design in sections**, each scaled to its complexity (a couple of
|
|
53
|
+
sentences when it's straightforward, up to a few hundred words when it's
|
|
54
|
+
genuinely nuanced). Ask after each section whether it holds. Cover:
|
|
55
|
+
architecture, components, data flow, error handling and degradation, testing.
|
|
56
|
+
6. **Go back when something doesn't fit.** A revised section beats a design that
|
|
57
|
+
was approved because it was hard to argue with.
|
|
58
|
+
|
|
59
|
+
## Design for isolation and clarity
|
|
60
|
+
|
|
61
|
+
- Break the system into units with **one clear purpose each**, communicating
|
|
62
|
+
through well-defined interfaces, understandable and testable on their own.
|
|
63
|
+
- For every unit you should be able to answer: what does it do, how is it used,
|
|
64
|
+
what does it depend on?
|
|
65
|
+
- Can a reader understand a unit without reading its internals? Can the internals
|
|
66
|
+
change without breaking consumers? If not, the boundaries need work.
|
|
67
|
+
- Smaller focused files are also what the *implementer* (often a subagent with a
|
|
68
|
+
narrow context) handles reliably. A file growing large is usually a signal it
|
|
69
|
+
does too much.
|
|
70
|
+
|
|
71
|
+
## Working in an existing codebase
|
|
72
|
+
|
|
73
|
+
- Explore the structure before proposing changes; follow the patterns already
|
|
74
|
+
there.
|
|
75
|
+
- Where existing code genuinely blocks the work — a file that's grown unwieldy,
|
|
76
|
+
tangled responsibilities, an unclear boundary the change has to cross — include
|
|
77
|
+
the targeted improvement in the design, the way a careful developer improves code
|
|
78
|
+
they're working in.
|
|
79
|
+
- Don't propose unrelated refactoring. Anything out of scope goes to the backlog,
|
|
80
|
+
not into this design.
|
|
81
|
+
|
|
82
|
+
## UI detection — a required output
|
|
83
|
+
|
|
84
|
+
One branch is always: **does this touch a user-facing surface** (web, mobile, CLI,
|
|
85
|
+
TUI — a screen, a command, a visible behavior)? Stage 0 usually answered it; this
|
|
86
|
+
stage confirms it against the design that actually emerged. Record the verdict —
|
|
87
|
+
it arms the stage-3 UX track ([`spec.md`](spec.md) → *UX track*). When it's
|
|
88
|
+
genuinely borderline, record "yes": a false positive costs one extra chain, a false
|
|
89
|
+
negative ships an unspecified interface.
|
|
90
|
+
|
|
91
|
+
## GATE (manual)
|
|
92
|
+
|
|
93
|
+
The operator approves the design **and** the UI verdict is recorded **and every REQ
|
|
94
|
+
in the brief is answered by the design** — a requirement the design doesn't address
|
|
95
|
+
is either covered now or explicitly dropped by the operator, with the drop written
|
|
96
|
+
into the carry-over ledger. For a platform, the module map
|
|
97
|
+
([`decomposition.md`](decomposition.md)) is committed and approved as part of this
|
|
98
|
+
same gate. Then, and only then, stage 3 writes it up.
|
|
99
|
+
|
|
100
|
+
## Rationalizations
|
|
101
|
+
|
|
102
|
+
| Excuse | Reality |
|
|
103
|
+
|---|---|
|
|
104
|
+
| "The brief already says everything" | The brief locks *what*. If it also locked *how*, say so in one line and get the approval anyway — the gate is the point. |
|
|
105
|
+
| "It's a one-line change, design is ceremony" | Then the design is one line. Present it. |
|
|
106
|
+
| "I'll scaffold while they think" | Scaffolding is implementation. The gate is before it, not around it. |
|
|
107
|
+
| "Both approaches are fine, let them pick" | You read the codebase, they didn't. Recommend, then let them override. |
|
|
108
|
+
| "I'll add the extra option now, it's cheap" | YAGNI. Every unused branch is code someone maintains and a test someone writes. |
|