task-pipeline-skill 1.16.0 → 1.16.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,5 +1,66 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.16.2 — 2026-08-06
4
+
5
+ ### Added — a CI run is checked by reading it, not by assuming it
6
+
7
+ The bundle offered a place (`conventions.md`: *"CI: the workflow run."*) and a claim
8
+ (`release.verify`: *"CI green on the tagged commit"*) with no method between them.
9
+ Both are satisfiable by believing them, which is the class `gates.md` named in
10
+ v1.14.0: **an actor's own reply is not evidence about the world**, and the test —
11
+ *what does it print when it did not look?*
12
+
13
+ The occasion was v1.15.0's own release. `validate` was `completed/failure` on a push
14
+ to `main` and on the release tag. The failure was **correct**: the repository's own
15
+ *Every v\* tag must be contained in main* guard, firing on a tag that was not yet an
16
+ ancestor — precisely the defect v1.6.1 built it for. The guard worked, and **nothing
17
+ obliged anyone to read it**. A guard nobody reads is a fail-open hook with extra
18
+ steps; it surfaced only because the run happened to poll the API.
19
+
20
+ - **`conventions.md` gains *The CI verdict***: the commands (`gh run list … --json
21
+ databaseId,name,status,conclusion,headSha`, then `gh run view … --log-failed`), an
22
+ **unauthenticated fallback** on the `check-runs` API, and **three states** —
23
+ concluded, in progress (*"it was still running when I looked"* is a report, not a
24
+ verdict), and **no run found**, said out loud, because a project without CI is a
25
+ legitimate state and not a green one.
26
+ - **Read the log, not just the verdict.** A conclusion says *that* it failed; only the
27
+ log said *what* — the guard's name, the orphan tag and the one-line fix. A bare "CI
28
+ failed" hands the next reader a search the log had already finished.
29
+ - **Two paths because one credential died.** `gh`'s token expired mid-run that night,
30
+ and `gh auth status` reported it invalid from a **cached** verdict while `gh api
31
+ user` succeeded. The doctrine names the live call, never the status command.
32
+ - **Bound at stages 7, 8 and 9** — every stage of this flow that pushes. The incident
33
+ hit at the merge and again at the docs push; binding stage 8 alone would have caught
34
+ neither. The gates cite `conventions.md`; a guard rejects a second copy of the
35
+ commands.
36
+ - **It reports, it does not block** — the shape stage 8 already used for deploy logs.
37
+ Blocking would make a project *without* CI cheaper to ship from than one with it.
38
+
39
+ ### Fixed — the negatives floor may no longer lag its own workflow
40
+
41
+ `MIN_EXPECTED` is a number in a living document, so rule 8 binds it: it must **equal**
42
+ the workflow's count, not merely sit below it. Its own comment records the first lag
43
+ (20 while the workflow carried 34); v1.15.0 was the second — four canon self-tests
44
+ landed and the floor stayed at 104 while the file carried 108. A floor below the count
45
+ cannot notice losing the difference, which is the entire job. Now guarded, and the
46
+ guard was watched rejecting a lowered floor.
47
+
48
+ ## v1.16.1 — 2026-08-06
49
+
50
+ ### Fixed — frontmatter that a regex called valid and a YAML parser silently dropped
51
+
52
+ `evidence-docs`'s description contained *"read as true: a decision record"*. A
53
+ colon-space inside a plain YAML scalar makes the value a nested mapping, so the official
54
+ plugin validator reported the skill **loads with empty metadata — every frontmatter field
55
+ silently dropped**, which for a skill means it never triggers. v1.16.0 published in that
56
+ state.
57
+
58
+ The guard that was supposed to catch it checked the frontmatter with a regular
59
+ expression and passed: a check proving less than it claims, shipped in the release that
60
+ publishes canon 6. It now rejects a plain scalar carrying a colon-space, across **every**
61
+ `SKILL.md` in the plugin rather than only the new one — the class, not the instance.
62
+ Guards 112 → 113.
63
+
3
64
  ## v1.16.0 — 2026-08-06
4
65
 
5
66
  ### Added — `evidence-docs`: a second skill in this plugin, and the router row it fills
package/CONTRIBUTING.md CHANGED
@@ -235,7 +235,21 @@ commands and all three signal states — with a state missing, a graph that coul
235
235
  be measured prints like a fresh one.
236
236
  *(guard: `never requires it — a run passes intake quoting a`)*
237
237
 
