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
@@ -0,0 +1,117 @@
1
+ # Retrospective — the run teaches the next run, and the list stays short
2
+
3
+ The last act of stage 10, after the coverage table and before the run is called
4
+ done. It exists because the pipeline's gates are good at *this* run and blind
5
+ across runs: the same class of failure can be caught, fixed and forgotten five
6
+ times, and nothing in the flow notices it is the same one.
7
+
8
+ **Artifact:** `docs/superpowers/retro.md` — **one per project, not per run**,
9
+ committed. It has three parts and a hard size limit:
10
+
11
+ | Part | What's in it | Read by |
12
+ |---|---|---|
13
+ | **Standing instructions** | the rules currently in force — max **10** | stage 0, in full, every run |
14
+ | **Log** | problem → cause → fix → check, newest first, plus every retirement | a human, and stage 0 when the terms match |
15
+ | **Run stamps** | one line per run: date, topic, verdict | the prune (this is what makes "five runs" countable) |
16
+
17
+ Every run writes a **stamp** and runs the **prune**. Only a run that *diverged*
18
+ writes an entry. A retro that is empty after a messy run is the exact failure this
19
+ file exists to stop.
20
+
21
+ ## Write the entry only for a divergence — and name the layer that owned it
22
+
23
+ An entry is owed when the run did not go as planned: a gate reopened, a stage was
24
+ re-entered, a fix broke something it wasn't touching, an estimate was wrong by a
25
+ factor, the operator had to intervene where the brief said they wouldn't.
26
+
27
+ Required fields, and none of them is optional:
28
+
29
+ | Field | The rule |
30
+ |---|---|
31
+ | **Symptom** | what actually happened, in one line, with the evidence (a command, a `file:line`, the gate that reopened) |
32
+ | **Surfaced at** | the stage where it became visible |
33
+ | **Owned by** | the stage that *let it through* — usually an earlier one. A finding belongs to the layer that owns it; recording it against the stage that tripped over it is how the same defect returns |
34
+ | **Root cause** | why the pipeline permitted it. "The agent was careless" is not a cause — it is the absence of one, and it produces no fix |
35
+ | **Fix** | one of the three grades below |
36
+ | **The check** | what would have caught this the first time. If the honest answer is "nothing yet", that is the fix, and it is grade 1 |
37
+
38
+ ## Three grades of fix — take the highest one that can work
39
+
40
+ **Grade 1 — mechanical.** A test, a lint rule, a gate criterion, a CI step, a hook.
41
+ The check *is* the memory: nothing has to be read, remembered or pruned later. Log
42
+ it as `landed` and move on — it never becomes a standing instruction and never
43
+ costs a slot.
44
+
45
+ **Grade 2 — a standing instruction.** A rule an agent must read, for the cases no
46
+ check can decide (a judgement, a precedence, a "ask before X"). It costs one of the
47
+ ten slots and it is **only accepted with its retirement trigger written at birth**
48
+ (below).
49
+
50
+ **Grade 3 — a note with an expiry.** For something still being understood. Maximum
51
+ **two runs**. At the second stamp it is promoted to grade 1 or 2, or deleted. A note
52
+ with no expiry is how a file becomes unreadable one honest line at a time.
53
+
54
+ Prefer grade 1 whenever a check can decide it. This is the same law as
55
+ [`audit.md`](audit.md) → *A class that repeats twice becomes a gate, not a note*: a
56
+ rule that could have been a check gets read twice and obeyed once.
57
+
58
+ ## The prune — mandatory, and it runs BEFORE the new entry is written
59
+
60
+ Prune first, then write. A lesson that lands in a cluttered file is a lesson nobody
61
+ will reach.
62
+
63
+ Check **every** standing instruction against three retirement triggers:
64
+
65
+ | Trigger | Test | Then |
66
+ |---|---|---|
67
+ | **It became a check** | the rule is now enforced by a test, lint, gate or hook | delete it — the check is the memory, and keeping both means it is read twice and obeyed once |
68
+ | **Its surface is gone** | resolve every path, command, stage and tool it names; any that no longer exists | delete it — it now describes a system nobody is running |
69
+ | **It went cold** | it has not fired in the last **five run stamps** | delete it — five runs without firing is the evidence that it was situational |
70
+
71
+ Then the cap: **ten standing instructions, hard.** At eleven you do not get to keep
72
+ them all — the oldest never-fired one goes. "But all of them matter" is precisely
73
+ the state in which the list stopped being read, and the ninth stale rule is what
74
+ discredits the two that are load-bearing.
75
+
76
+ **Every deletion writes one line in the Log** — id, date, which trigger fired.
77
+ Silent deletion is forbidden: the record is what survives, the instruction is what
78
+ leaves. A retired rule that comes back as a real failure is a grade-1 fix, and now
79
+ you have its history.
80
+
81
+ **Print the counts beside the gate verdict**, the same way the carry-over ledger
82
+ does ([`audit.md`](audit.md) → *ratchet, never TODO*):
83
+
84
+ ```
85
+ GATE 10 acceptance: PASS — 14/14 REQ verified
86
+ carry-over: 0 unresolved · retro: 7 standing (was 9) · retired 3 · added 1
87
+ ```
88
+
89
+ A pruned list that nobody prints is a list that quietly grows back.
90
+
91
+ ## The loop closes at stage 0
92
+
93
+ The standing instructions are an **instruction source**, not background reading:
94
+ [`knowledge-sources.md`](knowledge-sources.md) reads them in full at the harvest —
95
+ they are short by construction — and records the file as a ledger row. Every
96
+ instruction that actually *fires* during the run gets its **last-fired date
97
+ stamped** as it fires. That stamp is the only thing that makes the cold-rule honest;
98
+ without it "five runs without firing" is a guess, and the prune becomes a mood.
99
+
100
+ ## Where a lesson goes when it is not about this project
101
+
102
+ A lesson that would be true in any repository does not belong in one project's
103
+ retro — it belongs in the pipeline's own doctrine
104
+ ([`learned.md`](learned.md), which is exactly that list, earned the same way). Open
105
+ an issue upstream and say so in the entry. A local file that accumulates universal
106
+ rules is a fork of the skill that nobody named.
107
+
108
+ ## Rationalizations
109
+
110
+ | Excuse | Reality |
111
+ |---|---|
112
+ | "Nothing really went wrong this run" | Then the stamp says so in one line and you are done in ten seconds. The runs that "went fine" are where a repeated class hides — it never cost enough to remember. |
113
+ | "I'll write the retro later, with a clear head" | Later is when you remember the outcome and not the seam. The cause is legible for about an hour after the run. |
114
+ | "Don't delete it, it might still be useful" | That sentence is the entire failure mode. Every rule kept "just in case" spends attention that the load-bearing ones needed, and the file stops being read at all. |
115
+ | "Pruning loses knowledge" | The Log keeps the incident forever; only the *instruction* leaves. If it recurs you get a grade-1 fix with its own history attached. |
116
+ | "The list is at eleven but they're all important" | Then one of them is doctrine and belongs in `CLAUDE.md`, one has become a check, and one has not fired in a year. Ten is the budget precisely because ranking is uncomfortable. |
117
+ | "I'll note it as a reminder for next time" | A note is grade 3 and expires in two runs. If it is worth remembering it is worth a check or a slot; if it is worth neither, it was never going to be read. |
@@ -37,15 +37,20 @@ stages/agents/types (see SKILL.md → *Bring your own skills*).
37
37
  answers for scope, users, constraints, data, edge cases, done-criteria.
