task-pipeline-skill 1.94.1 → 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 (37) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/CONTRIBUTING.md +32 -0
  3. package/HOW-IT-WORKS.md +4 -3
  4. package/README.md +18 -7
  5. package/SKILL-CARD.md +2 -2
  6. package/package.json +1 -1
  7. package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
  8. package/plugins/task-pipeline/agents/verifier.md +1 -1
  9. package/plugins/task-pipeline/commands/task-pipeline.md +3 -2
  10. package/plugins/task-pipeline/hooks/release-gate.sh +1 -1
  11. package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +11 -9
  12. package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +1 -1
  13. package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +1 -1
  14. package/plugins/task-pipeline/skills/task-pipeline/references/browser.md +1 -1
  15. package/plugins/task-pipeline/skills/task-pipeline/references/certification.md +1 -1
  16. package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +3 -2
  17. package/plugins/task-pipeline/skills/task-pipeline/references/continuity.md +3 -1
  18. package/plugins/task-pipeline/skills/task-pipeline/references/doctrine-map.md +19 -2
  19. package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +1 -1
  20. package/plugins/task-pipeline/skills/task-pipeline/references/portability.md +12 -1
  21. package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +7 -5
  22. package/plugins/task-pipeline/skills/task-pipeline/references/stage-00-intake.md +158 -0
  23. package/plugins/task-pipeline/skills/task-pipeline/references/stage-01-docs-study.md +10 -0
  24. package/plugins/task-pipeline/skills/task-pipeline/references/stage-02-brainstorm.md +52 -0
  25. package/plugins/task-pipeline/skills/task-pipeline/references/stage-03-spec.md +66 -0
  26. package/plugins/task-pipeline/skills/task-pipeline/references/stage-04-plan.md +11 -0
  27. package/plugins/task-pipeline/skills/task-pipeline/references/stage-05-dev.md +55 -0
  28. package/plugins/task-pipeline/skills/task-pipeline/references/stage-06-tests.md +11 -0
  29. package/plugins/task-pipeline/skills/task-pipeline/references/stage-07-lint-deploy.md +15 -0
  30. package/plugins/task-pipeline/skills/task-pipeline/references/stage-08-post-deploy.md +29 -0
  31. package/plugins/task-pipeline/skills/task-pipeline/references/stage-09-docs-wiki.md +45 -0
  32. package/plugins/task-pipeline/skills/task-pipeline/references/stage-10-acceptance.md +91 -0
  33. package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +43 -482
  34. package/plugins/task-pipeline/skills/task-pipeline/references/verification.md +1 -1
  35. package/plugins/task-pipeline/skills/task-pipeline/scripts/graph.py +1 -1
  36. package/plugins/task-pipeline/skills/task-pipeline/scripts/stage_checkpoint.py +156 -33
  37. package/plugins/task-pipeline/skills/task-pipeline/templates/run.md +2 -2
package/CHANGELOG.md CHANGED
@@ -1,3 +1,43 @@
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
+
1
41
  ## v1.94.1 — 2026-10-13
2
42
 
3
43
  Records the missing retrospective declarations that stopped the v1.94.0 release
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
  |---|---|
@@ -634,8 +634,8 @@ must say so.
634
634
  ### Held to Anthropic's own Skill authoring guidance
635
635
 
636
636
  Audited against the four Agent Skills pages. Most of it already held — `name`
637
- 13/64 chars, `description` 887/1024 chars, `SKILL.md` 270/500 lines, all 41 references
638
- 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
639
639
  did not, now does:
640
640
 
641
641
  - **Every reference over 100 lines carries a `## Contents` list**, and the list is
@@ -971,7 +971,7 @@ skill. Four optional companions make individual stages better:
971
971
 
972
972
  | Companion | For | Required? |
973
973
  |---|---|---|
