task-pipeline-skill 1.4.3 → 1.6.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.
Files changed (22) hide show
  1. package/CHANGELOG.md +109 -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
@@ -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. 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.",
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, graphify). 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,13 +9,15 @@
9
9
  "name": "Intake grill",
10
10
  "model": "default",
11
11
  "skills": [
12
- "task-pipeline:knowledge-harvest",
12
+ "task-pipeline:knowledge-sources",
13
+ "task-pipeline:knowledge-graph",
13
14
  "wiki-query",
15
+ "graphify",
14
16
  "task-pipeline:grill"
15
17
  ],
16
18
  "gate": {
17
19
  "type": "manual",
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, and for UI tasks the design surface: Figma on or text-only, is the Figma MCP connected, and if it is not — ship text-only or stop and connect it, since the UX chain degrades on its own and never blocks; plus, 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 with the creation explicitly authorized), written into the project's canonical record before the first frame, and never created while a recorded file resolves — an unreachable recorded file means stop and ask, never make a replacement) 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."
20
+ "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, THE CODE GRAPH when one is built (references/knowledge-graph.md: graphify query/affected/god-nodes answer reach, which grep cannot; detect graphify-out/graph.json — recommended, never required), CLAUDE.md/AGENTS.md, CONTEXT.md + docs/adr, docs/ + docs/ux, past pipeline briefs and carry-over ledgers, THE RETRO'S STANDING INSTRUCTIONS (docs/superpowers/retro.md — read IN FULL, not queried: they are capped at ten and they BIND this run; stamp each one the moment it fires, since that date is the only evidence behind stage 10's cold-retirement rule — references/retrospective.md), 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'; the graph's row carries its build date, because a graph goes stale like any other source). 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, and for UI tasks the design surface: Figma on or text-only, is the Figma MCP connected, and if it is not — ship text-only or stop and connect it, since the UX chain degrades on its own and never blocks; plus, 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 with the creation explicitly authorized), written into the project's canonical record before the first frame, and never created while a recorded file resolves — an unreachable recorded file means stop and ask, never make a replacement) 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."
19
21
  }
20
22
  },
