task-pipeline-skill 0.17.1 → 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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "task-pipeline",
3
- "description": "Self-contained orchestrator that runs a task through a mandatory built-in intake grill + 10 gated stages (docs, brainstorm+decompose, spec, plan, subagent build, tests, lint/deploy, post-deploy, docs/wiki, acceptance). Every stage's doctrine is built into the skill — no companion plugin required — with typed auto/manual gates, a loop guard that breaks churn, one provider-agnostic model confirmed up front, a super-ux UX track for user-facing tasks, and toggleable project-configurable release automation.",
4
- "version": "0.17.1",
3
+ "description": "Runs a substantial task through a mandatory built-in intake grill, then 10 gated stages (docs, brainstorm+decompose, spec, plan, subagent build, tests, lint/deploy, post-deploy, docs/wiki, acceptance). Every stage's doctrine is built into the skill — no companion plugin required — with typed auto/manual gates, a frozen requirement spine that must close with evidence, a loop guard that breaks churn, one provider-agnostic model confirmed up front, and an optional super-ux UX track for user-facing work.",
4
+ "version": "1.0.0",
5
5
  "author": {
6
6
  "name": "ssheleg"
7
7
  },
@@ -5,15 +5,25 @@ argument-hint: <one-line task description>
5
5
  Use the `task-pipeline` skill to run the task below through all gated stages —
6
6
  **stage 0 intake grill** → docs study → brainstorm → spec → plan → subagent
7
7
  build → tests → lint/deploy → post-deploy → docs/wiki → **acceptance**. **Every stage's doctrine is
8
- built into the skill** (`references/{grill,brainstorm,decomposition,spec,planning,build,review,tdd,acceptance,loop-guard}.md`)
9
- — no companion plugin is required for any of them. The **intake grill is
8
+ built into the skill** (`references/{knowledge-sources,grill,brainstorm,decomposition,spec,planning,build,review,tdd,acceptance,loop-guard}.md`)
9
+ — no companion plugin is required for any of them. **Stage 0 opens with the
10
+ knowledge harvest, before the first question** (`references/knowledge-sources.md`):
11
+ pull what the project already knows about this task from the code, `CLAUDE.md`,
12
+ `CONTEXT.md`/ADRs, `docs/` + `docs/ux/`, past pipeline briefs, the **knowledge wiki**
13
+ if one is installed ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki) —
14
+ recommended, never required; detect `~/.obsidian-wiki/config`) and any **other repo
15
+ or hosted doc system the project names as its docs**, then write the **source
16
+ ledger** into the brief. The **intake grill is
10
17
  mandatory** (`references/grill.md`): interview the
11
18
  operator one question at a time (with a recommended answer each, exploring the
12
- codebase before asking) until every decision branch is resolved, applying the
19
+ codebase before asking) until every decision branch is resolved, **validating every
20
+ answer against the harvested sources** — the operator outranks any document, but
21
+ only out loud, and a doc the run proves stale is logged for the stage-9 update —
22
+ applying the
13
23
  grill's **domain awareness** (challenge terms against `CONTEXT.md`, sharpen fuzzy
14
24
  language, ADRs for hard-to-reverse calls) and covering the **autonomy sweep** (what
15
- would otherwise stop stages 1→10: docs sources, branch/tracker policy, test and lint
16
- commands, deploy target and authorization, log locations, docs/wiki targets) —
25
+ would otherwise stop stages 1→10: docs sources incl. doc repos and the wiki, branch/tracker
26
+ policy, test and lint commands, deploy target and authorization, log locations, docs/wiki targets) —
17
27
  until the brief is locked — including the **REQ table**, the request as an addressable list where every row names how it is verified — so the rest runs autonomously and the final stage can account for all of it. The list is frozen: adding is free, removing needs the operator's agreement. Anything deferred goes into the carry-over ledger the moment it's said. For any user-facing task, recommend/use
18
28
  **super-ux**. **If the brief describes a platform rather than a change**, stage 2 also cuts it into modules (`references/decomposition.md`) — module map committed, walking skeleton first, every REQ in exactly one module — and stages 3→10 then run per module, one brick at a time. **If any loop starts undoing an earlier pass** (same file edited twice for the same reason, a closed finding returning, a third entry into one stage), stop and run the loop guard (`references/loop-guard.md`): name both shapes, escalate to the layer that owns the conflict, re-plan the check as an ordered list, then go item by item. Honor every stage gate by its type (`auto` = verify yourself;
19
29
  `manual` = wait for explicit go). Confirm the **model once at preflight** —