238
- **31. The evidence-docs navigator indexes the canons and never copies them.**
238
+ **31. A CI run's verdict is read, never assumed — and every stage that pushes says so.**
239
+ `references/conventions.md` → *The CI verdict* keeps the commands, the unauthenticated
240
+ fallback and all three states; stages 7, 8 and 9 cite it rather than carrying a second
241
+ copy. A workflow run that nobody reads is the fail-open hook with extra steps: this
242
+ repo's own `validate` was red on a push to `main` and on a release tag, the guard that
243
+ failed was correct, and nothing obliged anyone to look.
244
+ *(guard: `never names it — the run it triggers is closed on an unread verdict`)*
245
+
246
+ **32. The negatives floor equals the workflow's count.**
247
+ `MIN_EXPECTED` is a number in a living document (rule 8). Below the count it cannot
248
+ notice losing the difference — it lagged at 20 against 34 once, and at 104 against 108
249
+ in v1.15.0.
250
+ *(guard: `a floor below the count is a floor that cannot`)*
251
+
252
+ **33. The evidence-docs navigator indexes the canons and never copies them.**
239
253
  `skills/evidence-docs/SKILL.md` is a second skill in the same plugin: the ten canons as
240
254
  a one-line index, a pointer to their one home, and a table of where to go next. The
241
255
  guard holds the index to the doctrine's own list, requires the pointer, and resolves
@@ -243,8 +257,7 @@ every relative link **from the navigator's directory** — it sits one level ove
243
257
  everything it names, which is canon 4 in the file that publishes canon 4.
244
258
  *(guard: `index that has drifted from its doctrine`)*
245
259
 
246
- **32. Every invariant above names the guard that enforces it, and that guard exists.**
247
- This list claims to be *what the validator enforces*; it was eight guards behind when
260
+ **34. Every invariant above names the guard that enforces it, and that guard exists.**This list claims to be *what the validator enforces*; it was eight guards behind when
248
261
  an audit measured it. A claim of enforcement is now checked like any other claim.
249
262
  *(guard: `whose message does not appear in`)* — and a cited literal must lie inside
250
263
  a **single** string in `test/validate.py`: the check reads that file as text, so a
package/README.md CHANGED
@@ -66,7 +66,7 @@ Every gate is **typed**: `auto` — the orchestrator verifies it itself, pass/fa
66
66
  | 5 | Dev | tasks DONE (three review verdicts each), TDD green per task | auto |
67
67
  | 6 | Tests | full suite green, new code covered | auto |
68
68
  | 7 | Lint + deploy | lint clean + suite green before deploy | manual |
69
- | 8 | Post-deploy | clean boot / honest degradation | auto |
69
+ | 8 | Post-deploy | clean boot / honest degradation, **and the CI verdict read rather than assumed** | auto |
70
70
  | 9 | Docs + wiki | the propagation matrix walked and the documentation gate green with its ratchets printed; every stale source-ledger row updated; docs + wiki synced; the code graph refreshed and checked against the docs | auto |
71
71
  | 10 | **Acceptance** | every REQ accounted for with evidence; every check leaned on seen failing once; operator signs off; the retro written — pruned before anything was added, every lesson carrying its commit | manual |
72
72
 
@@ -213,6 +213,27 @@ obsidian-wiki setup --vault /path/to/your/vault
213
213
  It is a **recommendation, never a gate** — no stage blocks on a missing wiki, and
214
214
  nothing asks twice in one run.
215
215
 
216
+ ### The CI verdict — read the run, never assume it
217
+
218
+ A push either triggered a workflow run or it did not, and either way the run's own
219
+ reply is the only evidence. *"CI is green"* written without a command behind it prints
220
+ the same whether it looked or not.
221
+
222
+ This repository learned it the direct way: `validate` was `completed/failure` on a push
223
+ to `main` and on a release tag, the guard that failed was **correct** — a tag that was
224
+ not yet an ancestor of `main` — and nothing obliged anyone to read it. A guard nobody
225
+ reads is a fail-open hook with extra steps.
226
+
227
+ So stages 7, 8 and 9 — every stage of the flow that pushes — require the verdict to be
228
+ **read and quoted**: the conclusion with its run id, the failing step's log on anything
229
+ but success, and one of three states, including **`no run found`** said out loud,
230
+ because a project without CI is a legitimate state and not a green one. Two command
231
+ paths, authenticated and not, because a dead token must not end the check. It reports;
232
+ it does not block.
233
+
234
+ Method: [`conventions.md`](plugins/task-pipeline/skills/task-pipeline/references/conventions.md)
235
+ → *The CI verdict*.
236
+
216
237
  ### The code graph — reach, and a second opinion on your docs
