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.
Files changed (36) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/CODE_OF_CONDUCT.md +38 -0
  3. package/CONTRIBUTING.md +215 -0
  4. package/README.md +29 -1
  5. package/SECURITY.md +67 -0
  6. package/SKILL-CARD.md +60 -0
  7. package/bin/task-pipeline.js +23 -0
  8. package/evals/RESULTS.md +47 -0
  9. package/evals/__pycache__/run.cpython-314.pyc +0 -0
  10. package/evals/run.py +130 -0
  11. package/evals/task-pipeline.evals.json +166 -0
  12. package/package.json +7 -2
  13. package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
  14. package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +1 -1
  15. package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +13 -0
  16. package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +6 -0
  17. package/plugins/task-pipeline/skills/task-pipeline/references/audit.md +11 -0
  18. package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +12 -0
  19. package/plugins/task-pipeline/skills/task-pipeline/references/build.md +12 -1
  20. package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +10 -1
  21. package/plugins/task-pipeline/skills/task-pipeline/references/decomposition.md +9 -0
  22. package/plugins/task-pipeline/skills/task-pipeline/references/documentation.md +15 -1
  23. package/plugins/task-pipeline/skills/task-pipeline/references/gates.md +63 -0
  24. package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +10 -0
  25. package/plugins/task-pipeline/skills/task-pipeline/references/hooks.md +16 -0
  26. package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-graph.md +8 -0
  27. package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +13 -0
  28. package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +8 -0
  29. package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +8 -0
  30. package/plugins/task-pipeline/skills/task-pipeline/references/planning.md +12 -0
  31. package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +12 -1
  32. package/plugins/task-pipeline/skills/task-pipeline/references/review.md +11 -1
  33. package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +10 -0
  34. package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +57 -2
  35. package/plugins/task-pipeline/skills/task-pipeline/references/tdd.md +10 -0
  36. 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.7.2",
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.7.2",
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: "Use when running a substantial task through the full end-to-end delivery pipeline an up-front intake grill that expands the request into a complete brief, then docs study, brainstorm, spec, plan, subagent-driven build, tests, lint/deploy, post-deploy log check, docs/wiki sync and acceptance — as gated stages whose doctrine is built entirely into this skill (no required companion skills). Triggers - 'run this through the pipeline' / 'прогони по конвейеру', 'the full cycle' / 'полный цикл', /task-pipeline, or any substantial feature, fix, or build that should follow the disciplined cycle rather than ad-hoc coding. The intake grill is mandatory - it front-loads every decision, including the per-stage autonomy sweep, so stages 1→10 run without mid-flight questions; recommends super-ux for user-facing work; confirms one model up front (most capable available, never a hardcoded id); reads host-project conventions for deploy/docs/wiki so it stays project-agnostic."
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) → *Final review*; on the run's model, escalation offered
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) → *progressive arming*).
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: