task-pipeline-skill 1.96.0 → 1.98.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 +90 -0
- package/HOW-IT-WORKS.md +17 -13
- package/README.md +23 -17
- package/SKILL-CARD.md +2 -2
- package/cursor/rules/task-pipeline.mdc +33 -21
- package/evals/task-pipeline.evals.json +3 -3
- package/package.json +1 -1
- package/plugins/task-pipeline/.claude-plugin/plugin.json +2 -2
- package/plugins/task-pipeline/commands/task-pipeline.md +14 -219
- package/plugins/task-pipeline/skills/evidence-docs/SKILL.md +8 -1
- package/plugins/task-pipeline/skills/evidence-docs/references/GENERATED.md +1 -1
- package/plugins/task-pipeline/skills/evidence-docs/references/learned.md +24 -1
- package/plugins/task-pipeline/skills/evidence-docs/references/retrospective.md +21 -576
- package/plugins/task-pipeline/skills/project-audit/SKILL.md +8 -1
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +162 -230
- package/plugins/task-pipeline/skills/task-pipeline/graph.schema.json +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.example.json +9 -9
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json +10 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +2 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +3 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/browser.md +48 -11
- package/plugins/task-pipeline/skills/task-pipeline/references/build.md +7 -7
- package/plugins/task-pipeline/skills/task-pipeline/references/certification.md +49 -44
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +32 -24
- package/plugins/task-pipeline/skills/task-pipeline/references/doctrine-map.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/finish-line.md +13 -8
- package/plugins/task-pipeline/skills/task-pipeline/references/iteration.md +20 -23
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +5 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +24 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +17 -7
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +47 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +5 -4
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-00-intake.md +39 -25
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-05-dev.md +3 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-08-post-deploy.md +3 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +34 -22
- package/plugins/task-pipeline/skills/task-pipeline/references/tdd.md +3 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/waves.md +6 -4
- package/plugins/task-pipeline/skills/task-pipeline/scripts/graph.py +77 -21
- package/plugins/task-pipeline/skills/task-pipeline/scripts/retro_budget.py +305 -0
- package/plugins/task-pipeline/skills/task-pipeline/scripts/short_path.py +70 -0
- package/plugins/task-pipeline/skills/task-pipeline/scripts/waves.py +22 -10
- package/plugins/task-pipeline/skills/task-pipeline/templates/browser-claims.json +5 -5
- package/plugins/task-pipeline/skills/task-pipeline/templates/canvas.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/templates/retro-archive.md +9 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/retro.md +10 -1
|
@@ -2,225 +2,20 @@
|
|
|
2
2
|
description: "Run a task through task-pipeline's gated stages (intake grill → docs → brainstorm → spec → plan → build → tests → deploy → post-deploy → docs/wiki → acceptance). Also: `waves` — close the whole board in waves; `iteration` — the release loop around the waves; `setup` — audit the docs you already have; `checkup` — what has shipped unverified, with no task running."
|
|
3
3
|
argument-hint: "<one-line task> | waves | iteration | setup | checkup"
|
|
4
4
|
---
|
|
5
|
-
Run the task below through `task-pipeline`
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
Run the task below through the `task-pipeline` skill. **Read its `SKILL.md` and follow
|
|
6
|
+
it**; this page is a pointer, not a second copy of the run order (until 1.98.0 it was a
|
|
7
|
+
13 KB restatement read on top of `SKILL.md` before any work).
|
|
8
8
|
|
|
9
9
|
Task: $ARGUMENTS
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
**
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## Preflight — settle these once
|
|
25
|
-
|
|
26
|
-
**Print this line once, before the first question:**
|
|
27
|
-
|
|
28
|
-
> Running **Proof of Done** — every claim this run makes will carry the command,
|
|
29
|
-
> the file or the test that proves it.
|
|
30
|
-
|
|
31
|
-
It is one line and it is not decoration: it tells the operator, before anything is
|
|
32
|
-
decided, which standard they are about to hold the output to. A run that opens by
|
|
33
|
-
naming the standard is one an operator can call out for missing it.
|
|
34
|
-
|
|
35
|
-
- **Model.** Recommend the most capable one the environment offers, never a hardcoded
|
|
36
|
-
id. Confirmed once, then the whole run uses it without re-asking.
|
|
37
|
-
- **Companions.** Print the detection block once (`references/companion-skills.md`).
|
|
38
|
-
Absent ones state their fallback and name any unavailable check as NOT_RUN.
|
|
39
|
-
On user-facing tasks stage 3 gates the valid scenario artifact, not package
|
|
40
|
-
presence; use the provider rule in that reference.
|
|
41
|
-
|
|
42
|
-
## Stage 0 — the harvest, then the grill
|
|
43
|
-
|
|
44
|
-
**The harvest runs before the first question** (`references/knowledge-sources.md`).
|
|
45
|
-
Pull what the project already knows about *this task*:
|
|
46
|
-
|
|
47
|
-
- the code, and **the code graph** where one is built — [graphify](https://github.com/Graphify-Labs/graphify),
|
|
48
|
-
`references/knowledge-graph.md`; recommended, never required; detect
|
|
49
|
-
`graphify-out/graph.json`. It answers **reach** — what calls this, what breaks if it
|
|
50
|
-
moves — which grep cannot.
|
|
51
|
-
- `CLAUDE.md`, `CONTEXT.md`/ADRs, `docs/` + `docs/ux/`, past briefs and carry-over ledgers.
|
|
52
|
-
- **the retro's standing instructions and run stamps** — `docs/evidence/retro.md`,
|
|
53
|
-
read in full; both are bounded and they bind this run. Its **Recent log** is
|
|
54
|
-
*queried* by the task's nouns, not read: nothing caps it, and an uncapped section
|
|
55
|
-
inside a binding source is what makes the capped part get skimmed
|
|
56
|
-
(`references/retrospective.md`).
|
|
57
|
-
- the **knowledge wiki** if installed ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki);
|
|
58
|
-
detect `~/.obsidian-wiki/config`), and any other doc system the project names as its docs.
|
|
59
|
-
- **the board** (`docs/evidence/backlog.md`) — open count quoted in the brief, or
|
|
60
|
-
seeded when absent. **the verification ledger** (`docs/evidence/verification.md`) —
|
|
61
|
-
how many rows sit at `never`.
|
|
62
|
-
|
|
63
|
-
Write the **source ledger** into the brief: a row per source, or an explicit *none found*.
|
|
64
|
-
|
|
65
|
-
**Then the grill, and it is mandatory** (`references/grill.md`). Close what the sources
|
|
66
|
-
can, then ask the material unknowns in ONE batch, ordered by dependency, each with a
|
|
67
|
-
recommended answer — one at a time only where answers depend on each other or the
|
|
68
|
-
operator asks — until every decision branch is resolved.
|
|
69
|
-
|
|
70
|
-
- **Validate every answer against the harvested sources.** The operator outranks any
|
|
71
|
-
document — but only out loud, and a doc the run proves stale is logged for stage 9.
|
|
72
|
-
- **Domain awareness:** challenge terms against `CONTEXT.md`, sharpen fuzzy language,
|
|
73
|
-
write an ADR for a hard-to-reverse call.
|
|
74
|
-
- **The autonomy sweep** pre-resolves what would otherwise stop stages 1→10: doc
|
|
75
|
-
sources, wiki and graph, branch and tracker policy, test and lint commands, deploy
|
|
76
|
-
target and authorization, log locations.
|
|
77
|
-
- **UI tasks add the design surface.** Is the design done visually in Figma or
|
|
78
|
-
text-only? Is the Figma MCP connected? If not — ship text-only, or stop and connect
|
|
79
|
-
it? The UX chain degrades on its own and never blocks, so this choice must be
|
|
80
|
-
recorded rather than discovered.
|
|
81
|
-
- **With Figma on, the destination is named before the first frame:** which team/org,
|
|
82
|
-
which file — the recorded one, a URL the operator gives, or creation in that named
|
|
83
|
-
team explicitly authorized. A destination decided at drawing time is how a project
|
|
84
|
-
ends up with three design files and no way to tell which is real. **Never create
|
|
85
|
-
while a recorded file resolves; if it does not resolve, stop and ask — never create a
|
|
86
|
-
replacement.**
|
|
87
|
-
|
|
88
|
-
**The brief closes on the REQ table** — the request as an addressable list where every
|
|
89
|
-
row names how it is verified. Frozen: adding is free, removing needs the operator.
|
|
90
|
-
Anything deferred enters the carry-over ledger the moment it is said.
|
|
91
|
-
|
|
92
|
-
## Stages 1→10 — the flow
|
|
93
|
-
|
|
94
|
-
| | Stage | The thing that must be true to leave it |
|
|
95
|
-
|---|---|---|
|
|
96
|
-
| 1 | Docs study | every contract the design will lock is grounded on fetched docs, not recall |
|
|
97
|
-
| 2 | Brainstorm + decompose | the design is approved and every REQ is answered by it. **A platform is cut into modules** (`references/decomposition.md`) — map committed, walking skeleton first, every REQ in exactly one module; stages 3→10 then run per module |
|
|
98
|
-
| 3 | Spec | contracts locked; user-facing work runs three tracks — what it **does** (super-ux), how it **sounds** (`copywriting`), how it **looks** (`sheleg-design`); a declined track is recorded, never silent |
|
|
99
|
-
| 4 | Plan | the REQ set-comparison holds: brief REQs == union of `Implements:` |
|
|
100
|
-
| 5 | Build | TDD per task, a review after each, findings fixed or parked with a ruling |
|
|
101
|
-
| 6 | Tests | the **full** suite green; a web surface checked in a browser, not in the diff |
|
|
102
|
-
| 7 | Lint + deploy | outward: the authorization is specific, and the CI verdict is **read** before any tag |
|
|
103
|
-
| 8 | Post-deploy | the verification trio, not one of three; a verification row per shipped REQ |
|
|
104
|
-
| 9 | Docs + wiki | **three artifacts, not two** — module docs, the wiki, **and the code graph** |
|
|
105
|
-
| 10 | Acceptance | the ladder walk first, then the table, then the retrospective |
|
|
106
|
-
|
|
107
|
-
**Honor every gate by its type**: `auto` — verify the check yourself; `judgment` —
|
|
108
|
-
record the named judge's ruling as judgement, never as a measurement; `manual` — cite
|
|
109
|
-
an explicit go or specific standing authorization naming the act, otherwise wait.
|
|
110
|
-
|
|
111
|
-
## Cross-cutting — the three that fire at any stage
|
|
112
|
-
|
|
113
|
-
**The loop guard** (`references/loop-guard.md`). If a pass starts undoing an earlier one
|
|
114
|
-
— the same file edited twice for the same reason, a closed finding returning, a third
|
|
115
|
-
entry into one stage — stop editing. Name both shapes, escalate to the layer that owns
|
|
116
|
-
the conflict, re-plan the check as an ordered list, then go item by item. The review
|
|
117
|
-
loop has its own ceiling, and at it the run **measures** rather than stops.
|
|
118
|
-
|
|
119
|
-
**The audit's exit** (`references/audit.md`). If a searching pass starts finding mostly
|
|
120
|
-
what the previous pass's own fixes broke, the axis is exhausted — rotate it, do not look
|
|
121
|
-
harder.
|
|
122
|
-
|
|
123
|
-
**Evidence.** A green from a check nobody has watched fail against a planted defect is
|
|
124
|
-
not evidence. A finding class seen twice becomes a script, not a third ledger row.
|
|
125
|
-
|
|
126
|
-
## Stage 9 — the graph is the third artifact
|
|
127
|
-
|
|
128
|
-
Refresh it (`/graphify . --update` where `graphify-out/` exists), then **check it against
|
|
129
|
-
the docs**: a hub `graphify god-nodes` reports that no document names is an undocumented
|
|
130
|
-
seam; an edge the docs deny is a leak in the code or a lie in the docs; a doc naming a
|
|
131
|
-
module the graph no longer has is stale. Doc-side findings are fixed here; absences
|
|
132
|
-
become REQ rows at stage 10.
|
|
133
|
-
|
|
134
|
-
A stale graph is a false premise **carrying the authority of a machine** — a wrong doc
|
|
135
|
-
gets argued with, a wrong graph gets believed.
|
|
136
|
-
|
|
137
|
-
## Stage 10 — the close-out, in order
|
|
138
|
-
|
|
139
|
-
1. **The ladder walk, first.** The REQ table finds what was named and lost; it cannot
|
|
140
|
-
find what was never named, because a comparison needs two sides and an absence has
|
|
141
|
-
one. Walk each REQ bottom-up — decision → spec section → contract *and its failure
|
|
142
|
-
behavior* → task → change → executed test → surface/docs — check the seam at each
|
|
143
|
-
step, and order findings **by seam, not by file**. Every absence becomes a new REQ
|
|
144
|
-
row **before** the coverage table is written.
|
|
145
|
-
2. **The table**, one row per REQ, each with evidence.
|
|
146
|
-
3. **The ledgers close.** Every carry-over row still `open`, `unresolved` or homed
|
|
147
|
-
`backlog` leaves with a board id, and the board's priorities are re-derived. The
|
|
148
|
-
counts print beside every gate verdict, so *green* never reads as *verified*.
|
|
149
|
-
4. **Several repositories? The parent closes too.** A parent records each submodule as a
|
|
150
|
-
pointer to one commit, and moving the submodule does not move the pointer — so work
|
|
151
|
-
can be committed, pushed and green while a clone of the parent still gets the commit
|
|
152
|
-
before it. Neither repo looks wrong alone. Require `git submodule status` with no
|
|
153
|
-
line starting `+`, and every repo clean and pushed. The fix is two commands and the
|
|
154
|
-
second gets forgotten: push the submodule, **then** `git add <submodule> && git commit`.
|
|
155
|
-
5. **The retrospective is the run's last act** (`references/retrospective.md`), in this
|
|
156
|
-
order: **stamp the run first** (its commit makes the cold trigger computable) → **prune**
|
|
157
|
-
every standing instruction against its three retirement triggers, list held to ten,
|
|
158
|
-
every deletion logged → **write an entry only if the run diverged**: symptom with
|
|
159
|
-
evidence, the stage it surfaced at, the stage that *owned* it, the root cause, the
|
|
160
|
-
fix by grade, and the check that catches it next time.
|
|
161
|
-
|
|
162
|
-
Stage 0 reads those standing instructions in full next time, which is why the prune is a
|
|
163
|
-
gate criterion rather than a good intention.
|
|
164
|
-
|
|
165
|
-
**Then, and only after every gate above has closed, sign off:**
|
|
166
|
-
|
|
167
|
-
> — **Proof of Done**
|
|
168
|
-
> <https://github.com/ssheleg/sshlg-skills> · <https://skills.sshlg.me>
|
|
169
|
-
> If this run was useful, a ⭐ helps other people find it.
|
|
170
|
-
|
|
171
|
-
**Last, after the work — never before it, and never instead of a finding.** A run that
|
|
172
|
-
asks for a star while a gate is open is asking to be judged on its manner rather than
|
|
173
|
-
its evidence, which is the exact substitution this whole pipeline exists to refuse. If
|
|
174
|
-
the run ended red, ended early or ended with rows still open, print the attribution and
|
|
175
|
-
**drop the request**: the invitation is to endorse a finished result, and there is not
|
|
176
|
-
one to endorse.
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
## `/task-pipeline checkup`
|
|
181
|
-
|
|
182
|
-
**Runs with no task in flight, and that is the point.** Accumulated unconfirmed work is
|
|
183
|
-
invisible precisely because nobody is running a pipeline, so a check living only inside a
|
|
184
|
-
run can never say *"stop, fourteen things are unconfirmed."*
|
|
185
|
-
|
|
186
|
-
It takes no brief, opens no grill, and writes nothing on its own. Four sections, each
|
|
187
|
-
read from a file this pipeline already keeps: the **exposure** line with its check-list
|
|
188
|
-
oldest-first, the **board**'s open rows by computed priority, the carry-over ledgers'
|
|
189
|
-
unresolved count, and the code graph's staleness where one exists.
|
|
190
|
-
|
|
191
|
-
Where you ask it to file what it found, it appends board rows whose `Source` names the
|
|
192
|
-
checkup and its date — printing what it would add first, never silently.
|
|
193
|
-
Doctrine: `references/exposure.md`.
|
|
194
|
-
|
|
195
|
-
## `/task-pipeline waves`
|
|
196
|
-
|
|
197
|
-
**The whole board, closed in its final form.** Every open item — board, ledgers, plan
|
|
198
|
-
rows, unverified rows, uncovered scenarios, other products' asks — plus the new requests,
|
|
199
|
-
in one machine-readable inventory verified against the code. Questions are closed from
|
|
200
|
-
the sources; what remains goes to the operator once, as one batch, at the end of
|
|
201
|
-
planning. A committed canvas lays the target state over the current logic, and the work
|
|
202
|
-
is cut into waves that each close in one pass. Stages 0–4 run once, 5–8 per wave with a
|
|
203
|
-
close pass after each (verify, one fix round, docs, re-measure, re-cut), 9–10 to close.
|
|
204
|
-
It takes the next wave without asking, says once when the board is empty, and leaves
|
|
205
|
-
every sign-in, consent, payment and outward act to a person.
|
|
206
|
-
Doctrine: `references/waves.md`.
|
|
207
|
-
|
|
208
|
-
## `/task-pipeline iteration`
|
|
209
|
-
|
|
210
|
-
**The loop around the waves: a project moves in whole releases.** Survey every source into
|
|
211
|
-
one inventory (`scripts/waves.py merge`), write module dossiers in parallel, integrate them
|
|
212
|
-
into one canvas until a pass changes nothing, ask the operator in batches (rounds), never
|
|
213
|
-
one question at a time, then build in parallel. Each node is verified as it lands, in one
|
|
214
|
-
to three rounds by its risk class (R1–R3); a wave's stage 7 integrates without tagging, and
|
|
215
|
-
the release's stage-7 gate and stage 8's trio run once on what was released. The next pool
|
|
216
|
-
is re-measured and handed back once. Every run reads earlier runs' lessons
|
|
217
|
-
(`scripts/lessons.py query`) and writes its own at the retro. A finding made mid-iteration
|
|
218
|
-
joins the inventory; only the closed hotfix lane ships alone.
|
|
219
|
-
Doctrine: `references/iteration.md`.
|
|
220
|
-
|
|
221
|
-
## `/task-pipeline setup`
|
|
222
|
-
|
|
223
|
-
**The entry audit instead of a feature.** Seven passes over the documentation this
|
|
224
|
-
project already has, findings reported as `file:line` + the minimal fix ordered by seam,
|
|
225
|
-
and a fix plan the pipeline can run. Offered once at stage 0 when the doc map is absent
|
|
226
|
-
or stale; run it directly any time. Doctrine: `references/setup.md`.
|
|
11
|
+
- **Resume, never restart blindly.** If `.task-pipeline/run.md` or a pipeline task
|
|
12
|
+
list exists for this task, continue from the first incomplete stage.
|
|
13
|
+
- **No task given?** Ask for it in one line.
|
|
14
|
+
- **Proportional.** Stage 0's gap check decides: a small change takes the short path
|
|
15
|
+
and says so in one line; anything larger runs the full flow
|
|
16
|
+
(`references/stage-00-intake.md` → Phase 1d).
|
|
17
|
+
- **Modes.** `waves`: the whole board (`references/waves.md`). `iteration`: the
|
|
18
|
+
release loop around the waves (`references/iteration.md`). `setup`: audit the
|
|
19
|
+
documentation the project already has (`references/setup.md`). `checkup`: what has
|
|
20
|
+
shipped with no person confirming it, with no task in flight
|
|
21
|
+
(`references/verification.md`).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: evidence-docs
|
|
3
|
-
description: "Use when writing or reviewing anything
|
|
3
|
+
description: "Use when writing or reviewing anything read as true: a decision record, ADR, README, acceptance report, runbook, changelog, audit finding, or a claim that something was verified. Applies the ten canons of evidence-backed documentation and routes to the doctrine enforcing each; also a documentation gate or decision register. Not for: drafts, chat answers, commit messages; 'без доков' opts out."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: "Doctrine runs on any agent. No bundled scripts — nothing to install and nothing to degrade."
|
|
6
6
|
---
|
|
@@ -108,3 +108,10 @@ then nothing carries an address.
|
|
|
108
108
|
GENERATED copies, so a single-skill install of this skill resolves every link without a
|
|
109
109
|
neighbouring checkout. Edit the source home, never the copy — which file is generated,
|
|
110
110
|
from where, and how to re-sync: [`GENERATED.md`](references/GENERATED.md).
|
|
111
|
+
|
|
112
|
+
## Triggers
|
|
113
|
+
|
|
114
|
+
The description is the short form. The full trigger list it carried until 1.98.0,
|
|
115
|
+
moved here verbatim, still routes to this skill:
|
|
116
|
+
|
|
117
|
+
"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. 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. Also use when a project needs a documentation gate, a decision register, a propagation matrix, or a retrospective that outlives its author. Triggers - 'documentation gate', 'decision record', 'ADR', 'acceptance report', 'runbook', 'is this verified', 'доказательная документация', 'записать решение', 'запиши решение', 'отчёт о приёмке', 'раннбук', 'чем это подтверждено', 'доки в синхроне'. Not for: drafts, chat answers, commit messages or code comments — say 'без доков' to opt out."
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Generated copies — do not edit here
|
|
2
2
|
|
|
3
|
-
The files in this directory (and `../templates/`) are GENERATED (a deterministic transform: in-set links stay relative, out-of-set links point at the source home’s canonical URL) from the
|
|
3
|
+
The files in this directory (and `../templates/`), except `retrospective.md` (a hand-written pointer to its single home since 1.98.0), are GENERATED (a deterministic transform: in-set links stay relative, out-of-set links point at the source home’s canonical URL) from the
|
|
4
4
|
source home `skills/task-pipeline/references/` and `skills/task-pipeline/templates/`
|
|
5
5
|
so an isolated single-skill install of evidence-docs resolves every required
|
|
6
6
|
link without a neighbouring checkout (FIX-ED-01.01). Edit the source home and
|
|
@@ -58,6 +58,13 @@ to be enforced and is not is the same failure as a gate that prints `FAIL` and e
|
|
|
58
58
|
| 30 | **A gate scoped by exclusion judges every newcomer silently** | any lint, format or check configured with an ignore list rather than an include list | scope by what it COVERS; where the tool has no such switch, assert the covered set and fail on additions, deriving the allowlist by measuring the tool's own reach | the failure message names the intruder and the remedy, because the operator meets it mid-release |
|
|
59
59
|
| 31 | **A gate needs a third verdict — could not measure** | any check that can time out, lose a dependency, or run on a contended machine | distinguish *failed* from *could not measure* with different exit codes, and say which; neither is a verdict about the code | the refusal names its remedy, and a test that waits for a DURATION rather than an event is treated as a defect in the test |
|
|
60
60
|
| 32 | **A test whose assertion is implied by compilation is not a test** | any test whose name promises a behaviour | delete the subject: if that is a type or import error rather than a red test, the test is decoration | removing one asks what the name PROMISED and whether anything checks it — four of five such cases here were covered elsewhere and the fifth was a real gap only visible because the name was read as a claim |
|
|
61
|
+
| 33 | **Snapshot before you undo** | any `git checkout`, `git restore`, `git stash` or `reset` in a tree that may hold uncommitted work you did not write | copy the affected files first (to a dated folder, or `git diff > <file>.patch`) and restore from that copy, never from git | the run names the copy it took before the first destructive command |
|
|
62
|
+
| 34 | **One answer for inputs that should differ is a broken instrument** | any shell measurement, zsh above all | quote every expansion (`"$var"`, `'*.py'`), read data from files rather than inline literals, and feed it two inputs that should answer differently | the two answers differ, or the instrument is rewritten before its answer is used |
|
|
63
|
+
| 35 | **Release the tree you tested** | any tag or release | run the release workflow's own suite on the exact commit the tag will name, and select the CI run by that tag, never by branch | the run the tag triggered is green and its head SHA is the tagged commit |
|
|
64
|
+
| 36 | **A fix after a passing review is unreviewed** | any change made after a review or verifier passed | re-read the delta (`git diff <reviewed>..HEAD`) before merge | the merge names the reviewed SHA and who read the delta |
|
|
65
|
+
| 37 | **Call the real service once before writing its fake** | any mock, stub or fixture of an external API, CLI or service | make one real call, or read a recorded real response, and shape the fake from it | the fake cites the response it was shaped from |
|
|
66
|
+
| 38 | **Close blockers yourself; park only human gates** | any blocker about to be handed back | try every route the run holds (an API, a CLI, a credential door) first; park only a sign-in, consent, payment, typed secret or recorded operator decision | every handed-back item is a human gate, listed in one block with the route that failed |
|
|
67
|
+
| 39 | **Never retry an unchanged failing action** | any failed command, check or approach | change the input or the approach before trying again; after two failed approaches, change approach or record a blocker | no identical retry in the run ledger, and a third attempt names what changed |
|
|
61
68
|
|
|
62
69
|
---
|
|
63
70
|
|
|
@@ -163,6 +170,17 @@ that document is checked. This one governs a fact that crossed a **session bound
|
|
|
163
170
|
reported as current — the case where there is no document to check, only a memory that reads like
|
|
164
171
|
one.
|
|
165
172
|
|
|
173
|
+
**33 to 39 · The 2026-10-20 retro audit.** Read across ~54 retrospectives from ~50
|
|
174
|
+
projects, the same lessons recurred under different words, each in at least the number
|
|
175
|
+
of runs given: uncommitted work overwritten by a checkout, restore or stash with no copy
|
|
176
|
+
taken (17); a zsh glob or `=` left unquoted, so a command failed or a loop printed one
|
|
177
|
+
count for every file (8; this release's own run hit both); a tag cut from a tree the
|
|
178
|
+
release suite never ran on, or a CI run picked by branch rather than by tag (24, with
|
|
179
|
+
immutable tags burned); a fix landed after the review passed and merged unread; a fake
|
|
180
|
+
shaped from documentation that the real service contradicted (11); a hand-back listing
|
|
181
|
+
steps the agent could have done itself (12); and the same failing action retried
|
|
182
|
+
unchanged, round after round. None of them was new to the project that hit it again.
|
|
183
|
+
|
|
166
184
|
---
|
|
167
185
|
|
|
168
186
|
## The two that are not in the table, and why
|
|
@@ -214,6 +232,11 @@ answer would have exposed it in a minute.
|
|
|
214
232
|
| any command run to establish a fact — 6 Tests · 9 Docs · 10 Acceptance · 5 review | 19 — the output asserted non-empty and shaped as expected, and **quoted** rather than concluded from, [`audit.md`](https://github.com/ssheleg/task-pipeline/blob/main/plugins/task-pipeline/skills/task-pipeline/references/audit.md) → *Silence is not a reading*; the reviewer's half is in [`review.md`](https://github.com/ssheleg/task-pipeline/blob/main/plugins/task-pipeline/skills/task-pipeline/references/review.md) |
|
|
215
233
|
| 0 Harvest · 10 Acceptance | 20 — the **consumer** read to learn which copy ships, never the copies compared against each other, [`audit.md`](https://github.com/ssheleg/task-pipeline/blob/main/plugins/task-pipeline/skills/task-pipeline/references/audit.md) → *Two copies, and which one wins*; asked as row `0 Duplicates` of [`grill.md`](https://github.com/ssheleg/task-pipeline/blob/main/plugins/task-pipeline/skills/task-pipeline/references/grill.md) → *The autonomy sweep* |
|
|
216
234
|
| 10 Retro · **any gate or check you order** | 21 — each input traced to the step that writes it, and that step proven upstream, [`retrospective.md`](retrospective.md) → *Stamp first, then prune, then write* |
|
|
235
|
+
| any stage · a destructive git command · a shell measurement | 33, 34 |
|
|
236
|
+
| 7 Release · 5 Dev after review | 35, 36 |
|
|
237
|
+
| 5 Dev · 6 Tests · a fake of an external service | 37 |
|
|
238
|
+
| 10 Acceptance · the hand-back | 38 |
|
|
239
|
+
| every stage · any retry | 39, [`loop-guard.md`](https://github.com/ssheleg/task-pipeline/blob/main/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md) |
|
|
217
240
|
|
|
218
241
|
**This file is the shipped list; a project keeps its own.** Every rule in the table
|
|
219
242
|
above was earned on someone else's build and travels with the skill. The lessons *your*
|
|
@@ -276,7 +299,7 @@ evidence that something left, and the log below says what.
|
|
|
276
299
|
|
|
277
300
|
### Retired
|
|
278
301
|
|
|
279
|
-
**Numbers issued so far:
|
|
302
|
+
**Numbers issued so far: 39.** This is the high-water mark, and it is the only number
|
|
280
303
|
this file states about itself — deliberately, because the gap that proves a rule left
|
|
281
304
|
cannot be computed from the table alone: **deleting the highest-numbered rule shrinks
|
|
282
305
|
the maximum with it, and no gap ever opens.** That false negative shipped in the first
|