@@ -27,7 +27,11 @@ tabled below) and an optional, toggleable `release` block. Any project replaces
27
27
  wholesale — any number of stages, run by its own skills/agents, with its own gate
28
28
  types (see *Bring your own skills*). Each gate has a **type**: `auto` (the
29
29
  orchestrator verifies the `check` itself, pass/fail) or `manual` (wait for an
30
- explicit operator go); which stages are manual is the operator's call.
30
+ explicit operator go); which stages are manual is the operator's call. In the
31
+ example's `skills[]`, `task-pipeline:<name>` denotes this skill's own built-in
32
+ doctrine (`references/<name>.md`) and `host:<name>` denotes the host project's own
33
+ command for that job (`references/conventions.md`); everything else is a real skill
34
+ the environment resolves.
31
35
 
32
36
  ## Prerequisites — none required
33
37
 
@@ -37,6 +41,7 @@ and no stage that can fail because a dependency is missing:
37
41
 
38
42
  | Stage | Built-in doctrine |
39
43
  |---|---|
44
+ | 0 Knowledge harvest (pre-grill) | [`references/knowledge-sources.md`](references/knowledge-sources.md) |
40
45
  | 0 Intake grill | [`references/grill.md`](references/grill.md) |
41
46
  | 2 Brainstorm | [`references/brainstorm.md`](references/brainstorm.md) |
42
47
  | 2 Decompose (platforms only) | [`references/decomposition.md`](references/decomposition.md) |
@@ -86,7 +91,19 @@ requirements, each naming how it will be verified. Stages 3–5 trace to those i
86
91
  stage 4's gate is a mechanical set-comparison against them, and **stage 10 accounts
87
92
  for every one** — which is what turns the pipeline from a funnel into a circle.
88
93
 
89
- Two things the grill does beyond clarifying the request:
94
+ **Harvest before you ask.** Stage 0 opens with a **knowledge harvest**
95
+ ([`references/knowledge-sources.md`](references/knowledge-sources.md)), not a
96
+ question: pull what the project already knows about this task from the code,
97
+ `CLAUDE.md`, `CONTEXT.md`/ADRs, `docs/` + `docs/ux/`, past pipeline briefs, the
98
+ **knowledge wiki** if one is installed
99
+ ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki) — recommended, never
100
+ required) and any **other repo or hosted doc system the project names as its
101
+ docs**. Write the source ledger into the brief, then interview *against* it: every
102
+ answer that touches a source is checked against that source, and the operator
103
+ outranks any document — but only out loud, so an override is a recorded decision
104
+ instead of an undetected divergence. The same ledger is stage 9's work list.
105
+
106
+ Three things the grill does beyond clarifying the request:
90
107
  - **Domain awareness.** It reads the project's own `CONTEXT.md` / `docs/adr/` and
91
108
  holds the operator to them — challenging terms that conflict with the glossary,
92
109
  sharpening overloaded words, stress-testing with concrete scenarios, and
@@ -108,8 +125,13 @@ Two things the grill does beyond clarifying the request:
108
125
  **and the model decision** (`references/model-tiering.md`): recommend
109
126
  the most capable model available, let the operator confirm or override, record
110
127
  it. Ask once, here.
111
- 2. **Run stage 0 (Intake grill) — always, no exceptions.** Grill until shared
112
- understanding is reached, the autonomy sweep is covered, **the REQ table is
128
+ 2. **Run stage 0 — always, no exceptions.** It opens with the **knowledge harvest**
129
+ (`references/knowledge-sources.md`): query the project's own sources — repo docs,
130
+ ADRs, `docs/ux/`, past briefs, the wiki if installed, any doc repo the project
131
+ names — for this task's terms, and write the **source ledger** into the brief
132
+ before question one. Then grill until shared
133
+ understanding is reached, **each answer checked against the harvest**, the
134
+ autonomy sweep is covered, **the REQ table is
113
135
  written (one row per independently verifiable deliverable, each naming its
114
136
  check)** and the brief is locked
115
137
  (`references/stages.md` → 0). Do not touch stage 1 before the brief is
@@ -155,7 +177,7 @@ capable available — see `references/model-tiering.md`).
155
177
 
156
178
  | # | Stage | Invoke | Gate | Type |
157
179
  |---|---|---|---|---|
