task-pipeline-skill 1.4.4 → 1.6.1

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.
Files changed (22) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/README.md +120 -4
  3. package/cursor/rules/task-pipeline.mdc +62 -7
  4. package/package.json +1 -1
  5. package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
  6. package/plugins/task-pipeline/commands/task-pipeline.md +12 -6
  7. package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +38 -6
  8. package/plugins/task-pipeline/skills/task-pipeline/pipeline.example.json +15 -10
  9. package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +31 -0
  10. package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +10 -3
  11. package/plugins/task-pipeline/skills/task-pipeline/references/audit.md +8 -0
  12. package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +15 -0
  13. package/plugins/task-pipeline/skills/task-pipeline/references/conventions.md +6 -0
  14. package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +3 -3
  15. package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-graph.md +159 -0
  16. package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +67 -10
  17. package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +8 -0
  18. package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +117 -0
  19. package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +42 -7
  20. package/plugins/task-pipeline/skills/task-pipeline/templates/README.md +11 -5
  21. package/plugins/task-pipeline/skills/task-pipeline/templates/brief.md +14 -6
  22. package/plugins/task-pipeline/skills/task-pipeline/templates/retro.md +51 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,144 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.6.1 — 2026-08-01
4
+
5
+ ### Fixed — v1.6.0 shipped without `displayName`, because a release lived only on a tag
6
+
7
+ **`v1.4.4` was tagged, released and published to npm, and its commit was never in
8
+ `main`.** It added `displayName` ("Task Pipeline") to both manifests — the label the
9
+ plugin picker shows. Every branch cut from `main` afterwards therefore started from a
10
+ tree that had never seen it, and v1.6.0 published a manifest without the field,
11
+ quietly returning the picker to the kebab-case `name`.
12
+
13
+ Nothing inside either record looked wrong: `main` was consistent with itself, the tag
14
+ was consistent with itself, CI was green on both, and the registry served a 1.4.4 no
15
+ branch contained. That is the same shape as the parent/submodule pointer this
16
+ project's own stage-10 doctrine already guards against — **a disagreement that lives
17
+ between two records and survives every check that runs inside one.**
18
+
19
+ - `displayName` restored, and the v1.4.4 section restored to this file. The fix is a
20
+ **merge of the tag**, not a re-typed field: copying the content back would have
21
+ left the tag still outside `main`, which is the condition that caused this.
22
+ - **CI now refuses an orphaned release:** every `v*` tag must be an ancestor of
23
+ `main`, checked on every push. The next tag that lands outside the branch is a red
24
+ build, not a feature that disappears three releases later.
25
+ - **The validator now rejects unresolved merge conflict markers.** Resolving the
26
+ merge above surfaced it: a `CHANGELOG.md` carrying three `<<<<<<<` markers passed
27
+ every existing check, because they all look at structure and none at the text. In a
28
+ repo that is almost entirely prose, a half-resolved merge ships as doctrine an
29
+ agent reads and obeys. (34 guards now, each with its negative self-test; the
30
+ tag-ancestry check is a CI step rather than a validator guard, since it needs git
31
+ history the offline validator does not have.)
32
+
33
+ ## v1.6.0 — 2026-08-01
34
+
35
+ ### `references/retrospective.md` — the run teaches the next run, and the list stays short
36
+
37
+ Every gate in this flow is good at *this* run and blind across runs. So a class of
38
+ failure gets caught, fixed and forgotten five times, and nothing in the pipeline
39
+ notices it is the same one. The ladder walk finds what was never written **inside** a
40
+ run; nothing was looking across them.
41
+
42
+ Stage 10 now ends with a **retrospective** written to `docs/superpowers/retro.md` —
43
+ **one file per project, not per run**, seeded from the new `templates/retro.md`.
44
+ Every run prunes and stamps; only a run that *diverged* writes an entry, and the
45
+ entry names the stage that **owned** the failure rather than the stage that tripped
46
+ over it — recording it against the latter is how the same defect comes back.
47
+
48
+ **Fixes have three grades, and the highest one that works is the one you take:** a
49
+ mechanical check (a test, a lint rule, a gate criterion — the check *is* the memory,
50
+ so nothing has to be remembered or pruned later), a **standing instruction** for
51
+ what no check can decide, or a note that expires in two runs.
52
+
53
+ **The part that makes it survive: the prune is mandatory and runs before anything is
54
+ added.** Every standing instruction is checked against three retirement triggers —
55
+ it became a check · every path or command it names is gone · it has not fired in the
56
+ last five run stamps — and the list is held to a **hard cap of ten**. At eleven, the
57
+ oldest never-fired rule goes. "But they all matter" is precisely the state in which
58
+ the list stopped being read, and the ninth stale rule is what discredits the two that
59
+ are load-bearing.
60
+
61
+ Nothing leaves silently: **every retirement writes one line in the log**, so the
62
+ incident survives and only the instruction goes. The counts print beside the gate
63
+ verdict like the carry-over ledger's, so a list that quietly grew back is visible
64
+ where it happened.
65
+
66
+ Stage 0 reads the standing instructions **in full** (they are capped, so it is
67
+ cheap) and stamps each one as it fires — which is the only evidence behind the
68
+ cold-retirement rule. Without that stamp the prune is a mood.
69
+
70
+ Three new guards, each with its negative self-test: the retro must reach the
71
+ surfaces that *enforce* stage 10 — not just `SKILL.md`; the template must ship; and
72
+ its standing-instruction table must carry a **Retire when** column and the run
73
+ stamps. A retirement trigger written at birth is what makes the prune mechanical
74
+ instead of an argument every time.
75
+
76
+ ### Also in this release — what an audit of the two features found
77
+
78
+ Both features were then walked against the tools they name, which is the only way
79
+ this class of defect surfaces:
80
+
81
+ - **The refresh command was wrong, in thirteen files.** `graphify . --update` was
82
+ documented as a shell command. Run, it does not do what the text claims: the CLI's
83
+ incremental form is `graphify update <path>` and it re-extracts **code only**,
84
+ while `/graphify . --update` is the *agent* form that also re-reads the documents.
85
+ Stage 9 is the stage that just changed the documents, so the shortcut would have
86
+ produced the most expensive kind of stale graph — one that was refreshed. Both
87
+ forms are now documented with the distinction spelled out, and the doctrine says
88
+ which is the default and why.
89
+ - **Three stages pointed at doctrine that does not exist.** In the example config a
90
+ `task-pipeline:<name>` entry *is* the built-in doctrine file `references/<name>.md`
91
+ — and `knowledge-harvest`, `decompose` and `plan` resolved to nothing. It read as
92
+ covered on every review. Fixed, and now a **guard** resolves every such entry
93
+ (33 guards total, all provable locally).
94
+ - **The retro is a seeded file, and the templates README said only the brief was.**
95
+ The seeding rule matters most there: overwriting `retro.md` with the skeleton
96
+ destroys every lesson the project has bought. Stated explicitly.
97
+ - **The harvest source list is renumbered** (the retro's standing instructions are
98
+ source 7, read *in full* rather than queried) and the graph doctrine now says
99
+ plainly that `affected`/`path` are sharp on a code repo and near-useless on a prose
100
+ one — an empty traversal there is not evidence of no coupling.
101
+
102
+ ## v1.5.0 — 2026-08-01
103
+
104
+ ### `references/knowledge-graph.md` — the code graph as a source, and as a second opinion
105
+
106
+ A grep finds a **name**. The questions that actually stop a run are *what calls this*
107
+ and *what breaks if it moves* — **reach** — and reach is exactly what a document
108
+ records least reliably, because it records the reach its author remembered. The
109
+ harvest had no way to ask that question, so it asked the operator, whose answer
110
+ nobody could check.
111
+
112
+ So the pipeline now uses a code graph where one exists
113
+ ([graphify](https://github.com/Graphify-Labs/graphify) — detected via
114
+ `graphify-out/graph.json`; recommended, never a gate, exactly like the wiki, with its
115
+ install line printed once in the preflight block).
116
+
117
+ **Stage 0** queries it before the interview (`graphify query` / `affected` /
118
+ `god-nodes`) and records it in the source ledger **with its build date** — a graph
119
+ goes stale like any other source, and it points while the code decides.
120
+
121
+ **Stage 9 now closes three artifacts, not two:** docs, wiki, **and the graph**
122
+ (`/graphify . --update`). The reason it is a peer rather than an afterthought is
123
+ asymmetric: the next run's harvest queries the graph *first*, so a stale graph is a
124
+ false premise delivered with the authority of a machine. A wrong doc gets argued
125
+ with; a wrong graph gets believed.
126
+
127
+ **And then the part that finds things: the graph↔docs divergence check.** Two
128
+ independent statements of the same system, so a disagreement is mechanical instead of
129
+ remembered — a hub `god-nodes` reports that no document names is an undocumented
130
+ seam; an edge the docs deny is either a leak in the code or a lie in the docs; a doc
131
+ naming a module the graph has no node for describes something that no longer exists.
132
+ Doc-side findings are fixed at stage 9; **absences become REQ rows at stage 10**,
133
+ because this is a fourth audit axis (`references/audit.md`) and the only one that
134
+ finds an absence without reading for it. The graph is derived, so it is never
135
+ hand-edited: fix the code or the doc and re-extract.
136
+
137
+ Two new guards, both with negative self-tests: a
138
+ shipped graph doctrine must reach the **stage-9 gate** in `pipeline.example.json`
139
+ *and* the stage-9 section of `references/stages.md`. That is the third time this repo
140
+ has shipped a rule to `SKILL.md` and not to the surface that enforces it — a gate
141
+ declared where it is not enforced is inert.
3
142
  ## v1.4.4 — 2026-07-30
4
143
 
5
144
  ### Added
package/README.md CHANGED
@@ -67,8 +67,8 @@ Every gate is **typed**: `auto` — the orchestrator verifies it itself, pass/fa
67
67
  | 6 | Tests | full suite green, new code covered | auto |
68
68
  | 7 | Lint + deploy | lint clean + suite green before deploy | manual |
69
69
  | 8 | Post-deploy | clean boot / honest degradation | auto |
70
- | 9 | Docs + wiki | every stale source-ledger row updated; docs + wiki synced | auto |
71
- | 10 | **Acceptance** | every REQ accounted for with evidence; operator signs off | manual |
70
+ | 9 | Docs + wiki | every stale source-ledger row updated; docs + wiki synced; the code graph refreshed and checked against the docs | auto |
71
+ | 10 | **Acceptance** | every REQ accounted for with evidence; operator signs off; the retro written — pruned before anything was added | manual |
72
72
 
73
73
  ## What you get
74
74
 
@@ -84,6 +84,10 @@ Every gate is **typed**: `auto` — the orchestrator verifies it itself, pass/fa
84
84
  wiki entry — produced as part of the work, not promised for later.
85
85
  - **It adapts to your repo, not the reverse.** Deploy, docs and wiki conventions
86
86
  are read from the host project, so nothing is imposed.
87
+ - **It gets better at your project, without getting longer.** Each run ends with a
88
+ retrospective, and the next run reads it — but the standing-instruction list is
89
+ capped at ten and pruned *before* anything is added, so what you inherit is the
90
+ rules that still fire, not an archive.
87
91
 
88
92
  ## Quickstart
89
93
 
@@ -163,7 +167,8 @@ Stage 0 doesn't open with a question. It opens by finding what the project alrea
163
167
  knows about this task
164
168
  ([`knowledge-sources.md`](plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md)):
165
169
  the code, `CLAUDE.md`, `CONTEXT.md` and the ADRs, `docs/` and `docs/ux/`, previous
166
- pipeline briefs and their carry-over ledgers, **the knowledge wiki if you have one**,
170
+ pipeline briefs and their carry-over ledgers, **the retro's standing instructions**
171
+ (read in full — they bind the run; see below), **the knowledge wiki if you have one**,
167
172
  and **any other repository or hosted doc system your project names as its docs**. It's
168
173
  retrieval scoped by the task's own nouns, not a read of everything, and it ends with a
169
174
  **source ledger** written into the brief — one row per source, what it says, how
@@ -199,6 +204,70 @@ obsidian-wiki setup --vault /path/to/your/vault
199
204
  It is a **recommendation, never a gate** — no stage blocks on a missing wiki, and
200
205
  nothing asks twice in one run.
201
206
 
207
+ ### The code graph — reach, and a second opinion on your docs
208
+
209
+ A grep finds a **name**. A graph finds **reach**: what actually calls this, what
210
+ breaks if it moves, what every change passes through. That is the question stage 0
211
+ needs answered before it asks you anything, and the one documents answer least
212
+ reliably — a document records the reach its author remembered.
213
+
214
+ So where a code graph exists, the pipeline uses it
215
+ ([`knowledge-graph.md`](plugins/task-pipeline/skills/task-pipeline/references/knowledge-graph.md)).
216
+ The tool is **[graphify](https://github.com/Graphify-Labs/graphify)**; detected via
217
+ `graphify-out/graph.json`. Not installed → recommended once, in the preflight block,
218
+ with the lines — then the run continues:
219
+
220
+ ```bash
221
+ uv tool install graphifyy # the CLI
222
+ graphify install # add the /graphify skill to this agent
223
+ ```
224
+
225
+ then, in the project root:
226
+
227
+ ```
228
+ /graphify .
229
+ ```
230
+
231
+ **Stage 0 asks it what grep can't** — `graphify query "how does session reach the
232
+ API layer"`, `graphify affected "AuthModule"`, `graphify god-nodes` — and records it
233
+ in the source ledger **with its build date**, because a graph goes stale exactly like
234
+ a doc. It points; the code decides.
235
+
236
+ **Stage 9 closes three artifacts, not two.** Docs, wiki, **and the graph** — in the
237
+ agent, so the documents this stage just edited are re-extracted too:
238
+
239
+ ```
240
+ /graphify . --update
241
+ ```
242
+
243
+ There is a CLI shortcut, `graphify update .`, which is structural, model-free and
244
+ **code-only** — the wrong default at the one stage whose job was changing the docs,
245
+ because it produces the most expensive kind of stale graph: one that was refreshed.
246
+ And the reason the graph is a peer of the docs rather than an afterthought: the
247
+ *next* run's harvest queries it first, so a stale graph is a false premise delivered
248
+ with the authority of a machine. A wrong doc gets argued with. A wrong graph gets
249
+ believed.
250
+
251
+ **Then the divergence check — two independent statements of the same system.** This
252
+ is the part a doc linter cannot do, because it compares your docs against the code's
253
+ actual shape rather than against itself:
254
+
255
+ | Ask the graph | A disagreement means |
256
+ |---|---|
257
+ | `graphify god-nodes` | a hub **no document names** — an undocumented seam: the thing every change passes through and nothing explains |
258
+ | `graphify path "A" "B"` | an edge the docs **deny** — either a leak in the code or a lie in the docs, and which one is a decision, not a guess |
259
+ | `graphify affected "X"` | callers the docs never mention — the documented blast radius is smaller than the real one |
260
+ | a doc naming a module the graph has **no node for** | the doc describes something that no longer exists |
261
+
262
+ Doc-side findings are fixed at stage 9. Absences go to stage 10's ladder walk and
263
+ become **REQ rows with their checks** — the graph is the fourth audit axis, and the
264
+ only one that finds an absence without reading for it. The graph is *derived*, so it
265
+ is never hand-edited and `graphify-out/` is git-ignored by default: you fix the code
266
+ or the doc and re-extract.
267
+
268
+ Cadence: refresh every close-out, sweep periodically (stage 10, or when another axis
269
+ goes quiet). Like the wiki, it is a **recommendation, never a gate**.
270
+
202
271
  ### The REQ spine — why nothing falls out the back
203
272
 
204
273
  Every gate before the last one asks *"is this artifact good?"* — none asks *"does
@@ -338,6 +407,50 @@ fail, you don't know it tests the right thing* — raised from one test to every
338
407
  gate, linter and script in the run. **A green result from an unproven check is
339
408
  worth nothing.**
340
409
 
410
+ ### The retrospective — the run teaches the next run, and the list stays short
411
+
412
+ Every gate in this flow is good at *this* run and blind across runs. So the same
413
+ class of failure gets caught, fixed and forgotten five times, and nothing in the
414
+ pipeline notices it is the same one.
415
+
416
+ The last act of stage 10 is therefore a **retrospective**, written to
417
+ `docs/superpowers/retro.md` — **one file per project, not per run**
418
+ ([`retrospective.md`](plugins/task-pipeline/skills/task-pipeline/references/retrospective.md)).
419
+ Every run **prunes and stamps**; only a run that *diverged* writes an entry:
420
+ symptom with evidence, the stage it surfaced at, the stage that **owned** it, the
421
+ root cause, the fix, and the check that catches it the first time from now on.
422
+
423
+ **Fixes come in three grades, and you take the highest one that works:**
424
+
425
+ | Grade | What it is | What it costs later |
426
+ |---|---|---|
427
+ | 1 — mechanical | a test, a lint rule, a gate criterion, a hook | nothing: the check *is* the memory |
428
+ | 2 — standing instruction | a rule agents read, for what no check can decide | one of ten slots, and its retirement trigger must be written at birth |
429
+ | 3 — a note | something still being understood | expires in two runs, then it is promoted or deleted |
430
+
431
+ **The prune is mandatory and runs before anything is added.** Every standing
432
+ instruction is checked against three retirement triggers — *it became a check* ·
433
+ *every path or command it names is gone* · *it has not fired in the last five run
434
+ stamps* — and the list is held to a **hard cap of ten**. At eleven, the oldest
435
+ never-fired rule goes; "but they all matter" is exactly the state in which the list
436
+ stopped being read, and the ninth stale rule is what discredits the two that are
437
+ load-bearing.
438
+
439
+ Nothing is deleted silently: **every retirement writes one line in the log**, so
440
+ the incident survives and only the instruction leaves. And the counts print beside
441
+ the gate verdict, like the carry-over ledger's, so a list that quietly grew back is
442
+ visible where it happened:
443
+
444
+ ```
445
+ GATE 10 acceptance: PASS — 14/14 REQ verified
446
+ carry-over: 0 unresolved · retro: 7 standing (was 9) · retired 3 · added 1
447
+ ```
448
+
449
+ Stage 0 reads those standing instructions **in full** on the next run — which is
450
+ the whole reason the cap exists and the prune is a gate criterion instead of a good
451
+ intention. A rule nobody reads to the end is worse than no rule: everyone believes
452
+ it is covered.
453
+
341
454
  ### UX track (user-facing tasks) — super-ux recommended
342
455
 
343
456
  The moment a task touches any user-facing surface (web / mobile / CLI / TUI — a
@@ -517,13 +630,14 @@ the same Claude Code install yields a duplicate, shadowing skill.
517
630
  ### Prerequisites
518
631
 
519
632
  **None for the pipeline itself** — the doctrine for every stage ships inside the
520
- skill. Three optional companions make individual stages better:
633
+ skill. Four optional companions make individual stages better:
521
634
 
522
635
  | Companion | For | Required? |
523
636
  |---|---|---|
524
637
  | [super-ux](https://github.com/ssheleg/super-ux) | the stage-3 UX track | only for user-facing tasks |
525
638
  | context7 (MCP) | stage-1 docs study | recommended — web-search fallback |
526
639
  | [obsidian-wiki](https://github.com/ar9av/obsidian-wiki) | stage-0 harvest + stage-9 sync | recommended — never a gate |
640
+ | [graphify](https://github.com/Graphify-Labs/graphify) | stage-0 reach queries + stage-9 refresh + the graph↔docs divergence check | recommended — never a gate |
527
641
 
528
642
  A single preflight block prints which are ready, which to install, and the model
529
643
  recommendation, so you arm the whole run in one exchange. Detail:
@@ -539,6 +653,8 @@ recommendation, so you arm the whole run in one exchange. Detail:
539
653
  | [`references/stages.md`](plugins/task-pipeline/skills/task-pipeline/references/stages.md) | per-stage detail and the exact gate criteria |
540
654
  | [`references/artifacts.md`](plugins/task-pipeline/skills/task-pipeline/references/artifacts.md) | the canonical document layout each stage writes to |
541
655
  | [`references/conventions.md`](plugins/task-pipeline/skills/task-pipeline/references/conventions.md) | how stages 6–10 read the host project's `CLAUDE.md` |
656
+ | [`references/knowledge-graph.md`](plugins/task-pipeline/skills/task-pipeline/references/knowledge-graph.md) | the code graph: install line, stage-0 reach queries, the stage-9 refresh, the graph↔docs divergence check |
657
+ | [`references/retrospective.md`](plugins/task-pipeline/skills/task-pipeline/references/retrospective.md) | the project retro: the three grades of fix, the mandatory prune, the cap of ten |
542
658
  | [`references/model-tiering.md`](plugins/task-pipeline/skills/task-pipeline/references/model-tiering.md) | model policy, the `/model` reminder, overrides |
543
659
  | [`templates/`](plugins/task-pipeline/skills/task-pipeline/templates/README.md) | brief, carry-over ledger, `CONTEXT.md` and ADR skeletons |
544
660
  | [`CHANGELOG.md`](CHANGELOG.md) | every release, with the reasoning behind it |
@@ -31,7 +31,11 @@ task was already clear" exemption, no starting stage 1 while the user thinks. A
31
31
  one-line task ("build feature X") is not enough to finish autonomously.
32
32
 
33
33
  **Phase 1 — harvest the sources BEFORE the first question.** Find what the project
34
- already knows about this task and read it: the code; `CLAUDE.md` / `AGENTS.md`;
34
+ already knows about this task and read it: the code; **the code graph if one is
35
+ built** — [graphify](https://github.com/Graphify-Labs/graphify), detect
36
+ `graphify-out/graph.json`, and ask it what grep cannot (`graphify query "<the task,
37
+ as a question>"`, `graphify affected "<what is changing>"`, `graphify god-nodes`);
38
+ `CLAUDE.md` / `AGENTS.md`;
35
39
  `CONTEXT.md` (or `CONTEXT-MAP.md`) and `docs/adr/`; `docs/` and `docs/ux/`; past
36
40
  briefs/plans and their carry-over ledgers; **the knowledge wiki if one is
37
41
  installed** — [obsidian-wiki](https://github.com/ar9av/obsidian-wiki), detect
@@ -40,10 +44,18 @@ or hosted doc system the project names as its docs** (read-only, and never a sou
40
44
  you invented — it counts because the project names it). Query each by *this task's*
41
45
  nouns; it is retrieval, not a full read; stop when the terms return nothing new.
42
46
  Write a short **source ledger** into the brief — source, what it says about this
43
- task, how fresh, and whether this run makes it stale. `none found` is a valid row.
47
+ task, how fresh, and whether this run makes it stale. `none found` is a valid row;
48
+ the graph's row carries its build date, because a graph goes stale like any other
49
+ source, and it **points while the code decides** — never the tiebreaker.
50
+ **Read `docs/superpowers/retro.md` in full if it exists** — its *standing
51
+ instructions* are what previous runs of this pipeline got wrong in this project, and
52
+ they bind this run (they are capped at ten, so reading them all is cheap). Stamp
53
+ each one the moment it fires: that date is the only evidence behind the
54
+ cold-retirement rule at stage 10.
44
55
  If no wiki is installed, recommend it once and continue:
45
- `pip install obsidian-wiki` → `obsidian-wiki setup --vault <path>`. It is never a
46
- gate.
56
+ `pip install obsidian-wiki` → `obsidian-wiki setup --vault <path>`. If no graph is
57
+ built, recommend it once and continue: `uv tool install graphifyy` →
58
+ `graphify install` → `/graphify .`. Neither is ever a gate.
47
59
 
48
60
  **Phase 2 — grill the user against that harvest**, then run the rest without
49
61
  mid-flight questions:
@@ -172,7 +184,18 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
172
184
  source the harvest read gets updated if this run changed or disproved it. Module
173
185
  docs and runbooks in the SAME change; the knowledge wiki via `wiki-update` when
174
186
  [obsidian-wiki](https://github.com/ar9av/obsidian-wiki) is installed (absent →
175
- recommend once, never block). Docs in **another repository** are outward:
187
+ recommend once, never block); **and the code graph via `/graphify . --update`**
188
+ when `graphify-out/` exists (absent → recommend once, never block). The close-out
189
+ has **three** artifacts, not two — the graph is what the *next* run's harvest
190
+ queries first, so a stale one is a false premise carrying the authority of a
191
+ machine: a wrong doc gets argued with, a wrong graph gets believed.
192
+ **Then check the graph against the docs:** a hub `graphify god-nodes` reports
193
+ that no document names is an undocumented seam; an edge the docs deny is either a
194
+ leak in the code or a lie in the docs; a doc naming a module the graph has no
195
+ node for describes something that no longer exists. Fix the doc-side findings
196
+ here; hand absences to stage 10's ladder walk as REQ rows. Never "fix" the graph
197
+ by hand — it is derived: fix the code or the doc and re-extract.
198
+ Docs in **another repository** are outward:
176
199
  propose the edit and get an explicit go, or carry it over with the exact change
177
200
  written down. A doc that was worth reading at stage 0 and is wrong now is the
178
201
  next run's false premise.
@@ -223,8 +246,37 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
223
246
  `git -C <repo> status --porcelain`, `git -C <repo> log @{u}..HEAD --oneline`.
224
247
  The fix is two commands and the second is the one that gets forgotten:
225
248
  `git -C <submodule> push`, then `git add <submodule> && git commit`.
249
+ **The last act is the retrospective** — `docs/superpowers/retro.md`, **one file
250
+ per project, not per run**. Every gate above is good at *this* run and blind
251
+ across runs: the same class of failure gets caught, fixed and forgotten five
252
+ times and nothing notices it is the same one. So, in this order —
253
+ **1. Prune before you add.** Check every standing instruction against three
254
+ retirement triggers: it became a check (a test, a lint rule, a gate, a hook →
255
+ delete it; the check is the memory, and keeping both means it is read twice and
256
+ obeyed once); every path, command or stage it names is gone (→ delete, it
257
+ describes a system nobody runs); it has not fired in the last **five run
258
+ stamps** (→ delete, that is the evidence it was situational). Then the cap:
259
+ **ten standing instructions, hard** — at eleven the oldest never-fired row goes,
260
+ because "they all matter" is exactly the state in which the list stopped being
261
+ read. **Every deletion writes one line in the log; silent deletion is
262
+ forbidden** — the record stays, the instruction leaves.
263
+ **2. Stamp the run** — date, topic, verdict, counts. That stamp is what makes
264
+ "five runs" countable.
265
+ **3. Write an entry, only if the run diverged** — symptom with evidence, the
266
+ stage it *surfaced at*, the stage that **owned** it (usually earlier — a finding
267
+ recorded against the stage that tripped over it comes back), the root cause
268
+ ("the agent was careless" is not a cause, it is the absence of one), the fix by
269
+ grade — **mechanical check > standing instruction (with its retire-when written
270
+ at birth) > a note that expires in two runs** — and the check that catches it
271
+ the first time from now on. A lesson true in any repository belongs upstream in
272
+ the skill's own doctrine, not in one project's file.
273
+ A retro left empty after a messy run is the failure it exists to stop. Phase 1
274
+ of the next run reads those standing instructions **in full**, which is why the
275
+ cap is not negotiable and the prune is a gate item, not a good intention.
226
276
  Gate: ladder walk ran, no REQ `unknown`, no ledger row without
227
- a home, every repository clean/pushed/pointed-at, user signs off.
277
+ a home, every repository clean/pushed/pointed-at, user signs off, **and the
278
+ retro is written — pruned before anything was added, at or under its cap, every
279
+ deletion logged, the run stamped, and the counts printed beside this verdict**.
228
280
 
229
281
  Cross-cutting: answer from the brief's autonomy section rather than re-asking, log every deferral in the ledger, never narrow the task silently, track
230
282
  tasks, conventional commits, honest degradation (never claim a failed/skipped step
@@ -262,7 +314,10 @@ its own previous pass while the finding count still looked healthy. So:
262
314
  **rotate the axis, don't look harder.** The axes are orthogonal by construction —
263
315
  seams down one deliverable (the ladder above), then invariants *across*
264
316
  deliverables (one name, one enum, one owner everywhere), then one class swept end
265
- to end (every error path, every count, every status vocabulary).
317
+ to end (every error path, every count, every status vocabulary), then — where a
318
+ code graph exists — **the graph against the docs**, the only axis that finds an
319
+ absence without reading for it (a hub no document names, an edge the docs deny, a
320
+ doc naming a module the graph no longer has).
266
321
  - **Audit bottom-up.** A missing artefact at a low rung makes everything above it
267
322
  meaningless; top-down you polish a surface for a contract that doesn't exist.
268
323
  - **A class that repeats twice becomes a check, not a note.** Once is an incident;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeline-skill",
3
- "version": "1.4.4",
3
+ "version": "1.6.1",
4
4
  "description": "Full-cycle delivery pipeline for coding agents: a mandatory built-in intake grill, then 10 gated stages (docs, brainstorm+decompose, spec, plan, build, tests, lint/deploy, post-deploy, docs/wiki, acceptance). Every stage's doctrine ships inside the skill — no companion plugin required. This package is the installer CLI.",
5
5
  "bin": {
6
6
  "task-pipeline": "bin/task-pipeline.js"
@@ -2,7 +2,7 @@
2
2
  "name": "task-pipeline",
3
3
  "displayName": "Task Pipeline",
4
4
  "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.",
5
- "version": "1.4.4",
5
+ "version": "1.6.1",
6
6
  "author": {
7
7
  "name": "ssheleg"
8
8
  },
@@ -5,11 +5,17 @@ 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/{knowledge-sources,grill,brainstorm,decomposition,spec,planning,build,review,tdd,acceptance,loop-guard}.md`)
8
+ built into the skill** (`references/{knowledge-sources,knowledge-graph,grill,brainstorm,decomposition,spec,planning,build,review,tdd,acceptance,retrospective,loop-guard}.md`)
9
9
  — no companion plugin is required for any of them. **Stage 0 opens with the
10
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**
11
+ pull what the project already knows about this task from the code, **the code graph**
12
+ if one is built ([graphify](https://github.com/Graphify-Labs/graphify)
13
+ `references/knowledge-graph.md`; recommended, never required; detect
14
+ `graphify-out/graph.json`; it answers *reach* — what calls this, what breaks if it
15
+ moves — which grep cannot), `CLAUDE.md`,
16
+ `CONTEXT.md`/ADRs, `docs/` + `docs/ux/`, past pipeline briefs, **the retro's standing
17
+ instructions** (`docs/superpowers/retro.md` — read in full, they bind this run;
18
+ `references/retrospective.md`), the **knowledge wiki**
13
19
  if one is installed ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki) —
14
20
  recommended, never required; detect `~/.obsidian-wiki/config`) and any **other repo
15
21
  or hosted doc system the project names as its docs**, then write the **source
@@ -22,10 +28,10 @@ only out loud, and a doc the run proves stale is logged for the stage-9 update
22
28
  applying the
23
29
  grill's **domain awareness** (challenge terms against `CONTEXT.md`, sharpen fuzzy
24
30
  language, ADRs for hard-to-reverse calls) and covering the **autonomy sweep** (what
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, and for UI tasks whether the design is done visually in Figma or text-only, whether the Figma MCP is connected, and — if it isn't — whether to ship text-only or stop and connect it, since the UX chain degrades on its own and never blocks; **and with Figma on, the design destination: which team/org by name and which file** — the recorded one, a URL the operator gives, or creation in that named team explicitly authorized, written into the project's canonical record before the first frame, because a destination decided at drawing time is how a project ends up with three design files and no way to tell which is real. **Never create while a recorded file resolves; if it doesn't resolve, stop and ask — never create a replacement**) —
31
+ would otherwise stop stages 1→10: docs sources incl. doc repos, the wiki and the code graph, branch/tracker
32
+ policy, test and lint commands, deploy target and authorization, log locations, docs/wiki/graph targets, and for UI tasks whether the design is done visually in Figma or text-only, whether the Figma MCP is connected, and — if it isn't — whether to ship text-only or stop and connect it, since the UX chain degrades on its own and never blocks; **and with Figma on, the design destination: which team/org by name and which file** — the recorded one, a URL the operator gives, or creation in that named team explicitly authorized, written into the project's canonical record before the first frame, because a destination decided at drawing time is how a project ends up with three design files and no way to tell which is real. **Never create while a recorded file resolves; if it doesn't resolve, stop and ask — never create a replacement**) —
27
33
  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
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. **The closing stage opens with the ladder walk** (`references/audit.md`): the REQ table finds what was named and lost, but a comparison needs two sides and an absence has one — so walk each REQ bottom-up through its rungs (decision → spec section → contract *and its failure behavior* → task → change → executed test → surface/docs), check the seam at each step, order findings by seam rather than by file, and turn every absence into a new REQ row **before** the coverage table is written. A green from a check nobody has watched fail against a planted defect is not evidence; a finding class seen twice becomes a script rather than a third ledger row; and the carry-over ledger's counts are printed beside every gate verdict, so "green" never reads as "verified". If a searching pass starts finding mostly what the previous pass's own fixes broke, the axis is exhausted — rotate it, don't look harder. **In a project of several repositories, stage 10 closes on the parent too:** a parent records each submodule as a pointer to one commit, and moving the submodule does not move the pointer — so the work can be committed, pushed and green while a clone of the parent still gets the commit before it. Neither repo looks wrong alone, which is why it survives every check that runs inside one. Require `git submodule status` with no line starting `+`, and every repo clean and pushed (`git -C <repo> status --porcelain`, `git -C <repo> log @{u}..HEAD`). The fix is two commands and the second gets forgotten: push the submodule, then `git add <submodule> && git commit`. Honor every stage gate by its type (`auto` = verify yourself;
34
+ **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. **The closing stage opens with the ladder walk** (`references/audit.md`): the REQ table finds what was named and lost, but a comparison needs two sides and an absence has one — so walk each REQ bottom-up through its rungs (decision → spec section → contract *and its failure behavior* → task → change → executed test → surface/docs), check the seam at each step, order findings by seam rather than by file, and turn every absence into a new REQ row **before** the coverage table is written. A green from a check nobody has watched fail against a planted defect is not evidence; a finding class seen twice becomes a script rather than a third ledger row; and the carry-over ledger's counts are printed beside every gate verdict, so "green" never reads as "verified". If a searching pass starts finding mostly what the previous pass's own fixes broke, the axis is exhausted — rotate it, don't look harder. **The docs stage closes three artifacts, not two:** module docs, the wiki, **and the code graph** (`/graphify . --update` where `graphify-out/` exists — `references/knowledge-graph.md`), because the graph is what the next run's harvest queries first and a stale one is a false premise carrying the authority of a machine. Then check the graph against the docs: a hub `graphify god-nodes` reports that no document names is an undocumented seam; an edge the docs deny is a leak in the code or a lie in the docs; a doc naming a module the graph no longer has is stale. Doc-side findings are fixed there, absences become REQ rows in the closing stage. **In a project of several repositories, stage 10 closes on the parent too:** a parent records each submodule as a pointer to one commit, and moving the submodule does not move the pointer — so the work can be committed, pushed and green while a clone of the parent still gets the commit before it. Neither repo looks wrong alone, which is why it survives every check that runs inside one. Require `git submodule status` with no line starting `+`, and every repo clean and pushed (`git -C <repo> status --porcelain`, `git -C <repo> log @{u}..HEAD`). The fix is two commands and the second gets forgotten: push the submodule, then `git add <submodule> && git commit`. **The run's last act is the retrospective** (`references/retrospective.md` → `docs/superpowers/retro.md`, one file per project): **prune before you add** — every standing instruction against its three retirement triggers (it became a check; the paths/commands it names are gone; it hasn't fired in five run stamps), the list held to a hard cap of ten, every deletion logged as one line and never silent — then stamp the run, then, only if the run diverged, write the entry: symptom with evidence, the stage it surfaced at, the stage that *owned* it, the root cause, the fix by grade (mechanical check > standing instruction > note that expires in two runs), and the check that catches it next time. Stage 0 reads those standing instructions in full, so the prune is a gate criterion, not a good intention: a rule nobody reads to the end is worse than no rule, because everyone believes it is covered. Honor every stage gate by its type (`auto` = verify yourself;
29
35
  `manual` = wait for explicit go). Confirm the **model once at preflight** —
30
36
  recommend the most capable one the environment offers, never a hardcoded id — then
31
37
  run the whole pipeline on it without re-asking.
@@ -43,6 +43,7 @@ and no stage that can fail because a dependency is missing:
43
43
  | Stage | Built-in doctrine |
44
44
  |---|---|
45
45
  | 0 Knowledge harvest (pre-grill) | [`references/knowledge-sources.md`](references/knowledge-sources.md) |
46
+ | 0 + 9 The code graph (graphify — recommended, never required) | [`references/knowledge-graph.md`](references/knowledge-graph.md) |
46
47
  | 0 Intake grill | [`references/grill.md`](references/grill.md) |
47
48
  | 2 Brainstorm | [`references/brainstorm.md`](references/brainstorm.md) |
48
49
  | 2 Decompose (platforms only) | [`references/decomposition.md`](references/decomposition.md) |
@@ -51,6 +52,7 @@ and no stage that can fail because a dependency is missing:
51
52
  | 5 Build (worktree, subagents, fix loop) | [`references/build.md`](references/build.md) + [`references/review.md`](references/review.md) |
52
53
  | 5–6 TDD + suite gate | [`references/tdd.md`](references/tdd.md) |
53
54
  | 10 Acceptance (REQ close-out) | [`references/acceptance.md`](references/acceptance.md) |
55
+ | 10 Retrospective (the run's last act) | [`references/retrospective.md`](references/retrospective.md) |
54
56
  | 10 + any audit (what's *missing*) | [`references/audit.md`](references/audit.md) |
55
57
  | any repeating loop | [`references/loop-guard.md`](references/loop-guard.md) |
56
58
 
@@ -95,9 +97,14 @@ for every one** — which is what turns the pipeline from a funnel into a circle
95
97
 
96
98
  **Harvest before you ask.** Stage 0 opens with a **knowledge harvest**
97
99
  ([`references/knowledge-sources.md`](references/knowledge-sources.md)), not a
98
- question: pull what the project already knows about this task from the code,
99
- `CLAUDE.md`, `CONTEXT.md`/ADRs, `docs/` + `docs/ux/`, past pipeline briefs, the
100
- **knowledge wiki** if one is installed
100
+ question: pull what the project already knows about this task from the code, the
101
+ **code graph** if one is built
102
+ ([`references/knowledge-graph.md`](references/knowledge-graph.md) graphify;
103
+ recommended, never required),
104
+ `CLAUDE.md`, `CONTEXT.md`/ADRs, `docs/` + `docs/ux/`, past pipeline briefs, **the
105
+ retro's standing instructions** — `docs/superpowers/retro.md`, read in full because
106
+ they *bind* this run ([`references/retrospective.md`](references/retrospective.md)) —
107
+ the **knowledge wiki** if one is installed
101
108
  ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki) — recommended, never
102
109
  required) and any **other repo or hosted doc system the project names as its
103
110
  docs**. Write the source ledger into the brief, then interview *against* it: every
@@ -105,6 +112,29 @@ answer that touches a source is checked against that source, and the operator
105
112
  outranks any document — but only out loud, so an override is a recorded decision
106
113
  instead of an undetected divergence. The same ledger is stage 9's work list.
107
114
 
115
+ **Three artifacts close a run, not two.** Stage 9 syncs the docs, the wiki **and the
116
+ code graph** (`/graphify . --update`) — the graph is what the *next* run's harvest
117
+ queries first, so a stale one is a false premise carrying the authority of a
118
+ machine. Refreshing it also buys the **graph↔docs divergence check**: a hub no
119
+ document names, an edge the docs deny, a doc naming a module the graph no longer
120
+ has. Doc-side findings are fixed at stage 9; absences become REQ rows at stage 10
121
+ ([`references/knowledge-graph.md`](references/knowledge-graph.md),
122
+ [`references/audit.md`](references/audit.md)).
123
+
124
+ **The run teaches the next run — and the list stays short.** Every gate is good at
125
+ *this* run and blind across runs, so the same class of failure can be caught, fixed
126
+ and forgotten five times with nothing noticing it is the same one. The last act of
127
+ stage 10 is therefore the **retrospective**
128
+ ([`references/retrospective.md`](references/retrospective.md), written to
129
+ `docs/superpowers/retro.md`): **prune first** — every standing instruction checked
130
+ against its retirement triggers (it became a check · its surface is gone · it hasn't
131
+ fired in five runs), the list held to a hard cap of **ten**, every deletion logged —
132
+ then stamp the run, then write an entry **only if the run diverged** (symptom, the
133
+ stage that *owned* it, root cause, fix, and the check that catches it next time).
134
+ Stage 0 reads those standing instructions in full, which is exactly why the prune is
135
+ a gate criterion and not a good intention: a rule nobody reads to the end is worse
136
+ than no rule, because everyone believes it is covered.
137
+
108
138
  Three things the grill does beyond clarifying the request:
109
139
  - **Domain awareness.** It reads the project's own `CONTEXT.md` / `docs/adr/` and
110
140
  holds the operator to them — challenging terms that conflict with the glossary,
@@ -123,7 +153,7 @@ Three things the grill does beyond clarifying the request:
123
153
  with stage 0** (survives context loss; lets you resume). Then run the
124
154
  **companion preflight** (`references/companion-skills.md`): the stage doctrine
125
155
  is built in, so this only checks the *optional* companions (super-ux for UI
126
- tasks, context7, wiki-update) and emits ONE block covering them
156
+ tasks, context7, wiki-update, graphify) and emits ONE block covering them
127
157
  **and the model decision** (`references/model-tiering.md`): recommend
128
158
  the most capable model available, let the operator confirm or override, record
129
159
  it. Ask once, here.
@@ -194,8 +224,8 @@ capable available — see `references/model-tiering.md`).
194
224
  | 6 | Tests | host test runner + built-in [`references/tdd.md`](references/tdd.md) + [`references/learned.md`](references/learned.md) | full suite green; new/changed code covered; **every new check probed both ways and asserted on its exit code**, and the suite run once against a cold environment | auto |
195
225
  | 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 |
196
226
  | 8 | Post-deploy | tail deploy logs / health-check | clean boot or honest degradation report | auto |
197
- | 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; **every number computed rather than restated, every named command or file resolvable** ([`references/learned.md`](references/learned.md)) | auto |
198
- | 10 | **Acceptance** | built in: [`references/audit.md`](references/audit.md) (ladder walk) → [`references/acceptance.md`](references/acceptance.md) (coverage table) | ladder walk ran, its absences became REQ rows; every REQ accounted for with evidence from a check seen failing once; ledger has no unresolved row; **axis rotation recorded** (new findings vs self-inflicted, rule 1 of [`references/learned.md`](references/learned.md)), **every closure verified against the artefact rather than the document describing it**, **each correction swept across its class**, **every deferral a printed ratchet rather than a TODO**; **in a multi-repository project, every repository is clean, pushed and pointed at** (below); operator signs off | manual |
227
+ | 9 | Docs + wiki | host module docs/runbook rules → `wiki-update` ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki), recommended) → `/graphify . --update` ([`references/knowledge-graph.md`](references/knowledge-graph.md), recommended) | every stale row of the stage-0 source ledger updated; docs synced; wiki synced; **the code graph refreshed where one exists** and checked against the docs (a hub no doc names, a doc naming a node the graph lost); **every number computed rather than restated, every named command or file resolvable** ([`references/learned.md`](references/learned.md)) | auto |
228
+ | 10 | **Acceptance** | built in: [`references/audit.md`](references/audit.md) (ladder walk) → [`references/acceptance.md`](references/acceptance.md) (coverage table) → [`references/retrospective.md`](references/retrospective.md) (retro: prune, stamp, entry) | ladder walk ran, its absences became REQ rows; every REQ accounted for with evidence from a check seen failing once; ledger has no unresolved row; **axis rotation recorded** (new findings vs self-inflicted, rule 1 of [`references/learned.md`](references/learned.md)), **every closure verified against the artefact rather than the document describing it**, **each correction swept across its class**, **every deferral a printed ratchet rather than a TODO**; **in a multi-repository project, every repository is clean, pushed and pointed at** (below); operator signs off; **the retrospective written last — prune before entry, list at or under its cap, deletions logged, run stamped, counts printed** | manual |
199
229
 
200
230
 
201
231
  ### Stage 10 in a project of several repositories
@@ -256,8 +286,10 @@ automation is on — `pipeline.schema.json` is the only contract.
256
286
  - `pipeline.schema.json` — the universal pipeline config contract (stages + release)
257
287
  - `pipeline.example.json` — this plugin's default flow (stage 0 + 1→10) + release, as config
258
288
  - `references/knowledge-sources.md` — stage-0 phase 1: the source list, the wiki, the ledger, the stage-9 loop-back
289
+ - `references/knowledge-graph.md` — the code graph (graphify): install line, stage-0 reach queries, the stage-9 refresh, the graph↔docs divergence check
259
290
  - `references/grill.md` — the built-in stage-0 grill: loop, domain awareness, autonomy sweep
260
291
  - `references/acceptance.md` — the built-in stage-10 close-out: REQ coverage, evidence, sign-off
292
+ - `references/retrospective.md` — stage 10's last act: the project retro (`docs/superpowers/retro.md`), the three grades of fix, the mandatory prune and its cap of ten
261
293
  - `references/audit.md` — cross-cutting: the L0→L7 ladder and its seams (what was never written), axis rotation, ratchets, proven checks
262
294
  - `references/learned.md` — cross-cutting: fourteen rules earned by failure on a real multi-repository build, each with the incident behind it, its check and its exit criterion; plus the two that no check can decide
263
295
  - `references/brainstorm.md` — stage 2: design dialogue, approaches, UI detection, hard gate