217
238
 
218
239
  A grep finds a **name**. A graph finds **reach**: what actually calls this, what
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.16.0 |
15
+ | **Version** | 1.16.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. 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 (15 evals, 5 categories). **Never executed** — see [`evals/RESULTS.md`](evals/RESULTS.md) |
@@ -243,7 +243,17 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
243
243
  outward → explicit user go, or the specific standing authorization recorded in
244
244
  the stage-0 brief.
245
245
  8. **Post-deploy** (auto) — tail logs / health-check; clean boot or an honest
246
- degradation report (never silent success).
246
+ degradation report (never silent success). **Read the CI verdict, never assume
247
+ it** — `gh run list --branch <b> --limit 1 --json databaseId,name,status,conclusion,headSha`,
248
+ then `gh run view <id> --log-failed` on anything but success (unauthenticated
249
+ fallback: `curl -s https://api.github.com/repos/<owner>/<repo>/commits/<sha>/check-runs`).
250
+ Quote the conclusion with its run id, quote the failing step, and state one of
251
+ three states: concluded / in progress (wait and re-read — "it was still running"
252
+ is a report, not a verdict) / **no run found**, said out loud, because a project
253
+ without CI is a legitimate state and not a green one. Probe credentials with a
254
+ live call, never `gh auth status`, which answers from cache. This binds every
255
+ stage that pushes — 7, 8 and 9 — not just this one. It reports; it does not
256
+ block.
247
257
  9. **Docs + wiki** (auto) — **the phase-1 source ledger is the work list**: every
248
258
  source the harvest read gets updated if this run changed or disproved it. Module
249
259
  docs and runbooks in the SAME change; the knowledge wiki via `wiki-update` when
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeline-skill",
3
- "version": "1.16.0",
3
+ "version": "1.16.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"
@@ -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 must close with evidence, a loop guard that breaks churn, one provider-agnostic model confirmed up front, and an optional super-ux UX track for user-facing work.",
5
- "version": "1.16.0",
5
+ "version": "1.16.2",
6
6
  "author": {
7
7
  "name": "ssheleg",
8
8
  "url": "https://x.com/sshlg93"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: evidence-docs
3
- description: Applies the ten canons of evidence-backed documentation — what makes a claim documentation rather than an assertion — and routes to the doctrine that enforces each one. Use when writing or reviewing anything that will be read as true: a decision record, a README, an acceptance report, a runbook, a changelog entry, an audit finding, or any claim that something was verified. Also use when a project needs a documentation gate, a decision register, a propagation matrix, or a retrospective that outlives its author. Not for drafts, chat answers, commit messages or code comments.
3
+ description: Applies the ten canons of evidence-backed documentation — what makes a claim documentation rather than an assertion — and routes to the doctrine that enforces each one. Use when writing or reviewing anything that will be read as true a decision record, a README, an acceptance report, a runbook, a changelog entry, an audit finding, or any claim that something was verified. Also use when a project needs a documentation gate, a decision register, a propagation matrix, or a retrospective that outlives its author. Not for drafts, chat answers, commit messages or code comments.
4
4
  ---
5
5
 
6
6
  # Evidence-backed documentation
@@ -133,7 +133,7 @@
133
133
  ],
134
134
  "gate": {
135
135
  "type": "auto",
136
- "check": "clean boot confirmed (no error spike, live subsystems healthy), or an honest degradation report with next steps"
136
+ "check": "clean boot confirmed (no error spike, live subsystems healthy), or an honest degradation report with next steps. THE CI VERDICT IS READ, NEVER ASSUMED (references/conventions.md -> The CI verdict): the run's conclusion for this commit is quoted with its run id, the FAILING STEP'S LOG is quoted on anything but success, and one of three states is stated — concluded / in progress (wait and re-read; 'it was still running' is a report, not a verdict) / NO RUN FOUND, said out loud, because a project without CI is a legitimate state and not a green one. 'CI is green' written without a command behind it prints the same whether it looked or not (references/gates.md -> False success). Two command paths, because a credential problem must not end the check: 'gh run list --branch <b> --limit 1 --json databaseId,name,status,conclusion,headSha' then 'gh run view <id> --log-failed', or unauthenticated 'curl -s https://api.github.com/repos/<owner>/<repo>/commits/<sha>/check-runs'. Probe credentials with a live call, never with 'gh auth status', which answers from cache. It reports, it does not block."
137
137
  }
