task-pipeline-skill 1.28.0 → 1.29.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,67 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.29.0 — a sixth axis, and three summaries that each read as complete
4
+
5
+ **Re-derivation** joins the rotation axes in `references/audit.md`: take a number the
6
+ audit already produced and produce it again with a command of a **different shape**,
7
+ then print both. Not a second opinion — a second route. Re-running the same command is
8
+ a spell-check of the first run; only a differently-shaped question can come back
9
+ disagreeing. The exit criterion is **the pair printed**, never "verified", never
10
+ "matches": a re-derivation reported as agreement is a claim about a measurement nobody
11
+ can see.
12
+
13
+ It earns its place from this repository's own record. Four applications, two of which
14
+ refuted something already written down as fact: the version invariant called *four-way*
15
+ over five surfaces (`CONTRIBUTING.md:74`), and a graph shrink read as legitimate
16
+ tightening at 864→839 and as erosion at 839→798 — **same procedure, opposite answers**,
17
+ which is the whole argument for the axis in one line.
18
+
19
+ **The enumeration had already drifted, and nothing could see it.** Measured before
20
+ writing a word of doctrine: `audit.md` defined five axes, the Cursor rule summarised
21
+ four, `README.md` three. Each reads as complete on its own, because a list of three
22
+ orthogonal things is a convincing list of three orthogonal things. The Cursor rule now
23
+ carries all six (it is self-contained by contract and cannot point anywhere); README
24
+ stops enumerating and names the file that defines them — deleting a restatement is how
25
+ every count this repository got wrong has been fixed.
26
+
27
+ A guard now derives the axis keys from `audit.md` **at check time** and requires any
28
+ paragraph naming three or more of them to name all of them. Its first run accused
29
+ `stages.md` of enumerating three axes whose three hits were 595 lines apart and meant
30
+ different things; scoped to the file, the predicate was measuring vocabulary rather
31
+ than enumeration. The unit is the paragraph, and the guard says so in its own comment.
32
+
33
+ **Found by the false positive:** `gates.md` was titled *the two axes* over a file with
34
+ Axis A, B and C, and four surfaces repeated the two. README's prose named two and never
35
+ mentioned degrees of freedom at all — the axis about how much latitude an instruction
36
+ leaves, which is the one that gets skipped. All five sites corrected, and the count is
37
+ now computed from the `## Axis` headings by a claim-registry class, alongside a second
38
+ class for the rotation axes. The two are separated by the qualifier, because *axes* is
39
+ polysemous in this corpus and a guard that conflates them reports drift that is not
40
+ there.
41
+
42
+ **Review round.** Four findings, none from the probes. The guard re-read thirty
43
+ surfaces already cached; the flattening idiom had been hand-rolled three times, each
44
+ commenting on the earlier ones, and is now `_flatten()`; the spec claimed a guard that
45
+ did not exist. And the Cursor rule's **own** Gates section still said *"two axes"* with
46
+ no Axis C — introduced by this PR, fifty lines below an edit it made. Nothing could see
47
+ it: the claim registry's corpus held neither the Cursor rule nor the command file.
48
+ Both are in it now, and the count moved 6 → 7 the moment they were.
49
+
50
+ A second round found the same I/O class at two more call sites. Re-deriving its size
51
+ with a differently-shaped command — an instrumented run rather than a grep of the
52
+ source — put it at **25 reads of `audit.md` and 668 `.md` opens per run**, against an
53
+ estimate of "3+". The two named sites are fixed; the rest is carry-over row 12 with the
54
+ number attached, because a class measured and then left unmentioned is the TODO this
55
+ repository refuses to keep.
56
+
57
+ A third round found the sibling of the idiom the second round found — the
58
+ paragraph-split, hand-rolled at four sites — now `_paragraphs()`, whose docstring says
59
+ what the unit costs. And it found that the new **rotation axes** claim class was
60
+ permanently dormant and had **never been watched failing**: dormant is green by design
61
+ here, which is exactly why a dormant class still needs its plant. It has one now.
62
+
63
+ Guards: 136 → **144**.
64
+
3
65
  ## v1.28.0
4
66
 
5
67
  ### Eight ways to say "I don't know", and no way to count them
package/CONTRIBUTING.md CHANGED
@@ -329,7 +329,27 @@ guess. This repository had eight vocabularies for declining to claim and, until
329
329
  zero counters.
330
330
  *(guard: `a worked GATE verdict omits `)*
331
331
 
