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 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.69.0 |
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.69.0",
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.69.0",
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
- Two rules follow. Elsewhere in this bundle they are **cited, never restated**:
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