task-pipeline-skill 1.32.0 → 1.33.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,51 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.33.0 — the number, the list, and the command that shows them with no task running
4
+
5
+ Three modules shipped as one, because they are one capability: the index, the list it
6
+ produces, and the command that prints them when nothing else is running.
7
+
8
+ **Exposure is a vector with its components named, never a probability.** The request that
9
+ started this asked for *"the probability of an error"*. It is not computable from these
10
+ inputs, and a number dressed as one is the class this repository has spent its history
11
+ removing — so the guard rejects a `%` on that line outright:
12
+
13
+ ```
14
+ exposure: 99 unverified · never checked · 10 releases carry one
15
+ REQ-001 references/setup.md — the entry audit: when it runs … v1.10.0
16
+
17
+ and 91 more — the full list is `/task-pipeline checkup`
18
+ ```
19
+
20
+ **`never checked`, not `0 days`.** When no row has ever been confirmed — this repo's
21
+ exact state — a zero would read as *checked today*, the precise inversion this pipeline
22
+ exists to prevent. The literal is required by its own guard.
23
+
24
+ **A single score was refused on purpose.** One number invites a threshold, and a
25
+ threshold here is a target on `never`, which `verification.md` says may never have one.
26
+ The components are one line; a reader can hold three.
27
+
28
+ **`/task-pipeline checkup` runs with no task in flight**, which is the whole point:
29
+ accumulated unconfirmed work is invisible precisely because nobody is running a pipeline,
30
+ so a check living only inside a run can never say *stop, fourteen things are
31
+ unconfirmed*. It reads four files this pipeline already keeps and writes nothing unless
32
+ asked — and then only board rows whose `Source` names the checkup, printed before they
33
+ are added.
34
+
35
+ **And `continuity.md` finally names the file it always demanded.** It has required each
36
+ iteration to re-measure the work-list since the beginning, and said *"next up is X"* is
37
+ a claim no gate reads. The board is that list; the claim now cites a `B-NNN`, which can
38
+ be checked, rather than a description, which cannot.
39
+
40
+ **Two defects in the new guard, both self-inflicted and both instructive.** Its needle
41
+ looked for *"never a percentage"* while the doctrine it guards says *"no percentage,
42
+ ever"* — guard and prose written an hour apart, already disagreeing. And the `%` check
43
+ searched for a literal that its own line necessarily contains, so it matched **itself**
44
+ and passed a planted percentage. A detector that matches itself first is checking the
45
+ wrong thing.
46
+
47
+ Guards: 185 → **188**, property checks 8.
48
+
3
49
  ## v1.32.0 — the column a machine may not fill
4
50
 
5
51
  Stage 8 already performs the verification trio, reads the CI verdict and opens the
package/CONTRIBUTING.md CHANGED
@@ -396,7 +396,16 @@ property check proves that filling the column does not fail the build, because a
396
396
  that punishes an honest answer will not receive one.
397
397
  *(guard: `either a date or the literal` and `is in no brief's REQ table`)*
398
398
 
399
- **46. 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
399
+ **46. Exposure prints as a named vector and never as a probability.** The request that
400
+ produced it asked for `P(defect)`; it is not computable from these inputs, and a single
401
+ score invites a threshold, which is a target on `never` — the one thing the verification
402
+ ledger says may never have one. A `%` on that line fails the build. Where no row has ever
403
+ been confirmed the line prints the literal `never checked`, because `0 days` reads as
404
+ *checked today*. The doctrine carries both rules where a reader proposing a percentage
405
+ will find them.
406
+ *(guard: `may never take` and `carry it where the next reader looks`)*
407
+
408
+ **47. 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
400
409
  an audit measured it. A claim of enforcement is now checked like any other claim.
401
410
  *(guard: `whose message does not appear in`)* — and a cited literal must lie inside
402
411
  a **single** string in `test/validate.py`: the check reads that file as text, so a
package/README.md CHANGED
@@ -131,6 +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
  | the board between runs | [`backlog.md`](plugins/task-pipeline/skills/task-pipeline/references/backlog.md) — the work-list that outlives a run: seeded at stage 0 or picked up, priority **computed** from three stated inputs rather than assigned, and the seam where the carry-over ledger's `backlog` pointer finally resolves |
133
133
  | what a human confirmed | [`verification.md`](plugins/task-pipeline/skills/task-pipeline/references/verification.md) — one row per shipped REQ and the one column a machine may not fill: the date somebody **looked**, or `never`. No floor, no target — `never` is a fact, and a count driven down is a column that has started lying |
134
+ | how much is unconfirmed | [`exposure.md`](plugins/task-pipeline/skills/task-pipeline/references/exposure.md) — the unconfirmed count as a **vector with its components named**, never a percentage: `P(defect)` is not computable from these inputs and a single score invites a threshold, which is a target on `never`. Plus the check-list, oldest first, and the `/task-pipeline checkup` mode that prints it with no task in flight |
134
135
  | 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 |
