task-pipeline-skill 1.7.2 → 1.8.1
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 +118 -0
- package/CODE_OF_CONDUCT.md +38 -0
- package/CONTRIBUTING.md +215 -0
- package/README.md +29 -1
- package/SECURITY.md +67 -0
- package/SKILL-CARD.md +60 -0
- package/bin/task-pipeline.js +23 -0
- package/evals/RESULTS.md +47 -0
- package/evals/__pycache__/run.cpython-314.pyc +0 -0
- package/evals/run.py +130 -0
- package/evals/task-pipeline.evals.json +166 -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 +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +13 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +6 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/audit.md +11 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +12 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/build.md +12 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +10 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/decomposition.md +9 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/documentation.md +15 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/gates.md +63 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +10 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/hooks.md +16 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-graph.md +8 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +13 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +8 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +8 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/planning.md +12 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +12 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/review.md +11 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +10 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +57 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/tdd.md +10 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/docgate.sh +3 -1
package/evals/run.py
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate the evaluation suite and print the run protocol.
|
|
3
|
+
|
|
4
|
+
**This script does not run a model, and it never reports a pass.** Anthropic's
|
|
5
|
+
guidance ships no runner for Skill evaluations ("There is not currently a built-in
|
|
6
|
+
way to run these evaluations"), and a script that claimed to have executed one
|
|
7
|
+
would be the exact failure this repository's own doctrine is written against — a
|
|
8
|
+
tool describing a world it is not looking at.
|
|
9
|
+
|
|
10
|
+
What it does:
|
|
11
|
+
* checks the suite is well-formed and covers every required category;
|
|
12
|
+
* prints each query with its expected behaviours, ready to run;
|
|
13
|
+
* checks RESULTS.md exists and says, honestly, when the suite last ran.
|
|
14
|
+
|
|
15
|
+
python3 evals/run.py # validate + print the protocol
|
|
16
|
+
python3 evals/run.py --list # ids and categories only
|
|
17
|
+
|
|
18
|
+
Zero dependencies, same as the validator.
|
|
19
|
+
"""
|
|
20
|
+
import json
|
|
21
|
+
import os
|
|
22
|
+
import re
|
|
23
|
+
import sys
|
|
24
|
+
|
|
25
|
+
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
26
|
+
SUITE = os.path.join(ROOT, "evals", "task-pipeline.evals.json")
|
|
27
|
+
RESULTS = os.path.join(ROOT, "evals", "RESULTS.md")
|
|
28
|
+
|
|
29
|
+
# The enterprise guidance requires coverage of triggering (both directions) and
|
|
30
|
+
# ambiguity. The last two are ours: instruction following is where a ten-stage
|
|
31
|
+
# skill actually fails, and coexistence is what a broad description breaks.
|
|
32
|
+
REQUIRED = ("should_trigger", "should_not_trigger", "ambiguous",
|
|
33
|
+
"instruction_following", "coexistence")
|
|
34
|
+
MIN_EVALS = 3 # Anthropic: "At least three evaluations created"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def main(argv):
|
|
38
|
+
errors = []
|
|
39
|
+
if not os.path.isfile(SUITE):
|
|
40
|
+
print(f"FAIL: no suite at {os.path.relpath(SUITE, ROOT)}")
|
|
41
|
+
return 2
|
|
42
|
+
suite = json.load(open(SUITE, encoding="utf-8"))
|
|
43
|
+
evals = suite.get("evals") or []
|
|
44
|
+
|
|
45
|
+
seen = set()
|
|
46
|
+
for e in evals:
|
|
47
|
+
where = e.get("id", "<no id>")
|
|
48
|
+
if not e.get("id"):
|
|
49
|
+
errors.append("an eval has no id")
|
|
50
|
+
elif e["id"] in seen:
|
|
51
|
+
errors.append(f"duplicate eval id {e['id']}")
|
|
52
|
+
seen.add(e.get("id"))
|
|
53
|
+
if e.get("category") not in REQUIRED:
|
|
54
|
+
errors.append(f"{where}: category {e.get('category')!r} is not one of {list(REQUIRED)}")
|
|
55
|
+
if not (e.get("query") or "").strip():
|
|
56
|
+
errors.append(f"{where}: empty query")
|
|
57
|
+
beh = e.get("expected_behavior") or []
|
|
58
|
+
if len(beh) < 2:
|
|
59
|
+
errors.append(f"{where}: needs at least two expected behaviours — one is a hope, "
|
|
60
|
+
"two is a rubric")
|
|
61
|
+
if not (e.get("why") or "").strip():
|
|
62
|
+
errors.append(f"{where}: no `why` — an eval whose failure mode is unstated "
|
|
63
|
+
"cannot tell you what broke")
|
|
64
|
+
|
|
65
|
+
if len(evals) < MIN_EVALS:
|
|
66
|
+
errors.append(f"{len(evals)} eval(s); at least {MIN_EVALS} are required")
|
|
67
|
+
covered = {e.get("category") for e in evals}
|
|
68
|
+
for cat in REQUIRED:
|
|
69
|
+
if cat not in covered:
|
|
70
|
+
errors.append(f"no eval covers {cat!r}")
|
|
71
|
+
|
|
72
|
+
if errors:
|
|
73
|
+
print("FAIL: evaluation suite invalid")
|
|
74
|
+
for e in errors:
|
|
75
|
+
print(" - " + e)
|
|
76
|
+
return 1
|
|
77
|
+
|
|
78
|
+
by_cat = {}
|
|
79
|
+
for e in evals:
|
|
80
|
+
by_cat.setdefault(e["category"], []).append(e)
|
|
81
|
+
|
|
82
|
+
if "--list" in argv:
|
|
83
|
+
for cat in REQUIRED:
|
|
84
|
+
for e in by_cat.get(cat, []):
|
|
85
|
+
print(f" {e['id']:<10} {cat:<22} {e['query'][:60]}")
|
|
86
|
+
print(f"\n{len(evals)} evals across {len(by_cat)} categories")
|
|
87
|
+
return 0
|
|
88
|
+
|
|
89
|
+
print("=" * 72)
|
|
90
|
+
print("task-pipeline evaluation protocol")
|
|
91
|
+
print("=" * 72)
|
|
92
|
+
print("Run each query in a FRESH session with the skill installed, once per")
|
|
93
|
+
print("model in", suite.get("models", []), "— effectiveness varies by model.")
|
|
94
|
+
print("Record every verdict in evals/RESULTS.md with the date and the model.")
|
|
95
|
+
print("A query you did not run is not a pass; leave it blank and say so.\n")
|
|
96
|
+
for cat in REQUIRED:
|
|
97
|
+
print(f"\n--- {cat} ---")
|
|
98
|
+
for e in by_cat.get(cat, []):
|
|
99
|
+
print(f"\n[{e['id']}] {e['query']}")
|
|
100
|
+
print(f" why: {e['why']}")
|
|
101
|
+
for b in e["expected_behavior"]:
|
|
102
|
+
print(f" [ ] {b}")
|
|
103
|
+
|
|
104
|
+
print("\n" + "=" * 72)
|
|
105
|
+
if not os.path.isfile(RESULTS):
|
|
106
|
+
print("NO RESULTS FILE — the suite has never been recorded as run.")
|
|
107
|
+
return 1
|
|
108
|
+
body = open(RESULTS, encoding="utf-8").read()
|
|
109
|
+
# Count RUN HEADINGS only, outside fenced blocks. Counting every date in the
|
|
110
|
+
# file swept up the ratchet table and the fenced example and reported five runs
|
|
111
|
+
# against zero — a reporting tool that overstates its own subject, which is the
|
|
112
|
+
# one thing this script exists not to do.
|
|
113
|
+
outside, infence = [], False
|
|
114
|
+
for ln in body.split("\n"):
|
|
115
|
+
if re.match(r"^\s*(```|~~~)", ln):
|
|
116
|
+
infence = not infence
|
|
117
|
+
continue
|
|
118
|
+
if not infence:
|
|
119
|
+
outside.append(ln)
|
|
120
|
+
runs = [l for l in outside if re.match(r"^## 20\d{2}-\d{2}-\d{2}\b", l)]
|
|
121
|
+
print(f"suite: {len(evals)} evals · recorded runs: {len(runs)}")
|
|
122
|
+
if not runs:
|
|
123
|
+
print("RESULTS.md carries no dated run — the suite is authored and unexecuted.")
|
|
124
|
+
print("OK: suite valid. Execution is a human/agent step; this script never")
|
|
125
|
+
print(" reports a pass it did not observe.")
|
|
126
|
+
return 0
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
if __name__ == "__main__":
|
|
130
|
+
sys.exit(main(sys.argv[1:]))
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_note": "Behavioural evaluations for the task-pipeline skill. Format follows Anthropic's Skill authoring guidance (skills, query, expected_behavior), extended with `id`, `category` and `why` so a failure says which dimension broke. There is no built-in runner for these upstream; `run.py` validates the suite and prints the protocol, and results are recorded in RESULTS.md. Dimensions come from the enterprise guidance: triggering accuracy, isolation, coexistence, instruction following, output quality.",
|
|
3
|
+
"skill": "task-pipeline",
|
|
4
|
+
"models": ["haiku", "sonnet", "opus"],
|
|
5
|
+
"evals": [
|
|
6
|
+
{
|
|
7
|
+
"id": "TRIG-01",
|
|
8
|
+
"category": "should_trigger",
|
|
9
|
+
"skills": ["task-pipeline"],
|
|
10
|
+
"query": "run this through the pipeline: add per-tenant rate limiting to the public API",
|
|
11
|
+
"expected_behavior": [
|
|
12
|
+
"Invokes the task-pipeline skill rather than starting to design or code inline",
|
|
13
|
+
"Runs the stage-0 knowledge harvest BEFORE the first interview question, and writes a source ledger",
|
|
14
|
+
"Asks interview questions one at a time, each with a recommended answer",
|
|
15
|
+
"Writes no implementation code before a brief is committed and confirmed"
|
|
16
|
+
],
|
|
17
|
+
"why": "The explicit invocation phrase is the primary trigger; the failure it guards is jumping to code."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "TRIG-02",
|
|
21
|
+
"category": "should_trigger",
|
|
22
|
+
"skills": ["task-pipeline"],
|
|
23
|
+
"query": "полный цикл: перенести биллинг на нового провайдера",
|
|
24
|
+
"expected_behavior": [
|
|
25
|
+
"Invokes the task-pipeline skill from the Russian trigger alias",
|
|
26
|
+
"Continues the conversation in Russian while keeping identifiers and commands untranslated",
|
|
27
|
+
"Reaches stage 0 and does not skip the grill because the request looks clear"
|
|
28
|
+
],
|
|
29
|
+
"why": "The description carries Russian trigger aliases; if they do not fire, half the operator's phrasings miss the skill."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "TRIG-03",
|
|
33
|
+
"category": "should_trigger",
|
|
34
|
+
"skills": ["task-pipeline"],
|
|
35
|
+
"query": "build a support-agent dashboard with saved views and CSV export",
|
|
36
|
+
"expected_behavior": [
|
|
37
|
+
"Invokes the skill without an explicit pipeline phrase, because the request is a substantial build",
|
|
38
|
+
"Detects the user-facing surface and surfaces super-ux at intake",
|
|
39
|
+
"Records the UI verdict in the brief"
|
|
40
|
+
],
|
|
41
|
+
"why": "Substantial work must trigger without the magic words, or the skill only helps people who already know it exists."
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "NOTRIG-01",
|
|
45
|
+
"category": "should_not_trigger",
|
|
46
|
+
"skills": ["task-pipeline"],
|
|
47
|
+
"query": "what does this regex do: ^(?!.*--)[a-z0-9-]{1,63}$",
|
|
48
|
+
"expected_behavior": [
|
|
49
|
+
"Answers the question directly",
|
|
50
|
+
"Does NOT invoke the task-pipeline skill",
|
|
51
|
+
"Does NOT create a TaskList or propose an intake grill"
|
|
52
|
+
],
|
|
53
|
+
"why": "A question is not a build. Triggering here is the 'description too broad' failure the enterprise guidance names."
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": "NOTRIG-02",
|
|
57
|
+
"category": "should_not_trigger",
|
|
58
|
+
"skills": ["task-pipeline"],
|
|
59
|
+
"query": "fix the typo in the README heading: 'Instalation' -> 'Installation'",
|
|
60
|
+
"expected_behavior": [
|
|
61
|
+
"Makes the edit directly",
|
|
62
|
+
"Does NOT invoke the task-pipeline skill",
|
|
63
|
+
"Does NOT run a ten-stage flow for a one-character change"
|
|
64
|
+
],
|
|
65
|
+
"why": "A trivial mechanical edit run through ten gates teaches the operator to route around the skill."
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"id": "NOTRIG-03",
|
|
69
|
+
"category": "should_not_trigger",
|
|
70
|
+
"skills": ["task-pipeline"],
|
|
71
|
+
"query": "explain how our auth middleware decides which routes are public",
|
|
72
|
+
"expected_behavior": [
|
|
73
|
+
"Reads the code and explains it",
|
|
74
|
+
"Does NOT invoke the task-pipeline skill"
|
|
75
|
+
],
|
|
76
|
+
"why": "Explanation is not delivery."
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"id": "AMB-01",
|
|
80
|
+
"category": "ambiguous",
|
|
81
|
+
"skills": ["task-pipeline"],
|
|
82
|
+
"query": "clean up the error handling in the payments module",
|
|
83
|
+
"expected_behavior": [
|
|
84
|
+
"Establishes scope before choosing a route — asks whether this is a bounded fix or a refactor worth the full cycle",
|
|
85
|
+
"Does NOT silently start the ten-stage flow, and does NOT silently start editing",
|
|
86
|
+
"States which route it is taking and why"
|
|
87
|
+
],
|
|
88
|
+
"why": "The honest failure here is a silent pick in either direction; the skill should make the choice visible."
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "AMB-02",
|
|
92
|
+
"category": "ambiguous",
|
|
93
|
+
"skills": ["task-pipeline"],
|
|
94
|
+
"query": "add an `is_archived` field to the user model",
|
|
95
|
+
"expected_behavior": [
|
|
96
|
+
"Recognises that a schema field touches contracts, migrations and documentation even though the change is small",
|
|
97
|
+
"Either runs the flow or states explicitly which parts it is skipping and why",
|
|
98
|
+
"Does not treat 'small diff' as 'no decision to record'"
|
|
99
|
+
],
|
|
100
|
+
"why": "Small changes with wide blast radius are where the doc track earns its keep or gets skipped."
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"id": "COEX-01",
|
|
104
|
+
"category": "coexistence",
|
|
105
|
+
"skills": ["task-pipeline", "super-ux"],
|
|
106
|
+
"query": "redesign the settings screen so the security options are easier to find",
|
|
107
|
+
"expected_behavior": [
|
|
108
|
+
"Does not steal the trigger from super-ux for what is a UX-chain task",
|
|
109
|
+
"If task-pipeline runs, it routes the UX chain to super-ux at stage 3 rather than improvising one",
|
|
110
|
+
"If super-ux runs, task-pipeline stays out of the way until there is something to build"
|
|
111
|
+
],
|
|
112
|
+
"why": "The enterprise guidance calls this out directly: a broad description steals triggers from narrower skills."
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"id": "INSTR-01",
|
|
116
|
+
"category": "instruction_following",
|
|
117
|
+
"skills": ["task-pipeline"],
|
|
118
|
+
"query": "run this through the pipeline: add a webhook retry policy. When you reach stage 0, show me what you did before your first question.",
|
|
119
|
+
"expected_behavior": [
|
|
120
|
+
"The knowledge harvest ran first and produced a source ledger with a row per source consulted, or an explicit 'none found'",
|
|
121
|
+
"The documentation inventory ran and docs/DOCMAP.md exists or was seeded",
|
|
122
|
+
"Intent was reconciled against the as-built record, with divergences named",
|
|
123
|
+
"The first interview question came AFTER all of that"
|
|
124
|
+
],
|
|
125
|
+
"why": "Phase-1 ordering is the single most skipped instruction; if it slips, every later answer is unchecked."
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"id": "INSTR-02",
|
|
129
|
+
"category": "instruction_following",
|
|
130
|
+
"skills": ["task-pipeline"],
|
|
131
|
+
"query": "you are at stage 9 of a pipeline run that changed a status enum and an API contract. Close the stage.",
|
|
132
|
+
"expected_behavior": [
|
|
133
|
+
"Walks the propagation matrix for every change type produced, not only the sources the harvest read",
|
|
134
|
+
"Records the settled decisions under ids and flips any answered questions",
|
|
135
|
+
"Runs the documentation gate and prints its ratchet counts beside the verdict",
|
|
136
|
+
"States any check that skipped, rather than passing silently"
|
|
137
|
+
],
|
|
138
|
+
"why": "Stage 9 is where 'docs in sync' used to be unfalsifiable; this eval is what makes the replacement real."
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"id": "INSTR-03",
|
|
142
|
+
"category": "instruction_following",
|
|
143
|
+
"skills": ["task-pipeline"],
|
|
144
|
+
"query": "you are a stage-5 implementer subagent in a worktree. While building, you settled that retries use exponential backoff capped at 30s. Record it.",
|
|
145
|
+
"expected_behavior": [
|
|
146
|
+
"Does NOT write to the decision register from inside the worktree",
|
|
147
|
+
"Puts the decision in the implementer report, and in the carry-over ledger if it outlives the task",
|
|
148
|
+
"States that the orchestrator runs the Doc Loop after integration, as a single writer"
|
|
149
|
+
],
|
|
150
|
+
"why": "Two worktrees appending to one append-only register is the collision the rule exists to prevent."
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"id": "INSTR-04",
|
|
154
|
+
"category": "instruction_following",
|
|
155
|
+
"skills": ["task-pipeline"],
|
|
156
|
+
"query": "you are at stage 10. Close the run. The REQ table looks complete.",
|
|
157
|
+
"expected_behavior": [
|
|
158
|
+
"Runs the ladder walk BEFORE writing the coverage table, and turns absences into new REQ rows first",
|
|
159
|
+
"Refuses to accept 'done' without evidence, downgrading to partial instead of upgrading the claim",
|
|
160
|
+
"Confirms every check it leans on — the documentation gate included — was seen failing once against a planted defect",
|
|
161
|
+
"Writes the retrospective last: prune, stamp with the run's commit, entry only on divergence"
|
|
162
|
+
],
|
|
163
|
+
"why": "'The table looks complete' is the exact prompt under which the ladder walk gets skipped."
|
|
164
|
+
}
|
|
165
|
+
]
|
|
166
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-pipeline-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.1",
|
|
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"
|
|
@@ -14,9 +14,14 @@
|
|
|
14
14
|
"bin",
|
|
15
15
|
"plugins",
|
|
16
16
|
"cursor",
|
|
17
|
+
"evals",
|
|
17
18
|
"README.md",
|
|
19
|
+
"SKILL-CARD.md",
|
|
18
20
|
"LICENSE",
|
|
19
|
-
"CHANGELOG.md"
|
|
21
|
+
"CHANGELOG.md",
|
|
22
|
+
"CONTRIBUTING.md",
|
|
23
|
+
"SECURITY.md",
|
|
24
|
+
"CODE_OF_CONDUCT.md"
|
|
20
25
|
],
|
|
21
26
|
"repository": "github:ssheleg/task-pipeline",
|
|
22
27
|
"homepage": "https://github.com/ssheleg/task-pipeline#readme",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "task-pipeline",
|
|
3
3
|
"displayName": "Task Pipeline",
|
|
4
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.",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.8.1",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "ssheleg",
|
|
8
8
|
"url": "https://x.com/sshlg93"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: task-pipeline
|
|
3
|
-
description: "
|
|
3
|
+
description: "Runs a substantial task through a full delivery pipeline: an intake grill that expands the request into a locked brief, then docs study, brainstorm, spec, plan, subagent build, tests, lint/deploy, post-deploy check, docs/wiki sync and acceptance — gated stages whose doctrine ships inside this skill (no required companions). Use when any substantial feature, fix or build should follow the disciplined cycle rather than ad-hoc coding, or on 'run this through the pipeline' / 'прогони по конвейеру', 'the full cycle' / 'полный цикл', /task-pipeline. The grill is mandatory and front-loads every decision, so stages 1→10 run without mid-flight questions; documentation is a deliverable with its own gate; recommends super-ux for user-facing work; confirms one model up front (most capable available, never a hardcoded id); reads host conventions so it stays project-agnostic."
|
|
4
4
|
license: MIT
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -7,6 +7,19 @@ None of them asks *"does this still contain everything that was asked for?"*
|
|
|
7
7
|
That is this stage's only job: **go back to the brief and account for every
|
|
8
8
|
requirement.** It is what turns the pipeline from a funnel into a circle.
|
|
9
9
|
|
|
10
|
+
## Contents
|
|
11
|
+
|
|
12
|
+
- Why a stage and not a gate
|
|
13
|
+
- First, the ladder walk — what the list itself is missing
|
|
14
|
+
- Inputs
|
|
15
|
+
- Output — the coverage table
|
|
16
|
+
- Evidence, not assertion
|
|
17
|
+
- Several repositories — a submodule is finished when its parent says so
|
|
18
|
+
- The closing question
|
|
19
|
+
- The retrospective — the run's last act
|
|
20
|
+
- GATE (manual)
|
|
21
|
+
- When the answer is "something's missing"
|
|
22
|
+
|
|
10
23
|
## Why a stage and not a gate
|
|
11
24
|
|
|
12
25
|
The loss this catches doesn't happen inside a stage — it happens **on the seams**.
|
|
@@ -5,6 +5,12 @@ a resumed or handed-off run always knows where to look. This is the recommended
|
|
|
5
5
|
structure; a host project may relocate roots via its `CLAUDE.md`, but keep the
|
|
6
6
|
shape.
|
|
7
7
|
|
|
8
|
+
## Contents
|
|
9
|
+
|
|
10
|
+
- In the host project
|
|
11
|
+
- Stage → artifact map
|
|
12
|
+
- This repo (task-pipeline itself), for reference
|
|
13
|
+
|
|
8
14
|
## In the host project
|
|
9
15
|
|
|
10
16
|
```
|
|
@@ -14,6 +14,17 @@ This file is the method that finds those. It is **cross-cutting**: stage 10 runs
|
|
|
14
14
|
before writing the coverage table, the program loop runs it per module, and a task
|
|
15
15
|
whose whole job is "audit X" runs nothing else.
|
|
16
16
|
|
|
17
|
+
## Contents
|
|
18
|
+
|
|
19
|
+
- Three things that are easy to confuse
|
|
20
|
+
- Why "look again, more carefully" stops working
|
|
21
|
+
- The ladder
|
|
22
|
+
- How one audit pass runs
|
|
23
|
+
- Exit criterion — the part usually skipped
|
|
24
|
+
- The three rules that stop this becoming another loop
|
|
25
|
+
- When this runs
|
|
26
|
+
- Rationalizations
|
|
27
|
+
|
|
17
28
|
## Three things that are easy to confuse
|
|
18
29
|
|
|
19
30
|
| File | Runs when | Answers |
|
|
@@ -12,6 +12,18 @@ approved design — not at code.
|
|
|
12
12
|
> the UI verdict is a required output, and the spec write-up moved to stage 3
|
|
13
13
|
> ([`spec.md`](spec.md)).
|
|
14
14
|
|
|
15
|
+
## Contents
|
|
16
|
+
|
|
17
|
+
- The hard gate
|
|
18
|
+
- Input: the brief, not a blank page
|
|
19
|
+
- The loop
|
|
20
|
+
- Design for isolation and clarity
|
|
21
|
+
- Working in an existing codebase
|
|
22
|
+
- UI detection — a required output
|
|
23
|
+
- The approved design is a set of decisions — record them
|
|
24
|
+
- GATE (manual)
|
|
25
|
+
- Rationalizations
|
|
26
|
+
|
|
15
27
|
## The hard gate
|
|
16
28
|
|
|
17
29
|
**No implementation action before the operator approves a design.** No code, no
|
|
@@ -29,6 +29,17 @@ the work; the gates, the artifacts and the review discipline do not. Say plainly
|
|
|
29
29
|
that the run is inline, since a self-review is weaker evidence than a fresh
|
|
30
30
|
reviewer's.
|
|
31
31
|
|
|
32
|
+
## Contents
|
|
33
|
+
|
|
34
|
+
- 1. Isolation
|
|
35
|
+
- 2. Workspace and ledger
|
|
36
|
+
- 3. Models
|
|
37
|
+
- 4. The task loop
|
|
38
|
+
- 5. Final whole-branch review
|
|
39
|
+
- 6. Integrate, then finish
|
|
40
|
+
- GATE (auto)
|
|
41
|
+
- Rationalizations
|
|
42
|
+
|
|
32
43
|
## 1. Isolation
|
|
33
44
|
|
|
34
45
|
Work never starts on `main`/`master` without the operator's explicit consent
|
|
@@ -341,7 +352,7 @@ findings are neither fixed nor parked-with-ruling at the cap.
|
|
|
341
352
|
After the last task: build a package over `MERGE_BASE`..`HEAD`
|
|
342
353
|
(`git merge-base "$BASE_BRANCH" HEAD`, where `$BASE_BRANCH` is the base recorded in
|
|
343
354
|
the stage-0 brief — never a hardcoded `main`), dispatch the whole-branch review
|
|
344
|
-
([`review.md`](review.md) → *
|
|
355
|
+
([`review.md`](review.md) → *Prompt — final whole-branch review*; on the run's model, escalation offered
|
|
345
356
|
out loud per *Models* above), and point it at the
|
|
346
357
|
ledger's deferred-minor and parked lines so it can triage what must be fixed before
|
|
347
358
|
merge.
|
|
@@ -8,6 +8,15 @@ something isn't installed.
|
|
|
8
8
|
What remains is a short list of **optional** companions that make individual stages
|
|
9
9
|
better, plus one that is required only for user-facing work.
|
|
10
10
|
|
|
11
|
+
## Contents
|
|
12
|
+
|
|
13
|
+
- Built in — nothing to install
|
|
14
|
+
- The matrix
|
|
15
|
+
- Optional bridge — substituting an external skill set
|
|
16
|
+
- Preflight (emit before stage 0)
|
|
17
|
+
- Credit
|
|
18
|
+
- Hand-off the other direction
|
|
19
|
+
|
|
11
20
|
## Built in — nothing to install
|
|
12
21
|
|
|
13
22
|
| Stage | Doctrine |
|
|
@@ -34,7 +43,7 @@ better, plus one that is required only for user-facing work.
|
|
|
34
43
|
| Skill / tool | Needed for | Required? | Install |
|
|
35
44
|
|---|---|---|---|
|
|
36
45
|
| **super-ux** (`ux-foundation`, `ux-flows`, `ux-scenarios`, `ux-audit`, `/ux`, `/ux-lint`) | stage 3 UX track | **Required for any user-facing task** | `/plugin marketplace add ssheleg/super-ux` → `/plugin install super-ux@super-ux` (or `npx skills add ssheleg/super-ux`) |
|
|
37
|
-
| **context7** (MCP) | stage 1 docs study | Recommended (web-search fallback) | connect the context7 MCP server |
|
|
46
|
+
| **context7** (MCP — call tools fully qualified: `context7:resolve-library-id`, `context7:query-docs`) | stage 1 docs study | Recommended (web-search fallback) | connect the context7 MCP server |
|
|
38
47
|
| **Figma** (MCP) | stage 3 UX track, when the project designs visually — super-ux mirrors each `SCR-` screen/state into a frame | Optional, **UI + Figma-on only**. Absent → super-ux degrades to text-only *by itself and never blocks*, so shipping a UI feature with no mockups becomes a silent scope call — which is why the stage-0 sweep decides it | connect the Figma MCP server (`/mcp`, or your claude.ai connectors) |
|
|
39
48
|
| **[obsidian-wiki](https://github.com/ar9av/obsidian-wiki)** (`wiki-query`, `wiki-update`) | **stage 0 harvest** (query what's already known) **+ stage 9 sync** | **Recommended** — never a gate; absent → harvest runs on repo docs alone | `pip install obsidian-wiki` → `obsidian-wiki setup --vault /path/to/your/vault` |
|
|
40
49
|
| **[graphify](https://github.com/Graphify-Labs/graphify)** (`/graphify`, `graphify query\|affected\|god-nodes`) | **stage 0 harvest** (reach: what calls this, what breaks if it moves) **+ stage 9 refresh + the graph↔docs divergence check** ([`knowledge-graph.md`](knowledge-graph.md)) | **Recommended** — never a gate; absent → the harvest greps instead, and the divergence axis is unavailable | `uv tool install graphifyy` → `graphify install` → `/graphify .` |
|
|
@@ -8,6 +8,15 @@ a time, each brick carrying its own documentation, spec, plan, build and gates.
|
|
|
8
8
|
This runs at the end of **stage 2**, on the approved design, before any spec is
|
|
9
9
|
written. It is skipped — explicitly, in writing — when the work is a single module.
|
|
10
10
|
|
|
11
|
+
## Contents
|
|
12
|
+
|
|
13
|
+
- When it applies
|
|
14
|
+
- How to cut
|
|
15
|
+
- The module map — the artifact
|
|
16
|
+
- GATE (part of stage 2, manual)
|
|
17
|
+
- The program loop — one brick at a time
|
|
18
|
+
- Program done
|
|
19
|
+
|
|
11
20
|
## When it applies
|
|
12
21
|
|
|
13
22
|
Decompose when any of these is true:
|
|
@@ -16,6 +16,20 @@ being written twice; write it once, here.
|
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
19
|
+
## Contents
|
|
20
|
+
|
|
21
|
+
- The inventory — four questions, answered before the first line of work
|
|
22
|
+
- Registers and ids
|
|
23
|
+
- Single source of truth
|
|
24
|
+
- The Doc Loop
|
|
25
|
+
- Changing your mind
|
|
26
|
+
- The propagation matrix
|
|
27
|
+
- Navigation
|
|
28
|
+
- Intent and as-built
|
|
29
|
+
- Registers are shared state
|
|
30
|
+
- Where this binds in the pipeline
|
|
31
|
+
- Rationalizations
|
|
32
|
+
|
|
19
33
|
## The inventory — four questions, answered before the first line of work
|
|
20
34
|
|
|
21
35
|
Stage 0 answers these before the interview, and writes the answers to
|
|
@@ -36,7 +50,7 @@ repository — the smallest one still decides *somewhere* that a thing is true
|
|
|
36
50
|
the only choice is whether that answer is written down or re-derived by each new
|
|
37
51
|
reader. What scales down is **volume**, never the rules: a register with three
|
|
38
52
|
entries is a register, and the seeded gate is green on exactly those three
|
|
39
|
-
([`gates.md`](gates.md) → *
|
|
53
|
+
([`gates.md`](gates.md) → *Progressive arming*).
|
|
40
54
|
|
|
41
55
|
---
|
|
42
56
|
|
|
@@ -19,6 +19,22 @@ elsewhere and is not restated here:
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
+
## Contents
|
|
23
|
+
|
|
24
|
+
- Axis A — the stage gate type
|
|
25
|
+
- Axis B — the enforcement mechanism
|
|
26
|
+
- Axis C — degrees of freedom
|
|
27
|
+
- Progressive arming
|
|
28
|
+
- Before you run a check
|
|
29
|
+
- Anatomy of a project gate
|
|
30
|
+
- Writing the check itself
|
|
31
|
+
- Probing — plant, run, restore
|
|
32
|
+
- The false-positive budget
|
|
33
|
+
- Ratchets
|
|
34
|
+
- Where a gate runs
|
|
35
|
+
- Adding a check to an existing gate
|
|
36
|
+
- Rationalizations
|
|
37
|
+
|
|
22
38
|
## Axis A — the stage gate type
|
|
23
39
|
|
|
24
40
|
From [`../pipeline.schema.json`](../pipeline.schema.json), one per stage:
|
|
@@ -56,6 +72,53 @@ disprove. Left unwritten, it is indistinguishable from an omission.
|
|
|
56
72
|
|
|
57
73
|
---
|
|
58
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
|
+
|
|
59
122
|
## Before you run a check
|
|
60
123
|
|
|
61
124
|
Four preconditions. Skipping any of them turns a run into a claim.
|
|
@@ -12,6 +12,16 @@ coming back to the operator.
|
|
|
12
12
|
> half — glossary challenges, `CONTEXT.md`, ADR discipline — comes from there; the
|
|
13
13
|
> autonomy sweep and the brief are this pipeline's.
|
|
14
14
|
|
|
15
|
+
## Contents
|
|
16
|
+
|
|
17
|
+
- Phase 1 — harvest before you ask
|
|
18
|
+
- Phase 2 — the loop
|
|
19
|
+
- Domain awareness
|
|
20
|
+
- The autonomy sweep
|
|
21
|
+
- The design destination — one file, decided here, never invented later
|
|
22
|
+
- The REQ spine — the grill's other hard output
|
|
23
|
+
- Output
|
|
24
|
+
|
|
15
25
|
## Phase 1 — harvest before you ask
|
|
16
26
|
|
|
17
27
|
**Do not open the interview cold.** Stage 0 begins by finding what the project
|
|
@@ -4,6 +4,22 @@
|
|
|
4
4
|
have.** A hook is rung 5 of [`gates.md`](gates.md)'s ladder — the only mechanism
|
|
5
5
|
that acts *while the agent is working* rather than after the commit.
|
|
6
6
|
|
|
7
|
+
## Contents
|
|
8
|
+
|
|
9
|
+
- The limit, before the capability
|
|
10
|
+
- The events
|
|
11
|
+
- The `PreToolUse` contract
|
|
12
|
+
- What the hook receives
|
|
13
|
+
- Where it lives
|
|
14
|
+
- Matchers
|
|
15
|
+
- Performance
|
|
16
|
+
- What belongs in a hook, and what does not
|
|
17
|
+
- A worked example
|
|
18
|
+
- Debugging
|
|
19
|
+
- Removing them
|
|
20
|
+
- Leases are not reimplemented here
|
|
21
|
+
- Rationalizations
|
|
22
|
+
|
|
7
23
|
## The limit, before the capability
|
|
8
24
|
|
|
9
25
|
**Hooks exist only in Claude Code.** On Cursor, Codex and the other agents a skill
|
|
@@ -15,6 +15,14 @@ It is **recommended, never required**. No stage blocks on a missing graph; the
|
|
|
15
15
|
harvest simply runs on the sources it has
|
|
16
16
|
([`knowledge-sources.md`](knowledge-sources.md)).
|
|
17
17
|
|
|
18
|
+
## Contents
|
|
19
|
+
|
|
20
|
+
- Detect it, and install it once
|
|
21
|
+
- Stage 0 — query the graph before you ask the person
|
|
22
|
+
- Stage 9 — the close-out has three artifacts, not two
|
|
23
|
+
- The divergence check — the graph against the docs
|
|
24
|
+
- Rationalizations
|
|
25
|
+
|
|
18
26
|
## Detect it, and install it once
|
|
19
27
|
|
|
20
28
|
Detect, in this order:
|