task-pipeline-skill 1.40.0 → 1.42.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 +143 -0
- 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/task-pipeline/references/gates.md +52 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +22 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +5 -2
- package/plugins/task-pipeline/skills/task-pipeline/templates/retro-archive.md +10 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/retro.md +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,148 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v1.42.0 — a probe proves the phrasing its author had in mind
|
|
4
|
+
|
|
5
|
+
Six times in one session a guard was defeated by **text that was not its subject**, and
|
|
6
|
+
every one of those guards had a probe, and every probe fired. The probes and the guards
|
|
7
|
+
were written in the same hour from the same reading of the same file, so they shared the
|
|
8
|
+
blind spot rather than covering it.
|
|
9
|
+
|
|
10
|
+
| The check's subject | What answered it instead |
|
|
11
|
+
|---|---|
|
|
12
|
+
| stage 2 names the loop's arming | *"it **arms** the UX track"*, present since v1.7.0 |
|
|
13
|
+
| the section states the authorization floor | the same phrase in a Rationalizations row, and in a section from v1.11.0 |
|
|
14
|
+
| the run stamps have a cap | the **standing instructions'** `max 10` in the same cell — and, once narrowed past it, the same cap on the other side of the `·` |
|
|
15
|
+
| a section read in full stays capped | rows under one heading, while a second heading held forty more |
|
|
16
|
+
|
|
17
|
+
### The doctrine failed its own first use, and a reader caught that too
|
|
18
|
+
|
|
19
|
+
R-005's fourth consecutive reader read the three new probes against the section that
|
|
20
|
+
defines them. **`nb03` was not a neighbour probe.** It planted the needles of two
|
|
21
|
+
*retired* predicates — proving the guards that used to exist were neighbour-answerable
|
|
22
|
+
and saying nothing about the one that does. The instruction *"plant the guard's own
|
|
23
|
+
evidence"* reads as *"plant something that used to satisfy it"* unless it says **which
|
|
24
|
+
literal**, and now it does: the one the predicate matches today, read out of the guard.
|
|
25
|
+
|
|
26
|
+
Seven more, each planted and watched passing, each now replayed and failing:
|
|
27
|
+
|
|
28
|
+
- **Part 1a's precondition could be replaced by its opposite** and a housekeeping aside in
|
|
29
|
+
a `###` subsection answered for it — the reading `Default off` exists to forbid, shipping
|
|
30
|
+
behind a parenthesis;
|
|
31
|
+
- **the stage-2 guard's declared span was false.** Its comment said *"the GATE bullet and
|
|
32
|
+
nothing else"*; the GATE is the last bullet, so the split handed it everything to the
|
|
33
|
+
section end and a trailing note satisfied it;
|
|
34
|
+
- `- **GATEways to stage 3:**` was taken as the gate — no word boundary;
|
|
35
|
+
- **a decoy row about the archive answered for the live file**, because the retrospective
|
|
36
|
+
check scanned every `|` line rather than the row it names;
|
|
37
|
+
- **the scope depended on a `·`** no doctrine requires: replacing it with `, and` restored
|
|
38
|
+
the v1.41.0 defeat by punctuation;
|
|
39
|
+
- **one disjunct was dead and the live one was a literal** — the source line-wraps, so the
|
|
40
|
+
check was a false positive on any reword and a false negative on inversion;
|
|
41
|
+
- and **rekeying the stage-2 guard silently lost coverage**: deleting the whole queue
|
|
42
|
+
bullet began to pass, while its probe kept firing only because it *also* deleted the
|
|
43
|
+
gate clause. A probe whose stated claim has quietly become another probe's claim.
|
|
44
|
+
|
|
45
|
+
**A probe that only deletes is not a neighbour probe** — it may be correct, but if it
|
|
46
|
+
leans on copies already next door it must assert they are there, or a later edit demotes
|
|
47
|
+
it to a delete-only test that still passes.
|
|
48
|
+
|
|
49
|
+
### The neighbour probe
|
|
50
|
+
|
|
51
|
+
`gates.md` now asks a guard that reads a scoped span for a **second** probe, planting in
|
|
52
|
+
two places at once: break the subject, plant the guard's own evidence **next door**, and
|
|
53
|
+
require it to still fail. A guard that goes green is reading the neighbourhood, and the
|
|
54
|
+
ordinary probe cannot tell the difference — which is why it is a separate probe rather
|
|
55
|
+
than a stricter one.
|
|
56
|
+
|
|
57
|
+
Three shipped with it, one per guard that fell this way. **The third failed on its first
|
|
58
|
+
run and was right to:** a planted sentence saying *"after-decomposition remains a word in
|
|
59
|
+
the schema"* satisfied the stage-2 guard, proving it neighbour-answerable. The guard is
|
|
60
|
+
now keyed on the stage's **gate** — what it must DO — rather than on prose around it,
|
|
61
|
+
because prose above a gate can say anything.
|
|
62
|
+
|
|
63
|
+
**Positional narrowing is not scoping**, and three of the six were "fixed" that way
|
|
64
|
+
before falling again to text still inside the cut.
|
|
65
|
+
|
|
66
|
+
### Half of B-057 was already mechanised, and the row overstated it
|
|
67
|
+
|
|
68
|
+
`test/negatives.py` runs `differs_from_repo` on every planted copy, so a probe whose
|
|
69
|
+
needle no longer matches fails **loudly** rather than silently — which is what every
|
|
70
|
+
stale literal in this session actually did. The remaining half is the silent one, and it
|
|
71
|
+
is what the neighbour probe is for.
|
|
72
|
+
|
|
73
|
+
- Guards: 250 → **253**.
|
|
74
|
+
|
|
75
|
+
## v1.41.0 — one line per run is a slope, not a bound
|
|
76
|
+
|
|
77
|
+
`retro.md` is read **in full** at stage 0, and its own doctrine called both read sections
|
|
78
|
+
*bounded by construction*. Measured 2026-08-10:
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
standing instructions ~1 234 tok capped at ten
|
|
82
|
+
run stamps ~2 099 tok 27 rows, capped by nothing
|
|
83
|
+
recent log ~12 441 tok queried, not read
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The v1.38.0 audit found exactly this shape in the narrative log and moved it out of the
|
|
87
|
+
floor. It left the neighbour in the same file, with the same property, because the
|
|
88
|
+
neighbour's growth is **tidy** — one line per run. A tidy slope is still a slope: at a
|
|
89
|
+
hundred runs the stamp table alone is ~7 800 tokens of a floor the doctrine believes is
|
|
90
|
+
bounded.
|
|
91
|
+
|
|
92
|
+
**The cap is ten, and the cold trigger is why.** It reads *the last five run stamps*, so
|
|
93
|
+
ten is that with a margin and a rotated row can never be one the trigger needed. Eighteen
|
|
94
|
+
stamps rotated into `docs/superpowers/retro/2026-Q3.md`, whole, append-only. The stamp
|
|
95
|
+
section went **2 099 → 1 088 tok**, the read portion **3 333 → 2 335**, and the stage-0
|
|
96
|
+
floor to roughly **35 300**.
|
|
97
|
+
|
|
98
|
+
### The reader found six ways past the cap, and one of them was the doctrine's own command
|
|
99
|
+
|
|
100
|
+
R-005's reader defeated the first cap guard six ways, each planted and watched passing:
|
|
101
|
+
|
|
102
|
+
- **a second `## Run stamps — …` heading in the same file** held forty more rows and
|
|
103
|
+
passed. The guard read a *section*; stage 0 reads the **file**;
|
|
104
|
+
- **one leading space** on a row — still a valid table row — hid it from `startswith("|")`;
|
|
105
|
+
- **the stamp command this doctrine ships** (`printf '%s · %s\n' …`) appends prose, not a
|
|
106
|
+
table row. An agent obeying the shipped instruction literally produced forty stamps the
|
|
107
|
+
guard could not see, with `unlooked: 0`;
|
|
108
|
+
- **`templates/retro.md`** ships the same table to every host project and was outside the
|
|
109
|
+
corpus — the fourth hand-written list this repository has caught, against an invariant
|
|
110
|
+
that says corpora are discovered;
|
|
111
|
+
- **rotation by deletion** passed: a stamp removed from `retro.md` and absent from the
|
|
112
|
+
archive is history destroyed, and the guard could not tell moving from deleting;
|
|
113
|
+
- and the row check — already narrowed twice — was defeated by **swapping the two items
|
|
114
|
+
around the `·`**, which is the standing instructions' `max 10` answering for the stamps
|
|
115
|
+
again, on the other side of the separator.
|
|
116
|
+
|
|
117
|
+
Both guards are rewritten to count by **predicate over a discovered corpus**: three stamp
|
|
118
|
+
shapes (table row, list item, and the `<date> · <sha>` line the doctrine writes), every
|
|
119
|
+
file carrying a `## Run stamps` section, and the doctrine's cap read from the segment that
|
|
120
|
+
names the stamps rather than from anywhere in the row.
|
|
121
|
+
|
|
122
|
+
**Four surfaces had never learned the rule** — the live section's own intro, stage 10's
|
|
123
|
+
prune, `templates/retro.md`, and `templates/retro-archive.md`, which had no destination
|
|
124
|
+
section for a rotation the doctrine names. And stage 0 still called *one line per run* a
|
|
125
|
+
bound. All five now say the same thing.
|
|
126
|
+
|
|
127
|
+
**A hand-written count in this release was wrong.** It said twenty-one stamps rotated;
|
|
128
|
+
computed, it is **eighteen** (28 → 10). In a repository whose loudest canon is *compute,
|
|
129
|
+
never restate*.
|
|
130
|
+
|
|
131
|
+
### Two predicates that were answered by their neighbours
|
|
132
|
+
|
|
133
|
+
Both found by their own probes, both the same shape as the defects the last release's
|
|
134
|
+
reader named:
|
|
135
|
+
|
|
136
|
+
- the first version asked whether the file contained *"one line each"* and *"bounded by
|
|
137
|
+
construction"*. After the fix both survived **only inside the sentences criticising
|
|
138
|
+
them**, and the guard fired on its own correction. A predicate that cannot tell a claim
|
|
139
|
+
from its refutation has a false-positive budget above zero, which `gates.md` sets at
|
|
140
|
+
zero;
|
|
141
|
+
- scoped to the table row, it was then answered by the **standing instructions' own
|
|
142
|
+
`max 10`** in the same cell. It now reads only the part of the row after `Run stamps`.
|
|
143
|
+
|
|
144
|
+
- Guards: 248 → **250**.
|
|
145
|
+
|
|
3
146
|
## v1.40.0 — the loop had a cadence and no queue
|
|
4
147
|
|
|
5
148
|
`run.loop` said how **often** to continue. It never said **what the next item is**, so an
|
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.42.0 |
|
|
16
16
|
| **Surface** | Claude Code (filesystem skill + plugin) and the vercel `skills` CLI. **Not** uploaded to the Skills API; custom Skills do not sync across surfaces |
|
|
17
17
|
| **Dependencies** | None required. Optional: `context7` (MCP), `figma` (MCP), super-ux, agent-sync, graphify, obsidian-wiki. Every stage's doctrine ships in-repo; the one conditional requirement is super-ux for the stage-3 UX track on a user-facing task |
|
|
18
18
|
| **Evaluation status** | Suite authored, 5 categories. One recorded run, **self-observed by the author**; **zero blind runs on zero of three models** — the split, and the numbers, live in [`evals/RESULTS.md`](evals/RESULTS.md) and are computed by `evals/run.py` |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-pipeline-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.42.0",
|
|
4
4
|
"description": "Full-cycle delivery pipeline for coding agents: a mandatory built-in intake grill, then 10 gated stages (docs, brainstorm+decompose, spec, plan, build, tests, lint/deploy, post-deploy, docs/wiki, acceptance). Every stage's doctrine ships inside the skill — no companion plugin required. This package is the installer CLI.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"task-pipeline": "bin/task-pipeline.js"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "task-pipeline",
|
|
3
3
|
"displayName": "Task Pipeline",
|
|
4
4
|
"description": "Runs a substantial task through a mandatory built-in intake grill, then 10 gated stages (docs, brainstorm+decompose, spec, plan, subagent build, tests, lint/deploy, post-deploy, docs/wiki, acceptance). Every stage's doctrine is built into the skill — no companion plugin required — with typed auto/manual gates, a frozen requirement spine that closes with evidence, a work board and a verification ledger that outlive a run, an exposure line naming what shipped unconfirmed, a progress rail computed from the project's own config, a loop guard whose review ceiling measures rather than stops, and stage-3 tracks for what a product does, how it sounds and how it looks. Two modes need no task: `checkup` (what is unverified) and `setup` (audit existing docs). Retro insights can publish upstream as issues, opt-in and redacted.",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.42.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "ssheleg",
|
|
8
8
|
"url": "https://x.com/sshlg93"
|
|
@@ -30,6 +30,7 @@ elsewhere and is not restated here:
|
|
|
30
30
|
- Anatomy of a project gate
|
|
31
31
|
- Writing the check itself
|
|
32
32
|
- Probing — plant, run, restore
|
|
33
|
+
- The neighbour probe — plant the evidence outside the subject
|
|
33
34
|
- The false-positive budget
|
|
34
35
|
- Ratchets
|
|
35
36
|
- Disclosures — counted like a ratchet, and deliberately not monotone
|
|
@@ -295,6 +296,57 @@ Otherwise the next reader has to redo it to know whether it was ever done.
|
|
|
295
296
|
|
|
296
297
|
---
|
|
297
298
|
|
|
299
|
+
## The neighbour probe — plant the evidence outside the subject
|
|
300
|
+
|
|
301
|
+
A probe proves a guard rejects **the phrasing its author had in mind**. That is less than
|
|
302
|
+
it looks, and the gap has one shape: **a check answered by text that is not its subject.**
|
|
303
|
+
|
|
304
|
+
Measured on one project in one session, six times, each found by a reader planting a
|
|
305
|
+
defect and watching `PASS`:
|
|
306
|
+
|
|
307
|
+
| The check's subject | The text that answered it instead |
|
|
308
|
+
|---|---|
|
|
309
|
+
| stage 2 names the loop's arming | *"it **arms** the UX track"*, present since an earlier release |
|
|
310
|
+
| the section states the authorization floor | the same phrase in a Rationalizations row, and in a section written twenty-nine releases before |
|
|
311
|
+
| the run stamps have a cap | the **standing instructions'** `max 10`, in the same table cell — and, once the check was narrowed past it, the same cap moved to the other side of the `·` |
|
|
312
|
+
| a section read in full stays capped | rows under **one** heading, while a second heading in the same file held forty more |
|
|
313
|
+
|
|
314
|
+
Every one of those guards had a probe. Every probe fired. The probes and the guards were
|
|
315
|
+
written in the same hour from the same reading, so they shared the same blind spot.
|
|
316
|
+
|
|
317
|
+
**So a guard that reads a scoped span owes a second probe, and it plants in two places at
|
|
318
|
+
once:**
|
|
319
|
+
|
|
320
|
+
1. **break the subject** — remove the thing the guard is about;
|
|
321
|
+
2. **plant the guard's own evidence next door** — in a sibling section, an adjacent table
|
|
322
|
+
cell, a rationalizations row, the other side of a separator;
|
|
323
|
+
3. require the guard to **still fail**.
|
|
324
|
+
|
|
325
|
+
A guard that passes step 3 is reading its subject. A guard that goes green is reading the
|
|
326
|
+
neighbourhood, and the ordinary probe cannot tell the difference — which is why this one
|
|
327
|
+
is separate rather than a stricter version of it.
|
|
328
|
+
|
|
329
|
+
**Step 2 means the literal the predicate matches *today*, read out of the guard.** The
|
|
330
|
+
first three neighbour probes written against this section got that wrong on their first
|
|
331
|
+
run: one planted the needles of two **retired** predicates, which proves the guards that
|
|
332
|
+
used to exist were neighbour-answerable and says nothing about the one that does. A
|
|
333
|
+
neighbour probe keyed to a needle the guard no longer reads is the same defect it was
|
|
334
|
+
written to catch, one level up.
|
|
335
|
+
|
|
336
|
+
**A probe that only deletes is not a neighbour probe.** It may still be a correct probe —
|
|
337
|
+
but if it relies on copies that already sit next door, it must **assert they are there**.
|
|
338
|
+
Otherwise a later edit removes them and the probe quietly becomes a delete-only test that
|
|
339
|
+
still passes, having stopped testing the thing it is named for.
|
|
340
|
+
|
|
341
|
+
**Positional narrowing is not scoping.** Three of the six were "fixed" by cutting the
|
|
342
|
+
search down to a row, then to everything after a phrase, and fell each time to text that
|
|
343
|
+
was still inside the cut. Scope by *what the span is about*: split to the cell, then to
|
|
344
|
+
the item, then match on flattened text so an emphasis marker cannot hide the boundary.
|
|
345
|
+
|
|
346
|
+
**And state the span in the guard.** One line above the predicate — *what it reads, and
|
|
347
|
+
where that ends*. It costs nothing and it is the only part of a check a later reader can
|
|
348
|
+
disagree with before the defect arrives.
|
|
349
|
+
|
|
298
350
|
## The false-positive budget
|
|
299
351
|
|
|
300
352
|
Run a new heuristic over the **real corpus** before shipping it and count the false
|
|
@@ -18,7 +18,7 @@ justifies reading it protects one section while the file below it doubles.
|
|
|
18
18
|
|
|
19
19
|
| Artifact | Parts | How it is read |
|
|
20
20
|
|---|---|---|
|
|
21
|
-
| `docs/superpowers/retro.md` — **one per project** | **Standing instructions** (max **10**) · **Run stamps** (
|
|
21
|
+
| `docs/superpowers/retro.md` — **one per project** | **Standing instructions** (max **10**) · **Run stamps** (max **10**, oldest rotate out) | stage 0, **in full** — both are bounded by a **cap**, which *one line each* never was |
|
|
22
22
|
| the same file's **Recent log** | entries from the last five run stamps — narrative, and capped by nothing | stage 0, **queried** by the task's nouns. It said *in full* until 2026-08-10, when it measured **74%** of the file: an uncapped section inside a binding source is what makes the capped part get skimmed |
|
|
23
23
|
| `docs/superpowers/retro/YYYY-QN.md` — the archive | every entry and every retirement ever written, append-only | **queried** by the task's nouns; never read end to end |
|
|
24
24
|
|
|
@@ -32,6 +32,7 @@ file exists to stop.
|
|
|
32
32
|
|
|
33
33
|
- Write the entry only for a divergence — and name the layer that owned it
|
|
34
34
|
- Every lesson carries its commit
|
|
35
|
+
- The stamp table is capped at ten, and *one line per run* was never a cap
|
|
35
36
|
- Rotation — the archive is how pruning stops losing things
|
|
36
37
|
- Three grades of fix — take the highest one that can work
|
|
37
38
|
- Stamp first, then prune, then write
|
|
@@ -79,6 +80,26 @@ mechanical: the project's documentation gate runs `git rev-parse --verify --quie
|
|
|
79
80
|
<sha>^{commit}` over every backticked SHA in the retro and its archive
|
|
80
81
|
([`gates.md`](gates.md)).
|
|
81
82
|
|
|
83
|
+
## The stamp table is capped at ten, and *one line per run* was never a cap
|
|
84
|
+
|
|
85
|
+
Measured 2026-08-10: standing instructions **~1 234 tok** behind a cap of ten, run stamps
|
|
86
|
+
**~2 099 tok over 27 rows** behind nothing. Both are read in full at stage 0 and both
|
|
87
|
+
were described as *bounded by construction*. One line per run is a **slope**: at a
|
|
88
|
+
hundred runs the stamp table alone is ~7 800 tokens of a floor the doctrine believes is
|
|
89
|
+
bounded.
|
|
90
|
+
|
|
91
|
+
This is the same shape the 2026-08-10 audit found in the narrative log and moved out of
|
|
92
|
+
the floor — and it left the neighbour in the same file, with the same property, because
|
|
93
|
+
the neighbour's growth is *tidy*. A tidy slope is still a slope.
|
|
94
|
+
|
|
95
|
+
**The cap is ten and the trigger is why.** The cold rule reads *the last five run
|
|
96
|
+
stamps*; ten is that with a margin, so a stamp rotating out can never be one the trigger
|
|
97
|
+
needed. At the eleventh, the oldest row moves — whole, with its verdict and its retro
|
|
98
|
+
column — into `docs/superpowers/retro/YYYY-QN.md` under `## Run stamps`, append-only,
|
|
99
|
+
like every other rotation. **The count is printed at the prune**, beside the standing
|
|
100
|
+
instructions' own count, so a table that stops rotating is visible rather than merely
|
|
101
|
+
large.
|
|
102
|
+
|
|
82
103
|
## Rotation — the archive is how pruning stops losing things
|
|
83
104
|
|
|
84
105
|
At the prune, entries older than the last five run stamps **move** to
|
|
@@ -102,7 +102,7 @@ never that the work was skipped quietly.
|
|
|
102
102
|
`affected` / `god-nodes` answer *reach*, which is what grep cannot), `CLAUDE.md`,
|
|
103
103
|
`CONTEXT.md`/ADRs, `docs/` + `docs/ux/`, past pipeline briefs and carry-over
|
|
104
104
|
ledgers, **the retro's standing instructions and run stamps** (`docs/superpowers/retro.md`,
|
|
105
|
-
read **in full** — ten rows and
|
|
105
|
+
read **in full** — ten standing rows and ten stamps, both bounded **by a cap**, and they bind this
|
|
106
106
|
run; stamp each instruction as it fires. Its *Recent log* is **queried** by the
|
|
107
107
|
task's nouns, not read: uncapped narrative inside a binding source is what makes the
|
|
108
108
|
capped part get skimmed, [`retrospective.md`](retrospective.md)), the **knowledge wiki** if one is
|
|
@@ -656,7 +656,10 @@ never that the work was skipped quietly.
|
|
|
656
656
|
with a floor, neither ever a target ([`gates.md`](gates.md) → *Disclosures*); **the
|
|
657
657
|
retrospective is written — stamped first, then pruned, then the entry; the
|
|
658
658
|
list at or under its cap, every deletion logged in the archive with its commit,
|
|
659
|
-
entries older than five run stamps rotated into `docs/superpowers/retro
|
|
659
|
+
entries older than five run stamps rotated into `docs/superpowers/retro/` **and the
|
|
660
|
+
stamp table itself held to ten — at the eleventh the oldest stamp rotates whole into
|
|
661
|
+
the same archive, and both counts print beside the verdict** (the stamp table is read
|
|
662
|
+
in full at stage 0, so *one line per run* is a slope the prune has to stop), the run
|
|
660
663
|
stamped with its commit, every SHA in either file resolvable, and the
|
|
661
664
|
counts printed beside this verdict**; **where `pipeline.json` → `retro.publish` is
|
|
662
665
|
set, the skill-level insight is published as an issue on the skill's repository —
|
|
@@ -39,3 +39,13 @@ history attached**, which is what this section is for.
|
|
|
39
39
|
| Date | id | Instruction | Trigger that retired it | Commit |
|
|
40
40
|
|---|---|---|---|---|
|
|
41
41
|
| <YYYY-MM-DD> | R-000 | … | became a check (`npm run lint:paths`) | `<sha>` |
|
|
42
|
+
|
|
43
|
+
## Run stamps
|
|
44
|
+
|
|
45
|
+
Rotated out of `retro.md` when its live table passes ten. Append-only, whole rows —
|
|
46
|
+
the cold trigger reads the last five in the live file, so a stamp here is one it no
|
|
47
|
+
longer needs. Moving is not deleting: a stamp that leaves `retro.md` and appears
|
|
48
|
+
nowhere is history destroyed, not archived.
|
|
49
|
+
|
|
50
|
+
| Date | Topic | Commit | Verdict | Retro |
|
|
51
|
+
|---|---|---|---|---|
|
|
@@ -61,8 +61,9 @@ shape the hygiene gate's check 6 exists to find.
|
|
|
61
61
|
|
|
62
62
|
## Run stamps
|
|
63
63
|
|
|
64
|
-
One line per run, appended at stage 10
|
|
65
|
-
|
|
64
|
+
One line per run, appended at stage 10, **capped at ten** — at the eleventh the
|
|
65
|
+
oldest rotates whole into the archive. One line per run is a slope, not a bound:
|
|
66
|
+
this section is read in full at stage 0.
|
|
66
67
|
|
|
67
68
|
| Date | Topic | Commit | Verdict | Retro |
|
|
68
69
|
|---|---|---|---|---|
|