task-pipeline-skill 1.33.0 → 1.38.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 (26) hide show
  1. package/CHANGELOG.md +332 -0
  2. package/CONTRIBUTING.md +66 -0
  3. package/README.md +23 -0
  4. package/SKILL-CARD.md +1 -1
  5. package/cursor/rules/task-pipeline.mdc +34 -9
  6. package/evals/task-pipeline.evals.json +87 -0
  7. package/package.json +3 -2
  8. package/plugins/task-pipeline/.claude-plugin/plugin.json +2 -2
  9. package/plugins/task-pipeline/commands/task-pipeline.md +167 -56
  10. package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +6 -5
  11. package/plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json +133 -21
  12. package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +12 -5
  13. package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +32 -3
  14. package/plugins/task-pipeline/skills/task-pipeline/references/continuity.md +10 -0
  15. package/plugins/task-pipeline/skills/task-pipeline/references/exposure.md +8 -1
  16. package/plugins/task-pipeline/skills/task-pipeline/references/gates.md +18 -0
  17. package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +10 -5
  18. package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +3 -1
  19. package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +52 -2
  20. package/plugins/task-pipeline/skills/task-pipeline/references/portability.md +1 -0
  21. package/plugins/task-pipeline/skills/task-pipeline/references/progress.md +190 -0
  22. package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +90 -4
  23. package/plugins/task-pipeline/skills/task-pipeline/references/review.md +56 -0
  24. package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +123 -12
  25. package/plugins/task-pipeline/skills/task-pipeline/templates/README.md +1 -0
  26. package/plugins/task-pipeline/skills/task-pipeline/templates/run.md +77 -0
@@ -8,12 +8,27 @@ operator's explicit go). These stages (0 intake + 1→10) are the plugin's
8
8
  `pipeline.schema.json`; a host project replaces it with its own
9
9
  stages/agents/types (see SKILL.md → *Bring your own skills*).
10
10
 
11
- ## The run checklist — copy it, tick it
11
+ ## The run checklist — printed, not remembered
12
12
 
13
- Complex workflows lose steps silently. Copy this into your response at the start of
14
- a run and check items off as they close; it is the cheapest guard against the one
15
- failure this pipeline keeps paying for — a stage that *looks* done because nothing
16
- printed.
13
+ Complex workflows lose steps silently. **The run says where it is**, at two boundaries
14
+ and only two — task start and iteration close ([`progress.md`](progress.md)):
15
+
16
+ ```
17
+ task-pipeline vX.Y.Z · <topic> · module <id> «<name>» (N of M)
18
+ 0 ✓ 1 ✓ 2 ✓ 3 ▶ 4 · 5 · 6 · 7 · 8 · 9 · 10 ·
19
+ ███████░░░░░░░░░░░░░░░░░░░ gates 3/11 · now 3 Spec · manual
20
+ board B-NNN · carry-over N rows · exposure N never · unlooked N
21
+ ```
22
+
23
+ The rail's positions come from the project's own `pipeline.json`, never from the count
24
+ below — those eleven are this plugin's example flow. Each glyph is read from the
25
+ verdict its gate wrote to `.task-pipeline/run.md`, and from nothing else: a rail
26
+ written from memory is a summary that is confidently wrong exactly where it is trusted
27
+ at a glance.
28
+
29
+ The checklist below is what that rail summarises. This section said *"copy it, tick
30
+ it"* until 2026-08-10 — an instruction with no gate behind it, which is the same
31
+ failure it was written to prevent, one level up.
17
32
 
