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.
|
|
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.
|
|
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.
|
|
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
|