158
- | 0 | Intake grill — **mandatory** | built in: [`references/grill.md`](references/grill.md) | shared understanding reached; autonomy sweep covered; brief locked + confirmed | manual |
180
+ | 0 | Intake grill — **mandatory** | built in: [`references/knowledge-sources.md`](references/knowledge-sources.md) (harvest) → [`references/grill.md`](references/grill.md) (interview) | source ledger written; shared understanding reached; autonomy sweep covered; brief locked + confirmed | manual |
159
181
  | 1 | Docs study | `context7` (resolve-library-id → get-library-docs) / `context7-docs` | contracts grounded on fetched docs | auto |
160
182
  | 2 | Brainstorm + decompose | built in: [`references/brainstorm.md`](references/brainstorm.md) + **UI detection** + [`references/decomposition.md`](references/decomposition.md) for platforms | design approved; UI verdict recorded; every REQ answered; platform: module map approved | manual |
161
183
  | 3 | Spec | built in: [`references/spec.md`](references/spec.md) — **UI → super-ux chain first** (`/ux` → `ux-foundation` CJM → `ux-flows` screens → `ux-scenarios` → `/ux-lint`), then spec `docs/superpowers/specs/…-design.md` | committed + reviewed; UI: chain validated, linter green, scenarios/`SCR-` traced | manual |
@@ -164,7 +186,7 @@ capable available — see `references/model-tiering.md`).
164
186
  | 6 | Tests | host test runner + built-in [`references/tdd.md`](references/tdd.md) | full suite green; new/changed code covered | auto |
165
187
  | 7 | Lint + deploy | host lint → deploy per host convention | lint clean + suite green before deploy; deploy needs a go (or the brief's specific standing authorization) | manual |
166
188
  | 8 | Post-deploy | tail deploy logs / health-check | clean boot or honest degradation report | auto |
167
- | 9 | Docs + wiki | host module docs/runbook rules → `wiki-update` | docs synced, wiki synced | auto |
189
+ | 9 | Docs + wiki | host module docs/runbook rules → `wiki-update` ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki), recommended) | every stale row of the stage-0 source ledger updated; docs synced; wiki synced | auto |
168
190
  | 10 | **Acceptance** | built in: [`references/acceptance.md`](references/acceptance.md) | every REQ accounted for with evidence; ledger has no unresolved row; operator signs off | manual |
169
191
 
170
192
  ## Model — ask once, at preflight
@@ -198,6 +220,7 @@ automation is on — `pipeline.schema.json` is the only contract.
198
220
 
199
221
  - `pipeline.schema.json` — the universal pipeline config contract (stages + release)
200
222
  - `pipeline.example.json` — this plugin's default flow (stage 0 + 1→10) + release, as config
223
+ - `references/knowledge-sources.md` — stage-0 phase 1: the source list, the wiki, the ledger, the stage-9 loop-back
201
224
  - `references/grill.md` — the built-in stage-0 grill: loop, domain awareness, autonomy sweep
202
225
  - `references/acceptance.md` — the built-in stage-10 close-out: REQ coverage, evidence, sign-off
203
226
  - `references/brainstorm.md` — stage 2: design dialogue, approaches, UI detection, hard gate
@@ -211,3 +234,6 @@ automation is on — `pipeline.schema.json` is the only contract.
211
234
  - `references/conventions.md` — how stages 6–10 read the host project's CLAUDE.md
212
235
  - `references/companion-skills.md` — companion skills, install lines, preflight recommendation
213
236
  - `references/artifacts.md` — the canonical document/artifact layout per stage
237
+ - `templates/` — skeletons seeded into the host project: `brief.md` (stage 0),
238
+ `carryover.md` (seeded at 0, appended by every stage, read in full at 10),
239
+ `context.md` and `adr.md` (format references the grill writes lazily)
@@ -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 + this skill's own built-in stage doctrine + a super-ux UX track for user-facing tasks); it is NOT a fixed contract. 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.",
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). The grill is 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; 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."
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
  {
@@ -50,9 +52,11 @@
50
52
  "name": "Spec",
51
53
  "model": "default",
52
54
  "skills": [
55
+ "super-ux:ux",
53
56
  "super-ux:ux-foundation",
54
57
  "super-ux:ux-flows",
55
58
  "super-ux:ux-scenarios",
59
+ "super-ux:ux-lint",
56
60
  "task-pipeline:spec"
57
61
  ],
58
62
  "gate": {
@@ -139,7 +143,7 @@
139
143
  ],
140
144
  "gate": {
141
145
  "type": "auto",
142
- "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"
143
147
  }
144
148
  },
