task-pipeline-skill 1.38.0 → 1.39.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,82 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.39.0 — the skill could not be reached by the word "audit"
4
+
5
+ `references/audit.md` has said since v0.1.0 that an audit may be **the whole task** —
6
+ stages 3–5 producing findings and fixes instead of a feature. No routing surface named
7
+ it. Every trigger noun was build-shaped, and the exclusion clause read *"Not for:
8
+ answering a question, explaining or reading code"* — which is the opening move of an
9
+ audit, a bug hunt, a production check and a PR review alike.
10
+
11
+ ### Measured, not supposed
12
+
13
+ Ten routing queries, one fresh agent each, holding nothing but the competing skill
14
+ descriptions and one user sentence (`evals/routing/render.py`, results in
15
+ `evals/routing/RESULTS.md`). **7 / 10 before.** The three misses were the three the board
16
+ row predicted, and none of them was a failure to find a match — each agent **quoted this
17
+ skill's own exclusion clause back as the reason it refused**:
18
+
19
+ - «проверь, нет ли ошибок в обработчике вебхуков» → `none`
20
+ - «проверь, всё ли живо в проде после вчерашнего релиза» → `none`
21
+ - «посмотри PR #24 и скажи, что там не так» → `none`
22
+
23
+ A fourth result only the reasoning shows: «сделай аудит модуля оплат» *did* route, and
24
+ justified it by stretching the build verb `hardening`. A right answer resting on a
25
+ stretch is one rewording from a miss.
26
+
27
+ ### The boundary is what a request ends in
28
+
29
+ Not whether it reads. An answer stops in the conversation; a change **or a finding**
30
+ lands in the tree, and the pipeline is what carries REQ rows, board rows and fixes
31
+ there. The description, the portable routing rule and the Cursor rule now all say so,
32
+ and `reading` is gone from the exclusions — guarded, so it cannot come back quietly.
33
+
34
+ ### Two things the harvest found before the first grill question
35
+
36
+ - **`перевести` was locked into the verb list by the v1.9.0 design and never shipped.**
37
+ It existed in exactly one place in this repository: the design that locked it.
38
+ - **`REQ-003` was accepted `verified` anyway.** The evidence recorded was the clause's
39
+ *shape* and its character count — neither of which can see a missing member of the
40
+ list the REQ locked. An L1→L2 absence that passed an L5 check. A guard now reads the
41
+ locked list out of that design and compares it to the shipped surface, so the next
42
+ dropped verb is a failure rather than a week.
43
+
44
+ ### The reader earned its standing instruction
45
+
46
+ R-005 exists because an author's probes only exercise the shapes the author already
47
+ thought of. Dispatched on the nine new guards, an independent reader defeated them
48
+ **fifteen ways**, each verified by planting the text and watching the validator still
49
+ print `PASS`. The three worth naming:
50
+
51
+ - **A presence test over a whole file proves a word exists, not that the rule says it.**
52
+ The reader deleted the entire boundary clause from the Cursor rule, put the old
53
+ exclusion back, added one unrelated sentence elsewhere containing the same four class
54
+ names — and the guard passed. Both cross-surface checks are now scoped to the
55
+ `## Routing` section.
56
+ - **A `should_not_trigger` control counted as coverage.** The eval-coverage guard joined
57
+ every query regardless of category, so deleting all four findings evals and mentioning
58
+ the words in one negative control certified *named and untested* — the exact state it
59
+ cites `B-046` for — as green. It now reads `should_trigger` queries only.
60
+ - **The anti-dormancy sentinel was itself one synonym from dormant**, and the
61
+ locked-verb guard read a regex out of a document this repo forbids maintaining, so
62
+ relabelling one heading in a superseded design would have silenced the check that
63
+ exists because a verb was silently dropped. Both now fail loudly instead.
64
+
65
+ Nine of the fifteen were in checks written that same hour. The tenth fail site had no
66
+ probe at all — ten branches, nine tests — which is the invariant the repository states
67
+ about itself and did not keep.
68
+
69
+ ### Also
70
+
71
+ - **False-positive controls, because widening a vocabulary can steal work.** Three
72
+ competitors already claim the word *audit* — `seo-aeo-audit`, `ux-audit`,
73
+ `make-skill`. All three are eval cases now, and all three still won their query.
74
+ - **R-003 sweep** turned up the same word-map ceiling that produced R-006, in the
75
+ redaction-rule count: past ten it compared against the digit alone. It now accepts
76
+ either form and names both when it fails.
77
+ - Guards: 218 → **233**; eval cases 21 → **28**; description 956 → 1004 of 1024, paid for
78
+ by cutting mechanism prose that could not affect routing.
79
+
3
80
  ## v1.38.0 — the wall came down, and a green started meaning something
