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.
Files changed (69) hide show
  1. package/CHANGELOG.md +145 -0
  2. package/CONTRIBUTING.md +32 -0
  3. package/HOW-IT-WORKS.md +4 -3
  4. package/README.md +59 -15
  5. package/SKILL-CARD.md +2 -2
  6. package/bin/task-pipeline.js +64 -33
  7. package/cursor/rules/task-pipeline.mdc +10 -5
  8. package/evals/RESULTS.md +1 -1
  9. package/evals/task-pipeline.evals.json +16 -0
  10. package/package.json +3 -3
  11. package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
  12. package/plugins/task-pipeline/agents/verifier.md +5 -2
  13. package/plugins/task-pipeline/commands/task-pipeline.md +25 -10
  14. package/plugins/task-pipeline/hooks/memory-nudge.sh +45 -3
  15. package/plugins/task-pipeline/hooks/release-gate.sh +1 -1
  16. package/plugins/task-pipeline/skills/evidence-docs/references/gates.md +6 -3
  17. package/plugins/task-pipeline/skills/evidence-docs/references/hooks.md +2 -1
  18. package/plugins/task-pipeline/skills/evidence-docs/references/retrospective.md +26 -1
  19. package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +24 -20
  20. package/plugins/task-pipeline/skills/task-pipeline/graph.schema.json +89 -4
  21. package/plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json +7 -0
  22. package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +1 -1
  23. package/plugins/task-pipeline/skills/task-pipeline/references/backlog.md +25 -0
  24. package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +1 -1
  25. package/plugins/task-pipeline/skills/task-pipeline/references/browser.md +1 -1
  26. package/plugins/task-pipeline/skills/task-pipeline/references/certification.md +46 -2
  27. package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +3 -2
  28. package/plugins/task-pipeline/skills/task-pipeline/references/continuity.md +97 -26
  29. package/plugins/task-pipeline/skills/task-pipeline/references/deploy-targets.md +30 -4
  30. package/plugins/task-pipeline/skills/task-pipeline/references/doctrine-map.md +20 -2
  31. package/plugins/task-pipeline/skills/task-pipeline/references/gates.md +6 -3
  32. package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +2 -2
  33. package/plugins/task-pipeline/skills/task-pipeline/references/hooks.md +2 -1
  34. package/plugins/task-pipeline/skills/task-pipeline/references/iteration.md +387 -0
  35. package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +1 -0
  36. package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +4 -1
  37. package/plugins/task-pipeline/skills/task-pipeline/references/portability.md +13 -1
  38. package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +26 -1
  39. package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +7 -5
  40. package/plugins/task-pipeline/skills/task-pipeline/references/stage-00-intake.md +158 -0
  41. package/plugins/task-pipeline/skills/task-pipeline/references/stage-01-docs-study.md +10 -0
  42. package/plugins/task-pipeline/skills/task-pipeline/references/stage-02-brainstorm.md +52 -0
  43. package/plugins/task-pipeline/skills/task-pipeline/references/stage-03-spec.md +66 -0
  44. package/plugins/task-pipeline/skills/task-pipeline/references/stage-04-plan.md +11 -0
  45. package/plugins/task-pipeline/skills/task-pipeline/references/stage-05-dev.md +55 -0
  46. package/plugins/task-pipeline/skills/task-pipeline/references/stage-06-tests.md +11 -0
  47. package/plugins/task-pipeline/skills/task-pipeline/references/stage-07-lint-deploy.md +15 -0
  48. package/plugins/task-pipeline/skills/task-pipeline/references/stage-08-post-deploy.md +29 -0
  49. package/plugins/task-pipeline/skills/task-pipeline/references/stage-09-docs-wiki.md +45 -0
  50. package/plugins/task-pipeline/skills/task-pipeline/references/stage-10-acceptance.md +91 -0
  51. package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +60 -475
  52. package/plugins/task-pipeline/skills/task-pipeline/references/verification.md +1 -1
  53. package/plugins/task-pipeline/skills/task-pipeline/references/waves.md +76 -36
  54. package/plugins/task-pipeline/skills/task-pipeline/references/work-graph.md +54 -5
  55. package/plugins/task-pipeline/skills/task-pipeline/scripts/backlog_sources.py +54 -13
  56. package/plugins/task-pipeline/skills/task-pipeline/scripts/context_packets.py +3 -3
  57. package/plugins/task-pipeline/skills/task-pipeline/scripts/graph.py +205 -22
  58. package/plugins/task-pipeline/skills/task-pipeline/scripts/lessons.py +1137 -0
  59. package/plugins/task-pipeline/skills/task-pipeline/scripts/stage_checkpoint.py +264 -44
  60. package/plugins/task-pipeline/skills/task-pipeline/scripts/waves.py +546 -0
  61. package/plugins/task-pipeline/skills/task-pipeline/templates/README.md +6 -0
  62. package/plugins/task-pipeline/skills/task-pipeline/templates/backlog-sources.schema.json +96 -0
  63. package/plugins/task-pipeline/skills/task-pipeline/templates/canvas.md +97 -0
  64. package/plugins/task-pipeline/skills/task-pipeline/templates/dossier.md +82 -0
  65. package/plugins/task-pipeline/skills/task-pipeline/templates/inventory.schema.json +94 -0
  66. package/plugins/task-pipeline/skills/task-pipeline/templates/lesson.schema.json +221 -0
  67. package/plugins/task-pipeline/skills/task-pipeline/templates/questions.md +45 -0
  68. package/plugins/task-pipeline/skills/task-pipeline/templates/retro.md +4 -0
  69. 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** — the single exception being the stage-3 UX track on
