task-pipeline-skill 1.8.1 → 1.9.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 CHANGED
@@ -1,5 +1,104 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.9.1 — 2026-08-03
4
+
5
+ ### Added — the direction of the artifact map that was missing
6
+
7
+ `references/artifacts.md` mapped **stage → what it writes → who consumes it** and
8
+ nothing the other way. What an agent actually needs at runtime is **what each stage
9
+ reads, and from where** — and that direction had been absent since the file was
10
+ written. It is `references/learned.md` rule 2 (*compute the mapping in both
11
+ directions*) left unapplied to this file itself: the direction that feels redundant
12
+ is the one that finds things.
13
+
14
+ Two tables now sit above the old one:
15
+
16
+ - **Stage → input map** — per stage, the exact inputs and their origin. Stage 9's row
17
+ is the one worth reading twice: it takes **two different lists**, the stage-0 source
18
+ ledger (what the run *read*) and the doc map's propagation matrix (what the run
19
+ *owes*), and the gap between them is where documentation rots.
20
+ - **Project-saved rules, and where each one binds** — the eight files a host project
21
+ owns that change how a run behaves, each with where it is read and where it is
22
+ enforced: `CLAUDE.md`/`AGENTS.md`, `docs/DOCMAP.md`, the retro's standing
23
+ instructions, the brief's autonomy section, the carry-over ledger,
24
+ `docs/ux/scenarios.md`, `.claude/agent-sync.json`, and the operator's global config
25
+ that decides whether a task routes here at all. Plus the precedence rule: for *what
26
+ is*, code wins; for *what should be*, the register wins, and the gap is a finding
27
+ rather than a tie-break.
28
+
29
+ A guard holds all three maps present, with a negative self-test watched failing.
30
+
31
+ ## v1.9.0 — 2026-08-03
32
+
33
+ ### Added — the adoption track, and default-on inside a stated boundary
34
+
35
+ Built by running this skill through itself: brief, spec, plan, gated stages,
36
+ acceptance. The stage-0 harvest found two things that changed the shape of the work,
37
+ and one of them is why this release exists at all.
38
+
39
+ **`references/adoption.md` — the first run in a project.** The pipeline assumed a
40
+ documentation system either exists or gets seeded, and said almost nothing about the
41
+ repository you actually have. Greenfield is mechanical: stage 0 seeds the map, the
42
+ registers and the gate, and the gate is green on day one because unarmed sections
43
+ print `dormant`. Brownfield is a different problem and now has seven steps, of which
44
+ **step 3 decides whether adoption survives**: baseline the ratchets at today —
45
+ `PROP_FLOOR` to the next free id, `RESIDUE_FLOOR` to the measured count — so the gate
46
+ is green on the history it inherited and red only on what happens next. On the
47
+ project this practice comes from, the first run of that check reported **162 missing
48
+ propagations across 73 decisions**; that is a printed number, not a to-do list, and a
49
+ gate that is red on adoption day is switched off on day two.
50
+
51
+ It also states the rule that keeps a register honest: **history is not back-filled.**
52
+ An old decision enters the register the day somebody is about to contradict it —
53
+ when the reason is being discussed anyway and the person holding the context is in
54
+ the room. A reconstructed rationale is indistinguishable from a real one forever.
55
+
56
+ **Default-on routing, inside a boundary.** The description now widens to work that
57
+ **changes the repository** — feature, fix, refactor, migration, integration, rewrite,
58
+ adoption, hardening, with Russian verbs beside the English — and carries an explicit
59
+ `Not for:` clause for questions, explanations, typos and one-line edits, plus the
60
+ opt-out phrases *"без пайплайна"* / *"quick"*. Two evals follow it: a plain Russian
61
+ refactor that must trigger, and the same request with the opt-out that must not. A
62
+ guard ties the two together, because an escape hatch nobody tests is a trap rather
63
+ than a default.
64
+
65
+ **The lever that actually binds is not in this repository**, and the brief says so:
66
+ a `description` raises the odds a skill is selected and cannot make selection
67
+ mandatory. Default-on is enforced by an instruction in the operator's `CLAUDE.md`;
68
+ the description makes it reachable.
69
+
70
+ ### Fixed
71
+
72
+ - **The ratchet floors were documented as the same kind and are not.** `PROP_FLOOR`
73
+ is an **id threshold**, `RESIDUE_FLOOR` is a **count**; the comment called both
74
+ counts. Adoption turns on that distinction, so it is now spelled out where the
75
+ floors are declared.
76
+ - **The frontmatter guard wore the platform's number.** It capped the whole block at
77
+ 1024 — the limit Anthropic puts on `description` alone — silently making the
78
+ usable description ~975 and reading as if it were the real rule. The platform's
79
+ limit stays on `description`; ours becomes a stated budget of 1200.
80
+ - **agent-sync's binding to this skill** (patched in that repository): its
81
+ `pipeline.json` example claimed this schema permitted it while carrying a string
82
+ `id`, a `title` where the schema says `name`, and no `state` at all — required. Its
83
+ gate texts stated only agent-sync's half, so a host that copied them silently
84
+ dropped the stage's real gate. Stage 9 pointed at the artifact-layout reference
85
+ instead of that stage's doctrine. And `guardedFiles` did not cover `docs/DOCMAP.md`
86
+ or `docs/superpowers/retro.md`, both of which this pipeline now creates and both of
87
+ which lose data under a concurrent write. `companion-skills.md` states the
88
+ **≥ 1.3.0** floor `finish` needs.
89
+
90
+ ### Dogfooded
91
+
92
+ This repository ran its own brownfield walkthrough and wrote `docs/DOCMAP.md`. Step 1
93
+ — *inventory what is already there* — changed the plan: `npm test` already resolves
94
+ links, checks citations and computes counts over the same markdown, so **no second
95
+ gate was seeded**. The map records the gate that exists and why no other is created,
96
+ which is the walkthrough's step 2 read correctly: seed what is *missing*, and here
97
+ that was the map. The changed check went to the carry-over ledger for the operator's
98
+ agreement rather than being swapped silently.
99
+
100
+ Two new guards, each with a negative self-test watched failing.
101
+
3
102
  ## v1.8.1 — 2026-08-03
