task-pipeline-skill 1.46.0 → 1.47.1
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 +85 -0
- package/HOW-IT-WORKS.md +30 -3
- package/SKILL-CARD.md +1 -1
- package/package.json +1 -1
- package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
- package/plugins/task-pipeline/skills/evidence-docs/SKILL.md +1 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/documentation.md +13 -6
- package/plugins/task-pipeline/skills/task-pipeline/references/tdd.md +46 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,90 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v1.47.1 — the fixes a reader found, which three releases shipped without
|
|
4
|
+
|
|
5
|
+
v1.46.0 was tagged and published from a commit that carried this branch's doctrine and
|
|
6
|
+
none of the three commits answering the reviewer. The defects below were already found
|
|
7
|
+
and already fixed when the release went out; this is them arriving.
|
|
8
|
+
|
|
9
|
+
**`docs/DOCMAP.md` forbade the register shipping beside it.** It said, in as many words,
|
|
10
|
+
that no `docs/DECISIONS.md` is created here deliberately — and the release shipped that
|
|
11
|
+
file. The old rule was right about the risk and wrong about the mechanism: `OQ-####`
|
|
12
|
+
closes with `Resolved→DEC-####`, and a CHANGELOG version heading cannot be that target,
|
|
13
|
+
because two decisions in one release collapse to a single pointer. SSOT is kept by
|
|
14
|
+
direction now — the reason lives in `DECISIONS.md`, the CHANGELOG points at the id. The
|
|
15
|
+
reversal is `DEC-0003`, because a register that appears without a decision is exactly
|
|
16
|
+
the fork the old rule feared.
|
|
17
|
+
|
|
18
|
+
**`HOW-IT-WORKS.md` called itself the version it was written under.** Its first line
|
|
19
|
+
promises a rewrite every release and names the banner as the freshness signal; the
|
|
20
|
+
banner read 1.45.0 while every other surface read 1.46.0. Corrected, and the two
|
|
21
|
+
releases that landed from another session are named for what they were, so the gap in
|
|
22
|
+
the version history is explained rather than silent.
|
|
23
|
+
|
|
24
|
+
**An absolute rule keeps every keyword while an appended clause reverses it.** This
|
|
25
|
+
release found that class, guarded it on stage 10's criterion 13, and left `residue.md`'s
|
|
26
|
+
two absolute rules on plain substring presence — *"never released by this run, unless it
|
|
27
|
+
has clearly expired"* passed. Sweeping the fix to its siblings then produced the reason
|
|
28
|
+
to sweep it structurally: the second copy of the carve-out pattern had its escaping
|
|
29
|
+
doubled, so it matched a literal backslash and walked past every inversion while looking
|
|
30
|
+
correct. One home now — `_EXCEPTION_MARKER` and the `_carve_out` helper that reads it —
|
|
31
|
+
with two call sites.
|
|
32
|
+
|
|
33
|
+
**A probe demanded a dependency the harness disclaims.** `res8` required PyYAML to be
|
|
34
|
+
installed; the guard it tests degrades honestly without it. `test:all` was red on any
|
|
35
|
+
machine lacking it. Three branches now: the guard fired, the guard said it could not
|
|
36
|
+
look, or neither — and only the third is an error.
|
|
37
|
+
|
|
38
|
+
Also: the owner-row check went through `_row_cells` instead of a hand-rolled regex, as
|
|
39
|
+
that helper's own docstring asks; and a reflow that fixed a 157-character line had
|
|
40
|
+
orphaned two words onto a five-character one.
|
|
41
|
+
|
|
42
|
+
Guards: 291 → **294**.
|
|
43
|
+
|
|
44
|
+
## v1.47.0 — a green suite that cannot speak for an agent
|
|
45
|
+
|
|
46
|
+
The suite gate at stage 6 assumes the thing under test is deterministic: run it twice,
|
|
47
|
+
get the same answer, and a pass means something. An agent breaks that assumption, and
|
|
48
|
+
until now this pipeline had nothing to say about it — a grep across the plugin for
|
|
49
|
+
`llm-as-judge`, `eval suite`, `regression fixture` and `trace id` returned nothing.
|
|
50
|
+
|
|
51
|
+
**`tdd.md` gains *When the thing under test is an agent*.** The artifact under test is
|
|
52
|
+
the execution record, not the source: the code says what the agent is allowed to do,
|
|
53
|
+
only a run says what it did. Three tiers with unequal authority at the gate — step and
|
|
54
|
+
turn **block**, thread **reports** — plus the two rules an ordinary suite never needs.
|
|
55
|
+
**Assert the side effect, not the sentence**, because an agent that says it saved the
|
|
56
|
+
preference and did not passes trajectory and response and is broken. And **a model
|
|
57
|
+
judging a model is not a check until it has been calibrated** against human labels on
|
|
58
|
+
cases known to be bad. The suite is grown from production failures, minimised, and kept
|
|
59
|
+
permanently — a fixed defect that silently returns is the whole reason.
|
|
60
|
+
|
|
61
|
+
The gate states what it does **not** cover, as canon 6 requires: an offline suite speaks
|
|
62
|
+
for the cases already known and for nothing else, which is why production observation
|
|
63
|
+
stays a stage-8 concern.
|
|
64
|
+
|
|
65
|
+
**Three canons extended rather than an eleventh added.** Canon 3 says every fact has one
|
|
66
|
+
home, so the agent case belongs inside the canons it is an instance of, not beside them:
|
|
67
|
+
|
|
68
|
+
- **Canon 1** — where the subject is non-deterministic, the address is a **trace id and
|
|
69
|
+
the assertion that ran against it**; a rerun is not the same run.
|
|
70
|
+
- **Canon 5** — a model used as a judge is the same object as a check: until it has been
|
|
71
|
+
seen disagreeing with a human on a known-bad case, its pass is an opinion with a
|
|
72
|
+
number attached.
|
|
73
|
+
- **Canon 8** — a score produced by a model is an estimate in every report that quotes
|
|
74
|
+
it, however many decimal places it carries.
|
|
75
|
+
|
|
76
|
+
**`evidence-docs` gains one routing row** and no doctrine — it is a navigator. The row
|
|
77
|
+
names its target instead of linking it: this navigator already carries eleven
|
|
78
|
+
out-of-directory links that break wherever a packager ships the skill alone, and a
|
|
79
|
+
twelfth would widen a known defect. Stated rather than fixed, and the count is unchanged
|
|
80
|
+
at eleven — measured before and after, not assumed.
|
|
81
|
+
|
|
82
|
+
`Guards: 291 → 291`. This release adds doctrine, not enforcement: nothing here is
|
|
83
|
+
machine-checkable yet, and the count says so rather than leaving a reader to infer it.
|
|
84
|
+
The gate written into `tdd.md` is a specification a host project runs against its own
|
|
85
|
+
agent — this repository has no agent to run it against, so arming it here would be a
|
|
86
|
+
check with nothing to look at, which `gates.md` calls dormant and forbids passing.
|
|
87
|
+
|
|
3
88
|
## v1.46.0 — what a run leaves running, what "done" costs to say, and what a check is for
|
|
4
89
|
|
|
5
90
|
Three rules this pipeline had been following by disposition rather than by doctrine,
|
package/HOW-IT-WORKS.md
CHANGED
|
@@ -5,7 +5,7 @@ explains the machine — what routes a request into it, what each stage refuses
|
|
|
5
5
|
let past, and what makes any claim it prints believable. The README sells it and
|
|
6
6
|
tells you how to install it; this file tells you how it thinks.
|
|
7
7
|
|
|
8
|
-
> **Version 1.
|
|
8
|
+
> **Version 1.47.1.** The "What changed" section at the bottom carries the last
|
|
9
9
|
> few releases. Everything above it describes the pipeline as it is *now*, not as
|
|
10
10
|
> it was designed.
|
|
11
11
|
|
|
@@ -238,7 +238,7 @@ This is the part most pipelines skip, and it is the reason this one is trustwort
|
|
|
238
238
|
rather than merely tidy.
|
|
239
239
|
|
|
240
240
|
**Every guard is proven against a planted defect.** `npm run test:all` breaks the
|
|
241
|
-
thing each of the **
|
|
241
|
+
thing each of the **294** checks is about, and requires that check to reject it. A
|
|
242
242
|
guard that has never been watched failing is not a guard; it is a comment.
|
|
243
243
|
|
|
244
244
|
**The neighbour probe.** A check has a *subject* — the rule it is about — and
|
|
@@ -291,7 +291,28 @@ a run diverges → retro entry → retro.publish → upstream issue
|
|
|
291
291
|
|
|
292
292
|
## What changed, by version
|
|
293
293
|
|
|
294
|
-
### v1.
|
|
294
|
+
### v1.47.1 — the fixes a reader found, which three releases shipped without
|
|
295
|
+
Three releases went out from another session while this branch was reviewed, and
|
|
296
|
+
each carried the same defects forward: the doc map forbidding the decisions register
|
|
297
|
+
shipping beside it, this file naming a version two releases stale, two absolute rules
|
|
298
|
+
invertible by an appended clause, a probe demanding PyYAML the harness disclaims, and
|
|
299
|
+
a probe that stopped reproducing its own hazard when its target string was quoted —
|
|
300
|
+
which leaves `main`'s own suite red. Every one was found and fixed before the first
|
|
301
|
+
of those releases; this is them arriving.
|
|
302
|
+
|
|
303
|
+
### v1.47.0 / v1.46.0 — shipped from another session
|
|
304
|
+
A green suite that cannot speak for an agent; and this branch's residue, completion
|
|
305
|
+
honesty, proportionate verification and improvement-iteration doctrine, which reached
|
|
306
|
+
main through the merge commit rather than through this branch's own release.
|
|
307
|
+
|
|
308
|
+
v1.46.0 was tagged from a commit carrying this branch's doctrine and none of the
|
|
309
|
+
three commits answering its reviewer. The doc map forbade the decisions register
|
|
310
|
+
shipping beside it; this file called itself the version it was written under; two
|
|
311
|
+
absolute rules were guarded by substring alone and inverted by an appended clause;
|
|
312
|
+
and a probe demanded PyYAML the harness disclaims. All four were found and fixed
|
|
313
|
+
before the release went out, and arrived after it.
|
|
314
|
+
|
|
315
|
+
### v1.46.0 — what a run leaves running, what "done" costs to say, what a check is for
|
|
295
316
|
Four rules the pipeline had been following by disposition rather than by doctrine.
|
|
296
317
|
**Residue**: eight classes of thing a run leaves running or leaves behind, enumerated
|
|
297
318
|
by class and never by one tool — the case that produced it was a task inventory
|
|
@@ -304,6 +325,12 @@ the deliverable is the working result and the check is how you know — scaled t
|
|
|
304
325
|
issue resolves when behaviour changed and its close names the address; unworked ones
|
|
305
326
|
accumulate visibly rather than being triaged into silence. Guards: 275 → 291.
|
|
306
327
|
|
|
328
|
+
### v1.45.1 / v1.45.0 — shipped from another session while this branch was paused
|
|
329
|
+
The reference routing existed three times over and was cut to one home; the guard
|
|
330
|
+
count the self-test plants into was restored. Neither is this branch's work — they
|
|
331
|
+
are here because they hold the version numbers this branch was originally built
|
|
332
|
+
under, which is why it ships as 1.46.0.
|
|
333
|
+
|
|
307
334
|
### v1.44.0 — six lessons from other projects, and the guards that hold them
|
|
308
335
|
Six issues published by runs in other repositories were worked into doctrine:
|
|
309
336
|
seam testing at stage 6, `verified by` names that must resolve, a probe's green
|
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.47.1 |
|
|
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` |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-pipeline-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.47.1",
|
|
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.
|
|
5
|
+
"version": "1.47.1",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "ssheleg",
|
|
8
8
|
"url": "https://x.com/sshlg93"
|
|
@@ -45,6 +45,7 @@ thing, the canon is the *why* and the rule is the *how*.
|
|
|
45
45
|
| audit documentation a project already has | [`setup.md`](../task-pipeline/references/setup.md) | seven passes, cheapest first, output is a fix plan |
|
|
46
46
|
| carry a lesson to the next run | [`retrospective.md`](../task-pipeline/references/retrospective.md) | stamp first (the cold trigger reads it), then prune to a cap of ten; every lesson names its commit |
|
|
47
47
|
| seed a gate into a host project | [`templates/docgate.sh`](../task-pipeline/templates/docgate.sh) | it seeds **green**: dormant where there is no input yet |
|
|
48
|
+
| claim that an **agent** behaves | `tdd.md` → *When the thing under test is an agent* — named rather than linked, because this navigator's out-of-directory links break wherever a packager ships this skill alone | the address is a trace id and the assertion that ran (canon 1); a judge nobody watched disagree is a green nobody watched turn red (canon 5) |
|
|
48
49
|
| take a whole change through to acceptance | [`task-pipeline`](../task-pipeline/SKILL.md) | this skill is the standard; that one is how a change reaches the repository |
|
|
49
50
|
|
|
50
51
|
## When this applies
|
|
@@ -42,8 +42,11 @@ exists to prevent.
|
|
|
42
42
|
**1. A claim carries its address.** Every fact that lands in a document names where it
|
|
43
43
|
can be checked: `file:line`, a command with its output, a test name. A lesson names the
|
|
44
44
|
commit that earned it. *"We verified it" is the sentence that passes every review and
|
|
45
|
-
proves nothing.*
|
|
46
|
-
|
|
45
|
+
proves nothing.* Where the subject is non-deterministic — an agent, a model call — the
|
|
46
|
+
address is **a trace id and the assertion that ran against it**, because a rerun is not
|
|
47
|
+
the same run and a description of the behaviour is not the behaviour. → the retro's
|
|
48
|
+
SHA-resolution guard; the finding shape in [`setup.md`](setup.md); [`tdd.md`](tdd.md) →
|
|
49
|
+
*When the thing under test is an agent*.
|
|
47
50
|
|
|
48
51
|
**2. Numbers are computed, never restated.** A count in prose is a number that was true
|
|
49
52
|
once. Derive it at check time and compare the stated one against the computed one as the
|
|
@@ -60,8 +63,11 @@ under every link checker, because the checker resolves from the file's home. →
|
|
|
60
63
|
|
|
61
64
|
**5. Green nobody watched turn red is not evidence.** A check must be seen rejecting a
|
|
62
65
|
planted defect before its pass means anything — and the plant must be proven to have
|
|
63
|
-
landed in the text the check actually parses.
|
|
64
|
-
|
|
66
|
+
landed in the text the check actually parses. **A model used as a judge is the same
|
|
67
|
+
object**: until it has been seen disagreeing with a human label on a case known to be
|
|
68
|
+
bad, its pass is an opinion with a number attached. → [`gates.md`](gates.md) →
|
|
69
|
+
*Probing*; [`learned.md`](learned.md) rules 4 and 5; [`tdd.md`](tdd.md) → *When the
|
|
70
|
+
thing under test is an agent*.
|
|
65
71
|
|
|
66
72
|
**6. A check proves its scope and nothing beyond it.** Every gate carries what it does
|
|
67
73
|
**not** cover, and quoting it wider is how "the gate is green" becomes a false statement
|
|
@@ -74,8 +80,9 @@ wrong, it is not evidence. → [`gates.md`](gates.md) → *False success*.
|
|
|
74
80
|
|
|
75
81
|
**8. An estimate is never announced as a measurement.** A rule that fires on a judgement
|
|
76
82
|
states its **evidence condition** — the observable signal that licenses it. A false
|
|
77
|
-
alarm does not cost one interruption; it costs the alarm.
|
|
78
|
-
|
|
83
|
+
alarm does not cost one interruption; it costs the alarm. A score produced by a model
|
|
84
|
+
is an estimate and stays one in every report that quotes it, however many decimal places
|
|
85
|
+
it carries. → [`continuity.md`](continuity.md) → *The context budget*.
|
|
79
86
|
|
|
80
87
|
**9. What was not checked is printed beside what was.** Absence is a finding with one
|
|
81
88
|
side, so it never surfaces by comparison. Carry it as a named, counted set next to every
|
|
@@ -14,6 +14,7 @@ into this skill; nothing to install.
|
|
|
14
14
|
- The green from residue
|
|
15
15
|
- Tests that stay honest
|
|
16
16
|
- Stage 6 — consolidation and the suite gate
|
|
17
|
+
- When the thing under test is an agent
|
|
17
18
|
- When stuck
|
|
18
19
|
- What a case consumes, and why a timeout is unclassified
|
|
19
20
|
- Rationalizations
|
|
@@ -125,6 +126,51 @@ changed code is covered. No `skip` / `xfail` / commented-out assertion smuggles
|
|
|
125
126
|
red suite past the gate. A partial or red run never advances to deploy; report it
|
|
126
127
|
honestly instead.
|
|
127
128
|
|
|
129
|
+
## When the thing under test is an agent
|
|
130
|
+
|
|
131
|
+
An agent's behaviour is not in its source. The code says what it is *allowed* to do;
|
|
132
|
+
only a run says what it did. So the artifact under test is the **execution record**, and
|
|
133
|
+
the suite above needs one more tier before *green* means anything.
|
|
134
|
+
|
|
135
|
+
Three tiers, and they do not carry equal authority at the gate:
|
|
136
|
+
|
|
137
|
+
| Tier | Fixture | Asserts | At the gate |
|
|
138
|
+
|---|---|---|---|
|
|
139
|
+
| **Step** | one serialized model call with its prompt, tools and context | the decision — tool chosen, argument shape | **blocks** |
|
|
140
|
+
| **Turn** | one whole execution | the trajectory, the final response, **and the state change** | **blocks** |
|
|
141
|
+
| **Thread** | a scripted multi-turn session | what carried across turns, checked after **every** turn, failing fast | **reports** |
|
|
142
|
+
|
|
143
|
+
Two rules the ordinary suite does not need:
|
|
144
|
+
|
|
145
|
+
- **Assert the side effect, not the sentence.** An agent that says it saved the
|
|
146
|
+
preference and did not passes trajectory and response and is broken. The memory row,
|
|
147
|
+
the written file, the created record — inspect the thing, not the prose about it.
|
|
148
|
+
- **A model judging a model is not a check until it has been calibrated.** Label the
|
|
149
|
+
same traces by hand, measure the agreement, and only then let it score unattended.
|
|
150
|
+
This is canon 5 with a different subject: a judge nobody has watched disagree is a
|
|
151
|
+
green nobody has watched turn red. Cheap deterministic checks — schema, exact match,
|
|
152
|
+
business rule, tool-call correctness — run first and take everything they can decide,
|
|
153
|
+
because they cost nothing and cannot drift.
|
|
154
|
+
|
|
155
|
+
**The suite is grown, never authored.** Every production failure and every thumbs-down
|
|
156
|
+
is minimised to the smallest input that still reproduces it, filed into the tier that
|
|
157
|
+
isolates it, and **kept there permanently** — a fixed defect that silently returns is
|
|
158
|
+
the whole reason this rule exists.
|
|
159
|
+
|
|
160
|
+
**GATE (auto):** step and turn tiers green, and every fixture added by this change
|
|
161
|
+
present in the suite. Thread results and any online, reference-free checks are
|
|
162
|
+
**reported beside the verdict, not folded into it** — canon 9, which is why a
|
|
163
|
+
non-blocking tier still has to print.
|
|
164
|
+
|
|
165
|
+
**What this gate does not cover:** anything the fixtures do not contain. An offline
|
|
166
|
+
suite proves you did not regress the cases already known; it cannot speak for inputs
|
|
167
|
+
nobody has seen, which is canon 6 and the reason production observation is a stage-8
|
|
168
|
+
concern rather than a stage-6 one.
|
|
169
|
+
|
|
170
|
+
For building the suite this gate reads — the primitives, the tiers, judge design,
|
|
171
|
+
annotation queues and simulated users — see the `agent-evals` skill in the
|
|
172
|
+
`agent-stack` plugin.
|
|
173
|
+
|
|
128
174
|
## When stuck
|
|
129
175
|
|
|
130
176
|
| Problem | What it means |
|