138
138
  },
139
139
  {
@@ -182,7 +182,7 @@
182
182
  "npm publish (task-pipeline-skill) — a second job in the same workflow, armed per repository by the PUBLISH_NPMJS variable (NPM_TOKEN granular automation token, or trusted publishing via OIDC); unarmed it falls back to a human 2FA step"
183
183
  ],
184
184
  "verify": [
185
- "CI green on the tagged commit",
185
+ "CI green on the tagged commit — READ, not assumed: the run's conclusion quoted with its run id, and the failing step's log quoted on anything but success (references/conventions.md -> The CI verdict)",
186
186
  "npx github:ssheleg/task-pipeline#<tag> from a clean cwd installs the skill + command",
187
187
  "after npm publish: npm view task-pipeline-skill version == <tag>"
188
188
  ]
@@ -8,6 +8,16 @@ names its doc repos, its knowledge base and its house rules
8
8
  Prefer explicit host instructions over detection; if a step's convention can't be
9
9
  found, surface it and **ask** rather than guessing.
10
10
 
11
+ ## Contents
12
+
13
+ - Lint + test
14
+ - Deploy / release
15
+ - Post-deploy logs
16
+ - The CI verdict — read the run, never assume it
17
+ - Docs + wiki
18
+ - Documentation regime (stage 0, then 9 and 10)
19
+ - Issue tracker (stage 10)
20
+
11
21
  ## Lint + test
12
22
  - `CLAUDE.md` usually names the commands. Else detect: `package.json` scripts
13
23
  (`npm test` / `npm run lint`), `pyproject.toml` / `ruff` (`ruff check`), `pytest`,
@@ -30,7 +40,61 @@ found, surface it and **ask** rather than guessing.
30
40
 
31
41
  ## Post-deploy logs
32
42
  - Heroku: `heroku logs -a <app>`. Docker / k8s: `docker logs` / `kubectl logs`.
33
- CI: the workflow run. Hit the health endpoint if one is defined.
43
+ Hit the health endpoint if one is defined. **CI: the workflow run — and a run is
44
+ checked by reading it, below.**
45
+
46
+ ## The CI verdict — read the run, never assume it
47
+
48
+ A push either triggered a run or it did not, and either way **the run's own reply is
49
+ the only evidence** ([`gates.md`](gates.md) → *False success*). "CI is green" written
50
+ without a command behind it is a sentence that prints the same whether it looked or
51
+ not.
52
+
53
+ This is not hypothetical. On 2026-08-06 this repository's `validate` was
54
+ `completed/failure` on a push to `main` and on a release tag. The failure was
55
+ **correct** — the *Every v\* tag must be contained in main* guard firing on a tag that
56
+ was not yet an ancestor — and nothing in this bundle obliged anyone to read it. A
57
+ guard nobody reads is a fail-open hook with extra steps.
58
+
59
+ ```bash
60
+ # authenticated
61
+ gh run list --branch <branch> --limit 1 \
62
+ --json databaseId,name,status,conclusion,headSha
63
+ gh run view <databaseId> --log-failed # only when conclusion != success
64
+ ```
65
+
66
+ ```bash
67
+ # unauthenticated fallback — public repo, no token needed
68
+ curl -s "https://api.github.com/repos/<owner>/<repo>/commits/<sha>/check-runs"
69
+ ```
70
+
71
+ **Two paths on purpose.** A credential problem must not end the check: this repo's
72
+ `gh` token expired mid-run the same night, and `gh auth status` reported it invalid
73
+ from a **cached** verdict while `gh api user` succeeded. Probe credentials with a
74
+ live call, never with the status command.
75
+
76
+ **Three states, and the third is why this is written down:**
77
+
78
+ | State | Condition | Record |
79
+ |---|---|---|
80
+ | **concluded** | a run exists for this sha, `status == completed` | the conclusion and run id — and on any non-`success`, the **quoted failing step** |
81
+ | **in progress** | a run exists, not finished | wait and re-read. *"It was still running when I looked"* is a report, not a verdict |
82
+ | **no run found** | no run for this sha | say so out loud — a project without CI is a legitimate state and **not a green one** ([`gates.md`](gates.md) → *Progressive arming*) |
83
+
84
+ **Read the log, not just the verdict.** A conclusion says *that* it failed; only the
85
+ log says *what*. In the incident above the log named the guard, the orphan tag and the
86
+ one-line fix — a bare "CI failed" would have handed the next reader a search the log
87
+ had already finished. On any non-`success`: read the failing step and quote the line
88
+ that names the failure.
89
+
90
+ **It reports; it does not block.** Same shape stage 8 already uses for deploy logs — a
91
+ red run the operator has seen and ruled on is a decision, a red run nobody printed is
92
+ the failure. Blocking would also make a project *without* CI cheaper to ship from than
93
+ one with it.
94
+
95
+ **Promote it when it breaks** ([`gates.md`](gates.md) → *Axis B*): this sits at rung 2,
96
+ a criterion in the stage gates. Promote it to a script the first time a run is observed
97
+ closing a stage with an unread CI verdict.
34
98
 
