task-pipeline-skill 1.8.0 → 1.9.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 +129 -0
- package/CODE_OF_CONDUCT.md +38 -0
- package/CONTRIBUTING.md +215 -0
- package/README.md +20 -1
- package/SECURITY.md +67 -0
- package/SKILL-CARD.md +60 -0
- package/bin/task-pipeline.js +23 -0
- package/evals/RESULTS.md +68 -0
- package/evals/__pycache__/run.cpython-314.pyc +0 -0
- package/evals/run.py +130 -0
- package/evals/task-pipeline.evals.json +225 -0
- package/package.json +7 -2
- package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +4 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/adoption.md +210 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/build.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/documentation.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/gates.md +49 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/review.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +11 -11
- package/plugins/task-pipeline/skills/task-pipeline/templates/docgate.sh +16 -3
|
@@ -23,6 +23,8 @@ elsewhere and is not restated here:
|
|
|
23
23
|
|
|
24
24
|
- Axis A — the stage gate type
|
|
25
25
|
- Axis B — the enforcement mechanism
|
|
26
|
+
- Axis C — degrees of freedom
|
|
27
|
+
- Progressive arming
|
|
26
28
|
- Before you run a check
|
|
27
29
|
- Anatomy of a project gate
|
|
28
30
|
- Writing the check itself
|
|
@@ -70,6 +72,53 @@ disprove. Left unwritten, it is indistinguishable from an omission.
|
|
|
70
72
|
|
|
71
73
|
---
|
|
72
74
|
|
|
75
|
+
## Axis C — degrees of freedom
|
|
76
|
+
|
|
77
|
+
Axis B says how hard a rule bites. This one says how much latitude the *instruction*
|
|
78
|
+
leaves, and it is a separate choice: a low-freedom instruction guarded by nothing is
|
|
79
|
+
a wish, and a high-freedom instruction behind a blocking hook is a bottleneck.
|
|
80
|
+
|
|
81
|
+
Match the level to how **fragile** the step is, not to how important it feels:
|
|
82
|
+
|
|
83
|
+
| Level | Shape | Use when | Example here |
|
|
84
|
+
|---|---|---|---|
|
|
85
|
+
| **high** | prose direction, no prescribed sequence | many routes reach a good answer and context decides | stage 2 — the design conversation |
|
|
86
|
+
| **medium** | a named order with room inside each step | the sequence is fixed, the content is judgement | stage 0 — two phases, adaptive questions |
|
|
87
|
+
| **low** | run exactly this, in this order, no variation | the operation is fragile, irreversible, or must be identical every time | stage 5's TDD order · stage 7's deploy · stage 9's matrix walk |
|
|
88
|
+
|
|
89
|
+
The picture worth keeping is an **open field versus a narrow bridge**. In the field,
|
|
90
|
+
say where to go and let the agent find the route. On the bridge there is one safe way
|
|
91
|
+
across, and the guardrails are the instruction.
|
|
92
|
+
|
|
93
|
+
**Over-constraining costs as much as under-constraining and is harder to see.** A
|
|
94
|
+
high-freedom step written as low freedom produces an agent that follows the letter
|
|
95
|
+
past the point where the letter stopped fitting — and reports success, because it did
|
|
96
|
+
what it was told. Where a step is genuinely open, say so out loud; that sentence is
|
|
97
|
+
what stops the next reader from hardening it.
|
|
98
|
+
|
|
99
|
+
Every stage in [`stages.md`](stages.md) declares its level and its reason, on the
|
|
100
|
+
line under its heading.
|
|
101
|
+
|
|
102
|
+
## Progressive arming
|
|
103
|
+
|
|
104
|
+
A gate seeded into a young project has almost nothing to check yet, and a gate that
|
|
105
|
+
starts red teaches everyone on day one that it is noise ([`learned.md`](learned.md)
|
|
106
|
+
rule 9). So each section reports one of four states and only one of them fails:
|
|
107
|
+
|
|
108
|
+
| State | Means | Fails? |
|
|
109
|
+
|---|---|---|
|
|
110
|
+
| `ok` | the check ran and passed | no |
|
|
111
|
+
| `dormant: … — no <artefact> yet` | the input does not exist yet | no |
|
|
112
|
+
| `skip: … — <why>` | the input exists, the check could not run here | no |
|
|
113
|
+
| `ERR` | the check ran and found something | **yes** |
|
|
114
|
+
|
|
115
|
+
`dormant` and `skip` are **printed, never silent** — that is the whole reason they do
|
|
116
|
+
not quietly become permanent.
|
|
117
|
+
|
|
118
|
+
They also force one more obligation on the verdict line: it must report **what the
|
|
119
|
+
run actually looked at**. Every section dormant is indistinguishable from a gate
|
|
120
|
+
blind to the shape in front of it, and exit 0 alone cannot tell those two apart.
|
|
121
|
+
|
|
73
122
|
## Before you run a check
|
|
74
123
|
|
|
75
124
|
Four preconditions. Skipping any of them turns a run into a claim.
|
|
@@ -125,7 +125,7 @@ and the commit. Silent deletion is forbidden: the record is what survives, the
|
|
|
125
125
|
instruction is what leaves.
|
|
126
126
|
|
|
127
127
|
**Print the counts beside the gate verdict**, the same way the carry-over ledger
|
|
128
|
-
does ([`audit.md`](audit.md) → *ratchet, never TODO*):
|
|
128
|
+
does ([`audit.md`](audit.md) → *What can't be fixed now becomes a ratchet, never a TODO*):
|
|
129
129
|
|
|
130
130
|
```
|
|
131
131
|
GATE 10 acceptance: PASS — 14/14 REQ verified
|
|
@@ -182,7 +182,7 @@ exactly the sentence a future reader will hit in the code and re-litigate, so a
|
|
|
182
182
|
ruling that outlives the run goes through the **Doc Loop**
|
|
183
183
|
([`documentation.md`](documentation.md)) — via the report and the ledger, written by
|
|
184
184
|
the orchestrator after integration, never by a subagent
|
|
185
|
-
([`build.md`](build.md) →
|
|
185
|
+
([`build.md`](build.md) → *4.1a Decisions settled inside a task*).
|
|
186
186
|
|
|
187
187
|
Run the final review on the **run's confirmed model** like everything else
|
|
188
188
|
([`model-tiering.md`](model-tiering.md)). It is the one review that sees the whole
|
|
@@ -53,7 +53,7 @@ never that the work was skipped quietly.
|
|
|
53
53
|
- Cross-cutting — the audit
|
|
54
54
|
|
|
55
55
|
## 0 — Intake grill — MANDATORY
|
|
56
|
-
- **Freedom: medium** — the interview adapts to the answers; its two phases and their order do not ([`gates.md`](gates.md) → *Axis
|
|
56
|
+
- **Freedom: medium** — the interview adapts to the answers; its two phases and their order do not ([`gates.md`](gates.md) → *Axis C*).
|
|
57
57
|
- **Stage 0 is not optional and not skippable.** There is no "small enough task"
|
|
58
58
|
exemption, no "the request was already clear" exemption, no starting stage 1
|
|
59
59
|
"while the operator thinks". The only sanctioned bypass is the
|
|
@@ -154,7 +154,7 @@ never that the work was skipped quietly.
|
|
|
154
154
|
reversible calls can be deferred with a note). Only then start stage 1.
|
|
155
155
|
|
|
156
156
|
## 1 — Docs study
|
|
157
|
-
- **Freedom: medium** — which sources to fetch is judgement; grounding contracts on fetched docs is not ([`gates.md`](gates.md) → *Axis
|
|
157
|
+
- **Freedom: medium** — which sources to fetch is judgement; grounding contracts on fetched docs is not ([`gates.md`](gates.md) → *Axis C*).
|
|
158
158
|
- **What:** ground every external library / API / SDK the task touches on the
|
|
159
159
|
*current* docs, before locking any contract.
|
|
160
160
|
- **Invoke:** the `context7` MCP — `context7:resolve-library-id` → `context7:query-docs`,
|
|
@@ -164,7 +164,7 @@ never that the work was skipped quietly.
|
|
|
164
164
|
not recall. Unresolvable libraries are flagged in the spec.
|
|
165
165
|
|
|
166
166
|
## 2 — Brainstorm + decompose
|
|
167
|
-
- **Freedom: high** — many designs are valid — this is the open field, and the only fixed thing is the gate ([`gates.md`](gates.md) → *Axis
|
|
167
|
+
- **Freedom: high** — many designs are valid — this is the open field, and the only fixed thing is the gate ([`gates.md`](gates.md) → *Axis C*).
|
|
168
168
|
- **How it runs: [`brainstorm.md`](brainstorm.md)** — built into this skill. Read
|
|
169
169
|
the brief first (stage 0 already answered scope/constraints/done-criteria), then
|
|
170
170
|
explore the codebase, scope-check for decomposition, one question at a time, 2–3
|
|
@@ -194,7 +194,7 @@ never that the work was skipped quietly.
|
|
|
194
194
|
contracts named with their owner.
|
|
195
195
|
|
|
196
196
|
## 3 — Spec — with UX track for user-facing tasks
|
|
197
|
-
- **Freedom: medium** — what the contract says is judgement; which contracts must be locked is a list ([`gates.md`](gates.md) → *Axis
|
|
197
|
+
- **Freedom: medium** — what the contract says is judgement; which contracts must be locked is a list ([`gates.md`](gates.md) → *Axis C*).
|
|
198
198
|
- **How it runs: [`spec.md`](spec.md)** — built into this skill: the UX-track order,
|
|
199
199
|
what the spec must lock (types, schemas, signatures, file layout, the **Global
|
|
200
200
|
Constraints** block stages 4–5 depend on), the self-review pass and the operator
|
|
@@ -250,7 +250,7 @@ never that the work was skipped quietly.
|
|
|
250
250
|
starts before this — the chain comes BEFORE interface.
|
|
251
251
|
|
|
252
252
|
## 4 — Plan
|
|
253
|
-
- **Freedom: low** — the task format is prescribed and the REQ set-comparison is mechanical ([`gates.md`](gates.md) → *Axis
|
|
253
|
+
- **Freedom: low** — the task format is prescribed and the REQ set-comparison is mechanical ([`gates.md`](gates.md) → *Axis C*).
|
|
254
254
|
- **How it runs: [`planning.md`](planning.md)** — built into this skill →
|
|
255
255
|
`docs/superpowers/plans/YYYY-MM-DD-<topic>.md` (same slug as the brief and the
|
|
256
256
|
spec). Zero-context tasks, exact
|
|
@@ -269,7 +269,7 @@ never that the work was skipped quietly.
|
|
|
269
269
|
same change (super-ux *same-change* rule).
|
|
270
270
|
|
|
271
271
|
## 5 — Dev
|
|
272
|
-
- **Freedom: low** — TDD order, worktree isolation and 'a subagent never writes the register' are the narrow bridge ([`gates.md`](gates.md) → *Axis
|
|
272
|
+
- **Freedom: low** — TDD order, worktree isolation and 'a subagent never writes the register' are the narrow bridge ([`gates.md`](gates.md) → *Axis C*).
|
|
273
273
|
- **How it runs: [`build.md`](build.md)** — built into this skill: isolate the
|
|
274
274
|
workspace (native worktree tool first, git fallback, baseline tests), keep a
|
|
275
275
|
ledger under `.task-pipeline/build/<plan>/` so a compacted context can resume,
|
|
@@ -291,7 +291,7 @@ never that the work was skipped quietly.
|
|
|
291
291
|
"leave it" recorded).
|
|
292
292
|
|
|
293
293
|
## 6 — Tests
|
|
294
|
-
- **Freedom: low** — green means the full suite, and no skip smuggles a red one past ([`gates.md`](gates.md) → *Axis
|
|
294
|
+
- **Freedom: low** — green means the full suite, and no skip smuggles a red one past ([`gates.md`](gates.md) → *Axis C*).
|
|
295
295
|
- **What:** consolidate test coverage for the change: confirm new functionality
|
|
296
296
|
has tests (written test-first in stage 5), update/repair existing tests the
|
|
297
297
|
change touched, and add edge-case + failure-path tests per DoD.
|
|
@@ -305,7 +305,7 @@ never that the work was skipped quietly.
|
|
|
305
305
|
([`audit.md`](audit.md)).
|
|
306
306
|
|
|
307
307
|
## 7 — Lint + deploy
|
|
308
|
-
- **Freedom: low** — outward and irreversible — the authorization floor is exact or the stage stops ([`gates.md`](gates.md) → *Axis
|
|
308
|
+
- **Freedom: low** — outward and irreversible — the authorization floor is exact or the stage stops ([`gates.md`](gates.md) → *Axis C*).
|
|
309
309
|
- Read host conventions (`conventions.md`): run the linter; fix failures. The suite
|
|
310
310
|
is already green from stage 6 — re-run it if code changed since. For UI projects,
|
|
311
311
|
the **super-ux linter** (`python3 docs/ux/lint.py` / `/ux-lint`) is part of lint —
|
|
@@ -320,14 +320,14 @@ never that the work was skipped quietly.
|
|
|
320
320
|
operator go. Respect deploy-from-main rules if the project mandates them.
|
|
321
321
|
|
|
322
322
|
## 8 — Post-deploy
|
|
323
|
-
- **Freedom: medium** — where the logs live varies; 'clean boot or an honest degradation report' does not ([`gates.md`](gates.md) → *Axis
|
|
323
|
+
- **Freedom: medium** — where the logs live varies; 'clean boot or an honest degradation report' does not ([`gates.md`](gates.md) → *Axis C*).
|
|
324
324
|
- Tail deploy logs / health-check per conventions. Confirm clean boot, no error
|
|
325
325
|
spike, live subsystems healthy.
|
|
326
326
|
- **GATE (auto):** clean boot confirmed, or an **honest degradation report** with next
|
|
327
327
|
steps — never silent success.
|
|
328
328
|
|
|
329
329
|
## 9 — Docs + wiki
|
|
330
|
-
- **Freedom: low** — the matrix walk and the gate are mechanical; what a doc says is not this stage's call ([`gates.md`](gates.md) → *Axis
|
|
330
|
+
- **Freedom: low** — the matrix walk and the gate are mechanical; what a doc says is not this stage's call ([`gates.md`](gates.md) → *Axis C*).
|
|
331
331
|
- **The propagation sweep runs first** ([`documentation.md`](documentation.md)).
|
|
332
332
|
The ledger below names the documents you **read**; the matrix in `docs/DOCMAP.md`
|
|
333
333
|
names the documents you **owe**. They are not the same list, and the gap between
|
|
@@ -381,7 +381,7 @@ never that the work was skipped quietly.
|
|
|
381
381
|
carry-over count printed beside this verdict**.
|
|
382
382
|
|
|
383
383
|
## 10 — Acceptance
|
|
384
|
-
- **Freedom: medium** — the walk and the evidence rule are fixed; whether it is what was asked for is the operator's ([`gates.md`](gates.md) → *Axis
|
|
384
|
+
- **Freedom: medium** — the walk and the evidence rule are fixed; whether it is what was asked for is the operator's ([`gates.md`](gates.md) → *Axis C*).
|
|
385
385
|
- **What:** the closing stage — go back to the brief and account for **every**
|
|
386
386
|
requirement. Doctrine: [`acceptance.md`](acceptance.md). Every earlier gate asks
|
|
387
387
|
"is this artifact good?"; none asks "does this still contain everything that was
|
|
@@ -37,8 +37,19 @@ MAP_FILE=${MAP_FILE:-$DOCS_DIR/DOCMAP.md}
|
|
|
37
37
|
RETRO_GLOB=${RETRO_GLOB:-$DOCS_DIR/superpowers}
|
|
38
38
|
|
|
39
39
|
# ---------- ratchets: a floor may only fall. Raising one is a decision. ----------
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
# THE TWO FLOORS ARE DIFFERENT KINDS. Mixing them up is why this is spelled out.
|
|
41
|
+
#
|
|
42
|
+
# PROP_FLOOR is an ID THRESHOLD, not a count. An entry whose number is >= the floor
|
|
43
|
+
# must have propagated; everything older is a counted backlog that may only shrink.
|
|
44
|
+
# ADOPTING THIS GATE IN AN EXISTING REPOSITORY MEANS SETTING IT TO THE NEXT FREE
|
|
45
|
+
# ID: from today the rule binds, and the history becomes one printed number instead
|
|
46
|
+
# of a thousand failures nobody will fix. Lower it as tranches are cleared.
|
|
47
|
+
PROP_FLOOR=${PROP_FLOOR:-0} # id threshold — entries >= this must propagate
|
|
48
|
+
#
|
|
49
|
+
# RESIDUE_FLOOR is a COUNT: how many unmarked citations of retired decisions are
|
|
50
|
+
# tolerated. On adoption set it to what the repository measurably has today, then
|
|
51
|
+
# only ever lower it.
|
|
52
|
+
RESIDUE_FLOOR=${RESIDUE_FLOOR:-0} # count — tolerated unmarked citations, today's number
|
|
42
53
|
|
|
43
54
|
TMP=$(mktemp -d 2>/dev/null || mktemp -d -t docgate)
|
|
44
55
|
trap 'rm -rf "$TMP"' EXIT
|
|
@@ -82,7 +93,9 @@ find . -maxdepth 1 -type f -name '*.md' 2>/dev/null | sort >> "$TMP/files" || tr
|
|
|
82
93
|
FILE_COUNT=$(wc -l < "$TMP/files" | tr -d ' ')
|
|
83
94
|
|
|
84
95
|
if [ "$FILE_COUNT" = "0" ]; then
|
|
85
|
-
echo "FAIL: documentation gate — no markdown found
|
|
96
|
+
echo "FAIL: documentation gate — no markdown found in $DOCS_DIR/ or the repository root."
|
|
97
|
+
echo " Seed the doc map and the registers first (task-pipeline stage 0, phase 1b),"
|
|
98
|
+
echo " or point DOCS_DIR at wherever this project keeps its documentation."
|
|
86
99
|
exit 1
|
|
87
100
|
fi
|
|
88
101
|
|