task-pipeline-skill 1.90.2 → 1.91.2

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,52 @@
1
+ ## v1.91.2 — v1.91.1's payload, released with its no-stamp declaration
2
+
3
+ `release.yml` refused the `v1.91.1` tag's own tree: the release carried no run stamp and was
4
+ not named in `## Releases that carry no stamp`. Nothing was published under it. This
5
+ release is the same payload with the declaration in `docs/evidence/retro.md`. What v1.91.1
6
+ ships is described in its section below.
7
+
8
+ ## v1.91.1 — the gates read the current run only, and a broken python3 stops only releases
9
+
10
+ - **The release gate read every run in the ledger.** `.task-pipeline/run.md` is
11
+ append-only, and a project that reuses it holds earlier runs above the current one.
12
+ The gate took the FIRST `stage: … tests … verdict pass` in the whole file, so a
13
+ previous release's pass admitted `git tag` while this run's tests were still PENDING
14
+ (reported 2026-10-11 from a live ledger: the 0.2.0 pass would have released 0.4.0).
15
+ Both gates now read only what follows the last `Run:` header — the line
16
+ `templates/run.md` writes once per run; a ledger with no header is one run.
17
+ - **The build gate had the same leak.** A previous run that had entered dev silenced
18
+ the ask for a new run still in planning. Same scoping, same fixture shape.
19
+ - **A failed python3 no longer blocks every command.** With the disk full, python3
20
+ could not start, and the gate refused `ls` in any project with a run in flight. A
21
+ shell pre-filter now lets a command through when it carries none of
22
+ `tag`/`push`/`release`/`publish`; anything that could release still fails closed.
23
+
24
+ Four fixtures in `test/release_gate_test.py`, each watched failing before its fix.
25
+
26
+ ## v1.91.0 — the description says «баг», and a lightweight tag is refused before release
27
+
28
+ v1.90.0 added `bug` to the description so "fix this bug" routes here by name. The Russian
29
+ word stayed out, so «почини баг в оплате» reached the pipeline only through the umbrella's
30
+ prompt hook, never through the skill's own description. «баг» now stands beside «фикс».
31
+ This is the one-word change of the unmerged PR #102, redone on current `main` because that
32
+ branch carried a version that v1.90.1 has since taken. To pay for it, the trigger quoted as
33
+ 'full cycle, the full cycle' is now 'the full cycle': the umbrella routes on that phrase,
34
+ and the shorter one is inside it. 908 → 901 of 1024 chars, 69 under the 970 working
35
+ limit, where the umbrella counts a skill within 60 of that limit as crowding it.
36
+
37
+ - **`release.yml` refuses a lightweight tag.** `git describe` and `git submodule status`
38
+ see annotated tags only. On 2026-10-09 four family members were cut with lightweight
39
+ tags, and the umbrella read each one as its previous release. A step right after the
40
+ tag checkout now runs `git cat-file -t` on the tag and stops with a remedy unless it is
41
+ a tag object. Nothing has been published by the time it runs. It is the same step the
42
+ umbrella's own `release.yml` has run since its B-93.
43
+ - **`test/project_audit_test.py` closes what it opens.** Four reads left their file handle
44
+ to the garbage collector, and `python3 -W always` printed a `ResourceWarning` for each.
45
+ They now read inside `with`, and the same run prints none.
46
+
47
+ Guards: 430 → **430**. The validator is unchanged. The new release step is a workflow
48
+ check, and a lightweight tag planted in a scratch repository was watched failing it.
49
+
1
50
  ## v1.90.2 — release evidence survives squash integration
2
51
 
3
52
  The host-portability payload from v1.90.1 is unchanged. Its release stopped at the
package/README.md CHANGED
@@ -587,7 +587,7 @@ must say so.
587
587
  ### Held to Anthropic's own Skill authoring guidance
588
588
 
589
589
  Audited against the four Agent Skills pages. Most of it already held — `name`
590
- 13/64 chars, `description` 908/1024 chars, `SKILL.md` 278/500 lines, all 39 references
590
+ 13/64 chars, `description` 901/1024 chars, `SKILL.md` 278/500 lines, all 39 references
591
591
  linked **directly** from `SKILL.md`, and the bundle far under the 30 MB ceiling. What
592
592
  did not, now does:
