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/CHANGELOG.md CHANGED
@@ -1,5 +1,123 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.8.1 — 2026-08-03
4
+
5
+ ### Fixed — eight findings from a code-and-contradiction audit of 1.8.0
6
+
7
+ A third pass, on a third axis: the first read for contradictions, the second measured
8
+ against Anthropic's guidance, this one went after the **code** and the **invariants
9
+ between files**. Everything below was proven before the fix and again after.
10
+
11
+ **Fifteen broken cross-references, eleven of them pointing at a section about
12
+ something else.** Every per-stage freedom label cited `gates.md → Axis B` — which is
13
+ the *enforcement ladder* and contains no mention of degrees of freedom. Two more
14
+ cited sections that do not exist at all (`gates.md → progressive arming`,
15
+ `review.md → Final review`). This is the failure `references/learned.md` keeps as a
16
+ review question rather than a rule: *"a stale reference was replaced with a FALSE
17
+ one — the new target existed and said nothing about the subject."* The link checker
18
+ proved every file resolved and could not see it.
19
+
20
+ It is a rule now. `gates.md` gained the two sections the citations were reaching for
21
+ — **Axis C — degrees of freedom** and **Progressive arming** — and a guard checks
22
+ every ``file.md → *Section*`` pointer against the target's actual headings. Measured
23
+ before shipping: whitespace is normalised first, because a citation wrapped across
24
+ two lines is not a defect and six were reported as such.
25
+
26
+ **Both installers created the shadow copy this family exists to prune.**
27
+ `install.sh` and `bin/task-pipeline.js` write a plain copy to
28
+ `~/.claude/skills/task-pipeline`; the launcher (`sshlg-skills`) deletes exactly those
29
+ because while the plugin channel is active a plain copy **shadows it and keeps
30
+ serving the version it was copied from**. `CLAUDE.md` documented the shadow-creating
31
+ form (`--force`) as the local install path. Both installers now **refuse when a
32
+ plugin install is detected**, name the plugin commands instead, and take `--force`
33
+ only as a deliberate override.
34
+
35
+ **The npm package did not contain what the README points at.** `SKILL-CARD.md` and
36
+ the whole `evals/` directory were outside `files[]` while the shipped README linked
37
+ both — and `CONTRIBUTING.md`, `SECURITY.md` and `CODE_OF_CONDUCT.md` had been
38
+ dangling for npm consumers far longer. Rule 14 — *a document may not send a reader
39
+ to something absent* — applied to the artefact that is actually published. All are
40
+ packaged now, and a guard holds every relative README link to `files[]`.
41
+
42
+ **Living documents restated a guard count that had moved.** `SKILL-CARD.md` and
43
+ `evals/RESULTS.md` claimed 46 after the suite reached 50. Rule 8 — *compute, never
44
+ restate* — had never been applied to this repository's own prose. It is now: the
45
+ count is compared against the negative self-tests the workflow defines, and the
46
+ guard caught its own author within the minute, when adding three tests made the
47
+ freshly-corrected numbers stale again. CHANGELOG entries are exempt; they record
48
+ what a past release shipped.
49
+
50
+ **The contributor invariants were numbered 1,2,3,4,5,6,10,7,8,9 — and number 8
51
+ documented the opposite of what is enforced**, still requiring the description to
52
+ *open* with `Use when` after v1.8.0 made that a failure. Rewritten: sixteen
53
+ invariants, in order, each matching a guard that exists.
54
+
55
+ **Smaller:** the seeded gate's empty-project failure named only `docs/` while it also
56
+ scans the repository root, and offered no remedy — it now names both and says what to
57
+ do; `CLAUDE.md` gained the `evals/run.py` row it never had.
58
+
59
+ Three new guards, each with a negative self-test watched failing.
60
+
61
+ ## v1.8.0 — 2026-08-03
62
+
63
+ ### Added — the skill now meets Anthropic's own authoring guidance, measurably
64
+
65
+ Audited against the four Agent Skills pages (overview, best practices, enterprise,
66
+ API guide). Most of the spec already held — `name` 13/64 chars, `description` inside
67
+ 1024, `SKILL.md` 334/500 lines, all 23 references linked **directly** from SKILL.md,
68
+ forward slashes only, 436 KB against a 30 MB ceiling, and the plan-validate-execute
69
+ pattern the guidance describes is exactly the stage 3→4 set-equality check. Five
70
+ things did not.
71
+
72
+ **Every reference over 100 lines now carries a `## Contents` list — 21 files, from
73
+ zero.** The guidance is explicit about why: *"This ensures Claude can see the full
74
+ scope of available information even when previewing with partial reads."* That
75
+ preview is real, and `references/stages.md` is 500 lines — an agent that previewed
76
+ it saw stages 0 and 1 and could not learn stage 9 existed. The list is **compared
77
+ against the file's own headings**, not merely required to be present, because a
78
+ hand-maintained contents list is a second source that goes stale on the next
79
+ heading.
80
+
81
+ **A behavioural evaluation suite, where there was none.** 46 structural guards prove
82
+ the skill is well-*formed*; nothing proved it *behaves*. `evals/` now carries 13
83
+ evaluations across the five dimensions the enterprise page names — should-trigger,
84
+ should-not-trigger, ambiguous, coexistence with super-ux, and instruction-following
85
+ (does phase 1 really run before the first question; does stage 9 walk the matrix and
86
+ print ratchets; does a stage-5 subagent refuse to write the register; does stage 10
87
+ run the ladder walk before the table).
88
+
89
+ `evals/run.py` validates the suite and prints the protocol. **It never reports a
90
+ pass**, because Anthropic ships no runner and a script claiming to have executed a
91
+ model would be the exact failure this repository is written against.
92
+ `evals/RESULTS.md` records the honest state — *authored, zero models exercised, zero
93
+ runs* — as a ratchet, so "46 of 46 green" is never read as "the skill is known to
94
+ work".
95
+
96
+ **A copyable run checklist and a stated degree of freedom per stage.** The guidance
97
+ recommends a checklist Claude copies into its response for complex workflows, and
98
+ matching specificity to fragility — high freedom in the open field, low on the
99
+ narrow bridge. Every stage now declares which it is and why: stage 2 is high (many
100
+ designs are valid), stages 5, 7 and 9 are low (TDD order, an irreversible deploy, a
101
+ mechanical matrix walk).
102
+
103
+ **`SKILL-CARD.md`** — the registry entry the enterprise guidance asks for (purpose,
104
+ owner, version, dependencies, evaluation status) plus an honest pass over its
105
+ risk-tier table. This skill scores **three High indicators** — shipped scripts, MCP
106
+ references, tool invocations — and says so, along with the three things a consumer
107
+ should know rather than discover: author and reviewer are the same person, commits
108
+ are unsigned, and behavioural evidence is missing rather than thin.
109
+
110
+ ### Changed
111
+
112
+ - **The description leads with what the skill does, then the trigger** — the shape
113
+ Anthropic's own examples use. The validator used to *require* the string start with
114
+ "Use when", which enforced the WHEN half and left the WHAT half optional; it now
115
+ checks for both, plus the third-person voice the guidance requires.
116
+ - MCP tools are named fully qualified (`context7:resolve-library-id`), because
117
+ without the server prefix Claude may fail to locate the tool.
118
+
119
+ Four new guards, each with a negative self-test watched failing.
120
+
3
121
  ## v1.7.2 — 2026-08-03
