task-pipeline-skill 1.51.0 → 1.53.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 (40) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/CONTRIBUTING.md +3 -3
  3. package/HOW-IT-WORKS.md +1 -1
  4. package/README.md +15 -1
  5. package/SKILL-CARD.md +1 -1
  6. package/bin/lib/artifact-root.js +123 -0
  7. package/bin/lib/migrate-artifacts.js +221 -0
  8. package/bin/task-pipeline.js +58 -0
  9. package/cursor/rules/task-pipeline.mdc +5 -5
  10. package/package.json +4 -3
  11. package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
  12. package/plugins/task-pipeline/commands/task-pipeline.md +3 -3
  13. package/plugins/task-pipeline/hooks/build-gate.sh +107 -0
  14. package/plugins/task-pipeline/hooks/hooks.json +48 -1
  15. package/plugins/task-pipeline/hooks/run-lifecycle.sh +89 -0
  16. package/plugins/task-pipeline/skills/task-pipeline/pipeline.example.json +2 -2
  17. package/plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json +17 -1
  18. package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +3 -3
  19. package/plugins/task-pipeline/skills/task-pipeline/references/adoption.md +1 -1
  20. package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +43 -14
  21. package/plugins/task-pipeline/skills/task-pipeline/references/backlog.md +1 -1
  22. package/plugins/task-pipeline/skills/task-pipeline/references/continuity.md +1 -1
  23. package/plugins/task-pipeline/skills/task-pipeline/references/decomposition.md +1 -1
  24. package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +2 -2
  25. package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +4 -4
  26. package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +2 -2
  27. package/plugins/task-pipeline/skills/task-pipeline/references/planning.md +2 -2
  28. package/plugins/task-pipeline/skills/task-pipeline/references/portability.md +1 -1
  29. package/plugins/task-pipeline/skills/task-pipeline/references/progress.md +18 -3
  30. package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +8 -8
  31. package/plugins/task-pipeline/skills/task-pipeline/references/setup.md +24 -1
  32. package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +1 -1
  33. package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +11 -11
  34. package/plugins/task-pipeline/skills/task-pipeline/templates/README.md +6 -6
  35. package/plugins/task-pipeline/skills/task-pipeline/templates/backlog.md +1 -1
  36. package/plugins/task-pipeline/skills/task-pipeline/templates/brief.md +4 -4
  37. package/plugins/task-pipeline/skills/task-pipeline/templates/carryover.md +2 -2
  38. package/plugins/task-pipeline/skills/task-pipeline/templates/retro-archive.md +1 -1
  39. package/plugins/task-pipeline/skills/task-pipeline/templates/retro.md +2 -2
  40. package/plugins/task-pipeline/skills/task-pipeline/templates/run.md +16 -0
@@ -208,7 +208,7 @@ answer would have exposed it in a minute.
208
208
  **This file is the shipped list; a project keeps its own.** Every rule in the table
209
209
  above was earned on someone else's build and travels with the skill. The lessons *your*
210
210
  project buys go in its retro ([`retrospective.md`](retrospective.md) →
211
- `docs/superpowers/retro.md`), where they are capped, pruned and retired — and a
211
+ `<artifacts>/retro.md`), where they are capped, pruned and retired — and a
212
212
  lesson there that would be true in any repository belongs here instead, as an issue
213
213
  upstream. A local file that accumulates universal rules is a fork of this one that
214
214
  nobody named.
@@ -217,7 +217,7 @@ nobody named.
217
217
 
218
218
  ## What leaves this file, and why there is no cap
219
219
 
220
- `docs/superpowers/retro.md` caps its standing instructions at **ten** and retires them
220
+ `<artifacts>/retro.md` caps its standing instructions at **ten** and retires them
221
221
  on three triggers. Somebody proposes the same cap here about once a programme. It is
222
222
  the wrong instrument, and the reason is worth more than the rule.
223
223
 
@@ -28,7 +28,7 @@ this toolset, has questionable taste, and will read **only their own task**.
28
28
  Everything they need is in that task: exact paths, complete code, exact commands,
29
29
  expected output. DRY. YAGNI. TDD. Frequent commits.
30
30
 
31
- Path: `docs/superpowers/plans/YYYY-MM-DD-<topic>.md` — same `<topic>` slug as the
31
+ Path: `<artifacts>/plans/YYYY-MM-DD-<topic>.md` — same `<topic>` slug as the
32
32
  brief and the spec.
33
33
 
34
34
  ## Before writing tasks
@@ -84,7 +84,7 @@ commit.
84
84
 
85
85
  **Tech stack:** <key technologies>
86
86
 
87
- **Spec:** docs/superpowers/specs/YYYY-MM-DD-<topic>-design.md
87
+ **Spec:** <artifacts>/specs/YYYY-MM-DD-<topic>-design.md
88
88
 
