task-pipeline-skill 1.13.0 → 1.14.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 CHANGED
@@ -1,5 +1,55 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.14.0 — 2026-08-05
4
+
5
+ ### Added — false success: the failure mode that removes the reason to look
6
+
7
+ Every incident this repository has recorded of a mechanism reporting a win it never
8
+ checked was fixed as its own instance, because the class had no name to be swept by:
9
+ the hook that fails open (any exit code but `2` is non-blocking, so a **crashed**
10
+ guard *allows* the action), the cancel that accepted an id that was never scheduled
11
+ and returned success, the counter that asserted the new number was present instead of
12
+ the old one being gone — green for three releases while four surfaces printed the old
13
+ one — and R-002's batch of edits reporting done while one edit never applied.
14
+
15
+ - **`references/gates.md` gains the class**: the law (*an actor's own reply is not
16
+ evidence about the world*), the five known shapes, the test that separates a checked
17
+ pass from a silent one — *what does it print when it did not look?* — and two rules:
18
+ verify by re-reading rather than by the reply, and assert the **absence of the old**
19
+ rather than the presence of the new.
20
+ - **`references/audit.md` gains a fifth axis.** The four existing axes read for
21
+ wrongness, which is exactly what a false success is not. The new axis asks where a
22
+ mechanism can report a win it never checked.
23
+ - **The other files cite the class, never restate it.** `continuity.md`'s cancel rule
24
+ became one named instance instead of a second definition.
25
+
26
+ ### Added — effect verification: the diff cannot show what the task did
27
+
28
+ `v1.12.0` added a hygiene gate over what a task **wrote**. It is blind to what a task
29
+ **did** — a file moved, a job cancelled, a service restarted, a record migrated — and
30
+ the implementer's report is not evidence about any of it.
31
+
32
+ - **`references/build.md`**: the implementer contract now requires a `verified-by:`
33
+ line for every step whose effect lives outside its own diff, carrying the command
34
+ that *confirmed* the state rather than the one that caused it. The hygiene-gate
35
+ section names its own blind side and tells the controller to read those lines back.
36
+ - **`references/review.md`**: a new rubric item — **Effect verification** — rated
37
+ **Important**, not Minor. A finding that never blocks is a finding the fix loop
38
+ never sees.
39
+
40
+ ### Guards — 80 → 94
41
+
42
+ Fourteen new checks, each with a negative self-test whose plant asserts it landed
43
+ before the edit. Two invariants added to `CONTRIBUTING.md`, both citing a literal the
44
+ validator actually prints. The negatives floor moved 80 → 94.
45
+
46
+ **One defect found by this run's own discipline:** the first draft of these guards was
47
+ appended *below* the validator's verdict block, so on a clean run they executed after
48
+ `PASS` was printed and on a corrupted one they never executed at all — fourteen guards
49
+ that could not fail. The negatives runner caught it because it requires positive
50
+ evidence (`OK:` in stdout), not merely a non-zero exit. A runner that accepted silence
51
+ would have shipped the exact defect this release is about.
52
+
3
53
  ## v1.13.0 — 2026-08-05
4
54
 
5
55
  ### Added — the read-back: four rules that existed and were never handed over
package/CONTRIBUTING.md CHANGED
@@ -210,7 +210,22 @@ releases and the link checker stayed green throughout, because it resolves from
210
210
  file's home. Name the file in a code span instead — the same rule the Cursor rule
211
211
  follows, for the same reason. *(guard: `resolves only from`)*
212
212
 
213
- **28. Every invariant above names the guard that enforces it, and that guard exists.**
213
+ **28. The False success class has one home, and the files that use it cite it.**
214
+ `references/gates.md` defines it — the law, the did-not-look test, and its two
215
+ rules; `audit.md` (the fifth axis), `build.md`, `review.md` and `continuity.md`
216
+ point at that section instead of restating it. Every incident this repository has
217
+ recorded of a mechanism reporting a win it never checked was fixed as its own
218
+ instance, because the class had no name to be swept by.
219
+ *(guard: `the False success class is gone`)*
220
+
221
+ **29. A side effect is confirmed by re-reading the state, never by the reply.**
222
+ `references/build.md` binds the implementer to a `verified-by:` line for every
223
+ step whose effect lives outside its own diff, and names the hygiene gate's blind
224
+ side; `references/review.md` rates an effect asserted without one as **Important**,
225
+ not Minor. A finding that never blocks is a finding the fix loop never sees.
226
+ *(guard: `the report no longer requires verified-by lines`)*
227
+
228
+ **30. Every invariant above names the guard that enforces it, and that guard exists.**
214
229
  This list claims to be *what the validator enforces*; it was eight guards behind when