332
- **39. Every invariant above names the guard that enforces it, and that guard exists.**This list claims to be *what the validator enforces*; it was eight guards behind when
332
+ **39. A surface that enumerates the rotation axes enumerates all of them.** The axes
333
+ live once, in `references/audit.md`; the Cursor rule summarises them because it is
334
+ self-contained by contract and can point nowhere. Measured on 2026-08-09: the
335
+ definition held five, the Cursor rule four, README three — and each read as complete,
336
+ because a list of three orthogonal things is a convincing list of three orthogonal
337
+ things. The keys are derived from `audit.md` at check time, never hand-listed, and the
338
+ unit is the **paragraph**: scoped to the file, the first version of this guard reported
339
+ `stages.md` for three hits 595 lines apart that meant three different things. Either
340
+ name every axis or stop enumerating and name the file.
341
+ *(guard: `enumerates the rotation axes but names`)*
342
+
343
+ **40. Counts of "axes" are computed, and the two kinds are kept apart.** `gates.md` is
344
+ built on three of its own (context, enforcement, degrees of freedom) and `audit.md`
345
+ rotates between six; the word is polysemous in this corpus. `gates.md` was titled *"the
346
+ two axes"* over a file with Axis A, B and C, and four surfaces repeated it — including
347
+ README's prose, which never mentioned degrees of freedom at all. Both counts are now
348
+ claim-registry classes, separated by the qualifier, so a guard cannot report drift
349
+ between two things that were never the same list.
350
+ *(guard: `gates.md's own axes`)*
351
+
352
+ **41. Every invariant above names the guard that enforces it, and that guard exists.**This list claims to be *what the validator enforces*; it was eight guards behind when
333
353
  an audit measured it. A claim of enforcement is now checked like any other claim.
334
354
  *(guard: `whose message does not appear in`)* — and a cited literal must lie inside
335
355
  a **single** string in `test/validate.py`: the check reads that file as text, so a
package/README.md CHANGED
@@ -131,7 +131,7 @@ until it is installed.
131
131
  | run-wide pacing | [`continuity.md`](plugins/task-pipeline/skills/task-pipeline/references/continuity.md) — the loop mode (`run.loop`, default off, never collapses a manual gate) and the context budget (fires on a harness signal, never on an estimate) |
132
132
  | 0 + 9 + any settled decision | [`documentation.md`](plugins/task-pipeline/skills/task-pipeline/references/documentation.md) — the inventory, registers and ids, SSOT, the Doc Loop, supersede semantics, the propagation matrix, intent vs as-built |
133
133
  | 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 |
