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.
Files changed (46) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/HOW-IT-WORKS.md +17 -13
  3. package/README.md +23 -17
  4. package/SKILL-CARD.md +2 -2
  5. package/cursor/rules/task-pipeline.mdc +33 -21
  6. package/evals/task-pipeline.evals.json +3 -3
  7. package/package.json +1 -1
  8. package/plugins/task-pipeline/.claude-plugin/plugin.json +2 -2
  9. package/plugins/task-pipeline/commands/task-pipeline.md +14 -219
  10. package/plugins/task-pipeline/skills/evidence-docs/SKILL.md +8 -1
  11. package/plugins/task-pipeline/skills/evidence-docs/references/GENERATED.md +1 -1
  12. package/plugins/task-pipeline/skills/evidence-docs/references/learned.md +24 -1
  13. package/plugins/task-pipeline/skills/evidence-docs/references/retrospective.md +21 -576
  14. package/plugins/task-pipeline/skills/project-audit/SKILL.md +8 -1
  15. package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +162 -230
  16. package/plugins/task-pipeline/skills/task-pipeline/graph.schema.json +1 -1
  17. package/plugins/task-pipeline/skills/task-pipeline/pipeline.example.json +9 -9
  18. package/plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json +10 -3
  19. package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +2 -2
  20. package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +3 -3
  21. package/plugins/task-pipeline/skills/task-pipeline/references/browser.md +48 -11
  22. package/plugins/task-pipeline/skills/task-pipeline/references/build.md +7 -7
  23. package/plugins/task-pipeline/skills/task-pipeline/references/certification.md +49 -44
  24. package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +32 -24
  25. package/plugins/task-pipeline/skills/task-pipeline/references/doctrine-map.md +1 -1
  26. package/plugins/task-pipeline/skills/task-pipeline/references/finish-line.md +13 -8
  27. package/plugins/task-pipeline/skills/task-pipeline/references/iteration.md +20 -23
  28. package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +5 -3
  29. package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +24 -1
  30. package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +17 -7
  31. package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +47 -1
  32. package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +5 -4
  33. package/plugins/task-pipeline/skills/task-pipeline/references/stage-00-intake.md +39 -25
  34. package/plugins/task-pipeline/skills/task-pipeline/references/stage-05-dev.md +3 -3
  35. package/plugins/task-pipeline/skills/task-pipeline/references/stage-08-post-deploy.md +3 -2
  36. package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +34 -22
  37. package/plugins/task-pipeline/skills/task-pipeline/references/tdd.md +3 -2
  38. package/plugins/task-pipeline/skills/task-pipeline/references/waves.md +6 -4
  39. package/plugins/task-pipeline/skills/task-pipeline/scripts/graph.py +77 -21
  40. package/plugins/task-pipeline/skills/task-pipeline/scripts/retro_budget.py +305 -0
  41. package/plugins/task-pipeline/skills/task-pipeline/scripts/short_path.py +70 -0
  42. package/plugins/task-pipeline/skills/task-pipeline/scripts/waves.py +22 -10
  43. package/plugins/task-pipeline/skills/task-pipeline/templates/browser-claims.json +5 -5
  44. package/plugins/task-pipeline/skills/task-pipeline/templates/canvas.md +1 -1
  45. package/plugins/task-pipeline/skills/task-pipeline/templates/retro-archive.md +9 -0
  46. 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`'s gated stages. **Every stage's doctrine
6
- ships inside the skill** — no companion plugin is required for any of it. The
7
- reference files are indexed in `SKILL.md`; this page is the run order, not the index.
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
- > **Four other modes.** `waves` takes the whole board instead of one task;
12
- > `iteration` runs the release loop around the waves — survey, design, build, release,
13
- > the next pool; `setup` audits the documentation this project already has; `checkup`
14
- > reports what has shipped without a person confirming it, with no task in flight. All
15
- > four are at the bottom of this page.
16
-
17
- **Idempotent entry — inspect state first, never restart blindly.** If a pipeline
18
- TaskList from a previous run exists for this task, **resume** from the first incomplete
19
- stage. Otherwise begin at stage 0. With no task given, the grill's first question asks
20
- for it in one line.
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 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."
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: 32.** This is the high-water mark, and it is the only number
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