4
103
 
5
104
  ### Fixed — eight findings from a code-and-contradiction audit of 1.8.0
package/README.md CHANGED
@@ -490,6 +490,24 @@ now does:
490
490
  discover: author and reviewer are the same person, commits are unsigned, and the
491
491
  eval suite has not been executed.
492
492
 
493
+ ### Adopting it — a new project, and the one you actually have
494
+
495
+ Greenfield is mechanical: stage 0 seeds `docs/DOCMAP.md`, the registers and the gate
496
+ before the first interview question, and the gate is green on day one because
497
+ sections with nothing to check yet print `dormant`.
498
+
499
+ Brownfield is a different problem, and [`references/adoption.md`](plugins/task-pipeline/skills/task-pipeline/references/adoption.md)
500
+ gives it seven steps. The third one decides whether adoption survives: **baseline the
501
+ ratchets at today** — the propagation floor to the next free id, the residue floor to
502
+ the measured count — so the gate is green on the history it inherited and red only on
503
+ what happens next. On the project this practice comes from, that check's first run
504
+ reported 162 missing propagations across 73 decisions. That is a printed number, not
505
+ a to-do list; a gate that is red on adoption day is switched off on day two.
506
+
507
+ And history is **not** back-filled. An old decision enters the register the day
508
+ somebody is about to contradict it — when the reason is being discussed anyway and
509
+ the person who holds the context is in the room.
510
+
493
511
  ### The retrospective — the run teaches the next run, and the list stays short
494
512
 
495
513
  Every gate in this flow is good at *this* run and blind across runs. So the same
