task-pipeline-skill 1.84.1 → 1.85.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,3 +1,80 @@
1
+ ## v1.85.0 — a release stamp names the tag, and the amend rule's sibling one level up
2
+
3
+ `B-124`, filed by the umbrella's coordinator after watching the same class three times:
4
+ `v1.79.1` twice and `v1.80.0`. It recurred again on 2026-09-05 in the umbrella
5
+ repository and **burned two tags** in one afternoon, which is what turns it from a
6
+ memory gap into a mechanism gap — this repository's retro had recorded the lesson twice
7
+ already.
8
+
9
+ **Each step is right on its own**, which is why the amend rule did not cover it: the
10
+ stamp is written on the PR branch → it cites that branch's HEAD → `main` is
11
+ **rebase-merge-only** by ruleset → the rebase mints new SHAs → the object the stamp names
12
+ dies with the branch. Two correct refusals follow, and both cost a full CI round measured
13
+ at 57–97 minutes here:
14
+
15
+ 1. the unstamped-release guard reads the tag's own commit range and finds no stamp that
16
+ resolves;
17
+ 2. the documentation gate resolves every backticked SHA against a **fresh clone**, where
18
+ the branch commit never existed.
19
+
20
+ **A SHA the author can know before the merge is precisely the SHA the merge destroys**,
21
+ so the rule cannot be *write a better SHA*. `references/retrospective.md` now carries the
22
+ two shapes that survive — cite the release **tag**, or write the stamp **after** the
23
+ merge naming the merge commit, which is the default because the amend rule already
24
+ requires the SHA to exist before a file names it — and the step that ends the class: cut
25
+ the tag locally, run `npm run test:all` against **its** tree, and push only if that is
26
+ green. A tag cannot be repaired; deleting or re-pointing one is refused by repository
27
+ rule, correctly, because a tag is a promise about a tree.
28
+
29
+ `test/validate.py` asserts the section names all five load-bearing strings, so the rule
30
+ cannot rot into an intention the next author reads past — which is how it recurred.
31
+
32
+ Guards: 424 → **429** — one plant per named string, each removing **every** occurrence
33
+ inside the section.
34
+
35
+ ### And adding those five plants broke CI silently
36
+
37
+ Not a side note — the mechanism this repository's whole assurance story rests on has a
38
+ budget, and this release spent the last of it.
39
+
40
+ The five plants, written inline, took `.github/workflows/validate.yml` from **508 189 to
41
+ 518 928 bytes**, and GitHub **stopped creating runs entirely**. The workflow still
42
+ reported `active` through the API, `head_sha` had zero runs, and `gh pr checks` printed
43
+ *no checks reported* — which reads like a queue delay, not a refusal. The PR sat with no
44
+ CI and nothing said why.
45
+
46
+ **Bracketed by measurement rather than by the documentation alone:**
47
+
48
+ | workflow size | runs created |
49
+ |---|---|
50
+ | 508 189 bytes | yes |
51
+ | **518 928 bytes** | **none** |
52
+ | 511 096 bytes, after the plants were factored into a script | yes |
53
+
54
+ GitHub's documented ceiling is 512 KB and it falls inside that bracket, which is why the
55
+ hard number in the guard is the documented one rather than a guess dressed as a
56
+ measurement. The guard has **two bands**: it fails past 512 000, and it *prints* the
57
+ remaining room past 505 000 — because a ceiling you only learn about by crossing it is
58
+ the defect, not the ceiling.
59
+
60
+ It prints **904 bytes remaining** today.
61
+
62
+ **The rule that bought the room:** a plant's body belongs in `test/plant_*.py`, called
63
+ with an argument. Five inline copies cost 10 739 bytes; one script and five four-line
64
+ steps cost 2 907.
65
+
66
+ **My own measurement was wrong first.** I sized the file with `len(s)` — characters — and
67
+ read 509 350 for a file of 511 096 bytes, because the workflow carries Cyrillic. The
68
+ guard uses `os.path.getsize`.
69
+
70
+ **The check's first draft was itself the defect it guards against.** It searched the whole
71
+ file, and `git merge-base --is-ancestor` already appears under *Every lesson carries its
72
+ commit* — so the plant that removed the command from the new rule **passed**, and the
73
+ check was resting on a different section's sentence. Scoped to the section now, with all
74
+ five needles watched refusing their plant. Two of those plants had to be rewritten to
75
+ remove **every** occurrence: a plant that leaves a second copy behind proves the check is
76
+ inert when it is not.
77
+
1
78
  ## v1.84.1 — the conformance sentence is computed, and two of its five figures were wrong