593
593
 
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.90.2 |
15
+ | **Version** | 1.91.2 |
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.90.2",
3
+ "version": "1.91.2",
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.90.2",
6
+ "version": "1.91.2",
7
7
  "author": {
8
8
  "name": "ssheleg",
9
9
  "url": "https://x.com/sshlg93"
@@ -54,6 +54,12 @@ try:
54
54
  except Exception:
55
55
  raise SystemExit(0)
56
56
 
57
+ # Only the CURRENT run speaks: everything after the last `Run:` header. A previous
58
+ # run that entered dev in a reused, append-only ledger silenced this gate (B-151).
59
+ _lines = text.splitlines()
60
+ _starts = [i for i, l in enumerate(_lines) if l.strip().startswith("Run:")]
61
+ text = "\n".join(_lines[_starts[-1]:] if _starts else _lines)
62
+
57
63
  stage_lines = [l.strip() for l in text.splitlines() if l.strip().startswith("stage:")]
58
64
  if not stage_lines:
59
65
  raise SystemExit(0)
@@ -155,6 +155,14 @@ except Exception:
155
155
  # gate cannot tell. Fail closed, and say which file to look at.
156
156
  print("block\t%s\tthe run ledger could not be read" % act); raise SystemExit(0)
157
157
 
158
+ # B-151: the ledger is append-only, and a project that reuses it holds earlier runs
159
+ # above this one. Only the CURRENT run speaks — everything after the last `Run:`
160
+ # header (templates/run.md writes one per run); a ledger with no header is one run.
161
+ # A previous release's `verdict pass` admitted a tag whose own tests were PENDING.
162
+ _lines = text.splitlines()
163
+ _starts = [i for i, l in enumerate(_lines) if l.strip().startswith("Run:")]
164
+ text = "\n".join(_lines[_starts[-1]:] if _starts else _lines)
165
+
158
166
  stage_lines = [l.strip() for l in text.splitlines() if l.strip().startswith("stage:")]
159
167
 
160
168
 
@@ -243,6 +251,13 @@ status=$?
243
251
  # A gate that cannot reach its own decision must not wave the release through.
244
252
  if [ $status -ne 0 ] || [ -z "$verdict" ]; then
245
253
  [ -f "$ledger" ] || exit 0
254
+ # B-152: without python3 the command cannot be classified, and refusing EVERY
255
+ # Bash call took the whole session down on a full disk. A word-level pre-filter
256
+ # keeps fail-closed exactly where it matters: anything that could tag, push,
257
+ # release or publish is still refused; `ls` is not.
258
+ if ! printf '%s' "$input" | grep -Eq '(^|[^[:alnum:]_])(tag|tags|push|release|publish)([^[:alnum:]_]|$)'; then
259
+ exit 0
260
+ fi
246
261
  echo "task-pipeline: the stage-7 gate could not run (python3 missing or failed), and this project has a run in flight ($ledger). Refusing an outward act rather than failing open." >&2
247
262
  exit 2
248
263
  fi
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: task-pipeline
3
- description: "Use when work changes the repository — feature, fix, bug, refactor, migration, integration, rewrite, adoption or hardening; фича, фикс, рефактор, миграция, интеграция, доработать, починить, внедрить, перевести — or when the output is a finding that lands in it: audit/аудит, bug hunt/проверь ошибки, production check/проверь прод, PR review/ревью PR — or on 'run this through the pipeline' / 'прогони по конвейеру', 'full cycle, the full cycle' / 'полный цикл', /task-pipeline. Runs a substantial task through an intake grill, docs study, brainstorm, spec, plan, build, tests, deploy, post-deploy, docs/wiki sync and acceptance with explicit gates. 'checkup' / 'чекап' reports unconfirmed releases; 'setup' audits existing docs. Not for: answering a question, explaining code, a typo or a one-line edit, a mechanical rename, reconnaissance that lands nothing — say 'no pipeline' / 'без пайплайна' to opt out."
3
+ description: "Use when work changes the repository — feature, fix, bug, refactor, migration, integration, rewrite, adoption or hardening; фича, фикс, баг, рефактор, миграция, интеграция, доработать, починить, внедрить, перевести — or when the output is a finding that lands in it: audit/аудит, bug hunt/проверь ошибки, production check/проверь прод, PR review/ревью PR — or on 'run this through the pipeline' / 'прогони по конвейеру', 'the full cycle' / 'полный цикл', /task-pipeline. Runs a substantial task through an intake grill, docs study, brainstorm, spec, plan, build, tests, deploy, post-deploy, docs/wiki sync and acceptance with explicit gates. 'checkup' / 'чекап' reports unconfirmed releases; 'setup' audits existing docs. Not for: answering a question, explaining code, a typo or a one-line edit, a mechanical rename, reconnaissance that lands nothing — say 'no pipeline' / 'без пайплайна' to opt out."
4
4
  license: MIT
5
5
  compatibility: "Doctrine runs on any agent. The bundled scripts need python3; the run needs git. Missing either degrades, never blocks — the graph verbs and seeded gates go unused, and the run says so."
6
6
  ---