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.
- package/CHANGELOG.md +126 -0
- package/CONTRIBUTING.md +3 -3
- package/HOW-IT-WORKS.md +1 -1
- package/README.md +15 -1
- package/SKILL-CARD.md +1 -1
- package/bin/lib/artifact-root.js +123 -0
- package/bin/lib/migrate-artifacts.js +221 -0
- package/bin/task-pipeline.js +58 -0
- package/cursor/rules/task-pipeline.mdc +5 -5
- package/package.json +4 -3
- package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
- package/plugins/task-pipeline/commands/task-pipeline.md +3 -3
- package/plugins/task-pipeline/hooks/build-gate.sh +107 -0
- package/plugins/task-pipeline/hooks/hooks.json +48 -1
- package/plugins/task-pipeline/hooks/run-lifecycle.sh +89 -0
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.example.json +2 -2
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json +17 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +3 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/adoption.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +43 -14
- package/plugins/task-pipeline/skills/task-pipeline/references/backlog.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/continuity.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/decomposition.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +2 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +4 -4
- package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +2 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/planning.md +2 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/portability.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/progress.md +18 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +8 -8
- package/plugins/task-pipeline/skills/task-pipeline/references/setup.md +24 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +11 -11
- package/plugins/task-pipeline/skills/task-pipeline/templates/README.md +6 -6
- package/plugins/task-pipeline/skills/task-pipeline/templates/backlog.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/templates/brief.md +4 -4
- package/plugins/task-pipeline/skills/task-pipeline/templates/carryover.md +2 -2
- package/plugins/task-pipeline/skills/task-pipeline/templates/retro-archive.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/templates/retro.md +2 -2
- 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
|
-
|
|
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
|
-
|
|
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:
|
|
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:**
|
|
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,
|
|
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
|
|
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` |
|
|
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` |
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
|
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:
|
|
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** (
|
|
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
|
-
|
|
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.**
|
|
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.**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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/
|
|
13
|
-
| `carryover.md` | `docs/
|
|
14
|
-
| `verification.md` | `docs/
|
|
15
|
-
| `backlog.md` | `docs/
|
|
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/
|
|
27
|
-
| `retro-archive.md` | `docs/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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)
|