89
89
  ## Global constraints
90
90
 
@@ -18,7 +18,7 @@ one repository, or a skill that has quietly learned one project's answers.
18
18
  | Kind of decision | Example | Lives in | Travels? |
19
19
  |---|---|---|---|
20
20
  | **Workflow** — how the pipeline behaves anywhere | the gate types, the loop-guard caps, the Doc Loop's seven steps, the escalation rule, the routing boundary | `references/*.md`, `templates/*`, `pipeline.example.json` | **yes — this is the bundle** |
21
- | **Project answer** — what *this* repository decided | which register it uses, its propagation matrix, its ratchet floors, its standing instructions | `docs/DOCMAP.md`, the register, `docs/superpowers/retro.md`, the brief | **no — and correctly so** |
21
+ | **Project answer** — what *this* repository decided | which register it uses, its propagation matrix, its ratchet floors, its standing instructions | `docs/DOCMAP.md`, the register, `<artifacts>/retro.md`, the brief | **no — and correctly so** |
22
22
 
23
23
  Two failures follow from confusing them, and they look nothing alike:
24
24
 
@@ -31,6 +31,7 @@ maintains them and the next run reads them as current.
31
31
  - Absent is a word, never a zero
32
32
  - The `holds:` line — what the run is still holding
33
33
  - The observation beside the claim
34
+ - The run's own lifecycle
34
35
  - The run ledger this reads from
35
36
  - Rationalizations
36
37
 
@@ -84,7 +85,7 @@ Emitted at the **close** of every iteration, one line:
84
85
  **`next` cites a `B-NNN`, never a description.** That rule is
85
86
  [`continuity.md`](continuity.md)'s and it is the reason this line exists at all:
86
87
  *"next up is X"* was already the one sentence in a loop that no gate reads. A board id
87
- can be checked against `docs/superpowers/backlog.md`; *"next up: the export fix"*
88
+ can be checked against `<artifacts>/backlog.md`; *"next up: the export fix"*
88
89
  cannot.
89
90
 
90
91
  **Nothing queued is `next —`, printed.** A loop that reaches an empty board says so;
@@ -254,9 +255,9 @@ run reports a state nobody agreed to read.
254
255
 
255
256
  | Field | Its home |
256
257
  |---|---|
257
- | `board B-NNN` | `docs/superpowers/backlog.md` ([`backlog.md`](backlog.md)) |
258
+ | `board B-NNN` | `<artifacts>/backlog.md` ([`backlog.md`](backlog.md)) |
258
259
  | `carry-over N rows` | the run's carry-over ledger, as printed beside every gate verdict |
259
- | `exposure N never` | `docs/superpowers/verification.md` ([`exposure.md`](exposure.md)) |
260
+ | `exposure N never` | `<artifacts>/verification.md` ([`exposure.md`](exposure.md)) |
260
261
  | `unlooked N` | the gate's own disclosure ([`gates.md`](gates.md) → *Disclosures*) |
261
262
  | `gates N/M` | the run ledger's verdict rows, and `pipeline.json` → `stages[]` |
262
263
 
@@ -336,6 +337,20 @@ written from memory is a summary that is confidently wrong exactly when it matte
336
337
  a gate that reads a verdict typed by the agent it constrains is the same shape
337
338
  again, and it looks like enforcement while being a mirror.
338
339
 
340
+ ## The run's own lifecycle
341
+
342
+ Three moments the rail cannot show, recorded by `hooks/run-lifecycle.sh` as
343
+
344
+ ```
345
+ event: <compact|session-end|subagent> — <detail> — <ISO-8601>
346
+ ```
347
+
348
+ The rail reads none of them; `checkup` reads `session-end`, which is how an
349
+ abandoned run stops being invisible. Before this the ledger simply stopped at
350
+ whatever stage the session died on — and a stopped ledger is indistinguishable
351
+ from a run still in progress, which is the exact shape *absent is a word, never a
352
+ zero* exists to refuse.
353
+
339
354
  ## The run ledger this reads from
340
355
 
341
356
  `.task-pipeline/run.md`, seeded at stage 0 from
@@ -18,9 +18,9 @@ justifies reading it protects one section while the file below it doubles.
18
18
 
19
19
  | Artifact | Parts | How it is read |
20
20
  |---|---|---|
21
- | `docs/superpowers/retro.md` — **one per project** | **Standing instructions** (max **10**) · **Run stamps** (max **10**, oldest rotate out) | stage 0, **in full** — both are bounded by a **cap**, which *one line each* never was |
21
+ | `docs/evidence/retro.md` — **one per project** | **Standing instructions** (max **10**) · **Run stamps** (max **10**, oldest rotate out) | stage 0, **in full** — both are bounded by a **cap**, which *one line each* never was |
22
22
  | the same file's **Recent log** | entries from the last five run stamps — narrative, and capped by nothing | stage 0, **queried** by the task's nouns. It said *in full* until 2026-08-10, when it measured **74%** of the file: an uncapped section inside a binding source is what makes the capped part get skimmed |