2
79
 
3
80
  **A sentence of five measured figures, and nothing derived any of them.** The README's
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.84.1 |
15
+ | **Version** | 1.85.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.84.1",
3
+ "version": "1.85.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"
@@ -3,7 +3,7 @@
3
3
  "name": "task-pipeline",
4
4
  "displayName": "Task Pipeline",
5
5
  "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/judgment/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.",
6
- "version": "1.84.1",
6
+ "version": "1.85.0",
7
7
  "author": {
8
8
  "name": "ssheleg",
9
9
  "url": "https://x.com/sshlg93"
@@ -33,6 +33,7 @@ file exists to stop.
33
33
  - Write the entry only for a divergence — and name the layer that owned it
34
34
  - Every lesson carries its commit
35
35
  - Never amend a commit a record already names
36
+ - A release stamp names the TAG, and the merge commit — never the branch's own SHA
36
37
  - The stamp table is capped at ten, and *one line per run* was never a cap
37
38
  - `publish:` is a line in the verdict, not a silence
38
39
  - Rotation — the archive is how pruning stops losing things
@@ -113,6 +114,48 @@ The stamp costs one line and one commit. A run that folds it back into the work
113
114
  the history tidy is trading a reader's ability to find the incident for the appearance of
114
115
  tidiness — and the reader is the entire reason the stamp exists.
115
116
 
117
+ ## A release stamp names the TAG, and the merge commit — never the branch's own SHA
118
+
119
+ The sibling of the amend rule, one level up, and it recurred three times after the amend
120
+ rule was written because each step is right on its own: stamp the run on the PR branch →
121
+ the stamp cites that branch's HEAD → `main` is **rebase-merge-only** by ruleset → the
122
+ rebase mints new SHAs → the object the stamp names dies with the branch.
123
+
124
+ Measured across `v1.79.1` (twice) and `v1.80.0`, and again on 2026-09-05 in the umbrella
125
+ repository, where it burned **two tags** in one afternoon. Each recurrence costs the same
126
+ two refusals, both of them correct:
127
+
128
+ 1. the **unstamped-release guard** reads the tag's own commit range, finds no stamp that
129
+ resolves, and refuses the release;
130
+ 2. the **documentation gate** resolves every backticked commit reference against a *fresh
131
+ clone*, where the branch SHA has never existed, and refuses again.
132
+
133
+ Then it costs one extra PR and one full CI round — measured at 57–97 minutes here.
134
+
135
+ **The shape that survives a rebase-merge is the tag.** A SHA the author can know before
136
+ the merge is precisely the SHA the merge is about to destroy, so the rule cannot be
137
+ "write a better SHA". Two spellings are allowed and nothing else:
138
+
139
+ - **cite the release tag** — `v1.84.1` is immutable, it is the thing being released, and
140
+ it resolves in any clone;
141
+ - **or write the stamp AFTER the merge**, in a second PR, naming the **merge commit**.
142
+ This is the default, because it is what the amend rule already forces one level down:
143
+ once a file names a SHA, that commit is frozen, so the SHA has to exist first.
144
+
145
+ The order for a release run is therefore:
146
+
147
+ 1. merge the work; the merge commit is now a real object on `main`;
148
+ 2. **then** stamp, in a second PR, naming that merge commit;
149
+ 3. cut the tag **locally**, run `npm run test:all` against the tag's own tree, and push
150
+ the tag only if that run is green — `git merge-base --is-ancestor <stamp-sha> HEAD`
151
+ is what the release gate will ask, so ask it first.
152
+
153
+ Step 3 is not optional and it is not the same as a green branch build: the branch tree
154
+ and the tag's tree differ by whatever the merge did, and **a tag cannot be repaired** —
155
+ deleting or re-pointing one is refused by repository rule, correctly, because a tag is a
156
+ promise about a tree. A tag pushed on a green branch build is a promise about a tree
157
+ nobody ran.
158
+
116
159
  ## The stamp table is capped at ten, and *one line per run* was never a cap
117
160
 
118
161
  Measured 2026-08-10: standing instructions **~1 234 tok** behind a cap of ten, run stamps