215
230
  an audit measured it. A claim of enforcement is now checked like any other claim.
216
231
  *(guard: `whose message does not appear in`)* — and a cited literal must lie inside
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.13.0 |
15
+ | **Version** | 1.14.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 (15 evals, 5 categories). **Never executed** — see [`evals/RESULTS.md`](evals/RESULTS.md) |
@@ -38,7 +38,7 @@ apply.
38
38
  instruction surface, and every one is linked directly from `SKILL.md`.
39
39
  2. Read `templates/docgate.sh` before seeding it; it is the only shipped script a
40
40
  host project will run on its own repository.
41
- 3. Run `npm run test:all` — 80 guards, each with a negative self-test that plants a
41
+ 3. Run `npm run test:all` — 94 guards, each with a negative self-test that plants a
42
42
  defect and requires rejection.
43
43
  4. Run `python3 evals/run.py` for the behavioural protocol, and read
44
44
  `evals/RESULTS.md` for what has actually been observed.
@@ -54,7 +54,7 @@ apply.
54
54
  - **Versions are pinned by git tag** and mirrored into `sshlg-skills`'s catalogue.
55
55
  Rollback is `git checkout v<previous>` or pinning the previous plugin version;
56
56
  the previous version is never deleted.
57
- - **Behavioural evidence is missing, not merely thin.** 80 structural guards prove
57
+ - **Behavioural evidence is missing, not merely thin.** 94 structural guards prove
58
58
  the skill is well-formed. Until `evals/RESULTS.md` carries a dated run, nothing in
59
59
  this repository proves it *behaves* — triggers correctly, stays quiet on a
60
60
  question, or performs the steps it documents.
@@ -450,6 +450,33 @@ is not portable and silently edits nothing on BSD), run, assert `$?` is non-zero
450
450
  restore, assert zero. **Doubt the probe before the check** — four of five silent
451
451
  probes on a real project were the probe's fault. Record the probe.
452
452
 
453
+ ## False success — the failure that removes the reason to look
454
+
455
+ An actor's own reply is not evidence about the world. A failure is loud and gets
456
+ fixed; a mechanism that reports a win it never checked is silent, so it survives
457
+ every pass that reads for wrongness. Known shapes: a hook that fails open (any exit
458
+ code but 2 is non-blocking, so a crashed guard ALLOWS the action), a cancel that
459
+ accepts an id that was never scheduled and returns success, a check asserting the
460
+ new value is present instead of the old one being gone, a batch of edits reporting
461
+ done while one edit never applied, and a section with no input whose silence is
462
+ read as a pass.
463
+
464
+ Two rules:
465
+
466
+ 1. **Verify by re-reading, not by the reply.** After a teardown, cancel, delete,
467
+ disable, publish or migrate — query the authoritative state and assert the new
468
+ condition.
469
+ 2. **Assert the absence of the old, not the presence of the new.** A check that only
470
+ proves the new value exists stays green while the old one is still shipping.
471
+
472
+ The test for any mechanism you are about to trust: what does it print when it did
473
+ not look? If that is indistinguishable from what it prints when it looked and found
474
+ nothing wrong, it is not evidence.
475
+
476
+ **In a build:** every step whose effect lives outside your own diff carries a
477
+ `verified-by:` line — the command that CONFIRMED the state, not the one that caused
478
+ it. A step without one is unverified, not done, and a review rates it Important.
479
+
453
480
  ## Hooks — the limit first
454
481
 
455
482
  Hooks exist **only in Claude Code**. Elsewhere the same rules run as a self-check
package/evals/RESULTS.md CHANGED
@@ -37,7 +37,7 @@ or it belongs in a check.
37
37
  | Dated runs recorded | **0** | 2026-08-03 |
38
38
 
39
39
  The bottom two numbers are the honest state of this skill's behavioural evidence.
40
- Everything else in this repository is proven by 80 structural guards that check the
40
+ Everything else in this repository is proven by 94 structural guards that check the
41
41
  *form*; these are the only checks that would speak to the *behaviour*, and they have
42
42
  not been run yet. Printed here so "63 of 63 green" is never read as "the skill is