38
38
  - **Phase 1 — harvest the knowledge sources FIRST**
39
39
  ([`knowledge-sources.md`](knowledge-sources.md)). Before the first question:
40
- query what the project already knows about this task — code, `CLAUDE.md`,
40
+ query what the project already knows about this task — code, **the code graph**
41
+ when one is built ([`knowledge-graph.md`](knowledge-graph.md): `graphify query` /
42
+ `affected` / `god-nodes` answer *reach*, which is what grep cannot), `CLAUDE.md`,
41
43
  `CONTEXT.md`/ADRs, `docs/` + `docs/ux/`, past pipeline briefs and carry-over
42
- ledgers, the **knowledge wiki** if one is installed
44
+ ledgers, **the retro's standing instructions** (`docs/superpowers/retro.md`, read
45
+ **in full** — they are capped at ten and they bind this run; stamp each one as it
46
+ fires, [`retrospective.md`](retrospective.md)), the **knowledge wiki** if one is
47
+ installed
43
48
  ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki) — recommended,
44
49
  never required), and any **other repo or hosted doc system the project names as
45
50
  its docs**. Write the **source ledger** into the brief (a row per source, or an
46
- explicit "none found"). It is retrieval scoped by the task's own nouns, not a
47
- read of everything — and it is what makes phase 2's answers checkable instead of
48
- merely confident.
51
+ explicit "none found"; the graph's row carries its build date). It is retrieval
52
+ scoped by the task's own nouns, not a read of everything — and it is what makes
53
+ phase 2's answers checkable instead of merely confident.
49
54
  - **How it runs: [`grill.md`](grill.md)** — the full doctrine, built into this