23
- | `docs/superpowers/retro/YYYY-QN.md` — the archive | every entry and every retirement ever written, append-only | **queried** by the task's nouns; never read end to end |
23
+ | `docs/evidence/retro/YYYY-QN.md` — the archive | every entry and every retirement ever written, append-only | **queried** by the task's nouns; never read end to end |
24
24
 
25
25
  Seed the archive from [`../templates/retro-archive.md`](../templates/retro-archive.md).
26
26
 
@@ -97,7 +97,7 @@ the neighbour's growth is *tidy*. A tidy slope is still a slope.
97
97
  **The cap is ten and the trigger is why.** The cold rule reads *the last five run
98
98
  stamps*; ten is that with a margin, so a stamp rotating out can never be one the trigger
99
99
  needed. At the eleventh, the oldest row moves — whole, with its verdict and its retro
100
- column — into `docs/superpowers/retro/YYYY-QN.md` under `## Run stamps`, append-only,
100
+ column — into `docs/evidence/retro/YYYY-QN.md` under `## Run stamps`, append-only,
101
101
  like every other rotation. **The count is printed at the prune**, beside the standing
102
102
  instructions' own count, so a table that stops rotating is visible rather than merely
103
103
  large.
@@ -141,7 +141,7 @@ this line existed it still had no way to say it never ran.
141
141
  ## Rotation — the archive is how pruning stops losing things
142
142
 
143
143
  At the prune, entries older than the last five run stamps **move** to
144
- `docs/superpowers/retro/YYYY-QN.md`. Moving is not deleting.
144
+ `docs/evidence/retro/YYYY-QN.md`. Moving is not deleting.
145
145
 
146
146
  - The archive is **append-only**, and a retirement writes its line **there**, with
147
147
  the trigger that retired it and the commit.
@@ -187,7 +187,7 @@ performable was queued behind it.
187
187
  computable, which is why it goes first:
188
188
 
189
189
  ```bash
190
- printf '%s · %s\n' "$(date +%F)" "$(git rev-parse --short HEAD)" >> docs/superpowers/retro.md
190
+ printf '%s · %s\n' "$(date +%F)" "$(git rev-parse --short HEAD)" >> docs/evidence/retro.md
191
191
  ```
192
192
 
193
193
  ## The prune — mandatory, and it runs after the stamp
@@ -217,10 +217,10 @@ grep -oE '`[^`]+`' <<<"$RULE_TEXT" | tr -d '`' | while read -r t; do
217
217
  [ -e "$t" ] || command -v "$t" >/dev/null || echo "MISSING: $t"; done
218
218
 
219
219
  # went cold — fired in none of the last five stamps
220
- tail -n 200 docs/superpowers/retro.md | grep -c "$RULE_ID"
220
+ tail -n 200 docs/evidence/retro.md | grep -c "$RULE_ID"
221
221
 
222
222
  # ...OR in the last 60 days, whichever comes first — see below for why both
223
- git log -1 --format=%cd --date=short -S"$RULE_ID" -- docs/superpowers/retro.md
223
+ git log -1 --format=%cd --date=short -S"$RULE_ID" -- docs/evidence/retro.md
224
224
  ```
225
225
 
226
226
  Anything the first two print is a deletion; a zero from the third **or** a last-fired date more
@@ -247,7 +247,7 @@ retro counts:
247
247
 
248
248
  ```bash
249
249
  git tag --sort=-v:refname | head -1 # newest release
