task-pipeline-skill 1.7.2 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +118 -0
- package/CODE_OF_CONDUCT.md +38 -0
- package/CONTRIBUTING.md +215 -0
- package/README.md +29 -1
- package/SECURITY.md +67 -0
- package/SKILL-CARD.md +60 -0
- package/bin/task-pipeline.js +23 -0
- package/evals/RESULTS.md +47 -0
- package/evals/__pycache__/run.cpython-314.pyc +0 -0
- package/evals/run.py +130 -0
- package/evals/task-pipeline.evals.json +166 -0
- package/package.json +7 -2
- package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +13 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +6 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/audit.md +11 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +12 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/build.md +12 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +10 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/decomposition.md +9 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/documentation.md +15 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/gates.md +63 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +10 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/hooks.md +16 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-graph.md +8 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +13 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +8 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +8 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/planning.md +12 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +12 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/review.md +11 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +10 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +57 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/tdd.md +10 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/docgate.sh +3 -1
package/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.
|
package/CONTRIBUTING.md
ADDED
|
@@ -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.
|
package/bin/task-pipeline.js
CHANGED
|
@@ -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,
|
package/evals/RESULTS.md
ADDED
|
@@ -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)_
|
|
Binary file
|