145
149
  {
@@ -63,8 +63,9 @@ Run: <branch/commit range> · Date: YYYY-MM-DD
63
63
  | `deferred` | agreed not to do it now | the operator's agreement **and** a tracker entry |
64
64
  | `dropped` | agreed it isn't wanted | the operator's agreement + the reason |
65
65
 
66
- There is no fifth status. A requirement nobody can classify is `unknown`, and
67
- `unknown` fails the gate — that is the whole mechanism.
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.
68
69
 
69
70
  ## Evidence, not assertion
70
71
 
@@ -53,6 +53,7 @@ record (see `build.md`).
53
53
 
54
54
  | Stage | Writes | Consumed by |
55
55
  |---|---|---|
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) |
56
57
  | 0 Intake | `specs/<topic>-brief.md` — incl. the **REQ table** (seed from `templates/brief.md`) | stages 2–5, 7, 10 |
57
58
  | 0→10 all | `specs/<topic>-carryover.md` — append-only ledger (seed from `templates/carryover.md`) | stage 10, in full |
58
59
  | 10 Acceptance | `specs/<topic>-acceptance.md` — every REQ with a status and evidence | the operator |
@@ -67,24 +68,34 @@ record (see `build.md`).
67
68
  ## This repo (task-pipeline itself), for reference
68
69
 
69
70
  ```
70
- .claude-plugin/marketplace.json # marketplace manifest
71
+ .claude-plugin/marketplace.json # marketplace manifest
71
72
  plugins/task-pipeline/
72
- .claude-plugin/plugin.json
73
+ .claude-plugin/plugin.json # plugin manifest
73
74
  commands/task-pipeline.md # /task-pipeline
74
75
  skills/task-pipeline/
75
- SKILL.md
76
+ SKILL.md # the orchestrator itself
76
77
  pipeline.schema.json # generic pipeline contract
77
78
  pipeline.example.json # this plugin's own flow, as config
78
- references/{grill,brainstorm,decomposition,spec,planning,build,review,tdd,acceptance}.md # built-in stage doctrine
79
- references/loop-guard.md # cross-cutting: churn detection + break protocol
80
- references/{stages,model-tiering,conventions,artifacts,companion-skills}.md
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
81
91
  cursor/rules/task-pipeline.mdc # Cursor channel (self-contained rule)
82
- plugins/task-pipeline/skills/task-pipeline/templates/{brief,carryover,context,adr}.md # stage-0 skeletons (ship on every channel)
83
92
  bin/task-pipeline.js # npx installer (package task-pipeline-skill)
84
- package.json
85
93
  install.sh # POSIX installer
86
- test/validate.py # structural validator
87
- .github/workflows/{validate,release}.yml # CI + toggleable release
88
- README.md CHANGELOG.md LICENSE
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
89
100
  docs/superpowers/{specs,plans}/ # this repo's own design history
90
101
  ```
@@ -37,10 +37,12 @@ not a question to re-open from scratch.
37
37
  1. **Explore the current state.** Files, module docs, recent commits, the
38
38
  conventions the repo already follows. Do this before asking anything.
39
39
  2. **Scope check, early.** If the task actually describes several independent
40
- subsystems, say so immediately and help decompose it into sub-projects: what the
41
- independent pieces are, how they relate, what order they get built in. Then
42
- brainstorm the first one. Each sub-project gets its own spec → plan → build
43
- cycle. Don't refine details of something that needs splitting first.
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.
44
46
  3. **Questions one at a time.** Never bundle. Multiple choice where it fits, open
45
47
  where it doesn't. Purpose, constraints, success criteria — anything the brief
46
48
  left at design level.
@@ -304,7 +304,8 @@ findings are neither fixed nor parked-with-ruling at the cap.
304
304
  ## 5. Final whole-branch review
305
305
 
306
306
  After the last task: build a package over `MERGE_BASE`..`HEAD`
307
- (`git merge-base main HEAD`), dispatch the whole-branch review
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
308
309
  ([`review.md`](review.md) → *Final review*; on the run's model, escalation offered
309
310
  out loud per *Models* above), and point it at the
310
311
  ledger's deferred-minor and parked lines so it can triage what must be fixed before
@@ -12,6 +12,7 @@ better, plus one that is required only for user-facing work.
12
12
 
13
13
  | Stage | Doctrine |
14
14
  |---|---|
15
+ | 0 Knowledge harvest (pre-grill) | `references/knowledge-sources.md` |
15
16
  | 0 Intake grill | `references/grill.md` |
16
17
  | 2 Brainstorm | `references/brainstorm.md` |
17
18
  | 2 Decompose (platforms only) | `references/decomposition.md` |
@@ -28,7 +29,7 @@ better, plus one that is required only for user-facing work.
28
29
  |---|---|---|---|
