task-pipeline-skill 1.32.0 → 1.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +253 -0
- package/CONTRIBUTING.md +76 -1
- package/README.md +24 -0
- package/SKILL-CARD.md +1 -1
- package/cursor/rules/task-pipeline.mdc +34 -9
- package/package.json +1 -1
- package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
- package/plugins/task-pipeline/commands/task-pipeline.md +11 -0
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +2 -0
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json +133 -21
- package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +12 -5
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +20 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/continuity.md +18 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/exposure.md +110 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +52 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/portability.md +2 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/progress.md +190 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +88 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +109 -9
- package/plugins/task-pipeline/skills/task-pipeline/templates/README.md +1 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/run.md +77 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,258 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v1.37.0 — the audit, and the four things it found the pipeline could not say
|
|
4
|
+
|
|
5
|
+
One release, four modules, and an audit that put four questions to this pipeline and
|
|
6
|
+
answered them with measurements rather than opinion:
|
|
7
|
+
|
|
8
|
+
- **99 shipped REQ, 99 of them at `Human: never`** — nothing has ever been confirmed by
|
|
9
|
+
a person, and the exposure line has been saying so on every run.
|
|
10
|
+
- **`copywriting` appeared 0 times in the bundle and `sheleg-design` once**, as a name in
|
|
11
|
+
a README list.
|
|
12
|
+
- **The review loop ran ten rounds, ten, eight, four, three** against a stated ceiling of
|
|
13
|
+
two stage re-entries — because a review round was named in no cap at all.
|
|
14
|
+
- **Nothing ever printed which pipeline, which module, or which iteration was running.**
|
|
15
|
+
The run checklist existed and was marked *"copy it, tick it"*.
|
|
16
|
+
|
|
17
|
+
Guards: 188 → **210**, property checks 8. Every one watched failing against a planted
|
|
18
|
+
defect, and three of the probes were wrong before their guards were.
|
|
19
|
+
|
|
20
|
+
### The lesson that stopped dying in the repository that learned it
|
|
21
|
+
|
|
22
|
+
`retrospective.md` has said *"open an issue upstream"* since v1.9.0 and named no
|
|
23
|
+
repository, no trigger and no authorization — an instruction on rung 1 that every reader
|
|
24
|
+
took for done. So a defect in **the skill** — a gate that loops, a doctrine promising
|
|
25
|
+
what nothing enforces, a rule firing on the wrong shape — was rediscovered independently
|
|
26
|
+
in every project that ran the pipeline and fixed in none of them.
|
|
27
|
+
|
|
28
|
+
**Opt-in, per project, off by default**, `pipeline.json` → `retro.publish`:
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
"retro": { "publish": { "repo": "…", "label": "retro-insight", "redact": "strict" } }
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Absent, nothing is published and nothing is asked. Opening an issue in another
|
|
35
|
+
repository is an **outward act**, and an outward act taken from a generic flag is one
|
|
36
|
+
nobody authorized — the same floor deploy authorization uses.
|
|
37
|
+
|
|
38
|
+
**The body is printed in full before it is sent, and the printed string and the sent
|
|
39
|
+
string are one string.** Redacting after the print, or printing a tidier version of what
|
|
40
|
+
actually goes out, is the false-success shape this bundle names outright: a mechanism
|
|
41
|
+
reporting on itself instead of on what it did.
|
|
42
|
+
|
|
43
|
+
**Five numbered redaction rules**, because *insight only* is not a specification. No host
|
|
44
|
+
paths — only paths inside task-pipeline itself. No host identifiers: repository,
|
|
45
|
+
organisation, branch, commit, tag, issue. No code, no config values, no data, not even
|
|
46
|
+
redacted. No names of any kind. And the title states the **class**, not the incident.
|
|
47
|
+
When in doubt the rule is subtraction: an insight that survives losing a detail is still
|
|
48
|
+
an insight, and a detail that leaks cannot be recalled from an index.
|
|
49
|
+
|
|
50
|
+
**Seven guards, and one of them was broken by the fence above.** The check that makes the
|
|
51
|
+
doctrine's own worked issue obey its own rules was silent against three separate plants —
|
|
52
|
+
an absolute path, a commit id, a foreign repository slug — because the fence scan matched
|
|
53
|
+
` ``` ` followed by a newline, and the ```json block one paragraph up made every
|
|
54
|
+
subsequent fence pair with the wrong delimiter. Five fence scans across four modules had
|
|
55
|
+
the same bug; all are language-tolerant now, and the earlier modules' probes were re-run
|
|
56
|
+
to prove the change broke nothing (R-003: sweep the detector's siblings).
|
|
57
|
+
|
|
58
|
+
### What it does, how it sounds, how it looks
|
|
59
|
+
|
|
60
|
+
The audit measured this one rather than argued it: **`copywriting` appeared zero times
|
|
61
|
+
in the whole bundle, and `sheleg-design` once — as a name in a list in the README.**
|
|
62
|
+
Meanwhile the companion matrix named six super-ux surfaces while super-ux shipped eight
|
|
63
|
+
skills and fifteen commands. So a run designed a flow, then wrote its interface strings
|
|
64
|
+
by taste and picked its visual values at the keyboard, and every gate in the pipeline
|
|
65
|
+
reported green over both.
|
|
66
|
+
|
|
67
|
+
**Stage 3 now runs three tracks, and none substitutes for another:**
|
|
68
|
+
|
|
69
|
+
| Track | Answers | Owner |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| UX | what the interface must **do** | super-ux — the WHY→UI→scenario chain |
|
|
72
|
+
| COPY | how it **sounds** | `copywriting`, against the brand pack |
|
|
73
|
+
| VISUAL | how it **looks** | `sheleg-design` — tokens, themes, rhythm, motion |
|
|
74
|
+
|
|
75
|
+
Each carries its boundary in both directions, because a track that over-reaches is
|
|
76
|
+
routed around. The copy track takes interface strings, errors, empty states, the
|
|
77
|
+
landing, the user-facing changelog — and explicitly **not** commit messages, PR text,
|
|
78
|
+
code comments or a developer README. The visual track takes the visual layer and
|
|
79
|
+
explicitly **not** a purely structural change, which is the UX track's.
|
|
80
|
+
|
|
81
|
+
**A refusal is a sentence, never a silence.** *"as is"* ends the visual track and
|
|
82
|
+
*"draft"* ends the copy track; either is the operator's call and costs nothing. But it
|
|
83
|
+
is recorded in the brief and said in the close-out, because a track skipped in silence
|
|
84
|
+
and a track that ran are identical afterwards — the `⊘` rule one layer up.
|
|
85
|
+
|
|
86
|
+
**`sheleg-design` joins the matrix and the preflight**, and super-ux's row finally names
|
|
87
|
+
its copy half.
|
|
88
|
+
|
|
89
|
+
**The new guard found a live defect on the clean tree before it found anything else.**
|
|
90
|
+
It compares the matrix's *"needed for stage N"* cell against what that stage actually
|
|
91
|
+
says, and reported that `chrome-devtools` had been pointed at **stages 5–6 since the day
|
|
92
|
+
it was added, with stage 5 never naming it**. Fixed here: stage 5 now checks a rendered
|
|
93
|
+
surface per task, while the implementer that wrote it is still dispatched.
|
|
94
|
+
|
|
95
|
+
**And a probe found a hole in its own guard.** Removing `copywriting` from stage 3 left
|
|
96
|
+
the check silent, because it reads matrix **row names** and the copy half lives inside
|
|
97
|
+
super-ux's own cell — precisely where it had been invisible all along. A second, narrow
|
|
98
|
+
check now covers the three tracks by name. It is narrow on purpose: generalising the
|
|
99
|
+
sub-skill mapping would demand stage 3 name `/brand-lint` and `ux-audit` too, and a
|
|
100
|
+
check that over-reaches is switched off by the third person who hits it.
|
|
101
|
+
|
|
102
|
+
### The loop that had no ceiling, the exemption nobody measured
|
|
103
|
+
|
|
104
|
+
Three findings from the same audit, all of them gates behaving as prose.
|
|
105
|
+
|
|
106
|
+
**The review loop was capped by nothing.** `build.md` caps the stage-5 fix loop at five
|
|
107
|
+
rounds per task and `loop-guard.md` caps stage re-entries at two — and a review round is
|
|
108
|
+
neither, so nothing counted them. The run stamps say what that cost: **ten rounds, ten,
|
|
109
|
+
eight, four, three**, in one programme.
|
|
110
|
+
|
|
111
|
+
**A flat cap would have been the wrong fix**, and this is the part worth keeping. Every
|
|
112
|
+
one of those runs recorded *"none from my probes"* beside its count — the reader was
|
|
113
|
+
still finding real defects on round nine. Stopping at two would have shipped them. So
|
|
114
|
+
the cap is a **decision point**: default 3 rounds per artifact (`pipeline.json` →
|
|
115
|
+
`run.review.maxRounds`), and at the cap the run stops reviewing and prints the pair
|
|
116
|
+
`audit.md` already defines, per round:
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
review cap reached — 3 rounds — artifact: test/validate.py
|
|
120
|
+
round 1: 12 new · 0 self-inflicted
|
|
121
|
+
round 2: 5 new · 1 self-inflicted
|
|
122
|
+
round 3: 1 new · 3 self-inflicted
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Self-inflicted ≥ new and the axis is exhausted; new still ahead and continuing is the
|
|
126
|
+
operator's call, made with numbers rather than fatigue. Rounds are counted from the run
|
|
127
|
+
ledger's `touch:` pass numbers, never from memory. Every finding left open at the cap
|
|
128
|
+
leaves as a board row with its evidence, never as a shrug.
|
|
129
|
+
|
|
130
|
+
**The pipeline ran eleven stages over a typo because nothing measured the exemption.**
|
|
131
|
+
The boundary — a one-line fix, a mechanical rename — existed in prose and depended on an
|
|
132
|
+
agent remembering it. Stage 0 now runs a three-question triage with something behind each
|
|
133
|
+
question, and **proposes** the short path: stages 1–4 marked `⊘` with the triage answer
|
|
134
|
+
as the reason. Propose, never take: the answer goes in the brief and silence takes the
|
|
135
|
+
full flow, the same floor deploy authorization uses. The glyph is what makes it safe —
|
|
136
|
+
a skipped stage is printed on the rail *with its reason*, and a skip nobody can see is
|
|
137
|
+
indistinguishable from a stage never entered.
|
|
138
|
+
|
|
139
|
+
**`exposure.md`'s worked example disagreed with its own output, in both directions at
|
|
140
|
+
once.** It taught `31 releases since the last human confirmation` while the code printed
|
|
141
|
+
`releases carry one`, and it hardcoded `99` — a live count that drifts. The example now
|
|
142
|
+
carries no digits at all, and a guard computes the format's vocabulary **from the print
|
|
143
|
+
statement** and requires the doctrine to show it.
|
|
144
|
+
|
|
145
|
+
**Six new guards, each watched failing.** Two of them found their own author first: the
|
|
146
|
+
short-path check was scoped to a paragraph while the bullet it reads carries a fenced
|
|
147
|
+
block, so it stopped three lines short of the glyph and passed in silence — and its
|
|
148
|
+
replacement matched the fence's own backtick and accused the clean tree. A detector that
|
|
149
|
+
finds itself before it finds anything else is checking the wrong thing, twice in one
|
|
150
|
+
module.
|
|
151
|
+
|
|
152
|
+
### A run that says which pipeline it is on, and where in it
|
|
153
|
+
|
|
154
|
+
An audit of this pipeline asked four questions of it. The first was *does the agent
|
|
155
|
+
understand the plan it is executing?* — and the honest answer was that nothing in eleven
|
|
156
|
+
stages ever printed which pipeline, which module, or which iteration was running. The
|
|
157
|
+
run checklist existed and was marked *"copy it, tick it"*: an instruction with no gate
|
|
158
|
+
behind it, which is the same failure it was written to prevent, one level up.
|
|
159
|
+
|
|
160
|
+
**The run prints where it is, at two boundaries and only two** — task start and
|
|
161
|
+
iteration close ([`references/progress.md`](plugins/task-pipeline/skills/task-pipeline/references/progress.md)):
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
task-pipeline v1.34.0 · pipeline-audit · module P1 «the progress print» (1 of 4)
|
|
165
|
+
0 ✓ 1 ✓ 2 ✓ 3 ▶ 4 · 5 · 6 · 7 · 8 · 9 · 10 ·
|
|
166
|
+
███████░░░░░░░░░░░░░░░░░░░ gates 3/11 · now 3 Spec · manual
|
|
167
|
+
board B-028 · carry-over 0 rows · exposure 99 never · unlooked 0
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
An iteration is already defined as *one item taken to its gate*, not one agent turn.
|
|
171
|
+
Printing per turn would put a bar above every tool call and teach the operator to skip
|
|
172
|
+
the block that matters.
|
|
173
|
+
|
|
174
|
+
**The rail is computed from the project's own `pipeline.json` and carries no stage count
|
|
175
|
+
of its own.** The eleven above are this plugin's *example* flow; a host replaces them. A
|
|
176
|
+
bar reading `gates 5/11` in a project with six stages is a summary confidently wrong
|
|
177
|
+
about the thing it summarises, printed in the one place a run is trusted at a glance.
|
|
178
|
+
|
|
179
|
+
**Every number on the block is borrowed, and the block computes nothing.** `board` comes
|
|
180
|
+
from the backlog, `carry-over` from the ledger, `exposure` from the verification file,
|
|
181
|
+
`unlooked` from the gate's own disclosure. If the block disagrees with a gate verdict,
|
|
182
|
+
the block is wrong — that direction, always, because the gate looked and the block
|
|
183
|
+
quoted. A progress line that computed its own counts would be the fourth copy of the
|
|
184
|
+
truth, and this repository already knows what happens to those.
|
|
185
|
+
|
|
186
|
+
**A glyph is read from the verdict its gate wrote, never from memory.** `✓` means the
|
|
187
|
+
gate passed, not that the stage was walked — a rail is a summary, and a summary is the
|
|
188
|
+
easiest artefact in a run to write from recollection. `⊘` may never be silent: a skipped
|
|
189
|
+
stage with no recorded reason is indistinguishable from a stage never entered, and the
|
|
190
|
+
two mean opposite things.
|
|
191
|
+
|
|
192
|
+
**`.task-pipeline/run.md` is finally written.** `loop-guard.md` has named it since the
|
|
193
|
+
day it shipped, calls its own churn detection *mechanical*, and reads `touch:` lines from
|
|
194
|
+
it — and **no run had ever created it**. The detector had no input; the guard sat on
|
|
195
|
+
rung 1 while every reader took it for rung 3. It is now seeded at stage 0 from
|
|
196
|
+
[`templates/run.md`](plugins/task-pipeline/skills/task-pipeline/templates/run.md), named
|
|
197
|
+
in that stage's gate, and serves two readers: the guard reads the touches, the progress
|
|
198
|
+
block reads the stage verdicts and counts the `iter:` lines. The counter is a `grep -c`,
|
|
199
|
+
not a number the agent is carrying — after a compaction the agent's count is gone and
|
|
200
|
+
the file's is not.
|
|
201
|
+
|
|
202
|
+
**Five new guards, each watched failing against a planted defect.** The header block's
|
|
203
|
+
field set compared **both ways** between its two copies; every glyph a rail prints
|
|
204
|
+
present in the legend; the computed-rail promise stated where a reader meets it; and the
|
|
205
|
+
ledger's line shapes compared declared-vs-shown **and** against the files that read them.
|
|
206
|
+
The first version of the fourth probe removed one of three `touch:` lines from the worked
|
|
207
|
+
log, left the shape shown, and read the guard's correct silence as a broken guard — R-001
|
|
208
|
+
again, and the reason it is a standing instruction.
|
|
209
|
+
|
|
210
|
+
## v1.33.0 — the number, the list, and the command that shows them with no task running
|
|
211
|
+
|
|
212
|
+
Three modules shipped as one, because they are one capability: the index, the list it
|
|
213
|
+
produces, and the command that prints them when nothing else is running.
|
|
214
|
+
|
|
215
|
+
**Exposure is a vector with its components named, never a probability.** The request that
|
|
216
|
+
started this asked for *"the probability of an error"*. It is not computable from these
|
|
217
|
+
inputs, and a number dressed as one is the class this repository has spent its history
|
|
218
|
+
removing — so the guard rejects a `%` on that line outright:
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
exposure: 99 unverified · never checked · 10 releases carry one
|
|
222
|
+
REQ-001 references/setup.md — the entry audit: when it runs … v1.10.0
|
|
223
|
+
…
|
|
224
|
+
and 91 more — the full list is `/task-pipeline checkup`
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**`never checked`, not `0 days`.** When no row has ever been confirmed — this repo's
|
|
228
|
+
exact state — a zero would read as *checked today*, the precise inversion this pipeline
|
|
229
|
+
exists to prevent. The literal is required by its own guard.
|
|
230
|
+
|
|
231
|
+
**A single score was refused on purpose.** One number invites a threshold, and a
|
|
232
|
+
threshold here is a target on `never`, which `verification.md` says may never have one.
|
|
233
|
+
The components are one line; a reader can hold three.
|
|
234
|
+
|
|
235
|
+
**`/task-pipeline checkup` runs with no task in flight**, which is the whole point:
|
|
236
|
+
accumulated unconfirmed work is invisible precisely because nobody is running a pipeline,
|
|
237
|
+
so a check living only inside a run can never say *stop, fourteen things are
|
|
238
|
+
unconfirmed*. It reads four files this pipeline already keeps and writes nothing unless
|
|
239
|
+
asked — and then only board rows whose `Source` names the checkup, printed before they
|
|
240
|
+
are added.
|
|
241
|
+
|
|
242
|
+
**And `continuity.md` finally names the file it always demanded.** It has required each
|
|
243
|
+
iteration to re-measure the work-list since the beginning, and said *"next up is X"* is
|
|
244
|
+
a claim no gate reads. The board is that list; the claim now cites a `B-NNN`, which can
|
|
245
|
+
be checked, rather than a description, which cannot.
|
|
246
|
+
|
|
247
|
+
**Two defects in the new guard, both self-inflicted and both instructive.** Its needle
|
|
248
|
+
looked for *"never a percentage"* while the doctrine it guards says *"no percentage,
|
|
249
|
+
ever"* — guard and prose written an hour apart, already disagreeing. And the `%` check
|
|
250
|
+
searched for a literal that its own line necessarily contains, so it matched **itself**
|
|
251
|
+
and passed a planted percentage. A detector that matches itself first is checking the
|
|
252
|
+
wrong thing.
|
|
253
|
+
|
|
254
|
+
Guards: 185 → **188**, property checks 8.
|
|
255
|
+
|
|
3
256
|
## v1.32.0 — the column a machine may not fill
|
|
4
257
|
|
|
5
258
|
Stage 8 already performs the verification trio, reads the CI verdict and opens the
|
package/CONTRIBUTING.md
CHANGED
|
@@ -396,12 +396,87 @@ property check proves that filling the column does not fail the build, because a
|
|
|
396
396
|
that punishes an honest answer will not receive one.
|
|
397
397
|
*(guard: `either a date or the literal` and `is in no brief's REQ table`)*
|
|
398
398
|
|
|
399
|
-
**46.
|
|
399
|
+
**46. Exposure prints as a named vector and never as a probability.** The request that
|
|
400
|
+
produced it asked for `P(defect)`; it is not computable from these inputs, and a single
|
|
401
|
+
score invites a threshold, which is a target on `never` — the one thing the verification
|
|
402
|
+
ledger says may never have one. A `%` on that line fails the build. Where no row has ever
|
|
403
|
+
been confirmed the line prints the literal `never checked`, because `0 days` reads as
|
|
404
|
+
*checked today*. The doctrine carries both rules where a reader proposing a percentage
|
|
405
|
+
will find them.
|
|
406
|
+
*(guard: `may never take` and `carry it where the next reader looks`)*
|
|
407
|
+
|
|
408
|
+
**47. Every invariant above names the guard that enforces it, and that guard exists.**This list claims to be *what the validator enforces*; it was eight guards behind when
|
|
400
409
|
an audit measured it. A claim of enforcement is now checked like any other claim.
|
|
401
410
|
*(guard: `whose message does not appear in`)* — and a cited literal must lie inside
|
|
402
411
|
a **single** string in `test/validate.py`: the check reads that file as text, so a
|
|
403
412
|
quote straddling a line-continuation is a citation nothing can find.
|
|
404
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
|
+
|
|
405
480
|
## Adding or changing doctrine
|
|
406
481
|
|
|
407
482
|
- **Change one idea per PR.** These files are read by agents under load; a PR that
|
package/README.md
CHANGED
|
@@ -128,9 +128,11 @@ 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 |
|
|
135
|
+
| how much is unconfirmed | [`exposure.md`](plugins/task-pipeline/skills/task-pipeline/references/exposure.md) — the unconfirmed count as a **vector with its components named**, never a percentage: `P(defect)` is not computable from these inputs and a single score invites a threshold, which is a target on `never`. Plus the check-list, oldest first, and the `/task-pipeline checkup` mode that prints it with no task in flight |
|
|
134
136
|
| 0 + 9 + any settled decision | [`documentation.md`](plugins/task-pipeline/skills/task-pipeline/references/documentation.md) — the inventory, registers and ids, SSOT, the Doc Loop, supersede semantics, the propagation matrix, intent vs as-built |
|
|
135
137
|
| 3 + 4 · every spec and plan | the self-review reads its rules back — is every named check real, does anything contradict a locked decision or a rejected option, and what does this cost now versus at design time. Answers land as a committed `## Self-review` of computed numbers |
|
|
136
138
|
| 6–10 + any check you write | [`gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) — the three axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors |
|
|
@@ -613,6 +615,17 @@ GATE 10 acceptance: PASS — 14/14 REQ verified
|
|
|
613
615
|
abstained: 1 (1 cannot-verify) · unlooked: 0
|
|
614
616
|
```
|
|
615
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
|
+
|
|
616
629
|
Stage 0 reads those standing instructions **in full** on the next run — which is
|
|
617
630
|
the whole reason the cap exists and the prune is a gate criterion instead of a good
|
|
618
631
|
intention. A rule nobody reads to the end is worse than no rule: everyone believes
|
|
@@ -632,6 +645,17 @@ The spec stage runs it **before any plan is written**: `/ux` (setup check) →
|
|
|
632
645
|
stages served, applicable UX patterns — and the plan's UI tasks carry scenario IDs
|
|
633
646
|
in their DoD. Scenarios come before interface.
|
|
634
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
|
+
|
|
635
659
|
```
|
|
636
660
|
/plugin marketplace add ssheleg/super-ux
|
|
637
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.
|
|
15
|
+
| **Version** | 1.37.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
|
-
##
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
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
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-pipeline-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.37.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"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "task-pipeline",
|
|
3
3
|
"displayName": "Task Pipeline",
|
|
4
4
|
"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/manual gates, a frozen requirement spine that must close with evidence, a loop guard that breaks churn, one provider-agnostic model confirmed up front, and an optional super-ux UX track for user-facing work.",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.37.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "ssheleg",
|
|
8
8
|
"url": "https://x.com/sshlg93"
|
|
@@ -44,6 +44,17 @@ Idempotent entry — inspect state first, never restart blindly:
|
|
|
44
44
|
- Otherwise, begin at stage 0 (intake grill). If no task is given above, the
|
|
45
45
|
grill's first question asks the operator for the task in one line.
|
|
46
46
|
|
|
47
|
+
**`/task-pipeline checkup`** — **runs with no task in flight, and that is the point.**
|
|
48
|
+
Accumulated unconfirmed work is invisible precisely because nobody is running a pipeline,
|
|
49
|
+
so a check living only inside a run can never say *"stop, fourteen things are
|
|
50
|
+
unconfirmed."* It takes no brief, opens no grill, and writes nothing on its own. Four
|
|
51
|
+
sections, each read from a file this pipeline already keeps: the **exposure** line with
|
|
52
|
+
its check-list oldest-first, the **board**'s open rows by computed priority, the
|
|
53
|
+
carry-over ledgers' unresolved count, and the code graph's staleness where one exists.
|
|
54
|
+
Where you ask it to file what it found, it appends board rows whose `Source` names the
|
|
55
|
+
checkup and its date — printing what it would add first, never silently. Doctrine:
|
|
56
|
+
`references/exposure.md`.
|
|
57
|
+
|
|
47
58
|
**`/task-pipeline setup`** — the entry audit instead of a feature. Runs seven passes
|
|
48
59
|
over the documentation this project already has, reports findings as `file:line` + the
|
|
49
60
|
minimal fix ordered by seam, and hands back a fix plan the pipeline can run. Offered
|
|
@@ -67,9 +67,11 @@ gate stops until it is installed.
|
|
|
67
67
|
| **first run · the entry audit** (offered once) | [`references/setup.md`](references/setup.md) |
|
|
68
68
|
| **what travels with the bundle vs stays in a project** | [`references/portability.md`](references/portability.md) |
|
|
69
69
|
| any repeating loop | [`references/loop-guard.md`](references/loop-guard.md) |
|
|
70
|
+
| run-wide · what the run **prints about itself** — the rail, the iteration line | [`references/progress.md`](references/progress.md) |
|
|
70
71
|
| run-wide · how a run keeps going (the loop mode + the context budget) | [`references/continuity.md`](references/continuity.md) |
|
|
71
72
|
| run-wide · the work-list **between** runs, and how its priority is computed | [`references/backlog.md`](references/backlog.md) |
|
|
72
73
|
| run-wide · whether a **human** ever confirmed what shipped, and when | [`references/verification.md`](references/verification.md) |
|
|
74
|
+
| run-wide · how much unconfirmed work has piled up, and what to look at first | [`references/exposure.md`](references/exposure.md) |
|
|
73
75
|
|
|
74
76
|
**Optional bridge.** If the operator already runs an equivalent skill set (e.g.
|
|
75
77
|
`superpowers:brainstorming` / `writing-plans` / `subagent-driven-development` /
|