974
- | [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 |
975
975
  | context7 (MCP) | stage-1 docs study | recommended — web-search fallback |
976
976
  | [obsidian-wiki](https://github.com/ar9av/obsidian-wiki) | stage-0 harvest + stage-9 sync | recommended — never a gate |
977
977
  | [graphify](https://github.com/Graphify-Labs/graphify) | stage-0 reach queries + stage-9 refresh + the graph↔docs divergence check | recommended — never a gate |
@@ -987,7 +987,18 @@ recommendation, so you arm the whole run in one exchange. Detail:
987
987
  | File | What's in it |
988
988
  |---|---|
989
989
  | [`SKILL.md`](plugins/task-pipeline/skills/task-pipeline/SKILL.md) | the orchestrator: how to run, the stage table, the model decision |
990
- | [`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 |
991
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 |
992
1003
  | [`references/artifacts.md`](plugins/task-pipeline/skills/task-pipeline/references/artifacts.md) | the canonical document layout each stage writes to |
993
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 |
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.94.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; 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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeline-skill",
3
- "version": "1.94.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"
@@ -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.94.1",
6
+ "version": "1.95.0",
7
7
  "author": {
8
8
  "name": "ssheleg",
9
9
  "url": "https://x.com/sshlg93"
@@ -111,6 +111,6 @@ ledger exists to catch.
111
111
 
112
112
  ## Where the doctrine is
113
113
 
114
- `references/stages.md` → stage 8 for what verification means here;
114
+ `references/stage-08-post-deploy.md` for what verification means here;
115
115
  `references/verification.md` for the ledger your evidence lands in;
116
116
  `references/gates.md` for what a gate's exit code obliges.
@@ -35,8 +35,9 @@ naming the standard is one an operator can call out for missing it.
35
35
  - **Model.** Recommend the most capable one the environment offers, never a hardcoded
36
36
  id. Confirmed once, then the whole run uses it without re-asking.
37
37
  - **Companions.** Print the detection block once (`references/companion-skills.md`).
38
- Absent ones state their fallback; none is a gate except the stage-3 UX track on a
39
- user-facing task.
38
+ Absent ones state their fallback and name any unavailable check as NOT_RUN.
39
+ On user-facing tasks stage 3 gates the valid scenario artifact, not package
40
+ presence; use the provider rule in that reference.
40
41
 
41
42
  ## Stage 0 — the harvest, then the grill
42
43
 
@@ -118,7 +118,7 @@ def outward(tokens):
118
118
  if sub == "push":
119
119
  if any(a in ("--tags", "--follow-tags") for a in args):
120
120
  return "git push --tags"
121
- if any(a.startswith("refs/tags/") or re.fullmatch(r"v?\d+\.\d+\.\d+.*", a) for a in args):
121
+ if any(a.startswith("refs/tags/") or a.partition(":")[2].startswith("refs/tags/") or re.fullmatch(r"v?\d+\.\d+\.\d+.*", a) for a in args):
122
122
  return "git push <tag>"
123
123
  if t.endswith("gh") and rest[:2] == ["release", "create"]:
124
124
  return "gh release create"
@@ -59,9 +59,9 @@ the environment resolves.
59
59
  plugin, nothing to resolve at preflight and no version skew with someone else's
60
60
  repo. Stages 1 and 6–9 additionally run the *host's own* commands and optional
61
61
  tools, and **no stage blocks on an install** — stage 1 falls back to web search, the
62
- wiki and the code graph are recommendations. The **one** exception is deliberate and
63
- named: on a user-facing task the stage-3 UX track requires super-ux, and the spec
64
- gate stops until it is installed.
62
+ wiki and the code graph are recommendations. On user-facing tasks stage 3 requires
63
+ a valid scenario artifact; the provider rule below governs equivalent providers
64
+ and the inline fallback.
65
65
 
66
66
  Which reference owns which stage — all forty-odd of them, by stage number:
67
67
  [`references/doctrine-map.md`](./references/doctrine-map.md).
@@ -153,12 +153,12 @@ before drawing, never invented by the drawing agent).
153
153
  autonomy sweep is covered, **the REQ table is
154
154
  written (one row per independently verifiable deliverable, each naming its
155
155
  check)** and the brief is locked
156
- (`references/stages.md` → 0). Do not touch stage 1 before the brief is
156
+ (`references/stage-00-intake.md`). Do not touch stage 1 before the brief is
157
157
  committed and confirmed. **Entered from super-ux?**
158
158
  (a validated `docs/ux/` chain and/or a `docs/ux/plans/…` fix plan already
159
159
  exists — super-ux's `/ux` hands off here) → don't re-grill or rebuild the UX
160
160
  chain: just check it's OK (`/ux-lint` green), confirm scope in one line, and
161
- skip ahead to the first stage with real work (see `references/stages.md` → 0).
161
+ skip ahead to the first stage with real work (see `references/stage-00-intake.md`).
162
162
  3. Walk stages 1→10 on the model confirmed at preflight. **Don't re-ask about the
163
163
  model at every boundary** — only when the operator recorded a per-stage override
164
164
  map and the next stage's entry differs (`references/model-tiering.md`).
@@ -193,7 +193,7 @@ before drawing, never invented by the drawing agent).
193
193
  unaccounted (`references/residue.md`). The rest are in
194
194
  [`references/gates.md`](references/gates.md) → *Cross-cutting, at every stage*.
195
195
 
196
- ## Stages (detail in `references/stages.md`)
196
+ ## Stages (gates and routes in `references/stages.md`)
197
197
 
198
198
  All stages run on the **one model confirmed at preflight** (default: the most
199
199
  capable available — see `references/model-tiering.md`).
@@ -213,9 +213,11 @@ capable available — see `references/model-tiering.md`).
213
213
  | 10 | **Acceptance** | the ladder walk ran and its absences became REQ rows; every REQ accounted for with evidence from a check seen failing once; no unresolved ledger row; **every repository clean, pushed and pointed at**; the hand-back written and the environment given back; the retrospective written **last**, and in order | manual |
214
214
 
215
215
  **Every gate above is the short form**, and the long form is the point of
216
- [`references/stages.md`](references/stages.md) — one section per stage. What the
217
- ladder walk is, which eight environment classes stage 10 enumerates, what makes an
218
- edge fake, why a `200` is not a working page: all there, none here.
216
+ [`references/stages.md`](references/stages.md) — one gate and exact detail route per
217
+ default stage. Before work on entry or resume, read that stage’s routed detail,
218
+ including waves and approved short paths; never preload all details. CUSTOM
219
+ profiles use their own declared doctrine; matching numeric ids do not select
220
+ default details. Full obligations stay in the spine and the selected detail.
219
221
 
220
222
  **Several repositories?** A submodule is finished when its parent says so — a clone
221
223
  can still get the commit before it while neither repository looks wrong alone. The
@@ -201,7 +201,7 @@ plugins/task-pipeline/
201
201
  audit.md # cross-cutting: the ladder + seams
202
202
  loop-guard.md # cross-cutting: churn detection
203
203
  progress.md # cross-cutting: what the run prints about itself
204
- stages.md model-tiering.md # gates, model policy
204
+ stages.md stage-*.md model-tiering.md # gates, per-stage detail, model policy
205
205
  conventions.md artifacts.md # host conventions, this layout
206
206
  companion-skills.md # optional companions + preflight
207
207
  templates/ # skeletons seeded into a host project
@@ -146,7 +146,7 @@ is either covered now or explicitly dropped by the operator, with the drop writt
146
146
  into the carry-over ledger. For a platform, the module map
147
147
  ([`decomposition.md`](decomposition.md)) is committed and approved as part of this
148
148
  same gate. Two more criteria close it, and the gate of record —
149
- [`stages.md`](stages.md) → *2 — Brainstorm + decompose* — states both in full:
149
+ [`stage-02-brainstorm.md`](stage-02-brainstorm.md) → *2 — Brainstorm + decompose* — states both in full:
150
150
  **the queue is an artifact rather than a recollection** (where it is a work graph,
151
151
  `graph.py validate` exits 0 and `graph.py coverage` names any requirement no node
152
152
  serves), and **the loop's arming state is printed** — armed with its queue and
@@ -169,7 +169,7 @@ having read no pixels at all. The **functional look** and the **visual half** ar
169
169
  checks; neither discharges the other.
170
170
 
171
171
  **When it runs, and when it gates — by the brief's `surface_class`**
172
- ([`stages.md`](stages.md) → stage 0, *The surface class*):
172
+ ([`stage-00-intake.md`](stage-00-intake.md) → *0 — Intake grill — MANDATORY*, the surface-class bullet):
173
173
 
174
174
  | Class | Visual half at stages 5–6 | Human pass at stage 10 |
175
175
  |---|---|---|
@@ -84,7 +84,7 @@ tier saw.
84
84
  | `visual` | the contact sheet, the director record, the project linter's output, the rubric | a frame that contradicts the record's intent; a gate item failing under a PASS; a hole in the state × axes matrix; a judge verdict from an uncalibrated judge |
85
85
 
86
86
  **When it runs.** A node that builds a user-facing surface copies the brief's
87
- `surface_class` ([`stages.md`](stages.md) → stage 0, *The surface class*). On
87
+ `surface_class` ([`stage-00-intake.md`](stage-00-intake.md) → *0 — Intake grill — MANDATORY*, the surface-class bullet). On
88
88
  **`flagship` and `product`** the `visual` report is **required** — `graph.py certify`
89
89
  refuses the round without it and names the tier. On `internal` and `ad` it is accepted
90
90
  when given and counted like any other tier, and not demanded: an internal tool's floor
@@ -287,7 +287,8 @@ Rules:
287
287
  nothing: **one self-observed run by the author, zero blind runs on zero models**, with
288
288
  a preflight that reported companion availability in detail and its own confidence not
289
289
  at all. A skill silent about its own evidence is read as tested.
290
- - **Never gate any stage on an install** except the stage-3 UX track on a UI task.
290
+ - **Never gate any stage on an install.** On UI tasks the stage-3 gate requires the
291
+ valid scenario artifact under the provider rule above, not a package.
291
292
  - Optional tools missing → state the fallback, don't block.
292
293
  - Re-detect after the operator installs; don't assume.
293
294
  - The model answer goes into the brief. Don't ask again per stage
@@ -342,5 +343,5 @@ Both notices live in the repo `LICENSE` → *Third-party*.
342
343
  ## Hand-off the other direction
343
344
 
344
345
  super-ux's `/ux` menu can hand off *to* this pipeline (its "execute autonomously"
345
- action). When entered that way the UX chain already exists — see `stages.md` → 0
346
+ action). When entered that way the UX chain already exists — see `stage-00-intake.md`
346
347
  *Entry-from-super-ux short-circuit*: verify, don't rebuild.
@@ -397,7 +397,9 @@ Project Observatory's memory tools, **every gate that returns also writes a work
397
397
  checkpoint**, and the next executor continues from the last finished stage.
398
398
 
399
399
  - **When.** After the `stage:` line is appended, every time a gate returns, whatever the verdict. A failed gate's checkpoint says `blocked` and keeps the stage open. Acceptance closes the workflow.
400
- - **How.** `scripts/stage_checkpoint.py emit` prints the tool's arguments, built from the ledger alone: the topic, the verdicts, the next stage, the operator's constraints and key names. Pass them to `observatory_checkpoint_write`, or to `memory.checkpoint.write` under memory/0.1. Then hand the answer to `stage_checkpoint.py record --answer -`.
400
+ - **How.** `scripts/stage_checkpoint.py emit` prints the tool's arguments, built from the ledger and selected project profile: the topic, observed verdicts, next declared stage, operator's constraints and key names. Pass them to `observatory_checkpoint_write`, or to `memory.checkpoint.write` under memory/0.1. Then hand the answer to `stage_checkpoint.py record --answer -`.
401
+ - **Profile authority.** `pipeline.json` at the project root owns stage order; only genuinely absent config selects the bundled default. Unreadable/malformed config, ambiguous numeric ledger ids, unsupported mandatory capabilities or a ledger stage outside the selected profile refuse before producing tool arguments. Optional ids use array ordinals, optional names use stable state labels; explicit ids retain declared array order. This reader does not execute gates or replace full preflight/schema validation. A final skipped stage stays open for confirmation, never inventing a successor or closing by inference.
402
+ - **Root and recovery.** The usual ledger stays `.task-pipeline/run.md`; `paths.artifacts` relocates project documents, not this run state. For a relocated ledger use `emit --ledger <path> --project-root <project>` (an enclosing Git root can also establish the project). The first emit saves the selected profile's source/digest and run identity beside the ledger; record retains them. Same-run profile changes, a missing formerly selected config, or a different run reusing that state refuse. Restore the selected source and retry, or reconcile the old workflow and start a distinct ledger/state for the new run; never delete a lease to make the check green. A pre-existing custom workflow with no profile binding also needs reconciliation. Ledger file symlinks and state-file links refuse without migration or overwrite; accepted directory aliases resolve consistently for emit, record, state and handoff. Profile, ledger and existing state inputs must be regular files, so a FIFO is refused before reading. No live checkpoint or read-attestation is proved by a locally emitted payload.
401
403
  - **The constraints.** Give the brief's restrictive rules once, as `--constraint`. They are carried to every later boundary, and a successor reads them first.
402
404
  - **Keys.** Pass keys by name, as `--credential PROJECT/ENV/NAME`, never as a value.
403
405
  - **Without the tools.** `stage_checkpoint.py record --unavailable "<why>"` appends one `event: memory — unavailable` line, and the run continues exactly as before. Missing memory is a state the ledger names, not a failure. When the tools are absent for the whole run — no Observatory on this machine — say it **once**: `record --unavailable "<why>" --for-run` appends one `unavailable for this run` line and leaves a marker in `.task-pipeline/memory.json`; no later gate is nudged or needs a line. Any later `record --answer` (the tools came back) clears the marker.
@@ -6,8 +6,9 @@ built-in doctrine lives, so an agent loads the one file the stage needs instead
6
6
  carrying the whole index in every turn.
7
7
 
8
8
  The rule the table serves stays in `SKILL.md`: every stage's doctrine ships inside this
9
- skill, no stage blocks on an install, and the single deliberate exception is the stage-3
10
- UX track on a user-facing task.
9
+ skill and no stage blocks on an install. The stage-3 UX gate on a user-facing task
10
+ requires a valid scenario artifact; [the provider rule](companion-skills.md) governs
11
+ the preferred provider, equivalent providers and inline fallback.
11
12
 
12
13
  ## Contents
13
14
 
@@ -15,8 +16,24 @@ UX track on a user-facing task.
15
16
 
16
17
  ## Which reference owns which stage
17
18
 
19
+ For the default profile, `references/stages.md` owns the full gates and exact
20
+ on-entry/resume route to each `references/stage-*.md` detail. Read the selected
21
+ stage detail before its work; this table routes additional subject doctrine.
22
+ Custom profiles use their own declared stages and doctrine, with the kernel intact.
23
+
18
24
  | Stage | Built-in doctrine |
19
25
  |---|---|
26
+ | 0 · Stage procedure | `references/stage-00-intake.md` |
27
+ | 1 · Stage procedure | `references/stage-01-docs-study.md` |
28
+ | 2 · Stage procedure | `references/stage-02-brainstorm.md` |
29
+ | 3 · Stage procedure | `references/stage-03-spec.md` |
30
+ | 4 · Stage procedure | `references/stage-04-plan.md` |
31
+ | 5 · Stage procedure | `references/stage-05-dev.md` |
32
+ | 6 · Stage procedure | `references/stage-06-tests.md` |
33
+ | 7 · Stage procedure | `references/stage-07-lint-deploy.md` |
34
+ | 8 · Stage procedure | `references/stage-08-post-deploy.md` |
35
+ | 9 · Stage procedure | `references/stage-09-docs-wiki.md` |
36
+ | 10 · Stage procedure | `references/stage-10-acceptance.md` |
20
37
  | 0, 9 · The documentation system | `references/documentation.md` |
21
38
  | any stage · The canons, and where each is enforced | [`evidence-docs`](../../evidence-docs/SKILL.md) — the sibling skill in this plugin |
22
39
  | 6–10 · Gates | `references/gates.md` |
@@ -179,7 +179,7 @@ explicit "stop and ask me here":
179
179
  | 0 Docs regime | where settled things live (the decision home — **one** per project, and an existing `docs/adr/` **is** it), who may write it, whether a lease mechanism is present or the run is `ungated`, the gate command and its ratchet floors, and whether this run may raise a floor ([`documentation.md`](documentation.md)) |
180
180
  | 1 Docs | external libs/APIs/SDKs in play; any private ones context7 can't resolve → where their docs live |
181
181
  | 2 Decompose | is this a platform (several capabilities/surfaces) or one module? if platform: deploy cadence — per module or once at the end |
182
- | 2–3 Spec | UI verdict (arms super-ux) **and the surface class** — `flagship`, `product`, `internal` or `ad`, which selects the visual gate profile ([`stages.md`](stages.md) → stage 0, *The surface class*); any scenario-tracing waiver |
182
+ | 2–3 Spec | UI verdict (arms super-ux) **and the surface class** — `flagship`, `product`, `internal` or `ad`, which selects the visual gate profile ([`stage-00-intake.md`](stage-00-intake.md) → *0 — Intake grill — MANDATORY*, the surface-class bullet); any scenario-tracing waiver |
183
183
  | 3 Design surface | UI tasks only: **Figma on or text-only** (super-ux's project-level choice, default on — check `docs/ux/foundation.md` → *Design tooling* before asking); is the Figma MCP connected; **and if it isn't — ship text-only, or stop here and connect it?** super-ux degrades to text-only on its own and never blocks, which means an unasked question here silently ships a UI feature with no mockups |
184
184
  | 3 Design file | Figma on only: **exactly which files — one per surface (App, Web, ASO) — in which team/org** — the recorded ones, or a URL the operator gives, or *create one in a named team* with that creation explicitly authorized. A destination decided at drawing time is how a project ends up with three "design" files and no way to tell which is real. See *The design destination* below |
185
185
  | 4–5 Dev | base branch; worktree/branch policy; is `main` off-limits; commit convention; task tracker |
@@ -39,8 +39,19 @@ a row pointing outside the bundle is the defect this file exists to catch.
39
39
 
40
40
  | Workflow decision | Home |
41
41
  |---|---|
42
+ | 0 · Stage procedure | `references/stage-00-intake.md` |
43
+ | 1 · Stage procedure | `references/stage-01-docs-study.md` |
44
+ | 2 · Stage procedure | `references/stage-02-brainstorm.md` |
45
+ | 3 · Stage procedure | `references/stage-03-spec.md` |
46
+ | 4 · Stage procedure | `references/stage-04-plan.md` |
47
+ | 5 · Stage procedure | `references/stage-05-dev.md` |
48
+ | 6 · Stage procedure | `references/stage-06-tests.md` |
49
+ | 7 · Stage procedure | `references/stage-07-lint-deploy.md` |
50
+ | 8 · Stage procedure | `references/stage-08-post-deploy.md` |
51
+ | 9 · Stage procedure | `references/stage-09-docs-wiki.md` |
52
+ | 10 · Stage procedure | `references/stage-10-acceptance.md` |
42
53
  | The stage list, ids, names, gate types | `pipeline.example.json` |
43
- | Per-stage criteria, freedom levels, the run checklist | `references/stages.md` |
54
+ | Full gates, freedom levels, the run checklist and exact stage-detail routes | `references/stages.md` |
44
55
  | Which reference owns which stage (the doctrine map) | `references/doctrine-map.md` |
45
56
  | What the intake grill asks, and the autonomy sweep | `references/grill.md` |
46
57
  | **The escalation boundary** — what an agent may settle alone | `references/grill.md` |
@@ -28,9 +28,12 @@ spec*.
28
28
 
29
29
  ## UX track (user-facing tasks only)
30
30
 
31
- Runs on **super-ux** — the one companion this pipeline recommends by name
32
- ([`companion-skills.md`](companion-skills.md)). If it isn't installed on a UI task,
33
- give the install line and stop; don't improvise a half-chain.
31
+ Apply [the artifact-provider contract](companion-skills.md): super-ux is the
32
+ preferred provider; equivalent artifacts or the inline fallback remain valid.
33
+ Missing or invalid scenario artifacts stop the gate, regardless of provider.
34
+ Record each unavailable check by name as NOT_RUN; do not claim a linter ran.
35
+ The following chain describes the super-ux provider when available. Other
36
+ providers owe the same scenario quality and traces, not these package commands.
34
37
 
35
38
  0. **The design destination is already decided — read it, don't re-open it.** When
36
39
  Figma is on, the stage-0 brief names the team/org and the files — one per surface
@@ -94,8 +97,7 @@ green over both.
94
97
  not checkable; a record is. The track writes a **director record** in the product's
95
98
  repository, beside `docs/ux/`: `docs/design/<surface>/director-record.md`, a header
96
99
  line `surface_class: <class>` and one `## <Field>` heading per field. Which fields are
97
- owed is the brief's `surface_class` ([`stages.md`](stages.md) → stage 0, *The surface
98
- class*):
100
+ owed is the brief's `surface_class` ([`stage-00-intake.md`](stage-00-intake.md) → *0 — Intake grill — MANDATORY*, the surface-class bullet):
99
101
 
100
102
  | Class | Fields the record owes |
101
103
  |---|---|
@@ -0,0 +1,158 @@
1
+ # Stage 0 detail
2
+
3
+ The full gate and freedom level remain in [stages.md](stages.md).
4
+
5
+ ## Contents
6
+
7
+ - 0 — Intake grill — MANDATORY
8
+
9
+ ## 0 — Intake grill — MANDATORY
10
+ - **Stage 0 is not optional and not skippable.** There is no "small enough task"
11
+ exemption, no "the request was already clear" exemption, no starting stage 1
12
+ "while the operator thinks". The only sanctioned bypass is the
13
+ entry-from-super-ux short-circuit below, and even that still requires a scope
14
+ confirmation and a record of what was adopted vs skipped. A run that reaches
15
+ stage 1 without a committed, operator-confirmed brief is a **failed run** —
16
+ stop and go back.
17
+ - **Entry-from-super-ux short-circuit (check FIRST).** task-pipeline is often
18
+ launched *from* super-ux — its `/ux` action menu offers "execute autonomously
19
+ via the task-pipeline plugin" once the UX chain (and often a
20
+ `docs/ux/plans/…` fix plan) is already built. Before grilling, detect that:
21
+ if `docs/ux/` already holds a validated chain (foundation → flows → screens →
22
+ scenarios) and/or a fresh fix plan, **do not re-run the grill or the stage-3
23
+ UX track from scratch.** Instead: (1) run a quick check — `/ux-lint`
24
+ (`docs/ux/lint.py`) green, chain present, plan (if any) readable; (2) confirm
25
+ the scope with the operator in ONE line; (3) skip to the first stage that
26
+ still has real work (usually stage 4 Plan if a UX fix plan already exists, or
27
+ stage 3 Spec to formalize it). Record what was adopted vs skipped. If the
28
+ check finds drift/gaps, fall back to the normal flow for the missing parts
29
+ only.
30
+ - **What (normal entry):** the operator's one-line task is almost never enough to
31
+ run autonomously. Before anything else, **grill the operator** to expand that
32
+ one line into a complete, unambiguous brief — resolve every decision branch
33
+ up front so stages 1→10 need no further human input beyond the manual gates.
34
+ This is input expansion, not design: turn "make me feature X" into locked
35
+ answers for scope, users, constraints, data, edge cases, done-criteria.
36
+ - **Phase 1 — harvest the knowledge sources FIRST**
37
+ ([`knowledge-sources.md`](knowledge-sources.md)). Before the first question:
38
+ query what the project already knows about this task — code, **the code graph**
39
+ when one is built ([`knowledge-graph.md`](knowledge-graph.md): `graphify query` /
40
+ `affected` / `god-nodes` answer *reach*, which is what grep cannot), `CLAUDE.md`,
41
+ `CONTEXT.md`/ADRs, `docs/` + `docs/ux/`, past pipeline briefs and carry-over
42
+ ledgers, **the retro's standing instructions and run stamps** (`<artifacts>/retro.md`,
43
+ read **in full** — ten standing rows and ten stamps, both bounded **by a cap**, and they bind this
44
+ run; stamp each instruction as it fires. Its *Recent log* is **queried** by the
45
+ task's nouns, not read: uncapped narrative inside a binding source is what makes the
46
+ capped part get skimmed, [`retrospective.md`](retrospective.md)), **lessons from other
47
+ projects** (source 7b, [`knowledge-sources.md`](knowledge-sources.md): `scripts/lessons.py
48
+ query` over the local index, then a shared store where the session lists one — each
49
+ layer's state printed in the source ledger), the **knowledge wiki** if one is
50
+ installed
51
+ ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki) — recommended,
52
+ never required), and any **other repo or hosted doc system the project names as
53
+ its docs**. Write the **source ledger** into the brief (a row per source, or an
54
+ explicit "none found"; **the graph's row carries its measured lag — commits and
55
+ days behind `HEAD`, the signal that measured it, and `⚠ not trusted for reach
56
+ until refreshed` on anything but `current`**
57
+ ([`knowledge-graph.md`](knowledge-graph.md) → *Measure the lag*; a build date is
58
+ the graph's own reply about itself, not a measurement of it). It is retrieval
59
+ scoped by the task's own nouns, not a read of everything — and it is what makes
60
+ phase 2's answers checkable instead of merely confident.
61
+ - **Phase 1b — the documentation inventory**
62
+ ([`documentation.md`](documentation.md)). Four questions, answered before the
63
+ interview and written to `docs/DOCMAP.md` (seeded from
64
+ [`../templates/docmap.md`](../templates/docmap.md), **only when absent**): where
65
+ do settled things live, what is each fact's single home, what does a change of
66
+ type X oblige, and what proves it. A project with no answers gets them seeded —
67
+ registers, the matrix and `scripts/check-docs.sh` — and the seeding is itself
68
+ recorded as the register's first entry. **One decision home per project:** an
69
+ existing `docs/adr/` *is* the register and is recorded as such, never duplicated.
70
+ The gate is seeded so that it exits `0` on its own seeds; a project that starts
71
+ red learns on day one that the gate is noise.
72
+ - **Phase 1b+ — offer the entry audit, once** ([`setup.md`](setup.md)). When
73
+ `docs/DOCMAP.md` is absent or its regime line predates the project's last release,
74
+ ask whether to audit the documentation that already exists **before** building on
75
+ it. Record the answer — including a refusal — in the brief's autonomy sweep and
76
+ never ask again. `audit.md`'s ladder runs at the *end* over the change; this runs
77
+ at the *start* over what is already there.
78
+ - **Phase 1c — reconcile intent against as-built.** Git says how it *should* be;
79
+ the run record says how it *turned out*. Read both for the area you are about to
80
+ touch and resolve every divergence — the document is stale, the record is wrong,
81
+ or they genuinely disagree and that is a decision. There is no fourth option, and
82
+ starting on an unresolved divergence means building against a system that does
83
+ not exist.
84
+ - **Phase 1d — the short-path triage: printed, proposed, never taken silently.** This
85
+ pipeline's own boundary exempts a typo, a one-line fix and a mechanical rename — and
86
+ nothing measured that until 2026-08-10, so the exemption depended on an agent
87
+ remembering it while eleven stages and four manual gates stood in front of a
88
+ one-paragraph edit. Three questions, each with something behind it:
89
+
90
+ ```
91
+ 1. files the request names, resolved git ls-files -- <paths> -> N
92
+ 2. any of them a public contract the surfaces the host's release
93
+ syncs, its schema or config
94
+ contracts, a shipped command,
95
+ its README -> yes/no
96
+ 3. behaviour a user or a caller observes changes -> yes/no
97
+ ```
98
+
99
+ Few files, no contract, no observable change ⇒ **propose** the short path: stages 1,
100
+ 2, 3 and 4 marked `⊘` with the triage answer as the reason, and 5→10 running
101
+ unchanged. **Propose, never take.** The answer goes in the brief's autonomy sweep and
102
+ silence takes the full flow — the same floor deploy authorization uses. The glyph is
103
+ what makes it safe: a skipped stage is printed on the rail **with its reason**
104
+ ([`progress.md`](progress.md)), and a skip nobody can see is indistinguishable from a
105
+ stage that was never entered.
106
+ - **How it runs: [`grill.md`](grill.md)** — the full doctrine, built into this
107
+ skill (nothing to install). In short: close what the sources can, then ONE batch
108
+ of the material unknowns, ordered by dependency, a recommended answer with each —
109
+ one at a time only where answers depend on each other or the operator asks;
110
+ contradictions reconciled on the spot; **every answer that touches
111
+ a harvested source is checked against it** — the operator outranks any document,
112
+ but only out loud, and the losing side is logged for the stage-9 doc update; plus
113
+ **domain awareness**
114
+ (challenge terms against `CONTEXT.md`, sharpen fuzzy language, stress-test with
115
+ concrete scenarios, cross-reference the code, record ADRs for hard-to-reverse
116
+ calls) and the **autonomy sweep** that pre-resolves every stage-1→10 blocker.
117
+ Deploy authorization has a hard floor there: a standing go counts only when it
118
+ names the target and the preconditions.
119
+ - **The run mode is settled here too** ([`continuity.md`](continuity.md)): does
120
+ the run advance item-by-item with no check-in between items, and on what
121
+ interval? Exactly three sources arm it: `pipeline.json` → `run.loop` (read
122
+ first — a recorded mode is the answer and is not re-asked), the operator's answer
123
+ here, or a standing instruction the host already carries. The ledger names which, once:
124
+ `loop: armed by <source:line>`. **Absent all three, it is off.** It buys pacing, never
125
+ authorization: no loop mode collapses a `manual` gate or an outward act. The
126
+ same file carries the other half of pacing — the context budget, which fires
127
+ only on a harness signal or the operator's word, never on an estimate.
128
+ - **UI early-detect:** one branch of the grill is always "does this touch a
129
+ user-facing surface (web/mobile/CLI/TUI)?". If yes → surface **super-ux**
130
+ now (use it if installed; otherwise give the install line — see SKILL.md
131
+ *Prerequisites*); this arms the stage-3 UX track. **And the same branch records
132
+ the surface's class** — the next bullet.
133
+ - **The surface class.** Every user-facing task's brief carries
134
+ `surface_class: flagship | product | internal | ad`, and the class selects the gate
135
+ profile the visual layer is held to for the rest of the run:
136
+
137
+ | Class | What it is | Director record (stage 3) | Visual half (stages 5–6) | Stage 10 |
138
+ |---|---|---|---|---|
139
+ | `flagship` | the surface a product is judged by — landing, onboarding, paywall, a hero screen | the full record | **gate**: full matrix, pairwise across every axis, the full rubric | approved contact sheet |
140
+ | `product` | an ordinary screen of the product | the short record — Brief, Mode, References, Markers, Open | **gate**: every state and the mandatory pairs; the gate items of the rubric | approved contact sheet |
141
+ | `internal` | an admin panel, an internal tool, a CLI | none owed | recommended; the project linter is the floor | the functional look |
142
+ | `ad` | a creative that runs as an advertisement or a store asset | Brief, Mode, References, Markers, ADA (its rubric profile and safe zones), Open | **gate**: the ad profile and the safe zones | approved contact sheet |
143
+
144
+ Ask it as one question with a recommended answer read off the request — a landing or a
145
+ paywall is `flagship` unless the operator says otherwise — and never leave it to stage
146
+ 5: a class decided at build time is decided by whoever wants the build to pass. A
147
+ work-graph node that builds the surface copies the class as `surface_class`, and
148
+ `graph.py certify` then owes the fourth, `visual` reading on `flagship` and `product`
149
+ ([`certification.md`](certification.md) → *The fourth reading*).
150
+ - **Artifact:** lock the resolved decisions into a **task brief** committed at
151
+ `<artifacts>/specs/YYYY-MM-DD-<topic>-brief.md` (scope, users/UI verdict and,
152
+ for a user-facing task, `surface_class`, constraints, assumptions, explicitly-deferred items, done-criteria) **plus the
153
+ autonomy sweep's per-stage answers and the model decision**. Seed it from
154
+ the skill's `templates/brief.md` skeleton — but only when absent, never
155
+ overwrite an existing brief. Stages 2–4 build on this brief; stages 5–10 read
156
+ its autonomy section instead of asking. Where the session produced them, also:
157
+ an updated `CONTEXT.md` (terms written as they resolved) and any ADRs under
158
+ `docs/adr/` — see `grill.md` → *Domain awareness*.