69
- user-facing work, where shipping without it is a decision someone has to make out
70
- loud.
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. The one exception is deliberate and named: on a
171
- user-facing task the stage-3 UX track requires super-ux, and the spec gate stops
172
- until it is installed.
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` 890/1024 chars, `SKILL.md` 268/500 lines, all 40 references
618
- linked **directly** from `SKILL.md`, and the bundle far under the 30 MB ceiling. What
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 skill + `/task-pipeline` command into `~/.claude`,
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 skill into `~/.claude/skills/task-pipeline` and the `/task-pipeline`
906
- command into `~/.claude/commands/`; idempotent — rerun skips existing installs,
907
- `./install.sh --force` overwrites)
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` (ephemeral — always latest) |
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 | only for user-facing tasks |
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) | per-stage detail and the exact gate criteria |
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.93.3 |
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; the one conditional requirement is super-ux for the stage-3 UX track on a user-facing task |
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
@@ -2,9 +2,11 @@
2
2
  /*
3
3
  * task-pipeline installer CLI.
4
4
  *
5
- * Installs the task-pipeline skill into ~/.claude/skills/task-pipeline and
6
- * the /task-pipeline slash command into ~/.claude/commands/ (same layout as
7
- * install.sh). Idempotent: existing installs are skipped unless --force.
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 skill + /task-pipeline command
26
- into ~/.claude (skip existing unless --force)
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/` is a Claude Code plugin capability; `install()` copies the skill directory
128
- * and the command and nothing else. That is the design — the brief chose plugin agents
129
- * with honest degradation — and it was silent, which is the part that is not. An
130
- * operator reading doctrine that names `task-pipeline:verifier` finds a name that
131
- * resolves to nothing and no explanation anywhere in what they ran.
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 dir = path.join(ROOT, 'plugins', 'task-pipeline', 'agents');
135
- let files = [];
136
- try {
137
- files = fs.readdirSync(dir).filter((f) => f.endsWith('.md'));
138
- } catch (e) {
139
- return; // no agents shipped: nothing to disclose
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 (!files.length) return;
142
- console.log(
143
- `\nNot installed: plugins/task-pipeline/agents/ (${files.length} file(s)).\n` +
144
- ' Role agents are a Claude Code plugin capability; this path installs the skill\n' +
145
- ' and the command only. Every role still runs — on the main thread instead of in\n' +
146
- ' its own context, which costs context and speed, not doctrine.\n' +
147
- ' For the agent-backed version, install the plugin:\n' +
148
- ` claude plugin marketplace add ${REPO}\n` +
149
- ' claude plugin install task-pipeline@task-pipeline'
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
- const skillSrc = path.join(ROOT, 'plugins/task-pipeline/skills/task-pipeline');
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
- for (const [p, what] of [[skillSrc, 'skill sources'], [cmdSrc, 'command source']]) {
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
- installOne(
282
- 'task-pipeline skill ',
283
- skillSrc,
284
- path.join(claude, 'skills', 'task-pipeline'),
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` (wait for the user's explicit go).
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` = wait for an
513
- explicit operator go. Neither of the first two ever substitutes
514
- for a required manual approval.
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 | 47 (three suites: task-pipeline 29, evidence-docs 9, project-audit 9) | `python3 evals/run.py` → `suite: N evals` | 2026-10-11 |
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.93.3",
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.93.3",
6
+ "version": "1.95.0",
7
7
  "author": {
8
8
  "name": "ssheleg",
9
9
  "url": "https://x.com/sshlg93"