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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,337 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.38.0 — the wall came down, and a green started meaning something
4
+
5
+ An audit of this skill measured nineteen problems and asked one question of all of them:
6
+ *why can an agent that follows every rule here still report work it did not do?* The
7
+ answers were not in the doctrine. They were in how much of it there is, how it is
8
+ delivered, and what nobody checks.
9
+
10
+ ### The wall
11
+
12
+ `commands/task-pipeline.md` — the first text an agent reads when the skill fires — was
13
+ **one paragraph of 1281 words carrying 25 obligations, with a 4115-character line**.
14
+ Twenty-five duties in one breath: which of them an agent obeys is a function of position,
15
+ not importance.
16
+
17
+ Same doctrine, eight headed sections, nothing removed:
18
+
19
+ ```
20
+ paragraphs 5 -> 34
21
+ longest paragraph 1281 words -> 295
22
+ longest line 4115 chars -> 261
23
+ ```
24
+
25
+ ### The trigger surface said nothing about two of the three modes
26
+
27
+ `setup` and `checkup` appeared in **no browsable surface** — not the skill description,
28
+ not the command description, neither manifest. `checkup` exists specifically to be run
29
+ when nothing else is; the only way to learn it existed was to open the file you open by
30
+ running the thing it replaces.
31
+
32
+ The description was also at **1015 of its 1024-character ceiling**, with ~40% spent on
33
+ mechanism prose that cannot affect routing. Cut, both modes named, and it now sits at
34
+ 956 with room to grow. Both manifests described the product as it stood at v1.30 — seven
35
+ releases of capability absent from the only text a marketplace shows.
36
+
37
+ **The plan proposed separate command files for the two modes and the doctrine refused
38
+ it.** `exposure.md` says *a mode of the command, not a new command, because a second
39
+ command costs every surface a command touches*. The doctrine is older than the plan and
40
+ it won.
41
+
42
+ ### `test/probe.py` — R-001's retirement condition, three years of releases late
43
+
44
+ The standing instruction R-001 has said since 2026-08-03: *prove the plant landed in the
45
+ text the check actually parses.* Its retirement condition, written at birth, was **"a
46
+ probe harness exists that asserts the plant changed the parsed text"**. It was never
47
+ built, and three probes failed in a single day for want of it.
48
+
49
+ Three assertions per plant, and the third is the one hand-rolled probes keep missing:
50
+
51
+ 1. the substitution **landed** — `replace` matching nothing raises nothing;
52
+ 2. the exit code is **non-zero** — never a `FAIL` line on stdout;
53
+ 3. **the guard that fired is the guard under test**, named up front rather than
54
+ recognised afterwards. A plant that trips some *other* check has proved that other
55
+ check works.
56
+
57
+ The harness self-tests its own failure branches (`npm run test:probe`), because a
58
+ harness whose failure path has never executed is exactly what it exists to stop. **On its
59
+ first use it caught two of this release's own guards being too loose** — one accepted any
60
+ three reader states rather than requiring the load-bearing one, and one matched
61
+ `none found` against a coincidental sentence in another paragraph.
62
+
63
+ ### The independent reader is now dispatched by a stage, and read by its output
64
+
65
+ R-005 requires an independent reader on any change that adds or widens a check. Four pull
66
+ requests of almost nothing but check work were opened in one day; the review app reported
67
+ **`skipping`** on every one, and twenty-two guards merged on author probes alone. Nothing
68
+ was violated. Nothing read the reviewer's output either.
69
+
70
+ Stage 7 now dispatches the reader — a subagent it can watch, a bot whose **verdict** it
71
+ then reads, or a person — and records exactly one of three states beside the gate:
72
+
73
+ ```
74
+ reader: 6 findings, 4 confirmed
75
+ reader: none found
76
+ reader: NO READER — <why>
77
+ ```
78
+
79
+ The third is printed, never omitted. *A reader was requested* and *a reader reported* are
80
+ different facts that look identical in a transcript.
81
+
82
+ ### `learned.md` rule 22 — an operation that changed nothing reports like one that changed everything
83
+
84
+ Four incidents in two programmes, each invisible until something downstream failed: an
85
+ import that never landed, a doctrine phrase worded differently, a `gh` call refused behind
86
+ `>/dev/null`, and a test piped to `head` so `$?` belonged to `head`. **Assert the effect,
87
+ not the call.**
88
+
89
+ ### The retro's uncapped narrative stopped being read in full
90
+
91
+ The doctrine said stage 0 reads three sections of `docs/superpowers/retro.md` in full
92
+ because *"all three are bounded by construction, which is why the cap is not
93
+ negotiable."* Measured, that claim was false:
94
+
95
+ ```
96
+ Standing instructions ~ 1 394 tok capped at ten rows
97
+ Run stamps ~ 1 842 tok one line per run
98
+ Recent log ~10 937 tok narrative — capped by nothing ← 74% of the file
99
+ ```
100
+
101
+ An uncapped section inside a source that **binds** the run is precisely what makes the
102
+ capped part get skimmed. The log is now **queried by the task's nouns**, like the
103
+ archive; the instructions and the stamps are still read in full, because they are the
104
+ part that is actually bounded.
105
+
106
+ **Stage-0 reading floor: ~47 750 → ~36 950 tokens** from that one change.
107
+
108
+ **And the audit that found this over-claimed in the same paragraph.** Its own table said
109
+ `stages.md` was *"read in full at stage 0"*; grepping the obligation returns only the
110
+ retro. The report now says *the gates a run must satisfy*, which is weaker and true.
111
+
112
+ ### The preflight now says what has not been measured
113
+
114
+ It reported companion availability in careful detail and this skill's own evidence not at
115
+ all — while `evals/RESULTS.md` recorded **one self-observed run by the author and zero
116
+ blind runs on zero models**. A skill silent about its own evidence is read as tested, by
117
+ the bundle that demands evidence of everyone else. The line prints while no blind run is
118
+ recorded and disappears when one is; it is a state of the evidence, not a warning.
119
+
120
+ The suite itself was frozen at the v1.9 feature set — **zero cases** touching the board,
121
+ the verification ledger, the exposure line, the progress rail, `checkup`, `setup`,
122
+ `copywriting` or `sheleg-design`. Now **21 cases**, including the two no-task modes,
123
+ the three stage-3 tracks, the progress rail and run ledger, the dispatched reader, and a
124
+ question that must **not** trigger the pipeline at all.
125
+
126
+ Guards: 210 → **218**, property checks 8.
127
+
128
+ ## v1.37.0 — the audit, and the four things it found the pipeline could not say
129
+
130
+ One release, four modules, and an audit that put four questions to this pipeline and
131
+ answered them with measurements rather than opinion:
132
+
133
+ - **99 shipped REQ, 99 of them at `Human: never`** — nothing has ever been confirmed by
134
+ a person, and the exposure line has been saying so on every run.
135
+ - **`copywriting` appeared 0 times in the bundle and `sheleg-design` once**, as a name in
136
+ a README list.
137
+ - **The review loop ran ten rounds, ten, eight, four, three** against a stated ceiling of
138
+ two stage re-entries — because a review round was named in no cap at all.
139
+ - **Nothing ever printed which pipeline, which module, or which iteration was running.**
140
+ The run checklist existed and was marked *"copy it, tick it"*.
141
+
142
+ Guards: 188 → **210**, property checks 8. Every one watched failing against a planted
143
+ defect, and three of the probes were wrong before their guards were.
144
+
145
+ ### The lesson that stopped dying in the repository that learned it
146
+
147
+ `retrospective.md` has said *"open an issue upstream"* since v1.9.0 and named no
148
+ repository, no trigger and no authorization — an instruction on rung 1 that every reader
149
+ took for done. So a defect in **the skill** — a gate that loops, a doctrine promising
150
+ what nothing enforces, a rule firing on the wrong shape — was rediscovered independently
151
+ in every project that ran the pipeline and fixed in none of them.
152
+
153
+ **Opt-in, per project, off by default**, `pipeline.json` → `retro.publish`:
154
+
155
+ ```json
156
+ "retro": { "publish": { "repo": "…", "label": "retro-insight", "redact": "strict" } }
157
+ ```
158
+
159
+ Absent, nothing is published and nothing is asked. Opening an issue in another
160
+ repository is an **outward act**, and an outward act taken from a generic flag is one
161
+ nobody authorized — the same floor deploy authorization uses.
162
+
163
+ **The body is printed in full before it is sent, and the printed string and the sent
164
+ string are one string.** Redacting after the print, or printing a tidier version of what
165
+ actually goes out, is the false-success shape this bundle names outright: a mechanism
166
+ reporting on itself instead of on what it did.
167
+
168
+ **Five numbered redaction rules**, because *insight only* is not a specification. No host
169
+ paths — only paths inside task-pipeline itself. No host identifiers: repository,
170
+ organisation, branch, commit, tag, issue. No code, no config values, no data, not even
171
+ redacted. No names of any kind. And the title states the **class**, not the incident.
172
+ When in doubt the rule is subtraction: an insight that survives losing a detail is still
173
+ an insight, and a detail that leaks cannot be recalled from an index.
174
+
175
+ **Seven guards, and one of them was broken by the fence above.** The check that makes the
176
+ doctrine's own worked issue obey its own rules was silent against three separate plants —
177
+ an absolute path, a commit id, a foreign repository slug — because the fence scan matched
178
+ ` ``` ` followed by a newline, and the ```json block one paragraph up made every
179
+ subsequent fence pair with the wrong delimiter. Five fence scans across four modules had
180
+ the same bug; all are language-tolerant now, and the earlier modules' probes were re-run
181
+ to prove the change broke nothing (R-003: sweep the detector's siblings).
182
+
183
+ ### What it does, how it sounds, how it looks
184
+
185
+ The audit measured this one rather than argued it: **`copywriting` appeared zero times
186
+ in the whole bundle, and `sheleg-design` once — as a name in a list in the README.**
187
+ Meanwhile the companion matrix named six super-ux surfaces while super-ux shipped eight
188
+ skills and fifteen commands. So a run designed a flow, then wrote its interface strings
189
+ by taste and picked its visual values at the keyboard, and every gate in the pipeline
190
+ reported green over both.
191
+
192
+ **Stage 3 now runs three tracks, and none substitutes for another:**
193
+
194
+ | Track | Answers | Owner |
195
+ |---|---|---|
196
+ | UX | what the interface must **do** | super-ux — the WHY→UI→scenario chain |
197
+ | COPY | how it **sounds** | `copywriting`, against the brand pack |
198
+ | VISUAL | how it **looks** | `sheleg-design` — tokens, themes, rhythm, motion |
199
+
200
+ Each carries its boundary in both directions, because a track that over-reaches is
201
+ routed around. The copy track takes interface strings, errors, empty states, the
202
+ landing, the user-facing changelog — and explicitly **not** commit messages, PR text,
203
+ code comments or a developer README. The visual track takes the visual layer and
204
+ explicitly **not** a purely structural change, which is the UX track's.
205
+
206
+ **A refusal is a sentence, never a silence.** *"as is"* ends the visual track and
207
+ *"draft"* ends the copy track; either is the operator's call and costs nothing. But it
208
+ is recorded in the brief and said in the close-out, because a track skipped in silence
209
+ and a track that ran are identical afterwards — the `⊘` rule one layer up.
210
+
211
+ **`sheleg-design` joins the matrix and the preflight**, and super-ux's row finally names
212
+ its copy half.
213
+
214
+ **The new guard found a live defect on the clean tree before it found anything else.**
215
+ It compares the matrix's *"needed for stage N"* cell against what that stage actually
216
+ says, and reported that `chrome-devtools` had been pointed at **stages 5–6 since the day
217
+ it was added, with stage 5 never naming it**. Fixed here: stage 5 now checks a rendered
218
+ surface per task, while the implementer that wrote it is still dispatched.
219
+
220
+ **And a probe found a hole in its own guard.** Removing `copywriting` from stage 3 left
221
+ the check silent, because it reads matrix **row names** and the copy half lives inside
222
+ super-ux's own cell — precisely where it had been invisible all along. A second, narrow
223
+ check now covers the three tracks by name. It is narrow on purpose: generalising the
224
+ sub-skill mapping would demand stage 3 name `/brand-lint` and `ux-audit` too, and a
225
+ check that over-reaches is switched off by the third person who hits it.
226
+
227
+ ### The loop that had no ceiling, the exemption nobody measured
228
+
229
+ Three findings from the same audit, all of them gates behaving as prose.
230
+
231
+ **The review loop was capped by nothing.** `build.md` caps the stage-5 fix loop at five
232
+ rounds per task and `loop-guard.md` caps stage re-entries at two — and a review round is
233
+ neither, so nothing counted them. The run stamps say what that cost: **ten rounds, ten,
234
+ eight, four, three**, in one programme.
235
+
236
+ **A flat cap would have been the wrong fix**, and this is the part worth keeping. Every
237
+ one of those runs recorded *"none from my probes"* beside its count — the reader was
238
+ still finding real defects on round nine. Stopping at two would have shipped them. So
239
+ the cap is a **decision point**: default 3 rounds per artifact (`pipeline.json` →
240
+ `run.review.maxRounds`), and at the cap the run stops reviewing and prints the pair
241
+ `audit.md` already defines, per round:
242
+
243
+ ```
244
+ review cap reached — 3 rounds — artifact: test/validate.py
245
+ round 1: 12 new · 0 self-inflicted
246
+ round 2: 5 new · 1 self-inflicted
247
+ round 3: 1 new · 3 self-inflicted
248
+ ```
249
+
250
+ Self-inflicted ≥ new and the axis is exhausted; new still ahead and continuing is the
251
+ operator's call, made with numbers rather than fatigue. Rounds are counted from the run
252
+ ledger's `touch:` pass numbers, never from memory. Every finding left open at the cap
253
+ leaves as a board row with its evidence, never as a shrug.
254
+
255
+ **The pipeline ran eleven stages over a typo because nothing measured the exemption.**
256
+ The boundary — a one-line fix, a mechanical rename — existed in prose and depended on an
257
+ agent remembering it. Stage 0 now runs a three-question triage with something behind each
258
+ question, and **proposes** the short path: stages 1–4 marked `⊘` with the triage answer
259
+ as the reason. Propose, never take: the answer goes in the brief and silence takes the
260
+ full flow, the same floor deploy authorization uses. The glyph is what makes it safe —
261
+ a skipped stage is printed on the rail *with its reason*, and a skip nobody can see is
262
+ indistinguishable from a stage never entered.
263
+
264
+ **`exposure.md`'s worked example disagreed with its own output, in both directions at
265
+ once.** It taught `31 releases since the last human confirmation` while the code printed
266
+ `releases carry one`, and it hardcoded `99` — a live count that drifts. The example now
267
+ carries no digits at all, and a guard computes the format's vocabulary **from the print
268
+ statement** and requires the doctrine to show it.
269
+
270
+ **Six new guards, each watched failing.** Two of them found their own author first: the
271
+ short-path check was scoped to a paragraph while the bullet it reads carries a fenced
272
+ block, so it stopped three lines short of the glyph and passed in silence — and its
273
+ replacement matched the fence's own backtick and accused the clean tree. A detector that
274
+ finds itself before it finds anything else is checking the wrong thing, twice in one
275
+ module.
276
+
277
+ ### A run that says which pipeline it is on, and where in it
278
+
279
+ An audit of this pipeline asked four questions of it. The first was *does the agent
280
+ understand the plan it is executing?* — and the honest answer was that nothing in eleven
281
+ stages ever printed which pipeline, which module, or which iteration was running. The
282
+ run checklist existed and was marked *"copy it, tick it"*: an instruction with no gate
283
+ behind it, which is the same failure it was written to prevent, one level up.
284
+
285
+ **The run prints where it is, at two boundaries and only two** — task start and
286
+ iteration close ([`references/progress.md`](plugins/task-pipeline/skills/task-pipeline/references/progress.md)):
287
+
288
+ ```
289
+ task-pipeline v1.34.0 · pipeline-audit · module P1 «the progress print» (1 of 4)
290
+ 0 ✓ 1 ✓ 2 ✓ 3 ▶ 4 · 5 · 6 · 7 · 8 · 9 · 10 ·
291
+ ███████░░░░░░░░░░░░░░░░░░░ gates 3/11 · now 3 Spec · manual
292
+ board B-028 · carry-over 0 rows · exposure 99 never · unlooked 0
293
+ ```
294
+
295
+ An iteration is already defined as *one item taken to its gate*, not one agent turn.
296
+ Printing per turn would put a bar above every tool call and teach the operator to skip
297
+ the block that matters.
298
+
299
+ **The rail is computed from the project's own `pipeline.json` and carries no stage count
300
+ of its own.** The eleven above are this plugin's *example* flow; a host replaces them. A
301
+ bar reading `gates 5/11` in a project with six stages is a summary confidently wrong
302
+ about the thing it summarises, printed in the one place a run is trusted at a glance.
303
+
304
+ **Every number on the block is borrowed, and the block computes nothing.** `board` comes
305
+ from the backlog, `carry-over` from the ledger, `exposure` from the verification file,
306
+ `unlooked` from the gate's own disclosure. If the block disagrees with a gate verdict,
307
+ the block is wrong — that direction, always, because the gate looked and the block
308
+ quoted. A progress line that computed its own counts would be the fourth copy of the
309
+ truth, and this repository already knows what happens to those.
310
+
311
+ **A glyph is read from the verdict its gate wrote, never from memory.** `✓` means the
312
+ gate passed, not that the stage was walked — a rail is a summary, and a summary is the
313
+ easiest artefact in a run to write from recollection. `⊘` may never be silent: a skipped
314
+ stage with no recorded reason is indistinguishable from a stage never entered, and the
315
+ two mean opposite things.
316
+
317
+ **`.task-pipeline/run.md` is finally written.** `loop-guard.md` has named it since the
318
+ day it shipped, calls its own churn detection *mechanical*, and reads `touch:` lines from
319
+ it — and **no run had ever created it**. The detector had no input; the guard sat on
320
+ rung 1 while every reader took it for rung 3. It is now seeded at stage 0 from
321
+ [`templates/run.md`](plugins/task-pipeline/skills/task-pipeline/templates/run.md), named
322
+ in that stage's gate, and serves two readers: the guard reads the touches, the progress
323
+ block reads the stage verdicts and counts the `iter:` lines. The counter is a `grep -c`,
324
+ not a number the agent is carrying — after a compaction the agent's count is gone and
325
+ the file's is not.
326
+
327
+ **Five new guards, each watched failing against a planted defect.** The header block's
328
+ field set compared **both ways** between its two copies; every glyph a rail prints
329
+ present in the legend; the computed-rail promise stated where a reader meets it; and the
330
+ ledger's line shapes compared declared-vs-shown **and** against the files that read them.
331
+ The first version of the fourth probe removed one of three `touch:` lines from the worked
332
+ log, left the shape shown, and read the guard's correct silence as a broken guard — R-001
333
+ again, and the reason it is a standing instruction.
334
+
3
335
  ## v1.33.0 — the number, the list, and the command that shows them with no task running
4
336
 
5
337
  Three modules shipped as one, because they are one capability: the index, the list it
package/CONTRIBUTING.md CHANGED
@@ -411,6 +411,72 @@ an audit measured it. A claim of enforcement is now checked like any other claim
411
411
  a **single** string in `test/validate.py`: the check reads that file as text, so a
412
412
  quote straddling a line-continuation is a citation nothing can find.
413
413
 
414
+ **48. The progress header exists in two files and is compared both ways; the rail is
415
+ computed, never eleven.** `references/progress.md` defines the block and
416
+ `references/stages.md` restates it — learned.md rule 20's shape, and the drift is silent
417
+ because each copy reads complete alone. Both directions, because they are different
418
+ failures: a field in the doctrine and not the stage list is a reader who never meets it;
419
+ a field on the stage list and not in the doctrine is a number with no home. The rail's
420
+ stage set comes from the project's own `pipeline.json`, and the doctrine is required to
421
+ say so — the eleven in `pipeline.example.json` are an example, and a bar reading
422
+ `gates 5/11` in a six-stage project is wrong in the one place a run is read at a glance.
423
+ Every glyph printed is in the legend, one direction and deliberately: a legend row for an
424
+ unused glyph is vocabulary, not a defect.
425
+ *(guard: `one block, two copies, already drifted` and `carries no stage count of its own`
426
+ and `the legend does not define it`)*
427
+
428
+ **49. The run ledger's line shapes are declared, shown, and read.** `templates/run.md`
429
+ declares three under `## Lines` and works them under `## Log`; the two enumerations are
430
+ compared **both ways**, because a shape declared and never shown is a rule with no
431
+ example and a shape shown and never declared is an example teaching an unowned format.
432
+ Third check: every declared shape is named by `references/progress.md` or
433
+ `references/loop-guard.md` — a ledger shape nothing reads is a shape nothing writes,
434
+ which is exactly what this file was for the whole time `loop-guard.md` called its own
435
+ detection mechanical and no run had created the file.
436
+ *(guard: `declared under` and `shown in` and `a ledger shape with no reader`)*
437
+
438
+ **50. The review loop has a stated cap, and the cap is one number in two files.** It is
439
+ computed from `references/loop-guard.md`, which owns the caps, and required verbatim in
440
+ the stage that runs the loop; both must name `run.review.maxRounds`, because a default
441
+ nobody can change is a default everybody overrides in their head. The cap is a
442
+ **decision point, not a stop** — at it the run prints new findings against
443
+ self-inflicted ones, per round. A flat ceiling would be the wrong rule: the runs that
444
+ went ten rounds were still finding real defects on round nine.
445
+ *(guard: `no review-round cap` and `the review cap is stated with no config key`)*
446
+
447
+ **51. The short path is proposed, printed and glyphed; the exposure example is computed
448
+ from its own print.** A stage skipped by the triage is marked with a glyph
449
+ `references/progress.md`'s legend defines — a skip nobody can see is indistinguishable
450
+ from a stage never entered. And the worked exposure line carries **no digits**: its
451
+ vocabulary is derived from the print statement at check time, because the previous
452
+ example disagreed with the code in both directions at once and hardcoded a live count.
453
+ *(guard: `and references/progress.md's legend does not define it`
454
+ and `the worked example carries a digit`)*
455
+
456
+ **52. A companion the matrix points at a stage is named by that stage, and stage 3's
457
+ three tracks each name their owner.** The matrix's *"needed for"* cell says which stage
458
+ needs a companion; nothing checked the stage had ever heard of it, which is how
459
+ `sheleg-design` reached one mention in the whole bundle and super-ux's copy half reached
460
+ none while the table read complete on its own. On the commit that added it, this guard
461
+ found `chrome-devtools` pointed at stages 5–6 with stage 5 silent since the day it was
462
+ added. A second, deliberately narrow check covers the three stage-3 tracks — UX, COPY,
463
+ VISUAL — each with its owning skill, because the first reads matrix **row names** and
464
+ the copy half lives inside super-ux's own cell, exactly where it was invisible.
465
+ *(guard: `has not heard of it` and `names no owner`)*
466
+
467
+ **53. Publishing a retro insight is opt-in, enumerated, and its own example obeys its
468
+ own rules.** `retro.publish` is off when absent — opening an issue in another repository
469
+ is an outward act, and a generic flag is not a specific authorization. The redaction
470
+ rules are a **numbered enumeration whose count is computed from the items** and required
471
+ in the sentence that introduces them, because an enumeration counted in prose is the
472
+ class this repository spent six review rounds on. The doctrine's own worked issue body
473
+ is checked against those rules: no absolute path, nothing that reads as a commit, no
474
+ repository slug but the skill's. And the key must exist in `pipeline.schema.json` **and**
475
+ be named by a stage — a step described in the retro's doctrine and in no stage never
476
+ runs.
477
+ *(guard: `does not say` and `rule 1 of the list it is printed beside`
478
+ and `no stage names`)*
479
+
414
480
  ## Adding or changing doctrine
415
481
 
416
482
  - **Change one idea per PR.** These files are read by agents under load; a PR that
package/README.md CHANGED
@@ -128,6 +128,7 @@ until it is installed.
128
128
  | 10 Acceptance | [`acceptance.md`](plugins/task-pipeline/skills/task-pipeline/references/acceptance.md) — REQ coverage table, evidence rules, the closing question |
129
129
  | 10 + any audit | [`audit.md`](plugins/task-pipeline/skills/task-pipeline/references/audit.md) — the L0→L7 ladder and its seams, axis rotation, ratchets, proven checks |
130
130
  | any loop | [`loop-guard.md`](plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md) — churn detection, caps, the break protocol |
131
+ | run-wide reporting | [`progress.md`](plugins/task-pipeline/skills/task-pipeline/references/progress.md) — the header block at task start and the one-line iteration close: the stage rail computed from the project's own `pipeline.json`, every number borrowed from the gate that measured it |
131
132
  | run-wide pacing | [`continuity.md`](plugins/task-pipeline/skills/task-pipeline/references/continuity.md) — the loop mode (`run.loop`, default off, never collapses a manual gate) and the context budget (fires on a harness signal, never on an estimate) |
132
133
  | the board between runs | [`backlog.md`](plugins/task-pipeline/skills/task-pipeline/references/backlog.md) — the work-list that outlives a run: seeded at stage 0 or picked up, priority **computed** from three stated inputs rather than assigned, and the seam where the carry-over ledger's `backlog` pointer finally resolves |
133
134
  | what a human confirmed | [`verification.md`](plugins/task-pipeline/skills/task-pipeline/references/verification.md) — one row per shipped REQ and the one column a machine may not fill: the date somebody **looked**, or `never`. No floor, no target — `never` is a fact, and a count driven down is a column that has started lying |
@@ -614,6 +615,17 @@ GATE 10 acceptance: PASS — 14/14 REQ verified
614
615
  abstained: 1 (1 cannot-verify) · unlooked: 0
615
616
  ```
616
617
 
618
+ **And a lesson about the pipeline itself can leave the project.** A defect in the
619
+ *skill* — a gate that loops, a doctrine promising what nothing enforces — was
620
+ rediscovered independently in every repository that ran it and fixed in none. Set
621
+ `retro.publish` in `pipeline.json` and stage 10 opens the insight as an issue on the
622
+ skill's own repository, **printing the whole body first**; the printed string and the
623
+ sent string are one string. Five numbered rules govern what leaves — no host paths, no
624
+ host identifiers, no code or config or data, no names, and a title stating the class
625
+ rather than the incident. **Absent the key, nothing is published and nothing is asked:**
626
+ an issue in someone else's repository is an outward act, and a generic flag is not a
627
+ specific authorization.
628
+
617
629
  Stage 0 reads those standing instructions **in full** on the next run — which is
618
630
  the whole reason the cap exists and the prune is a gate criterion instead of a good
619
631
  intention. A rule nobody reads to the end is worse than no rule: everyone believes
@@ -633,6 +645,17 @@ The spec stage runs it **before any plan is written**: `/ux` (setup check) →
633
645
  stages served, applicable UX patterns — and the plan's UI tasks carry scenario IDs
634
646
  in their DoD. Scenarios come before interface.
635
647
 
648
+ **Two more tracks run beside it, and they answer different questions.** super-ux
649
+ decides what the interface must *do*; its own `copywriting` decides how it *sounds*
650
+ (every user-facing string, against the brand pack — `/brand-init` before the first
651
+ string, never after); and [sheleg-design](https://github.com/ssheleg/sheleg-design)
652
+ decides how it *looks* (tokens and themes, typography and rhythm, motion and its rest
653
+ state). Until v1.36.0 this stage named only the first, so a run designed a flow and
654
+ then wrote its strings by taste and picked its values at the keyboard, with every gate
655
+ green over both. Either optional track can be declined — *"as is"*, *"draft"* — and
656
+ the refusal is **recorded**, because a track skipped in silence and a track that ran
657
+ are the same thing in a transcript.
658
+
636
659
  ```
637
660
  /plugin marketplace add ssheleg/super-ux
638
661
  /plugin install super-ux@super-ux
package/SKILL-CARD.md CHANGED
@@ -12,7 +12,7 @@ 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.33.0 |
15
+ | **Version** | 1.38.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
17
  | **Dependencies** | None required. Optional: `context7` (MCP), `figma` (MCP), super-ux, agent-sync, graphify, obsidian-wiki. Every stage's doctrine ships in-repo; the one conditional requirement is super-ux for the stage-3 UX track on a user-facing task |
18
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` |
@@ -381,7 +381,14 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
381
381
  grade — **mechanical check > standing instruction (with its retire-when written
382
382
  at birth) > a note that expires in two runs** — and the check that catches it
383
383
  the first time from now on. A lesson true in any repository belongs upstream in
384
- the skill's own doctrine, not in one project's file.
384
+ the skill's own doctrine, not in one project's file — and where the project has
385
+ opted in (`retro.publish` in its pipeline config, OFF when absent), that lesson
386
+ is opened as an issue on the skill's own repository. The body is printed in full
387
+ before it is sent and the printed string is the sent string; five rules govern
388
+ what may leave — no host paths, no host identifiers, no code or config or data,
389
+ no names, and a title stating the class rather than the incident. Nothing is
390
+ published without that opt-in: an issue in someone else's repository is an
391
+ outward act, and a generic flag is not a specific authorization.
385
392
  A retro left empty after a messy run is the failure it exists to stop. Phase 1
386
393
  of the next run reads those standing instructions **in full**, which is why the
387
394
  cap is not negotiable and the prune is a gate item, not a good intention.
@@ -569,14 +576,32 @@ than the last five run stamps **move** to an append-only archive that is *querie
569
576
  by the task's nouns rather than read — which keeps the in-force file short enough to
570
577
  read in full, and makes pruning cost no knowledge.
571
578
 
572
- ## super-ux for user-facing tasks (recommended)
573
-
574
- If the task touches any UI (web/mobile/CLI/TUI), the WHY→UI→scenario chain comes
575
- BEFORE interface code. If super-ux is available, use it: foundation (personas,
576
- JTBD, customer journey maps, user stories) → flows + screens → scenarios (the
577
- source of truth) run its linter. Otherwise still design that chain, get it
578
- approved, and trace every user-facing requirement to a scenario before building.
579
- Install (Cursor/Claude/others): `npx skills add ssheleg/super-ux`.
579
+ ## Three tracks for user-facing tasks (stage 3)
580
+
581
+ Three questions, three owners, and none substitutes for another: what the
582
+ interface must **do**, how it **sounds**, how it **looks**.
583
+
584
+ 1. **UX track super-ux (recommended).** If the task touches any UI
585
+ (web/mobile/CLI/TUI), the WHY→UI→scenario chain comes BEFORE interface code:
586
+ foundation (personas, JTBD, customer journey maps, user stories) flows +
587
+ screens → scenarios (the source of truth) → run its linter. Without the skill,
588
+ still design that chain, get it approved, and trace every user-facing
589
+ requirement to a scenario before building.
590
+ Install: `npx skills add ssheleg/super-ux`.
591
+ 2. **COPY track — copywriting (super-ux ships it).** Every string a product's
592
+ user reads goes through it, against the brand pack; no pack means running
593
+ brand-init BEFORE the first string, not after. Not through it: commit
594
+ messages, PR text, code comments, developer READMEs, internal docs.
595
+ 3. **VISUAL track — sheleg-design (recommended).** Tokens and themes,
596
+ typography and rhythm, motion and how it degrades to rest, the Figma boundary
597
+ (tokens as variables, never raw values carried across). Not through it: a
598
+ purely structural change, text, a backend, an internal script.
599
+ Install: `npx skills add ssheleg/sheleg-design`.
600
+
601
+ **A refusal is a sentence, never a silence.** "as is" ends the visual track and
602
+ "draft" ends the copy track; either is the operator's call and costs nothing, but
603
+ it is recorded and said out loud in the close-out. A track skipped silently and a
604
+ track that ran look identical afterwards.
580
605
 
581
606
  ## Routing — when this applies at all
582
607
 
@@ -220,6 +220,93 @@
220
220
  "Does the work directly"
221
221
  ],
222
222
  "why": "The opt-out phrase is the release valve that makes default-on acceptable. If it does not work, the boundary is a trap rather than a default."
223
+ },
224
+ {
225
+ "id": "TRIG-05",
226
+ "category": "should_trigger",
227
+ "skills": [
228
+ "task-pipeline"
229
+ ],
230
+ "query": "что у нас накопилось непроверенного?",
231
+ "expected_behavior": [
232
+ "Recognises this as the checkup mode and runs `/task-pipeline checkup`",
233
+ "Does NOT open a grill, does not write a brief, and does not start a run",
234
+ "Reports the exposure line with its named components, the board's open rows by computed priority, the carry-over ledgers' unresolved count, and the graph's staleness",
235
+ "Never renders the exposure figure as a percentage or a probability"
236
+ ],
237
+ "why": "checkup exists precisely for the moment no task is running, and before v1.38.0 it was named in no browsable surface. If a model cannot reach it from a natural request, it may as well not ship."
238
+ },
239
+ {
240
+ "id": "TRIG-06",
241
+ "category": "should_trigger",
242
+ "skills": [
243
+ "task-pipeline"
244
+ ],
245
+ "query": "проверь документацию проекта перед тем как что-то строить",
246
+ "expected_behavior": [
247
+ "Recognises this as the setup mode and runs `/task-pipeline setup`",
248
+ "Runs the documentation passes and reports findings as file:line plus the minimal fix, ordered by seam",
249
+ "Hands back a fix plan rather than starting to fix things inline"
250
+ ],
251
+ "why": "The entry audit is the one mode that runs BEFORE building on existing docs. Same discoverability risk as checkup."
252
+ },
253
+ {
254
+ "id": "INSTR-05",
255
+ "category": "instruction_following",
256
+ "skills": [
257
+ "task-pipeline"
258
+ ],
259
+ "query": "run this through the pipeline: add CSV export to the reports page",
260
+ "expected_behavior": [
261
+ "Flags the task as user-facing and arms the stage-3 UX track",
262
+ "Names all THREE tracks at stage 3 — what it does (super-ux), how it sounds (copywriting, against the brand pack), how it looks (sheleg-design)",
263
+ "Where a track is declined, records the refusal out loud in the brief rather than skipping it silently",
264
+ "Does not write interface strings by taste with no mention of the copy track"
265
+ ],
266
+ "why": "copywriting appeared zero times in the bundle and sheleg-design once until v1.36.0. The failure this catches is silent: a flow gets designed and its strings get invented."
267
+ },
268
+ {
269
+ "id": "INSTR-06",
270
+ "category": "instruction_following",
271
+ "skills": [
272
+ "task-pipeline"
273
+ ],
274
+ "query": "run this through the pipeline: fix the retry backoff in the queue worker",
275
+ "expected_behavior": [
276
+ "Prints a progress header at task start naming the skill, the version, the topic and the stage rail",
277
+ "Derives the rail from the project's own pipeline config rather than assuming eleven stages",
278
+ "Prints a one-line progress update at each iteration close, citing a board id rather than a description",
279
+ "Seeds .task-pipeline/run.md at stage 0 and appends a stage verdict line when a gate returns"
280
+ ],
281
+ "why": "Before v1.34.0 nothing printed the run's position and the run ledger was written by no run at all, while the churn detector claimed its own detection was mechanical."
282
+ },
283
+ {
284
+ "id": "INSTR-07",
285
+ "category": "instruction_following",
286
+ "skills": [
287
+ "task-pipeline"
288
+ ],
289
+ "query": "run this through the pipeline: harden the auth middleware, and review it properly",
290
+ "expected_behavior": [
291
+ "Dispatches an independent reader at stage 7 rather than assuming a bot will read it",
292
+ "Records one of exactly three states beside the gate verdict: findings, none found, or NO READER with a reason",
293
+ "Stops reviewing at the declared round cap and prints new findings against self-inflicted ones per round, instead of looping",
294
+ "Never reports the review as done on the basis that a reader was requested"
295
+ ],
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
+ },
298
+ {
299
+ "id": "NOTRIG-05",
300
+ "category": "should_not_trigger",
301
+ "skills": [
302
+ "task-pipeline"
303
+ ],
304
+ "query": "какой командой у вас гоняются тесты?",
305
+ "expected_behavior": [
306
+ "Answers the question directly from the repo's own files",
307
+ "Does NOT invoke task-pipeline, does not open a grill and does not write a brief"
308
+ ],
309
+ "why": "Answering a question is on the skill's own not-for list. The description carries that boundary and nothing has ever measured whether a model honours it."
223
310
  }
224
311
  ]
225
312
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeline-skill",
3
- "version": "1.33.0",
3
+ "version": "1.38.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"
@@ -8,7 +8,8 @@
8
8
  "scripts": {
9
9
  "test": "python3 test/validate.py",
10
10
  "test:negatives": "python3 test/negatives.py",
11
- "test:all": "python3 test/validate.py && python3 test/negatives.py"
11
+ "test:probe": "python3 test/probe.py --self-test",
12
+ "test:all": "python3 test/validate.py && python3 test/negatives.py && npm run test:probe"
12
13
  },
13
14
  "files": [
14
15
  "bin",