task-pipeline-skill 1.65.0 → 1.66.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,31 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.66.0 — the shape is not fixed, so nothing may assume it
4
+
5
+ **The check-list printed the size of the work labelled as who it hurts, in every seeded
6
+ project.** `exposure.sh` read the board's blast radius from column 5. That is `Blast` in the
7
+ family umbrella's eight-column board and **`Size`** in the ten-column board this repository
8
+ seeds, so a host project got `[blast L]` — a work-size letter presented as a severity.
9
+
10
+ It shipped for a full release **two lines away from where the same lesson had just been
11
+ applied to the ledger's status column**. Fixing one instance of a class and leaving the
12
+ other in the same file is the recurrence this repository's retro already names.
13
+
14
+ Blast is resolved by header now, and two fixtures hold both shapes: the ten-column board
15
+ must yield `[blast 3]` and not `[blast L]`, and the eight-column one must not regress. A
16
+ third case asserts that a board with **no** blast column prints no blast at all — an
17
+ invented weight is worse than a missing one, because it looks like data.
18
+
19
+ **The rule is written down rather than left as two fixes.** `references/backlog.md` gains
20
+ *The shape is not fixed, so nothing may assume it*: resolve every column by header name,
21
+ once per section and knowing a file may hold more than one shape; treat an absent column as
22
+ absent; and name the column in the output where the reading depends on it. Two board shapes
23
+ exist in this family and five ledger shapes, all documented in their own headers, and none
24
+ of them is wrong — reading any of them by position is.
25
+
26
+ Fixtures 18 → **20**. Guards: 351 → **351**; these are behaviours of the seeded script,
27
+ which the fixtures exercise by running it.
28
+
3
29
  ## v1.65.0 — a decision is not debt
4
30
 
5
31
  **`open` is work not done, `dropped` is an idea abandoned, and neither fits a deliberate
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.65.0 |
15
+ | **Version** | 1.66.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, 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.65.0",
3
+ "version": "1.66.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 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.65.0",
5
+ "version": "1.66.0",
6
6
  "author": {
7
7
  "name": "ssheleg",
8
8
  "url": "https://x.com/sshlg93"
@@ -20,6 +20,7 @@ exactly one seam, and that seam already existed as a dangling pointer.
20
20
  - Seeded or picked up
21
21
  - A row that says work exists names where it lives
22
22
  - Priority is computed, not assigned
23
+ - The shape is not fixed, so nothing may assume it
23
24
  - A decision is not debt — `waived`
24
25
  - What a loop iteration does with it
25
26
  - Rationalizations
@@ -121,6 +122,32 @@ Two consequences worth stating, because both are the point:
121
122
  `sev` and `blast` are judgement, and they are written down *as* judgement: two small
122
123
  integers a reader can disagree with, rather than a ranking they can only accept.
123
124
 
125
+ ## The shape is not fixed, so nothing may assume it
126
+
127
+ This template ships one shape. Projects change it, and they are right to — the family
128
+ umbrella dropped `Size`, `Sev` and `Home`, added `Effort`, and divides by it, which ranks
129
+ cheap-and-old above expensive-and-old in a way `sev × blast` cannot. Two shapes, both
130
+ documented in their own headers, neither wrong.
131
+
132
+ **What is wrong is reading either one by position.** `$5` is `Blast` in an eight-column
133
+ board and `Size` in this ten-column one, so a check-list that read index 5 printed
134
+ `[blast L]` in every seeded project — the *size* of the work, labelled as who it hurts.
135
+ It shipped for a full release, two lines from where the same lesson had just been applied
136
+ to a different column.
137
+
138
+ So the rule, for anything that reads a board or a ledger:
139
+
140
+ - **Resolve every column by its header name**, once per section, and remember that a file
141
+ may hold more than one shape.
142
+ - **A column that is absent is absent.** Print nothing rather than a default — an invented
143
+ weight is worse than a missing one, because it looks like data.
144
+ - **Name the column in the output** where the reading depends on it. `[blast 3]` says which
145
+ number that is; a bare `3` does not.
146
+
147
+ The same rule governs the verification ledger, where five shapes exist across this family
148
+ and only one carries a column that can say a *person* looked
149
+ ([`exposure.md`](exposure.md)).
150
+
124
151
  ## A decision is not debt — `waived`
125
152
 
126
153
  `open` is work not done. `dropped` is an idea abandoned. Neither fits a deliberate **no**
@@ -273,7 +273,15 @@ head -"$LIST_MAX" "$TMP/sorted" | while IFS="$(printf '\t')" read -r ship req wh
273
273
  # than inventing a weight here. Absent is printed as absent, never as a default.
274
274
  blast=""
275
275
  if [ -f "$BOARD" ]; then
276
- blast=$(grep -m1 "| $req |" "$BOARD" 2>/dev/null | awk -F'|' '{ b=$5; gsub(/^[ \t]+|[ \t]+$/, "", b); print b }')
276
+ blast=$(awk -F'|' -v req="$req" '
277
+ function trim(s) { gsub(/^[ \t]+|[ \t]+$/, "", s); return s }
278
+ # BY HEADER, not by index — the same lesson as the status column, and it was left
279
+ # two lines away for a whole release. `$5` is `Blast` in an eight-column board and
280
+ # `Size` in the ten-column one this repository SEEDS, so a host project`s check-list
281
+ # printed `[blast L]`: the size of the work, labelled as who it hurts.
282
+ tolower(trim($2)) == "id" { for (i = 2; i < NF; i++) if (tolower(trim($i)) == "blast") bcol = i; next }
283
+ bcol && trim($2) == req { print trim($(bcol)); exit }
284
+ ' "$BOARD" 2>/dev/null)
277
285
  fi
278
286
  if [ -n "$blast" ]; then
279
287
  printf ' %-10s %-12s %s [blast %s]\n' "$ship" "$req" "$what" "$blast"