134
- | 6–10 + any check you write | [`gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) — the two axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors |
134
+ | 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 |
135
135
  | 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 |
136
136
 
137
137
  **Ported, not depended on.** Stage 0 is adapted from
@@ -431,8 +431,9 @@ Three rules keep the audit from becoming another loop:
431
431
  Measured over seven passes on a production repository, by pass six the audit was
432
432
  mostly repairing its own previous pass — while the finding count still looked
433
433
  healthy. So count both numbers every pass (new findings vs. self-inflicted ones);
434
- when the second overtakes the first, **rotate the axis** seams down one
435
- deliverable, then invariants across deliverables, then one class swept end to end.
434
+ when the second overtakes the first, **rotate the axis**. The axes are orthogonal
435
+ by construction and there is one list of them, in `references/audit.md` — this line
436
+ used to restate three of the five that existed, and read as complete while doing it.
436
437
  - **A class that repeats twice becomes a gate, not a note.** Once is an incident;
437
438
  twice is a category, and a category belongs in lint or CI where nobody has to
438
439
  remember it. The third instance in a ledger is how a mechanical defect becomes
@@ -482,12 +483,17 @@ teaches everyone on day one that the gate is noise.
482
483
 
483
484
  ### Gates and hooks — how a rule becomes something that can say no
484
485
 
485
- Two axes, deliberately not conflated. **The stage gate type** (`auto` = verify it
486
+ Three axes, deliberately not conflated. **The stage gate type** (`auto` = verify it
486
487
  yourself; `manual` = wait for an explicit go) is about this pipeline. **The
487
488
  enforcement mechanism** is a ladder a rule climbs: a doctrine line → a review
488
489
  question → a script check (promote here once the class has occurred *twice*) → a CI
489
490
  step → a hook. A rule may sit on several rungs; what it may never do is *pretend* to
490
- be on a higher one.
491
+ be on a higher one. **Degrees of freedom** is the third and the one that gets
492
+ skipped: how much latitude the *instruction* leaves — an open field where many
493
+ routes reach a good answer, a narrow bridge where the guardrails are the wording.
494
+ Over-constraining costs as much as under-constraining and is harder to see, because
495
+ an agent following the letter past the point where the letter fits still reports
496
+ success.
491
497
 
492
498
  The skill ships the anatomy of a gate that cannot lie — non-zero exit on any
493
499
  failure, the verdict block last with nothing after it, a scope header saying what it
@@ -810,7 +816,7 @@ recommendation, so you arm the whole run in one exchange. Detail:
810
816
  | [`references/artifacts.md`](plugins/task-pipeline/skills/task-pipeline/references/artifacts.md) | the canonical document layout each stage writes to |
811
817
  | [`references/conventions.md`](plugins/task-pipeline/skills/task-pipeline/references/conventions.md) | how stages 6–10 read the host project's `CLAUDE.md`, and how the documentation regime is detected |
812
818
  | [`references/documentation.md`](plugins/task-pipeline/skills/task-pipeline/references/documentation.md) | the doc system: the inventory, registers and ids, SSOT, the Doc Loop, supersede semantics, the propagation matrix, intent vs as-built |
813
- | [`references/gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) | the two axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors, where a gate runs |
819
+ | [`references/gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) | the three axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors, where a gate runs |
814
820
  | [`references/deploy-targets.md`](plugins/task-pipeline/skills/task-pipeline/references/deploy-targets.md) | stages 7–8: writing the runbook when there is none, the template, per-platform deploy and log verbs, the verification trio |
815
821
  | [`references/hooks.md`](plugins/task-pipeline/skills/task-pipeline/references/hooks.md) | the `PreToolUse` contract, the fail-open hazard, placement, and the Claude-Code-only limit |
816
822
  | [`references/knowledge-graph.md`](plugins/task-pipeline/skills/task-pipeline/references/knowledge-graph.md) | the code graph: install line, stage-0 reach queries, the stage-9 refresh, the graph↔docs divergence check |
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.28.0 |
15
+ | **Version** | 1.29.0 |
16
16
  | **Surface** | Claude Code (filesystem skill + plugin) and the vercel `skills` CLI. **Not** uploaded to the Skills API; custom Skills do not sync across surfaces |
17
17
  | **Dependencies** | None required. Optional: `context7` (MCP), `figma` (MCP), super-ux, agent-sync, graphify, obsidian-wiki. Every stage's doctrine ships in-repo; the one conditional requirement is super-ux for the stage-3 UX track on a user-facing task |
18
18
  | **Evaluation status** | Suite authored, 5 categories. One recorded run, **self-observed by the author**; **zero blind runs on zero of three models** — the split, and the numbers, live in [`evals/RESULTS.md`](evals/RESULTS.md) and are computed by `evals/run.py` |
@@ -404,7 +404,11 @@ its own previous pass while the finding count still looked healthy. So:
404
404
  to end (every error path, every count, every status vocabulary), then — where a
405
405
  code graph exists — **the graph against the docs**, the only axis that finds an
406
406
  absence without reading for it (a hub no document names, an edge the docs deny, a
407
- doc naming a module the graph no longer has).
407
+ doc naming a module the graph no longer has), then **false success** (not "is this
408
+ check correct" but "what does this mechanism print when it did not look?"), then
409
+ **re-derivation** — a number the audit already produced, produced again by a
410
+ command of a *different shape*, with **both printed**; agreement asserted instead
411
+ of a pair printed is not a re-derivation.
408
412
  - **Audit bottom-up.** A missing artefact at a low rung makes everything above it
409
413
  meaningless; top-down you polish a surface for a contract that doesn't exist.
410
414
  - **A class that repeats twice becomes a check, not a note.** Once is an incident;
@@ -453,7 +457,7 @@ you *read*; the matrix names the documents you *owe*. The document nobody read i
453
457
  exactly the document nobody updated. At stage 9, walk the matrix for every change
454
458
  type the run produced, then run the documentation gate and print its ratchet counts.
455
459
 
456
- ## Gates: two axes, and how to build one that cannot lie
460
+ ## Gates: three axes, and how to build one that cannot lie
457
461
 
458
462
  **Axis A — the stage gate type.** `auto` = verify the check yourself and stop on
459
463
  fail; `manual` = wait for an explicit operator go. An auto gate never substitutes
@@ -465,6 +469,17 @@ script check (promote here once the class has occurred **twice**) → CI step
465
469
  A rule may sit on several rungs; what it may never do is *pretend* to be on a higher
466
470
  one — that is the same failure as a gate that prints `FAIL` and exits `0`.
467
471
 
472
+ **Axis C — degrees of freedom**, and it is the one that gets skipped. Axis B says how
473
+ hard a rule bites; this says how much latitude the *instruction* leaves. **high** —
474
+ prose direction, no prescribed sequence, for steps where many routes reach a good
475
+ answer. **medium** — a named order with room inside each step. **low** — run exactly
476
+ this, in this order, for a step that is fragile, irreversible, or must be identical
477
+ every time. Match the level to how fragile the step is, not to how important it feels:
478
+ an open field versus a narrow bridge. **Over-constraining costs as much as
479
+ under-constraining and is harder to see** — a high-freedom step written as low freedom
480
+ produces an agent that follows the letter past the point where the letter stopped
481
+ fitting, and reports success, because it did what it was told.
482
+
468
483
  **Before you run any check:** the base is green (or its known-red baseline is
469
484
  recorded); the check has been probed; you have read its scope header and know what
470
485
  it does **not** cover; you have read its ratchet floors.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeline-skill",
3
- "version": "1.28.0",
3
+ "version": "1.29.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.28.0",
5
+ "version": "1.29.0",
6
6
  "author": {
7
7
  "name": "ssheleg",
8
8
  "url": "https://x.com/sshlg93"
@@ -335,7 +335,7 @@ automation is on — `pipeline.schema.json` is the only contract.
335
335
  - `references/acceptance.md` — the built-in stage-10 close-out: REQ coverage, evidence, sign-off
336
336
  - `references/retrospective.md` — stage 10's last act: the project retro (`docs/superpowers/retro.md`), the three grades of fix, the mandatory prune and its cap of ten
337
337
  - `references/documentation.md` — cross-cutting: the doc inventory, registers and ids, SSOT, the Doc Loop, supersede semantics, the propagation matrix, intent vs as-built
338
- - `references/gates.md` — cross-cutting: the two axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors, where a gate runs
338
+ - `references/gates.md` — cross-cutting: the three axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors, where a gate runs
339
339
  - `references/deploy-targets.md` — stages 7–8: writing the runbook when there is none, the template, per-platform deploy and log verbs, and the verification trio
340
340
  - `references/hooks.md` — agent-time enforcement: the PreToolUse contract, the fail-open hazard, placement, and the Claude-Code-only limit
341
341
  - `references/audit.md` — cross-cutting: the L0→L7 ladder and its seams (what was never written), axis rotation, ratchets, proven checks
@@ -291,6 +291,25 @@ construction**:
291
291
  every pass that reads for wrongness. Sweep the change for actions trusted by
292
292
  their own reply. Definition and the known shapes: [`gates.md`](gates.md) →
293
293
  *False success*.
294
+ 6. **Re-derivation** — take a number the audit has already produced and produce it
295
+ again with a command of a **different shape**, then print both. Not a second
296
+ opinion: a second *route*. Re-running the same command is a spell-check of the
297
+ first run; asking a different question that must land on the same number is the
298
+ only version that can come back disagreeing. The exit criterion is **the pair
299
+ printed** — never "verified", never "matches". A re-derivation reported as
300
+ agreement is a claim about a measurement nobody can see.
301
+
302
+ ```
303
+ claimed: the version invariant is four-way (CONTRIBUTING.md, prose)
304
+ re-derived: grep -rl '"version"\|^## v' --include='*.json' --include='*.md' . \
305
+ | wc -l -> 5 surfaces
306
+ verdict: REFUTED — the sentence and the corpus disagree; the corpus wins
307
+ ```
308
+
309
+ Rotate onto this axis when the reading axes go quiet **and the change carries
310
+ numbers**: counts in prose, thresholds, "N of M" claims, anything a document
311
+ asserts about itself. Its yield is not proportional to effort — it is
312
+ proportional to how long the first number went unchallenged.
294
313
 
295
314
  **The crossover is measurable, so measure it.** Every pass, count two numbers: new
296
315
  findings, and findings caused by the previous pass's own fixes. When the second
@@ -1,4 +1,4 @@
1
- # Gates — the two axes, and how to build one that cannot lie
1
+ # Gates — the three axes, and how to build one that cannot lie
2
2
 
3
3
  **One job: turn a rule into something that can say no.** [`audit.md`](audit.md)
4
4
  says a class seen twice *belongs in a script*; this file is where that script comes