50
55
  skill (nothing to install). In short: one question per turn, a recommended
51
56
  answer with each, explore the codebase before asking, depth-first through the
@@ -257,12 +262,27 @@ stages/agents/types (see SKILL.md → *Bring your own skills*).
257
262
  `~/.obsidian-wiki/config`, or the skill resolves). Not installed → recommend it
258
263
  once with its install line and continue; a missing wiki never blocks the gate.
259
264
  Distil the knowledge (decisions, seams, why), not a diff summary.
265
+ - **Refresh the code graph** — `/graphify . --update` when one exists
266
+ ([`knowledge-graph.md`](knowledge-graph.md)). The close-out has **three**
267
+ artifacts, not two: docs, wiki, graph. The graph is the source the *next* run's
268
+ harvest queries first, so a stale one is a false premise carrying the authority of
269
+ a machine — a wrong doc gets argued with, a wrong graph gets believed. Incremental
270
+ and model-free for code; a run that deleted code legitimately rebuilds smaller
271
+ (`--force`).
272
+ - **Then check the graph against the docs** — the cheap half of the divergence sweep
273
+ (`graphify god-nodes`; any doc naming a module the graph no longer has). A hub no
274
+ doc names, or an edge the docs deny, is either a leak in the code or a lie in the
275
+ docs; a doc naming a node that no longer exists is a stale ledger row found
276
+ mechanically. Doc-side findings are fixed here; **absences go to stage 10's ladder
277
+ walk as REQ rows** ([`audit.md`](audit.md)).
260
278
  - **Docs living in another repository** are outward: propose the edit, get an
261
279
  explicit go, then open a PR there. No go → the exact edit goes in the carry-over
262
280
  ledger.
263
281
  - **GATE (auto):** docs in sync with code; every stale row in the source ledger
264
282
  either updated or carried over with its edit; UI: super-ux layers current +
265
- linter green; wiki synced (or absent and recommended once); dangling links fixed.
283
+ linter green; wiki synced (or absent and recommended once); **the code graph
284
+ refreshed where one exists, or the reason it wasn't written into the carry-over
285
+ ledger** (absent and recommended once is fine); dangling links fixed.
266
286
 
267
287
  ## 10 — Acceptance
268
288
  - **What:** the closing stage — go back to the brief and account for **every**
@@ -313,8 +333,23 @@ stages/agents/types (see SKILL.md → *Bring your own skills*).
313
333
  `/agent-sync finish` runs exactly that. The fix is two commands and the second is
314
334
  the forgotten one: `git -C <submodule> push`, then
315
335
  `git add <submodule> && git commit`.
336
+ - **The retrospective is the run's last act** ([`retrospective.md`](retrospective.md)),
337
+ written to `docs/superpowers/retro.md` — one file per project, not per run. The
338
+ pipeline's gates are good at *this* run and blind across runs: the same class of
339
+ failure can be caught, fixed and forgotten five times and nothing in the flow
340
+ notices it is the same one. So, in this order: **prune first** (every standing
341
+ instruction against its three retirement triggers — it became a check, its
342
+ surface is gone, it hasn't fired in five run stamps — and the list held to its cap
343
+ of ten, every deletion logged), **stamp the run**, then **write an entry only if
344
+ the run diverged** (symptom · the stage it surfaced at · the stage that *owned* it
345
+ · root cause · fix, mechanical before instruction before expiring note · the check
346
+ that catches it next time). Every run prunes and stamps; a retro left empty after
347
+ a messy run is the failure the file exists to stop. Stage 0 reads the standing
348
+ instructions in full next time, which is why the cap is not negotiable.
316
349
  - **GATE (manual):** the ladder walk ran and its absences became REQ rows before
317
- the table was written; **every repository is closedthe parent included:
350
+ the table was written; **the retrospective is writtenprune before entry, the
351
+ list at or under its cap with every deletion logged, the run stamped, and the
352
+ counts printed beside this verdict**; **every repository is closed — the parent included:
318
353
  `git submodule status` shows no `+`, each repo clean and pushed**; **every check this gate leans on has been seen failing