35
99
  ## Docs + wiki
36
100
  - **Start from the stage-0 source ledger** ([`knowledge-sources.md`](knowledge-sources.md)):
@@ -75,6 +75,7 @@ a row pointing outside the bundle is the defect this file exists to catch.
75
75
  | Which companions exist, what is required, self-currency | `references/companion-skills.md` |
76
76
  | The code graph: queries, refresh, the graph↔docs divergence | `references/knowledge-graph.md` |
77
77
  | How the graph's staleness is measured and stated in the ledger | `references/knowledge-graph.md` |
78
+ | How a CI run's verdict is established, and its three states | `references/conventions.md` |
78
79
  | Model policy — tier not id, ask once at preflight | `references/model-tiering.md` |
79
80
  | This boundary | `references/portability.md` |
80
81
 
@@ -345,14 +345,24 @@ never that the work was skipped quietly.
345
345
  `partial` ships only with the operator's explicit acceptance. A gap is cheapest to
346
346
  close before it ships, and the operator is already present at this gate. **The
347
347
  carry-over count is printed beside this verdict.** Deploy is outward → explicit
348
- operator go. Respect deploy-from-main rules if the project mandates them.
348
+ operator go. Respect deploy-from-main rules if the project mandates them. **Before
349
+ tagging, the CI verdict for what was just pushed is READ, not assumed**
350
+ ([`conventions.md`](conventions.md) → *The CI verdict*) — a tag on a commit whose
351
+ run nobody read is how a red `main` ships.
349
352
 
350
353
  ## 8 — Post-deploy
351
354
  - **Freedom: medium** — where the logs live varies; 'clean boot or an honest degradation report' does not ([`gates.md`](gates.md) → *Axis C*).
352
355
  - Tail deploy logs / health-check per conventions. Confirm clean boot, no error
353
356
  spike, live subsystems healthy.
357
+ - **Read the CI verdict for the deploy's own commit** ([`conventions.md`](conventions.md)
358
+ → *The CI verdict*): the run's conclusion quoted, the **failing step's log quoted**
359
+ on anything but `success`, and one of the three states stated — including **`no run
360
+ found`**, out loud, because a project without CI is a legitimate state and not a
361
+ green one.
354
362
  - **GATE (auto):** clean boot confirmed, or an **honest degradation report** with next
355
- steps — never silent success.
363
+ steps — never silent success. **The CI verdict is one of the reported facts, with
364
+ its run id** — "CI is green" written without a command behind it prints the same
365
+ whether it looked or not ([`gates.md`](gates.md) → *False success*).
356
366
 
357
367
  ## 9 — Docs + wiki
358
368
  - **Freedom: low** — the matrix walk and the gate are mechanical; what a doc says is not this stage's call ([`gates.md`](gates.md) → *Axis C*).
@@ -405,7 +415,10 @@ never that the work was skipped quietly.
405
415
  written and reconciled**; UI: super-ux layers current + linter green; wiki synced
406
416
  (or absent and recommended once); **the code graph
407
417
  refreshed where one exists, or the reason it wasn't written into the carry-over
408
- ledger** (absent and recommended once is fine); dangling links fixed; **the
418
+ ledger** (absent and recommended once is fine); dangling links fixed; **the CI
419
+ verdict read for this stage's own push** ([`conventions.md`](conventions.md) →
420
+ *The CI verdict*) — this stage pushes like any other and is the one that habitually
421
+ ends a run, so an unread red here is a red `main` nobody is coming back to; **the
409
422
  carry-over count printed beside this verdict**.
410
423
 
411
424
  ## 10 — Acceptance