29
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`) |
30
31
  | **context7** (MCP) | stage 1 docs study | Recommended (web-search fallback) | connect the context7 MCP server |
31
- | **wiki-update** | stage 9 wiki sync | Optional (skip wiki if absent) | user's wiki skill set |
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` |
32
33
  | ~~superpowers~~ | — | **Not a dependency.** Stages 2/4/5/6 run on the built-in doctrine above. See *Optional bridge* | — |
33
34
  | ~~grill-me / grilling~~ | — | **Not a dependency.** The stage-0 grill is built in (`references/grill.md`) | — |
34
35
 
@@ -60,7 +61,11 @@ Pipeline companions (stage doctrine is built in — nothing to install for it):
60
61
  /plugin marketplace add ssheleg/super-ux
61
62
  /plugin install super-ux@super-ux
62
63
  ✓ context7 — ready
63
- ✓ wiki-update — ready
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)
64
69
 
65
70
  🧠 Model for this run: recommended <top tier available>. You're on <current>.
66
71
  /model <id> to switch, or "keep current", or name per-stage overrides.
@@ -72,6 +77,10 @@ Rules:
72
77
 
73
78
  - Only flag **super-ux** when the task implies a UI (the stage-0 grill decides;
74
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)).
75
84
  - **Never gate any stage on an install** except the stage-3 UX track on a UI task.
76
85
  - Optional tools missing → state the fallback, don't block.
77
86
  - Re-detect after the operator installs; don't assume.
@@ -1,7 +1,10 @@
1
- # Host conventions (stages 6–10)
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,9 +33,20 @@ 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. Wiki: the `wiki-update` skill (resolves the vault via
35
- `~/.obsidian-wiki/config`). Fix dangling links.
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.
36
50
 
37
51
  ## Issue tracker (stage 10)
38
52
 
@@ -12,7 +12,27 @@ coming back to the operator.
12
12
  > half — glossary challenges, `CONTEXT.md`, ADR discipline — comes from there; the
13
13
  > autonomy sweep and the brief are this pipeline's.
14
14
 
15
- ## The loop
15
+ ## Phase 1 — harvest before you ask
16
+
17
+ **Do not open the interview cold.** Stage 0 begins by finding what the project
18
+ already knows about this task: the code, `CLAUDE.md`, `CONTEXT.md` and the ADRs,
19
+ `docs/` and `docs/ux/`, past pipeline briefs, the **knowledge wiki** when one is
20
+ installed, and any **other repository or hosted doc system the project names as
21
+ its docs**. Full procedure, source order, the wiki's detection and install line,
22
+ and the ledger to write: [`knowledge-sources.md`](knowledge-sources.md).
23
+
24
+ Two things come out of it, both required before question one:
25
+
26
+ - the **source ledger** in the brief — one row per source consulted, what it says
27
+ about this task, and how fresh it is (`no sources found` is a valid row);
28
+ - the list of things you therefore **don't need to ask**, and the specific points
29
+ where a source looks stale or ambiguous — those become the sharpest questions.
30
+
31
+ Everything below runs against that harvest. An answer you can't check against a
32
+ source is a recollection, and the whole loop exists to stop the run from building
33
+ on one.
34
+
35
+ ## Phase 2 — the loop
16
36
 
17
37
  Interview the operator relentlessly about every aspect of the task until you reach
18
38
  a **shared understanding**. Walk down each branch of the decision tree, resolving
@@ -73,6 +93,15 @@ Create these files **lazily** — only when you have something real to write.
73
93
  check whether the code agrees, and surface contradictions: *"Your code cancels
74
94
  entire Orders, but you just said partial cancellation is possible — which is
75
95
  right?"*
96
+ - **Cross-reference with the harvest — every answer, not just the domain ones.**
97
+ Phase 1 put the ADRs, runbooks and wiki pages in your hands; use them the same
98
+ way: *"The March ADR says orders are written only through the command handler,
99
+ you just described a direct write — has that changed?"* The operator **outranks
100
+ every document**, but only out loud: an override quoted against its source is a
101
+ recorded decision, an unquoted one is an undetected divergence. When two sources
102
+ disagree, precedence is code > host docs/ADRs > wiki > memory, and the loser is
103
+ logged for the stage-9 update ([`knowledge-sources.md`](knowledge-sources.md) →
104
+ *Phase 2*).
76
105
  - **Update `CONTEXT.md` inline.** Resolve a term → write it down right then, not in
77
106
  a batch at the end. Format: [`templates/context.md`](../templates/context.md).