43
43
  known to work".
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeline-skill",
3
- "version": "1.13.0",
3
+ "version": "1.14.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.13.0",
5
+ "version": "1.14.0",
6
6
  "author": {
7
7
  "name": "ssheleg",
8
8
  "url": "https://x.com/sshlg93"
@@ -228,6 +228,12 @@ construction**:
228
228
  doc naming a module the graph has no node for describes something that no longer
229
229
  exists. This axis is the only one that finds absences without reading for them,
230
230
  which is why it is worth rotating onto when the reading axes go quiet.
231
+ 5. **False success** — not *"is this check correct"* but *"what does this mechanism
232
+ print when it did not look?"* Wrongness is loud and the reading axes above find
233
+ it; a mechanism that reports a win it never checked is silent, so it survives
234
+ every pass that reads for wrongness. Sweep the change for actions trusted by
235
+ their own reply. Definition and the known shapes: [`gates.md`](gates.md) →
236
+ *False success*.
231
237
 
232
238
  **The crossover is measurable, so measure it.** Every pass, count two numbers: new
233
239
  findings, and findings caused by the previous pass's own fixes. When the second
@@ -188,8 +188,12 @@ Record the implementer's agent identity: fix rounds 1–3 resume it.
188
188
  > code exists before a test you **watched fail**: write the failing test → run it
189
189
  > and confirm it fails for the right reason → write the minimal code that passes →
190
190
  > run it and confirm it passes, with the rest of the suite still green → commit.
191
- > Assert on real behavior, never on mock behavior. Commit as you go, conventional
192
- > commits. When done, self-review your diff, then write the full report to
191
+ > Assert on real behavior, never on mock behavior. **Any step with a side effect
192
+ > outside your own diff a command that moves, deletes, publishes, migrates,
193
+ > restarts or cancels something — is confirmed by re-reading the state it changed,
194
+ > never by the command's own reply; record each one in the report as a
195
+ > `verified-by:` line carrying the command you ran to confirm and its output.**
196
+ > Commit as you go, conventional commits. When done, self-review your diff, then write the full report to
193
197
  > `<report path>`:
194
198
  > what you built, the files touched, the commits, the test command and its
195
199
  > output, decisions you made, anything you're unsure about. Return **only**:
@@ -272,6 +276,14 @@ instruction R-002 — and it is invisible in a status report. Found one task lat
272
276
  costs a re-dispatch; found eight tasks later it is fixed by an agent that no longer
273
277
  remembers the code.
274
278
 
279
+ **The hygiene gate reads what the task wrote; it cannot see what the task did.**
280
+ A file the task moved, a job it cancelled, a service it restarted, a record it
281
+ migrated — none of that is in the diff, and the implementer's report is not evidence
282
+ about it either. Before the review, read back the report's `verified-by:` lines:
283
+ every side-effecting step must carry the command that **confirmed** the state, not
284
+ the command that caused it. A step with no such line is unverified, not done
285
+ ([`gates.md`](gates.md) → *False success*).
286
+
275
287
  **The gate never edits. Fixing is yours.** A finding is repaired inside the same
276
288
  task, or it becomes a carry-over row with a reason — never a silent pass. A gate
277
289
  whose findings nobody acts on is a slower way of ignoring them.
@@ -136,8 +136,8 @@ job list should agree with that.
136
136
  **Verify the cancel by listing the jobs, never by the cancel's own reply.** A
137
137
  teardown call will happily accept an id that was never scheduled and report
138
138
  success, which leaves the real job running while the transcript says it stopped.
139
- List afterwards and read the list. This is the same law the rest of this pipeline
140
- applies to every gate a green nobody watched is not evidence — and a loop is
139
+ List afterwards and read the list. This is one instance of a named class
140
+ [`gates.md`](gates.md) *False success*, rule 1 — and a loop is
141
141
  exactly where breaking it goes unnoticed, because the symptom is a message
142
142
  arriving on time.
143
143
 
@@ -26,6 +26,7 @@ elsewhere and is not restated here:
26
26
  - Axis C — degrees of freedom
27
27
  - Progressive arming
28
28
  - Before you run a check
29
+ - False success — when a mechanism reports a win it never checked
29
30
  - Anatomy of a project gate
30
31
  - Writing the check itself
31
32
  - Probing — plant, run, restore
@@ -136,6 +137,40 @@ Four preconditions. Skipping any of them turns a run into a claim.
136
137
 
137
138
  ---
138
139
 
140
+ ## False success — when a mechanism reports a win it never checked
141
+
142
+ The four preconditions above protect a *check*. The same law binds an **action**:
143
+
144
+ > **An actor's own reply is not evidence about the world. Confirm an effect by
145
+ > re-reading the state it changed.**
146
+
147
+ A failure is loud and gets fixed on the pass that finds it. A false success is
148
+ silent and **removes the reason to look**, which is why every shape below survived
149
+ at least one release in this repository:
150
+
151
+ | Shape | What reported success | What was actually true |
152
+ |---|---|---|
153
+ | Fail-open hook | any exit code but `2` is non-blocking, so a **crashed** guard *allows* the action | the guard never ran |
154
+ | Teardown by reply | a cancel accepted an id that was never scheduled and returned success | the job was still armed |
155
+ | 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 |
156
+ | Half-applied batch | a batch of edits reported done while one edit never applied (R-002) | the file was unchanged |
157
+ | Silence read as a pass | a section with no input printed nothing, and the caller counted it as checked | nothing was looked at |
158
+
159
+ **The test.** For any mechanism you are about to trust, ask:
160
+ *what does it print when it did not look?* If that is indistinguishable from what
161
+ it prints when it looked and found nothing wrong, it is not evidence — give it a distinct `dormant`
162
+ or `skip` state (→ *Progressive arming*), or verify the effect independently.
163
+
164
+ Two rules follow. Elsewhere in this bundle they are **cited, never restated**:
165
+
166
+ 1. **Verify by re-reading, not by the reply.** After a teardown, cancel, delete,
167
+ disable, publish or migrate: query the authoritative state and assert the item's
168
+ new condition.
169
+ 2. **Assert the absence of the old, not the presence of the new.** A check that only
170
+ proves the new value exists stays green while the old one is still shipping.
171
+
172
+ ---
173
+
139
174
  ## Anatomy of a project gate
140
175
 
141
176
  Ten properties. Each one is here because its absence has shipped.
@@ -66,6 +66,8 @@ a row pointing outside the bundle is the defect this file exists to catch.
66
66
  | The zero-context plan format, parallel groups, set equality | `references/planning.md` |
67
67
  | Workspace isolation, the subagent loop, who may write the register | `references/build.md` |
68
68
  | The review rubric, diff packages, the three verdicts | `references/review.md` |
69
+ | **False success** — the class, its known shapes and its two rules | `references/gates.md` |
70
+ | **Effect verification** — the `verified-by:` contract and the rubric item that blocks | `references/build.md`, `references/review.md` |
69
71
  | The TDD iron law and the suite gate | `references/tdd.md` |
70
72
  | The REQ coverage table, evidence rules, the closing question | `references/acceptance.md` |
71
73
  | How the host project's own conventions are read | `references/conventions.md` |
@@ -88,14 +88,20 @@ Review in this order; stop reading the diff only when you've covered all of it.
88
88
  passes regardless of the production code. No `skip`/`xfail`/commented assertion
89
89
  smuggling a red suite past a gate. New behavior has a covering test; the failure
90
90
  path has one too.
91
- 6. **Error handling and degradation.** Every external call (network, DB, file, MCP,
91
+ 6. **Effect verification.** Claims about the world outside the diff a migration
92
+ run, a job cancelled, a file moved, a service restarted, an artifact published —
93
+ carry evidence that the **state was re-read**, not that the command returned
94
+ success. A report asserting an effect with no `verified-by:` line is an
95
+ unverified claim, and it is **Important**, not Minor
96
+ ([`gates.md`](gates.md) → *False success*).
97
+ 7. **Error handling and degradation.** Every external call (network, DB, file, MCP,
92
98
  API) handles failure, and the failure is reported honestly rather than swallowed.
93
- 7. **Boundaries and clarity.** One responsibility per unit; names that say what the
99
+ 8. **Boundaries and clarity.** One responsibility per unit; names that say what the
94
100
  thing is; no duplication of a logic block that should be shared; nothing left
95
101
  dead.
96
- 8. **Security.** No secrets in code, logs or fixtures; input validated at the
102
+ 9. **Security.** No secrets in code, logs or fixtures; input validated at the
97
103
  boundary; no new injection or path-traversal surface.
98
- 9. **Docs in the same change.** Module docs, runbooks and (for UI work) the
104
+ 10. **Docs in the same change.** Module docs, runbooks and (for UI work) the
99
105
  super-ux layers updated alongside the code, not deferred.
100
106
 
101
107
  **Severities:**