task-pipeline-skill 1.97.1 → 1.99.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 +283 -0
- package/HOW-IT-WORKS.md +17 -13
- package/README.md +13 -10
- package/SKILL-CARD.md +1 -1
- package/cursor/rules/task-pipeline.mdc +22 -14
- package/evals/task-pipeline.evals.json +3 -3
- package/package.json +1 -1
- package/plugins/task-pipeline/.claude-plugin/plugin.json +2 -2
- package/plugins/task-pipeline/commands/task-pipeline.md +14 -219
- package/plugins/task-pipeline/skills/evidence-docs/SKILL.md +8 -1
- package/plugins/task-pipeline/skills/evidence-docs/references/GENERATED.md +1 -1
- package/plugins/task-pipeline/skills/evidence-docs/references/learned.md +24 -1
- package/plugins/task-pipeline/skills/evidence-docs/references/retrospective.md +21 -576
- package/plugins/task-pipeline/skills/project-audit/SKILL.md +8 -1
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +162 -230
- package/plugins/task-pipeline/skills/task-pipeline/graph.schema.json +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.example.json +9 -9
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json +11 -4
- package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +2 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +3 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/build.md +22 -7
- package/plugins/task-pipeline/skills/task-pipeline/references/certification.md +49 -44
- package/plugins/task-pipeline/skills/task-pipeline/references/continuity.md +6 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/doctrine-map.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/finish-line.md +13 -8
- package/plugins/task-pipeline/skills/task-pipeline/references/iteration.md +188 -32
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +5 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +24 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +17 -7
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +49 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +5 -4
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-00-intake.md +39 -25
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-05-dev.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +36 -28
- package/plugins/task-pipeline/skills/task-pipeline/references/waves.md +8 -5
- package/plugins/task-pipeline/skills/task-pipeline/scripts/graph.py +79 -22
- package/plugins/task-pipeline/skills/task-pipeline/scripts/lessons.py +1229 -110
- package/plugins/task-pipeline/skills/task-pipeline/scripts/retro_budget.py +305 -0
- package/plugins/task-pipeline/skills/task-pipeline/scripts/short_path.py +70 -0
- package/plugins/task-pipeline/skills/task-pipeline/scripts/waves.py +22 -10
- package/plugins/task-pipeline/skills/task-pipeline/templates/canvas.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/templates/lesson.schema.json +38 -10
- package/plugins/task-pipeline/skills/task-pipeline/templates/retro-archive.md +9 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/retro.md +10 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,286 @@
|
|
|
1
|
+
## v1.99.0 (2026-10-21)
|
|
2
|
+
|
|
3
|
+
Guards: 448 → **530**; property checks 15 → **15**. There are 82 new negatives in
|
|
4
|
+
`lessons.py`. Each one plants a revert, and the suite must catch it:
|
|
5
|
+
|
|
6
|
+
- the whole-scan refusal put back;
|
|
7
|
+
- the carry-forward removed;
|
|
8
|
+
- status computed without carried origins;
|
|
9
|
+
- prune on every run;
|
|
10
|
+
- git worktrees no longer discovered;
|
|
11
|
+
- memory ids keyed by retro anchor;
|
|
12
|
+
- one memory id left on two class keys;
|
|
13
|
+
- problems attributed by path prefix;
|
|
14
|
+
- `emit`/`record` ignoring the origin that holds the memory id;
|
|
15
|
+
- memory ids compared together with their `@revision`;
|
|
16
|
+
- a stranger at the same path not recognised;
|
|
17
|
+
- `record` putting one memory id on two class keys;
|
|
18
|
+
- an origin removed on its own;
|
|
19
|
+
- a memory id moved to another project's origin;
|
|
20
|
+
- an origin carried as `checkout holds another project` counted;
|
|
21
|
+
- a project key taken from the checked-out branch;
|
|
22
|
+
- a stranger called on a key alone, though the origin's commit resolves;
|
|
23
|
+
- `record` taking another project's id;
|
|
24
|
+
- `record` writing an id the loader refuses;
|
|
25
|
+
- a title carrying a Unicode line separator;
|
|
26
|
+
- the index split on Unicode line breaks;
|
|
27
|
+
- a rebuild printing absolute paths;
|
|
28
|
+
- `--prune-carried-reason` accepted alone, or taking any string, or offering a reason that
|
|
29
|
+
never occurs;
|
|
30
|
+
- merged duplicate lines dropping an id silently;
|
|
31
|
+
- `add` counting a phantom project after a re-init;
|
|
32
|
+
- a shallow check trusted when it times out;
|
|
33
|
+
- an index line accepted with `mem:x@0` or with an unknown `carried` reason;
|
|
34
|
+
- an origin v1.95.0 wrote kept as a second project, by `rebuild` or by `add`;
|
|
35
|
+
- that re-key made for an origin with provenance, between two candidate repositories, or
|
|
36
|
+
merging two memory ids (in `rebuild` and in `add`);
|
|
37
|
+
- `record` re-attaching an id from another checkout;
|
|
38
|
+
- one memory id left on two live projects, or kept by the later holder;
|
|
39
|
+
- a project key skipping the main worktree's HEAD or `init.defaultBranch`;
|
|
40
|
+
- redaction replacing a relative name, or inside a longer name;
|
|
41
|
+
- a session note, a newer-format notice or a refusal printing an absolute path;
|
|
42
|
+
- a stage id carrying a line break or a path;
|
|
43
|
+
- a same-revision duplicate decided by the order of lines;
|
|
44
|
+
- a re-key taking a commit from a merged history, ignoring the key v1.95.0 would compute, or
|
|
45
|
+
moving a project read this run;
|
|
46
|
+
- `add` leaving one id on two live projects; the id kept by the smaller key instead of the
|
|
47
|
+
earlier holder;
|
|
48
|
+
- a rebuild asking git the same question again;
|
|
49
|
+
- `query`, an `add` refusal or the repository top printing an absolute path;
|
|
50
|
+
- an index set aside for a stage id v1.95.0 accepted, or one normalised past 32 characters;
|
|
51
|
+
- the schema admitting a blank stage id;
|
|
52
|
+
- a partial rebuild or an `add` moving an origin of a project the index already knows;
|
|
53
|
+
- an origin carried as `checkout holds another project` counted as a live holder of its id;
|
|
54
|
+
- a re-key that does not record where the id came from, in `rebuild` or `add`, or loses that
|
|
55
|
+
source on a repeated `add` or a rebuild;
|
|
56
|
+
- `rebuild`, `add` or `record` never giving a re-keyed id back to its source project, or
|
|
57
|
+
giving it back while leaving it on the other project too, or over that project's own id;
|
|
58
|
+
- an index line accepted with an impossible `rekeyedFrom`;
|
|
59
|
+
- an id dropped by the one-project or the one-class rule keeping its `rekeyedFrom`, a re-key
|
|
60
|
+
source given to every project holding that id, a reclaim to a project never read, the main
|
|
61
|
+
worktree's HEAD keying the repository before `init.defaultBranch`, and `save` writing a line
|
|
62
|
+
the loader refuses;
|
|
63
|
+
- `record --replace` keeping the replaced id's `rekeyedFrom`, and an `add` or rebuild re-key
|
|
64
|
+
giving a twin's own id a source it never had.
|
|
65
|
+
|
|
66
|
+
These are the fixes from verification rounds 6 to 18 of release iteration 1.
|
|
67
|
+
|
|
68
|
+
- **A replaced id takes its source with it** (round 18). `record --replace` gave the origin a
|
|
69
|
+
new id but kept the `rekeyedFrom` of the re-keyed id it replaced, so the next read of that
|
|
70
|
+
source project took X's own record, and X's later record of it was refused. An origin given
|
|
71
|
+
another id now drops the source. A re-key whose legacy origin held no id no longer tags the
|
|
72
|
+
twin's own id with the legacy project as its source.
|
|
73
|
+
|
|
74
|
+
- **No write leaves a line the loader refuses; only a read project reclaims** (round 17).
|
|
75
|
+
When the one-project or the one-class rule took a memory id off an origin, `rekeyedFrom`
|
|
76
|
+
stayed behind; the loader refuses a source beside no id, so the next command set the whole
|
|
77
|
+
index aside as `.corrupt-<date>` and every lesson in it left the live index. The source now
|
|
78
|
+
leaves with the id, and it follows the (id, project) it was recorded for: another project
|
|
79
|
+
holding the same id is never given one. `save` reads every line back as the loader does and
|
|
80
|
+
refuses to write one it would refuse, the previous index intact. A re-keyed id goes back
|
|
81
|
+
only to a project actually read (an origin with provenance, not carried), never to a
|
|
82
|
+
v1.95.0 origin that could not be re-keyed in the same run. `init.defaultBranch` now keys
|
|
83
|
+
the repository before the main worktree's HEAD, so a main worktree on an orphan branch does
|
|
84
|
+
not move the key. Known, not fixed here, each with a backlog row: a `git replace --graft`
|
|
85
|
+
moves the key (B-141); a v1.95.0 origin with no twin still counts as a second project
|
|
86
|
+
(B-142); the known-project set is index-wide (B-143); a case-insensitive path read twice
|
|
87
|
+
(B-144).
|
|
88
|
+
|
|
89
|
+
- **Ownership is recoverable, not predicted** (round 16). A re-key can only judge the projects
|
|
90
|
+
it has already seen, so an `add` in X, or a rebuild of X's root alone, could take an id
|
|
91
|
+
from a repository Y that had never been read. A re-key now records its source key on the
|
|
92
|
+
origin (`rekeyedFrom`). The first time Y is read with an origin of that class key, by
|
|
93
|
+
`add` or `rebuild`, or Y records the id, the id moves back to Y, is dropped from X, and a
|
|
94
|
+
`reclaimed:` line names it. Whichever verb runs first, the final owner is the project
|
|
95
|
+
whose key the legacy store used. When Y already holds its own id for that class, nothing
|
|
96
|
+
moves, and that is said. Each lesson plant now requires its own expected failure line, not
|
|
97
|
+
any non-zero exit. Known, not fixed here: the known-project set is index-wide, not per
|
|
98
|
+
class key.
|
|
99
|
+
|
|
100
|
+
- **Ownership no longer depends on verb order** (round 15). The live-project rule now covers
|
|
101
|
+
every project the previous index records with provenance, not only the projects this run
|
|
102
|
+
read: an `add` in a repository, or a rebuild over its root alone, never re-keys another
|
|
103
|
+
known project's origin, and a later full rebuild agrees. That rule subsumes the separate
|
|
104
|
+
"no re-key with provenance" check (an origin with provenance names a known project), so the
|
|
105
|
+
check and its plant (492) are retired; the F1c test stays. Known limit, not fixed here: on a
|
|
106
|
+
case-insensitive file system one checkout reached by two spellings of its path is read
|
|
107
|
+
twice (real paths do not fold case), which can count a phantom second project; no memory
|
|
108
|
+
id ends on two projects.
|
|
109
|
+
|
|
110
|
+
- **The re-key and the one-project rule, closed** (round 14).
|
|
111
|
+
- A provenance-less origin is re-keyed only when, in the checkout that re-derived its anchor,
|
|
112
|
+
its commit descends from the root the new key names (so it resolves there) and v1.95.0
|
|
113
|
+
would have computed its key there. Round 13's separate "commit resolves" plant (490) is
|
|
114
|
+
retired: the roots check subsumes it, so reverting it alone changes nothing. So is its
|
|
115
|
+
"own key re-derived" plant (493): an origin whose own key is re-derived belongs to a project
|
|
116
|
+
read this run, which the next rule already keeps. A monorepo that merged another repository's history keeps
|
|
117
|
+
its hands off that repository's origin and memory id.
|
|
118
|
+
- An origin whose project key any checkout read this run holds is never re-keyed, whatever
|
|
119
|
+
its anchor.
|
|
120
|
+
- `add` keeps one memory id on one live project, against the index as it read it.
|
|
121
|
+
- The M/M2 fixtures put the earlier holder's key above the later one, so "the smaller key"
|
|
122
|
+
fails every run.
|
|
123
|
+
- One `cat-file` per (checkout, commit) in a run.
|
|
124
|
+
- Every verb's messages name files, the index home-relative; `path` alone prints a path.
|
|
125
|
+
- A stage id v1.95.0 accepted that lesson/1 now refuses is normalised on read and said, so no
|
|
126
|
+
line and no memory id goes to the corrupt file. The schema's string stage ids are not blank.
|
|
127
|
+
- The pre-tag admission packet cites the v1.94.0 commit, not the tag object, which a clone
|
|
128
|
+
without tags does not hold.
|
|
129
|
+
|
|
130
|
+
- **Upgrade and ownership in `lessons.py`** (round 13).
|
|
131
|
+
- An index written by v1.95.0 (keyed on the smallest root of HEAD, no provenance) no longer
|
|
132
|
+
turns a repository that merged an unrelated history into two projects. An origin with no
|
|
133
|
+
provenance whose `retro#anchor` this run re-derives under exactly one other key, and whose
|
|
134
|
+
commit resolves in that checkout, is re-keyed: its memory id follows, and `emit` and
|
|
135
|
+
`record` keep using it. `add` does the same for its own checkout. Never with provenance,
|
|
136
|
+
never when its own key is re-derived, never between two candidates, never merging two ids.
|
|
137
|
+
- `record` re-attaches an id held by an origin carried as `checkout holds another project`
|
|
138
|
+
only from a checkout in that origin's provenance (a re-init at the same path).
|
|
139
|
+
- A rebuild never leaves one memory id on two live projects: the earlier holder keeps it,
|
|
140
|
+
and the other origin is named and keeps its place without it.
|
|
141
|
+
- Without `origin/HEAD`, `main` or `master`, the project key is the main worktree's HEAD,
|
|
142
|
+
then `init.defaultBranch`, so a linked worktree on an orphan branch is the same project.
|
|
143
|
+
- Redaction replaces only absolute paths, as whole path components (`--roots .` deleted every
|
|
144
|
+
dot), and stderr (the session's notes, the newer-format notice, a refusal) is redacted
|
|
145
|
+
like stdout (in `rebuild`; every verb since round 14).
|
|
146
|
+
- A stage id given as a string gets the text checks: one line, at most 32 characters, no
|
|
147
|
+
path or credential shape.
|
|
148
|
+
- Two copies of one origin at the same revision keep the lexically smaller id, whatever the
|
|
149
|
+
order of the lines.
|
|
150
|
+
|
|
151
|
+
- **Identity and safety in `lessons.py`** (round 12).
|
|
152
|
+
- The project key is the repository's: the first-parent root of its default branch, once
|
|
153
|
+
per git common dir. A worktree on a branch that merged an unrelated history, or a checkout
|
|
154
|
+
on an orphan `gh-pages`, is still its project.
|
|
155
|
+
- `checkout holds another project` applies only when the origin's own commit does not
|
|
156
|
+
resolve in that checkout. `add` applies the same rule to its checkout's old-key origin, so
|
|
157
|
+
a re-init never counts a phantom project, even before the next rebuild.
|
|
158
|
+
- `record` refuses an id another project's origin holds, naming the project (exit 1), and an
|
|
159
|
+
id the loader would refuse (exit 2).
|
|
160
|
+
- lesson/1 text (a string stage id too, since round 13) refuses every line separator,
|
|
161
|
+
including U+2028, U+2029 and U+0085. The index
|
|
162
|
+
is split on `\n` only, so a value can never make it read as corrupt.
|
|
163
|
+
- Rebuild messages name checkouts and files, never an absolute path.
|
|
164
|
+
- `--prune-carried-reason` needs `--prune-carried` and offers only the reasons a rebuild
|
|
165
|
+
produces; otherwise it is a usage error, exit 2.
|
|
166
|
+
- Merged duplicate lines name the id they drop and keep the higher revision.
|
|
167
|
+
- A shallow check that does not answer is refused: no source, and a problem named.
|
|
168
|
+
|
|
169
|
+
- **`lessons.py rebuild` never removes or moves anything on its own** (round 11, narrowed
|
|
170
|
+
under the loop guard).
|
|
171
|
+
- Every previous origin the run does not re-derive is carried with everything recorded on
|
|
172
|
+
it, its memory id included, and marked `carried: <reason>`.
|
|
173
|
+
- `--prune-carried`, optionally narrowed by `--prune-carried-reason <reason>`, is the only way
|
|
174
|
+
an origin leaves the index.
|
|
175
|
+
- Nothing supersedes and nothing moves: a memory id stays on the origin that holds it, and is
|
|
176
|
+
re-attached only to the same `(project, classKey)`.
|
|
177
|
+
- The reasons are `checkout not read`, `retro file not read`, `no checkout read holds it`
|
|
178
|
+
(the checkout read the file and the entry is gone), `commit does not resolve`,
|
|
179
|
+
`retro cites a commit that does not resolve`, `lesson refused`, `no provenance` and
|
|
180
|
+
`checkout holds another project`. The last one is kept but not counted in `seen`,
|
|
181
|
+
`projects` and `status`; the others count as temporary unavailabilities. So no phantom
|
|
182
|
+
project appears, and an unreadable root never demotes a lesson.
|
|
183
|
+
- A shallow clone is never a source: a problem owned by its checkout, with nothing derived
|
|
184
|
+
under its unstable key. `add`, `emit-observatory` and `record` refuse there, exit 1, and say
|
|
185
|
+
to deepen it.
|
|
186
|
+
- Known limit: a project whose root commit changes (re-init, unshallow) starts new store
|
|
187
|
+
records. The operator re-attaches by `record`-ing the old id on the new origin of the same
|
|
188
|
+
class key.
|
|
189
|
+
- `record` over a different id the origin already holds needs `--replace`. It also refuses an
|
|
190
|
+
id another class key holds and a revision older than the one held.
|
|
191
|
+
- Each origin records its provenance, `checkouts`, the real paths it was derived from. It
|
|
192
|
+
decides only the carried reason; it stays in the local index, is never emitted, and `show`
|
|
193
|
+
omits it. A path is not an identity.
|
|
194
|
+
- Git worktrees of every checkout found are discovered, including those under
|
|
195
|
+
`.worktrees/` and `.claude/worktrees/`. Problems carry a structural owner and are printed by
|
|
196
|
+
name, never by absolute path or prefix match.
|
|
197
|
+
- Retro files are stamped when read and again under the lock. A file that changed in
|
|
198
|
+
between, such as an `add` landing mid-run, leaves its checkout not read for that run.
|
|
199
|
+
- Memory ids follow `(project, classKey)`, compare on the part before `@`, start at revision
|
|
200
|
+
1, and keep the highest revision everywhere. One id is never on two class keys, and the run
|
|
201
|
+
refuses to write if an id would vanish other than by `--prune-carried`.
|
|
202
|
+
- Index lines are re-derived from their origins on every read: `seen`, `projects`, `status`
|
|
203
|
+
and the rest are never trusted from disk, and duplicate origins and duplicate lines merge.
|
|
204
|
+
A line with wrong types, an origin lesson that fails lesson/1, a `carried` outside the
|
|
205
|
+
enum, or `mem:…@0` is a corrupt line. It is salvaged around and never causes a traceback.
|
|
206
|
+
A memory id that only a bad line held is named in the output.
|
|
207
|
+
- Exit 1 means nothing could be read: every root was missing or unreadable. A readable empty
|
|
208
|
+
root, or one holding only a shallow clone, exits 0.
|
|
209
|
+
|
|
210
|
+
- **`lessons.py rebuild` never loses what it cannot re-derive.** Round 6's narrowed refusal
|
|
211
|
+
dropped an origin and its memory id while a project's root was unreadable. It also still
|
|
212
|
+
refused the routine case: an indexed lesson whose commit was pruned after a squash merge.
|
|
213
|
+
Rebuild now derives every lesson it can read. Every previous origin whose source it could
|
|
214
|
+
not re-derive is carried forward with everything recorded on it, marked `carried`, and
|
|
215
|
+
named. That covers a root not read or outside the scan, a commit that no longer resolves,
|
|
216
|
+
and a refused entry. Carried origins count toward `seen`, `projects` and `status`. They are
|
|
217
|
+
re-derived and un-marked when the source reads again, and are removed only by the new
|
|
218
|
+
`--prune-carried`. Rebuild exits 0 whenever anything was read, and exits 1, touching
|
|
219
|
+
nothing, only when nothing could be read. The loss guard and `--force` are gone.
|
|
220
|
+
`templates/lesson.schema.json` declares the `carried` field.
|
|
221
|
+
- The merge notice no longer says "read both" when the family index was corrupt and set aside.
|
|
222
|
+
- Docs: `continuity.md` names `graph.py next` exit `6` beside `4`, pinned by
|
|
223
|
+
`continuity_doc_test.py`, and `waves.md` lists `6` for `next --wave N`. The `graph.py`
|
|
224
|
+
docstring says exit `3` counts parked nodes as finished. In `stages.md` and `README.md`,
|
|
225
|
+
`checks` mode puts the release run on a watcher. The release-authority rule has one home,
|
|
226
|
+
`deploy-targets.md`, and `pipeline.schema.json` points to it.
|
|
227
|
+
- Lessons of this run, now doctrine: `iteration.md` checks for parallel work on the same
|
|
228
|
+
nodes before each cycle, across every tool's branch prefixes. `build.md` adds a
|
|
229
|
+
command-hygiene block that every background dispatch carries.
|
|
230
|
+
|
|
231
|
+
## v1.98.0 (2026-10-20)
|
|
232
|
+
|
|
233
|
+
Guards: 448 → **448**; property checks 15 → **15**.
|
|
234
|
+
|
|
235
|
+
A cheaper run that stops looping, and the operators' retro insights in the retro doctrine.
|
|
236
|
+
Measured on 2026-10-20: before any code a run was told to read about 236 KB of doctrine
|
|
237
|
+
(the command 14 KB restating `SKILL.md` 21 KB, plus companion-skills, model-tiering,
|
|
238
|
+
continuity, stages, stage 0, grill, knowledge-sources and gates.md "at every stage"); a
|
|
239
|
+
small fix met eleven stages because the short path was only proposed and silence took the
|
|
240
|
+
full flow; every node closed through three blind tiers, R2 owed two rounds, the
|
|
241
|
+
certification ceiling only measured, the review loop ran to five rounds; and the retro
|
|
242
|
+
floor stage 0 reads in full ran up to ~76k tokens in one project, 27 620 bytes here.
|
|
243
|
+
|
|
244
|
+
**A. Proportional run.** Stage 0's short-path triage now decides instead of proposing:
|
|
245
|
+
when the gap check leaves no material unknown and the change is R1, at most five files,
|
|
246
|
+
no public contract, no user-facing change and no deploy, the run takes the short path and
|
|
247
|
+
says so in one line (brief in the run ledger, build with tests, one verification, docs
|
|
248
|
+
and handoff, a retro entry only for a new lesson). `scripts/short_path.py` computes it.
|
|
249
|
+
The example's gates at stages 0, 2, 3, 7 and 10 are `auto`; the operator's answer or the
|
|
250
|
+
standing authorization recorded in the brief is the go, and a project that wants the wait
|
|
251
|
+
sets a gate `manual` in its own `pipeline.json`.
|
|
252
|
+
|
|
253
|
+
**B. Reading diet.** At entry a run reads `SKILL.md` only (its stage table is the index);
|
|
254
|
+
each stage's section of `stages.md` and its detail load when the stage starts; grill,
|
|
255
|
+
knowledge-sources, companion-skills, continuity, model-tiering and gates.md load on named
|
|
256
|
+
triggers. The command is a 1.5 KB pointer. Measured, the floor before code on the short
|
|
257
|
+
path is 35 KB (was 236 KB; 80 KB when the grill and knowledge-sources triggers fire);
|
|
258
|
+
`SKILL.md` is 16.2 KB, 3 753 cl100k tokens of body (was 4 709, cap 5 000). The three descriptions are 386, 399 and 395 characters; every trigger phrase
|
|
259
|
+
they dropped moved verbatim into a `## Triggers` section of the same `SKILL.md`.
|
|
260
|
+
|
|
261
|
+
**C. Anti-loop.** `graph.py certify`: an R1 node certifies with one blind tier; R2 owes one
|
|
262
|
+
passing round, R3 two (one blind, one adversarial), a flagship surface two with one
|
|
263
|
+
adversarial; a round of the same kind on an unchanged tree is refused; at the ceiling the
|
|
264
|
+
node is parked with its evidence (exit 7) instead of measured. `waves.py finish
|
|
265
|
+
--clean-rounds` (default 1; 2 for an R3 or flagship iteration). The fix loop and the
|
|
266
|
+
review loop cap at three rounds and stop.
|
|
267
|
+
|
|
268
|
+
**D. Retro doctrine.** The floor (standing instructions plus run stamps) has a 12 000-byte
|
|
269
|
+
budget, a standing row at most 600 characters, a stamp at most 300; stage 0 prints the
|
|
270
|
+
bytes and bytes/4 tokens, gate 10 fails over budget. `scripts/retro_budget.py`
|
|
271
|
+
(`check`, `migrate --write`, `verify`) moves narrative to the archive verbatim with a
|
|
272
|
+
sha256 per block; this repository's floor went from 27 620 to 6 532 bytes that way. Each
|
|
273
|
+
entry names its Class (13 classes) and Cost; a standing row is searched against
|
|
274
|
+
`learned.md` and the lesson index first; a lesson standing in two projects goes upstream
|
|
275
|
+
in the same run. `learned.md` gains rules 33 to 39 from the 2026-10-20 audit of ~54
|
|
276
|
+
retrospectives. evidence-docs' 34.7 KB copy of the retro doctrine is now a pointer.
|
|
277
|
+
|
|
278
|
+
Tests: `graph_test.py` 171 → 173 cases (tier count by risk, unchanged-input refusal,
|
|
279
|
+
ceiling stops), `waves_test.py` 135 cases with `--clean-rounds`,
|
|
280
|
+
`test/audit_regressions/diet_retro_budget.py` (9 cases, over-budget plants must fail) and
|
|
281
|
+
`diet_proportional.py` (6 cases). Twelve negative plants retargeted to the new wording
|
|
282
|
+
(stage 0 and 10 gates name their authorization and the hand-back instead of `manual`).
|
|
283
|
+
|
|
1
284
|
## v1.97.1 — 2026-10-17
|
|
2
285
|
|
|
3
286
|
The same source as v1.97.0, plus its release declaration. The v1.97.0 tag failed its own release run
|
package/HOW-IT-WORKS.md
CHANGED
|
@@ -28,11 +28,12 @@ you asked for.
|
|
|
28
28
|
## 1. How a request finds the pipeline
|
|
29
29
|
|
|
30
30
|
An agent choosing skills sees exactly one thing: the `description` field in
|
|
31
|
-
`SKILL.md`. It is capped at **1024 characters
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
`SKILL.md`. It is capped at **1024 characters**, and since 1.98.0 it is the short
|
|
32
|
+
form (`B-001` on the board tracks the measured length): every host preloads it into
|
|
33
|
+
every session. The full trigger list, unchanged, sits under `## Triggers` in the same
|
|
34
|
+
file, where the family's routing hook and this repository's checks read it.
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
That list is written in three parts, and the middle one was learned the hard way:
|
|
36
37
|
|
|
37
38
|
- **Work that changes the repository** — a feature, fix, refactor, migration,
|
|
38
39
|
integration, rewrite, adoption or hardening, in English and Russian both.
|
|
@@ -125,23 +126,26 @@ it has been forgotten.
|
|
|
125
126
|
| | Stage | What must be true to leave it | Gate |
|
|
126
127
|
|---|---|---|---|
|
|
127
128
|
| 1 | Docs study | every contract the design will lock is grounded on **fetched** docs, not recall | auto |
|
|
128
|
-
| 2 | Brainstorm + decompose | design approved, every REQ answered by it. A platform is cut into modules, **walking skeleton first**, every REQ in exactly one module |
|
|
129
|
-
| 3 | Spec | contracts locked. User-facing work runs three tracks — what it **does**, how it **sounds**, how it **looks**. A declined track is recorded, never silent |
|
|
129
|
+
| 2 | Brainstorm + decompose | design approved, every REQ answered by it. A platform is cut into modules, **walking skeleton first**, every REQ in exactly one module | auto |
|
|
130
|
+
| 3 | Spec | contracts locked. User-facing work runs three tracks — what it **does**, how it **sounds**, how it **looks**. A declined track is recorded, never silent | auto |
|
|
130
131
|
| 4 | Plan | the REQ set-comparison holds: brief REQs == union of `Implements:` | auto |
|
|
131
132
|
| 5 | Build | TDD per task, a review after each, findings fixed or parked **with a ruling** | auto |
|
|
132
133
|
| 6 | Tests | the **full** suite green; a web surface checked in a browser, not in the diff | auto |
|
|
133
|
-
| 7 | Lint + deploy | the authorization is specific, and the CI verdict is **read** before any tag |
|
|
134
|
+
| 7 | Lint + deploy | the authorization is specific, and the CI verdict is **read** before any tag | auto |
|
|
134
135
|
| 8 | Post-deploy | the verification trio, not one of three; a verification row per shipped REQ | auto |
|
|
135
136
|
| 9 | Docs + wiki | **three** artifacts — module docs, the wiki, and the code graph | auto |
|
|
136
|
-
| 10 | Acceptance | the ladder walk first, then the table, then the retrospective |
|
|
137
|
+
| 10 | Acceptance | the ladder walk first, then the table, then the retrospective | auto |
|
|
137
138
|
|
|
138
|
-
### Why
|
|
139
|
+
### Why every gate ships `auto`
|
|
139
140
|
|
|
140
141
|
`auto` means the agent verifies the check itself and proceeds. `manual` means it
|
|
141
|
-
waits for an explicit go.
|
|
142
|
-
wrong turn is expensive
|
|
143
|
-
|
|
144
|
-
|
|
142
|
+
waits for an explicit go. Until 1.98.0 the example made stages 0, 2, 3, 7 and 10
|
|
143
|
+
manual, the places where a wrong turn is expensive: **the brief**, **what we are
|
|
144
|
+
building**, **the contracts**, **the outside world** and **whether it is done**. Under an
|
|
145
|
+
operator's standing "decide and act" instruction each of them was a pause nobody
|
|
146
|
+
answered, so the example ships them `auto`: the approval they name is read from the
|
|
147
|
+
operator's answer or the standing authorization recorded in the brief, and a project
|
|
148
|
+
that wants the wait sets the gate `manual` in its own `pipeline.json`.
|
|
145
149
|
|
|
146
150
|
---
|
|
147
151
|
|
package/README.md
CHANGED
|
@@ -182,7 +182,7 @@ and the inline fallback satisfy the same [provider contract](plugins/task-pipeli
|
|
|
182
182
|
| 3 Spec | [`spec.md`](plugins/task-pipeline/skills/task-pipeline/references/spec.md) — UX-track order, locked contracts, global constraints, self-review |
|
|
183
183
|
| 4 Plan | [`planning.md`](plugins/task-pipeline/skills/task-pipeline/references/planning.md) — zero-context tasks, parallel groups, no placeholders |
|
|
184
184
|
| the queue | [`work-graph.md`](plugins/task-pipeline/skills/task-pipeline/references/work-graph.md) — a script walks the graph so the model never reads it: 400 nodes and 4 print the same 27-byte frontier |
|
|
185
|
-
| closing a node | [`certification.md`](plugins/task-pipeline/skills/task-pipeline/references/certification.md) — three blind readings at escalating visibility (the changed code, what reaches it, the product around it), all three required to pass — and a fourth, `verifier-visual`, on a flagship or product surface, which reads the contact sheet against the director record; a failing round records itself and the node stays open |
|
|
185
|
+
| closing a node | [`certification.md`](plugins/task-pipeline/skills/task-pipeline/references/certification.md) — three blind readings at escalating visibility (the changed code, what reaches it, the product around it), all three required to pass (one on an R1 node; a clean round ends a node unless it is R3 or flagship) — and a fourth, `verifier-visual`, on a flagship or product surface, which reads the contact sheet against the director record; a failing round records itself and the node stays open, and at the ceiling the node is parked with its evidence |
|
|
186
186
|
| 5 Build | [`build.md`](plugins/task-pipeline/skills/task-pipeline/references/build.md) + [`review.md`](plugins/task-pipeline/skills/task-pipeline/references/review.md) — isolation, ledger, subagent loop, review rubric, fix loop |
|
|
187
187
|
| 5–6 TDD | [`tdd.md`](plugins/task-pipeline/skills/task-pipeline/references/tdd.md) — the iron law, red/green/refactor, the suite gate |
|
|
188
188
|
| 5, 6, 8 The browser | [`browser.md`](plugins/task-pipeline/skills/task-pipeline/references/browser.md) — the ref model both channels share, the four commands the look is made of, sessions, and the three different things *"tested in a browser"* means |
|
|
@@ -201,7 +201,7 @@ and the inline fallback satisfy the same [provider contract](plugins/task-pipeli
|
|
|
201
201
|
| 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 |
|
|
202
202
|
| 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 |
|
|
203
203
|
| any agent-time enforcement | [`hooks.md`](plugins/task-pipeline/skills/task-pipeline/references/hooks.md) — the `PreToolUse` contract, the fail-open hazard, the Claude-Code-only limit |
|
|
204
|
-
| 7 · the tag | [`deploy-targets.md`](plugins/task-pipeline/skills/task-pipeline/references/deploy-targets.md) → *When the release waits for an approval* — `pipeline.json` → `release.approval`: `checks` (tag,
|
|
204
|
+
| 7 · the tag | [`deploy-targets.md`](plugins/task-pipeline/skills/task-pipeline/references/deploy-targets.md) → *When the release waits for an approval* — `pipeline.json` → `release.approval`: `checks` (push the tag, put the run selected by the tag on a watcher, take independent work until it reports) or `reviewers` (the direct link to the run that is `waiting`) |
|
|
205
205
|
| between stages | [`continuity.md`](plugins/task-pipeline/skills/task-pipeline/references/continuity.md) Part 3 — workflow memory through Observatory, a planned handoff (`stage_checkpoint.py handoff` / `accept`), and `hooks/memory-nudge.sh`, which reminds once when a gate returned with no memory line after it — unless the run recorded memory unavailable with `--for-run` |
|
|
206
206
|
|
|
207
207
|
**Ported, not depended on.** Stage 0 is adapted from
|
|
@@ -221,9 +221,11 @@ Before any technical work, task-pipeline closes every question the codebase and
|
|
|
221
221
|
project's records can answer, then asks you the rest in **one batch**, ordered by
|
|
222
222
|
dependency, each with a recommended answer — one at a time only where the answers
|
|
223
223
|
depend on each other or you ask for it — until every decision branch is resolved and
|
|
224
|
-
locked into a **task brief**.
|
|
225
|
-
|
|
226
|
-
|
|
224
|
+
locked into a **task brief**. The depth is proportional: a small change (R1, at
|
|
225
|
+
most five files, no public contract, no user-facing change, no deploy) takes the
|
|
226
|
+
**short path** by default, printed in one line: the brief in the run ledger, build
|
|
227
|
+
with tests, one verification, docs and handoff. Anything larger starts stage 1 only
|
|
228
|
+
on a committed, confirmed brief.
|
|
227
229
|
|
|
228
230
|
**Domain awareness.** While exploring, the grill reads the project's own
|
|
229
231
|
`CONTEXT.md` / `docs/adr/` and holds you to them — calling out terms that conflict
|
|
@@ -482,9 +484,9 @@ iteration runs in this order:
|
|
|
482
484
|
- the survey;
|
|
483
485
|
- module dossiers written in parallel, laid onto one canvas until a pass changes nothing;
|
|
484
486
|
- questions asked in rounds, never one at a time, while agents keep working;
|
|
485
|
-
- a parallel build, each node checked the moment it lands: one round
|
|
486
|
-
|
|
487
|
-
|
|
487
|
+
- a parallel build, each node checked the moment it lands: one clean round ends it (one
|
|
488
|
+
blind reading on R1, three on R2), and an R3 or flagship node owes a second, adversarial
|
|
489
|
+
round;
|
|
488
490
|
- one release, checked as released;
|
|
489
491
|
- the next pool, handed to you grouped by module.
|
|
490
492
|
|
|
@@ -506,7 +508,8 @@ every repeat pass logs one line per touched file with **the reason that forced i
|
|
|
506
508
|
|
|
507
509
|
It trips on revert-oscillation, a file edited twice for the same reason, a
|
|
508
510
|
resurrected finding, a third entry into one stage, or two loops editing one file —
|
|
509
|
-
plus hard caps (
|
|
511
|
+
plus hard caps that stop (3 fix rounds per task, 3 review rounds, 3 failing certification
|
|
512
|
+
rounds per node, 2 re-entries per stage, 3 passes per module).
|
|
510
513
|
On a trip the run **stops editing**, names shape A and shape B with their evidence,
|
|
511
514
|
escalates to the layer that owns the conflict (rubric → operator → plan → spec →
|
|
512
515
|
module map), re-plans the check as an ordered checklist with one verification
|
|
@@ -638,7 +641,7 @@ must say so.
|
|
|
638
641
|
### Held to Anthropic's own Skill authoring guidance
|
|
639
642
|
|
|
640
643
|
Audited against the four Agent Skills pages. Most of it already held — `name`
|
|
641
|
-
13/64 chars, `description`
|
|
644
|
+
13/64 chars, `description` 386/1024 chars, `SKILL.md` 207/500 lines, all 53 references
|
|
642
645
|
reachable from `SKILL.md` through explicit reference routes, and the bundle far under the 30 MB ceiling. What
|
|
643
646
|
did not, now does:
|
|
644
647
|
|
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.99.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, and **one of two browser channels** — `playwright` (CLI or MCP) or `chrome-devtools` (MCP); either satisfies the browser step and neither is required. The engine is WebKit (Safari) first; `chrome-devtools` is Chrome-only, a stated exception. Every stage's doctrine ships in-repo; user-facing stage 3 requires a valid scenario artifact; super-ux is preferred, with equivalent-provider and inline-fallback paths under the provider contract |
|
|
18
18
|
| **Evaluation status** | Suite authored, 5 categories. One recorded run, **self-observed by the author**; **zero blind runs on zero of three models** — the split, and the numbers, live in [`evals/RESULTS.md`](evals/RESULTS.md) and are computed by `evals/run.py` |
|
|
@@ -67,9 +67,14 @@ event, not the end of the run — what loses work is crossing it mid-item.
|
|
|
67
67
|
|
|
68
68
|
## Stage 0 — intake grill (MANDATORY, do this FIRST)
|
|
69
69
|
|
|
70
|
-
Never skipped, and nothing to install
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
Never skipped, and nothing to install: the grill is part of this rule. Its depth is
|
|
71
|
+
proportional. **A small change takes the short path by default** when the gap check
|
|
72
|
+
leaves no material unknown and the change is R1 risk, at most five files, no public
|
|
73
|
+
contract, no user-facing change and no deploy: say so in one line, write the brief and
|
|
74
|
+
its REQ rows into the run ledger, build with tests, run one verification, update the
|
|
75
|
+
docs and handoff, and write a retro entry only for a new lesson. Anything larger runs
|
|
76
|
+
the full flow, and a one-line task ("build feature X") is not enough to finish it
|
|
77
|
+
autonomously.
|
|
73
78
|
|
|
74
79
|
**Phase 1 — harvest the sources BEFORE the first question.** Find what the project
|
|
75
80
|
already knows about this task and read it: the code; **the code graph if one is
|
|
@@ -98,7 +103,8 @@ like any other source, and it **points while the code decides** — never the
|
|
|
98
103
|
tiebreaker.
|
|
99
104
|
**Read `docs/evidence/retro.md` in full if it exists** — its *standing
|
|
100
105
|
instructions* are what previous runs of this pipeline got wrong in this project, and
|
|
101
|
-
they bind this run (
|
|
106
|
+
they bind this run (ten rows, ten stamps, and a 12 000-byte budget for the two, so
|
|
107
|
+
reading them all is cheap; say the byte count). Stamp
|
|
102
108
|
each one the moment it fires: that date is the only evidence behind the
|
|
103
109
|
cold-retirement rule at stage 10.
|
|
104
110
|
If no wiki is installed, recommend it once and continue:
|
|
@@ -199,7 +205,7 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
|
|
|
199
205
|
## Stages 1→10
|
|
200
206
|
|
|
201
207
|
1. **Docs study** (auto) — ground every external lib/API on current docs, not recall.
|
|
202
|
-
2. **Brainstorm + decompose** (
|
|
208
|
+
2. **Brainstorm + decompose** (auto; the brief's standing authorization is the go) — read the brief, explore the code, then 2–3
|
|
203
209
|
approaches with a recommendation, YAGNI applied, design presented in sections and
|
|
204
210
|
approved. **Hard gate: no code, no scaffolding before that approval** — including
|
|
205
211
|
on "obviously simple" tasks. Record whether the task touches a user-facing surface
|
|
@@ -222,11 +228,12 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
|
|
|
222
228
|
re-measure, re-cut — and 9–10 close the release. No wave builds a shape a later
|
|
223
229
|
wave undoes. **Around the waves runs the release iteration** ("release iteration" /
|
|
224
230
|
"итерация релиза"): module dossiers integrated into one canvas, questions in batches,
|
|
225
|
-
each node verified as it lands
|
|
231
|
+
each node verified as it lands, one clean round ending it unless it is R3 or a
|
|
232
|
+
flagship surface (R1 on one blind tier; the ceiling parks a churning node), a
|
|
226
233
|
wave's stage 7 integrated without tagging, one release gated and verified as
|
|
227
234
|
released, the next pool handed back; a finding made mid-iteration joins the
|
|
228
235
|
inventory rather than being fixed alone.
|
|
229
|
-
3. **Spec** (
|
|
236
|
+
3. **Spec** (auto; the brief's standing authorization is the go) — write and commit the design; lock every shared contract
|
|
230
237
|
(types, schemas, signatures, file layout) plus a **Global Constraints** block of
|
|
231
238
|
exact values every later task inherits. Self-review it for placeholders,
|
|
232
239
|
contradictions, ambiguity and scope before showing it. For UI tasks, run the UX
|
|
@@ -284,7 +291,7 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
|
|
|
284
291
|
analysed rather than only recorded — said with the reason; a look taken only there
|
|
285
292
|
is reported as "checked in Chromium", never "tested in a browser". Never a gate. A CLI, a
|
|
286
293
|
library or a backend service is never offered either.
|
|
287
|
-
7. **Lint + deploy** (
|
|
294
|
+
7. **Lint + deploy** (auto; the brief's standing authorization is the go) — lint clean AND suite green before deploy; deploy is
|
|
288
295
|
outward → explicit user go, or the specific standing authorization recorded in
|
|
289
296
|
the stage-0 brief.
|
|
290
297
|
8. **Post-deploy** (auto) — tail logs / health-check; clean boot or an honest
|
|
@@ -320,7 +327,7 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
|
|
|
320
327
|
propose the edit and get an explicit go, or carry it over with the exact change
|
|
321
328
|
written down. A doc that was worth reading at stage 0 and is wrong now is the
|
|
322
329
|
next run's false premise.
|
|
323
|
-
10. **Acceptance** (
|
|
330
|
+
10. **Acceptance** (auto; the brief's standing authorization is the go) — the closing stage, in two halves.
|
|
324
331
|
**First the ladder walk**, because the REQ table only finds what was named and
|
|
325
332
|
lost: a comparison needs two sides and **an absence has one**. Walk each REQ
|
|
326
333
|
bottom-up through its rungs — recorded decision → spec section → contract *and
|
|
@@ -418,9 +425,10 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
|
|
|
418
425
|
of the next run reads those standing instructions **in full**, which is why the
|
|
419
426
|
cap is not negotiable and the prune is a gate item, not a good intention.
|
|
420
427
|
Gate: ladder walk ran, no REQ `unknown`, no ledger row without
|
|
421
|
-
a home, every repository clean/pushed/pointed-at,
|
|
422
|
-
retro is written
|
|
423
|
-
under its cap, every deletion logged, and the counts printed
|
|
428
|
+
a home, every repository clean/pushed/pointed-at, the hand-back written, **and the
|
|
429
|
+
retro is written: stamped first, then pruned before anything was added, at or
|
|
430
|
+
under its cap and its byte budget, every deletion logged, and the counts printed
|
|
431
|
+
beside this verdict**.
|
|
424
432
|
|
|
425
433
|
Cross-cutting: answer from the brief's autonomy section rather than re-asking, log every deferral in the ledger, never narrow the task silently, track
|
|
426
434
|
tasks, conventional commits, honest degradation (never claim a failed/skipped step
|
|
@@ -436,8 +444,8 @@ file, the pass, and the reason that forced it — a finding id or a failed gate
|
|
|
436
444
|
"Cleanup" is not a reason. **Stop immediately** when: an edit undoes what an earlier
|
|
437
445
|
pass in this run deliberately did (A→B→A); the same file is edited twice for the
|
|
438
446
|
same reason; a finding already fixed or parked comes back; a stage is entered a
|
|
439
|
-
third time for one artifact; two loops edit one file. Hard caps:
|
|
440
|
-
task, 2 re-entries per stage, 3 passes per module. On a stop: name shape A and shape
|
|
447
|
+
third time for one artifact; two loops edit one file. Hard caps, each a stop: 3 fix
|
|
448
|
+
rounds per task, 2 re-entries per stage, 3 passes per module. On a stop: name shape A and shape
|
|
441
449
|
B with their evidence and who asks for each; escalate to the layer that owns the
|
|
442
450
|
conflict (two findings → the review rubric; finding vs plan → the user; plan vs spec
|
|
443
451
|
→ back to planning; ambiguous spec → back to spec; two modules claiming one file →
|
|
@@ -476,9 +476,9 @@
|
|
|
476
476
|
],
|
|
477
477
|
"query": "wave 1 of a release iteration has two nodes: N-001 (R1: fix two wrong links in docs/README.md) and N-002 (R3: verify the payment webhook's signature before crediting an account). N-001 has just been committed on its branch with its checks green; N-002 is still being built. Continue.",
|
|
478
478
|
"expected_behavior": [
|
|
479
|
-
"Starts N-001's certification now, without waiting for N-002 or the end of the wave: one round
|
|
480
|
-
"Keeps N-002's risk class at R3 (money, a security check) and never lowers it to save time; it owes
|
|
481
|
-
"Runs
|
|
479
|
+
"Starts N-001's certification now, without waiting for N-002 or the end of the wave: one round on one blind tier (R1) plus one fix cycle, and N-001 is closable after that round passes",
|
|
480
|
+
"Keeps N-002's risk class at R3 (money, a security check) and never lowers it to save time; it owes two passing rounds, one blind and one recorded adversarial (`certify --kind adversarial`), planting a defect and trying abuse cases, on another model where one is available",
|
|
481
|
+
"Runs the adversarial round even when the blind round comes back clean, because it asks a different question, and never re-runs a blind round on the unchanged tree",
|
|
482
482
|
"Treats `graph.py close` refusing N-002 before its owed rounds as the gate working, not as an obstacle to route around"
|
|
483
483
|
],
|
|
484
484
|
"why": "Verification-on-landing and rounds-by-risk-class are the two halves of iteration.md → Verification starts when a node lands. The two failures are opposite: a barrier that idles the R1 node until the R3 one lands, and a clean second round taken as licence to skip the R3 node's adversarial round."
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-pipeline-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.99.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,8 +2,8 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "task-pipeline",
|
|
4
4
|
"displayName": "Task Pipeline",
|
|
5
|
-
"description": "Runs a substantial task through a mandatory built-in intake grill, then 10 gated stages (docs, brainstorm+decompose, spec, plan, subagent build, tests, lint/deploy, post-deploy, docs/wiki, acceptance). Every stage's doctrine is built into the skill — no companion plugin required — with typed auto/judgment/manual gates, a frozen requirement spine that closes with evidence, a work board and a verification ledger that outlive a run, an exposure line naming what shipped unconfirmed, a progress rail computed from the project's own config, a loop guard whose
|
|
6
|
-
"version": "1.
|
|
5
|
+
"description": "Runs a substantial task through a mandatory built-in intake grill, then 10 gated stages (docs, brainstorm+decompose, spec, plan, subagent build, tests, lint/deploy, post-deploy, docs/wiki, acceptance). Every stage's doctrine is built into the skill — no companion plugin required — with typed auto/judgment/manual gates, a frozen requirement spine that closes with evidence, a work board and a verification ledger that outlive a run, an exposure line naming what shipped unconfirmed, a progress rail computed from the project's own config, a proportional short path for small changes, a loop guard whose ceilings stop and record a blocker, and stage-3 tracks for what a product does, how it sounds and how it looks. Two modes need no task: `checkup` (what is unverified) and `setup` (audit existing docs); a third, `waves`, takes the whole board and closes it in waves that each finish in one pass. Retro insights can publish upstream as issues, opt-in and redacted.",
|
|
6
|
+
"version": "1.99.0",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "ssheleg",
|
|
9
9
|
"url": "https://x.com/sshlg93"
|