78
107
  Keep it free of implementation detail — only terms a domain expert would
@@ -101,6 +130,7 @@ explicit "stop and ask me here":
101
130
  | Stage | What to settle up front |
102
131
  |---|---|
103
132
  | run-wide | the model decision ([`model-tiering.md`](model-tiering.md)); what to decide autonomously vs escalate |
133
+ | 0 Harvest | doc sources beyond this repo — other repos, hosted doc systems, the knowledge wiki — and whether stage 9 may write to them (another repo is outward: propose + PR, never a direct push) |
104
134
  | 1 Docs | external libs/APIs/SDKs in play; any private ones context7 can't resolve → where their docs live |
105
135
  | 2 Decompose | is this a platform (several capabilities/surfaces) or one module? if platform: deploy cadence — per module or once at the end |
106
136
  | 2–3 Spec | UI verdict (arms super-ux); any scenario-tracing waiver |
@@ -153,9 +183,12 @@ that shrank without anyone deciding it should.
153
183
  Everything resolved goes into the **task brief**, seeded from
154
184
  [`templates/brief.md`](../templates/brief.md) and committed to
155
185
  `docs/superpowers/specs/YYYY-MM-DD-<topic>-brief.md` — scope, **the REQ table**,
156
- users, UI verdict, constraints, locked decisions, the autonomy table,
157
- done-criteria, open assumptions. Seed the template only when the file is absent;
158
- never overwrite an existing brief.
186
+ **the phase-1 source ledger**, users, UI verdict, constraints, locked decisions,
187
+ the autonomy table, done-criteria, open assumptions. Seed the template only when
188
+ the file is absent; never overwrite an existing brief.
189
+
190
+ The ledger is not decoration: **stage 9 updates exactly what stage 0 read**, and
191
+ every doc the grill proved stale is already listed there with what's wrong.
159
192
 
160
193
  Alongside it, seed the **carry-over ledger** from
161
194
  [`templates/carryover.md`](../templates/carryover.md) at