18
33
  ```
19
34
  Pipeline progress
@@ -35,7 +50,7 @@ never that the work was skipped quietly.
35
50
 
36
51
  ## Contents
37
52
 
38
- - The run checklist — copy it, tick it
53
+ - The run checklist — printed, not remembered
39
54
  - 0 — Intake grill — MANDATORY
40
55
  - 1 — Docs study
41
56
  - 2 — Brainstorm + decompose
@@ -86,9 +101,11 @@ never that the work was skipped quietly.
86
101
  when one is built ([`knowledge-graph.md`](knowledge-graph.md): `graphify query` /
87
102
  `affected` / `god-nodes` answer *reach*, which is what grep cannot), `CLAUDE.md`,
88
103
  `CONTEXT.md`/ADRs, `docs/` + `docs/ux/`, past pipeline briefs and carry-over
89
- ledgers, **the retro's standing instructions** (`docs/superpowers/retro.md`, read
90
- **in full** — they are capped at ten and they bind this run; stamp each one as it
91
- fires, [`retrospective.md`](retrospective.md)), the **knowledge wiki** if one is
104
+ ledgers, **the retro's standing instructions and run stamps** (`docs/superpowers/retro.md`,
105
+ read **in full** — ten rows and one line per run, both bounded, and they bind this
106
+ run; stamp each instruction as it fires. Its *Recent log* is **queried** by the
107
+ task's nouns, not read: uncapped narrative inside a binding source is what makes the
108
+ capped part get skimmed, [`retrospective.md`](retrospective.md)), the **knowledge wiki** if one is
92
109
  installed
93
110
  ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki) — recommended,
94
111
  never required), and any **other repo or hosted doc system the project names as
@@ -123,6 +140,27 @@ never that the work was skipped quietly.
123
140
  or they genuinely disagree and that is a decision. There is no fourth option, and
124
141
  starting on an unresolved divergence means building against a system that does
125
142
  not exist.
143
+ - **Phase 1d — the short-path triage: printed, proposed, never taken silently.** This
144
+ pipeline's own boundary exempts a typo, a one-line fix and a mechanical rename — and
145
+ nothing measured that until 2026-08-10, so the exemption depended on an agent
146
+ remembering it while eleven stages and four manual gates stood in front of a
147
+ one-paragraph edit. Three questions, each with something behind it:
148
+
149
+ ```
150
+ 1. files the request names, resolved git ls-files -- <paths> -> N
151
+ 2. any of them a public contract the version-synced surfaces,
152
+ pipeline.schema.json, the
153
+ command, the README -> yes/no
154
+ 3. behaviour a user or a caller observes changes -> yes/no
155
+ ```
156
+
157
+ Few files, no contract, no observable change ⇒ **propose** the short path: stages 1,
158
+ 2, 3 and 4 marked `⊘` with the triage answer as the reason, and 5→10 running
159
+ unchanged. **Propose, never take.** The answer goes in the brief's autonomy sweep and
160
+ silence takes the full flow — the same floor deploy authorization uses. The glyph is
161
+ what makes it safe: a skipped stage is printed on the rail **with its reason**
162
+ ([`progress.md`](progress.md)), and a skip nobody can see is indistinguishable from a
163
+ stage that was never entered.
126
164
  - **How it runs: [`grill.md`](grill.md)** — the full doctrine, built into this
127
165
  skill (nothing to install). In short: one question per turn, a recommended
128
166
  answer with each, explore the codebase before asking, depth-first through the
@@ -170,12 +208,22 @@ never that the work was skipped quietly.
170
208
  is now stale), no open contradictions, **every
171
209
  autonomy-sweep row is answered or explicitly marked "stop and ask here"**, the
172
210
  **REQ table is written and every row names its check**, the carry-over ledger is
173
- seeded, the model decision is recorded, and the operator confirms the brief. Stop when a
211
+ seeded, **`.task-pipeline/run.md` exists and the header block has been printed**
212
+ ([`progress.md`](progress.md)), the model decision is recorded, and the operator
213
+ confirms the brief. Stop when a
174
214
  re-scan surfaces no new branches (don't grill past diminishing returns;
175
215
  reversible calls can be deferred with a note). Only then start stage 1.
176
216
  - **The verification ledger is read.** `docs/superpowers/verification.md` — the harvest
177
217
  quotes **how many rows sit at `never`**, because that is the project's standing
178
218
  exposure and stage 0 is where it is cheapest to look ([`verification.md`](verification.md)).
219
+ - **The run ledger is seeded and the header block is printed** — in that order, before
220
+ the first grill question. `.task-pipeline/run.md` from
221
+ [`../templates/run.md`](../templates/run.md) is the record **two** mechanisms already
222
+ depended on and no run had ever written: [`loop-guard.md`](loop-guard.md) calls its
223
+ own churn detection mechanical and reads the `touch:` lines, and
224
+ [`progress.md`](progress.md) derives the rail and the iteration counter from the
225
+ `stage:` and `iter:` lines. The header goes out before the interview because a run
226
+ that announces its position only at the end announced it to nobody.
179
227
  - **The board is read, or seeded.** `docs/superpowers/backlog.md` ([`backlog.md`](backlog.md)) — its **open count is quoted in the brief**, measured by a command at the top of the run rather than inherited from the last run's report. Absent ⇒ seeded from the template and said so; an empty board and no board are the same thing to work on, and only one of them can be appended to.
180
228
 
181
229
  ## 1 — Docs study
@@ -256,6 +304,32 @@ never that the work was skipped quietly.
256
304
  never rebuild from scratch. If the chain already exists and is validated (e.g.
257
305
  the task entered from super-ux), just verify (linter green) and embed it into
258
306
  the spec; only build the parts that are missing.
307
+ - **COPY track — how it sounds.** Every string a product's user will read is written
308
+ through super-ux's `copywriting`, against the brand pack (`docs/brand/voice.md`,
309
+ `terminology.md`, `facts.md`). No pack ⇒ `/brand-init` **before** the first string,
310
+ not after: a voice reverse-engineered from copy already written is a description of
311
+ what happened, not a decision. In scope: interface strings, errors, empty states,
312
+ the landing, pricing, the user-facing changelog. **Out of scope, and saying so is
313
+ what keeps the track honest:** commit messages, PR descriptions, code comments, a
314
+ developer README, internal docs. Running a brand pack over a line in a contributors'
315
+ changelog is the fastest way to teach an agent to route around the track.
316
+ - **VISUAL track — how it looks.** Where the task has a visual surface, the visual
317
+ layer goes through `sheleg-design` ([`companion-skills.md`](companion-skills.md)):
318
+ tokens and themes, typography and rhythm, motion and how it degrades to rest, the
319
+ boundary with Figma (tokens as variables, never raw values carried across). Not
320
+ through it: a purely structural change — what sits where is the UX track's — text,
321
+ a backend, an internal script.
322
+ - **Each track's refusal is a sentence, never a silence.** *"Без дизайна" / "as is"*
323
+ ends the visual track; *"без бренда" / "draft"* ends the copy track. Either one is
324
+ the operator's to make and costs nothing — but it is **recorded in the brief and
325
+ said out loud in the close-out**, because a track skipped silently and a track that
326
+ ran are the same thing in a transcript. This is the `⊘` rule one layer up: a skip
327
+ nobody can see is indistinguishable from work that happened.
328
+ - **Three tracks, three questions, and they do not substitute for each other.** super-ux
329
+ decides what the interface must **do**; `copywriting` how it **sounds**;
330
+ `sheleg-design` how it **looks**. Until 2026-08-10 this stage named only the first,
331
+ so a run designed a flow, then wrote its strings by taste and picked its values at the
332
+ keyboard — and every gate in the pipeline reported green over both.
259
333
  - **Spec:** write the approved design to
260
334
  `docs/superpowers/specs/YYYY-MM-DD-<topic>-design.md` and commit it. Lock all
261
335
  shared contracts (types, schemas, signatures, file layout). For UI tasks the
@@ -274,7 +348,11 @@ never that the work was skipped quietly.
274
348
  (or an explicit v1-mode/tiny-project waiver by the operator). **With Figma on:
275
349
  the canonical record names one file, and every `screens.md` frame link carries
276
350
  that same `:fileKey`** — a string match, not a judgement; a differing key means
277
- the run drew in a second file nobody will open. No plan (stage 4)
351
+ the run drew in a second file nobody will open. **Every user-facing string went
352
+ through the COPY track or the refusal is recorded**, and **the visual layer went
353
+ through the VISUAL track or the refusal is recorded** — a recorded refusal passes
354
+ this gate and an unmentioned one does not, which is the only difference that matters.
355
+ No plan (stage 4)
278
356
  starts before this — the chain comes BEFORE interface.
279
357
 
280
358
  ## 4 — Plan
@@ -308,6 +386,16 @@ never that the work was skipped quietly.
308
386
  watch it fail → minimal impl → watch it pass → commit. Pin subagents to the
309
387
  run's confirmed model (`model-tiering.md`). The plan's parallel groups fan out
310
388
  **only** when each implementer gets its own worktree; otherwise sequential.
389
+ - **Web front end? The task's own surface is checked in a browser, not in the diff.**
390
+ Where `chrome-devtools` is connected ([`companion-skills.md`](companion-skills.md)):
391
+ after a task that changes a rendered surface, load it, take a snapshot and read the
392
+ console and the network log **before the task is marked DONE** — a component can be
393
+ correct and land under a fixed header, and a review of the diff cannot see that.
394
+ Absent, say the surface was verified by reading the diff and treat it as the weaker
395
+ claim it is. Stage 6 repeats this over the whole tree; this one catches it while the
396
+ implementer that wrote it is still dispatched. The matrix pointed this companion at
397
+ stages 5–6 from the day it was added and **this stage had never named it** — found by
398
+ the guard comparing the two, not by a reader.
311
399
  - **Integration closes the stage:** sync with the base branch, re-run the full suite
312
400
  on the result, land it the project's way (merge, or a PR — outward, so it needs a
313
401
  go), remove the worktree. Stages 7–9 act on the integrated result, so a branch the
@@ -370,6 +458,23 @@ never that the work was skipped quietly.
370
458
  tagging, the CI verdict for what was just pushed is READ, not assumed**
371
459
  ([`conventions.md`](conventions.md) → *The CI verdict*) — a tag on a commit whose
372
460
  run nobody read is how a red `main` ships.
461
+ - **The independent reader is dispatched by this stage, and read by its output**
462
+ ([`review.md`](review.md) → *The independent reader*). On any change that adds or
463
+ widens a check, the run dispatches a reader — a subagent it can watch, a bot whose
464
+ **verdict** it then reads, or a person — and records exactly one of three states
465
+ beside the verdict: `reader: N findings`, `reader: none found`, or `reader: NO READER
466
+ — <why>`. The third is printed, never omitted; a requested reader and a reading are
467
+ different facts that look identical afterwards. Four pull requests of check work once
468
+ merged on a bot's `skipping` with nobody noticing, which is why this is a stage rather
469
+ than a hope.
470
+ - **The review loop that lives here has a cap, and the cap is a measurement**
471
+ ([`loop-guard.md`](loop-guard.md) → *The review loop*). **3 rounds** per artifact by
472
+ default (`pipeline.json` → `run.review.maxRounds`); at the cap the run stops reviewing
473
+ and prints new-versus-self-inflicted per round, and either the numbers end it or the
474
+ operator continues it out loud. This stage's loop was capped by nothing until
475
+ 2026-08-10 and ran ten rounds twice in one programme, against a stated ceiling of two
476
+ re-entries per stage — the ceiling simply did not name a review round. Every finding
477
+ left open at the cap leaves as a board row with its evidence, never as a shrug.
373
478
 
374
479
  ## 8 — Post-deploy
375
480
  - **Freedom: medium** — where the logs live varies; 'clean boot or an honest degradation report' does not ([`gates.md`](gates.md) → *Axis C*).
@@ -545,7 +650,13 @@ never that the work was skipped quietly.
545
650
  list at or under its cap, every deletion logged in the archive with its commit,
546
651
  entries older than five run stamps rotated into `docs/superpowers/retro/`, the run
547
652
  stamped with its commit, every SHA in either file resolvable, and the
548
- counts printed beside this verdict**; **the documentation gate has been seen
653
+ counts printed beside this verdict**; **where `pipeline.json` → `retro.publish` is
654
+ set, the skill-level insight is published as an issue on the skill's repository —
655
+ its body printed in full first, the printed string and the sent string being one
656
+ string, and the five redaction rules applied
657
+ ([`retrospective.md`](retrospective.md) → *What may leave the project*). Absent, the
658
+ step does not exist and is not asked about: publishing to another repository is an
659
+ outward act and silence authorizes none**; **the documentation gate has been seen
549
660
  failing once against a planted defect and its ratchet counts are printed**
550
661
  ([`gates.md`](gates.md)); **every repository is closed — the parent included:
551
662
  `git submodule status` shows no `+`, each repo clean and pushed**; **every check this gate leans on has been seen failing
@@ -13,6 +13,7 @@ from `super-ux`.
13
13
  | `carryover.md` | `docs/superpowers/specs/YYYY-MM-DD-<topic>-carryover.md` | 0 seeds, all stages append, 10 reads |
14
14
  | `verification.md` | `docs/superpowers/verification.md` | 8 writes a row per shipped REQ, 10 requires it, a human fills `Human` |
15
15
  | `backlog.md` | `docs/superpowers/backlog.md` | 0 seeds when absent, any stage appends, 10 resolves and re-derives |
16
+ | `run.md` | `.task-pipeline/run.md` — **git-ignored**, one per run | 0 seeds it, every gate appends a verdict, every repeating pass a `touch:` line |
16
17
  | `context.md` | `CONTEXT.md` at the repo root (or per context) | 0 — grill, domain awareness |
17
18
  | `adr.md` | `docs/adr/NNNN-<slug>.md` | 0 — grill, hard-to-reverse decisions |
18
19
  | `docmap.md` | `docs/DOCMAP.md` — **one per project** | 0 — the documentation inventory |
@@ -0,0 +1,77 @@
1
+ # Run ledger — `.task-pipeline/run.md`
2
+
3
+ > **One file per run.** Seeded at stage 0, appended by every stage, never rewritten.
4
+ > Two readers depend on it and neither can work from the agent's memory: the skill's
5
+ > `references/loop-guard.md` reads the `touch:` lines to detect churn mechanically, and
6
+ > its `references/progress.md` reads the `stage:` verdicts and the `iter:` count to
7
+ > print the rail.
8
+ >
9
+ > **This file is the run's memory after a compaction.** Everything else about the
10
+ > run's position lives in a context window that will not survive one.
11
+
12
+ Run: `<topic>` · started `<YYYY-MM-DD>` · module map: `<path or "none">`
13
+
14
+ ## Lines
15
+
16
+ Append-only. Three shapes, and nothing else belongs here:
17
+
18
+ ```
19
+ stage: <id> <name> — gate <auto|manual> — verdict <pass|fail|skip> — <ISO-8601>
20
+ iter: <N> — item <B-NNN or task id> — closed at gate <stage id>
21
+ touch: <file> — pass <N> (<stage|round|module>) — reason: <finding id / gate item>
22
+ ```
23
+
24
+ - **`stage:`** — written when a gate **returns**, not when the stage is entered. The
25
+ rail's `✓` is derived from this line and from nothing else; a glyph set from memory
26
+ is a summary that is confidently wrong exactly when it matters.
27
+ - **`iter:`** — one line per iteration closed. The progress line's counter is
28
+ `grep -c '^iter:'`, never a number anyone remembers.
29
+ - **`touch:`** — one line per file per pass, and the reason names **what forced the
30
+ edit**: a finding id, a failed gate item, an operator instruction. *"Cleanup"*,
31
+ *"polish"* and *"while I was there"* are not reasons; they are churn with better
32
+ manners.
33
+
34
+ A `skip` verdict carries its reason on the same line — a skipped stage and a stage
35
+ never entered look identical from outside, and they mean opposite things.
36
+
37
+ ## Log
38
+
39
+ ```
40
+ stage: 0 Intake — gate manual — verdict pass — 2026-08-10T11:14Z
41
+ iter: 1 — item B-025 — closed at gate 0
42
+ stage: 1 Docs study — gate auto — verdict pass — 2026-08-10T11:31Z
43
+ touch: src/export.ts — pass 1 (stage 5) — reason: TASK-3
44
+ touch: src/export.ts — pass 2 (stage 5) — reason: F-014
45
+ touch: src/export.ts — pass 3 (stage 5) — reason: F-014
46
+ ```
47
+
48
+ The last two lines are a **trip**: the same file, two consecutive passes, the same
49
+ reason. `references/loop-guard.md` → *Detection* item 2 — the fix did not fix it, or
50
+ the two passes disagree about what *fixed* means. Stop editing and run the break
51
+ protocol; do not dispatch a fourth pass.
52
+
53
+ ## Why it is not the build ledger
54
+
55
+ `.task-pipeline/build/<plan>/progress.md` covers **one stage** — stage 5's tasks, and
56
+ whether a task was already dispatched (`references/build.md`). This file
57
+ covers **the run**: stage verdicts, iterations, and every repeating pass anywhere in
58
+ the pipeline, including the loops between stages that the build ledger cannot see.
59
+
60
+ Keeping them separate is deliberate. A run that has no stage-5 work still loops, still
61
+ re-enters stages and still needs a rail — and it would have no ledger at all if the
62
+ run's memory lived inside the build directory that stage 5 deletes.
63
+
64
+ ## What closes it, and what survives it
65
+
66
+ **This file is git-ignored** — `.task-pipeline/` is, and this lives inside it. It is
67
+ the run's working memory, not its record: it exists to survive a **compaction**, which
68
+ is a different problem from surviving the run.
69
+
70
+ So stage 10 **reads it and copies out what outlives the run** — the pass counts and
71
+ any loop-guard ruling go into the acceptance file and the retro stamp, which are
72
+ committed. What is not carried out is gone when the directory is cleared, and that is
73
+ the correct outcome for a `touch:` line whose finding has been closed.
74
+
75
+ Never treat it as evidence in a later run. A file that is not in git cannot be quoted
76
+ at a commit, and a claim nobody can navigate to is the thing this repository's
77
+ documentation canon exists to refuse.