4
122
 
5
123
  ### Fixed — nine findings from a post-release investigation of v1.7.1
@@ -0,0 +1,38 @@
1
+ # Code of conduct
2
+
3
+ ## The short version
4
+
5
+ Be decent. Argue with the idea, never with the person. Assume the other side read
6
+ the docs and still disagrees for a reason.
7
+
8
+ ## Expected
9
+
10
+ - **Technical criticism is welcome and wanted** — this repo is opinionated prose,
11
+ and the opinions get better under pressure. Bring the failure case, the file and
12
+ the line.
13
+ - Accept that a maintainer may decline a change and say why. "Out of scope" is a
14
+ legitimate answer.
15
+ - Respect that contributors work in different languages, time zones and
16
+ experience levels. English is the working language here; imperfect English is
17
+ never a reason to dismiss a point.
18
+
19
+ ## Not accepted
20
+
21
+ Personal attacks, harassment of any kind, demeaning or discriminatory comments,
22
+ sexualized language or imagery, publishing someone's private information, and
23
+ sustained disruption of discussions.
24
+
25
+ ## Scope
26
+
27
+ Applies to issues, pull requests, discussions, commit messages and any other
28
+ project space, and to public spaces when someone is representing the project.
29
+
30
+ ## Enforcement
31
+
32
+ Report anything that crosses the line to **[@sshlg on Telegram](https://t.me/sshlg)**
33
+ or via [GitHub's report abuse](https://github.com/contact/report-abuse) flow. Reports
34
+ are handled privately. Depending on severity the response is a warning, removal of
35
+ the offending content, or a block from the project.
36
+
37
+ Maintainers hold themselves to the same standard; a maintainer who breaks it should
38
+ expect to hear about it publicly.
@@ -0,0 +1,215 @@
1
+ # Contributing to task-pipeline
2
+
3
+ Thanks for taking the time. This repo ships a **skill**, not a program: almost
4
+ everything in it is prose that an agent reads and acts on. That makes two things
5
+ unusually important — the doctrine must not contradict itself across surfaces, and
6
+ the structural validator must stay able to fail.
7
+
8
+ ## Getting set up
9
+
10
+ No build step, no dependencies. You need `python3` (validator), `node` ≥ 16 (npm
11
+ installer), and `bash`.
12
+
13
+ ```bash
14
+ git clone https://github.com/ssheleg/task-pipeline
15
+ cd task-pipeline
16
+ npm test # == python3 test/validate.py
17
+ ```
18
+
19
+ `npm test` must print `PASS: task-pipeline structure valid` before you open a PR.
20
+
21
+ That proves the repo is well-formed. It does **not** prove the validator is
22
+ anything more than a decoration — for that, every guard has to be watched
23
+ rejecting a planted defect:
24
+
25
+ ```bash
26
+ npm run test:negatives # python3 test/negatives.py
27
+ npm run test:all # both, in order
28
+ ```
29
+
30
+ The corruptions live in [`.github/workflows/validate.yml`](.github/workflows/validate.yml)
31
+ and `test/negatives.py` reads them from there — never duplicated, because a second
32
+ copy of a corruption is a second thing to drift. The runner also tells a **broken
33
+ test** from a **guard that didn't fire**: if a planted defect changed nothing, the
34
+ validator passing means the test proved nothing, and it is reported as `BROKEN`
35
+ rather than as a failure of the guard.
36
+
37
+ **Corrupt files in python, never with `sed -i`.** BSD sed needs an argument GNU sed
38
+ refuses, and `0,/re/` does not exist on BSD at all — there it edits nothing
39
+ silently, and the test reads as a guard that failed. The validator rejects `sed -i`
40
+ in the workflow for exactly this reason: a self-test that only runs on CI cannot be
41
+ used while you are writing the guard, which is the moment it is worth most.
42
+
43
+ To try your change in a real agent:
44
+
45
+ ```bash
46
+ ./install.sh --force # ~/.claude/skills/task-pipeline + the command
47
+ node bin/task-pipeline.js --force # the same, through the npm installer
48
+ ```
49
+
50
+ ## Repository layout
51
+
52
+ | Path | What it is |
53
+ |---|---|
54
+ | `plugins/task-pipeline/skills/task-pipeline/SKILL.md` | the orchestrator — the entry point every agent reads first |
55
+ | `…/references/*.md` | the built-in stage doctrine (one file per stage or concern) |
56
+ | `…/templates/*.md` | skeletons seeded into a host project (brief, carry-over, `CONTEXT.md`, ADR) |
57
+ | `…/pipeline.schema.json` | the universal pipeline-config contract |
58
+ | `…/pipeline.example.json` | this plugin's own flow expressed against that contract |
59
+ | `plugins/task-pipeline/commands/task-pipeline.md` | the `/task-pipeline` slash command |
60
+ | `cursor/rules/task-pipeline.mdc` | the Cursor channel — **self-contained**, no relative links |
61
+ | `bin/task-pipeline.js`, `install.sh` | the two installers |
62
+ | `test/validate.py` | the structural validator |
63
+
64
+ ## The invariants
65
+
66
+ These are what the validator enforces. Breaking one is not a style disagreement —
67
+ it ships a wrong pipeline to every install. Numbered in reading order; the numbers
68
+ are labels, not priorities.
69
+
70
+ **1. Four-way version sync.** `package.json`, `.claude-plugin/marketplace.json`
71
+ (`plugins[0].version`), `plugins/task-pipeline/.claude-plugin/plugin.json` and the
72
+ top `## vX.Y.Z` heading in `CHANGELOG.md` must all carry the same version.
73
+ `SKILL-CARD.md`'s Version row is held to it too.
74
+
75
+ **2. The stage list lives on three surfaces and may not drift.** `SKILL.md`'s
76
+ table, `references/stages.md`'s per-stage sections, and `pipeline.example.json`.
77
+ Stage ids, names and **gate types** are compared across all three. Each stage's own
78
+ doctrine file states its gate type too and must agree with the config.
79
+
80
+ **3. Every human-facing description must name the flow's final stage, last.** The
81
+ package, marketplace, plugin, skill, command, Cursor-rule and README blurbs are the
82
+ only thing most people ever read. The validator derives the last stage from
83
+ `pipeline.example.json` and holds every blurb to it.
84
+
85
+ **4. No hardcoded vendor model ids.** Anywhere in the shipped skill, the README, the
86
+ command or the Cursor rule. Name the **tier**, never a string; stage configs use the
87
+ provider-agnostic tokens `default` / `inherit`.
88
+
89
+ **5. Every `references/*.md` must be reachable from `SKILL.md`**, directly or
90
+ transitively. An unreferenced file is dead context that ships and is never read.
91
+
92
+ **6. No external provider may substitute for built-in stage doctrine.**
93
+ `pipeline.example.json`'s `skills[]` may not name one for the stages whose doctrine
94
+ ships here (2, 3-spec, 4, 5, 6, 10). The optional tools — `context7`, `figma`,
95
+ `graphify`, `wiki-query` / `wiki-update` — and the UI-required `super-ux:*` track are
96
+ the enumerated exceptions, named deliberately.
97
+
98
+ **7. Stage 0 is mandatory and manual; stage 10 is manual and demands evidence; the
99
+ stage-4 gate is a set comparison.** These three are the spine, asserted in the
100
+ shipped config.
101
+
102
+ **8. `SKILL.md` frontmatter stays under 1024 characters, and the description says
103
+ WHAT before WHEN.** Anthropic's authoring guidance requires both halves — a
104
+ capability statement in third person, then the `Use when …` trigger — and Russian
105
+ trigger aliases ride beside the English ones. *(Before v1.8.0 this invariant demanded
106
+ the description **open** with `Use when`, which enforced the trigger half and left
107
+ the capability optional. The validator now rejects that shape.)*
108
+
109
+ **9. Relative links resolve.** Every relative markdown link in every file outside a
110
+ fenced code block must point at a path that exists.
111
+
112
+ **10. A seeded template must keep the seeded gate green — in both register shapes.**
113
+ `templates/docgate.sh` is run by `npm test` over two scratch projects: one seeded
114
+ from `docmap.md` / `decisions.md` / `open-questions.md` / `retro.md`, and one built
115
+ from `adr.md`'s own fenced example. Each must exit `0`, **report the shape it
116
+ found**, and run a minimum of live checks — because every section can go `dormant`,
117
+ and a gate blind to a shape passes exactly like one that reads it. Change a template
118
+ → run `npm test`, not just your eyes.
119
+
120
+ **11. Every reference over 100 lines carries a `## Contents` list**, and the list is
121
+ compared against that file's own `##` headings. The guidance asks for it because a
122
+ long file gets previewed with a partial read; the comparison is because a hand-kept
123
+ list is a second source that goes stale on the next heading.
124
+
125
+ **12. A section-qualified citation must name a section that exists.**
126
+ A citation of the form `file.md → *Section*` is checked against the target's headings. The
127
+ link checker proves the file resolves; only this proves the pointer is not false.
128
+
129
+ **13. Numbers stated in living documents are computed, not restated.** The guard
130
+ count in `README.md`, `SKILL-CARD.md` and `evals/RESULTS.md` is compared against the
131
+ negative self-tests the workflow defines. CHANGELOG entries are exempt — they record
132
+ what a past release shipped.
133
+
134
+ **14. Every relative link in `README.md` resolves inside the published package.**
135
+ `package.json` → `files[]` must ship whatever the README points at, or the link
136
+ dangles for every npm consumer.
137
+
138
+ **15. `SKILL-CARD.md` answers every risk indicator** and carries the current
139
+ version. It is the registry entry a consumer reviews before deploying, and an
140
+ omitted row reads as "does not apply".
141
+
142
+ **16. The evaluation suite covers all five dimensions** and `evals/run.py` accepts
143
+ it. Running it is a human step; the suite existing is not.
144
+
145
+ ## Adding or changing doctrine
146
+
147
+ - **Change one idea per PR.** These files are read by agents under load; a PR that
148
+ edits eight references for three unrelated reasons is unreviewable.
149
+ - **Update every surface in the same change.** If you touch the stage list, the
150
+ gate types or the review verdict count, walk `SKILL.md`, `references/stages.md`,
151
+ `pipeline.example.json`, the command, the Cursor rule and the README before you
152
+ commit. The validator catches much of this — do not rely on it to think for you.
153
+ - **A new guard needs a negative self-test.** If you teach `test/validate.py` a new
154
+ rule, add a step to `.github/workflows/validate.yml` that corrupts a copy and
155
+ asserts the validator fails, then watch it with `npm run test:negatives`. A guard
156
+ nobody proved can fail is decoration. **Check the base is green first** — if the
157
+ repo already fails your new rule, the self-test passes for the wrong reason and
158
+ proves nothing.
159
+ - **Keep the Cursor rule self-contained.** It gets copied into foreign projects;
160
+ relative links break there. Restate, don't link.
161
+ - **Prose style:** state the rule, then the failure it prevents. Every doctrine
162
+ file ends with a *Rationalizations* table for a reason — the excuse an agent will
163
+ reach for is more useful to write down than the rule itself.
164
+
165
+ ## Commits and pull requests
166
+
167
+ - **Conventional commits:** `feat:`, `fix:`, `docs:`, `chore:`, `refactor:`, `test:`.
168
+ Append the version when the change ships one: `feat: … ; v0.19.0`.
169
+ - Fill in the PR template: what changed, which surfaces you updated, validator
170
+ output.
171
+ - CI must be green. It is fast and dependency-light on purpose.
172
+
173
+ ## Releasing (maintainers)
174
+
175
+ 1. Bump the version in **all four** places (see invariant 1) and write the
176
+ `CHANGELOG.md` section — what changed and *why it mattered*, not a diff summary.
177
+ 2. `npm test` green, commit, push.
178
+ 3. Tag `vX.Y.Z` and push the tag. With the repo variable `RELEASE_ENABLED=true`,
179
+ [`.github/workflows/release.yml`](.github/workflows/release.yml) re-runs the
180
+ validator, checks the tag against the manifests, cuts a GitHub release from that
181
+ CHANGELOG section, and smoke-tests `npx` from a clean checkout.
182
+ 4. **`npm publish` runs in the same workflow**, in a second job armed by the repo
183
+ variable `PUBLISH_NPMJS=true` — it was the one human step in every release, and
184
+ the registry drifted behind the tags because of it. Auth is either the
185
+ `NPM_TOKEN` secret (a **granular automation** token; a classic one is still
186
+ refused by 2FA) or npm trusted publishing via OIDC, which needs no long-lived
187
+ credential. With `PUBLISH_NPMJS` unset or false it stays manual, and 2FA makes
188
+ that a human step.
189
+ 5. Refresh the local installs: `claude plugin marketplace update task-pipeline` →
190
+ `claude plugin update task-pipeline@task-pipeline` →
191
+ `npx skills update task-pipeline --global --yes`, then restart the agent.
192
+
193
+
194
+ ### The family catalogue moves with the release
195
+
196
+ `sshlg-skills` — the launcher that installs and updates the whole ssheleg family — pins every
197
+ member's version in its own `skills.json`. **A release that does not bump that pin is invisible.**
198
+ `npx sshlg-skills list` keeps reporting the previous version, `update` keeps installing it, and
199
+ anyone comparing their install against `list` is told the wrong number with nothing to reveal it.
200
+
201
+ So a release is not finished at `npm publish`:
202
+
203
+ ```bash
204
+ # in ssheleg/sshlg-skills
205
+ # 1. bump this member's "version" in skills.json
206
+ # 2. bump the launcher's own version, changelog, tag
207
+ npm publish --access public
208
+ npx --yes sshlg-skills@latest list # the new number must appear here
209
+ ```
210
+
211
+ ## License
212
+
213
+ By contributing you agree that your contributions are licensed under the
214
+ [MIT License](LICENSE), and that any third-party material you bring in is
215
+ compatible and gets its notice added to `LICENSE` → *Third-party*.
package/README.md CHANGED
@@ -464,6 +464,32 @@ Code, and **any exit code other than 2 is non-blocking, so a crashing guard fail
464
464
  open** and stops guarding without announcing it. Elsewhere the run is `ungated` and
465
465
  must say so.
466
466
 
467
+ ### Held to Anthropic's own Skill authoring guidance
468
+
469
+ Audited against the four Agent Skills pages. Most of it already held — `name`
470
+ 13/64 chars, `description` inside 1024, `SKILL.md` 334/500 lines, all 23 references
471
+ linked **directly** from `SKILL.md`, 436 KB against a 30 MB ceiling. What did not,
472
+ now does:
473
+
474
+ - **Every reference over 100 lines carries a `## Contents` list**, and the list is
475
+ *compared against the file's own headings* rather than trusted. The guidance is
476
+ explicit about why: a long file gets previewed with a partial read, and
477
+ `stages.md` is 500 lines.
478
+ - **A behavioural evaluation suite** (`evals/`) — 13 evaluations across the five
479
+ dimensions the enterprise guidance names: should-trigger, should-not-trigger,
480
+ ambiguous, coexistence, instruction-following. `evals/run.py` validates the suite
481
+ and prints the protocol; it **never reports a pass**, because no runner exists
482
+ upstream and a script claiming to have run a model would be the exact failure this
483
+ skill is written against. `evals/RESULTS.md` carries the honest state.
484
+ - **A copyable run checklist** and a **stated degree of freedom per stage** — high
485
+ in the open field (brainstorm), low on the narrow bridge (TDD order, deploy, the
486
+ matrix walk).
487
+ - **[`SKILL-CARD.md`](SKILL-CARD.md)** — the registry entry an enterprise reviewer
488
+ needs, with an honest pass over the risk-tier table. This skill scores three
489
+ *High* indicators and says so, along with what a consumer should know rather than
490
+ discover: author and reviewer are the same person, commits are unsigned, and the
491
+ eval suite has not been executed.
492
+
467
493
  ### The retrospective — the run teaches the next run, and the list stays short
468
494
 
469
495
  Every gate in this flow is good at *this* run and blind across runs. So the same
@@ -604,7 +630,7 @@ framework bakes in no fixed stage count and no opinion on which gates are manual
604
630
  A pipeline config may declare an optional `release` block: a master `enabled`
605
631
  toggle, a `trigger`, project-defined `steps`, and `verify` smoke-checks. It's **off
606
632
  unless a project turns it on**, and every project configures its own. This repo's
607
- own instance is [`.github/workflows/release.yml`](.github/workflows/release.yml) —
633
+ own instance is [`.github/workflows/release.yml`](https://github.com/ssheleg/task-pipeline/blob/main/.github/workflows/release.yml) —
608
634
  armed per repo by the `RELEASE_ENABLED` variable (unset = off), it validates the tag
609
635
  against the manifests, cuts a GitHub release from the CHANGELOG, and smoke-tests
610
636
  `npx` from a clean checkout. Copy and adapt it; nothing is hardcoded.
@@ -717,6 +743,8 @@ recommendation, so you arm the whole run in one exchange. Detail:
717
743
  | [`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 |
718
744
  | [`references/model-tiering.md`](plugins/task-pipeline/skills/task-pipeline/references/model-tiering.md) | model policy, the `/model` reminder, overrides |
719
745
  | [`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 |
746
+ | [`SKILL-CARD.md`](SKILL-CARD.md) | the registry entry and risk-tier disclosure a reviewer needs before deploying it |
747
+ | [`evals/`](evals/RESULTS.md) | the behavioural evaluation suite, its protocol, and what has actually been observed |
720
748
  | [`CHANGELOG.md`](CHANGELOG.md) | every release, with the reasoning behind it |
721
749
  | [`CONTRIBUTING.md`](CONTRIBUTING.md) | dev setup, the validator, the version-sync rule, release flow |
722
750
 
package/SECURITY.md ADDED
@@ -0,0 +1,67 @@
1
+ # Security policy
2
+
3
+ ## What this project is
4
+
5
+ `task-pipeline` ships **markdown doctrine plus two small installers**. There is no
6
+ server, no network client and no runtime service. The executable surface is:
7
+
8
+ | Surface | What it does |
9
+ |---|---|
10
+ | `bin/task-pipeline.js` | copies the skill directory into `~/.claude/` (zero dependencies) |
11
+ | `install.sh` | the same, in POSIX shell |
12
+ | `test/validate.py` | reads repo files and exits 0/1; run in CI |
13
+ | `.github/workflows/*.yml` | CI and the toggleable release job |
14
+
15
+ The skill's doctrine, however, is **instructions an agent will act on** inside your
16
+ repository — including running your test and lint commands and, at stage 7, your
17
+ deploy. Treat a change to `references/*.md` with the same care as a change to a
18
+ deploy script.
19
+
20
+ ## Supported versions
21
+
22
+ The latest released version is supported. Fixes ship in a new release rather than
23
+ as patches to older tags.
24
+
25
+ ## Reporting a vulnerability
26
+
27
+ **Do not open a public issue for a security problem.**
28
+
29
+ - Preferred: [GitHub private vulnerability reporting](https://github.com/ssheleg/task-pipeline/security/advisories/new)
30
+ (Security → Report a vulnerability).
31
+ - Alternative: Telegram [@sshlg](https://t.me/sshlg).
32
+
33
+ Please include what you found, how to reproduce it, and the impact you see. You'll
34
+ get an acknowledgement within **72 hours** and a fix or a decision with reasoning
35
+ within **14 days** for anything confirmed. Coordinated disclosure is welcome — tell
36
+ me the timeline you'd like and I'll work to it.
37
+
38
+ ## In scope
39
+
40
+ - The installers writing outside `~/.claude/skills/task-pipeline` and
41
+ `~/.claude/commands/task-pipeline.md`, or overwriting files without `--force`.
42
+ - Anything in the shipped doctrine that would lead an agent to exfiltrate secrets,
43
+ push to a repository the task never named, deploy without the operator's go, or
44
+ bypass a gate that exists to require one.
45
+ - Command injection or path traversal through the validator or the workflows.
46
+ - A CI workflow that could be made to leak repository secrets.
47
+
48
+ ## Out of scope
49
+
50
+ - The behavior of the AI agent that reads the skill. Agents are non-deterministic;
51
+ a model ignoring an instruction is a doctrine-quality bug — please file it as a
52
+ normal issue.
53
+ - Third-party companions (`super-ux`, `context7`, `obsidian-wiki`). Report those to
54
+ their own maintainers.
55
+ - Anything requiring an attacker who already controls the operator's machine or
56
+ their agent's configuration.
57
+
58
+ ## Hardening notes for operators
59
+
60
+ - **Deploy authorization has a floor by design.** The pipeline treats deploy,
61
+ publish and PR-opening as outward actions that need an explicit go, or a standing
62
+ authorization that names the target *and* the preconditions. Do not record a
63
+ blanket "do everything" in a brief — it is specifically rejected.
64
+ - **Writes to another repository are always proposal + PR**, never a direct push.
65
+ - The build stage keeps its scratch state in a git-ignored `.task-pipeline/`
66
+ directory; confirm that directory is ignored before you run it in a repo with
67
+ strict commit hooks.
package/SKILL-CARD.md ADDED
@@ -0,0 +1,60 @@
1
+ # Skill card — task-pipeline
2
+
3
+ **What a reviewer needs before deploying this skill, in one page.** The fields are
4
+ the registry entry Anthropic's [Skills for enterprise](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/enterprise)
5
+ guidance asks every organisation to keep, plus an honest pass over its risk-tier
6
+ table. Written so somebody who did not build this can decide, not so it looks
7
+ harmless.
8
+
9
+ ## Registry entry
10
+
11
+ | Field | Value |
12
+ |---|---|
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
+ | **Owner** | ssheleg ([github.com/ssheleg/task-pipeline](https://github.com/ssheleg/task-pipeline)) |
15
+ | **Version** | 1.8.1 |
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
+ | **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) |
19
+
20
+ ## Risk-tier disclosure
21
+
22
+ Every indicator from the enterprise risk table, answered — including the ones that
23
+ apply.
24
+
25
+ | Indicator | Applies? | What exactly |
26
+ |---|---|---|
27
+ | **Code execution** | **Yes — High** | Ships `templates/docgate.sh` (seeded into the host project as its documentation gate), `bin/task-pipeline.js` and `install.sh` (installers), `test/*.py` and `evals/run.py` (repo checks). None run automatically; the gate is seeded and run by the host project |
28
+ | **MCP server references** | **Yes — High** | Instructions name `context7`, `figma`, `graphify`, `wiki-query`, `wiki-update`. All optional; absence degrades a stage, never blocks one, except super-ux on a UI task |
29
+ | **Tool invocations** | **Yes — Medium** | Instructs bash (git, test runners, the host's lint/deploy commands), file reads and writes, and a `PreToolUse` hook example that runs the docs gate before a commit |
30
+ | **Filesystem access scope** | **Yes — Medium** | Reads and writes inside the host project: `docs/`, `scripts/check-docs.sh`, `.task-pipeline/` scratch, `CONTEXT.md`. Stage 5 creates and removes git worktrees. Writing to **another repository** is treated as outward and requires an explicit go |
31
+ | **Instruction manipulation** | No | Nothing instructs Claude to bypass safety rules, hide actions, or behave conditionally on hidden inputs. Outward and irreversible actions (deploy, publish, PR, editing a shared design file) explicitly require operator authorization |
32
+ | **Network access patterns** | Minimal | No `curl`/`fetch`/`requests` in shipped code. The doctrine tells the agent to fetch **library documentation** at stage 1 and to re-fetch the hook contract; both are reads of vendor docs, named in the text |
33
+ | **Hardcoded credentials** | No | None. Release automation uses repository secrets in CI, never files in the skill |
34
+
35
+ ## What to check before you trust it
36
+
37
+ 1. Read `SKILL.md` and the 23 files under `references/` — that is the whole
38
+ instruction surface, and every one is linked directly from `SKILL.md`.
39
+ 2. Read `templates/docgate.sh` before seeding it; it is the only shipped script a
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
42
+ defect and requires rejection.
43
+ 4. Run `python3 evals/run.py` for the behavioural protocol, and read
44
+ `evals/RESULTS.md` for what has actually been observed.
45
+
46
+ ## Posture, stated rather than implied
47
+
48
+ - **Separation of duties is not in place.** The author and the reviewer are the same
49
+ person. The enterprise guidance asks for separation; a consumer should treat this
50
+ repository's own review as an author's self-review and do their own.
51
+ - **Commits are unsigned**, so provenance rests on GitHub account control rather than
52
+ cryptographic signature. Integrity verification by checksum is possible today
53
+ (`npm pack` / tag archives) and is not automated.
54
+ - **Versions are pinned by git tag** and mirrored into `sshlg-skills`'s catalogue.
55
+ Rollback is `git checkout v<previous>` or pinning the previous plugin version;
56
+ the previous version is never deleted.
57
+ - **Behavioural evidence is missing, not merely thin.** 53 structural guards prove
58
+ the skill is well-formed. Until `evals/RESULTS.md` carries a dated run, nothing in
59
+ this repository proves it *behaves* — triggers correctly, stays quiet on a
60
+ question, or performs the steps it documents.
@@ -78,6 +78,29 @@ function main(argv) {
78
78
  }
79
79
 
80
80
  const home = os.homedir(); // respects $HOME on POSIX — tests override via env
81
+
82
+ // One channel per agent. This installer writes a PLAIN copy to
83
+ // ~/.claude/skills/<id>, and while the Claude Code PLUGIN channel is active that
84
+ // copy SHADOWS the plugin — silently serving whatever version was copied, forever.
85
+ // The family launcher (sshlg-skills) prunes exactly these copies for that reason,
86
+ // so creating one without saying so undoes the thing it is paired with.
87
+ const pluginDirs = [
88
+ path.join(home, '.claude', 'plugins', 'marketplaces', 'task-pipeline'),
89
+ path.join(home, '.claude', 'plugins', 'cache', 'task-pipeline'),
90
+ ];
91
+ if (!force && pluginDirs.some((d) => fs.existsSync(d))) {
92
+ console.error(`refusing: task-pipeline is already installed as a Claude Code PLUGIN.
93
+
94
+ A plain copy in ~/.claude/skills/ shadows the plugin and keeps serving the version
95
+ it was copied from — the failure this family prunes for. Prefer the plugin:
96
+
97
+ claude plugin marketplace update task-pipeline
98
+ claude plugin update task-pipeline@task-pipeline
99
+
100
+ Rerun with --force if you deliberately want the plain copy instead.`);
101
+ return 3;
102
+ }
103
+
81
104
  installOne(
82
105
  'task-pipeline skill ',
83
106
  skillSrc,
@@ -0,0 +1,47 @@
1
+ # Evaluation results — task-pipeline
2
+
3
+ **Status: the suite is authored and has not been executed.** Recorded here rather
4
+ than left blank, because an empty results file and an unrun suite look identical,
5
+ and this repository's own doctrine calls that the failure — a skip is not a pass.
6
+
7
+ Running these needs a fresh session per query, per model. That is a human or agent
8
+ step; `evals/run.py` prints the protocol and deliberately never reports a pass it
9
+ did not observe.
10
+
11
+ ## How to record a run
12
+
13
+ One table per date + model. Verdict is `pass` / `fail` / `partial`, and a `fail`
14
+ carries what actually happened, not a shrug.
15
+
16
+ ```markdown
17
+ ## 2026-08-10 · sonnet
18
+
19
+ | id | verdict | what happened |
20
+ |---|---|---|
21
+ | TRIG-01 | pass | harvest ran first, ledger written, no code before the brief |
22
+ | NOTRIG-02 | fail | invoked the skill for a one-character README fix |
23
+ ```
24
+
25
+ Then act on the result the way the enterprise guidance says: declining trigger
26
+ accuracy → change the description; coexistence conflicts → narrow it or consolidate;
27
+ persistent instruction-following failures → the instruction is not prominent enough,
28
+ or it belongs in a check.
29
+
30
+ ## Ratchet
31
+
32
+ | Metric | Value | As of |
33
+ |---|---|---|
34
+ | Evals authored | 13 | 2026-08-03 |
35
+ | Categories covered | 5 of 5 | 2026-08-03 |
36
+ | Models exercised | **0 of 3** | 2026-08-03 |
37
+ | Dated runs recorded | **0** | 2026-08-03 |
38
+
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
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
43
+ known to work".
44
+
45
+ ## Runs
46
+
47
+ _(none yet)_