21
23
  {
@@ -39,7 +41,7 @@
39
41
  "model": "default",
40
42
  "skills": [
41
43
  "task-pipeline:brainstorm",
42
- "task-pipeline:decompose"
44
+ "task-pipeline:decomposition"
43
45
  ],
44
46
  "gate": {
45
47
  "type": "manual",
@@ -71,7 +73,7 @@
71
73
  "name": "Plan",
72
74
  "model": "default",
73
75
  "skills": [
74
- "task-pipeline:plan"
76
+ "task-pipeline:planning"
75
77
  ],
76
78
  "gate": {
77
79
  "type": "auto",
@@ -140,11 +142,13 @@
140
142
  "model": "default",
141
143
  "skills": [
142
144
  "host:module-docs",
143
- "wiki-update"
145
+ "wiki-update",
146
+ "task-pipeline:knowledge-graph",
147
+ "graphify"
144
148
  ],
145
149
  "gate": {
146
150
  "type": "auto",
147
- "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"
151
+ "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); THE CODE GRAPH REFRESHED — '/graphify . --update' where graphify-out/ exists (references/knowledge-graph.md), or the reason it was skipped written into the carry-over ledger; absent → recommended once, never a blocker. The close-out has three artifacts, not two: the graph is what the NEXT run's harvest queries first, so a stale one is a false premise carrying the authority of a machine. Then the cheap half of the GRAPH-VS-DOCS DIVERGENCE CHECK: a hub 'graphify god-nodes' reports that no document names is an undocumented seam, an edge the docs deny is either a leak in the code or a lie in the docs, and a doc naming a module the graph has no node for describes something that no longer exists — doc-side findings fixed here, absences handed to stage 10's ladder walk as REQ rows. Docs living in another repository are outward — proposed with an explicit go, or carried over with the exact edit; dangling links fixed"
148
152
  }
149
153
  },
150
154
  {
@@ -154,11 +158,12 @@
154
158
  "model": "default",
155
159
  "skills": [
156
160
  "task-pipeline:audit",
157
- "task-pipeline:acceptance"
161
+ "task-pipeline:acceptance",
162
+ "task-pipeline:retrospective"
158
163
  ],
159
164
  "gate": {
160
165
  "type": "manual",
161
- "check": "Close the circle. FIRST the LADDER WALK (references/audit.md), because the REQ table can only find what was named and lost — a comparison needs two sides and an absence has one: walk each REQ bottom-up through its rungs (decision -> spec section -> contract AND its failure behavior -> plan task -> change -> executed test -> surface/docs), check the seam at each step, order findings BY SEAM not by file, and turn every absence into a new REQ row with its check BEFORE the table is written; findings belonging to a lower layer go back to that layer (spec -> stage 3, plan -> stage 4); record the pass's two counts (new findings vs findings caused by this run's own fixes) so the next pass can tell whether the axis is exhausted. THEN the coverage table: every REQ has a status (verified / partial / deferred / dropped) — none unknown; every verified carries evidence (a passing test name, file:line, a command and its output, or a scenario ID) — 'done' without evidence is downgraded to partial, not upgraded, and a green from a check nobody has watched fail against a planted defect is not evidence at all; every partial names what is missing and where it is tracked; every deferred/dropped has the operator's agreement and, for deferred, a tracker entry; no carry-over row is left unresolved and the ledger's counts are printed beside this verdict, so 'green' never reads as 'verified'; EVERY REPOSITORY IS CLOSED, THE PARENT INCLUDED — a submodule is finished only when its parent points at it, so 'git submodule status' shows no line starting with '+' and every repo is clean and pushed ('git -C <repo> status --porcelain' and 'git -C <repo> log @{u}..HEAD' both empty), because a parent records a submodule as a pointer to one commit and moving the submodule does not move the pointer: neither repo looks wrong alone and the disagreement survives every check that runs inside one; and the operator answers the closing question — here is what you asked for, here is what shipped, here is what is deferred, what is missing? — and signs off"
166
+ "check": "Close the circle. FIRST the LADDER WALK (references/audit.md), because the REQ table can only find what was named and lost — a comparison needs two sides and an absence has one: walk each REQ bottom-up through its rungs (decision -> spec section -> contract AND its failure behavior -> plan task -> change -> executed test -> surface/docs), check the seam at each step, order findings BY SEAM not by file, and turn every absence into a new REQ row with its check BEFORE the table is written; findings belonging to a lower layer go back to that layer (spec -> stage 3, plan -> stage 4); record the pass's two counts (new findings vs findings caused by this run's own fixes) so the next pass can tell whether the axis is exhausted. THEN the coverage table: every REQ has a status (verified / partial / deferred / dropped) — none unknown; every verified carries evidence (a passing test name, file:line, a command and its output, or a scenario ID) — 'done' without evidence is downgraded to partial, not upgraded, and a green from a check nobody has watched fail against a planted defect is not evidence at all; every partial names what is missing and where it is tracked; every deferred/dropped has the operator's agreement and, for deferred, a tracker entry; no carry-over row is left unresolved and the ledger's counts are printed beside this verdict, so 'green' never reads as 'verified'; EVERY REPOSITORY IS CLOSED, THE PARENT INCLUDED — a submodule is finished only when its parent points at it, so 'git submodule status' shows no line starting with '+' and every repo is clean and pushed ('git -C <repo> status --porcelain' and 'git -C <repo> log @{u}..HEAD' both empty), because a parent records a submodule as a pointer to one commit and moving the submodule does not move the pointer: neither repo looks wrong alone and the disagreement survives every check that runs inside one; and the operator answers the closing question — here is what you asked for, here is what shipped, here is what is deferred, what is missing? — and signs off. LAST ACT, THE RETROSPECTIVE (references/retrospective.md, written to docs/superpowers/retro.md — one file per project, not per run, because every gate in this flow is good at THIS run and blind across runs): PRUNE BEFORE YOU ADD — every standing instruction checked against its three retirement triggers (it became a check; every path/command/stage it names is gone; it has not fired in the last five run stamps), the list held to its hard cap of ten (at eleven the oldest never-fired row goes — 'they all matter' is the state in which the list stopped being read), and EVERY DELETION LOGGED as one line, never silent; THEN stamp the run (date, topic, verdict, counts); 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 agent was careless' is not one), the fix by grade (mechanical check > standing instruction with its retire-when written at birth > a note that expires in two runs), and the check that catches it the first time from now on. A retro left empty after a messy run is the failure this file exists to stop, and the retro counts are printed beside this gate's verdict like the carry-over ledger's, so a list that quietly grew back is visible where it happened."
162
167
  }
163
168
  }
164
169
  ],
@@ -167,7 +172,7 @@
167
172
  "trigger": "tag",
168
173
  "steps": [
169
174
  "create a GitHub release from the matching CHANGELOG section",
170
- "npm publish (task-pipeline-skill) — human 2FA step, not automated"
175
+ "npm publish (task-pipeline-skill) — a second job in the same workflow, armed per repository by the PUBLISH_NPMJS variable (NPM_TOKEN granular automation token, or trusted publishing via OIDC); unarmed it falls back to a human 2FA step"
171
176
  ],
172
177
  "verify": [
173
178
  "CI green on the tagged commit",
@@ -153,6 +153,32 @@ never captured, and this is the cheapest moment in the whole run to hear it. An
153
153
  answer here becomes new REQ rows or new ledger entries — not a new argument about
154
154
  whether the run was finished.
155
155
 
156
+ ## The retrospective — the run's last act
157
+
158
+ After the closing question, before the run is called done:
159
+ [`retrospective.md`](retrospective.md), written to `docs/superpowers/retro.md`.
160
+ Every run **prunes and stamps**; only a run that *diverged* writes an entry.
161
+
162
+ The order is fixed, because a lesson that lands in a cluttered file is a lesson
163
+ nobody reaches:
164
+
165
+ 1. **Prune first.** Every standing instruction is checked against its three
166
+ retirement triggers — it became a check, its surface is gone, or it has not
167
+ fired in the last five run stamps — and the list is held to its cap of **ten**.
168
+ Every deletion writes one line in the log; silent deletion is forbidden.
169
+ 2. **Stamp the run** — one line: date, topic, verdict, retro counts.
170
+ 3. **Write the entry, if the run diverged** — symptom, the stage it surfaced at,
171
+ the stage that *owned* it, the root cause, the fix (mechanical > standing
172
+ instruction > note with an expiry), and the check that catches it next time.
173
+
174
+ The counts are printed **beside this gate's verdict**, exactly like the carry-over
175
+ ledger's, so a list that quietly grew back is visible at the moment it happened:
176
+
177
+ ```
178
+ GATE 10 acceptance: PASS — 14/14 REQ verified
179
+ carry-over: 0 unresolved · retro: 7 standing (was 9) · retired 3 · added 1
180
+ ```
181
+
156
182
  ## GATE (manual)
157
183
 
158
184
  All of:
@@ -174,6 +200,11 @@ All of:
174
200
  shows no `+`, and each repo is clean and pushed. A submodule is finished when
175
201
  its parent points at it.
176
202
  9. **The operator answers the closing question** and signs off.
203
+ 10. **The retrospective is written** ([`retrospective.md`](retrospective.md)) — the
204
+ prune ran **before** anything was added (standing instructions checked against
205
+ their retirement triggers, the list at or under its cap of ten, every deletion
206
+ logged), the run is stamped, and a run that diverged has its entry with a root
207
+ cause and a named check. The counts are printed beside this verdict, not filed.
177
208
 
178
209
  Manual by design. An automated check can prove the table is *well-formed*; only
179
210
  the person who asked can confirm it is *what they asked for*. Do not let a green
@@ -13,6 +13,7 @@ docs/
13
13
  adr/
14
14
  NNNN-<slug>.md # stage 0 — ADRs for hard-to-reverse decisions
15
15
  superpowers/
16
+ retro.md # stage 10's last act — ONE per project, not per run
16
17
  specs/
17
18
  YYYY-MM-DD-<topic>-brief.md # stage 0 — locked intake brief (grill output)
18
19
  YYYY-MM-DD-<topic>-carryover.md # stage 0 seeds it; EVERY stage appends; stage 10 reads it
@@ -29,6 +30,10 @@ docs/
29
30
  audits/YYYY-MM-DD-<scope>.md # ux-audit reports
30
31
  plans/YYYY-MM-DD-<scope>.md # super-ux fix plans (may hand off to this pipeline)
31
32
  lint.py, README.md # seeded by super-ux
33
+ graphify-out/ # git-ignored: the code graph, if one is built
34
+ graph.json # stage 0 queries it; stage 9 refreshes it
35
+ GRAPH_REPORT.md graph.html # the plain-language report + interactive view
36
+ manifest.json cache/ # extraction bookkeeping — never edited by hand
32
37
  ```
33
38
 
34
39
  Naming: date-prefixed `YYYY-MM-DD-<topic>` slugs, one topic per file, kebab-case.
@@ -57,13 +62,14 @@ record (see `build.md`).
57
62
  | 0 Intake | `specs/<topic>-brief.md` — incl. the **REQ table** (seed from `templates/brief.md`) | stages 2–5, 7, 10 |
58
63
  | 0→10 all | `specs/<topic>-carryover.md` — append-only ledger (seed from `templates/carryover.md`) | stage 10, in full |
59
64
  | 10 Acceptance | `specs/<topic>-acceptance.md` — every REQ with a status and evidence | the operator |
65
+ | 10 Retro | `superpowers/retro.md` — standing instructions (max 10), the problem→cause→fix log, run stamps. Pruned **before** anything is added (`retrospective.md`) | **stage 0 of the next run**, in full |
60
66
  | 0 Grill (domain) | `CONTEXT.md`, `docs/adr/NNNN-<slug>.md` — created **lazily**, only when a term resolves or a decision qualifies | stages 2–4 + the repo |
61
67
  | 2 Decompose | `specs/<topic>-modules.md` — module map, build order, contracts, per-module status (platforms only) | stages 3–10, every module's run |
62
68
  | 3 Spec | `specs/<topic>-design.md` — module dossier for a decomposed platform (+ links `docs/ux/*` for UI) | stage 4 |
63
69
  | 4 Plan | `plans/<topic>.md` | stage 5 |
64
70
  | 3 UX track | `docs/ux/{foundation,flows,screens,scenarios}.md` | stages 4–9 + `/ux-lint` |
65
71
  | 8 Post-deploy | log/health notes (in the run, not a committed file) | stage 9 |
66
- | 9 Docs+wiki | host module docs + wiki pages | |
72
+ | 9 Docs+wiki | host module docs + wiki pages + the refreshed `graphify-out/graph.json` (`knowledge-graph.md`) | the **next** run's stage-0 harvest |
67
73
 
68
74
  ## This repo (task-pipeline itself), for reference
69
75
 
@@ -78,17 +84,18 @@ plugins/task-pipeline/
78
84
  pipeline.example.json # this plugin's own flow, as config
79
85
  references/ # built-in stage doctrine:
80
86
  knowledge-sources.md grill.md # stage 0 (harvest, then interview)
87
+ knowledge-graph.md # stages 0+9: the code graph, refresh, divergence
81
88
  brainstorm.md decomposition.md # stage 2
82
89
  spec.md planning.md # stages 3-4
83
90
  build.md review.md tdd.md # stages 5-6
84
- acceptance.md # stage 10
91
+ acceptance.md retrospective.md # stage 10 (close-out, then the retro)
85
92
  audit.md # cross-cutting: the ladder + seams
86
93
  loop-guard.md # cross-cutting: churn detection
87
94
  stages.md model-tiering.md # gates, model policy
88
95
  conventions.md artifacts.md # host conventions, this layout
89
96
  companion-skills.md # optional companions + preflight
90
97
  templates/ # skeletons seeded into a host project
91
- README.md brief.md carryover.md context.md adr.md
98
+ README.md brief.md carryover.md context.md adr.md retro.md
92
99
  cursor/rules/task-pipeline.mdc # Cursor channel (self-contained rule)
93
100
  bin/task-pipeline.js # npx installer (package task-pipeline-skill)
94
101
  install.sh # POSIX installer
@@ -205,6 +205,14 @@ construction**:
205
205
  everywhere. This is the horizontal pass, and it is where it belongs.
206
206
  3. **One class swept end to end** — every error path, every count, every status
207
207
  vocabulary, every timeout, across the whole change at once.
208
+ 4. **The graph against the docs** — where a code graph exists
209
+ ([`knowledge-graph.md`](knowledge-graph.md)), it is a *second, machine-built
210
+ statement of the same system*, and disagreement is mechanical rather than
211
+ remembered: a hub `god-nodes` reports that no document names is an undocumented
212
+ seam; an edge the docs deny is either a leak in the code or a lie in the docs; a
213
+ doc naming a module the graph has no node for describes something that no longer
214
+ exists. This axis is the only one that finds absences without reading for them,
215
+ which is why it is worth rotating onto when the reading axes go quiet.
208
216
 
209
217
  **The crossover is measurable, so measure it.** Every pass, count two numbers: new
210
218
  findings, and findings caused by the previous pass's own fixes. When the second
@@ -13,6 +13,7 @@ better, plus one that is required only for user-facing work.
13
13
  | Stage | Doctrine |
14
14
  |---|---|
15
15
  | 0 Knowledge harvest (pre-grill) | `references/knowledge-sources.md` |
16
+ | 0 + 9 The code graph (the tool is optional; the doctrine ships) | `references/knowledge-graph.md` |
16
17
  | 0 Intake grill | `references/grill.md` |
17
18
  | 2 Brainstorm | `references/brainstorm.md` |
18
19
  | 2 Decompose (platforms only) | `references/decomposition.md` |
@@ -21,6 +22,7 @@ better, plus one that is required only for user-facing work.
21
22
  | 5 Build (isolation, subagents, fix loop) | `references/build.md` + `references/review.md` |
22
23
  | 5–6 TDD + suite gate | `references/tdd.md` |
23
24
  | 10 Acceptance (REQ close-out) | `references/acceptance.md` |
25
+ | 10 Retrospective (the run's last act: prune, stamp, entry) | `references/retrospective.md` |
24
26
  | 10 + any audit (finding what's missing) | `references/audit.md` |
25
27
  | any repeating loop | `references/loop-guard.md` |
26
28
 
@@ -32,6 +34,7 @@ better, plus one that is required only for user-facing work.
32
34
  | **context7** (MCP) | stage 1 docs study | Recommended (web-search fallback) | connect the context7 MCP server |
33
35
  | **Figma** (MCP) | stage 3 UX track, when the project designs visually — super-ux mirrors each `SCR-` screen/state into a frame | Optional, **UI + Figma-on only**. Absent → super-ux degrades to text-only *by itself and never blocks*, so shipping a UI feature with no mockups becomes a silent scope call — which is why the stage-0 sweep decides it | connect the Figma MCP server (`/mcp`, or your claude.ai connectors) |
34
36
  | **[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` |
37
+ | **[graphify](https://github.com/Graphify-Labs/graphify)** (`/graphify`, `graphify query\|affected\|god-nodes`) | **stage 0 harvest** (reach: what calls this, what breaks if it moves) **+ stage 9 refresh + the graph↔docs divergence check** ([`knowledge-graph.md`](knowledge-graph.md)) | **Recommended** — never a gate; absent → the harvest greps instead, and the divergence axis is unavailable | `uv tool install graphifyy` → `graphify install` → `/graphify .` |
35
38
  | ~~superpowers~~ | — | **Not a dependency.** Stages 2/4/5/6 run on the built-in doctrine above. See *Optional bridge* | — |
36
39
  | ~~grill-me / grilling~~ | — | **Not a dependency.** The stage-0 grill is built in (`references/grill.md`) | — |
37
40
 
@@ -73,6 +76,13 @@ Pipeline companions (stage doctrine is built in — nothing to install for it):
73
76
  pip install obsidian-wiki
74
77
  obsidian-wiki setup --vault /path/to/your/vault
75
78
  (running without it — the harvest uses repo docs only)
79
+ ✗ graphify — recommended: stage 0 asks it what reaches what,
80
+ stage 9 refreshes it beside the docs and the wiki:
81
+ uv tool install graphifyy
82
+ graphify install
83
+ /graphify . (once, in this project)
84
+ (running without it — no reach queries, no graph↔docs
85
+ divergence check)
76
86
 
77
87
  🧠 Model for this run: recommended <top tier available>. You're on <current>.
78
88
  /model <id> to switch, or "keep current", or name per-stage overrides.
@@ -88,6 +98,11 @@ Rules:
88
98
  `wiki-query`/`wiki-update`. Present → say `✓ ready` and use it in the harvest.
89
99
  Absent → print the two install lines **once** and continue; never ask twice in a
90
100
  run and never block a stage on it ([`knowledge-sources.md`](knowledge-sources.md)).
101
+ - **graphify**: detect via `graphify-out/graph.json` (built → `✓ ready`, query it in
102
+ the harvest) or a resolving `graphify` binary with no `graphify-out/` (installed,
103
+ not built → offer the one-line `/graphify .`). Absent → print the install lines
104
+ **once** and continue. Same law as the wiki: recommended, never a gate, never
105
+ asked twice ([`knowledge-graph.md`](knowledge-graph.md)).
91
106
  - **Figma MCP**: flag it only when the task is user-facing **and** the project
92
107
  designs visually — read `docs/ux/foundation.md` → *Design tooling* first; no
93
108
  record yet means the choice itself is a stage-0 question (super-ux's default is
@@ -44,6 +44,12 @@ found, surface it and **ask** rather than guessing.
44
44
  into the host's own docs (`CLAUDE.md`, or the README) in this change, so the next
45
45
  run reads the destination instead of creating a second file
46
46
  ([`grill.md`](grill.md) → *The design destination*).
47
+ - **The code graph:** [graphify](https://github.com/Graphify-Labs/graphify) —
48
+ `/graphify . --update` when `graphify-out/` exists, in the same change as the docs
49
+ and the wiki ([`knowledge-graph.md`](knowledge-graph.md)). It is derived, so
50
+ `graphify-out/` is git-ignored unless the project's own `CLAUDE.md` says the team
51
+ commits it. A project that uses a different graph/index tool names its refresh
52
+ command there, and that wins.
47
53
  - **Wiki:** [obsidian-wiki](https://github.com/ar9av/obsidian-wiki) — the
48
54
  `wiki-update` skill (resolves the vault via `~/.obsidian-wiki/config`). Detect it
49
55
  the same way the harvest does; if absent, recommend it once
@@ -130,7 +130,7 @@ explicit "stop and ask me here":
130
130
  | Stage | What to settle up front |
131
131
  |---|---|
132
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) |
133
+ | 0 Harvest | doc sources beyond this repo — other repos, hosted doc systems, the knowledge wiki, **the code graph** ([`knowledge-graph.md`](knowledge-graph.md): built / installed-not-built / absent) — and whether stage 9 may write to them (another repo is outward: propose + PR, never a direct push) |
134
134
  | 1 Docs | external libs/APIs/SDKs in play; any private ones context7 can't resolve → where their docs live |
135
135
  | 2 Decompose | is this a platform (several capabilities/surfaces) or one module? if platform: deploy cadence — per module or once at the end |
136
136
  | 2–3 Spec | UI verdict (arms super-ux); any scenario-tracing waiver |
@@ -141,8 +141,8 @@ explicit "stop and ask me here":
141
141
  | 6 Tests | the test command; what "green" means here; known-red baseline; coverage expectation |
142
142
  | 7 Lint+deploy | lint command; deploy target and path; release automation on/off; deploy-from-main rule; **deploy authorization** |
143
143
  | 8 Post-deploy | where logs / health live (app name, endpoint, workflow) |
144
- | 9 Docs+wiki | which module docs / runbooks this change updates; wiki sync yes/no |
145
- | 10 Acceptance | who signs off; where deferred REQs are tracked (issue tracker, backlog) |
144
+ | 9 Docs+wiki | which module docs / runbooks this change updates; wiki sync yes/no; **code-graph refresh yes/no** (`/graphify . --update` — the third close-out artifact) |
145
+ | 10 Acceptance | who signs off; where deferred REQs are tracked (issue tracker, backlog); the **retro file** — does `docs/superpowers/retro.md` exist, and are its standing instructions in force for this run ([`retrospective.md`](retrospective.md)) |
146
146
 
147
147
  **Deploy authorization has a hard floor.** Deploy and publish are outward and
148
148
  irreversible, so a vague "just do everything" authorizes nothing. A standing
@@ -0,0 +1,159 @@
1
+ # The code graph — an index of reach, refreshed with the docs
2
+
3
+ A grep finds a **name**. A graph finds **reach**: what actually calls this, what
4
+ breaks if it moves, which module every change passes through. That is the question
5
+ stage 0 needs answered before it asks the operator anything, and it is the question
6
+ no document answers reliably — documents describe the reach the author remembered.
7
+
8
+ The graph this pipeline is built to work with is
9
+ **[graphify](https://github.com/Graphify-Labs/graphify)** — it turns a folder of
10
+ code and docs into a persistent knowledge graph (`graphify-out/graph.json`, an HTML
11
+ view and a plain-language `GRAPH_REPORT.md`), with community detection and
12
+ query / path / explain / affected traversals.
13
+
14
+ It is **recommended, never required**. No stage blocks on a missing graph; the
15
+ harvest simply runs on the sources it has
16
+ ([`knowledge-sources.md`](knowledge-sources.md)).
17
+
18
+ ## Detect it, and install it once
19
+
20
+ Detect, in this order:
21
+
22
+ - `graphify-out/graph.json` exists → the graph is **built**; use it.
23
+ - `command -v graphify` resolves but there is no `graphify-out/` → the tool is
24
+ installed, the graph is not built. Offer to build it (one command, below).
25
+ - Neither → recommend it **once**, in the preflight block
26
+ ([`companion-skills.md`](companion-skills.md)), with the lines:
27
+
28
+ ```bash
29
+ uv tool install graphifyy # the CLI
30
+ graphify install # add the /graphify skill to this agent
31
+ ```
32
+
33
+ then, in the project root:
34
+
35
+ ```
36
+ /graphify .
37
+ ```
38
+
39
+ Then continue. Never ask twice in a run, and never hold a gate on it.
40
+
41
+ `graphify-out/` is **derived**, so it is git-ignored by default — add it to the
42
+ host's `.gitignore` in the same change that builds it. A team that wants the graph
43
+ shared commits it instead and installs graphify's own git merge driver; that is the
44
+ project's call, recorded in its `CLAUDE.md`, not this pipeline's default.
45
+
46
+ ## Stage 0 — query the graph before you ask the person
47
+
48
+ The graph is a **source in the ledger**, read like any other, and it is the fastest
49
+ one: it answers structural questions in a single call that would otherwise be a
50
+ dozen greps.
51
+
52
+ | Ask | Command |
53
+ |---|---|
54
+ | How does this work / where does this live? | `graphify query "how does session reach the API layer"` |
55
+ | What is this thing? | `graphify explain "AuthModule"` |
56
+ | What breaks if I change it? | `graphify affected "AuthModule"` |
57
+ | How do these two connect? | `graphify path "AuthModule" "Database"` |
58
+ | What is architecturally central? | `graphify god-nodes` |
59
+
60
+ **What you get depends on what the repo is made of.** Code is extracted
61
+ structurally, so `affected` and `path` are sharp on a code repo and return nothing
62
+ useful on one that is mostly prose — there, the nodes are documents and headings,
63
+ and the *divergence check* below is the half that pays. Say which one you are
64
+ looking at rather than reporting an empty traversal as an absence of coupling.
65
+
66
+ Two rules keep it honest:
67
+
68
+ - **The graph points, the code decides.** It is an index built at a moment in time;
69
+ a graph from two weeks ago is exactly as stale as a doc from two weeks ago. It
70
+ belongs in the retrieval order right after the code, and never as the tiebreaker.
71
+ Precedence, reflowed so it reads in one direction: code first, then host docs and
72
+ ADRs, then the graph, then the wiki, then anyone's memory.
73
+ - **Record it in the ledger with its build date** — source
74
+ `graphify-out/graph.json`, what it said about this task, how fresh, and therefore
75
+ whether stage 9 owes it a refresh. A source consulted but not recorded is a source
76
+ nobody will update.
77
+
78
+ ## Stage 9 — the close-out has three artifacts, not two
79
+
80
+ The run is not written up until all three describe the same system:
81
+
82
+ 1. **The docs** — host module docs and runbooks, in the same change.
83
+ 2. **The wiki** — `wiki-update`, the distilled *why*.
84
+ 3. **The graph** — re-extracted from what this run just changed. **Two forms, and
85
+ the difference is the whole point of doing it at stage 9:**
86
+
87
+ ```
88
+ /graphify . --update # in the agent: code AND docs, incremental — use this
89
+ ```
90
+
91
+ ```bash
92
+ graphify update . # CLI shortcut: code ONLY, structural, no model, no key
93
+ ```
94
+
95
+ Stage 9 is the stage that *changed the docs*, so the CLI shortcut is the wrong
96
+ default here: it re-extracts code and leaves every edited document at its old
97
+ text, which produces the most expensive kind of stale graph — one that was
98
+ refreshed. The CLI's own last line says as much (*"for doc/paper/image changes
99
+ run `/graphify --update` in your AI assistant"*). Use the CLI form only when the
100
+ change was code-only.
101
+
102
+ Incremental either way: only new and changed files are re-extracted. On a run
103
+ that deleted code the rebuild legitimately has fewer nodes, and refuses to
104
+ overwrite until you say so — that is what `--force` is for.
105
+
106
+ **Why it is a peer of the docs and not an afterthought:** the next run's stage-0
107
+ harvest queries this graph *first*, and a stale graph is a false premise delivered
108
+ with the authority of a machine. A wrong doc gets argued with. A wrong graph gets
109
+ believed.
110
+
111
+ Gate wording (stage 9, `auto`): where a graph exists, it is refreshed in this
112
+ change, or the reason it wasn't is written in the carry-over ledger.
113
+
114
+ ## The divergence check — the graph against the docs
115
+
116
+ Refreshing the graph is bookkeeping. The **check** is the payoff: two independent
117
+ statements of the same system, so where they disagree, one of them is wrong and
118
+ nobody had a way to notice. Run it as a pass, not as a linter — every close-out for
119
+ the cheap half, the full sweep whenever the audit rotates onto this axis
120
+ ([`audit.md`](audit.md) → *Every pass changes the axis*).
121
+
122
+ | Ask the graph | Command | A disagreement means |
123
+ |---|---|---|
124
+ | What are the hubs? | `graphify god-nodes` | a hub **no doc names** is an undocumented seam — the thing every change passes through and nothing explains |
125
+ | What reaches what? | `graphify path "A" "B"` | an edge the docs **deny** ("these layers don't touch") is either a leak in the code or a lie in the docs — both are findings, and which one is a decision, not a guess |
126
+ | What does this change touch? | `graphify affected "X"` | callers the docs never mention → the documented blast radius is smaller than the real one |
127
+ | What is weakly connected? | `GRAPH_REPORT.md` communities + low-degree nodes | code that nothing — no doc, no test, no caller — reaches |
128
+
129
+ And the reverse direction, which is the one that catches rot: **a doc that names a
130
+ module, file or command the graph has no node for** describes something that no
131
+ longer exists. That is a stale row in the stage-0 ledger, found mechanically instead
132
+ of by remembering.
133
+
134
+ Where the findings go:
135
+
136
+ - **At stage 9** — a doc that is wrong about reach is fixed in this change, like
137
+ any other stale ledger row.
138
+ - **At stage 10** — a seam nobody documented is an *absence*, and absences are what
139
+ the ladder walk exists to convert into REQ rows with their checks
140
+ ([`audit.md`](audit.md), [`acceptance.md`](acceptance.md)). It goes in **before**
141
+ the coverage table, never after.
142
+ - **Never "fixed" in the graph.** The graph is derived. You fix the doc or you fix
143
+ the code, then re-run the extraction and the disagreement disappears on its own.
144
+ A hand-edited graph is a third statement, and now nothing is authoritative.
145
+
146
+ **Cadence.** The refresh is every stage-9 close-out. The full sweep is periodic —
147
+ stage 10, or whenever a pass on another axis stops finding anything new. Running the
148
+ sweep on every commit turns an audit axis into noise and it stops being read.
149
+
150
+ ## Rationalizations
151
+
152
+ | Excuse | Reality |
153
+ |---|---|
154
+ | "I'll just grep, it's faster" | Grep answers "where is this name". The questions that stop a run are "what reaches this" and "what breaks if it moves" — that is one query against a graph and an afternoon with grep. |
155
+ | "The graph is probably stale" | Then it has a build date and you can say so. Stale-and-dated is a finding; stale-and-unknown is what you get by not building one. |
156
+ | "Docs and wiki are updated, we're done" | The graph is the source the *next* harvest reads first. Leaving it behind is leaving a false premise where a machine will quote it back. |
157
+ | "The divergence check found nothing, skip it next time" | It found nothing **on this axis, this pass**. Rotate the axis; that is the rule this check belongs to, not an exemption from it. |
158
+ | "A hub with no doc is fine, everyone knows it" | Everyone currently on the team. The graph found it in one command; the person who joins next month will find it in a postmortem. |
159
+ | "Building the graph costs an LLM run" | Code is extracted structurally, with no model and no API key. The cost you are avoiding is a rebuild you already paid for. |
@@ -26,23 +26,73 @@ makes the grill's answers *checkable* instead of merely confident.
26
26
  | # | Source | How to find it | What it's good for |
27
27
  |---|---|---|---|
28
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 |
29
+ | 2 | **The code graph** | `graphify-out/graph.json` see below | *reach*: what calls this, what breaks if it moves, what every change passes through |
30
+ | 3 | **Host agent docs** | `CLAUDE.md`, `AGENTS.md`, `.cursor/rules/` | conventions, commands, deploy path, house rules |
31
+ | 4 | **Domain docs** | `CONTEXT.md` / `CONTEXT-MAP.md`, `docs/adr/` | the glossary and the decisions with their reasons |
32
+ | 5 | **Product/UX docs** | `docs/ux/` (super-ux chain), `README`, runbooks | user-facing behavior that is already specified |
33
+ | 6 | **Pipeline history** | `docs/superpowers/specs/`, `plans/`, past `-carryover.md` | what a previous run of this pipeline decided or deferred |
34
+ | 7 | **The retro's standing instructions** | `docs/superpowers/retro.md` ([`retrospective.md`](retrospective.md)) | what previous runs got wrong here **read in full**, they are capped at ten |
35
+ | 8 | **The knowledge wiki** | see below | distilled cross-project knowledge, prior sessions, why decisions were made |
36
+ | 9 | **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 |
37
+ | 10 | **Hosted doc systems the project names** | Notion / Confluence / Google Docs referenced in the project | the same, when the team keeps them there |
36
38
 
37
39
  Rules for the list:
38
40
 
39
41
  - **Never invent a source.** A doc repo is in scope because the project names it,
40
42
  not because it plausibly exists. Nothing is cloned or fetched on a guess.
41
- - **Sources 78 are read-only at this stage**, and reading a hosted system needs a
43
+ - **Sources 910 are read-only at this stage**, and reading a hosted system needs a
42
44
  connected tool — if there's no tool, record the gap and ask the operator to paste
43
45
  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
+ - **The wiki and the graph are optional; the harvest is not.** With no wiki, no
47
+ graph and no doc repos, the harvest is sources 1 and 37 and takes two minutes.
48
+ Skipping it is never the answer.
49
+ - **Source 7 is read in full, not queried.** It is capped at ten instructions
50
+ precisely so that this is cheap, and it is the one source that *binds* the run
51
+ rather than informing it.
52
+
53
+ ## The retro's standing instructions — an instruction source, not background
54
+
55
+ `docs/superpowers/retro.md` ([`retrospective.md`](retrospective.md)) is the one
56
+ harvested source that is **read in full rather than queried**: the standing
57
+ instructions are capped at ten precisely so that this is cheap. They are what
58
+ previous runs of this pipeline got wrong *in this project* — the rules no check
59
+ could decide — and they bind this run.
60
+
61
+ Two obligations that come with reading them:
62
+
63
+ - **Stamp an instruction the moment it fires.** That date is the only evidence
64
+ behind the cold-retirement rule at stage 10; without it "hasn't fired in five
65
+ runs" is a guess and the prune becomes a mood.
66
+ - **Record the file as a ledger row**, like any other source. It is also the row
67
+ stage 10 writes back to, which is what closes this particular loop.
68
+
69
+ ## The code graph — recommended
70
+
71
+ Full doctrine: [`knowledge-graph.md`](knowledge-graph.md). In one paragraph: a grep
72
+ finds a **name**, a graph finds **reach** — what calls this, what breaks if it
73
+ moves, which module every change passes through. That is the class of question the
74
+ harvest most needs answered and the class documents answer least reliably, because a
75
+ document records the reach its author remembered.
76
+
77
+ **Detect it** — `graphify-out/graph.json` exists (built), or `graphify` resolves but
78
+ the directory doesn't (installed, not built).
79
+
80
+ - **Built → query it** during the harvest: `graphify query "<the task, as a
81
+ question>"`, `graphify affected "<the thing being changed>"`, `graphify god-nodes`.
82
+ Record the row **with the graph's build date**, because a graph is a source and
83
+ goes stale like one.
84
+ - **Not installed → recommend it once**, in the preflight block, with the lines:
85
+
86
+ ```bash
87
+ uv tool install graphifyy # the CLI
88
+ graphify install # add the /graphify skill to this agent
89
+ ```
90
+
91
+ then `/graphify .` in the project root. Then continue — it is a
92
+ **recommendation, never a gate**, exactly like the wiki.
93
+
94
+ The graph **points; the code decides.** Retrieval order puts it right after the
95
+ code, never as the tiebreaker.
46
96
 
47
97
  ## The knowledge wiki — recommended
48
98
 
@@ -139,6 +189,13 @@ The ledger is the stage-9 work list. For each row:
139
189
  resolved verbally.
140
190
  - **The wiki** — `wiki-update` syncs what this run learned. Distil the *knowledge*
141
191
  (decisions, seams, gotchas, why), never a diff summary.
192
+ - **The graph** — `/graphify . --update` re-extracts what this run changed
193
+ ([`knowledge-graph.md`](knowledge-graph.md)). It is a **peer of the docs, not an
194
+ afterthought**: the next run's harvest queries it first, and a stale graph is a
195
+ false premise delivered with the authority of a machine. A wrong doc gets argued
196
+ with; a wrong graph gets believed. Refreshing it also enables the cheap half of
197
+ the **divergence check** — a hub no doc names, an edge the docs deny, a doc naming
198
+ a module the graph no longer has.
142
199
  - **Another repository's docs** — writing to a repo the operator didn't ask you to
143
200
  touch is **outward**: propose the change, get an explicit go, then open a PR
144
201
  there. Absent a go, it goes in the carry-over ledger with the exact edit needed.
@@ -133,3 +133,11 @@ answer would have exposed it in a minute.
133
133
  | 6 Tests | 4, 5, 10, 11 — every new check probed both ways, measured, and asserted on its exit code |
134
134
  | 9 Docs | 8, 14 — every number computed, every target resolvable |
135
135
  | 10 Acceptance | 1, 3, 6, 7 — axis rotation recorded, closure verified against artefacts, classes swept, ratchets printed |
136
+
137
+ **This file is the shipped list; a project keeps its own.** These fourteen were
138
+ earned on someone else's build and travel with the skill. The lessons *your*
139
+ project buys go in its retro ([`retrospective.md`](retrospective.md) →
140
+ `docs/superpowers/retro.md`), where they are capped, pruned and retired — and a
141
+ lesson there that would be true in any repository belongs here instead, as an issue
142
+ upstream. A local file that accumulates universal rules is a fork of this one that
143
+ nobody named.