135
136
  | 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 |
136
137
  | 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 |
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.32.0 |
15
+ | **Version** | 1.33.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` |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeline-skill",
3
- "version": "1.32.0",
3
+ "version": "1.33.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.32.0",
5
+ "version": "1.33.0",
6
6
  "author": {
7
7
  "name": "ssheleg",
8
8
  "url": "https://x.com/sshlg93"
@@ -44,6 +44,17 @@ Idempotent entry — inspect state first, never restart blindly:
44
44
  - Otherwise, begin at stage 0 (intake grill). If no task is given above, the
45
45
  grill's first question asks the operator for the task in one line.
46
46
 
47
+ **`/task-pipeline checkup`** — **runs with no task in flight, and that is the point.**
48
+ Accumulated unconfirmed work is invisible precisely because nobody is running a pipeline,
49
+ so a check living only inside a run can never say *"stop, fourteen things are
50
+ unconfirmed."* It takes no brief, opens no grill, and writes nothing on its own. Four
51
+ sections, each read from a file this pipeline already keeps: the **exposure** line with
52
+ its check-list oldest-first, the **board**'s open rows by computed priority, the
53
+ carry-over ledgers' unresolved count, and the code graph's staleness where one exists.
54
+ Where you ask it to file what it found, it appends board rows whose `Source` names the
55
+ checkup and its date — printing what it would add first, never silently. Doctrine:
56
+ `references/exposure.md`.
57
+
47
58
  **`/task-pipeline setup`** — the entry audit instead of a feature. Runs seven passes
48
59
  over the documentation this project already has, reports findings as `file:line` + the
49
60
  minimal fix ordered by seam, and hands back a fix plan the pipeline can run. Offered
@@ -70,6 +70,7 @@ gate stops until it is installed.
70
70
  | run-wide · how a run keeps going (the loop mode + the context budget) | [`references/continuity.md`](references/continuity.md) |
71
71
  | run-wide · the work-list **between** runs, and how its priority is computed | [`references/backlog.md`](references/backlog.md) |
72
72
  | run-wide · whether a **human** ever confirmed what shipped, and when | [`references/verification.md`](references/verification.md) |
73
+ | run-wide · how much unconfirmed work has piled up, and what to look at first | [`references/exposure.md`](references/exposure.md) |
73
74
 
74
75
  **Optional bridge.** If the operator already runs an equivalent skill set (e.g.
75
76
  `superpowers:brainstorming` / `writing-plans` / `subagent-driven-development` /
@@ -129,9 +129,16 @@ works a stale board for as long as the loop runs. One command, at the top of the
129
129
  iteration, recorded ([`knowledge-sources.md`](knowledge-sources.md) → *Carried-in
130
130
  claims*; [`learned.md`](learned.md) rule 16).
131
131
 
132
+ **The work-list is `docs/superpowers/backlog.md`** ([`backlog.md`](backlog.md)), and the
133
+ other half of the same measurement is the exposure line ([`exposure.md`](exposure.md)).
134
+ Counted at the top of the iteration, re-derived at the bottom — `age` moves on its own,
135
+ so the re-derivation is the only moment the board stops being stale.
136
+
132
137
  This is also where a loop's report goes wrong most quietly. *"Next up is X"* at the
133
138
  end of an iteration is a claim about the board, and it is the one sentence in the
134
- whole cycle that no gate reads. It cites the measurement or it is not written.
139
+ whole cycle that no gate reads. It cites the measurement or it is not written — **a
140
+ `B-NNN`, not a description**: *"next up: B-014"* can be checked against the file,
141
+ *"next up: the export fix"* cannot.
135
142
 
136
143
  ## Parked at a manual gate
137
144
 
@@ -0,0 +1,103 @@
1
+ # Exposure — how much unverified work has piled up, and what to look at
2
+
3
+ **One job: turn the verification ledger into a number somebody can act on, without
4
+ pretending it is a probability.**
5
+
6
+ [`verification.md`](verification.md) records whether a person ever confirmed each shipped
7
+ REQ. This file turns that record into the line printed beside every verdict, and into the
8
+ list `/task-pipeline checkup` hands an operator.
9
+
10
+ ---
11
+
12
+ ## Contents
13
+
14
+ - Why it is not a probability
15
+ - The components, each named
16
+ - The check-list, and how it is ordered
17
+ - `/task-pipeline checkup`
18
+ - What the loop does with it
19
+ - Rationalizations
20
+
21
+ ## Why it is not a probability
22
+
23
+ The request that produced this file asked for *"the probability of an error"*. That is
24
+ not computable from these inputs, and a number presenting itself as `P(defect)` is the
25
+ false-success class this repository has spent its whole history removing: an estimate
26
+ wearing a measurement's clothes.
27
+
28
+ **So no percentage, ever** — the guard rejects a `%` on the exposure line. What ships is
29
+ a **vector with its components named**, and the reason is not fussiness: a single score
30
+ invites a threshold, and a threshold here is a target on `never`, which is the one thing
31
+ [`verification.md`](verification.md) says may never have one.
32
+
33
+ It could become a real probability later. `verification.md` is exactly the journal that
34
+ would make calibration possible after enough runs carry both a confirmation date and a
35
+ defect. Until then it is named honestly.
36
+
37
+ ## The components, each named
38
+
39
+ ```
40
+ exposure: 99 unverified · never checked · 31 releases since the last human confirmation
41
+ ```
42
+
43
+ - **unverified** — rows whose `Human` reads `never`.
44
+ - **since** — days since the newest `Human` date. When **no** row has ever been
45
+ confirmed, this prints the literal **`never checked`**, not `0 days`: zero would read
46
+ as *checked today*, which is the opposite of the truth and exactly the kind of quiet
47
+ inversion this pipeline exists to prevent.
48
+ - **releases** — tags cut since that date, or since the first shipped row when there is
49
+ no date. It is the component an operator feels: *"how much has gone out on top of
50
+ something nobody looked at."*
51
+
52
+ Every component is derived from files in the repository. None is estimated.
53
+
54
+ ## The check-list, and how it is ordered
55
+
56
+ The list is the deliverable — a number without it tells somebody they have a problem and
57
+ not where. Ordered by what the repository can defend:
58
+
59
+ 1. **Oldest first**, by `Shipped in`. The longest-unconfirmed row is the one whose
60
+ context is most gone, and whose author is least likely to remember it.
61
+ 2. **Tie-broken by blast radius** where the board carries a row for it, reusing
62
+ [`backlog.md`](backlog.md)'s own stated input rather than inventing a weight here.
63
+
64
+ No third factor. A ranking with an unstated input is the hand-assigned priority the board
65
+ already refuses.
66
+
67
+ ## `/task-pipeline checkup`
68
+
69
+ A **mode of the command**, like `setup` — not a new command, because a second command
70
+ costs every surface a command touches and this repository has learned what that means.
71
+
72
+ **It runs with no task in flight, and that is the point.** Accumulated unverified work is
73
+ invisible *precisely because nobody is running a pipeline*; a check that only exists
74
+ inside a run can never say *"stop, fourteen things are unconfirmed."* So it takes no
75
+ brief, opens no grill, and writes nothing on its own.
76
+
77
+ It prints four sections, each read from a file this pipeline already keeps: the exposure
78
+ line and its check-list, the board's open rows by computed priority, the carry-over
79
+ ledgers' unresolved count, and the code graph's staleness where one exists.
80
+
81
+ **Where the operator asks it to file findings**, it appends board rows whose `Source`
82
+ names the checkup and its date — so a row a machine created is distinguishable from one a
83
+ run surfaced. It prints what it would add first. Never silently.
84
+
85
+ ## What the loop does with it
86
+
87
+ [`continuity.md`](continuity.md) has always required each iteration to re-measure the
88
+ work-list, and said that *"next up is X"* is a claim about the board that no gate reads.
89
+ [`backlog.md`](backlog.md) is that board; the exposure line is the other half of the same
90
+ measurement, and both are read at the top of an iteration and re-derived at the bottom.
91
+
92
+ An iteration that reports what it will do next **cites the file**: `B-014`, not *"the
93
+ export fix"*.
94
+
95
+ ## Rationalizations
96
+
97
+ | The excuse | What is actually true |
98
+ |---|---|
99
+ | "Give me one number, I'll decide the threshold" | The threshold would be a target on `never`, and the column would start lying within a week. The components are one line; read them. |
100
+ | "A percentage is easier to communicate" | It is easier to communicate because it says more than is known. That is the whole objection. |
101
+ | "The check-list is long, just show the top three" | Then the fourth is never checked and nobody knows it exists. Print it all; the operator can stop reading. |
102
+ | "Checkup duplicates stage 8" | Stage 8 verifies **this run's** deploy. Checkup asks what has accumulated across all of them, which no stage is ever in a position to ask. |
103
+ | "We'll run checkup when something breaks" | After a break you know where to look. The list exists for before. |
@@ -56,6 +56,7 @@ a row pointing outside the bundle is the defect this file exists to catch.
56
56
  | **The context budget** — the evidence rule and what a flush actually updates | `references/continuity.md` |
57
57
  | **The board** — the work-list between runs, its computed priority, and the ledger seam it resolves | `references/backlog.md` |
58
58
  | **The verification ledger** — what shipped, and whether a human ever confirmed it | `references/verification.md` |
59
+ | **Exposure** — the unconfirmed count as a named vector, never a probability, and the `checkup` mode | `references/exposure.md` |
59
60
  | The retro: prune, cap, commits, archive | `references/retrospective.md` |
60
61
  | Rules earned by failure | `references/learned.md` |
61
62
  | **The routing default and its boundary** | `templates/routing-rule.md` |