task-pipeline-skill 1.69.0 → 1.71.1
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 +85 -0
- package/README.md +1 -1
- package/SKILL-CARD.md +1 -1
- package/package.json +1 -1
- package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
- package/plugins/task-pipeline/skills/evidence-docs/SKILL.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/documentation.md +37 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/gates.md +32 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,90 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
|
|
4
|
+
## v1.71.1 — four shapes of a green that measured nothing
|
|
5
|
+
|
|
6
|
+
> **v1.71.0 is a burned tag.** Its entry was prepended **above** `# Changelog`, so
|
|
7
|
+
> `test/validate.py`'s newest-section parser read the *previous* release while the
|
|
8
|
+
> negative self-test planted its defect in *this* one. The two looked at different
|
|
9
|
+
> sections, the plant proved nothing, and CI failed with *"the release entry claimed a
|
|
10
|
+
> guard count the workflow does not define"* — which is the R-001 failure the plant's
|
|
11
|
+
> own comment describes, reproduced by the release that shipped the doctrine about it.
|
|
12
|
+
|
|
13
|
+
Four issues, one class: a signal that reports success while checking nothing. All four
|
|
14
|
+
survived at least one release in a real project, and none is visible to inspection — the
|
|
15
|
+
command reads correctly, the test name is accurate, the document's rows look settled.
|
|
16
|
+
|
|
17
|
+
### The false-success table gains two shapes, and its rules go from two to four (#48, #49)
|
|
18
|
+
|
|
19
|
+
**Read through a pipe.** GitHub Actions runs `run:` under `bash -e` **without** `pipefail`, so
|
|
20
|
+
`npm test 2>&1 | tee ../test.log` concluded `success` over its own `# fail 55`. Then the same
|
|
21
|
+
author did it by hand hours after fixing it: `check-docs.sh | grep -E '^(OK|FAIL)' | tail && git
|
|
22
|
+
commit` committed over a `FAIL` printed to their own screen. **This is the least visible entry
|
|
23
|
+
in the table because the command reads as diligence** — `check.sh | grep FAIL` looks like
|
|
24
|
+
somebody being careful.
|
|
25
|
+
|
|
26
|
+
**An absence with no subject.** A viewport suite pinned a responsive rule as a pair: the column
|
|
27
|
+
visible at 1280, absent at 1279. The column had been removed from the product months earlier, so
|
|
28
|
+
the desktop half failed and the compact half **passed at every width**. The test named after the
|
|
29
|
+
compact band proved nothing about it. This is the complement of *watch the green fail against a
|
|
30
|
+
planted defect*: that rule finds a check which **cannot fail**; this one finds a check which
|
|
31
|
+
**cannot succeed meaningfully**.
|
|
32
|
+
|
|
33
|
+
### A check with a wrong premise can still be the thing that finds the defect (#40)
|
|
34
|
+
|
|
35
|
+
A new check going red on day one invites one reflex — *the check must be wrong, relax it*.
|
|
36
|
+
A guard asserted two constants for "the price of one unit per year" were equal; the premise was
|
|
37
|
+
wrong, they belong to two different products. Reading further, the disagreement was **visible to
|
|
38
|
+
customers**: both still sell from one page, and the note under the volume table promised a
|
|
39
|
+
discount computed from the header's price while the table's numbers gave roughly half of it.
|
|
40
|
+
|
|
41
|
+
`gates.md` now says to **separate the premise from the observation before touching either**, and
|
|
42
|
+
to relax the assertion only after what it surfaced has its own record — otherwise the finding
|
|
43
|
+
leaves with the check that found it.
|
|
44
|
+
|
|
45
|
+
### A hand-corrected document drifts back within one run (#39)
|
|
46
|
+
|
|
47
|
+
Four boards consolidated into one, every row re-checked; within 24 hours a row settled in code
|
|
48
|
+
that morning read `open` again — in **two** places, because a row in a section table and again
|
|
49
|
+
in a summary has to be closed twice. **A document's claims are never executed**, so nothing
|
|
50
|
+
distinguishes a row that *is* true from one that *was* true, and the audit correcting it is the
|
|
51
|
+
only reader that checks.
|
|
52
|
+
|
|
53
|
+
`documentation.md` gains the rule: a correction is done not when the rows are right but when
|
|
54
|
+
**something other than the next audit** will notice them going wrong — with the four claim types
|
|
55
|
+
and what makes each self-checking. Where a claim genuinely cannot be derived, **say so in the
|
|
56
|
+
row**; correcting it silently a second time teaches readers that somebody else is checking.
|
|
57
|
+
|
|
58
|
+
Guards: 376 → **376**. No guard was added or removed — this release is doctrine, and each of the
|
|
59
|
+
four rules is cited from the reference that owns it rather than restated.
|
|
60
|
+
|
|
61
|
+
Closes #39, #40, #48, #49.
|
|
62
|
+
|
|
63
|
+
## v1.70.0 — the stemmer cannot conjugate, so the description says the other form
|
|
64
|
+
|
|
65
|
+
`запиши решение` — the imperative a person actually types — reached no route at all, while
|
|
66
|
+
`evidence-docs` advertised the infinitive `записать решение`. The umbrella's matcher stems
|
|
67
|
+
`записать` to `записа-` and cannot reach `запиш-`: the с/ш alternation is a conjugation class,
|
|
68
|
+
not an ending, and `lib/triggers.js` says in its own header that it is *deliberately NOT a
|
|
69
|
+
morphological analyser*.
|
|
70
|
+
|
|
71
|
+
**So the fix is here rather than there.** Teaching a load-bearing stemmer one conjugation
|
|
72
|
+
class for one trigger was measured and refused (`B-84` on the umbrella's board); advertising
|
|
73
|
+
the second form costs **19 characters in a description with 124 free**. The description now
|
|
74
|
+
carries both, and the umbrella routes `запиши решение`, `запишите решение` and
|
|
75
|
+
`запиши решение по архитектуре` to `evidence-docs`.
|
|
76
|
+
|
|
77
|
+
**One false positive, measured rather than overlooked.** It also fires on «запиши решение
|
|
78
|
+
суда». A court decision does not occur on this machine and the cost of the hit is one injected
|
|
79
|
+
line — where `аудит` was refused against `аудитория` precisely because that word is common.
|
|
80
|
+
The trade is named here so a later reader does not have to re-derive it.
|
|
81
|
+
|
|
82
|
+
Coverage on the umbrella's own corpus: **64/15 → 65/14** of 79 prompts.
|
|
83
|
+
|
|
84
|
+
Guards: 376 → **376**. No guard was added or removed — this release changes one description
|
|
85
|
+
and nothing it asserts is new; the umbrella's fixture that every trigger is advertised is what
|
|
86
|
+
holds the pair together, and it lives there rather than here.
|
|
87
|
+
|
|
3
88
|
## v1.69.0 — the work graph, and a check that mentions is not a check that binds
|
|
4
89
|
|
|
5
90
|
**Module 1 of the role-agent programme, complete** — T-1 through T-7, briefed in
|
package/README.md
CHANGED
|
@@ -114,7 +114,7 @@ stage and walks the gates. See [Install](#install) for the other channels.
|
|
|
114
114
|
`task-pipeline` is the reference implementation of **Proof of Done: The Agentic
|
|
115
115
|
Software Development Manifesto** by Sergey Sheleg — *a foundation for building
|
|
116
116
|
software when agents write the code*. The manifesto has its own home:
|
|
117
|
-
<https://github.com/ssheleg/pod-manifesto
|
|
117
|
+
<https://podmanifesto.org> (source: <https://github.com/ssheleg/pod-manifesto>).
|
|
118
118
|
|
|
119
119
|
Its central claim is that the unit of progress is not generated code but an
|
|
120
120
|
**evidence-carrying change**: one carrying the intent it implements, the evidence that
|
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.71.1 |
|
|
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. 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` |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-pipeline-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.71.1",
|
|
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 closes with evidence, a work board and a verification ledger that outlive a run, an exposure line naming what shipped unconfirmed, a progress rail computed from the project's own config, a loop guard whose review ceiling measures rather than stops, and stage-3 tracks for what a product does, how it sounds and how it looks. Two modes need no task: `checkup` (what is unverified) and `setup` (audit existing docs). Retro insights can publish upstream as issues, opt-in and redacted.",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.71.1",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "ssheleg",
|
|
8
8
|
"url": "https://x.com/sshlg93"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: evidence-docs
|
|
3
|
-
description: "Use when writing or reviewing anything that will be read as true — a decision record, a README, an acceptance report, a runbook, a changelog entry, an audit finding, or any claim that something was verified. Applies the ten canons of evidence-backed documentation — what makes a claim documentation rather than an assertion — and routes to the doctrine that enforces each one. Also use when a project needs a documentation gate, a decision register, a propagation matrix, or a retrospective that outlives its author. Triggers - 'documentation gate', 'decision record', 'ADR', 'acceptance report', 'runbook', 'is this verified', 'доказательная документация', 'записать решение', 'отчёт о приёмке', 'раннбук', 'чем это подтверждено', 'доки в синхроне'. Not for: drafts, chat answers, commit messages or code comments — say 'без доков' to opt out."
|
|
3
|
+
description: "Use when writing or reviewing anything that will be read as true — a decision record, a README, an acceptance report, a runbook, a changelog entry, an audit finding, or any claim that something was verified. Applies the ten canons of evidence-backed documentation — what makes a claim documentation rather than an assertion — and routes to the doctrine that enforces each one. Also use when a project needs a documentation gate, a decision register, a propagation matrix, or a retrospective that outlives its author. Triggers - 'documentation gate', 'decision record', 'ADR', 'acceptance report', 'runbook', 'is this verified', 'доказательная документация', 'записать решение', 'запиши решение', 'отчёт о приёмке', 'раннбук', 'чем это подтверждено', 'доки в синхроне'. Not for: drafts, chat answers, commit messages or code comments — say 'без доков' to opt out."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Evidence-backed documentation
|
|
@@ -22,6 +22,7 @@ being written twice; write it once, here.
|
|
|
22
22
|
- The inventory — four questions, answered before the first line of work
|
|
23
23
|
- Registers and ids
|
|
24
24
|
- Single source of truth
|
|
25
|
+
- A hand-corrected document drifts back within one run
|
|
25
26
|
- The Doc Loop
|
|
26
27
|
- Changing your mind
|
|
27
28
|
- The propagation matrix
|
|
@@ -214,6 +215,42 @@ doc to its own view is the failure this paragraph exists to prevent.
|
|
|
214
215
|
|
|
215
216
|
---
|
|
216
217
|
|
|
218
|
+
## A hand-corrected document drifts back within one run
|
|
219
|
+
|
|
220
|
+
A board, backlog or status document gets corrected during an audit; the same
|
|
221
|
+
contradictions are back inside a day. **Correcting it again is the same
|
|
222
|
+
intervention at the same cost, not a fix.**
|
|
223
|
+
|
|
224
|
+
Measured: four contradictory boards were consolidated into one, every row
|
|
225
|
+
re-checked against its source. Within 24 hours a row settled in code that morning
|
|
226
|
+
read `open` again — in **two** places, because a row listed in a section table and
|
|
227
|
+
again in a summary has to be closed twice. Another called two files missing while
|
|
228
|
+
one had been written five hours earlier. A count quoted from a generated ledger had
|
|
229
|
+
moved and the row had not.
|
|
230
|
+
|
|
231
|
+
**Why the manual pass cannot hold.** A document's claims are never executed. Nothing
|
|
232
|
+
distinguishes a row that **is** true from one that **was** true, so the audit that
|
|
233
|
+
corrects it is the only reader that checks — and it runs once. Between audits the
|
|
234
|
+
document is a set of assertions with no mechanism behind any of them, ageing at the
|
|
235
|
+
speed of the work it describes.
|
|
236
|
+
|
|
237
|
+
So a correction is not done when the rows are right. It is done when **something
|
|
238
|
+
other than the next audit** will notice them going wrong:
|
|
239
|
+
|
|
240
|
+
| The claim | What makes it self-checking |
|
|
241
|
+
|---|---|
|
|
242
|
+
| a row's status | derived from the artefact that settles it, or a gate that fails when the two disagree |
|
|
243
|
+
| a count | computed at check time and printed beside its command — never transcribed |
|
|
244
|
+
| "these files are missing" | resolved against the filesystem by the check that prints it |
|
|
245
|
+
| a row in two tables | one table, or a guard asserting the pair agrees |
|
|
246
|
+
|
|
247
|
+
Where a claim genuinely cannot be derived, **say that in the row** — an assertion
|
|
248
|
+
marked as unverifiable is honest, and the next reader stops treating it as measured.
|
|
249
|
+
Silently correcting it a second time is how a document teaches its readers that
|
|
250
|
+
somebody else is checking.
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
217
254
|
## The Doc Loop
|
|
218
255
|
|
|
219
256
|
**Fires whenever something is settled — at any stage.** Scope, a contract, a name,
|
|
@@ -186,6 +186,22 @@ Four preconditions. Skipping any of them turns a run into a claim.
|
|
|
186
186
|
4. **You have read the ratchet floors.** A pass with a floor that was quietly
|
|
187
187
|
raised is a pass over the thing the floor was hiding.
|
|
188
188
|
|
|
189
|
+
**And one rule for the moment after.** A new check that goes red on the day it is
|
|
190
|
+
written invites one reflex — *the check must be wrong, relax it*. Sometimes the
|
|
191
|
+
check **is** wrong, **and the red is still the finding.** A guard asserted two
|
|
192
|
+
constants describing "the price of one unit per year" were equal; they belong to
|
|
193
|
+
two different products, so the premise was wrong and the obvious move was to
|
|
194
|
+
delete the assertion. Reading further showed the disagreement was **visible to
|
|
195
|
+
customers**: both products still sell from one page, and the note under the volume
|
|
196
|
+
table promised a discount computed from the header's price while the table's own
|
|
197
|
+
numbers gave roughly half of it. Nothing miscalculated — only the claim on the page
|
|
198
|
+
was false.
|
|
199
|
+
|
|
200
|
+
So: **separate the premise from the observation before touching either.** Ask what
|
|
201
|
+
the check *saw*, not whether it was entitled to look. Relax or delete the assertion
|
|
202
|
+
only after the thing it surfaced has its own record — otherwise the finding leaves
|
|
203
|
+
with the check that found it, and nothing remembers it was ever seen.
|
|
204
|
+
|
|
189
205
|
---
|
|
190
206
|
|
|
191
207
|
## False success — when a mechanism reports a win it never checked
|
|
@@ -206,19 +222,34 @@ at least one release in this repository:
|
|
|
206
222
|
| Presence instead of absence | a counter asserted the new number was present, not that the old one was gone | four surfaces still printed the old number, green for three releases |
|
|
207
223
|
| Half-applied batch | a batch of edits reported done while one edit never applied (R-002) | the file was unchanged |
|
|
208
224
|
| Silence read as a pass | a section with no input printed nothing, and the caller counted it as checked | nothing was looked at |
|
|
225
|
+
| **Read through a pipe** | the caller read the **formatter's** exit code, not the gate's | `npm test 2>&1 \| tee ../test.log` under `bash -e` without `pipefail` concluded `success` over its own `# fail 55`; `check-docs.sh \| grep FAIL \| tail && git commit` committed over a `FAIL` printed to the author's screen |
|
|
226
|
+
| **An absence with no subject** | an assertion that a thing is gone, about a thing that exists nowhere | a viewport test asserting a column leaves the tree at 1279px passed at **every** width — the column had been deleted from the product months earlier |
|
|
209
227
|
|
|
210
228
|
**The test.** For any mechanism you are about to trust, ask:
|
|
211
229
|
*what does it print when it did not look?* If that is indistinguishable from what
|
|
212
230
|
it prints when it looked and found nothing wrong, it is not evidence — give it a distinct `dormant`
|
|
213
231
|
or `skip` state (→ *Progressive arming*), or verify the effect independently.
|
|
214
232
|
|
|
215
|
-
|
|
233
|
+
Four rules follow. Elsewhere in this bundle they are **cited, never restated**:
|
|
216
234
|
|
|
217
235
|
1. **Verify by re-reading, not by the reply.** After a teardown, cancel, delete,
|
|
218
236
|
disable, publish or migrate: query the authoritative state and assert the item's
|
|
219
237
|
new condition.
|
|
220
238
|
2. **Assert the absence of the old, not the presence of the new.** A check that only
|
|
221
239
|
proves the new value exists stays green while the old one is still shipping.
|
|
240
|
+
3. **Read a gate's own exit code, never a pipeline's.** `set -o pipefail`, or
|
|
241
|
+
`${PIPESTATUS[0]}`, or do not pipe. GitHub Actions runs `run:` under `bash -e`
|
|
242
|
+
**without** `pipefail`, so `gate | tee` reports `tee`. This is the least visible
|
|
243
|
+
entry in the table because the command reads as diligence: `check.sh | grep FAIL`
|
|
244
|
+
looks like someone being careful, and it is the shape that reports success while
|
|
245
|
+
printing failure to the screen of the person who wrote it.
|
|
246
|
+
4. **An absence assertion needs a subject that exists somewhere.** Before pinning
|
|
247
|
+
"X must not appear here", prove X appears *somewhere* — otherwise the assertion is
|
|
248
|
+
true for a reason unrelated to what it claims, and the complement of *watch the
|
|
249
|
+
green fail against a planted defect* is what catches it: that rule finds a check
|
|
250
|
+
that **cannot fail**, this one finds a check that **cannot succeed meaningfully**.
|
|
251
|
+
Both are invisible to every mechanical signal — the test is green, its name is
|
|
252
|
+
accurate, its code reads correctly.
|
|
222
253
|
|
|
223
254
|
---
|
|
224
255
|
|