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.
- package/CHANGELOG.md +109 -0
- package/README.md +120 -4
- package/cursor/rules/task-pipeline.mdc +62 -7
- package/package.json +1 -1
- package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
- package/plugins/task-pipeline/commands/task-pipeline.md +12 -6
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +38 -6
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.example.json +15 -10
- package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +31 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +10 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/audit.md +8 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +15 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/conventions.md +6 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +3 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-graph.md +159 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +67 -10
- package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +8 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +117 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +42 -7
- package/plugins/task-pipeline/skills/task-pipeline/templates/README.md +11 -5
- package/plugins/task-pipeline/skills/task-pipeline/templates/brief.md +14 -6
- 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-
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
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 | **
|
|
30
|
-
| 3 | **
|
|
31
|
-
| 4 | **
|
|
32
|
-
| 5 | **
|
|
33
|
-
| 6 | **
|
|
34
|
-
| 7 | **
|
|
35
|
-
| 8 | **
|
|
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
|
|
43
|
+
- **Sources 9–10 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
|
|
45
|
-
harvest is sources 1–
|
|
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 3–7 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.
|