319
354
  once against a planted defect** (an unproven check's green is not evidence);
320
355
  every REQ has a status (none `unknown`); every `verified`
@@ -1,9 +1,11 @@
1
1
  # templates
2
2
 
3
- Skeletons task-pipeline seeds into a host project. Only the **brief** is a seeded
4
- file (it is the stage-0 intake artifact). The spec and plan have no skeleton here
5
- their required structure is prescribed inline by `references/spec.md` and
6
- `references/planning.md`; the `docs/ux/*` skeletons come from `super-ux`.
3
+ Skeletons task-pipeline seeds into a host project. Two are **seeded files** the
4
+ **brief** (the stage-0 intake artifact) and the **retro** (created at the first
5
+ stage-10 close-out, then appended to for the life of the project). The spec and plan
6
+ have no skeleton here their required structure is prescribed inline by
7
+ `references/spec.md` and `references/planning.md`; the `docs/ux/*` skeletons come
8
+ from `super-ux`.
7
9
 
8
10
  | Template | Seeded to | Stage |
9
11
  |---|---|---|
@@ -11,10 +13,14 @@ their required structure is prescribed inline by `references/spec.md` and
11
13
  | `carryover.md` | `docs/superpowers/specs/YYYY-MM-DD-<topic>-carryover.md` | 0 seeds, all stages append, 10 reads |
12
14
  | `context.md` | `CONTEXT.md` at the repo root (or per context) | 0 — grill, domain awareness |
13
15
  | `adr.md` | `docs/adr/NNNN-<slug>.md` | 0 — grill, hard-to-reverse decisions |
16
+ | `retro.md` | `docs/superpowers/retro.md` — **one per project, not per run** | 10 writes (prune → stamp → entry), 0 reads the standing instructions in full |
14
17
 
15
18
  `context.md` and `adr.md` are **format references**, not files to copy wholesale:
16
19
  the grill writes `CONTEXT.md` entries and ADRs in their shape, lazily — only once
17
20
  there is a resolved term or a decision worth recording.
18
21
 
19
22
  Seeding rule (per the ssheleg canon): create a template copy **only when the
20
- target is absent**; never overwrite an existing brief.
23
+ target is absent**; never overwrite an existing brief. The rule is hardest and most
24
+ important for `retro.md`: it is the only artifact that accumulates across runs, so
25
+ overwriting it with the skeleton destroys every lesson the project has bought —
26
+ seed it once, then read, prune and append.
@@ -19,17 +19,25 @@ premise if the run leaves it wrong.
19
19
  | Source | What it says about this task | Fresh? | Authority | Stale after this run? |
20
20
  |---|---|---|---|---|
21
21
  | `docs/adr/NNNN-….md` | … | YYYY-MM | decision | no |
22
+ | `graphify-out/graph.json` | reach: what calls it, what breaks if it moves | built YYYY-MM-DD | index | **yes — refresh at stage 9** |
22
23
  | wiki: `projects/…/concepts/…` | … | YYYY-MM | context | **yes — update at stage 9** |
23
24
  | `CLAUDE.md` | test/lint/deploy commands, house rules | current | convention | no |
24
25
 
25
- Precedence when two disagree: **code > host docs and ADRs > wiki > memory.** The
26
- operator outranks every document but only **out loud**: an override quoted
27
- against its source is a recorded decision, an unquoted one is an undetected
26
+ Precedence when two disagree, in one direction: **code first, then host docs and
27
+ ADRs, then the code graph, then the wiki, then memory.** The graph points; the code
28
+ decides. The operator outranks every document but only **out loud**: an override
29
+ quoted against its source is a recorded decision, an unquoted one is an undetected
28
30
  divergence.
29
31
 
30
32
  - **Doc repos / hosted doc systems this project names:** … (or `none`)
31
33
  - **Knowledge wiki:** installed / not installed
32
34
  ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki); recommended, never a gate)
