task-pipeline-skill 1.6.0 → 1.7.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 +137 -0
- package/README.md +68 -8
- package/cursor/rules/task-pipeline.mdc +82 -0
- package/package.json +5 -2
- package/plugins/task-pipeline/.claude-plugin/plugin.json +4 -2
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +41 -10
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.example.json +6 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +10 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/audit.md +5 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +15 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/conventions.md +19 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/documentation.md +285 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/gates.md +236 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/hooks.md +164 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +26 -5
- package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +17 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +55 -14
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +71 -9
- package/plugins/task-pipeline/skills/task-pipeline/templates/README.md +14 -1
- package/plugins/task-pipeline/skills/task-pipeline/templates/adr.md +28 -3
- package/plugins/task-pipeline/skills/task-pipeline/templates/brief.md +26 -8
- package/plugins/task-pipeline/skills/task-pipeline/templates/decisions.md +50 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/docgate.sh +391 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/docmap.md +86 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/hooks.example.json +21 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/open-questions.md +21 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/retro-archive.md +41 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/retro.md +27 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,136 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v1.7.0 — 2026-08-03
|
|
4
|
+
|
|
5
|
+
### Added — documentation is a deliverable, and it has a gate
|
|
6
|
+
|
|
7
|
+
Stage 9's gate read *"docs in sync with code"*. That sentence names no artefact and
|
|
8
|
+
no command, so nothing in the run could make it false — and the pipeline had no
|
|
9
|
+
concept of a decision outliving the spec that recorded it. Three built-in doctrines
|
|
10
|
+
close that, ported from a 260-decision, 72-document specification built across four
|
|
11
|
+
repositories with several agents editing at once.
|
|
12
|
+
|
|
13
|
+
**`references/documentation.md`** — the inventory (four questions, answered before
|
|
14
|
+
the first interview question and written to `docs/DOCMAP.md`), registers and stable
|
|
15
|
+
ids, single source of truth including its cross-repository form, **the Doc Loop as a
|
|
16
|
+
cross-cutting protocol** that fires whenever anything is settled rather than only at
|
|
17
|
+
stage 9, append-only history with three distinct edge markers, the propagation
|
|
18
|
+
matrix and its ratchet, navigation, intent vs as-built, and registers as shared
|
|
19
|
+
state.
|
|
20
|
+
|
|
21
|
+
Two measurements decide two of those rules rather than taste. **204 of 275**
|
|
22
|
+
refine/supersede edges pointed at an unannotated target — which was not 204
|
|
23
|
+
violations, because most were additive; *that ambiguity was the defect*, and it is
|
|
24
|
+
why `Refines:` / `Contradicts:` / `Supersedes:` are three markers with different
|
|
25
|
+
obligations. And turning the propagation check on found **162** missing citations
|
|
26
|
+
across **73** decisions, not the four an audit had reported — so it ships ratcheted,
|
|
27
|
+
because failing on all of them makes a gate people switch off.
|
|
28
|
+
|
|
29
|
+
**`references/gates.md`** — the two axes (a stage's `auto`/`manual` type versus the
|
|
30
|
+
enforcement mechanism) and the promotion ladder: doctrine line → review question →
|
|
31
|
+
script check → CI step → hook, with the trigger for each promotion. It owns
|
|
32
|
+
*procedure* only; `audit.md` and `learned.md` already own probes, ratchets, exit
|
|
33
|
+
codes and false positives as *law*, and a second statement of one law is the exact
|
|
34
|
+
defect this release ports a rule against.
|
|
35
|
+
|
|
36
|
+
**`references/hooks.md`** — the `PreToolUse` contract, led by the limit rather than
|
|
37
|
+
the capability: hooks exist only in Claude Code, and **any exit code other than 2 is
|
|
38
|
+
non-blocking, so a crashing guard fails open** and stops guarding without announcing
|
|
39
|
+
it. Elsewhere the run is `ungated` and must say so.
|
|
40
|
+
|
|
41
|
+
### Added — a documentation gate that travels, and seeds green
|
|
42
|
+
|
|
43
|
+
**`templates/docgate.sh`** is a portable gate (bash 3.2; no `grep -P`, no in-place
|
|
44
|
+
stream edits, no bash-4 builtins) with ten sections, ratchet floors as variables,
|
|
45
|
+
printed register sizes, and **progressive arming**: a section whose input does not
|
|
46
|
+
exist yet prints `dormant` and does not fail. That is what makes always-governed
|
|
47
|
+
survivable on a three-file repository — the alternative was regime tiers, and a tier
|
|
48
|
+
is a switch that gets set to "minimal" by whoever is in a hurry.
|
|
49
|
+
|
|
50
|
+
Probe log — every section planted, run, restored, asserted on `$?`:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
1 links · 2 ids · 3 next-free · 4 counts · 5 propagation · 6 supersede
|
|
54
|
+
7 residue · 8 vocabulary · 9 commit SHAs (armed tree) · 10 doc map 10/10 fire
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Two probes came back silent and they landed on opposite sides of the doctrine. One
|
|
58
|
+
was a bad probe: section 9 correctly *skips* outside a git tree, so expecting a
|
|
59
|
+
failure there was wrong. The other was a real bug in the gate — `$((0009))` is
|
|
60
|
+
octal, `9` is not an octal digit, the expansion errored, the `if` took its else
|
|
61
|
+
branch, and section 3 printed `ok` for **every id ending in 8 or 9**.
|
|
62
|
+
|
|
63
|
+
Also seeded: `docmap.md`, `decisions.md`, `open-questions.md`, `retro-archive.md`
|
|
64
|
+
and one worked `hooks.example.json`. Lease arbitration is **not** reimplemented —
|
|
65
|
+
`agent-sync` owns it and is now in the companion matrix and the preflight, where it
|
|
66
|
+
had been missing while four other files leaned on it.
|
|
67
|
+
|
|
68
|
+
### Changed — the retrospective is traceable, and bounded
|
|
69
|
+
|
|
70
|
+
Standing instructions carry `Born`/`Commit` and `Last fired`/`Fired at`; every log
|
|
71
|
+
entry, retirement and run stamp carries a commit; and every SHA must resolve, which
|
|
72
|
+
the seeded gate checks with `git rev-parse --verify` — rule 14 applied to history. A
|
|
73
|
+
`file:line` rots at the next edit, while `git show <sha>` reconstructs the whole
|
|
74
|
+
incident months later, which is exactly when a class returns.
|
|
75
|
+
|
|
76
|
+
Entries older than the last five run stamps now **rotate** into
|
|
77
|
+
`docs/superpowers/retro/YYYY-QN.md` — append-only, queried by the task's nouns,
|
|
78
|
+
never read end to end. This also closes a contradiction the file had carried from
|
|
79
|
+
the start: it was described as *read in full* while containing an unbounded log, so
|
|
80
|
+
the cap that justified reading it protected one section while the rest grew.
|
|
81
|
+
|
|
82
|
+
### Fixed — defects found while porting, in the files the port touched
|
|
83
|
+
|
|
84
|
+
- **`SKILL.md` promised what it contradicted 42 lines later**: "no stage that can
|
|
85
|
+
fail because a dependency is missing", then "for UI tasks the spec gate
|
|
86
|
+
**requires** super-ux". `companion-skills.md` had the true rule all along.
|
|
87
|
+
- **Source precedence was stated once for two different questions.** `code`, then
|
|
88
|
+
docs, then the wiki, then memory is right for what *is* and wrong for what
|
|
89
|
+
*should be*: a decision accepted and not yet built is still the decision.
|
|
90
|
+
- **`learned.md` narrated its most expensive incident and never gave it a row** —
|
|
91
|
+
a full day of work performed under another session's identity. Now rule 15, with
|
|
92
|
+
its check, cross-referencing the narration rather than repeating it.
|
|
93
|
+
- `conventions.md` never asked where decisions live; `audit.md`'s "put it in a
|
|
94
|
+
script" had nowhere to point; the carry-over ratchet was required by one gate and
|
|
95
|
+
specified for all of them; `templates/README.md` had no guard and would have gone
|
|
96
|
+
stale on the first new template.
|
|
97
|
+
- `test/negatives.py`'s floor sat at **20** while the workflow carried **34** — it
|
|
98
|
+
would have caught a total collapse and not the loss of a third of the suite.
|
|
99
|
+
|
|
100
|
+
Eleven new validator guards, each with a negative self-test watched failing. One of
|
|
101
|
+
them **executes** the seeded gate over a scratch project and requires exit `0`.
|
|
102
|
+
**43 of 43 guards provably reject their planted defect.**
|
|
103
|
+
|
|
104
|
+
## v1.6.1 — 2026-08-01
|
|
105
|
+
|
|
106
|
+
### Fixed — v1.6.0 shipped without `displayName`, because a release lived only on a tag
|
|
107
|
+
|
|
108
|
+
**`v1.4.4` was tagged, released and published to npm, and its commit was never in
|
|
109
|
+
`main`.** It added `displayName` ("Task Pipeline") to both manifests — the label the
|
|
110
|
+
plugin picker shows. Every branch cut from `main` afterwards therefore started from a
|
|
111
|
+
tree that had never seen it, and v1.6.0 published a manifest without the field,
|
|
112
|
+
quietly returning the picker to the kebab-case `name`.
|
|
113
|
+
|
|
114
|
+
Nothing inside either record looked wrong: `main` was consistent with itself, the tag
|
|
115
|
+
was consistent with itself, CI was green on both, and the registry served a 1.4.4 no
|
|
116
|
+
branch contained. That is the same shape as the parent/submodule pointer this
|
|
117
|
+
project's own stage-10 doctrine already guards against — **a disagreement that lives
|
|
118
|
+
between two records and survives every check that runs inside one.**
|
|
119
|
+
|
|
120
|
+
- `displayName` restored, and the v1.4.4 section restored to this file. The fix is a
|
|
121
|
+
**merge of the tag**, not a re-typed field: copying the content back would have
|
|
122
|
+
left the tag still outside `main`, which is the condition that caused this.
|
|
123
|
+
- **CI now refuses an orphaned release:** every `v*` tag must be an ancestor of
|
|
124
|
+
`main`, checked on every push. The next tag that lands outside the branch is a red
|
|
125
|
+
build, not a feature that disappears three releases later.
|
|
126
|
+
- **The validator now rejects unresolved merge conflict markers.** Resolving the
|
|
127
|
+
merge above surfaced it: a `CHANGELOG.md` carrying three `<<<<<<<` markers passed
|
|
128
|
+
every existing check, because they all look at structure and none at the text. In a
|
|
129
|
+
repo that is almost entirely prose, a half-resolved merge ships as doctrine an
|
|
130
|
+
agent reads and obeys. (34 guards now, each with its negative self-test; the
|
|
131
|
+
tag-ancestry check is a CI step rather than a validator guard, since it needs git
|
|
132
|
+
history the offline validator does not have.)
|
|
133
|
+
|
|
3
134
|
## v1.6.0 — 2026-08-01
|
|
4
135
|
|
|
5
136
|
### `references/retrospective.md` — the run teaches the next run, and the list stays short
|
|
@@ -109,6 +240,12 @@ shipped graph doctrine must reach the **stage-9 gate** in `pipeline.example.json
|
|
|
109
240
|
*and* the stage-9 section of `references/stages.md`. That is the third time this repo
|
|
110
241
|
has shipped a rule to `SKILL.md` and not to the surface that enforces it — a gate
|
|
111
242
|
declared where it is not enforced is inert.
|
|
243
|
+
## v1.4.4 — 2026-07-30
|
|
244
|
+
|
|
245
|
+
### Added
|
|
246
|
+
- **`displayName`** ("Task Pipeline") in both manifests — `name` stays kebab-case
|
|
247
|
+
because it namespaces components; the picker shows this instead.
|
|
248
|
+
|
|
112
249
|
## v1.4.3 — 2026-07-30
|
|
113
250
|
|
|
114
251
|
### Fixed
|
package/README.md
CHANGED
|
@@ -58,7 +58,7 @@ Every gate is **typed**: `auto` — the orchestrator verifies it itself, pass/fa
|
|
|
58
58
|
|
|
59
59
|
| # | Stage | Gate | Type |
|
|
60
60
|
|---|---|---|---|
|
|
61
|
-
| 0 | Harvest + intake grill — **mandatory** | source ledger written; shared understanding + autonomy sweep; brief locked | manual |
|
|
61
|
+
| 0 | Harvest + intake grill — **mandatory** | source ledger written; the documentation inventory answered into `docs/DOCMAP.md`; intent reconciled against as-built; shared understanding + autonomy sweep; brief locked | manual |
|
|
62
62
|
| 1 | Docs study | contracts grounded on current docs | auto |
|
|
63
63
|
| 2 | Brainstorm + decompose | design approved; UI verdict recorded; every REQ answered; platform: module map approved | manual |
|
|
64
64
|
| 3 | Spec | committed + reviewed; UI: super-ux chain validated, linter green | manual |
|
|
@@ -67,8 +67,8 @@ Every gate is **typed**: `auto` — the orchestrator verifies it itself, pass/fa
|
|
|
67
67
|
| 6 | Tests | full suite green, new code covered | auto |
|
|
68
68
|
| 7 | Lint + deploy | lint clean + suite green before deploy | manual |
|
|
69
69
|
| 8 | Post-deploy | clean boot / honest degradation | auto |
|
|
70
|
-
| 9 | Docs + wiki | every stale source-ledger row updated; docs + wiki synced; the code graph refreshed and checked against the docs | auto |
|
|
71
|
-
| 10 | **Acceptance** | every REQ accounted for with evidence; operator signs off; the retro written — pruned before anything was added | manual |
|
|
70
|
+
| 9 | Docs + wiki | the propagation matrix walked and the documentation gate green with its ratchets printed; every stale source-ledger row updated; docs + wiki synced; the code graph refreshed and checked against the docs | auto |
|
|
71
|
+
| 10 | **Acceptance** | every REQ accounted for with evidence; every check leaned on seen failing once; operator signs off; the retro written — pruned before anything was added, every lesson carrying its commit | manual |
|
|
72
72
|
|
|
73
73
|
## What you get
|
|
74
74
|
|
|
@@ -108,8 +108,11 @@ stage and walks the gates. See [Install](#install) for the other channels.
|
|
|
108
108
|
### Everything is built in — zero required dependencies
|
|
109
109
|
|
|
110
110
|
The doctrine each stage runs on ships inside the skill. Nothing to install for it,
|
|
111
|
-
nothing to resolve at preflight, no version skew with someone else's repo, and
|
|
112
|
-
stage
|
|
111
|
+
nothing to resolve at preflight, no version skew with someone else's repo, and
|
|
112
|
+
**no stage blocks on an install** — stage 1 falls back to web search, the wiki and
|
|
113
|
+
the code graph are recommendations. The one exception is deliberate and named: on a
|
|
114
|
+
user-facing task the stage-3 UX track requires super-ux, and the spec gate stops
|
|
115
|
+
until it is installed.
|
|
113
116
|
|
|
114
117
|
| Stage | Built-in doctrine |
|
|
115
118
|
|---|---|
|
|
@@ -124,6 +127,9 @@ stage that can fail because a plugin is missing:
|
|
|
124
127
|
| 10 Acceptance | [`acceptance.md`](plugins/task-pipeline/skills/task-pipeline/references/acceptance.md) — REQ coverage table, evidence rules, the closing question |
|
|
125
128
|
| 10 + any audit | [`audit.md`](plugins/task-pipeline/skills/task-pipeline/references/audit.md) — the L0→L7 ladder and its seams, axis rotation, ratchets, proven checks |
|
|
126
129
|
| any loop | [`loop-guard.md`](plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md) — churn detection, caps, the break protocol |
|
|
130
|
+
| 0 + 9 + any settled decision | [`documentation.md`](plugins/task-pipeline/skills/task-pipeline/references/documentation.md) — the inventory, registers and ids, SSOT, the Doc Loop, supersede semantics, the propagation matrix, intent vs as-built |
|
|
131
|
+
| 6–10 + any check you write | [`gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) — the two axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors |
|
|
132
|
+
| any agent-time enforcement | [`hooks.md`](plugins/task-pipeline/skills/task-pipeline/references/hooks.md) — the `PreToolUse` contract, the fail-open hazard, the Claude-Code-only limit |
|
|
127
133
|
|
|
128
134
|
**Ported, not depended on.** Stage 0 is adapted from
|
|
129
135
|
[Matt Pocock's `grilling` / `grill-with-docs`](https://github.com/mattpocock/skills)
|
|
@@ -407,6 +413,57 @@ fail, you don't know it tests the right thing* — raised from one test to every
|
|
|
407
413
|
gate, linter and script in the run. **A green result from an unproven check is
|
|
408
414
|
worth nothing.**
|
|
409
415
|
|
|
416
|
+
### Documentation is a deliverable, and it has a gate
|
|
417
|
+
|
|
418
|
+
Stage 9 used to say *"docs in sync with code"*. That sentence names no artefact and
|
|
419
|
+
no command, so nothing could make it false. The pipeline now carries the system that
|
|
420
|
+
can.
|
|
421
|
+
|
|
422
|
+
**Stage 0 answers four questions** and writes them to `docs/DOCMAP.md`: where
|
|
423
|
+
settled things live, what each fact's single home is, what a change of type X
|
|
424
|
+
obliges, and what proves it. A project with no answers gets them seeded — a decision
|
|
425
|
+
register, an open-questions register and a portable documentation gate — and the
|
|
426
|
+
seeding is itself the register's first entry. One decision home per project: an
|
|
427
|
+
existing `docs/adr/` **is** the register and is never duplicated.
|
|
428
|
+
|
|
429
|
+
**The Doc Loop fires whenever anything is settled, at any stage.** Reserve the id,
|
|
430
|
+
record it, resolve the question it answers, propagate, commit with the ids. A
|
|
431
|
+
decision that lives only in the spec dies with the spec; one that lives only in the
|
|
432
|
+
conversation was never made.
|
|
433
|
+
|
|
434
|
+
**The propagation matrix is not the harvest ledger.** The ledger names the documents
|
|
435
|
+
the run *read*; the matrix names the documents it *owes*. They are different lists,
|
|
436
|
+
and the gap between them is where documentation rots — the document nobody read is
|
|
437
|
+
exactly the document nobody updated.
|
|
438
|
+
|
|
439
|
+
**Governance is a by-product, not a second job.** The run already produces decisions
|
|
440
|
+
(the brief's *Decisions locked*, the spec's contracts, the ADRs), so recording one is
|
|
441
|
+
transcription plus a stable id. And the seeded gate **arms progressively**: a section
|
|
442
|
+
whose input does not exist yet prints `dormant` and stays green, so a three-file
|
|
443
|
+
repository is governed from day one without starting red — a scaffold that seeds red
|
|
444
|
+
teaches everyone on day one that the gate is noise.
|
|
445
|
+
|
|
446
|
+
### Gates and hooks — how a rule becomes something that can say no
|
|
447
|
+
|
|
448
|
+
Two axes, deliberately not conflated. **The stage gate type** (`auto` = verify it
|
|
449
|
+
yourself; `manual` = wait for an explicit go) is about this pipeline. **The
|
|
450
|
+
enforcement mechanism** is a ladder a rule climbs: a doctrine line → a review
|
|
451
|
+
question → a script check (promote here once the class has occurred *twice*) → a CI
|
|
452
|
+
step → a hook. A rule may sit on several rungs; what it may never do is *pretend* to
|
|
453
|
+
be on a higher one.
|
|
454
|
+
|
|
455
|
+
The skill ships the anatomy of a gate that cannot lie — non-zero exit on any
|
|
456
|
+
failure, the verdict block last with nothing after it, a scope header saying what it
|
|
457
|
+
does **not** cover, ratchet floors as variables with the counts printed beside `OK`,
|
|
458
|
+
skips printed rather than silent, and every count computed rather than restated —
|
|
459
|
+
plus the probe recipe, because a green from a check nobody has watched fail is worth
|
|
460
|
+
nothing, and **the probe is the thing to doubt first**.
|
|
461
|
+
|
|
462
|
+
Hooks get their own file, and it leads with the limit: they exist only in Claude
|
|
463
|
+
Code, and **any exit code other than 2 is non-blocking, so a crashing guard fails
|
|
464
|
+
open** and stops guarding without announcing it. Elsewhere the run is `ungated` and
|
|
465
|
+
must say so.
|
|
466
|
+
|
|
410
467
|
### The retrospective — the run teaches the next run, and the list stays short
|
|
411
468
|
|
|
412
469
|
Every gate in this flow is good at *this* run and blind across runs. So the same
|
|
@@ -652,11 +709,14 @@ recommendation, so you arm the whole run in one exchange. Detail:
|
|
|
652
709
|
| [`SKILL.md`](plugins/task-pipeline/skills/task-pipeline/SKILL.md) | the orchestrator: how to run, the stage table, the model decision |
|
|
653
710
|
| [`references/stages.md`](plugins/task-pipeline/skills/task-pipeline/references/stages.md) | per-stage detail and the exact gate criteria |
|
|
654
711
|
| [`references/artifacts.md`](plugins/task-pipeline/skills/task-pipeline/references/artifacts.md) | the canonical document layout each stage writes to |
|
|
655
|
-
| [`references/conventions.md`](plugins/task-pipeline/skills/task-pipeline/references/conventions.md) | how stages 6–10 read the host project's `CLAUDE.md
|
|
712
|
+
| [`references/conventions.md`](plugins/task-pipeline/skills/task-pipeline/references/conventions.md) | how stages 6–10 read the host project's `CLAUDE.md`, and how the documentation regime is detected |
|
|
713
|
+
| [`references/documentation.md`](plugins/task-pipeline/skills/task-pipeline/references/documentation.md) | the doc system: the inventory, registers and ids, SSOT, the Doc Loop, supersede semantics, the propagation matrix, intent vs as-built |
|
|
714
|
+
| [`references/gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) | the two axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors, where a gate runs |
|
|
715
|
+
| [`references/hooks.md`](plugins/task-pipeline/skills/task-pipeline/references/hooks.md) | the `PreToolUse` contract, the fail-open hazard, placement, and the Claude-Code-only limit |
|
|
656
716
|
| [`references/knowledge-graph.md`](plugins/task-pipeline/skills/task-pipeline/references/knowledge-graph.md) | the code graph: install line, stage-0 reach queries, the stage-9 refresh, the graph↔docs divergence check |
|
|
657
717
|
| [`references/retrospective.md`](plugins/task-pipeline/skills/task-pipeline/references/retrospective.md) | the project retro: the three grades of fix, the mandatory prune, the cap of ten |
|
|
658
718
|
| [`references/model-tiering.md`](plugins/task-pipeline/skills/task-pipeline/references/model-tiering.md) | model policy, the `/model` reminder, overrides |
|
|
659
|
-
| [`templates/`](plugins/task-pipeline/skills/task-pipeline/templates/README.md) | brief, carry-over ledger, `CONTEXT.md` and ADR skeletons |
|
|
719
|
+
| [`templates/`](plugins/task-pipeline/skills/task-pipeline/templates/README.md) | brief, carry-over ledger, `CONTEXT.md` and ADR skeletons, the doc map, both registers, the retro and its archive, the seeded `docgate.sh`, a worked hook |
|
|
660
720
|
| [`CHANGELOG.md`](CHANGELOG.md) | every release, with the reasoning behind it |
|
|
661
721
|
| [`CONTRIBUTING.md`](CONTRIBUTING.md) | dev setup, the validator, the version-sync rule, release flow |
|
|
662
722
|
|
|
@@ -676,7 +736,7 @@ npm test # python3 test/validate.py — the structural validator
|
|
|
676
736
|
|
|
677
737
|
Built by ssheleg — [sshlg.me](https://sshlg.me)
|
|
678
738
|
|
|
679
|
-
- X / Twitter — [@
|
|
739
|
+
- X / Twitter — [@sshlg93](https://x.com/sshlg93)
|
|
680
740
|
- Telegram — [@sshlg](https://t.me/sshlg)
|
|
681
741
|
|
|
682
742
|
Part of the [ssheleg skill family](https://github.com/ssheleg/sshlg-skills):
|
|
@@ -333,6 +333,88 @@ its own previous pass while the finding count still looked healthy. So:
|
|
|
333
333
|
it, then trust the green — same law as the failing test, applied to every gate,
|
|
334
334
|
linter and script the run leans on.
|
|
335
335
|
|
|
336
|
+
## Documentation is a deliverable, and it has a gate
|
|
337
|
+
|
|
338
|
+
**Before the first question (stage 0), answer four things and write them to
|
|
339
|
+
`docs/DOCMAP.md`:** where settled things live, what each fact's single home is,
|
|
340
|
+
what a change of type X obliges, and what proves it. A project with no answers gets
|
|
341
|
+
them seeded — a decision register, an open-questions register and a documentation
|
|
342
|
+
gate — and the seeding is recorded as the register's first entry. **One decision
|
|
343
|
+
home per project:** an existing `docs/adr/` *is* the register; never create a second
|
|
344
|
+
beside it. Then **reconcile intent against as-built** — git says how it should be,
|
|
345
|
+
the run record says how it turned out — and resolve every divergence before you
|
|
346
|
+
start: the document is stale, the record is wrong, or they genuinely disagree and
|
|
347
|
+
that is a decision. There is no fourth option, and starting on an unresolved one
|
|
348
|
+
means building against a system that does not exist.
|
|
349
|
+
|
|
350
|
+
**The Doc Loop fires whenever anything is settled, at any stage — not at the end.**
|
|
351
|
+
Seven steps: orient and reconcile → reserve the id, then record → resolve the
|
|
352
|
+
question it answers → propagate → adjust scope → record as-built → commit with the
|
|
353
|
+
ids in the subject. Reading a "Next free ID" line is **not** reserving it: a second
|
|
354
|
+
agent reading it in the same minute gets the same number. Finishing the chat answer
|
|
355
|
+
is not finishing the task.
|
|
356
|
+
|
|
357
|
+
**Registers are append-only.** To reverse: add a new entry, edit **only the status
|
|
358
|
+
line** of the old one, leave its body intact. Three distinct markers, because one
|
|
359
|
+
word for "adds to" and "replaces a clause of" cannot be enforced: `Refines:` is
|
|
360
|
+
additive and the target needs no annotation; `Contradicts:` names a clause that
|
|
361
|
+
falls and the target **must** say so; `Supersedes:` retires the whole target and the
|
|
362
|
+
target **must** say so.
|
|
363
|
+
|
|
364
|
+
**The propagation matrix is not the harvest ledger.** The ledger names the documents
|
|
365
|
+
you *read*; the matrix names the documents you *owe*. The document nobody read is
|
|
366
|
+
exactly the document nobody updated. At stage 9, walk the matrix for every change
|
|
367
|
+
type the run produced, then run the documentation gate and print its ratchet counts.
|
|
368
|
+
|
|
369
|
+
## Gates: two axes, and how to build one that cannot lie
|
|
370
|
+
|
|
371
|
+
**Axis A — the stage gate type.** `auto` = verify the check yourself and stop on
|
|
372
|
+
fail; `manual` = wait for an explicit operator go. An auto gate never substitutes
|
|
373
|
+
for a required manual approval.
|
|
374
|
+
|
|
375
|
+
**Axis B — where the rule is actually enforced**, and a rule climbs this ladder
|
|
376
|
+
rather than starting at the top: doctrine line → review question at a named gate →
|
|
377
|
+
script check (promote here once the class has occurred **twice**) → CI step → hook.
|
|
378
|
+
A rule may sit on several rungs; what it may never do is *pretend* to be on a higher
|
|
379
|
+
one — that is the same failure as a gate that prints `FAIL` and exits `0`.
|
|
380
|
+
|
|
381
|
+
**Before you run any check:** the base is green (or its known-red baseline is
|
|
382
|
+
recorded); the check has been probed; you have read its scope header and know what
|
|
383
|
+
it does **not** cover; you have read its ratchet floors.
|
|
384
|
+
|
|
385
|
+
**Anatomy of a gate script:** non-zero exit on any failure; the verdict block last
|
|
386
|
+
and **nothing after it**; a SCOPE header; portable (no `grep -P`, no in-place stream
|
|
387
|
+
edits, no bash-4 builtins); ratchet floors as variables with the counts printed
|
|
388
|
+
beside `OK`; skips printed, never silent; a section with no input yet prints
|
|
389
|
+
`dormant` and stays green so a fresh project never starts red; every count computed,
|
|
390
|
+
never restated; two-layer mappings checked in **both** directions.
|
|
391
|
+
|
|
392
|
+
**Probing:** copy the tree, plant the defect **in python** (an in-place stream edit
|
|
393
|
+
is not portable and silently edits nothing on BSD), run, assert `$?` is non-zero,
|
|
394
|
+
restore, assert zero. **Doubt the probe before the check** — four of five silent
|
|
395
|
+
probes on a real project were the probe's fault. Record the probe.
|
|
396
|
+
|
|
397
|
+
## Hooks — the limit first
|
|
398
|
+
|
|
399
|
+
Hooks exist **only in Claude Code**. Elsewhere the same rules run as a self-check
|
|
400
|
+
and the run is recorded **`ungated`** — never describe a project as protected when
|
|
401
|
+
its agents run somewhere else. A `PreToolUse` hook blocks by **exit 2** with the
|
|
402
|
+
reason on stderr, or exit 0 with a `permissionDecision: deny` payload on stdout.
|
|
403
|
+
**Any other exit code is non-blocking, so a crashing guard fails open** and stops
|
|
404
|
+
guarding without announcing it — write the guard to exit 2 on its own errors. Keep
|
|
405
|
+
hooks cheap and narrowly matched; the full suite belongs in CI, which is late, and
|
|
406
|
+
late is the right trade for slow.
|
|
407
|
+
|
|
408
|
+
## The retro carries commits
|
|
409
|
+
|
|
410
|
+
Standing instructions (max ten) carry the commit that introduced them and the commit
|
|
411
|
+
of the run in which they last fired; every log entry, every retirement and every run
|
|
412
|
+
stamp carries one; and every SHA must resolve. A `file:line` rots at the next edit,
|
|
413
|
+
while `git show <sha>` reconstructs the whole incident months later. Entries older
|
|
414
|
+
than the last five run stamps **move** to an append-only archive that is *queried*
|
|
415
|
+
by the task's nouns rather than read — which keeps the in-force file short enough to
|
|
416
|
+
read in full, and makes pruning cost no knowledge.
|
|
417
|
+
|
|
336
418
|
## super-ux for user-facing tasks (recommended)
|
|
337
419
|
|
|
338
420
|
If the task touches any UI (web/mobile/CLI/TUI), the WHY→UI→scenario chain comes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-pipeline-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "Full-cycle delivery pipeline for coding agents: a mandatory built-in intake grill, then 10 gated stages (docs, brainstorm+decompose, spec, plan, build, tests, lint/deploy, post-deploy, docs/wiki, acceptance). Every stage's doctrine ships inside the skill — no companion plugin required. This package is the installer CLI.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"task-pipeline": "bin/task-pipeline.js"
|
|
@@ -22,7 +22,10 @@
|
|
|
22
22
|
"homepage": "https://github.com/ssheleg/task-pipeline#readme",
|
|
23
23
|
"bugs": "https://github.com/ssheleg/task-pipeline/issues",
|
|
24
24
|
"license": "MIT",
|
|
25
|
-
"author":
|
|
25
|
+
"author": {
|
|
26
|
+
"name": "ssheleg",
|
|
27
|
+
"url": "https://x.com/sshlg93"
|
|
28
|
+
},
|
|
26
29
|
"engines": {
|
|
27
30
|
"node": ">=16"
|
|
28
31
|
},
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-pipeline",
|
|
3
|
+
"displayName": "Task Pipeline",
|
|
3
4
|
"description": "Runs a substantial task through a mandatory built-in intake grill, then 10 gated stages (docs, brainstorm+decompose, spec, plan, subagent build, tests, lint/deploy, post-deploy, docs/wiki, acceptance). Every stage's doctrine is built into the skill — no companion plugin required — with typed auto/manual gates, a frozen requirement spine that must close with evidence, a loop guard that breaks churn, one provider-agnostic model confirmed up front, and an optional super-ux UX track for user-facing work.",
|
|
4
|
-
"version": "1.
|
|
5
|
+
"version": "1.7.0",
|
|
5
6
|
"author": {
|
|
6
|
-
"name": "ssheleg"
|
|
7
|
+
"name": "ssheleg",
|
|
8
|
+
"url": "https://x.com/sshlg93"
|
|
7
9
|
},
|
|
8
10
|
"homepage": "https://github.com/ssheleg/task-pipeline",
|
|
9
11
|
"repository": "https://github.com/ssheleg/task-pipeline",
|
|
@@ -37,11 +37,18 @@ the environment resolves.
|
|
|
37
37
|
## Prerequisites — none required
|
|
38
38
|
|
|
39
39
|
**Every stage's doctrine ships inside this skill.** There is no required companion
|
|
40
|
-
plugin, nothing to resolve at preflight
|
|
41
|
-
and
|
|
40
|
+
plugin, nothing to resolve at preflight and no version skew with someone else's
|
|
41
|
+
repo. Stages 1 and 6–9 additionally run the *host's own* commands and optional
|
|
42
|
+
tools, and **no stage blocks on an install** — stage 1 falls back to web search, the
|
|
43
|
+
wiki and the code graph are recommendations. The **one** exception is deliberate and
|
|
44
|
+
named: on a user-facing task the stage-3 UX track requires super-ux, and the spec
|
|
45
|
+
gate stops until it is installed.
|
|
42
46
|
|
|
43
47
|
| Stage | Built-in doctrine |
|
|
44
48
|
|---|---|
|
|
49
|
+
| 0 + 9 + any settled decision · The documentation system | [`references/documentation.md`](references/documentation.md) |
|
|
50
|
+
| 6–10 + any check you write · Gates | [`references/gates.md`](references/gates.md) |
|
|
51
|
+
| any agent-time enforcement · Hooks | [`references/hooks.md`](references/hooks.md) |
|
|
45
52
|
| 0 Knowledge harvest (pre-grill) | [`references/knowledge-sources.md`](references/knowledge-sources.md) |
|
|
46
53
|
| 0 + 9 The code graph (graphify — recommended, never required) | [`references/knowledge-graph.md`](references/knowledge-graph.md) |
|
|
47
54
|
| 0 Intake grill | [`references/grill.md`](references/grill.md) |
|
|
@@ -101,9 +108,12 @@ question: pull what the project already knows about this task from the code, the
|
|
|
101
108
|
**code graph** if one is built
|
|
102
109
|
([`references/knowledge-graph.md`](references/knowledge-graph.md) — graphify;
|
|
103
110
|
recommended, never required),
|
|
104
|
-
`CLAUDE.md`, `CONTEXT.md`/ADRs, `docs/` + `docs/ux/`,
|
|
105
|
-
retro's standing instructions
|
|
106
|
-
they *bind* this run
|
|
111
|
+
`CLAUDE.md`, `CONTEXT.md`/ADRs, **the decision register**, `docs/` + `docs/ux/`,
|
|
112
|
+
past pipeline briefs, **the retro's standing instructions, run stamps and recent
|
|
113
|
+
log** — `docs/superpowers/retro.md`, read in full because they *bind* this run and
|
|
114
|
+
are bounded by construction, while the archive under `docs/superpowers/retro/` is
|
|
115
|
+
**queried** by the task's nouns
|
|
116
|
+
([`references/retrospective.md`](references/retrospective.md)) —
|
|
107
117
|
the **knowledge wiki** if one is installed
|
|
108
118
|
([obsidian-wiki](https://github.com/ar9av/obsidian-wiki) — recommended, never
|
|
109
119
|
required) and any **other repo or hosted doc system the project names as its
|
|
@@ -121,6 +131,18 @@ has. Doc-side findings are fixed at stage 9; absences become REQ rows at stage 1
|
|
|
121
131
|
([`references/knowledge-graph.md`](references/knowledge-graph.md),
|
|
122
132
|
[`references/audit.md`](references/audit.md)).
|
|
123
133
|
|
|
134
|
+
**Documentation is a deliverable, and it has a gate**
|
|
135
|
+
([`references/documentation.md`](references/documentation.md)). Stage 0's harvest
|
|
136
|
+
reads what the project knows; a second phase asks the four questions that make it a
|
|
137
|
+
*system* — where settled things live, what each fact's single home is, what a change
|
|
138
|
+
of type X obliges, and what proves it — and writes them to `docs/DOCMAP.md`. From
|
|
139
|
+
then on the **Doc Loop** fires whenever anything is settled, at **any** stage, not
|
|
140
|
+
only at stage 9; the stage-9 sweep walks the **propagation matrix** (the harvest
|
|
141
|
+
ledger names what you *read*, the matrix names what you *owe*); and *"docs in sync"*
|
|
142
|
+
stops being an assertion and becomes a command with an exit code. Governance is a
|
|
143
|
+
by-product: the run already produces decisions, so recording one is transcription
|
|
144
|
+
plus a stable id, never a second act of thinking.
|
|
145
|
+
|
|
124
146
|
**The run teaches the next run — and the list stays short.** Every gate is good at
|
|
125
147
|
*this* run and blind across runs, so the same class of failure can be caught, fixed
|
|
126
148
|
and forgotten five times with nothing noticing it is the same one. The last act of
|
|
@@ -184,7 +206,13 @@ Three things the grill does beyond clarifying the request:
|
|
|
184
206
|
stop/return on fail; for `manual`, present the result and **wait for the
|
|
185
207
|
operator's explicit "continue"/go** — an auto gate never substitutes for a
|
|
186
208
|
required manual approval.
|
|
187
|
-
5. Cross-cutting, every stage: **
|
|
209
|
+
5. Cross-cutting, every stage: **when anything is settled — scope, a contract, a
|
|
210
|
+
name, a policy, a vocabulary — run the Doc Loop
|
|
211
|
+
(`references/documentation.md`) before the run moves on**: reserve the id,
|
|
212
|
+
record it, resolve the question it answers, propagate by the matrix, commit
|
|
213
|
+
with the ids. A decision that lives only in the spec dies with the spec, and one
|
|
214
|
+
that lives only in the conversation was never made;
|
|
215
|
+
**answer from the brief's autonomy section rather
|
|
188
216
|
than asking again** — it was grilled precisely so you wouldn't have to;
|
|
189
217
|
**anything deferred, dropped or left half-done goes into the carry-over ledger
|
|
190
218
|
the moment it's said** — deferred out loud is forgotten; **never narrow the task
|
|
@@ -215,7 +243,7 @@ capable available — see `references/model-tiering.md`).
|
|
|
215
243
|
|
|
216
244
|
| # | Stage | Invoke | Gate | Type |
|
|
217
245
|
|---|---|---|---|---|
|
|
218
|
-
| 0 | Intake grill — **mandatory** | built in: [`references/knowledge-sources.md`](references/knowledge-sources.md) (harvest) → [`references/grill.md`](references/grill.md) (interview) | source ledger written; shared understanding reached; autonomy sweep covered; brief locked + confirmed | manual |
|
|
246
|
+
| 0 | Intake grill — **mandatory** | built in: [`references/knowledge-sources.md`](references/knowledge-sources.md) (harvest) → [`references/grill.md`](references/grill.md) (interview) | source ledger written; **the documentation inventory answered into `docs/DOCMAP.md`** — registers, single homes, the propagation matrix, the gate command — and **intent reconciled against as-built**, every divergence resolved ([`references/documentation.md`](references/documentation.md)); the retro read in full and its archive queried; shared understanding reached; autonomy sweep covered; brief locked + confirmed | manual |
|
|
219
247
|
| 1 | Docs study | `context7` (resolve-library-id → get-library-docs) / `context7-docs` | contracts grounded on fetched docs | auto |
|
|
220
248
|
| 2 | Brainstorm + decompose | built in: [`references/brainstorm.md`](references/brainstorm.md) + **UI detection** + [`references/decomposition.md`](references/decomposition.md) for platforms | design approved; UI verdict recorded; every REQ answered; platform: module map approved | manual |
|
|
221
249
|
| 3 | Spec | built in: [`references/spec.md`](references/spec.md) — **UI → super-ux chain first** (`/ux` → `ux-foundation` CJM → `ux-flows` screens → `ux-scenarios` → `/ux-lint`), then spec `docs/superpowers/specs/…-design.md` | committed + reviewed; UI: chain validated, linter green, scenarios/`SCR-` traced | manual |
|
|
@@ -224,8 +252,8 @@ capable available — see `references/model-tiering.md`).
|
|
|
224
252
|
| 6 | Tests | host test runner + built-in [`references/tdd.md`](references/tdd.md) + [`references/learned.md`](references/learned.md) | full suite green; new/changed code covered; **every new check probed both ways and asserted on its exit code**, and the suite run once against a cold environment | auto |
|
|
225
253
|
| 7 | Lint + deploy | host lint → deploy per host convention | lint clean + suite green before deploy; deploy needs a go (or the brief's specific standing authorization) | manual |
|
|
226
254
|
| 8 | Post-deploy | tail deploy logs / health-check | clean boot or honest degradation report | auto |
|
|
227
|
-
| 9 | Docs + wiki | host module docs/runbook rules → `wiki-update` ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki), recommended) → `/graphify . --update` ([`references/knowledge-graph.md`](references/knowledge-graph.md), recommended) | every stale row of the stage-0 source ledger updated; docs synced; wiki synced; **the code graph refreshed where one exists** and checked against the docs (a hub no doc names, a doc naming a node the graph lost); **every number computed rather than restated, every named command or file resolvable** ([`references/learned.md`](references/learned.md)) | auto |
|
|
228
|
-
| 10 | **Acceptance** | built in: [`references/audit.md`](references/audit.md) (ladder walk) → [`references/acceptance.md`](references/acceptance.md) (coverage table) → [`references/retrospective.md`](references/retrospective.md) (retro: prune, stamp, entry) | ladder walk ran, its absences became REQ rows; every REQ accounted for with evidence from a check seen failing once; ledger has no unresolved row; **axis rotation recorded** (new findings vs self-inflicted, rule 1 of [`references/learned.md`](references/learned.md)), **every closure verified against the artefact rather than the document describing it**, **each correction swept across its class**, **every deferral a printed ratchet rather than a TODO**; **in a multi-repository project, every repository is clean, pushed and pointed at** (below); operator signs off; **the retrospective written last — prune before entry, list at or under its cap,
|
|
255
|
+
| 9 | Docs + wiki | host module docs/runbook rules → `wiki-update` ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki), recommended) → `/graphify . --update` ([`references/knowledge-graph.md`](references/knowledge-graph.md), recommended) | every stale row of the stage-0 source ledger updated; **the propagation matrix walked for every change type this run produced** — the ledger names what you read, the matrix names what you owe — every settled thing recorded with an id, every answered question resolved, and **the documentation gate green with its ratchet counts printed**; docs synced; wiki synced; **the code graph refreshed where one exists** and checked against the docs (a hub no doc names, a doc naming a node the graph lost); **every number computed rather than restated, every named command or file resolvable** ([`references/learned.md`](references/learned.md)); the carry-over count printed beside the verdict | auto |
|
|
256
|
+
| 10 | **Acceptance** | built in: [`references/audit.md`](references/audit.md) (ladder walk) → [`references/acceptance.md`](references/acceptance.md) (coverage table) → [`references/retrospective.md`](references/retrospective.md) (retro: prune, stamp, entry) | ladder walk ran, its absences became REQ rows; every REQ accounted for with evidence from a check seen failing once; ledger has no unresolved row; **axis rotation recorded** (new findings vs self-inflicted, rule 1 of [`references/learned.md`](references/learned.md)), **every closure verified against the artefact rather than the document describing it**, **each correction swept across its class**, **every deferral a printed ratchet rather than a TODO**; **in a multi-repository project, every repository is clean, pushed and pointed at** (below); operator signs off; **every check this close-out leans on — the documentation gate included — has been seen failing once against a planted defect, and its ratchet counts are printed beside the verdict**; **the retrospective written last — prune before entry, list at or under its cap, every deletion and every entry carrying its commit, entries older than five stamps rotated into the archive, run stamped with its commit, counts printed** | manual |
|
|
229
257
|
|
|
230
258
|
|
|
231
259
|
### Stage 10 in a project of several repositories
|
|
@@ -290,8 +318,11 @@ automation is on — `pipeline.schema.json` is the only contract.
|
|
|
290
318
|
- `references/grill.md` — the built-in stage-0 grill: loop, domain awareness, autonomy sweep
|
|
291
319
|
- `references/acceptance.md` — the built-in stage-10 close-out: REQ coverage, evidence, sign-off
|
|
292
320
|
- `references/retrospective.md` — stage 10's last act: the project retro (`docs/superpowers/retro.md`), the three grades of fix, the mandatory prune and its cap of ten
|
|
321
|
+
- `references/documentation.md` — cross-cutting: the doc inventory, registers and ids, SSOT, the Doc Loop, supersede semantics, the propagation matrix, intent vs as-built
|
|
322
|
+
- `references/gates.md` — cross-cutting: the two axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors, where a gate runs
|
|
323
|
+
- `references/hooks.md` — agent-time enforcement: the PreToolUse contract, the fail-open hazard, placement, and the Claude-Code-only limit
|
|
293
324
|
- `references/audit.md` — cross-cutting: the L0→L7 ladder and its seams (what was never written), axis rotation, ratchets, proven checks
|
|
294
|
-
- `references/learned.md` — cross-cutting:
|
|
325
|
+
- `references/learned.md` — cross-cutting: fifteen rules earned by failure on a real multi-repository build, each with the incident behind it, its check and its exit criterion; plus the two that no check can decide
|
|
295
326
|
- `references/brainstorm.md` — stage 2: design dialogue, approaches, UI detection, hard gate
|
|
296
327
|
- `references/spec.md` — stage 3: UX track order, the spec contract, self-review, review gate
|
|
297
328
|
- `references/planning.md` — stage 4: zero-context plan format, parallel groups, no placeholders
|
|
@@ -11,13 +11,14 @@
|
|
|
11
11
|
"skills": [
|
|
12
12
|
"task-pipeline:knowledge-sources",
|
|
13
13
|
"task-pipeline:knowledge-graph",
|
|
14
|
+
"task-pipeline:documentation",
|
|
14
15
|
"wiki-query",
|
|
15
16
|
"graphify",
|
|
16
17
|
"task-pipeline:grill"
|
|
17
18
|
],
|
|
18
19
|
"gate": {
|
|
19
20
|
"type": "manual",
|
|
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."
|
|
21
|
+
"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. PHASE 1b, THE DOCUMENTATION INVENTORY (references/documentation.md): four questions answered into docs/DOCMAP.md before the interview — where settled things live (the DECISION HOME, and there is exactly one per project: an existing docs/adr/ IS the register and is recorded as such, never duplicated), what each fact's single home is, what a change of type X obliges (THE PROPAGATION MATRIX, non-empty, every row naming the check that enforces it or the word 'review' with a one-line reason), and what proves it (the gate command). A project with no answers gets them seeded — registers, matrix and scripts/check-docs.sh from the skill's templates — and the seeding is recorded as the register's first entry; the seeded gate must exit 0 on its own seeds, because a project that starts red teaches everyone on day one that the gate is noise. The regime is recorded. PHASE 1c, RECONCILE: git says how it should be, the run record says how it turned out — read both for the area about to be touched and resolve every divergence (the document is stale, the record is wrong, or they genuinely disagree and that is a decision), because starting on an unresolved divergence means building against a system that does not exist. The retro's in-force sections are read IN FULL and its archive is QUERIED by the task's nouns."
|
|
21
22
|
}
|
|
22
23
|
},
|
|
23
24
|
{
|
|
@@ -142,13 +143,15 @@
|
|
|
142
143
|
"model": "default",
|
|
143
144
|
"skills": [
|
|
144
145
|
"host:module-docs",
|
|
146
|
+
"task-pipeline:documentation",
|
|
147
|
+
"task-pipeline:gates",
|
|
145
148
|
"wiki-update",
|
|
146
149
|
"task-pipeline:knowledge-graph",
|
|
147
150
|
"graphify"
|
|
148
151
|
],
|
|
149
152
|
"gate": {
|
|
150
153
|
"type": "auto",
|
|
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"
|
|
154
|
+
"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. THE PROPAGATION SWEEP RUNS FIRST (references/documentation.md): the source ledger names the documents this run READ, the matrix in docs/DOCMAP.md names the documents it OWES, and they are not the same list — the document nobody read is exactly the document nobody updated. Walk the matrix row for every change type this run produced; every settled thing carries an id in the register; every answered question is flipped to Resolved-> that id; every document named in a 'Consequences / affects:' line cites its decision. THEN THE DOCUMENTATION GATE IS GREEN — the command docs/DOCMAP.md names (bash scripts/check-docs.sh by default) — with its RATCHET COUNTS PRINTED beside the verdict and any skipped check stating that it skipped (references/gates.md), so 'green' reads as 'green, and here is exactly what was not looked at'. This replaced the unfalsifiable 'docs in sync with code', which named no artefact and no command. The as-built record is written and reconciled, and the carry-over count is printed beside this verdict"
|
|
152
155
|
}
|
|
153
156
|
},
|
|
154
157
|
{
|
|
@@ -163,7 +166,7 @@
|
|
|
163
166
|
],
|
|
164
167
|
"gate": {
|
|
165
168
|
"type": "manual",
|
|
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."
|
|
169
|
+
"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. EVERY LESSON CARRIES ITS COMMIT: each standing instruction has the SHA that introduced it and the SHA of the run in which it last fired, each log entry and each retirement carries one, the run stamp carries the run's own — a file:line rots at the next edit while 'git show <sha>' reconstructs the whole incident two months later — and every SHA must resolve, which the documentation gate checks with 'git rev-parse --verify'. ROTATION: entries older than the last five run stamps MOVE into docs/superpowers/retro/YYYY-QN.md, which is append-only and QUERIED rather than read, so the in-force file stays short enough to be read in full and pruning costs no knowledge. AND THE GATE ITSELF IS PROVEN: every check this close-out leans on — the documentation gate included — has been seen failing once against a planted defect, with the probe recorded, and its ratchet counts are printed beside this verdict (references/gates.md)."
|
|
167
170
|
}
|
|
168
171
|
}
|
|
169
172
|
],
|