4
81
 
5
82
  An audit of this skill measured nineteen problems and asked one question of all of them:
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.38.0 |
15
+ | **Version** | 1.39.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` |
@@ -605,11 +605,17 @@ track that ran look identical afterwards.
605
605
 
606
606
  ## Routing — when this applies at all
607
607
 
608
- **Work that CHANGES THE REPOSITORY goes through the pipeline** a feature, fix,
609
- refactor, migration, integration, rewrite, adoption or hardening pass, in any
610
- phrasing. **Not** for a question, an explanation, reading code, a typo or a one-line
611
- edit. The operator opts out of a qualifying task by saying "без пайплайна" or
612
- "quick"; when they do, say out loud that the cycle was skipped at their request.
608
+ **Work that LANDS IN THE REPOSITORY goes through the pipeline**, in two shapes: a
609
+ **change** — a feature, fix, refactor, migration, integration, rewrite, adoption or
610
+ hardening pass and a **finding that lands** an audit, a bug hunt, a production
611
+ check, a PR review, whose output is REQ rows, board rows and fixes rather than an
612
+ answer in the chat. In any phrasing.
613
+
614
+ **Not** for a question, an explanation, mapping code for a person to read, a typo or a
615
+ one-line edit. **Reading is not the test**: an audit, a bug hunt and a PR review all
616
+ begin by reading and all three end in the tree. The operator opts out of a qualifying
617
+ task by saying "без пайплайна" or "quick"; when they do, say out loud that the cycle
618
+ was skipped at their request.
613
619
 
614
620
  A borderline case is named, not silently chosen: state which route you are taking and
615
621
  why, in one line.
@@ -0,0 +1,79 @@
1
+ # Routing measurement — results
2
+
3
+ Method: `evals/routing/render.py`. Ten queries, **one fresh agent per query**, holding
4
+ nothing but the competing skill descriptions and one user sentence.
5
+
6
+ > **Limits, stated before the numbers.** This measures the **descriptions'**
7
+ > discriminating power, not Claude Code's selection machinery, which sees more than a
8
+ > description. A subagent is fresh in *context*, not blind in *disposition* — this is
9
+ > **not** the multi-model blind run board row `B-002` asks for and no line here may be
10
+ > quoted as one. And see §3: **one sample per cell is too few**, which this measurement
11
+ > found out about itself by being run twice.
12
+
13
+ ## 1. The three runs
14
+
15
+ | id | query | expected | **A** before | **B** after | **C** after + prod pair |
16
+ |---|---|---|---|---|---|
17
+ | AUD-01 | сделай аудит модуля оплат | task-pipeline | ✓ *(stretch)* | ✓ | ✓ |
18
+ | BUG-01 | проверь, нет ли ошибок в обработчике вебхуков | task-pipeline | **none** | ✓ | ✓ |
19
+ | PRD-01 | проверь, всё ли живо в проде после вчерашнего релиза | task-pipeline | **none** | **none** | **none** |
20
+ | PRR-01 | посмотри PR #24 и скажи, что там не так | task-pipeline | **none** | ✓ | ✓ |
21
+ | FEA-01 | добавь экспорт в CSV на страницу отчётов | task-pipeline | ✓ | ✓ | **none** |
22
+ | QST-01 | объясни, как наш auth middleware решает… | none | ✓ | ✓ | ✓ |
23
+ | TYP-01 | поправь опечатку в заголовке README | none | ✓ | ✓ | ✓ |
24
+ | SEO-01 | сделай аудит лендинга — почему упал трафик | seo-aeo-audit | ✓ | ✓ | ✓ |
25
+ | UXA-01 | проверь, что код соответствует UX-сценариям | ux-audit | ✓ | ✓ | ✓ |
26
+ | SKL-01 | проверь, соответствует ли этот скил стандарту | make-skill | ✓ | ✓ | ✓ |
27
+ | | | | **7 / 10** | **9 / 10** | **8 / 10** |
28
+
29
+ - **A** — `9f67dcd`, description 956/1024, before any edit.
30
+ - **B** — the findings clause added, description 1004/1024.
31
+ - **C** — `production check` given its Russian pair, description 1008/1024.
32
+
33
+ ## 2. What is robust, and what is one sample
34
+
35
+ **Robust — the same result in both after-runs, for the stated reason:**
36
+
37
+ - **BUG-01 and PRR-01: `none` → `task-pipeline`, 2/2.** In A both agents *quoted this
38
+ skill's own exclusion clause* as the reason they refused — *"matching task-pipeline's
39
+ own exclusion 'Not for: … explaining or reading code'"*, *"task-pipeline's is scoped to
40
+ 'work changes the repository', not 'explaining or reading code'"*. In B and C both
41
+ quote the new clause instead. The mechanism named in the refusal is the mechanism the
42
+ change removed.
43
+ - **AUD-01's *reason* changed, 2/2.** It routed in A too — by stretching the build verb
44
+ `hardening`, with nothing in the description naming an audit. In B and C it quotes
45
+ `audit/аудит`. The answer did not move; the ground under it did.
46
+ - **PRD-01 never routed: 0/2 after.** Adding `/проверь прод` did not fix it. In C the
47
+ agent said the request has *"no repository change and no matching trigger"* and
48
+ reached for `checkup` before rejecting it. The production-check class is **named and
49
+ still unreachable** — the vocabulary was necessary and is not sufficient.
50
+
51
+ **One sample, and therefore not a result:**
52
+
53
+ - **FEA-01 flipped to `none` in C** on reasoning that does not parse — *"no such change
54
+ applies here because none of the listed skills is task-pipeline's own trigger"*. This
55
+ is a control that passed in A and B with the same description clause C did not touch.
56
+ Read as run-to-run variance, **not** as a regression caused by the edit — and the
57
+ measurement as built cannot prove that reading, which is the point of §3.
58
+
59
+ ## 3. The measurement's own defect, found by running it twice
60
+
61
+ **One agent per query cannot separate an effect from noise.** Three runs produced three
62
+ totals — 7, 9, 8 — and one of the moves between them (FEA-01) is almost certainly the
63
+ sampler, not the surface. Had the run stopped at B, this file would have reported
64
+ **9/10 and a clean win**, and the claim would have rested on single samples exactly like
65
+ the one that flipped.
66
+
67
+ What a next version needs, in order of value:
68
+
69
+ 1. **N ≥ 3 per cell, majority-scored**, so a flip is visible as a split rather than a
70
+ result. Cost scales linearly and the queries are tiny.
71
+ 2. **The controls scored separately from the targets.** A false-positive control that
72
+ flips is a different fact from a target that does not move.
73
+ 3. **The reason recorded, not only the answer.** Every real finding in this file came
74
+ from *why* an agent chose, not from what it chose — AUD-01 passed in A for a reason
75
+ that was one rewording from failing.
76
+
77
+ Filed as a board row rather than fixed here: the run that needed the harness is the run
78
+ that found the harness too thin, and rebuilding it mid-run would leave the before-numbers
79
+ measured by a different instrument than the after-numbers.
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env python3
2
+ """Render the routing-measurement prompt for one query.
3
+
4
+ The measurement asks a fresh agent, holding nothing but competing skill
5
+ descriptions and one user sentence, which skill it would use. Run before a
6
+ description change and after it; the only thing that may differ between the two
7
+ runs is the text of the descriptions themselves — this file renders everything
8
+ else identically, which is the whole reason it is a file and not a paste.
9
+
10
+ python3 evals/routing/render.py <query-id> # prompt to stdout
11
+ python3 evals/routing/render.py --list # the queries and expectations
12
+
13
+ Honest limits, stated here because a reader of the results will not see them:
14
+ * this measures the DESCRIPTIONS' discriminating power, not Claude Code's own
15
+ selection machinery, which sees more than a description;
16
+ * a subagent carries its host's system prompt, so it is fresh in CONTEXT, not
17
+ in disposition — this is not the blind multi-model run board row B-002 asks
18
+ for, and no result here may be quoted as one.
19
+ """
20
+ import json
21
+ import os
22
+ import re
23
+ import subprocess
24
+ import sys
25
+
26
+ ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
27
+
28
+ # task-pipeline's description is read from the WORKING TREE, so the after-run
29
+ # picks up the edit; the competitors are read from the installed plugins, so an
30
+ # unrelated release of theirs cannot silently move the baseline between runs.
31
+ SELF = os.path.join(ROOT, "plugins/task-pipeline/skills/task-pipeline/SKILL.md")
32
+ MARKETPLACES = os.path.expanduser("~/.claude/plugins/marketplaces")
33
+ COMPETITORS = ["super-ux", "sheleg-design", "make-skill", "agent-sync", "seo-aeo-audit"]
34
+
35
+ QUERIES = [
36
+ # id, the sentence, what should win, why it is here
37
+ ("AUD-01", "сделай аудит модуля оплат", "task-pipeline",
38
+ "findings on code — audit.md:350 says an audit may be the whole task"),
39
+ ("BUG-01", "проверь, нет ли ошибок в обработчике вебхуков", "task-pipeline",
40
+ "bug hunt — findings that land in the repo"),
41
+ ("PRD-01", "проверь, всё ли живо в проде после вчерашнего релиза", "task-pipeline",
42
+ "production check"),
43
+ ("PRR-01", "посмотри PR #24 и скажи, что там не так", "task-pipeline",
44
+ "PR review — review.md owns the reader contract"),
45
+ ("FEA-01", "добавь экспорт в CSV на страницу отчётов", "task-pipeline",
46
+ "CONTROL+ — build work already routes; must not regress"),
47
+ ("QST-01", "объясни, как наш auth middleware решает, какие роуты публичные", "none",
48
+ "CONTROL− — a question; the exclusion must survive the rewording"),
49
+ ("TYP-01", "поправь опечатку в заголовке README", "none",
50
+ "CONTROL− — a one-line edit; the exclusion must survive"),
51
+ ("SEO-01", "сделай аудит лендинга — почему упал трафик из поиска", "seo-aeo-audit",
52
+ "FALSE-POSITIVE test — 'аудит' must not be stolen from its owner"),
53
+ ("UXA-01", "проверь, что код соответствует UX-сценариям", "ux-audit",
54
+ "FALSE-POSITIVE test — the scenario audit has an owner"),
55
+ ("SKL-01", "проверь, соответствует ли этот скил стандарту", "make-skill",
56
+ "FALSE-POSITIVE test — skill-shaped audit has an owner"),
57
+ ]
58
+
59
+
60
+ def _desc(path):
61
+ """The description as the platform reads it: the frontmatter field, unwrapped."""
62
+ t = open(path, encoding="utf-8").read()
63
+ n = re.search(r"^name:\s*(.+)$", t, re.M)
64
+ d = re.search(r"^description:\s*(.+?)(?=^[a-z_-]+:\s|^---)", t, re.M | re.S)
65
+ if not (n and d):
66
+ return None
67
+ return n.group(1).strip(), " ".join(d.group(1).split()).strip("\"' ")
68
+
69
+
70
+ def choices():
71
+ out = []
72
+ s = _desc(SELF)
73
+ if s:
74
+ out.append(s)
75
+ for m in COMPETITORS:
76
+ base = os.path.join(MARKETPLACES, m)
77
+ if not os.path.isdir(base):
78
+ continue
79
+ found = subprocess.run(["find", base, "-name", "SKILL.md"],
80
+ capture_output=True, text=True).stdout.split()
81
+ for f in sorted(found):
82
+ got = _desc(f)
83
+ if got and got[0] not in {o[0] for o in out}:
84
+ out.append(got)
85
+ return out
86
+
87
+
88
+ PROMPT = """You are choosing which skill, if any, to invoke for one user request.
89
+
90
+ Below are the skills available, each with the description its author wrote. You have
91
+ nothing else — no repository, no history, no knowledge of these tools beyond what is
92
+ written here.
93
+
94
+ {catalogue}
95
+
96
+ The user says:
97
+
98
+ {query}
99
+
100
+ Answer with exactly two lines and nothing else:
101
+
102
+ SKILL: <the skill name, or the word none>
103
+ WHY: <one sentence, quoting the phrase in the description that decided it>
104
+ """
105
+
106
+
107
+ def main():
108
+ if "--list" in sys.argv:
109
+ for qid, q, exp, why in QUERIES:
110
+ print(f"{qid:<8}{exp:<16}{q}\n{'':8}{'':16}# {why}")
111
+ return 0
112
+ if "--choices" in sys.argv:
113
+ for name, d in choices():
114
+ print(f"{name:<18}{len(d):>5} chars")
115
+ return 0
116
+ if len(sys.argv) < 2:
117
+ print(__doc__)
118
+ return 2
119
+ qid = sys.argv[1]
120
+ row = next((r for r in QUERIES if r[0] == qid), None)
121
+ if row is None:
122
+ print(f"unknown query id {qid}; --list to see them", file=sys.stderr)
123
+ return 2
124
+ cat = "\n".join(f"- **{name}** — {d}" for name, d in choices())
125
+ print(PROMPT.format(catalogue=cat, query=row[1]))
126
+ return 0
127
+
128
+
129
+ if __name__ == "__main__":
130
+ raise SystemExit(main())
@@ -307,6 +307,92 @@
307
307
  "Does NOT invoke task-pipeline, does not open a grill and does not write a brief"
308
308
  ],
309
309
  "why": "Answering a question is on the skill's own not-for list. The description carries that boundary and nothing has ever measured whether a model honours it."
310
+ },
311
+ {
312
+ "id": "TRIG-07",
313
+ "category": "should_trigger",
314
+ "skills": [
315
+ "task-pipeline"
316
+ ],
317
+ "query": "сделай аудит модуля оплат",
318
+ "expected_behavior": [
319
+ "Invokes the skill: the output is a finding that lands in the repository, which the description names",
320
+ "Runs audit.md's L0->L7 ladder as the whole task — stages 3-5 produce findings and fixes rather than a feature",
321
+ "Does NOT justify the routing by stretching a build verb such as 'hardening'"
322
+ ],
323
+ "why": "Measured 2026-08-10: before the findings clause this routed, but its stated reason was the build-verb list. A right answer resting on a stretch is one rewording from a miss."
324
+ },
325
+ {
326
+ "id": "TRIG-08",
327
+ "category": "should_trigger",
328
+ "skills": [
329
+ "task-pipeline"
330
+ ],
331
+ "query": "проверь, нет ли ошибок в обработчике вебхуков",
332
+ "expected_behavior": [
333
+ "Invokes the skill rather than answering in the chat",
334
+ "Findings become REQ or board rows with file:line and a minimal fix, ordered by seam"
335
+ ],
336
+ "why": "Measured before the change: answered `none`, quoting the exclusion clause 'explaining or reading code'. Reading is the opening move, not the boundary."
337
+ },
338
+ {
339
+ "id": "TRIG-09",
340
+ "category": "should_trigger",
341
+ "skills": [
342
+ "task-pipeline"
343
+ ],
344
+ "query": "проверь, всё ли живо в проде после вчерашнего релиза",
345
+ "expected_behavior": [
346
+ "Invokes the skill; the verification trio, not one of three",
347
+ "Reads the CI run and the platform's own log command rather than assuming a verdict"
348
+ ],
349
+ "why": "Measured before the change: answered `none` on the same exclusion. A production check ends in a verification row, which lands."
350
+ },
351
+ {
352
+ "id": "TRIG-10",
353
+ "category": "should_trigger",
354
+ "skills": [
355
+ "task-pipeline"
356
+ ],
357
+ "query": "посмотри PR #24 и скажи, что там не так",
358
+ "expected_behavior": [
359
+ "Invokes the skill and applies review.md's reviewer contract, including the three reader states",
360
+ "Prints NO READER rather than staying silent when no independent reader is available"
361
+ ],
362
+ "why": "Measured before the change: answered `none` because no description offered a phrase for reviewing a PR, while review.md owns exactly that contract."
363
+ },
364
+ {
365
+ "id": "NOTRIG-06",
366
+ "category": "should_not_trigger",
367
+ "skills": [],
368
+ "query": "сделай аудит лендинга — почему упал трафик из поиска",
369
+ "expected_behavior": [
370
+ "Routes to seo-aeo-audit, whose description names 'почему упал трафик' verbatim",
371
+ "The widened findings vocabulary does not claim an audit that has an owner"
372
+ ],
373
+ "why": "False-positive control. Widening 'audit' must not steal work: gates.md sets the false-positive budget at zero."
374
+ },
375
+ {
376
+ "id": "NOTRIG-07",
377
+ "category": "should_not_trigger",
378
+ "skills": [],
379
+ "query": "проверь, что код соответствует UX-сценариям",
380
+ "expected_behavior": [
381
+ "Routes to ux-audit, which owns the scenario audit",
382
+ "The findings vocabulary in task-pipeline's description does not override an owner that names the surface exactly"
383
+ ],
384
+ "why": "False-positive control against the second competing claim on the word audit."
385
+ },
386
+ {
387
+ "id": "NOTRIG-08",
388
+ "category": "should_not_trigger",
389
+ "skills": [],
390
+ "query": "проверь, соответствует ли этот скил стандарту",
391
+ "expected_behavior": [
392
+ "Routes to make-skill, which owns skill-shaped audits",
393
+ "The findings vocabulary in task-pipeline's description does not override an owner that names the artefact exactly"
394
+ ],
395
+ "why": "False-positive control against the third competing claim on the word audit."
310
396
  }
311
397
  ]
312
398
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeline-skill",
3
- "version": "1.38.0",
3
+ "version": "1.39.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.38.0",
5
+ "version": "1.39.0",
6
6
  "author": {
7
7
  "name": "ssheleg",
8
8
  "url": "https://x.com/sshlg93"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: task-pipeline
3
- description: "Runs a substantial task through a full delivery pipeline: an intake grill that expands the request into a locked brief, then docs study, brainstorm, spec, plan, subagent build, tests, lint/deploy, post-deploy check, docs/wiki sync and acceptance — gated stages whose doctrine ships inside this skill (no required companions). Use when work changes the repository — a feature, fix, refactor, migration, integration, rewrite, adoption or hardening; фича, фикс, рефактор, миграция, интеграция, доработать, починить, внедрить — or on 'run this through the pipeline' / 'прогони по конвейеру', 'the full cycle' / 'полный цикл', /task-pipeline. Two modes need no task at all: 'checkup' / 'чекап' reports what has shipped without a person confirming it and what to look at first; 'setup' audits the documentation a project already has. Not for: answering a question, explaining or reading code, a typo or a one-line edit — say 'без пайплайна' / 'quick' to opt out."
3
+ description: "Runs a substantial task through a full delivery pipeline: an intake grill that locks the request into a brief, then docs study, brainstorm, spec, plan, subagent build, tests, lint/deploy, post-deploy check, docs/wiki sync and acceptance. Use when work changes the repository — a feature, fix, 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. Two modes need no task at all: 'checkup' / 'чекап' reports what has shipped without a person confirming it and what to look at first; 'setup' audits the documentation a project already has. Not for: answering a question, explaining code, a typo or a one-line edit — say 'без пайплайна' / 'quick' to opt out."
4
4
  license: MIT
5
5
  ---
6
6
 
@@ -17,20 +17,32 @@ than no boundary.
17
17
 
18
18
  ---
19
19
 
20
- ## Routing — repo-changing work goes through the pipeline
20
+ ## Routing — work that lands in the repository goes through the pipeline
21
21
 
22
- **When `task-pipeline` is installed, any work that CHANGES THE REPOSITORY goes
23
- through it** — without being asked for. A feature, a fix, a refactor, a migration, an
24
- integration, a rewrite, an adoption, a hardening pass; in any language and any
25
- phrasing. Saying *"run this through the pipeline"* is an accelerator, not a
26
- precondition.
22
+ **When `task-pipeline` is installed, any work that LANDS IN THE REPOSITORY goes
23
+ through it** — without being asked for. Two shapes, not one:
27
24
 
28
- **The boundary is "changes the repository", and it cuts both ways.** Not through the
29
- pipeline:
25
+ - **a change** a feature, a fix, a refactor, a migration, an integration, a rewrite,
26
+ an adoption, a hardening pass;
27
+ - **a finding that lands** — an audit, a bug hunt, a production check, a PR review. Its
28
+ output is not an answer in the chat: it is REQ rows, board rows, ledger rows and
29
+ fixes, and the pipeline is what carries them there.
30
30
 
31
- - a question and its answer, an explanation, reading or mapping code;
31
+ In any language and any phrasing. Saying *"run this through the pipeline"* is an
32
+ accelerator, not a precondition.
33
+
34
+ **The boundary is what the request ENDS IN, and it cuts both ways.** An answer stops in
35
+ the conversation; a change or a finding lands in the tree. Not through the pipeline:
36
+
37
+ - a question and its answer, an explanation, mapping code so a person can read it;
32
38
  - a typo, a one-line edit, a mechanical rename;
33
- - reconnaissance or measurement that commits nothing.
39
+ - reconnaissance or measurement that lands nothing.
40
+
41
+ **Reading is not the test.** An audit, a bug hunt and a PR review all *begin* by reading,
42
+ and all three end in the repository. Excluding them because they read is how a skill with
43
+ a whole doctrine file for audits (`references/audit.md`) never gets reached by the word
44
+ *audit* — measured, not supposed: three of ten routing queries were refused with this
45
+ rule's own exclusion quoted back as the reason.
34
46
 
35
47
  Running ten gated stages for one character is the fastest way to teach an agent to
36
48
  route around the pipeline entirely.