@@ -743,6 +761,7 @@ recommendation, so you arm the whole run in one exchange. Detail:
743
761
  | [`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 |
744
762
  | [`references/model-tiering.md`](plugins/task-pipeline/skills/task-pipeline/references/model-tiering.md) | model policy, the `/model` reminder, overrides |
745
763
  | [`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 |
764
+ | [`references/adoption.md`](plugins/task-pipeline/skills/task-pipeline/references/adoption.md) | the first run in a project: greenfield seeding, and the brownfield walkthrough |
746
765
  | [`SKILL-CARD.md`](SKILL-CARD.md) | the registry entry and risk-tier disclosure a reviewer needs before deploying it |
747
766
  | [`evals/`](evals/RESULTS.md) | the behavioural evaluation suite, its protocol, and what has actually been observed |
748
767
  | [`CHANGELOG.md`](CHANGELOG.md) | every release, with the reasoning behind it |
package/SKILL-CARD.md CHANGED
@@ -12,10 +12,10 @@ harmless.
12
12
  |---|---|
13
13
  | **Purpose** | Runs a substantial task through ten gated delivery stages — intake grill, docs study, brainstorm, spec, plan, subagent build, tests, lint/deploy, post-deploy, docs+registers, acceptance — refusing to advance until each gate passes |
14
14
  | **Owner** | ssheleg ([github.com/ssheleg/task-pipeline](https://github.com/ssheleg/task-pipeline)) |
15
- | **Version** | 1.8.1 |
15
+ | **Version** | 1.9.1 |
16
16
  | **Surface** | Claude Code (filesystem skill + plugin) and the vercel `skills` CLI. **Not** uploaded to the Skills API; custom Skills do not sync across surfaces |
17
17
  | **Dependencies** | None required. Optional: `context7` (MCP), `figma` (MCP), super-ux, agent-sync, graphify, obsidian-wiki. Every stage's doctrine ships in-repo; the one conditional requirement is super-ux for the stage-3 UX track on a user-facing task |
18
- | **Evaluation status** | Suite authored (13 evals, 5 categories). **Never executed** — see [`evals/RESULTS.md`](evals/RESULTS.md) |
18
+ | **Evaluation status** | Suite authored (15 evals, 5 categories). **Never executed** — see [`evals/RESULTS.md`](evals/RESULTS.md) |
19
19
 
20
20
  ## Risk-tier disclosure
21
21
 
@@ -34,11 +34,11 @@ apply.
34
34
 
35
35
  ## What to check before you trust it
36
36
 
37
- 1. Read `SKILL.md` and the 23 files under `references/` — that is the whole
37
+ 1. Read `SKILL.md` and the 24 files under `references/` — that is the whole
38
38
  instruction surface, and every one is linked directly from `SKILL.md`.
39
39
  2. Read `templates/docgate.sh` before seeding it; it is the only shipped script a
40
40
  host project will run on its own repository.
41
- 3. Run `npm run test:all` — 53 guards, each with a negative self-test that plants a
41
+ 3. Run `npm run test:all` — 56 guards, each with a negative self-test that plants a
42
42
  defect and requires rejection.
43
43
  4. Run `python3 evals/run.py` for the behavioural protocol, and read
44
44
  `evals/RESULTS.md` for what has actually been observed.
@@ -54,7 +54,7 @@ apply.
54
54
  - **Versions are pinned by git tag** and mirrored into `sshlg-skills`'s catalogue.
55
55
  Rollback is `git checkout v<previous>` or pinning the previous plugin version;
56
56
  the previous version is never deleted.
57
- - **Behavioural evidence is missing, not merely thin.** 53 structural guards prove
57
+ - **Behavioural evidence is missing, not merely thin.** 56 structural guards prove
58
58
  the skill is well-formed. Until `evals/RESULTS.md` carries a dated run, nothing in
59
59
  this repository proves it *behaves* — triggers correctly, stays quiet on a
60
60
  question, or performs the steps it documents.
package/evals/RESULTS.md CHANGED
@@ -31,17 +31,38 @@ or it belongs in a check.
31
31
 
32
32
  | Metric | Value | As of |
33
33
  |---|---|---|
34
- | Evals authored | 13 | 2026-08-03 |
34
+ | Evals authored | 15 | 2026-08-03 |
35
35
  | Categories covered | 5 of 5 | 2026-08-03 |
36
36
  | Models exercised | **0 of 3** | 2026-08-03 |
37
37
  | Dated runs recorded | **0** | 2026-08-03 |
38
38
 
39
39
  The bottom two numbers are the honest state of this skill's behavioural evidence.
40
- Everything else in this repository is proven by 53 structural guards that check the
40
+ Everything else in this repository is proven by 56 structural guards that check the
41
41
  *form*; these are the only checks that would speak to the *behaviour*, and they have
42
- not been run yet. Printed here so "53 of 53 green" is never read as "the skill is
42
+ not been run yet. Printed here so "56 of 56 green" is never read as "the skill is
43
43
  known to work".
44
44
 
45
45
  ## Runs
46
46
 
47
- _(none yet)_
47
+ ## 2026-08-03 · opus · self-observed, not a blind run
48
+
49
+ **Scope of this evidence.** The author ran the skill on a real task
50
+ (`default-routing-adoption`) and watched it follow its own doctrine. That is a
51
+ legitimate observation of instruction-following and **not** an independent
52
+ evaluation: the operator knew the expected behaviour and the same person wrote both
53
+ sides. It closes none of the trigger-accuracy or coexistence rows, which need fresh
54
+ sessions and a reader who is not the author.
55
+
56
+ | id | verdict | what happened |
57
+ |---|---|---|
58
+ | INSTR-01 | pass | harvest ran before the first question; source ledger written into the brief; doc inventory answered (`DOCMAP.md` absent → seeded this run); intent reconciled against as-built (clean, in sync) |
59
+ | INSTR-04 | partial | the ladder walk and the evidence rule ran at stage 10, but a stage-10 self-audit by the author is the weakest form of the check |
60
+ | others | not run | require fresh sessions per model |
61
+
62
+ **One divergence worth recording:** at stage 5 the work contradicted the spec —
63
+ inventory showed this repository already had a gate over the same corpus, so seeding
64
+ a second one would have violated the SSOT rule the doc map publishes. The finding
65
+ went back to stage 3, the spec was revised, and the changed check was raised in the
66
+ carry-over ledger for the operator rather than swapped silently. The loop behaved as
67
+ designed.
68
+
@@ -1,12 +1,18 @@
1
1
  {
2
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
3
  "skill": "task-pipeline",
4
- "models": ["haiku", "sonnet", "opus"],
4
+ "models": [
5
+ "haiku",
6
+ "sonnet",
7
+ "opus"
8
+ ],
5
9
  "evals": [
6
10
  {
7
11
  "id": "TRIG-01",
8
12
  "category": "should_trigger",
9
- "skills": ["task-pipeline"],
13
+ "skills": [
14
+ "task-pipeline"
15
+ ],
10
16
  "query": "run this through the pipeline: add per-tenant rate limiting to the public API",
11
17
  "expected_behavior": [
12
18
  "Invokes the task-pipeline skill rather than starting to design or code inline",
@@ -19,7 +25,9 @@
19
25
  {
20
26
  "id": "TRIG-02",
21
27
  "category": "should_trigger",
22
- "skills": ["task-pipeline"],
28
+ "skills": [
29
+ "task-pipeline"
30
+ ],
23
31
  "query": "полный цикл: перенести биллинг на нового провайдера",
24
32
  "expected_behavior": [
25
33
  "Invokes the task-pipeline skill from the Russian trigger alias",
@@ -31,7 +39,9 @@
31
39
  {
32
40
  "id": "TRIG-03",
33
41
  "category": "should_trigger",
34
- "skills": ["task-pipeline"],
42
+ "skills": [
43
+ "task-pipeline"
44
+ ],
35
45
  "query": "build a support-agent dashboard with saved views and CSV export",
36
46
  "expected_behavior": [
37
47
  "Invokes the skill without an explicit pipeline phrase, because the request is a substantial build",
@@ -43,7 +53,9 @@
43
53
  {
44
54
  "id": "NOTRIG-01",
45
55
  "category": "should_not_trigger",
46
- "skills": ["task-pipeline"],
56
+ "skills": [
57
+ "task-pipeline"
58
+ ],
47
59
  "query": "what does this regex do: ^(?!.*--)[a-z0-9-]{1,63}$",
48
60
  "expected_behavior": [
49
61
  "Answers the question directly",
@@ -55,7 +67,9 @@
55
67
  {
56
68
  "id": "NOTRIG-02",
57
69
  "category": "should_not_trigger",
58
- "skills": ["task-pipeline"],
70
+ "skills": [
71
+ "task-pipeline"
72
+ ],
59
73
  "query": "fix the typo in the README heading: 'Instalation' -> 'Installation'",
60
74
  "expected_behavior": [
61
75
  "Makes the edit directly",
@@ -67,7 +81,9 @@
67
81
  {
68
82
  "id": "NOTRIG-03",
69
83
  "category": "should_not_trigger",
70
- "skills": ["task-pipeline"],
84
+ "skills": [
85
+ "task-pipeline"
86
+ ],
71
87
  "query": "explain how our auth middleware decides which routes are public",
72
88
  "expected_behavior": [
73
89
  "Reads the code and explains it",
@@ -78,7 +94,9 @@
78
94
  {
79
95
  "id": "AMB-01",
80
96
  "category": "ambiguous",
81
- "skills": ["task-pipeline"],
97
+ "skills": [
98
+ "task-pipeline"
99
+ ],
82
100
  "query": "clean up the error handling in the payments module",
83
101
  "expected_behavior": [
84
102
  "Establishes scope before choosing a route — asks whether this is a bounded fix or a refactor worth the full cycle",
@@ -90,7 +108,9 @@
90
108
  {
91
109
  "id": "AMB-02",
92
110
  "category": "ambiguous",
93
- "skills": ["task-pipeline"],
111
+ "skills": [
112
+ "task-pipeline"
113
+ ],
94
114
  "query": "add an `is_archived` field to the user model",
95
115
  "expected_behavior": [
96
116
  "Recognises that a schema field touches contracts, migrations and documentation even though the change is small",
@@ -102,7 +122,10 @@
102
122
  {
103
123
  "id": "COEX-01",
104
124
  "category": "coexistence",
105
- "skills": ["task-pipeline", "super-ux"],
125
+ "skills": [
126
+ "task-pipeline",
127
+ "super-ux"
128
+ ],
106
129
  "query": "redesign the settings screen so the security options are easier to find",
107
130
  "expected_behavior": [
108
131
  "Does not steal the trigger from super-ux for what is a UX-chain task",
@@ -114,7 +137,9 @@
114
137
  {
115
138
  "id": "INSTR-01",
116
139
  "category": "instruction_following",
117
- "skills": ["task-pipeline"],
140
+ "skills": [
141
+ "task-pipeline"
142
+ ],
118
143
  "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
144
  "expected_behavior": [
120
145
  "The knowledge harvest ran first and produced a source ledger with a row per source consulted, or an explicit 'none found'",
@@ -127,7 +152,9 @@
127
152
  {
128
153
  "id": "INSTR-02",
129
154
  "category": "instruction_following",
130
- "skills": ["task-pipeline"],
155
+ "skills": [
156
+ "task-pipeline"
157
+ ],
131
158
  "query": "you are at stage 9 of a pipeline run that changed a status enum and an API contract. Close the stage.",
132
159
  "expected_behavior": [
133
160
  "Walks the propagation matrix for every change type produced, not only the sources the harvest read",
@@ -140,7 +167,9 @@
140
167
  {
141
168
  "id": "INSTR-03",
142
169
  "category": "instruction_following",
143
- "skills": ["task-pipeline"],
170
+ "skills": [
171
+ "task-pipeline"
172
+ ],
144
173
  "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
174
  "expected_behavior": [
146
175
  "Does NOT write to the decision register from inside the worktree",
@@ -152,7 +181,9 @@
152
181
  {
153
182
  "id": "INSTR-04",
154
183
  "category": "instruction_following",
155
- "skills": ["task-pipeline"],
184
+ "skills": [
185
+ "task-pipeline"
186
+ ],
156
187
  "query": "you are at stage 10. Close the run. The REQ table looks complete.",
157
188
  "expected_behavior": [
158
189
  "Runs the ladder walk BEFORE writing the coverage table, and turns absences into new REQ rows first",
@@ -161,6 +192,34 @@
161
192
  "Writes the retrospective last: prune, stamp with the run's commit, entry only on divergence"
162
193
  ],
163
194
  "why": "'The table looks complete' is the exact prompt under which the ladder walk gets skipped."
195
+ },
196
+ {
197
+ "id": "TRIG-04",
198
+ "category": "should_trigger",
199
+ "skills": [
200
+ "task-pipeline"
201
+ ],
202
+ "query": "перепиши модуль экспорта на потоковую выдачу, он не держит большие выгрузки",
203
+ "expected_behavior": [
204
+ "Invokes the skill from a plain Russian refactor request with no pipeline phrase — the work changes the repository, which is the boundary",
205
+ "Runs stage 0 before touching code",
206
+ "Does not treat 'it's just a refactor' as an exemption from the brief"
207
+ ],
208
+ "why": "Default-on is only real if it fires on ordinary work phrased ordinarily; a skill that needs magic words helps only people who already know it exists."
209
+ },
210
+ {
211
+ "id": "NOTRIG-04",
212
+ "category": "should_not_trigger",
213
+ "skills": [
214
+ "task-pipeline"
215
+ ],
216
+ "query": "перепиши модуль экспорта на потоковую выдачу, без пайплайна",
217
+ "expected_behavior": [
218
+ "Does NOT invoke the skill, despite the task being repo-changing and otherwise qualifying",
219
+ "Says out loud that the cycle was skipped because the operator opted out",
220
+ "Does the work directly"
221
+ ],
222
+ "why": "The opt-out phrase is the release valve that makes default-on acceptable. If it does not work, the boundary is a trap rather than a default."
164
223
  }
165
224
  ]
166
225
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeline-skill",
3
- "version": "1.8.1",
3
+ "version": "1.9.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"
@@ -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.8.1",
5
+ "version": "1.9.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: "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."
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 work changes the repository — a feature, fix, refactor, migration, integration, rewrite, adoption or hardening; фича, фикс, рефактор, миграция, интеграция, доработать, починить, внедрить or on 'run this through the pipeline' / 'прогони по конвейеру', 'the full cycle' / 'полный цикл', /task-pipeline. Not for: answering a question, explaining or reading code, a typo or a one-line edit — say 'без пайплайна' / 'quick' to opt out. 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, never a hardcoded id."
4
4
  license: MIT
5
5
  ---
6
6
 
@@ -61,6 +61,7 @@ gate stops until it is installed.
61
61
  | 10 Acceptance (REQ close-out) | [`references/acceptance.md`](references/acceptance.md) |
62
62
  | 10 Retrospective (the run's last act) | [`references/retrospective.md`](references/retrospective.md) |
63
63
  | 10 + any audit (what's *missing*) | [`references/audit.md`](references/audit.md) |
64
+ | **first run in a project** (new or existing) | [`references/adoption.md`](references/adoption.md) |
64
65
  | any repeating loop | [`references/loop-guard.md`](references/loop-guard.md) |
65
66
 
66
67
  **Optional bridge.** If the operator already runs an equivalent skill set (e.g.
@@ -331,6 +332,8 @@ automation is on — `pipeline.schema.json` is the only contract.
331
332
  - `references/tdd.md` — stages 5–6: the iron law, red/green/refactor, the suite gate
332
333
  - `references/stages.md` — per-stage detail + exact gate criteria + gate types
333
334
  - `references/model-tiering.md` — model map, ids, the `/model` reminder mechanic, override
335
+ - `references/adoption.md` — the first run in a project: greenfield seeding, and the
336
+ brownfield walkthrough whose third step baselines the ratchets at today
334
337
  - `references/conventions.md` — how stages 6–10 read the host project's CLAUDE.md
335
338
  - `references/companion-skills.md` — companion skills, install lines, preflight recommendation
336
339
  - `references/artifacts.md` — the canonical document/artifact layout per stage
@@ -0,0 +1,210 @@
1
+ # Adoption — bringing a project onto the pipeline
2
+
3
+ **One job: get a repository to the state where stage 0 has something true to read.**
4
+ The pipeline assumes a documentation system exists or gets seeded
5
+ ([`documentation.md`](documentation.md)). This file is what to do on the first run in
6
+ a project — and the two entry conditions are not the same problem.
7
+
8
+ ## Contents
9
+
10
+ - Two entry conditions
11
+ - A new project — the seed is the whole of it
12
+ - An existing project — the register starts today
13
+ - Why history is not back-filled
14
+ - What good looks like the day after
15
+ - Rationalizations
16
+
17
+ ## Two entry conditions
18
+
19
+ | | Greenfield | Brownfield |
20
+ |---|---|---|
21
+ | What exists | nothing, or a README | code, history, opinions, and docs that are partly true |
22
+ | The hard part | none — seeding is mechanical | **the decisions already exist and none of them are written down** |
23
+ | Failure if done wrong | a register nobody starts using | a gate that is red on day one, switched off on day two |
24
+ | First run's deliverable | the feature, with the system seeded on the way | **the system itself** — adoption is its own run |
25
+
26
+ **On a brownfield project, adoption is a run, not a preamble.** Give it a brief, a
27
+ REQ table and an acceptance, exactly like a feature. A doc system introduced as a
28
+ side effect of somebody else's task is a doc system with no owner.
29
+
30
+ ## A new project — the seed is the whole of it
31
+
32
+ Stage 0 phase 1b already does it before the first interview question. Nothing to
33
+ prepare:
34
+
35
+ ```
36
+ docs/DOCMAP.md the map: registers, single homes, propagation matrix, gates, ratchets
37
+ docs/DECISIONS.md the register — DEC-####, append-only
38
+ docs/OPEN_QUESTIONS.md OQ-####, closed status vocabulary
39
+ scripts/check-docs.sh the gate, ten sections
40
+ ```
41
+
42
+ Three things are true on day one and worth knowing:
43
+
44
+ - **The gate is green immediately.** Sections whose input does not exist yet print
45
+ `dormant`, which is visible and passing ([`gates.md`](gates.md) → *Progressive
46
+ arming*). The skill proves this mechanically: its own validator seeds a scratch
47
+ project from these templates and requires exit `0`.
48
+ - **Both floors are `0`,** because there is no history to forgive.
49
+ - **The register's first entry is the decision to document this way.** A register
50
+ that starts with a real entry is a register somebody has already used once.
51
+
52
+ Then run the task. There is no separate adoption step.
53
+
54
+ ## An existing project — the register starts today
55
+
56
+ Seven steps. Step 3 is the one that decides whether adoption survives contact with
57
+ the repository.
58
+
59
+ ### Step 1 · Inventory — what is already here
60
+
61
+ Answer the four questions of [`documentation.md`](documentation.md) against reality,
62
+ not against the templates:
63
+
64
+ ```bash
65
+ ls docs/DECISIONS.md docs/adr/ docs/OPEN_QUESTIONS.md docs/DOCMAP.md 2>/dev/null
66
+ ls scripts/check-docs.sh .github/workflows/ 2>/dev/null
67
+ grep -rl "ADR\|decision record\|DEC-" docs/ README.md CONTRIBUTING.md 2>/dev/null | head
68
+ ```
69
+
70
+ **One decision home, and you are looking for the one that already exists.** A
71
+ populated `docs/adr/` *is* the register — record it in the doc map and use it. Never
72
+ seed a second one beside it; that is the fork the SSOT rule exists to prevent.
73
+
74
+ A project whose decisions live in a CHANGELOG with reasons, or in commit messages
75
+ nobody will migrate, has a decision home too. Write down which it is. The choice
76
+ being *unrecorded* is the defect, not the choice.
77
+
78
+ ### Step 2 · Seed what is missing
79
+
80
+ Usually the map and the gate; often the register already exists in some shape.
81
+
82
+ ```bash
83
+ cp <skill>/templates/docmap.md docs/DOCMAP.md # only if absent
84
+ cp <skill>/templates/docgate.sh scripts/check-docs.sh # only if absent
85
+ chmod +x scripts/check-docs.sh
86
+ ```
87
+
88
+ **Seeding never overwrites.** An existing brief, register or map is the project's
89
+ memory; the template is a skeleton.
90
+
91
+ ### Step 3 · Baseline the ratchets — the step that decides adoption
92
+
93
+ Run the gate **before** deciding anything, and read what it actually says:
94
+
95
+ ```bash
96
+ bash scripts/check-docs.sh; echo "exit=$?"
97
+ ```
98
+
99
+ On a repository with history this is red, often loudly — the practice this skill
100
+ comes from measured **162 missing propagations across 73 decisions** on its first
101
+ run. That number is not a to-do list. Fixing it blind would add 162 citations nobody
102
+ verified, and failing on it every day makes the gate something people switch off,
103
+ which costs more than the rows it would have caught.
104
+
105
+ So set the floors to **today**, and only ever lower them:
106
+
107
+ ```bash
108
+ # PROP_FLOOR is an ID THRESHOLD: entries numbered >= it must have propagated.
109
+ # Set it to the next free id — from now on the rule binds, and the history
110
+ # becomes one printed number.
111
+ PROP_FLOOR=$(grep -o 'Next free ID:\**\s*`\?DEC-[0-9]*' docs/DECISIONS.md \
112
+ | grep -o '[0-9]*$' | sed 's/^0*//')
113
+
114
+ # RESIDUE_FLOOR is a COUNT: unmarked citations of retired decisions, as measured
115
+ # right now.
116
+ RESIDUE_FLOOR=$(bash scripts/check-docs.sh 2>&1 \
117
+ | grep -o 'residue [0-9]*' | grep -o '[0-9]*' | head -1)
118
+ ```
119
+
120
+ Write both into the top of `scripts/check-docs.sh` and into `docs/DOCMAP.md` →
121
+ *Ratchets*, with the date. Re-run; the gate is now **green on today's state** and
122
+ red only on what happens next.
123
+
124
+ **Why this is not cheating.** A ratchet is a named, counted set that may only shrink,
125
+ printed beside every verdict ([`audit.md`](audit.md) → *What can't be fixed now
126
+ becomes a ratchet, never a TODO*). The backlog stays visible on every single run —
127
+ it just stops blocking work it was never going to fix today. A gate that starts red
128
+ teaches everyone on day one that it is noise
129
+ (`references/learned.md` rules 9 and 10).
130
+
131
+ ### Step 4 · Build the propagation matrix
132
+
133
+ Not from the template — from what this project actually has. The five steps are in
134
+ [`documentation.md`](documentation.md) → *The propagation matrix*. Start with three
135
+ rows you can name today; a matrix with three true rows beats one with twenty
136
+ imported ones.
137
+
138
+ The third column is not optional: name the check that would notice, or write
139
+ `review` **with the one-line reason no check can decide it**.
140
+
141
+ ### Step 5 · Record the adoption itself
142
+
143
+ The first entry in the register is the decision to adopt — regime, decision home,
144
+ where the map lives, what the floors were set to and on what date. It costs two
145
+ minutes and it is the cheapest possible demonstration that the register works, to
146
+ the next person who wonders whether anyone actually uses it.
147
+
148
+ ### Step 6 · Arm the gate
149
+
150
+ Local first, then the one that binds people who never run it locally:
151
+
152
+ ```bash
153
+ echo 'bash scripts/check-docs.sh' >> .git/hooks/pre-commit # local, skippable
154
+ # CI: add the same line to the workflow that already runs the tests
155
+ ```
156
+
157
+ Optionally at agent time, which is the only rung that can stop a bad edit *before*
158
+ it lands — `templates/hooks.example.json`, and read
159
+ [`hooks.md`](hooks.md) first for the fail-open hazard.
160
+
161
+ ### Step 7 · Several agents — add the leases
162
+
163
+ Only when more than one agent works the repository. Then the registers become shared
164
+ state ([`documentation.md`](documentation.md) → *Registers are shared state*) and a
165
+ coordination tool arbitrates: `guardedFiles` must list every register **plus
166
+ `docs/DOCMAP.md` and `docs/superpowers/retro.md`**, which are equally shared and
167
+ equally lossy under a concurrent write.
168
+
169
+ Without such a tool the run is **`ungated`** and must say so. The discipline still
170
+ applies; only the arbitration is missing.
171
+
172
+ ## Why history is not back-filled
173
+
174
+ The decisions already exist — in the git log, in the code, in somebody's memory. The
175
+ temptation is to reconstruct them into the register so it looks complete.
176
+
177
+ Don't. A reconstructed decision carries a *guess* about why it was made, in a
178
+ register whose whole value is that entries are true. One invented rationale is worse
179
+ than a hundred absent ones, because absent ones are visibly absent and an invented
180
+ one is indistinguishable from a real one forever.
181
+
182
+ **The rule: an old decision enters the register the day somebody is about to
183
+ contradict it.** At that moment the reason is being discussed anyway, the person
184
+ holding the context is in the room, and the entry writes itself honestly — with the
185
+ new decision beside it.
186
+
187
+ ## What good looks like the day after
188
+
189
+ - `bash scripts/check-docs.sh` exits `0`, prints its ratchet counts, and says which
190
+ sections were `dormant` or `skipped`.
191
+ - `docs/DOCMAP.md` answers the four questions, and its propagation matrix has no
192
+ empty *Checked by* cell.
193
+ - The register has at least one entry: the adoption.
194
+ - The gate runs in CI, not only on the adopter's laptop.
195
+ - The next task runs through the pipeline normally, and stage 9 has a matrix to walk
196
+ instead of a sentence to interpret.
197
+
198
+ Anything not true yet is a carry-over row with a home, not a promise.
199
+
200
+ ## Rationalizations
201
+
202
+ | Excuse | Reality |
203
+ |---|---|
204
+ | "We'll adopt it properly when things calm down" | The backlog only grows, and the floors you would set today are the smallest numbers you will ever get to set. |
205
+ | "The gate is red, this clearly doesn't fit our repo" | The gate is red because it is measuring history nobody promised to fix. That is what step 3 is for, and it takes one command. |
206
+ | "Let's back-fill the last two years of decisions first" | Then the register's first hundred entries are guesses, and nobody can tell them from the real ones. Start today; back-fill exactly one entry at the moment it is contradicted. |
207
+ | "We already have ADRs, so we need to migrate to DECISIONS.md" | You do not. An existing ADR set *is* the register. Migrating is its own decision with its own entry — never a side effect of adopting. |
208
+ | "We'll set the floors to zero, it's more honest" | It is more honest for about a day, after which the gate is disabled and you have neither the floor nor the check. A printed backlog is the honest thing that survives. |
209
+ | "The matrix needs to be complete before it's useful" | Three true rows catch three real classes. Twenty imported rows catch nothing and teach everyone that the matrix is decoration. |
210
+ | "One agent works here, so leases are overkill" | Correct — skip step 7 and say so. Adopting coordination nobody needs is how a project learns to route around the parts it does need. |
@@ -8,6 +8,7 @@ shape.
8
8
  ## Contents
9
9
 
10
10
  - In the host project
11
+ - Stage → input map — where each stage's information comes from
11
12
  - Stage → artifact map
12
13
  - This repo (task-pipeline itself), for reference
13
14
 
@@ -65,6 +66,52 @@ Stage 5 also creates a **git-ignored** scratch workspace per plan at
65
66
  review packages. It is deleted when the final review is clean; git history is the
66
67
  record (see `build.md`).
67
68
 
69
+ ## Stage → input map — where each stage's information comes from
70
+
71
+ The map below this one answers *what a stage writes*. This one answers *what it
72
+ reads, and from where* — the direction that was missing, which is
73
+ [`learned.md`](learned.md) rule 2 (*compute the mapping in both directions*) applied
74
+ to this file itself. A stage whose inputs are unnamed is a stage that will read
75
+ whatever the context happens to hold.
76
+
77
+ | Stage | Reads | From where |
78
+ |---|---|---|
79
+ | **0 Harvest** | the project's own knowledge about this task | code · the code graph (`graphify-out/`) · `CLAUDE.md`/`AGENTS.md` · `CONTEXT.md`/`docs/adr/` · `docs/` + `docs/ux/` · past briefs and carry-over ledgers · the retro's standing instructions **in full** · the wiki · any doc repo or hosted system the project names |
80
+ | **0 Inventory (1b)** | the documentation regime | `docs/DOCMAP.md` — registers, single homes, propagation matrix, gate commands, ratchet floors. Absent ⇒ seeded ([`adoption.md`](adoption.md)) |
81
+ | **0 Reconcile (1c)** | intent vs as-built | git (how it *should* be) against the run record (how it *turned out*) |
82
+ | **0 Grill** | the operator | the interview — every answer checked against the harvest, which is what makes it checkable rather than confident |
83
+ | **1 Docs study** | external library/API contracts | `context7:resolve-library-id` → `context7:query-docs`; web search where it cannot resolve. **Never from recall** |
84
+ | **2 Brainstorm** | what is already settled | the brief (scope, constraints, done-criteria) + the codebase. Re-asking what the grill answered is this stage's most common waste |
85
+ | **3 Spec** | the approved design + the UX chain | stage-2 design · `docs/ux/{foundation,flows,screens,scenarios}.md` (UI only) · the Figma canonical record in `docs/ux/foundation.md` → *Design tooling* · `DOCMAP.md` for where a settled contract is recorded |
86
+ | **4 Plan** | the spec and the frozen list | the spec's locked contracts and **Global Constraints** · the brief's REQ ids (the gate is a set comparison against them) |
87
+ | **5 Dev** | one task at a time | the plan task · the spec's Global Constraints, copied verbatim · host test/lint commands · the brief's branch policy. **A subagent reads only its own file-based brief** — that is the whole of its context |
88
+ | **6 Tests** | the host's runner | `CLAUDE.md`/`AGENTS.md` → *Lint + test*, else detection ([`conventions.md`](conventions.md)) |
89
+ | **7 Lint + deploy** | the host's lint and deploy path, and the authorization | host conventions · the brief's autonomy sweep, where a standing go must name target **and** preconditions |
90
+ | **8 Post-deploy** | where health lives | the brief's autonomy sweep (app name, endpoint, workflow) |
91
+ | **9 Docs + registers** | two different lists | the stage-0 **source ledger** (what this run *read*) **and** `DOCMAP.md`'s **propagation matrix** (what this run *owes*). They are not the same list, and the gap between them is where documentation rots |
92
+ | **10 Acceptance** | everything the run produced | the brief's REQ table · the carry-over ledger **in full** · plan task statuses · `git log` · the final suite output · stage-8 notes · stage-9 changes · `docs/ux/scenarios.md` + `/ux-lint` for UI |
93
+
94
+ ### Project-saved rules, and where each one binds
95
+
96
+ These are the files a **host project** owns that change how a run behaves. An agent
97
+ that has not read them is running the pipeline's defaults, not this project's.
98
+
99
+ | Rule file | What it binds | Read at | Enforced at |
100
+ |---|---|---|---|
101
+ | `CLAUDE.md` / `AGENTS.md` | commands, deploy path, house rules, which docs exist and where | 0 | 6–10 |
102
+ | `docs/DOCMAP.md` | the decision home, each fact's single home, the propagation matrix, the gate and its ratchet floors | 0 (1b) | 9 |
103
+ | `docs/superpowers/retro.md` | standing instructions — the rules no check can decide. Capped at ten, **read in full**, stamped the moment one fires | 0 | pruned at 10 |
104
+ | `specs/<topic>-brief.md` → *Autonomy* | every pre-resolved decision; stages 1→10 **answer from it instead of asking** | 0 | 1–10 |
105
+ | `specs/<topic>-carryover.md` | everything deferred, parked or half-done; appended the moment it is said | all | read in full at 10 |
106
+ | `docs/ux/scenarios.md` | the source of truth for user-facing behaviour (super-ux) | 3 | 3, 7, 9, 10 |
107
+ | `.claude/agent-sync.json` | which registers are guarded, and by whose lease | 0 | every guarded write |
108
+ | the operator's global `CLAUDE.md` | whether a task routes here at all, and the opt-out phrase | before stage 0 | — |
109
+
110
+ **Precedence when two of them disagree.** For *what is*: code, then host docs and
111
+ ADRs, then the wiki, then memory. For *what should be*: the register outranks the
112
+ code, because a decision not yet built is still the decision — and the gap between
113
+ them is a finding, not a tie-break ([`knowledge-sources.md`](knowledge-sources.md)).
114
+
68
115
  ## Stage → artifact map
69
116
 
70
117
  | Stage | Writes | Consumed by |
@@ -47,7 +47,7 @@ better, plus one that is required only for user-facing work.
47
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) |
48
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` |
49
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 .` |
50
- | **[agent-sync](https://github.com/ssheleg/agent-sync)** (`/agent-sync`) | **guarded registers** — a lease before writing one, `reserve` before minting an id, `reconcile`/`record` for intent vs as-built, and `finish` for the stage-10 multi-repository close-out ([`documentation.md`](documentation.md)) | **Recommended** — never a gate. Absent → the run is **`ungated`** and must say so out loud; the discipline still applies, only the arbitration is missing | `npx sshlg-skills install` |
50
+ | **[agent-sync](https://github.com/ssheleg/agent-sync)** (`/agent-sync`, **≥ 1.3.0** — `finish` did not exist before it, so an older install turns the stage-10 close-out into a command that is not there) | **guarded registers** — a lease before writing one, `reserve` before minting an id, `reconcile`/`record` for intent vs as-built, and `finish` for the stage-10 multi-repository close-out ([`documentation.md`](documentation.md)) | **Recommended** — never a gate. Absent → the run is **`ungated`** and must say so out loud; the discipline still applies, only the arbitration is missing | `npx sshlg-skills install` |
51
51
  | ~~superpowers~~ | — | **Not a dependency.** Stages 2/4/5/6 run on the built-in doctrine above. See *Optional bridge* | — |
52
52
  | ~~grill-me / grilling~~ | — | **Not a dependency.** The stage-0 grill is built in (`references/grill.md`) | — |
53
53
 
@@ -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
- PROP_FLOOR=${PROP_FLOOR:-0} # allowed missing propagation citations
41
- RESIDUE_FLOOR=${RESIDUE_FLOOR:-0} # allowed unmarked citations of retired ids
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