task-pipeline-skill 1.8.1 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +71 -0
- package/README.md +19 -0
- package/SKILL-CARD.md +5 -5
- package/evals/RESULTS.md +25 -4
- package/evals/task-pipeline.evals.json +73 -14
- package/package.json +1 -1
- package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +4 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/adoption.md +210 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/templates/docgate.sh +13 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,76 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v1.9.0 — 2026-08-03
|
|
4
|
+
|
|
5
|
+
### Added — the adoption track, and default-on inside a stated boundary
|
|
6
|
+
|
|
7
|
+
Built by running this skill through itself: brief, spec, plan, gated stages,
|
|
8
|
+
acceptance. The stage-0 harvest found two things that changed the shape of the work,
|
|
9
|
+
and one of them is why this release exists at all.
|
|
10
|
+
|
|
11
|
+
**`references/adoption.md` — the first run in a project.** The pipeline assumed a
|
|
12
|
+
documentation system either exists or gets seeded, and said almost nothing about the
|
|
13
|
+
repository you actually have. Greenfield is mechanical: stage 0 seeds the map, the
|
|
14
|
+
registers and the gate, and the gate is green on day one because unarmed sections
|
|
15
|
+
print `dormant`. Brownfield is a different problem and now has seven steps, of which
|
|
16
|
+
**step 3 decides whether adoption survives**: baseline the ratchets at today —
|
|
17
|
+
`PROP_FLOOR` to the next free id, `RESIDUE_FLOOR` to the measured count — so the gate
|
|
18
|
+
is green on the history it inherited and red only on what happens next. On the
|
|
19
|
+
project this practice comes from, the first run of that check reported **162 missing
|
|
20
|
+
propagations across 73 decisions**; that is a printed number, not a to-do list, and a
|
|
21
|
+
gate that is red on adoption day is switched off on day two.
|
|
22
|
+
|
|
23
|
+
It also states the rule that keeps a register honest: **history is not back-filled.**
|
|
24
|
+
An old decision enters the register the day somebody is about to contradict it —
|
|
25
|
+
when the reason is being discussed anyway and the person holding the context is in
|
|
26
|
+
the room. A reconstructed rationale is indistinguishable from a real one forever.
|
|
27
|
+
|
|
28
|
+
**Default-on routing, inside a boundary.** The description now widens to work that
|
|
29
|
+
**changes the repository** — feature, fix, refactor, migration, integration, rewrite,
|
|
30
|
+
adoption, hardening, with Russian verbs beside the English — and carries an explicit
|
|
31
|
+
`Not for:` clause for questions, explanations, typos and one-line edits, plus the
|
|
32
|
+
opt-out phrases *"без пайплайна"* / *"quick"*. Two evals follow it: a plain Russian
|
|
33
|
+
refactor that must trigger, and the same request with the opt-out that must not. A
|
|
34
|
+
guard ties the two together, because an escape hatch nobody tests is a trap rather
|
|
35
|
+
than a default.
|
|
36
|
+
|
|
37
|
+
**The lever that actually binds is not in this repository**, and the brief says so:
|
|
38
|
+
a `description` raises the odds a skill is selected and cannot make selection
|
|
39
|
+
mandatory. Default-on is enforced by an instruction in the operator's `CLAUDE.md`;
|
|
40
|
+
the description makes it reachable.
|
|
41
|
+
|
|
42
|
+
### Fixed
|
|
43
|
+
|
|
44
|
+
- **The ratchet floors were documented as the same kind and are not.** `PROP_FLOOR`
|
|
45
|
+
is an **id threshold**, `RESIDUE_FLOOR` is a **count**; the comment called both
|
|
46
|
+
counts. Adoption turns on that distinction, so it is now spelled out where the
|
|
47
|
+
floors are declared.
|
|
48
|
+
- **The frontmatter guard wore the platform's number.** It capped the whole block at
|
|
49
|
+
1024 — the limit Anthropic puts on `description` alone — silently making the
|
|
50
|
+
usable description ~975 and reading as if it were the real rule. The platform's
|
|
51
|
+
limit stays on `description`; ours becomes a stated budget of 1200.
|
|
52
|
+
- **agent-sync's binding to this skill** (patched in that repository): its
|
|
53
|
+
`pipeline.json` example claimed this schema permitted it while carrying a string
|
|
54
|
+
`id`, a `title` where the schema says `name`, and no `state` at all — required. Its
|
|
55
|
+
gate texts stated only agent-sync's half, so a host that copied them silently
|
|
56
|
+
dropped the stage's real gate. Stage 9 pointed at the artifact-layout reference
|
|
57
|
+
instead of that stage's doctrine. And `guardedFiles` did not cover `docs/DOCMAP.md`
|
|
58
|
+
or `docs/superpowers/retro.md`, both of which this pipeline now creates and both of
|
|
59
|
+
which lose data under a concurrent write. `companion-skills.md` states the
|
|
60
|
+
**≥ 1.3.0** floor `finish` needs.
|
|
61
|
+
|
|
62
|
+
### Dogfooded
|
|
63
|
+
|
|
64
|
+
This repository ran its own brownfield walkthrough and wrote `docs/DOCMAP.md`. Step 1
|
|
65
|
+
— *inventory what is already there* — changed the plan: `npm test` already resolves
|
|
66
|
+
links, checks citations and computes counts over the same markdown, so **no second
|
|
67
|
+
gate was seeded**. The map records the gate that exists and why no other is created,
|
|
68
|
+
which is the walkthrough's step 2 read correctly: seed what is *missing*, and here
|
|
69
|
+
that was the map. The changed check went to the carry-over ledger for the operator's
|
|
70
|
+
agreement rather than being swapped silently.
|
|
71
|
+
|
|
72
|
+
Two new guards, each with a negative self-test watched failing.
|
|
73
|
+
|
|
3
74
|
## v1.8.1 — 2026-08-03
|
|
4
75
|
|
|
5
76
|
### 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.
|
|
15
|
+
| **Version** | 1.9.0 |
|
|
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 (
|
|
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
|
|
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` —
|
|
41
|
+
3. Run `npm run test:all` — 55 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.**
|
|
57
|
+
- **Behavioural evidence is missing, not merely thin.** 55 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 |
|
|
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
|
|
40
|
+
Everything else in this repository is proven by 55 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 "
|
|
42
|
+
not been run yet. Printed here so "55 of 55 green" is never read as "the skill is
|
|
43
43
|
known to work".
|
|
44
44
|
|
|
45
45
|
## Runs
|
|
46
46
|
|
|
47
|
-
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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": [
|
|
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.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"description": "Full-cycle delivery pipeline for coding agents: a mandatory built-in intake grill, then 10 gated stages (docs, brainstorm+decompose, spec, plan, build, tests, lint/deploy, post-deploy, docs/wiki, acceptance). Every stage's doctrine ships inside the skill — no companion plugin required. This package is the installer CLI.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"task-pipeline": "bin/task-pipeline.js"
|
|
@@ -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.9.0",
|
|
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
|
|
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. |
|
|
@@ -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
|
-
|
|
41
|
-
|
|
40
|
+
# THE TWO FLOORS ARE DIFFERENT KINDS. Mixing them up is why this is spelled out.
|
|
41
|
+
#
|
|
42
|
+
# PROP_FLOOR is an ID THRESHOLD, not a count. An entry whose number is >= the floor
|
|
43
|
+
# must have propagated; everything older is a counted backlog that may only shrink.
|
|
44
|
+
# ADOPTING THIS GATE IN AN EXISTING REPOSITORY MEANS SETTING IT TO THE NEXT FREE
|
|
45
|
+
# ID: from today the rule binds, and the history becomes one printed number instead
|
|
46
|
+
# of a thousand failures nobody will fix. Lower it as tranches are cleared.
|
|
47
|
+
PROP_FLOOR=${PROP_FLOOR:-0} # id threshold — entries >= this must propagate
|
|
48
|
+
#
|
|
49
|
+
# RESIDUE_FLOOR is a COUNT: how many unmarked citations of retired decisions are
|
|
50
|
+
# tolerated. On adoption set it to what the repository measurably has today, then
|
|
51
|
+
# only ever lower it.
|
|
52
|
+
RESIDUE_FLOOR=${RESIDUE_FLOOR:-0} # count — tolerated unmarked citations, today's number
|
|
42
53
|
|
|
43
54
|
TMP=$(mktemp -d 2>/dev/null || mktemp -d -t docgate)
|
|
44
55
|
trap 'rm -rf "$TMP"' EXIT
|