task-pipeline-skill 1.93.3 → 1.95.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 +145 -0
- package/CONTRIBUTING.md +32 -0
- package/HOW-IT-WORKS.md +4 -3
- package/README.md +59 -15
- package/SKILL-CARD.md +2 -2
- package/bin/task-pipeline.js +64 -33
- package/cursor/rules/task-pipeline.mdc +10 -5
- package/evals/RESULTS.md +1 -1
- package/evals/task-pipeline.evals.json +16 -0
- package/package.json +3 -3
- package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
- package/plugins/task-pipeline/agents/verifier.md +5 -2
- package/plugins/task-pipeline/commands/task-pipeline.md +25 -10
- package/plugins/task-pipeline/hooks/memory-nudge.sh +45 -3
- package/plugins/task-pipeline/hooks/release-gate.sh +1 -1
- package/plugins/task-pipeline/skills/evidence-docs/references/gates.md +6 -3
- package/plugins/task-pipeline/skills/evidence-docs/references/hooks.md +2 -1
- package/plugins/task-pipeline/skills/evidence-docs/references/retrospective.md +26 -1
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +24 -20
- package/plugins/task-pipeline/skills/task-pipeline/graph.schema.json +89 -4
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json +7 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/backlog.md +25 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/browser.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/certification.md +46 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +3 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/continuity.md +97 -26
- package/plugins/task-pipeline/skills/task-pipeline/references/deploy-targets.md +30 -4
- package/plugins/task-pipeline/skills/task-pipeline/references/doctrine-map.md +20 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/gates.md +6 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +2 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/hooks.md +2 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/iteration.md +387 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +1 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +4 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/portability.md +13 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +26 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +7 -5
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-00-intake.md +158 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-01-docs-study.md +10 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-02-brainstorm.md +52 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-03-spec.md +66 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-04-plan.md +11 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-05-dev.md +55 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-06-tests.md +11 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-07-lint-deploy.md +15 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-08-post-deploy.md +29 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-09-docs-wiki.md +45 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-10-acceptance.md +91 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +60 -475
- package/plugins/task-pipeline/skills/task-pipeline/references/verification.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/waves.md +76 -36
- package/plugins/task-pipeline/skills/task-pipeline/references/work-graph.md +54 -5
- package/plugins/task-pipeline/skills/task-pipeline/scripts/backlog_sources.py +54 -13
- package/plugins/task-pipeline/skills/task-pipeline/scripts/context_packets.py +3 -3
- package/plugins/task-pipeline/skills/task-pipeline/scripts/graph.py +205 -22
- package/plugins/task-pipeline/skills/task-pipeline/scripts/lessons.py +1137 -0
- package/plugins/task-pipeline/skills/task-pipeline/scripts/stage_checkpoint.py +264 -44
- package/plugins/task-pipeline/skills/task-pipeline/scripts/waves.py +546 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/README.md +6 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/backlog-sources.schema.json +96 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/canvas.md +97 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/dossier.md +82 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/inventory.schema.json +94 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/lesson.schema.json +221 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/questions.md +45 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/retro.md +4 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/run.md +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,148 @@
|
|
|
1
|
+
## v1.95.0 — 2026-10-13
|
|
2
|
+
|
|
3
|
+
Source candidate; not published.
|
|
4
|
+
|
|
5
|
+
Guards: 438 → **439**; property checks 15 → **15**.
|
|
6
|
+
|
|
7
|
+
The default stage list keeps every full gate and routes each stage to its own
|
|
8
|
+
procedure before work on entry or resume. Custom profiles keep their own stages
|
|
9
|
+
and doctrine. The split preserves the original stage text and reduces the measured
|
|
10
|
+
entry reading component; it does not claim a native-host or billed-token result.
|
|
11
|
+
Scenario artifacts remain mandatory for user-facing work, while an equivalent
|
|
12
|
+
provider or the documented inline fallback can supply them without installing a
|
|
13
|
+
specific companion plugin. The new route refusal and relocated source checks keep
|
|
14
|
+
these obligations addressable after the split.
|
|
15
|
+
|
|
16
|
+
Checkpoint recovery now follows the selected project profile's declared stage order,
|
|
17
|
+
including custom names and nonconsecutive ids. Malformed or changed profiles refuse
|
|
18
|
+
instead of silently injecting default stages into a saved workflow. Run-local profile
|
|
19
|
+
binding survives record/retry; relocated ledgers can name their project root explicitly.
|
|
20
|
+
This is an offline-tested payload correction, not a live Observatory acceptance claim.
|
|
21
|
+
|
|
22
|
+
Owner release preparation now records an unpublished local annotated tag before the
|
|
23
|
+
complete suite, binds its exact source/context/evidence, and publishes only the
|
|
24
|
+
verified annotation to one destination. The existing release hook recognizes
|
|
25
|
+
explicit tag-destination refspecs. Mechanical evidence does not confer external
|
|
26
|
+
authority, native interception or successful registry publication.
|
|
27
|
+
|
|
28
|
+
Test runners use one safely opened family scratch lock across TMPDIR settings and
|
|
29
|
+
owners, matching their shared fixed scratch paths. The lock now stays held while a
|
|
30
|
+
plant's Bash or its synchronously writing child is alive, even if the runner itself is
|
|
31
|
+
killed; an interrupted runner signals and drains its own process groups before it
|
|
32
|
+
closes its copy, and on macOS a group of exited-but-unreaped members no longer aborts
|
|
33
|
+
that cancellation. An interrupted run no longer leaves its repository snapshot in
|
|
34
|
+
TMPDIR. Existing older runner versions, deliberately detached descendants and direct
|
|
35
|
+
plant invocation remain outside that mechanism.
|
|
36
|
+
|
|
37
|
+
The owner-gate helpers' seam headers declare `diverges: none` with their extraction
|
|
38
|
+
scope on a separate line, so the umbrella's shared-copy check reads them as identical
|
|
39
|
+
to the other members' copies.
|
|
40
|
+
|
|
41
|
+
## v1.94.1 — 2026-10-13
|
|
42
|
+
|
|
43
|
+
Records the missing retrospective declarations that stopped the v1.94.0 release
|
|
44
|
+
before publication. The accepted release-iteration payload is unchanged; the
|
|
45
|
+
version metadata advances so the failed tag remains immutable. Local-tag
|
|
46
|
+
structural validation reads both declarations before another release attempt.
|
|
47
|
+
|
|
48
|
+
## v1.94.0 — 2026-10-13
|
|
49
|
+
|
|
50
|
+
Guards: 438 → **438**; property checks 15 → **15**. The owner validator and
|
|
51
|
+
focused regression suites gain coverage; the counted negative-file corpus is unchanged.
|
|
52
|
+
|
|
53
|
+
The accepted feature now also rejects loss of node identity or evidence during
|
|
54
|
+
inventory synchronization. Waiting nodes retain typed wait IDs and watcher
|
|
55
|
+
locators, cannot certify or close while waiting, and report the runnable frontier
|
|
56
|
+
with distinct exit states. Release authority is recorded separately from a locator;
|
|
57
|
+
source policies and scoped grants are carried into execution packets. Local regression
|
|
58
|
+
and history checks cover these boundaries. Native Observatory/Fabric handoff
|
|
59
|
+
execution remains unverified in this release receipt.
|
|
60
|
+
|
|
61
|
+
**The release iteration — the loop around the waves** (`references/iteration.md`). The
|
|
62
|
+
project moves in whole releases: survey, module dossiers integrated into one canvas,
|
|
63
|
+
question rounds in batches, a parallel build, verification as each node lands, one release
|
|
64
|
+
verified as released, the next pool handed back. A finding made mid-iteration joins the
|
|
65
|
+
inventory; a closed hotfix lane of five entries is the only exception.
|
|
66
|
+
|
|
67
|
+
- **Trigger.** "release iteration" / "итерация релиза" reaches the mode beside "waves" /
|
|
68
|
+
"волнами"; `/task-pipeline iteration` is listed in the command, and the Cursor rule's
|
|
69
|
+
wave paragraph names the loop.
|
|
70
|
+
- **Risk classes R1–R3** on each node (`graph.schema.json` and `graph.py validate` accept
|
|
71
|
+
`risk`; any other value is refused). A round is the three blind tiers plus one fix cycle;
|
|
72
|
+
the first is always the full three; R1 owes one passing round, R2 two, R3 three, one of
|
|
73
|
+
them recorded adversarial. A wave's stage 7 integrates without tagging; the release's stage-7 gate and
|
|
74
|
+
stage 8's trio run once, at steps 10 and 11.
|
|
75
|
+
- **Lessons across projects.** lesson/1 (`templates/lesson.schema.json`) and
|
|
76
|
+
`scripts/lessons.py`: a retro entry with a `**Lesson:**` line becomes a lesson in a local
|
|
77
|
+
index every install has (`~/.sshlg-skills/lessons/index.jsonl` where the family's directory
|
|
78
|
+
exists — hosted there as task-pipeline's by the family: sshlg-skills B-181 and its
|
|
79
|
+
`state-json.md` section *Other members' files under `~/.sshlg-skills/`* (#209);
|
|
80
|
+
`~/.task-pipeline/lessons/index.jsonl` otherwise, moved there once, aloud, if the family's
|
|
81
|
+
directory appears later; `$TASK_PIPELINE_LESSONS` or `--index` move it). Source 7b
|
|
82
|
+
of the harvest reads it by the task's nouns, then a shared store whose search filters by
|
|
83
|
+
kind. Writing to Observatory works today through `observatory_record`. The redaction list
|
|
84
|
+
binds every lesson; on the estate it relaxes rule 2 for the evidence commit and a
|
|
85
|
+
pseudonymous project key only.
|
|
86
|
+
- **Wave tooling.** `scripts/waves.py` (merge, assign, count, validate, sync-graph) with
|
|
87
|
+
inventory/1 (`templates/inventory.schema.json`), and the canvas, question-queue, dossier
|
|
88
|
+
and backlog-sources templates. waves.md links the schemas instead of a field table and
|
|
89
|
+
no longer sends public readers to a private repository; the shipped
|
|
90
|
+
`backlog-sources.schema.json` is the rule, the Fabric contract its provenance.
|
|
91
|
+
- **Continuity.** The loop is armed by `run.loop`, the preflight answer or a standing
|
|
92
|
+
instruction the host carries, cited as `loop: armed by <source>`; a watcher may merge,
|
|
93
|
+
release a lease, rebase or notify where a standing instruction names the act; waits that
|
|
94
|
+
outlive the session go on a durable trigger; at the compaction signal the next task is
|
|
95
|
+
written down, not started.
|
|
96
|
+
- New suites in `npm test`: `lessons_test.py`, `waves_test.py`, `continuity_doc_test.py`;
|
|
97
|
+
eval INSTR-08 (wave 0).
|
|
98
|
+
- **Rounds owed are enforced.** `graph.py close` refuses a node with a `risk` until its
|
|
99
|
+
class's rounds have passed — passing rounds, read from the certification history; a
|
|
100
|
+
failed round counts for nothing (R1 one, R2 two, R3 three, one of them a passing round
|
|
101
|
+
recorded with `certify --kind adversarial`); `certify` prints `round N: k of M owed passing
|
|
102
|
+
rounds — not closable yet`. certification.md
|
|
103
|
+
gains *Rounds owed by risk class*, and the churn doctrine exempts owed rounds from "a clean
|
|
104
|
+
round ends the loop".
|
|
105
|
+
- `waves.py sync-graph` judges a re-cut as a whole, so a chain moved up a wave is never
|
|
106
|
+
refused halfway. `backlog_sources.py` refuses unknown keys and applies every source rule
|
|
107
|
+
to every source, and the shipped schema where `jsonschema` is installed.
|
|
108
|
+
- `lessons.py emit-observatory` sends the commit as `commit:` + 12 hex (the store's redactor
|
|
109
|
+
keeps that form and removes a 40-hex SHA) and revises a recorded lesson instead of minting
|
|
110
|
+
a second; a git that does not answer in time is its own refusal.
|
|
111
|
+
- `waves.py sync-graph` also writes each plan node's `risk` onto its work-graph node (a
|
|
112
|
+
`risk` revision; lowering a class needs `--lower-why`), so the rounds `close` enforces
|
|
113
|
+
apply to every planned node, not only to a hand-edited graph.
|
|
114
|
+
- `lessons.py` reads stdin as UTF-8 and prints machine output as ASCII-escaped JSON, so a
|
|
115
|
+
non-UTF-8 locale loses nothing a lesson carries. `rebuild` reports unreadable sources
|
|
116
|
+
and preserves the prior index. A complete scan can replace a corrupt index after
|
|
117
|
+
keeping its backup (`python3 test/lessons_test.py`).
|
|
118
|
+
- Every lessons-index operation runs under one lock (the index directory's `.lock`, plus the
|
|
119
|
+
standalone directory's on the default path). A file that cannot be READ is a refusal that
|
|
120
|
+
names it and writes nothing; one that cannot be PARSED — the family index or the
|
|
121
|
+
standalone one alike — is kept as `.corrupt-<date>` and never makes a command exit 1. Lines
|
|
122
|
+
in a newer index format are skipped, counted and kept on write. When both index files
|
|
123
|
+
exist they are merged once: only lessons the family index lacks are copied, its own copy
|
|
124
|
+
wins, newer-format lines are carried across, and the old file becomes `.migrated`.
|
|
125
|
+
- `emit-observatory --tool observatory_lesson` emits the engine's lesson-kind arguments
|
|
126
|
+
(the lesson's own fields, plus `origin{projectId, commit}` — the engine's inputSchema); the agent
|
|
127
|
+
picks it where the session lists that tool, `observatory_record` otherwise.
|
|
128
|
+
- `waves.py` refuses a plan whose risk, wave, closes or release value it does not know.
|
|
129
|
+
- **Memory unavailable, said once per run.** `stage_checkpoint.py record --unavailable
|
|
130
|
+
"<why>" --for-run` appends one `unavailable for this run` line and leaves a marker in
|
|
131
|
+
`.task-pipeline/memory.json` keyed to the run's topic and start date (the module-map field
|
|
132
|
+
may change mid-run; a ledger with no `Run:` line is refused, exit 2); `hooks/memory-nudge.sh`
|
|
133
|
+
and `stage_checkpoint.py state` honour it only while that run's ledger still carries the
|
|
134
|
+
marker's own line — a ledger reseeded at stage 0, even the same day, does not — and any
|
|
135
|
+
later `record --answer` clears it. The first nudge of a run names the Observatory engine.
|
|
136
|
+
- **Plain and npm installs deliver all three skills.** `./install.sh` and
|
|
137
|
+
`npx task-pipeline-skill` now install `task-pipeline`, `evidence-docs` and
|
|
138
|
+
`project-audit` into `~/.claude/skills/<name>`, plus the command; every source is
|
|
139
|
+
verified present before anything is copied. **`--force` now overwrites all three skill
|
|
140
|
+
directories and the command**, not the task-pipeline skill alone. The closing notice
|
|
141
|
+
names the role agents and every hook a plain copy cannot carry, and the plugin command.
|
|
142
|
+
**A partial earlier install is refused as mixed versions** (some of the three skills
|
|
143
|
+
present, others not), nothing written, until `--force` brings all three to one version.
|
|
144
|
+
- Suite `test/install_test.sh` (both installers, fresh `HOME`) joins `npm test`.
|
|
145
|
+
|
|
1
146
|
## v1.93.3 — the wave-2 evidence declares its dead commits; a retried handoff stays one offer
|
|
2
147
|
|
|
3
148
|
A re-certification reading of v1.93.2 and an independent observer found six things.
|
package/CONTRIBUTING.md
CHANGED
|
@@ -51,6 +51,38 @@ To try your change in a real agent:
|
|
|
51
51
|
node bin/task-pipeline.js --force # the same, through the npm installer
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
+
## Owner release admission
|
|
55
|
+
|
|
56
|
+
For this repository's release, the unpublished annotated candidate tag must exist
|
|
57
|
+
locally on the accepted commit **before** the complete suite runs. A green untagged
|
|
58
|
+
run is insufficient: inspect whether release-stamp checks actually looked.
|
|
59
|
+
`pipeline.json` stage7 and standing instruction R-010 in `docs/evidence/retro.md`
|
|
60
|
+
use this same order; R-004 requires the next operation to depend on gate success.
|
|
61
|
+
|
|
62
|
+
In a standalone full clone of the owning source repository, use the owner-only
|
|
63
|
+
`scripts/release_candidate.py`. Set `candidate_tag` to the chosen unpublished
|
|
64
|
+
version and `actual_project_root` to the same-source project holding the real
|
|
65
|
+
current run context. These are operator/run inputs, not generated approval:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
python3 scripts/release_candidate.py prepare --tag "$candidate_tag" --context-root "$actual_project_root" &&
|
|
69
|
+
python3 scripts/release_candidate.py check --tag "$candidate_tag" &&
|
|
70
|
+
python3 scripts/release_candidate.py publish --tag "$candidate_tag"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`prepare` creates and binds the owned local annotation; `check` runs the fixed
|
|
74
|
+
`npm run test:all` with that tag visible and retains its exact evidence.
|
|
75
|
+
`publish` requires faithful bound context, the existing release hook, unchanged
|
|
76
|
+
source/tag/evidence and the verified single destination/ref. The helper does not
|
|
77
|
+
verify external authorization or create a ledger. Without faithful context,
|
|
78
|
+
prepare/check remain usable and publication refuses. Never move a published tag;
|
|
79
|
+
changed or ambiguous state requires read-only reconciliation before another action.
|
|
80
|
+
|
|
81
|
+
Its PUBLISHED state confirms the tag's remote object and peel, not successful npm
|
|
82
|
+
publication. Watch every release job and verify the published payload separately.
|
|
83
|
+
The helper and private Git-directory receipts belong to the owner checkout and
|
|
84
|
+
are not a plugin API or part of the installed skill.
|
|
85
|
+
|
|
54
86
|
## Repository layout
|
|
55
87
|
|
|
56
88
|
| Path | What it is |
|
package/HOW-IT-WORKS.md
CHANGED
|
@@ -65,9 +65,10 @@ because it rots the moment the vendor ships a new one.
|
|
|
65
65
|
|
|
66
66
|
**Companions.** `super-ux`, `copywriting`, `sheleg-design`, `graphify`, the wiki.
|
|
67
67
|
The detection block prints once. A missing companion states its fallback and
|
|
68
|
-
**does not block
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
**does not block on installation**. For user-facing work, stage 3 requires a valid
|
|
69
|
+
scenario artifact under the [provider rule](plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md).
|
|
70
|
+
Unavailable checks are named as NOT_RUN; a fallback is not evidence that a missing
|
|
71
|
+
tool ran.
|
|
71
72
|
|
|
72
73
|
---
|
|
73
74
|
|
package/README.md
CHANGED
|
@@ -167,9 +167,9 @@ ledgers, so the link is the repository's rather than the package's.
|
|
|
167
167
|
The doctrine each stage runs on ships inside the skill. Nothing to install for it,
|
|
168
168
|
nothing to resolve at preflight, no version skew with someone else's repo, and
|
|
169
169
|
**no stage blocks on an install** — stage 1 falls back to web search, the wiki and
|
|
170
|
-
the code graph are recommendations.
|
|
171
|
-
|
|
172
|
-
|
|
170
|
+
the code graph are recommendations. On user-facing tasks the stage-3 UX gate
|
|
171
|
+
requires a valid scenario artifact. The preferred provider, an equivalent provider
|
|
172
|
+
and the inline fallback satisfy the same [provider contract](plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md).
|
|
173
173
|
|
|
174
174
|
| Stage | Built-in doctrine |
|
|
175
175
|
|---|---|
|
|
@@ -201,7 +201,7 @@ until it is installed.
|
|
|
201
201
|
| 6–10 + any check you write | [`gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) — the three axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors |
|
|
202
202
|
| any agent-time enforcement | [`hooks.md`](plugins/task-pipeline/skills/task-pipeline/references/hooks.md) — the `PreToolUse` contract, the fail-open hazard, the Claude-Code-only limit |
|
|
203
203
|
| 7 · the tag | [`deploy-targets.md`](plugins/task-pipeline/skills/task-pipeline/references/deploy-targets.md) → *When the release waits for an approval* — `pipeline.json` → `release.approval`: `checks` (tag, watch the run selected by the tag, report) or `reviewers` (the direct link to the run that is `waiting`) |
|
|
204
|
-
| between stages | [`continuity.md`](plugins/task-pipeline/skills/task-pipeline/references/continuity.md) Part 3 — workflow memory through Observatory, a planned handoff (`stage_checkpoint.py handoff` / `accept`), and `hooks/memory-nudge.sh`, which reminds once when a gate returned with no memory line after it |
|
|
204
|
+
| between stages | [`continuity.md`](plugins/task-pipeline/skills/task-pipeline/references/continuity.md) Part 3 — workflow memory through Observatory, a planned handoff (`stage_checkpoint.py handoff` / `accept`), and `hooks/memory-nudge.sh`, which reminds once when a gate returned with no memory line after it — unless the run recorded memory unavailable with `--for-run` |
|
|
205
205
|
|
|
206
206
|
**Ported, not depended on.** Stage 0 is adapted from
|
|
207
207
|
[Matt Pocock's `grilling` / `grill-with-docs`](https://github.com/mattpocock/skills)
|
|
@@ -471,6 +471,26 @@ close pass verifies, runs one fix round, updates the docs, re-measures the inven
|
|
|
471
471
|
and re-cuts what is left. The run takes the next wave without asking; a board too big
|
|
472
472
|
for one release becomes a program, carried on the canvas, never dropped.
|
|
473
473
|
|
|
474
|
+
**The project moves in releases, not fix by fix**
|
|
475
|
+
([`iteration.md`](plugins/task-pipeline/skills/task-pipeline/references/iteration.md)).
|
|
476
|
+
A finding joins the inventory; only a closed five-entry hotfix lane ships alone. Each
|
|
477
|
+
iteration runs in this order:
|
|
478
|
+
- the survey;
|
|
479
|
+
- module dossiers written in parallel, laid onto one canvas until a pass changes nothing;
|
|
480
|
+
- questions asked in rounds, never one at a time, while agents keep working;
|
|
481
|
+
- a parallel build, each node checked the moment it lands: one round of three blind
|
|
482
|
+
readings for every node, and two or three passing rounds by its risk class (R2, R3 — one
|
|
483
|
+
of the three recorded adversarial);
|
|
484
|
+
- one release, checked as released;
|
|
485
|
+
- the next pool, handed to you grouped by module.
|
|
486
|
+
|
|
487
|
+
Lessons carry over. Every install reads the project's retrospective, and keeps a local
|
|
488
|
+
index of every project's lessons on the machine (`scripts/lessons.py`), which stage 0
|
|
489
|
+
queries by the task's nouns. Where the session lists Project Observatory, agents also write
|
|
490
|
+
their lessons there — that works today. Reading them back from the store needs an engine
|
|
491
|
+
whose search filters by kind; until the session's engine has it, the ledger says
|
|
492
|
+
`shared lessons: unfilterable` and only the local index is read.
|
|
493
|
+
|
|
474
494
|
### Loop guard — churn is detected, not endured
|
|
475
495
|
|
|
476
496
|
Any repeating pass can start undoing the previous one: two shapes alternating, the
|
|
@@ -614,8 +634,8 @@ must say so.
|
|
|
614
634
|
### Held to Anthropic's own Skill authoring guidance
|
|
615
635
|
|
|
616
636
|
Audited against the four Agent Skills pages. Most of it already held — `name`
|
|
617
|
-
13/64 chars, `description`
|
|
618
|
-
|
|
637
|
+
13/64 chars, `description` 887/1024 chars, `SKILL.md` 272/500 lines, all 52 references
|
|
638
|
+
reachable from `SKILL.md` through explicit reference routes, and the bundle far under the 30 MB ceiling. What
|
|
619
639
|
did not, now does:
|
|
620
640
|
|
|
621
641
|
- **Every reference over 100 lines carries a `## Contents` list**, and the list is
|
|
@@ -874,8 +894,8 @@ npx github:ssheleg/task-pipeline # straight from GitHub
|
|
|
874
894
|
npx task-pipeline-skill # from the npm registry
|
|
875
895
|
```
|
|
876
896
|
(package is `task-pipeline-skill` — the unscoped `task-pipeline` name is taken
|
|
877
|
-
on npm; installs the same
|
|
878
|
-
idempotent, `--force` to overwrite)
|
|
897
|
+
on npm; installs the same three skills + `/task-pipeline` command into `~/.claude` as
|
|
898
|
+
the plain-skill path below, idempotent, `--force` to overwrite)
|
|
879
899
|
|
|
880
900
|
**Moving the paperwork off the legacy directory name — optional, always:**
|
|
881
901
|
```bash
|
|
@@ -902,9 +922,21 @@ Rules. The rule is self-contained (no external links), so it works copied anywhe
|
|
|
902
922
|
git clone https://github.com/ssheleg/task-pipeline
|
|
903
923
|
cd task-pipeline && ./install.sh
|
|
904
924
|
```
|
|
905
|
-
(copies the
|
|
906
|
-
|
|
907
|
-
`./install.sh --force`
|
|
925
|
+
(copies the plugin's three skills — `task-pipeline`, `evidence-docs`, `project-audit` —
|
|
926
|
+
into `~/.claude/skills/<name>` and the `/task-pipeline` command into
|
|
927
|
+
`~/.claude/commands/`; idempotent — rerun skips existing installs, `./install.sh --force`
|
|
928
|
+
overwrites. **What it cannot carry, and says so at the end of the run:** the role agents
|
|
929
|
+
(`plugins/task-pipeline/agents/`, which then run on the main thread) and the hooks
|
|
930
|
+
(`build-gate`, `gate-observer`, `memory-nudge`, `release-gate`, `run-lifecycle`, so the
|
|
931
|
+
gates are held by the doctrine and the run ledger rather than by the harness). Both
|
|
932
|
+
arrive only with the plugin above. Both installers refuse while the plugin is installed,
|
|
933
|
+
because a plain copy would shadow it.)
|
|
934
|
+
|
|
935
|
+
**Optional companion — Project Observatory.** Workflow checkpoints, planned handoffs
|
|
936
|
+
between executors and the shared lesson store come from a separately installed public
|
|
937
|
+
engine, [passioncode-ai/project-observatory-dashboard](https://github.com/passioncode-ai/project-observatory-dashboard)
|
|
938
|
+
(its README: *Install*, *MCP*). Without it every one of those degrades to one ledger line
|
|
939
|
+
and the run continues.
|
|
908
940
|
|
|
909
941
|
### Updating
|
|
910
942
|
|
|
@@ -929,8 +961,8 @@ the same Claude Code install yields a duplicate, shadowing skill.
|
|
|
929
961
|
| Claude Code (plugin) | `claude plugin marketplace update task-pipeline` → `claude plugin update task-pipeline@task-pipeline` → restart |
|
|
930
962
|
| Any agent (skills CLI) | `npx skills update task-pipeline --global --yes`; to add: repeated `--agent <name>` (never `claude-code` when the plugin is installed) |
|
|
931
963
|
| Cursor | skills CLI (above) with `--agent cursor`, or re-copy the `.mdc` per project |
|
|
932
|
-
| npm | `npx task-pipeline-skill@latest` / `npx github:ssheleg/task-pipeline`
|
|
933
|
-
| Plain skill | `git pull && ./install.sh --force` |
|
|
964
|
+
| npm | `npx task-pipeline-skill@latest --force` / `npx github:ssheleg/task-pipeline --force` — `--force` brings all three skills and the command to that version; without it an existing install is skipped, and a partial one is refused as mixed versions |
|
|
965
|
+
| Plain skill | `git pull && ./install.sh --force` (all three skills and the command) |
|
|
934
966
|
|
|
935
967
|
### Prerequisites
|
|
936
968
|
|
|
@@ -939,7 +971,7 @@ skill. Four optional companions make individual stages better:
|
|
|
939
971
|
|
|
940
972
|
| Companion | For | Required? |
|
|
941
973
|
|---|---|---|
|
|
942
|
-
| [super-ux](https://github.com/ssheleg/super-ux) | the stage-3 UX track |
|
|
974
|
+
| [super-ux](https://github.com/ssheleg/super-ux) | the stage-3 UX track | preferred provider; valid scenario artifact required for user-facing tasks |
|
|
943
975
|
| context7 (MCP) | stage-1 docs study | recommended — web-search fallback |
|
|
944
976
|
| [obsidian-wiki](https://github.com/ar9av/obsidian-wiki) | stage-0 harvest + stage-9 sync | recommended — never a gate |
|
|
945
977
|
| [graphify](https://github.com/Graphify-Labs/graphify) | stage-0 reach queries + stage-9 refresh + the graph↔docs divergence check | recommended — never a gate |
|
|
@@ -955,7 +987,18 @@ recommendation, so you arm the whole run in one exchange. Detail:
|
|
|
955
987
|
| File | What's in it |
|
|
956
988
|
|---|---|
|
|
957
989
|
| [`SKILL.md`](plugins/task-pipeline/skills/task-pipeline/SKILL.md) | the orchestrator: how to run, the stage table, the model decision |
|
|
958
|
-
| [`references/stages.md`](plugins/task-pipeline/skills/task-pipeline/references/stages.md) |
|
|
990
|
+
| [`references/stages.md`](plugins/task-pipeline/skills/task-pipeline/references/stages.md) | complete gate criteria and exact per-stage detail routes |
|
|
991
|
+
| [`references/stage-00-intake.md`](plugins/task-pipeline/skills/task-pipeline/references/stage-00-intake.md) | stage 0 procedure, read on entry or resume |
|
|
992
|
+
| [`references/stage-01-docs-study.md`](plugins/task-pipeline/skills/task-pipeline/references/stage-01-docs-study.md) | stage 1 procedure, read on entry or resume |
|
|
993
|
+
| [`references/stage-02-brainstorm.md`](plugins/task-pipeline/skills/task-pipeline/references/stage-02-brainstorm.md) | stage 2 procedure, read on entry or resume |
|
|
994
|
+
| [`references/stage-03-spec.md`](plugins/task-pipeline/skills/task-pipeline/references/stage-03-spec.md) | stage 3 procedure, read on entry or resume |
|
|
995
|
+
| [`references/stage-04-plan.md`](plugins/task-pipeline/skills/task-pipeline/references/stage-04-plan.md) | stage 4 procedure, read on entry or resume |
|
|
996
|
+
| [`references/stage-05-dev.md`](plugins/task-pipeline/skills/task-pipeline/references/stage-05-dev.md) | stage 5 procedure, read on entry or resume |
|
|
997
|
+
| [`references/stage-06-tests.md`](plugins/task-pipeline/skills/task-pipeline/references/stage-06-tests.md) | stage 6 procedure, read on entry or resume |
|
|
998
|
+
| [`references/stage-07-lint-deploy.md`](plugins/task-pipeline/skills/task-pipeline/references/stage-07-lint-deploy.md) | stage 7 procedure, read on entry or resume |
|
|
999
|
+
| [`references/stage-08-post-deploy.md`](plugins/task-pipeline/skills/task-pipeline/references/stage-08-post-deploy.md) | stage 8 procedure, read on entry or resume |
|
|
1000
|
+
| [`references/stage-09-docs-wiki.md`](plugins/task-pipeline/skills/task-pipeline/references/stage-09-docs-wiki.md) | stage 9 procedure, read on entry or resume |
|
|
1001
|
+
| [`references/stage-10-acceptance.md`](plugins/task-pipeline/skills/task-pipeline/references/stage-10-acceptance.md) | stage 10 procedure, read on entry or resume |
|
|
959
1002
|
| [`references/doctrine-map.md`](plugins/task-pipeline/skills/task-pipeline/references/doctrine-map.md) | which reference owns which stage — the map SKILL.md used to carry inline |
|
|
960
1003
|
| [`references/artifacts.md`](plugins/task-pipeline/skills/task-pipeline/references/artifacts.md) | the canonical document layout each stage writes to |
|
|
961
1004
|
| [`references/conventions.md`](plugins/task-pipeline/skills/task-pipeline/references/conventions.md) | how stages 6–10 read the host project's `CLAUDE.md`, and how the documentation regime is detected |
|
|
@@ -970,6 +1013,7 @@ recommendation, so you arm the whole run in one exchange. Detail:
|
|
|
970
1013
|
| [`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` and `hygiene.sh`, a worked hook |
|
|
971
1014
|
| [`references/adoption.md`](plugins/task-pipeline/skills/task-pipeline/references/adoption.md) | the first run in a project: greenfield seeding, and the brownfield walkthrough |
|
|
972
1015
|
| [`references/waves.md`](plugins/task-pipeline/skills/task-pipeline/references/waves.md) | wave mode: the whole board as one inventory, one canvas of the target state, one question batch, then waves that each close in one pass |
|
|
1016
|
+
| [`references/iteration.md`](plugins/task-pipeline/skills/task-pipeline/references/iteration.md) | release iteration: the loop around the waves — dossiers, integration until it converges, question rounds, checks as each node lands (R1–R3), one release checked as released, the next pool, the shared lesson store |
|
|
973
1017
|
| [`references/setup.md`](plugins/task-pipeline/skills/task-pipeline/references/setup.md) | the entry audit: seven passes over the docs a project already has, offered once, output as a fix plan |
|
|
974
1018
|
| [`references/portability.md`](plugins/task-pipeline/skills/task-pipeline/references/portability.md) | the manifest of workflow decisions and their homes in the bundle, and the boundary against a project's own answers |
|
|
975
1019
|
| [`references/learned.md`](plugins/task-pipeline/skills/task-pipeline/references/learned.md) | rules earned by failure on a real multi-repository build, each with its incident, its check and its exit criterion — the table is the count, and it grows |
|
package/SKILL-CARD.md
CHANGED
|
@@ -12,9 +12,9 @@ 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.95.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
|
-
| **Dependencies** | None required. Optional: `context7` (MCP), `figma` (MCP), super-ux, agent-sync, graphify, obsidian-wiki, and **one of two browser channels** — `playwright` (CLI or MCP) or `chrome-devtools` (MCP); either satisfies the browser step and neither is required. Every stage's doctrine ships in-repo;
|
|
17
|
+
| **Dependencies** | None required. Optional: `context7` (MCP), `figma` (MCP), super-ux, agent-sync, graphify, obsidian-wiki, and **one of two browser channels** — `playwright` (CLI or MCP) or `chrome-devtools` (MCP); either satisfies the browser step and neither is required. Every stage's doctrine ships in-repo; user-facing stage 3 requires a valid scenario artifact; super-ux is preferred, with equivalent-provider and inline-fallback paths under the provider contract |
|
|
18
18
|
| **Evaluation status** | Suite authored, 5 categories. One recorded run, **self-observed by the author**; **zero blind runs on zero of three models** — the split, and the numbers, live in [`evals/RESULTS.md`](evals/RESULTS.md) and are computed by `evals/run.py` |
|
|
19
19
|
|
|
20
20
|
## Risk-tier disclosure
|
package/bin/task-pipeline.js
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
/*
|
|
3
3
|
* task-pipeline installer CLI.
|
|
4
4
|
*
|
|
5
|
-
* Installs the
|
|
6
|
-
*
|
|
7
|
-
* install.sh)
|
|
5
|
+
* Installs the plugin's three skills (task-pipeline, evidence-docs,
|
|
6
|
+
* project-audit) into ~/.claude/skills/<name> and the /task-pipeline slash
|
|
7
|
+
* command into ~/.claude/commands/ (same layout as install.sh), and names the
|
|
8
|
+
* agents and hooks a plain copy cannot carry. Idempotent: existing installs are
|
|
9
|
+
* skipped unless --force.
|
|
8
10
|
*
|
|
9
11
|
* Zero dependencies, non-interactive. For other agents (Cursor, Codex, 70+)
|
|
10
12
|
* use: npx skills add ssheleg/task-pipeline
|
|
@@ -22,8 +24,10 @@ function usage() {
|
|
|
22
24
|
console.log(`task-pipeline installer
|
|
23
25
|
|
|
24
26
|
Usage:
|
|
25
|
-
npx task-pipeline-skill [--force] install
|
|
26
|
-
|
|
27
|
+
npx task-pipeline-skill [--force] install the three skills (task-pipeline,
|
|
28
|
+
evidence-docs, project-audit) + /task-pipeline
|
|
29
|
+
command into ~/.claude (skip existing unless
|
|
30
|
+
--force); agents and hooks need the plugin
|
|
27
31
|
npx task-pipeline-skill --help
|
|
28
32
|
|
|
29
33
|
npx task-pipeline-skill migrate-artifacts [--dry-run]
|
|
@@ -124,30 +128,38 @@ function installOne(label, src, dest, isDir, force) {
|
|
|
124
128
|
/**
|
|
125
129
|
* Say what this path does NOT install, and what runs instead.
|
|
126
130
|
*
|
|
127
|
-
* `agents/`
|
|
128
|
-
* and the command and nothing else. That is the design — the brief chose plugin
|
|
129
|
-
* with honest degradation — and it was silent, which is the part
|
|
130
|
-
* operator reading doctrine that names `task-pipeline:verifier`
|
|
131
|
-
*
|
|
131
|
+
* `agents/` and `hooks/` are Claude Code plugin capabilities; `main()` copies the three
|
|
132
|
+
* skills and the command and nothing else. That is the design — the brief chose plugin
|
|
133
|
+
* agents with honest degradation — and it was silent about the hooks, which is the part
|
|
134
|
+
* that was not. An operator reading doctrine that names `task-pipeline:verifier` or
|
|
135
|
+
* `hooks/memory-nudge.sh` would find a name that resolves to nothing. The notice lists
|
|
136
|
+
* the agents' count and every hook by name, says what runs instead, gives the plugin
|
|
137
|
+
* command, and points at the optional Observatory engine.
|
|
132
138
|
*/
|
|
133
139
|
function discloseAgents() {
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
+
const base = path.join(ROOT, 'plugins', 'task-pipeline');
|
|
141
|
+
const list = (dir, ext) => {
|
|
142
|
+
try { return fs.readdirSync(path.join(base, dir)).filter((f) => f.endsWith(ext)).sort(); }
|
|
143
|
+
catch (e) { return []; }
|
|
144
|
+
};
|
|
145
|
+
const agents = list('agents', '.md');
|
|
146
|
+
const hooks = list('hooks', '.sh').map((f) => f.replace(/\.sh$/, ''));
|
|
147
|
+
if (!agents.length && !hooks.length) return;
|
|
148
|
+
const lines = ['', 'Not installed — Claude Code plugin capabilities a plain copy cannot carry:'];
|
|
149
|
+
if (agents.length) {
|
|
150
|
+
lines.push(` - plugins/task-pipeline/agents/ (${agents.length} role agents): every role still runs, on the`,
|
|
151
|
+
' main thread instead of in its own context — context and speed, not doctrine.');
|
|
140
152
|
}
|
|
141
|
-
if (
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
);
|
|
153
|
+
if (hooks.length) {
|
|
154
|
+
lines.push(` - hooks: ${hooks.join(', ')}. Without them the gates`,
|
|
155
|
+
' are checked by the doctrine and the run ledger, not by the harness.');
|
|
156
|
+
}
|
|
157
|
+
lines.push(' For both, install the plugin instead (then remove these plain copies):',
|
|
158
|
+
` claude plugin marketplace add ${REPO}`,
|
|
159
|
+
' claude plugin install task-pipeline@task-pipeline',
|
|
160
|
+
' Optional companion for checkpoints, handoffs and shared lessons: Project Observatory,',
|
|
161
|
+
' https://github.com/passioncode-ai/project-observatory-dashboard (README: Install, MCP).');
|
|
162
|
+
console.log(lines.join('\n'));
|
|
151
163
|
}
|
|
152
164
|
|
|
153
165
|
function offerRouters() {
|
|
@@ -244,9 +256,15 @@ function main(argv) {
|
|
|
244
256
|
return 2;
|
|
245
257
|
}
|
|
246
258
|
|
|
247
|
-
|
|
259
|
+
// All three skills the plugin ships: task-pipeline names evidence-docs as its doc
|
|
260
|
+
// doctrine and runs project-audit as wave 0's sidecar (CHANGELOG, Unreleased).
|
|
261
|
+
const SKILLS = ['task-pipeline', 'evidence-docs', 'project-audit'];
|
|
262
|
+
const skillSrcs = SKILLS.map((s) => path.join(ROOT, 'plugins/task-pipeline/skills', s));
|
|
248
263
|
const cmdSrc = path.join(ROOT, 'plugins/task-pipeline/commands/task-pipeline.md');
|
|
249
|
-
|
|
264
|
+
// Every source is checked before anything is copied: a skill counts as present only
|
|
265
|
+
// with its SKILL.md, the same test install.sh makes.
|
|
266
|
+
for (const [p, what] of [...skillSrcs.map((p) => [path.join(p, 'SKILL.md'), 'skill sources']),
|
|
267
|
+
[cmdSrc, 'command source']]) {
|
|
250
268
|
if (!fs.existsSync(p)) {
|
|
251
269
|
console.error(`error: ${what} missing at ${p} — corrupted package?`);
|
|
252
270
|
return 1;
|
|
@@ -278,13 +296,26 @@ Rerun with --force if you deliberately want the plain copy instead.`);
|
|
|
278
296
|
return 3;
|
|
279
297
|
}
|
|
280
298
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
299
|
+
// Mixed versions: an earlier install left some of the three skills and not the others.
|
|
300
|
+
// Installing only the missing ones would pair skills from two releases — refuse, name both
|
|
301
|
+
// sets, and let --force bring all three to this version (install.sh does the same).
|
|
302
|
+
if (!force) {
|
|
303
|
+
const present = SKILLS.filter((s) => fs.existsSync(path.join(claude, 'skills', s)));
|
|
304
|
+
const absent = SKILLS.filter((s) => !present.includes(s));
|
|
305
|
+
if (present.length && absent.length) {
|
|
306
|
+
console.error(`refusing: mixed versions — ${present.join(', ')} already installed, ` +
|
|
307
|
+
`${absent.join(', ')} not. Rerun with --force to install all three at this ` +
|
|
308
|
+
'version. Nothing was written.');
|
|
309
|
+
return 4;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
SKILLS.forEach((s, i) => installOne(
|
|
313
|
+
`${s} skill`.padEnd(22),
|
|
314
|
+
skillSrcs[i],
|
|
315
|
+
path.join(claude, 'skills', s),
|
|
285
316
|
true,
|
|
286
317
|
force
|
|
287
|
-
);
|
|
318
|
+
));
|
|
288
319
|
installOne(
|
|
289
320
|
'/task-pipeline command',
|
|
290
321
|
cmdSrc,
|
|
@@ -8,7 +8,7 @@ alwaysApply: false
|
|
|
8
8
|
Self-contained rule (Cursor copies this file into projects — no external links).
|
|
9
9
|
Run a substantial task through an up-front **intake grill + 10 gated stages**. No
|
|
10
10
|
stage advances until its **gate** passes. Each gate is `auto` (verify it yourself,
|
|
11
|
-
pass/fail) or `manual` (
|
|
11
|
+
pass/fail) or `manual` (the user's explicit go or specific standing authorization naming the act).
|
|
12
12
|
|
|
13
13
|
**No companion skill is required.** Every rule below is the doctrine itself — the
|
|
14
14
|
grill, the design gate, the plan format, the build loop and TDD. Nothing to
|
|
@@ -220,7 +220,12 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
|
|
|
220
220
|
in one pass (wave 1 the walking skeleton, exit criteria named first); stages 5–8
|
|
221
221
|
run per wave with a close pass after each — verify, one fix round, docs,
|
|
222
222
|
re-measure, re-cut — and 9–10 close the release. No wave builds a shape a later
|
|
223
|
-
wave undoes.
|
|
223
|
+
wave undoes. **Around the waves runs the release iteration** ("release iteration" /
|
|
224
|
+
"итерация релиза"): module dossiers integrated into one canvas, questions in batches,
|
|
225
|
+
each node verified as it lands in one to three rounds by its risk class (R1–R3), a
|
|
226
|
+
wave's stage 7 integrated without tagging, one release gated and verified as
|
|
227
|
+
released, the next pool handed back; a finding made mid-iteration joins the
|
|
228
|
+
inventory rather than being fixed alone.
|
|
224
229
|
3. **Spec** (manual) — write and commit the design; lock every shared contract
|
|
225
230
|
(types, schemas, signatures, file layout) plus a **Global Constraints** block of
|
|
226
231
|
exact values every later task inherits. Self-review it for placeholders,
|
|
@@ -509,9 +514,9 @@ type the run produced, then run the documentation gate and print its ratchet cou
|
|
|
509
514
|
|
|
510
515
|
**Axis A — the stage gate type.** `auto` = verify the check yourself and stop on
|
|
511
516
|
fail; `judgment` = a named judge rules where no deterministic check exists, and the
|
|
512
|
-
ruling is recorded as judgement, never as a measurement; `manual` =
|
|
513
|
-
|
|
514
|
-
|
|
517
|
+
ruling is recorded as judgement, never as a measurement; `manual` = an explicit
|
|
518
|
+
operator go or specific standing authorization naming this act. Cite its source and scope;
|
|
519
|
+
otherwise wait. Neither an auto/judgment result nor a generic loop flag supplies authority.
|
|
515
520
|
|
|
516
521
|
**Axis B — where the rule is actually enforced**, and a rule climbs this ladder
|
|
517
522
|
rather than starting at the top: doctrine line → review question at a named gate →
|
package/evals/RESULTS.md
CHANGED
|
@@ -40,7 +40,7 @@ or it belongs in a check.
|
|
|
40
40
|
|
|
41
41
|
| Metric | Value | Computed by | As of |
|
|
42
42
|
|---|---|---|---|
|
|
43
|
-
| Evals authored |
|
|
43
|
+
| Evals authored | 48 (three suites: task-pipeline 30, evidence-docs 9, project-audit 9) | `python3 evals/run.py` → `suite: N evals` | 2026-10-12 |
|
|
44
44
|
| Categories covered | 5 of 5, per suite | the suite's own `category` fields | 2026-08-31 |
|
|
45
45
|
| Dated runs recorded | **4** | `python3 evals/run.py` → `recorded runs: N` | 2026-08-31 |
|
|
46
46
|
| …of those, **blind** | **3** | run headings not marked `self-observed` | 2026-08-31 |
|
|
@@ -295,6 +295,22 @@
|
|
|
295
295
|
],
|
|
296
296
|
"why": "Four PRs of check work merged on a review app's `skipping` with nobody noticing. A requested reader and a reader that reported are different facts that look identical afterwards."
|
|
297
297
|
},
|
|
298
|
+
{
|
|
299
|
+
"id": "INSTR-08",
|
|
300
|
+
"category": "instruction_following",
|
|
301
|
+
"skills": [
|
|
302
|
+
"task-pipeline"
|
|
303
|
+
],
|
|
304
|
+
"query": "close the whole board in waves: here is a repo whose docs/evidence/backlog.md has 12 open rows; two of them were already shipped last month",
|
|
305
|
+
"expected_behavior": [
|
|
306
|
+
"Builds ONE inventory by id (inventory/1) from every source before any design, and runs `scripts/waves.py validate` on it, so no row lands nowhere",
|
|
307
|
+
"Verifies each row against the code first: the two shipped rows are closed in the board with the receipt that shows them done, not carried into a wave",
|
|
308
|
+
"Assigns modules, nodes and waves with `waves.py assign` from two short tables, not by hand, and shows the counts per wave",
|
|
309
|
+
"Asks the operator in batches (rounds) with a recommendation per question, never one question at a time; never 'shall I continue?' between waves",
|
|
310
|
+
"Gives each node its own risk class (R1-R3), and starts a node's verification when it lands rather than waiting for the wave"
|
|
311
|
+
],
|
|
312
|
+
"why": "Wave mode had one trigger eval and no instruction case. An agent that reaches the mode but hand-edits the inventory, trusts stale rows or prompts between waves builds the intermediate states the mode exists to refuse."
|
|
313
|
+
},
|
|
298
314
|
{
|
|
299
315
|
"id": "NOTRIG-05",
|
|
300
316
|
"category": "should_not_trigger",
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-pipeline-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.95.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"
|
|
7
7
|
},
|
|
8
8
|
"scripts": {
|
|
9
|
-
"test": "python3 test/validate.py && python3 test/graph_test.py && python3 test/project_audit_test.py && python3 test/packet_schema_test.py && python3 test/browser_claims_test.py && python3 test/visual_gate_test.py && python3 test/stage_checkpoint_test.py && python3 test/backlog_sources_test.py && python3 test/release_approval_test.py && python3 test/memory_nudge_test.py && npm run test:audit-regressions",
|
|
10
|
-
"test:all": "python3 test/validate.py && python3 test/graph_test.py && python3 test/project_audit_test.py && python3 test/packet_schema_test.py && python3 test/browser_claims_test.py && python3 test/visual_gate_test.py && python3 test/stage_checkpoint_test.py && python3 test/backlog_sources_test.py && python3 test/release_approval_test.py && python3 test/memory_nudge_test.py && python3 test/negatives.py && npm run test:certify && npm run test:exposure && npm run test:probe && npm run test:anchors && npm run test:runner && npm run test:hooks && npm run test:artifacts && npm run test:docs && npm run test:audit-regressions",
|
|
9
|
+
"test": "python3 test/validate.py && python3 test/graph_test.py && python3 test/project_audit_test.py && python3 test/packet_schema_test.py && python3 test/browser_claims_test.py && python3 test/visual_gate_test.py && python3 test/stage_checkpoint_test.py && python3 test/backlog_sources_test.py && python3 test/release_approval_test.py && python3 test/memory_nudge_test.py && python3 test/lessons_test.py && python3 test/waves_test.py && python3 test/continuity_doc_test.py && bash test/install_test.sh && npm run test:audit-regressions",
|
|
10
|
+
"test:all": "python3 test/validate.py && python3 test/graph_test.py && python3 test/project_audit_test.py && python3 test/packet_schema_test.py && python3 test/browser_claims_test.py && python3 test/visual_gate_test.py && python3 test/stage_checkpoint_test.py && python3 test/backlog_sources_test.py && python3 test/release_approval_test.py && python3 test/memory_nudge_test.py && python3 test/lessons_test.py && python3 test/waves_test.py && python3 test/continuity_doc_test.py && bash test/install_test.sh && python3 test/negatives.py && npm run test:certify && npm run test:exposure && npm run test:probe && npm run test:anchors && npm run test:runner && npm run test:hooks && npm run test:artifacts && npm run test:docs && npm run test:audit-regressions",
|
|
11
11
|
"test:negatives": "python3 test/negatives.py",
|
|
12
12
|
"test:exposure": "python3 test/exposure_test.py",
|
|
13
13
|
"test:probe": "python3 test/probe.py --self-test",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "task-pipeline",
|
|
4
4
|
"displayName": "Task Pipeline",
|
|
5
5
|
"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/judgment/manual gates, a frozen requirement spine that closes with evidence, a work board and a verification ledger that outlive a run, an exposure line naming what shipped unconfirmed, a progress rail computed from the project's own config, a loop guard whose review ceiling measures rather than stops, and stage-3 tracks for what a product does, how it sounds and how it looks. Two modes need no task: `checkup` (what is unverified) and `setup` (audit existing docs); a third, `waves`, takes the whole board and closes it in waves that each finish in one pass. Retro insights can publish upstream as issues, opt-in and redacted.",
|
|
6
|
-
"version": "1.
|
|
6
|
+
"version": "1.95.0",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "ssheleg",
|
|
9
9
|
"url": "https://x.com/sshlg93"
|