250
- grep -m1 -oE '`[0-9a-f]{7,}`' docs/superpowers/retro.md # newest stamped commit
250
+ grep -m1 -oE '`[0-9a-f]{7,}`' docs/evidence/retro.md # newest stamped commit
251
251
  ```
252
252
 
253
253
  Then the cap: **ten standing instructions, hard.** At eleven you do not get to keep
@@ -12,6 +12,7 @@ is recorded in the brief's autonomy sweep and never asked again.
12
12
  ## Contents
13
13
 
14
14
  - When it runs
15
+ - First it says where the paperwork lives
15
16
  - What it inspects
16
17
  - The finding shape
17
18
  - The output is a fix plan, not a lecture
@@ -31,6 +32,28 @@ is recorded in the brief's autonomy sweep and never asked again.
31
32
  **Never as a recurring tax.** A check that runs before every feature is a check people
32
33
  learn to dismiss. Once per project state, then it is the gate's job.
33
34
 
35
+ ## First it says where the paperwork lives
36
+
37
+ Before any pass, one line naming **the resolved artifact root and why it resolved that
38
+ way** ([`artifacts.md`](artifacts.md) → *the root is resolved, not spelled*). Not a
39
+ finding — orientation, and the answer to the only question a rename can leave behind:
40
+
41
+ ```
42
+ artifacts: docs/superpowers/ (legacy name, resolved because the directory exists and
43
+ carries a register — the default is now docs/evidence/,
44
+ and moving is optional: npx task-pipeline
45
+ migrate-artifacts --dry-run)
46
+ artifacts: docs/evidence/ (default)
47
+ artifacts: docs/runs/ (configured — pipeline.json → paths.artifacts)
48
+ artifacts: docs/evidence/ (default, and the directory already exists without a
49
+ register — STOP AND ASK before writing into it)
50
+ ```
51
+
52
+ A project on the legacy name is **not behind and is never warned about it on a run**;
53
+ this line exists so nobody has to guess which of the two directories a gate will read.
54
+ Where records sit in both, the leftover is named here too — a partial migration is a
55
+ state somebody chose, not a fault.
56
+
34
57
  ## What it inspects
35
58
 
36
59
  Seven passes, cheapest first. Each either reports `ok`, a finding, or **`skipped —
@@ -75,7 +98,7 @@ of the project's own process is leaking.
75
98
 
76
99
  ## The output is a fix plan, not a lecture
77
100
 
78
- The audit ends with `docs/superpowers/plans/YYYY-MM-DD-doc-audit.md` — the findings
101
+ The audit ends with `<artifacts>/plans/YYYY-MM-DD-doc-audit.md` — the findings
79
102
  turned into tasks the pipeline can run, in the order that makes them terminate:
80
103
 
81
104
  1. everything the gate can enforce **after** the fix, so the class stops recurring;
@@ -67,7 +67,7 @@ entered from super-ux), verify it and embed it; build only what's missing.
67
67
 
68
68
  ## Write the spec
69
69
 
70
- Path: `docs/superpowers/specs/YYYY-MM-DD-<topic>-design.md`, committed, **same
70
+ Path: `<artifacts>/specs/YYYY-MM-DD-<topic>-design.md`, committed, **same
71
71
  `<topic>` slug as the brief** so brief → design → plan is traceable at a glance.