@@ -0,0 +1,159 @@
1
+ # Knowledge sources — harvest before the grill, update after the build
2
+
3
+ Stage 0 has two phases. This file is **phase 1**: before the first question is
4
+ asked, find and read what the project already knows about this task. The interview
5
+ ([`grill.md`](grill.md)) is phase 2, and it runs *against* what was harvested here.
6
+
7
+ The same source list closes the loop at **stage 9**: what was read at the start is
8
+ what gets updated at the end. A source good enough to answer a question is a source
9
+ that goes stale when the answer changes.
10
+
11
+ ## Why this is a phase and not "explore a bit first"
12
+
13
+ An agent that starts asking without harvesting spends the operator's turns on
14
+ questions the project already answered — in an ADR, in a runbook, in a wiki page
15
+ written three months ago by the same person now being asked. That is the expensive
16
+ failure, but not the worst one.
17
+
18
+ The worst one is silent: **the operator misremembers, the agent believes them, and
19
+ the run builds on it.** People answer from memory about systems they wrote a year
20
+ ago. Without the documents in hand you cannot tell a decision from a recollection,
21
+ so every later gate passes honestly on a false premise. Harvesting first is what
22
+ makes the grill's answers *checkable* instead of merely confident.
23
+
24
+ ## The sources, in the order to try them
25
+
26
+ | # | Source | How to find it | What it's good for |
27
+ |---|---|---|---|
28
+ | 1 | **The code** | the repo you're in | what actually runs — the tiebreaker |
29
+ | 2 | **Host agent docs** | `CLAUDE.md`, `AGENTS.md`, `.cursor/rules/` | conventions, commands, deploy path, house rules |
30
+ | 3 | **Domain docs** | `CONTEXT.md` / `CONTEXT-MAP.md`, `docs/adr/` | the glossary and the decisions with their reasons |
31
+ | 4 | **Product/UX docs** | `docs/ux/` (super-ux chain), `README`, runbooks | user-facing behavior that is already specified |
32
+ | 5 | **Pipeline history** | `docs/superpowers/specs/`, `plans/`, past `-carryover.md` | what a previous run of this pipeline decided or deferred |
33
+ | 6 | **The knowledge wiki** | see below | distilled cross-project knowledge, prior sessions, why decisions were made |
34
+ | 7 | **Other doc repos the project names** | a docs repo URL or submodule in `CLAUDE.md`/`README`, a sibling checkout, a `docs/` monorepo package | specs, contracts and runbooks that live outside this repo |
35
+ | 8 | **Hosted doc systems the project names** | Notion / Confluence / Google Docs referenced in the project | the same, when the team keeps them there |
36
+
37
+ Rules for the list:
38
+
39
+ - **Never invent a source.** A doc repo is in scope because the project names it,
40
+ not because it plausibly exists. Nothing is cloned or fetched on a guess.
41
+ - **Sources 7–8 are read-only at this stage**, and reading a hosted system needs a
42
+ connected tool — if there's no tool, record the gap and ask the operator to paste
43
+ what matters rather than pretending the source was covered.
44
+ - **The wiki is optional; the harvest is not.** With no wiki and no doc repos, the
45
+ harvest is sources 1–5 and takes two minutes. Skipping it is never the answer.
46
+
47
+ ## The knowledge wiki — recommended
48
+
49
+ The wiki this pipeline is built to work with is
50
+ **[obsidian-wiki](https://github.com/ar9av/obsidian-wiki)** (Karpathy's LLM-wiki
51
+ pattern: raw sources → distilled wiki → schema). It is the one source that carries
52
+ *why* across projects and across months, which is exactly what a fresh context lacks.
53
+
54
+ **Detect it** — any of: `~/.obsidian-wiki/config` exists; the `wiki-query` /
55
+ `wiki-update` skills resolve.
56
+
57
+ - **Installed → use it.** Query it during the harvest (`wiki-query`, or the vault's
58
+ `index.md` + a targeted grep when the skill isn't loaded), and sync back at stage
59
+ 9 (`wiki-update`).
60
+ - **Not installed → recommend it once, in the preflight block, with the line:**
61
+
62
+ ```
63
+ pip install obsidian-wiki
64
+ obsidian-wiki setup --vault /path/to/your/vault
65
+ ```
66
+
67
+ Then continue without it. It is a **recommendation, never a gate** — no stage
68
+ blocks on a missing wiki, and the pipeline never nags twice in a run.
69
+
70
+ ## How to harvest — retrieval, not reading
71
+
72
+ The harvest is bounded by the *task*, not by the size of the sources. You are not
73
+ reading the wiki; you are asking it about this task.
74
+
75
+ 1. **Take the task's nouns** — the entities, the feature name, the subsystem, the
76
+ file paths the operator mentioned — plus their obvious synonyms.
77
+ 2. **Query each source with those terms**: `wiki-query` for the wiki; `grep`/`Read`
78
+ for repo docs; the tracker/hosted-doc tool if one is connected.
79
+ 3. **Follow one hop, not ten.** A hit that names an ADR, a scenario id or a module
80
+ is worth opening. A page three links away is context, not evidence.
81
+ 4. **Stop when the terms stop returning anything new.** Same rule as the interview:
82
+ no grinding past diminishing returns.
83
+
84
+ ## Record it — the source ledger
85
+
86
+ Write what you found into the brief's **Knowledge sources** section
87
+ ([`templates/brief.md`](../templates/brief.md)) before the first question. One row
88
+ per source actually consulted:
89
+
90
+ | Source | What it says about this task | Fresh? | Authority |
91
+ |---|---|---|---|
92
+ | `docs/adr/0007-single-write-model.md` | orders are written only through the command handler | 2026-03 | decision |
93
+ | wiki: `projects/x/concepts/billing-seams` | why invoicing was split out; the retry rule | 2026-06 | context |
94
+ | `CLAUDE.md` | test = `npm test`, deploy from `main` only | current | convention |
95
+ | (none for the export UI) | — | — | — |
96
+
97
+ The ledger is what makes phase 2 work: during the interview you cite rows from it,
98
+ and at stage 9 you update the same rows. A source consulted but not recorded is a
99
+ source nobody will update.
100
+
101
+ **"No sources found" is a valid, recorded outcome.** Write the row. An empty ledger
102
+ tells the next run that the search happened and came back empty — silence doesn't.
103
+
104
+ ## Phase 2 — validate the answers against the harvest
105
+
106
+ This is the payoff, and it belongs to the grill loop
107
+ ([`grill.md`](grill.md) → *Domain awareness*). Every operator answer that touches a
108
+ harvested source gets checked against it, on the spot:
109
+
110
+ > "The ADR from March says orders are written only through the command handler —
111
+ > you just described a direct write. Has that changed, or should the export go
112
+ > through the handler?"
113
+
114
+ Three shapes and what to do with each:
115
+
116
+ | The answer… | Do |
117
+ |---|---|
118
+ | **agrees** with the source | nothing — note it, move on |
119
+ | **contradicts** a source | quote the source, name the conflict, ask which governs. The answer is either "the doc is stale" (→ it gets updated at stage 9, log it now) or "I misremembered" (→ the doc stands). Both are cheap here and expensive at stage 6 |
120
+ | **goes beyond** every source | this is new knowledge — it belongs in the brief, and usually in `CONTEXT.md` or an ADR as it lands |
121
+
122
+ **The operator outranks the docs — but only out loud.** A person may overrule any
123
+ document; they may not do it by accident. The point of quoting the source is that
124
+ the override becomes a recorded decision instead of an undetected divergence.
125
+
126
+ **Precedence when two sources disagree with each other:** code > host docs and
127
+ ADRs > the wiki > anyone's memory. The wiki is *distilled* knowledge and can lag
128
+ the repo by months; the code is what runs. A disagreement between them is a grill
129
+ question, never a silent pick — and it is usually a sign the doc is due an update.
130
+
131
+ ## Close the loop — stage 9 updates what stage 0 read
132
+
133
+ The ledger is the stage-9 work list. For each row:
134
+
135
+ - **Host repo docs, ADRs, runbooks, `docs/ux/`** — updated in the **same change**,
136
+ per the host's own rules ([`conventions.md`](conventions.md)).
137
+ - **Anything the run proved stale** — including a doc that was "wrong but nobody
138
+ had time": that's why the conflict was logged in phase 2 instead of only being
139
+ resolved verbally.
140
+ - **The wiki** — `wiki-update` syncs what this run learned. Distil the *knowledge*
141
+ (decisions, seams, gotchas, why), never a diff summary.
142
+ - **Another repository's docs** — writing to a repo the operator didn't ask you to
143
+ touch is **outward**: propose the change, get an explicit go, then open a PR
144
+ there. Absent a go, it goes in the carry-over ledger with the exact edit needed.
145
+
146
+ A source that was worth reading at stage 0 and is wrong at stage 9 is the next
147
+ run's false premise. Closing that loop is the whole point of harvesting from a
148
+ written list instead of from whatever the search happened to surface.
149
+
150
+ ## Rationalizations
151
+
152
+ | Excuse | Reality |
153
+ |---|---|
154
+ | "I'll just ask them, it's faster" | You'll ask about things a doc already answers, and you'll believe an answer you can't check. Retrieval is cheaper than a turn. |
155
+ | "The wiki's probably stale" | Then say so with the page in hand and get it corrected. "Probably stale" unread is an assumption; read, it's a finding. |
156
+ | "No docs in this repo" | Check `CLAUDE.md` for the repo that has them, and the wiki for the last time anyone touched this. Then record the empty ledger. |
157
+ | "The operator knows their own system" | They do — a year ago, before three other people changed it. That's the exact case where quoting the doc pays. |
158
+ | "Reading the whole wiki costs too much" | The harvest is a query per task noun, not a read. If it feels expensive, you're reading instead of retrieving. |
159
+ | "I'll update the docs at the end from memory" | The ledger exists because the end is exactly when you no longer remember which sources you leaned on. |
@@ -21,9 +21,11 @@ brief and the spec.
21
21
 
22
22
  ## Before writing tasks
23
23
 
24
- **Scope check.** If the spec covers several independent subsystems, split it into
25
- one plan per subsystem; each plan must produce working, testable software on its
26
- own.
24
+ **Scope check.** A plan covers exactly **one** spec — for a decomposed platform,
25
+ one module's dossier ([`decomposition.md`](decomposition.md)). If the spec in front
26
+ of you covers several independent subsystems, the decomposition was missed at stage
27
+ 2: say so and go back there for a module map, rather than inventing the split here.
28
+ Whatever this plan covers must produce working, testable software on its own.
27
29
 
28
30
  **Map the file structure.** List every file that will be created or modified and
29
31
  what each one owns. This is where decomposition gets locked in:
@@ -29,7 +29,8 @@ this plan's git-ignored directory, `.task-pipeline/build/<plan-basename>/` — s
29
29
  `BASE` is the commit you recorded **before** dispatching the implementer — never
30
30
  `HEAD~1`, which silently drops every commit but the last of a multi-commit task.
31
31
  For a scoped re-review, `BASE` is the head the previous review saw. For the final
32
- review, `BASE` is `git merge-base main HEAD`.
32
+ review, `BASE` is `git merge-base "$BASE_BRANCH" HEAD` — the base branch recorded
33
+ in the stage-0 brief, which is not always `main`.
33
34
 
34
35
  Never dispatch a reviewer without a diff file.
35
36