35
+ - **Retro standing instructions:** `docs/superpowers/retro.md` — none / N in force
36
+ (read **in full**; list which ones bind this run, and stamp each as it fires —
37
+ that date is the only evidence behind stage 10's cold-retirement rule)
38
+ - **Code graph:** built / installed-not-built / not installed
39
+ ([graphify](https://github.com/Graphify-Labs/graphify); recommended, never a gate —
40
+ built → its row above carries the build date and stage 9 refreshes it)
33
41
 
34
42
  ## Scope
35
43
 
@@ -79,7 +87,7 @@ is not neutral — it is a scheduled interruption.
79
87
  |---|---|---|
80
88
  | run-wide | Model for this run | … (most capable available unless overridden; per-stage overrides here) |
81
89
  | run-wide | Decide autonomously vs escalate to me | … |
82
- | 0 Harvest | Doc sources beyond this repo — other repos, hosted docs, the knowledge wiki; and may stage 9 write to them? | … (another repo is outward: propose + PR, never a direct push) |
90
+ | 0 Harvest | Doc sources beyond this repo — other repos, hosted docs, the knowledge wiki, the code graph; and may stage 9 write to them? | … (another repo is outward: propose + PR, never a direct push; graph built / not built) |
83
91
  | 1 Docs | External libs/APIs/SDKs in play; any context7 can't resolve → where their docs live | … |
84
92
  | 2 Decompose | Platform (several capabilities/surfaces) or one module? If platform — deploy cadence: per module, or once at the end | … |
85
93
  | 2–3 Spec | UI verdict (arms super-ux); scenario-tracing waiver, if any | … |
@@ -92,8 +100,8 @@ is not neutral — it is a scheduled interruption.
92
100
  | 7 Deploy | Target + path; release automation on/off; deploy-from-main rule | … |
93
101
  | 7 Deploy | **Authorization** — standing go, or ask every time? | … |
94
102
  | 8 Post-deploy | Where logs / health live (app name, endpoint, workflow) | … |
95
- | 9 Docs+wiki | Which module docs / runbooks this change updates; wiki sync yes/no; which stale ledger rows get fixed | … |
96
- | 10 Acceptance | Who signs off; where deferred REQs get tracked (issue tracker / backlog) | … |
103
+ | 9 Docs+wiki | Which module docs / runbooks this change updates; wiki sync yes/no; **code-graph refresh yes/no** (`/graphify . --update`); which stale ledger rows get fixed | … |
104
+ | 10 Acceptance | Who signs off; where deferred REQs get tracked (issue tracker / backlog); **retro file** — `docs/superpowers/retro.md` present? which standing instructions bind this run? | … |
97
105
 
98
106
  > **Deploy authorization has a hard floor.** A standing go counts only if it is
99
107
  > **specific** — named target and named preconditions ("staging, once lint and the
@@ -0,0 +1,51 @@
1
+ # Pipeline retrospective — <project>
2
+
3
+ One file per project, not per run. Written as the **last act of stage 10**:
4
+ prune first, then stamp, then write an entry **only if the run diverged**.
5
+ Doctrine: `references/retrospective.md`.
6
+
7
+ Stage 0 reads *Standing instructions* in full, every run — which is why the list
8
+ has a hard cap of **ten**.
9
+
10
+ ## Standing instructions (max 10 — in force right now)
11
+
12
+ Every row is a rule an agent must follow, that **no check can decide**. A rule a
13
+ check *can* decide is not written here: it is written as the check (grade 1).
14
+ No row is accepted without its **retire-when** trigger, written at birth.
15
+
16
+ | id | Born | Instruction | Because (incident) | Retire when | Last fired |
17
+ |---|---|---|---|---|---|
18
+ | R-001 | 2026-05-04 · `<topic>` | … | … (one line, links the log entry) | … (e.g. "the export path is covered by a test") | 2026-06-18 |
19
+
20
+ Retire on **any** of: it became a check · every path/command it names is gone · it
21
+ has not fired in the last five run stamps. At eleven rows, the oldest never-fired
22
+ row goes — the cap is not negotiable, ranking is.
23
+
24
+ ## Log — problem → cause → fix (newest first)
25
+
26
+ Retirements are logged here too, one line each: *silent deletion is forbidden; the
27
+ record stays, the instruction leaves.*
28
+
29
+ ### 2026-05-04 · `<topic>` · gate 6 reopened twice
30
+
31
+ - **Symptom:** … (one line + evidence — a command, a `file:line`, the gate)
32
+ - **Surfaced at:** stage 6 · **Owned by:** stage 4 (the plan never named the check)
33
+ - **Root cause:** … (why the pipeline permitted it — "the agent was careless" is
34
+ not a cause; it is the absence of one, and it produces no fix)
35
+ - **Fix:** grade 1 (mechanical) — … / grade 2 → `R-00N` / grade 3, expires in
36
+ 2 runs
37
+ - **The check:** … (what catches this the first time, from now on)
38
+ - **Upstream?** … (a lesson true in any repo belongs in the skill's own
39
+ `references/learned.md` — open an issue and say so here)
40
+
41
+ ### 2026-05-04 · retired R-000 — became a check (`npm run lint:paths`)
42
+
43
+ ## Run stamps
44
+
45
+ One line per run, appended at stage 10. This is what makes "five runs" countable
46
+ — without it the cold-rule is a guess and the prune becomes a mood.
47
+
48
+ | Date | Topic | Verdict | Retro |
49
+ |---|---|---|---|
50
+ | 2026-05-04 | `<topic>` | 14/14 verified | 1 entry · 7 standing (was 9) · retired 3 · added 1 |
51
+ | 2026-05-02 | `<topic>` | 9/9 verified | no divergence · 9 standing · retired 0 |