72
72
  (The directory name is this pipeline's historical convention, not a dependency on
73
73
  anything; a host project may relocate the root via its `CLAUDE.md` — keep the
@@ -101,7 +101,7 @@ never that the work was skipped quietly.
101
101
  when one is built ([`knowledge-graph.md`](knowledge-graph.md): `graphify query` /
102
102
  `affected` / `god-nodes` answer *reach*, which is what grep cannot), `CLAUDE.md`,
103
103
  `CONTEXT.md`/ADRs, `docs/` + `docs/ux/`, past pipeline briefs and carry-over
104
- ledgers, **the retro's standing instructions and run stamps** (`docs/superpowers/retro.md`,
104
+ ledgers, **the retro's standing instructions and run stamps** (`<artifacts>/retro.md`,
105
105
  read **in full** — ten standing rows and ten stamps, both bounded **by a cap**, and they bind this
106
106
  run; stamp each instruction as it fires. Its *Recent log* is **queried** by the
107
107
  task's nouns, not read: uncapped narrative inside a binding source is what makes the
@@ -185,7 +185,7 @@ never that the work was skipped quietly.
185
185
  now (use it if installed; otherwise give the install line — see SKILL.md
186
186
  *Prerequisites*); this arms the stage-3 UX track.
187
187
  - **Artifact:** lock the resolved decisions into a **task brief** committed at
188
- `docs/superpowers/specs/YYYY-MM-DD-<topic>-brief.md` (scope, users/UI verdict,
188
+ `<artifacts>/specs/YYYY-MM-DD-<topic>-brief.md` (scope, users/UI verdict,
189
189
  constraints, assumptions, explicitly-deferred items, done-criteria) **plus the
190
190
  autonomy sweep's per-stage answers and the model decision**. Seed it from
191
191
  the skill's `templates/brief.md` skeleton — but only when absent, never
@@ -213,7 +213,7 @@ never that the work was skipped quietly.
213
213
  confirms the brief. Stop when a
214
214
  re-scan surfaces no new branches (don't grill past diminishing returns;
215
215
  reversible calls can be deferred with a note). Only then start stage 1.
216
- - **The verification ledger is read.** `docs/superpowers/verification.md` — the harvest
216
+ - **The verification ledger is read.** `<artifacts>/verification.md` — the harvest
217
217
  quotes **how many rows sit at `never`**, because that is the project's standing
218
218
  exposure and stage 0 is where it is cheapest to look ([`verification.md`](verification.md)).
219
219
  - **The run ledger is seeded and the header block is printed** — in that order, before
@@ -224,7 +224,7 @@ never that the work was skipped quietly.
224
224
  [`progress.md`](progress.md) derives the rail and the iteration counter from the
225
225
  `stage:` and `iter:` lines. The header goes out before the interview because a run
226
226
  that announces its position only at the end announced it to nobody.
227
- - **The board is read, or seeded.** `docs/superpowers/backlog.md` ([`backlog.md`](backlog.md)) — its **open count is quoted in the brief**, measured by a command at the top of the run rather than inherited from the last run's report. Absent ⇒ seeded from the template and said so; an empty board and no board are the same thing to work on, and only one of them can be appended to.
227
+ - **The board is read, or seeded.** `<artifacts>/backlog.md` ([`backlog.md`](backlog.md)) — its **open count is quoted in the brief**, measured by a command at the top of the run rather than inherited from the last run's report. Absent ⇒ seeded from the template and said so; an empty board and no board are the same thing to work on, and only one of them can be appended to.
228
228
 
229
229
  ## 1 — Docs study
230
230
  - **Freedom: medium** — which sources to fetch is judgement; grounding contracts on fetched docs is not ([`gates.md`](gates.md) → *Axis C*).
@@ -339,7 +339,7 @@ never that the work was skipped quietly.
339
339
  so a run designed a flow, then wrote its strings by taste and picked its values at the
340
340
  keyboard — and every gate in the pipeline reported green over both.
341
341
  - **Spec:** write the approved design to
342
- `docs/superpowers/specs/YYYY-MM-DD-<topic>-design.md` and commit it. Lock all
342
+ `<artifacts>/specs/YYYY-MM-DD-<topic>-design.md` and commit it. Lock all
343
343
  shared contracts (types, schemas, signatures, file layout). For UI tasks the
344
344
  spec **embeds the UX layer**: links the validated scenario IDs, the flows and
345
345
  `SCR-` screens, the CJM stages the feature serves, and the UX
@@ -366,7 +366,7 @@ never that the work was skipped quietly.
366
366
  ## 4 — Plan
367
367
  - **Freedom: low** — the task format is prescribed and the REQ set-comparison is mechanical ([`gates.md`](gates.md) → *Axis C*).
368
368
  - **How it runs: [`planning.md`](planning.md)** — built into this skill →
369
- `docs/superpowers/plans/YYYY-MM-DD-<topic>.md` (same slug as the brief and the
369
+ `<artifacts>/plans/YYYY-MM-DD-<topic>.md` (same slug as the brief and the
370
370
  spec). Zero-context tasks, exact
371
371
  paths, complete code in every step, TDD steps with expected output, DoD each,
372
372
  dependency graph + parallel groups, non-overlapping file ownership, and the
@@ -510,7 +510,7 @@ never that the work was skipped quietly.
510
510
  its run id** — "CI is green" written without a command behind it prints the same
511
511
  whether it looked or not ([`gates.md`](gates.md) → *False success*).
512
512
  - **Write the verification row.** One line per REQ this run shipped, into
513
- `docs/superpowers/verification.md` ([`verification.md`](verification.md)) — the run,
513
+ `<artifacts>/verification.md` ([`verification.md`](verification.md)) — the run,
514
514
  the tag or commit it went out in, what the gate said, and `Human: never` unless the
515
515
  operator confirmed during the run. The verification above already happened; this is
516
516
  the only step that makes it answerable **later**, and `never` is a fact rather than a
@@ -581,7 +581,7 @@ never that the work was skipped quietly.
581
581
  brief carries.** Both directions: a shipped feature that entered no ledger and a
582
582
  ledger row about nothing are different failures ([`verification.md`](verification.md)).
583
583
  - **The ledger's open rows are resolved onto the board.** Every carry-over row still
584
- `open` leaves with a `B-NNN` id on `docs/superpowers/backlog.md`, and the ledger row
584
+ `open` leaves with a `B-NNN` id on `<artifacts>/backlog.md`, and the ledger row
585
585
  is updated to name it ([`backlog.md`](backlog.md)). Both directions, because they are
586
586
  different failures: a ledger row pointing at an id nobody issued, and a board row
587
587
  traceable to nothing. Measured before this was built: across the ledgers in
@@ -613,7 +613,7 @@ never that the work was skipped quietly.
613
613
  - **How it runs:** built in. Read the brief's REQ table, the carry-over ledger in
614
614
  full, the plan's task statuses, git log, the final suite output, stage-8 notes and
615
615
  stage-9 doc changes (plus `docs/ux/scenarios.md` + `/ux-lint` for UI tasks). Write
616
- `docs/superpowers/specs/YYYY-MM-DD-<topic>-acceptance.md` — one row per REQ,
616
+ `<artifacts>/specs/YYYY-MM-DD-<topic>-acceptance.md` — one row per REQ,
617
617
  status `verified` / `partial` / `deferred` / `dropped`, each with **evidence** (a
618
618
  passing test name, `file:line`, a command and its output, or a scenario ID).
619
619
  "Done" without evidence is not done: downgrade to `partial` and say so rather
@@ -636,7 +636,7 @@ never that the work was skipped quietly.
636
636
  the forgotten one: `git -C <submodule> push`, then
637
637
  `git add <submodule> && git commit`.
638
638
  - **The retrospective is the run's last act** ([`retrospective.md`](retrospective.md)),
639
- written to `docs/superpowers/retro.md` — one file per project, not per run. The
639
+ written to `<artifacts>/retro.md` — one file per project, not per run. The
640
640
  pipeline's gates are good at *this* run and blind across runs: the same class of
641
641
  failure can be caught, fixed and forgotten five times and nothing in the flow
642
642
  notices it is the same one. So, in this order: **stamp the run first** (one line,
@@ -666,7 +666,7 @@ never that the work was skipped quietly.
666
666
  with a floor, neither ever a target ([`gates.md`](gates.md) → *Disclosures*); **the
667
667
  retrospective is written — stamped first, then pruned, then the entry; the
668
668
  list at or under its cap, every deletion logged in the archive with its commit,
669
- entries older than five run stamps rotated into `docs/superpowers/retro/` **and the
669
+ entries older than five run stamps rotated into `<artifacts>/retro/` **and the
670
670
  stamp table itself held to ten — at the eleventh the oldest stamp rotates whole into
671
671
  the same archive, and both counts print beside the verdict** (the stamp table is read
672
672
  in full at stage 0, so *one line per run* is a slope the prune has to stop), the run
@@ -9,10 +9,10 @@ from `super-ux`.
9
9
 
10
10
  | Template | Seeded to | Stage |
11
11
  |---|---|---|
12
- | `brief.md` | `docs/superpowers/specs/YYYY-MM-DD-<topic>-brief.md` | 0 — intake grill |
13
- | `carryover.md` | `docs/superpowers/specs/YYYY-MM-DD-<topic>-carryover.md` | 0 seeds, all stages append, 10 reads |
14
- | `verification.md` | `docs/superpowers/verification.md` | 8 writes a row per shipped REQ, 10 requires it, a human fills `Human` |
15
- | `backlog.md` | `docs/superpowers/backlog.md` | 0 seeds when absent, any stage appends, 10 resolves and re-derives |
12
+ | `brief.md` | `docs/evidence/specs/YYYY-MM-DD-<topic>-brief.md` | 0 — intake grill |
13
+ | `carryover.md` | `docs/evidence/specs/YYYY-MM-DD-<topic>-carryover.md` | 0 seeds, all stages append, 10 reads |
14
+ | `verification.md` | `docs/evidence/verification.md` | 8 writes a row per shipped REQ, 10 requires it, a human fills `Human` |
15
+ | `backlog.md` | `docs/evidence/backlog.md` | 0 seeds when absent, any stage appends, 10 resolves and re-derives |
16
16
  | `run.md` | `.task-pipeline/run.md` — **git-ignored**, one per run | 0 seeds it, every gate appends a verdict, every repeating pass a `touch:` line |
17
17
  | `context.md` | `CONTEXT.md` at the repo root (or per context) | 0 — grill, domain awareness |
18
18
  | `adr.md` | `docs/adr/NNNN-<slug>.md` | 0 — grill, hard-to-reverse decisions |
@@ -23,8 +23,8 @@ from `super-ux`.
23
23
  | `hygiene.sh` | `scripts/check-hygiene.sh` | 0 seeds it · **5 runs it after every task** · 6 and 9 run it · 10 proves it |
24
24
  | `hooks.example.json` | the project's `.claude/settings.json` | 0 — offered, never installed silently |
25
25
  | `routing-rule.md` | the operator's `CLAUDE.md` — **offered by `setup`, never written silently** | 0 / `setup` |
26
- | `retro.md` | `docs/superpowers/retro.md` — **one per project, not per run** | 10 writes (stamp → prune → entry), 0 reads it in full |
27
- | `retro-archive.md` | `docs/superpowers/retro/YYYY-QN.md` | 10 rotates into it, 0 **queries** it |
26
+ | `retro.md` | `docs/evidence/retro.md` — **one per project, not per run** | 10 writes (stamp → prune → entry), 0 reads it in full |
27
+ | `retro-archive.md` | `docs/evidence/retro/YYYY-QN.md` | 10 rotates into it, 0 **queries** it |
28
28
 
29
29
  The documentation-track templates (`docmap.md`, `decisions.md`,
30
30
  `open-questions.md`, `docgate.sh`) are seeded **together**, and they are useful at
@@ -1,6 +1,6 @@
1
1
  # Backlog — <project>
2
2
 
3
- > **The board.** One per project, at `docs/superpowers/backlog.md`. Unlike the
3
+ > **The board.** One per project, at `docs/evidence/backlog.md`. Unlike the
4
4
  > carry-over ledger, this file is **mutable**: priority is re-derived, state changes,
5
5
  > rows close. What may never happen silently is a row *disappearing* — a closed row is
6
6
  > marked closed, with the commit that closed it.
@@ -1,7 +1,7 @@
1
1
  # Task brief — <topic>
2
2
 
3
3
  > Stage-0 intake artifact. The grill fills this in and the operator confirms it
4
- > before stage 1. Copy to `docs/superpowers/specs/YYYY-MM-DD-<topic>-brief.md`.
4
+ > before stage 1. Copy to `docs/evidence/specs/YYYY-MM-DD-<topic>-brief.md`.
5
5
  > Every field is a resolved decision or an explicit deferral — no open unknowns.
6
6
 
7
7
  - **Date:** YYYY-MM-DD
@@ -58,11 +58,11 @@ source is a recorded decision, an unquoted one is an undetected divergence.
58
58
  - **Doc repos / hosted doc systems this project names:** … (or `none`)
59
59
  - **Knowledge wiki:** installed / not installed
60
60
  ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki); recommended, never a gate)
61
- - **Retro, in force:** `docs/superpowers/retro.md` — none / N standing instructions
61
+ - **Retro, in force:** `docs/evidence/retro.md` — none / N standing instructions
62
62
  (read **in full**, together with the run stamps and the recent-log window; list
63
63
  which ones bind this run, and stamp each as it fires **with the commit** — that
64
64
  stamp is the only evidence behind stage 10's cold-retirement rule)
65
- - **Retro archive:** `docs/superpowers/retro/` — **queried** by this task's nouns;
65
+ - **Retro archive:** `docs/evidence/retro/` — **queried** by this task's nouns;
66
66
  what it returned: … (or `nothing`)
67
67
  - **Code graph:** built / installed-not-built / not installed
68
68
  ([graphify](https://github.com/Graphify-Labs/graphify); recommended, never a gate —
@@ -139,7 +139,7 @@ is not neutral — it is a scheduled interruption.
139
139
  | 7 Deploy | **Authorization** — standing go, or ask every time? | … |
140
140
  | 8 Post-deploy | Where logs / health live (app name, endpoint, workflow) | … |
141
141
  | 9 Docs+wiki | Which module docs / runbooks this change updates; wiki sync yes/no; **code-graph refresh yes/no** (`/graphify . --update`); which stale ledger rows get fixed | … |
142
- | 10 Acceptance | Who signs off; where deferred REQs get tracked (issue tracker / backlog); **retro file** — `docs/superpowers/retro.md` present? which standing instructions bind this run? | … |
142
+ | 10 Acceptance | Who signs off; where deferred REQs get tracked (issue tracker / backlog); **retro file** — `docs/evidence/retro.md` present? which standing instructions bind this run? | … |
143
143
 
144
144
  > **Deploy authorization has a hard floor.** A standing go counts only if it is
145
145
  > **specific** — named target and named preconditions ("staging, once lint and the
@@ -1,7 +1,7 @@
1
1
  # Carry-over ledger — <topic>
2
2
 
3
3
  > **Append-only.** Any stage may add a row; nobody edits or deletes one. Committed
4
- > to `docs/superpowers/specs/YYYY-MM-DD-<topic>-carryover.md` beside the brief, and
4
+ > to `docs/evidence/specs/YYYY-MM-DD-<topic>-carryover.md` beside the brief, and
5
5
  > read in full by stage 10 (acceptance).
6
6
  >
7
7
  > **The rule: deferred out loud is forgotten.** If it isn't written here, it wasn't
@@ -24,7 +24,7 @@
24
24
  "Forgot" is a legitimate and useful answer here.
25
25
  - **REQ** — the requirement it belongs to, or `—` if it's outside the REQ spine.
26
26
  - **Where it lives now** — an issue id, a **board id** (`B-NNN` on
27
- `docs/superpowers/backlog.md`), or `dropped` with the operator's agreement. Those are
27
+ `docs/evidence/backlog.md`), or `dropped` with the operator's agreement. Those are
28
28
  the three ways a row is *settled*.
29
29
  **Three values are not settled and all three block the stage-10 gate:** `unresolved`,
30
30
  `open`, and a bare `backlog` — the last one because it names a place without naming a
@@ -1,7 +1,7 @@
1
1
  # Retro archive — <project> · <YYYY>-Q<N>
2
2
 
3
3
  **Append-only. Queried, never read in full.** The in-force list
4
- (`docs/superpowers/retro.md`) is capped at ten and read whole at stage 0; this file
4
+ (`docs/evidence/retro.md`) is capped at ten and read whole at stage 0; this file
5
5
  is where entries and retirements go when they age out, so pruning stops losing
6
6
  things. Doctrine: `references/retrospective.md`.
7
7
 
@@ -8,7 +8,7 @@ Doctrine: `references/retrospective.md`.
8
8
 
9
9
  **What stage 0 reads in full:** *Standing instructions*, *Run stamps* and *Recent
10
10
  log* — all three are bounded by construction, which is why the cap is not
11
- negotiable. The **archive** (`docs/superpowers/retro/YYYY-QN.md`) is *queried* by
11
+ negotiable. The **archive** (`docs/evidence/retro/YYYY-QN.md`) is *queried* by
12
12
  the task's nouns and never read end to end.
13
13
 
14
14
  ## Standing instructions (max 10 — in force right now)
@@ -33,7 +33,7 @@ row goes — the cap is not negotiable, ranking is.
33
33
 
34
34
  ## Recent log — entries from the last five run stamps (newest first)
35
35
 
36
- Older entries and every retirement **move** to `docs/superpowers/retro/YYYY-QN.md`
36
+ Older entries and every retirement **move** to `docs/evidence/retro/YYYY-QN.md`
37
37
  at the prune. Moving is not deleting: the archive is append-only and holds the
38
38
  incident forever, so pruning the in-force list costs no knowledge. This section
39
39
  stays short precisely so that reading it in full at stage 0 stays cheap.
@@ -29,6 +29,7 @@ touch: <file> — pass <N> (<stage|round|module>) — reason: <finding id / gate
29
29
  hand: <N|10> — task "<quoted>" — done <n> — surfaced <n> — decisions <n> — amb <n> (<ids or "— no register">)
30
30
  holds: <stage id> — <n> (<class: what, owner>; … or "none") — enumerated <n>/8 classes, <unlooked: classes not enumerable>
31
31
  gate: <stage id> — command "<cmd>" — exit <N> — <ISO-8601>
32
+ event: <compact|session-end|subagent> — <detail> — <ISO-8601>
32
33
  ```
33
34
 
34
35
  - **`stage:`** — written when a gate **returns**, not when the stage is entered. The
@@ -42,6 +43,19 @@ gate: <stage id> — command "<cmd>" — exit <N> — <ISO-8601>
42
43
  constrains and confirms an assertion with itself. Absent where the project
43
44
  declares no command, and the release gate then degrades to the claim alone.
44
45
 
46
+ - **`event:`** — written by `hooks/run-lifecycle.sh`, the three moments this file
47
+ otherwise cannot show. `compact` marks the boundary the ledger exists *because
48
+ of* — without it a resumed run cannot tell a compaction from nothing happening.
49
+ `session-end` marks a run whose session ended without reaching acceptance, which
50
+ is what `/task-pipeline checkup` looks for and what was previously invisible: the
51
+ ledger simply stopped, and a stopped ledger looks exactly like a run still in
52
+ progress. `subagent` records one finishing, so the `hand:` count below has
53
+ something to be checked against other than itself.
54
+
55
+ **It never writes a `hand:` line.** That shape carries `done`, `surfaced`,
56
+ `decisions` and `amb` — judgements only the agent holds, and a hook filling them
57
+ in would fabricate the evidence the line exists to provide.
58
+
45
59
  - **`iter:`** — one line per iteration closed. The progress line's counter is
46
60
  `grep -c '^iter:'`, never a number anyone remembers.
47
61
  - **`hand:`** — one per hand-back, at an iteration's close and at stage 10
@@ -69,6 +83,8 @@ stage: 1 Docs study — gate auto — verdict pass — 2026-08-10T11:31Z
69
83
  touch: src/export.ts — pass 1 (stage 5) — reason: TASK-3
70
84
  touch: src/export.ts — pass 2 (stage 5) — reason: F-014
71
85
  touch: src/export.ts — pass 3 (stage 5) — reason: F-014
86
+ event: compact — auto — 2026-08-10T11:58Z
87
+ event: subagent — general-purpose — 2026-08-10T12:00Z
72
88
  gate: 6 — command "npm test" — exit 0 — 2026-08-10T12:02Z
73
89
  stage: 6 Tests — gate manual — verdict pass — 2026-08-10T12:03Z
74
90
  hand: 3 — task "add CSV export to the orders table" — done 2 — surfaced 1 — decisions 1 — amb 2 (OQ-0007, ledger row 4)