task-pipeline-skill 1.4.4 → 1.6.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 +139 -0
- package/README.md +120 -4
- package/cursor/rules/task-pipeline.mdc +62 -7
- package/package.json +1 -1
- package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
- package/plugins/task-pipeline/commands/task-pipeline.md +12 -6
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +38 -6
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.example.json +15 -10
- package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +31 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +10 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/audit.md +8 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +15 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/conventions.md +6 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +3 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-graph.md +159 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +67 -10
- package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +8 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +117 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +42 -7
- package/plugins/task-pipeline/skills/task-pipeline/templates/README.md +11 -5
- package/plugins/task-pipeline/skills/task-pipeline/templates/brief.md +14 -6
- package/plugins/task-pipeline/skills/task-pipeline/templates/retro.md +51 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Retrospective — the run teaches the next run, and the list stays short
|
|
2
|
+
|
|
3
|
+
The last act of stage 10, after the coverage table and before the run is called
|
|
4
|
+
done. It exists because the pipeline's gates are good at *this* run and blind
|
|
5
|
+
across runs: the same class of failure can be caught, fixed and forgotten five
|
|
6
|
+
times, and nothing in the flow notices it is the same one.
|
|
7
|
+
|
|
8
|
+
**Artifact:** `docs/superpowers/retro.md` — **one per project, not per run**,
|
|
9
|
+
committed. It has three parts and a hard size limit:
|
|
10
|
+
|
|
11
|
+
| Part | What's in it | Read by |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| **Standing instructions** | the rules currently in force — max **10** | stage 0, in full, every run |
|
|
14
|
+
| **Log** | problem → cause → fix → check, newest first, plus every retirement | a human, and stage 0 when the terms match |
|
|
15
|
+
| **Run stamps** | one line per run: date, topic, verdict | the prune (this is what makes "five runs" countable) |
|
|
16
|
+
|
|
17
|
+
Every run writes a **stamp** and runs the **prune**. Only a run that *diverged*
|
|
18
|
+
writes an entry. A retro that is empty after a messy run is the exact failure this
|
|
19
|
+
file exists to stop.
|
|
20
|
+
|
|
21
|
+
## Write the entry only for a divergence — and name the layer that owned it
|
|
22
|
+
|
|
23
|
+
An entry is owed when the run did not go as planned: a gate reopened, a stage was
|
|
24
|
+
re-entered, a fix broke something it wasn't touching, an estimate was wrong by a
|
|
25
|
+
factor, the operator had to intervene where the brief said they wouldn't.
|
|
26
|
+
|
|
27
|
+
Required fields, and none of them is optional:
|
|
28
|
+
|
|
29
|
+
| Field | The rule |
|
|
30
|
+
|---|---|
|
|
31
|
+
| **Symptom** | what actually happened, in one line, with the evidence (a command, a `file:line`, the gate that reopened) |
|
|
32
|
+
| **Surfaced at** | the stage where it became visible |
|
|
33
|
+
| **Owned by** | the stage that *let it through* — usually an earlier one. A finding belongs to the layer that owns it; recording it against the stage that tripped over it is how the same defect returns |
|
|
34
|
+
| **Root cause** | why the pipeline permitted it. "The agent was careless" is not a cause — it is the absence of one, and it produces no fix |
|
|
35
|
+
| **Fix** | one of the three grades below |
|
|
36
|
+
| **The check** | what would have caught this the first time. If the honest answer is "nothing yet", that is the fix, and it is grade 1 |
|
|
37
|
+
|
|
38
|
+
## Three grades of fix — take the highest one that can work
|
|
39
|
+
|
|
40
|
+
**Grade 1 — mechanical.** A test, a lint rule, a gate criterion, a CI step, a hook.
|
|
41
|
+
The check *is* the memory: nothing has to be read, remembered or pruned later. Log
|
|
42
|
+
it as `landed` and move on — it never becomes a standing instruction and never
|
|
43
|
+
costs a slot.
|
|
44
|
+
|
|
45
|
+
**Grade 2 — a standing instruction.** A rule an agent must read, for the cases no
|
|
46
|
+
check can decide (a judgement, a precedence, a "ask before X"). It costs one of the
|
|
47
|
+
ten slots and it is **only accepted with its retirement trigger written at birth**
|
|
48
|
+
(below).
|
|
49
|
+
|
|
50
|
+
**Grade 3 — a note with an expiry.** For something still being understood. Maximum
|
|
51
|
+
**two runs**. At the second stamp it is promoted to grade 1 or 2, or deleted. A note
|
|
52
|
+
with no expiry is how a file becomes unreadable one honest line at a time.
|
|
53
|
+
|
|
54
|
+
Prefer grade 1 whenever a check can decide it. This is the same law as
|
|
55
|
+
[`audit.md`](audit.md) → *A class that repeats twice becomes a gate, not a note*: a
|
|
56
|
+
rule that could have been a check gets read twice and obeyed once.
|
|
57
|
+
|
|
58
|
+
## The prune — mandatory, and it runs BEFORE the new entry is written
|
|
59
|
+
|
|
60
|
+
Prune first, then write. A lesson that lands in a cluttered file is a lesson nobody
|
|
61
|
+
will reach.
|
|
62
|
+
|
|
63
|
+
Check **every** standing instruction against three retirement triggers:
|
|
64
|
+
|
|
65
|
+
| Trigger | Test | Then |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| **It became a check** | the rule is now enforced by a test, lint, gate or hook | delete it — the check is the memory, and keeping both means it is read twice and obeyed once |
|
|
68
|
+
| **Its surface is gone** | resolve every path, command, stage and tool it names; any that no longer exists | delete it — it now describes a system nobody is running |
|
|
69
|
+
| **It went cold** | it has not fired in the last **five run stamps** | delete it — five runs without firing is the evidence that it was situational |
|
|
70
|
+
|
|
71
|
+
Then the cap: **ten standing instructions, hard.** At eleven you do not get to keep
|
|
72
|
+
them all — the oldest never-fired one goes. "But all of them matter" is precisely
|
|
73
|
+
the state in which the list stopped being read, and the ninth stale rule is what
|
|
74
|
+
discredits the two that are load-bearing.
|
|
75
|
+
|
|
76
|
+
**Every deletion writes one line in the Log** — id, date, which trigger fired.
|
|
77
|
+
Silent deletion is forbidden: the record is what survives, the instruction is what
|
|
78
|
+
leaves. A retired rule that comes back as a real failure is a grade-1 fix, and now
|
|
79
|
+
you have its history.
|
|
80
|
+
|
|
81
|
+
**Print the counts beside the gate verdict**, the same way the carry-over ledger
|
|
82
|
+
does ([`audit.md`](audit.md) → *ratchet, never TODO*):
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
GATE 10 acceptance: PASS — 14/14 REQ verified
|
|
86
|
+
carry-over: 0 unresolved · retro: 7 standing (was 9) · retired 3 · added 1
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
A pruned list that nobody prints is a list that quietly grows back.
|
|
90
|
+
|
|
91
|
+
## The loop closes at stage 0
|
|
92
|
+
|
|
93
|
+
The standing instructions are an **instruction source**, not background reading:
|
|
94
|
+
[`knowledge-sources.md`](knowledge-sources.md) reads them in full at the harvest —
|
|
95
|
+
they are short by construction — and records the file as a ledger row. Every
|
|
96
|
+
instruction that actually *fires* during the run gets its **last-fired date
|
|
97
|
+
stamped** as it fires. That stamp is the only thing that makes the cold-rule honest;
|
|
98
|
+
without it "five runs without firing" is a guess, and the prune becomes a mood.
|
|
99
|
+
|
|
100
|
+
## Where a lesson goes when it is not about this project
|
|
101
|
+
|
|
102
|
+
A lesson that would be true in any repository does not belong in one project's
|
|
103
|
+
retro — it belongs in the pipeline's own doctrine
|
|
104
|
+
([`learned.md`](learned.md), which is exactly that list, earned the same way). Open
|
|
105
|
+
an issue upstream and say so in the entry. A local file that accumulates universal
|
|
106
|
+
rules is a fork of the skill that nobody named.
|
|
107
|
+
|
|
108
|
+
## Rationalizations
|
|
109
|
+
|
|
110
|
+
| Excuse | Reality |
|
|
111
|
+
|---|---|
|
|
112
|
+
| "Nothing really went wrong this run" | Then the stamp says so in one line and you are done in ten seconds. The runs that "went fine" are where a repeated class hides — it never cost enough to remember. |
|
|
113
|
+
| "I'll write the retro later, with a clear head" | Later is when you remember the outcome and not the seam. The cause is legible for about an hour after the run. |
|
|
114
|
+
| "Don't delete it, it might still be useful" | That sentence is the entire failure mode. Every rule kept "just in case" spends attention that the load-bearing ones needed, and the file stops being read at all. |
|
|
115
|
+
| "Pruning loses knowledge" | The Log keeps the incident forever; only the *instruction* leaves. If it recurs you get a grade-1 fix with its own history attached. |
|
|
116
|
+
| "The list is at eleven but they're all important" | Then one of them is doctrine and belongs in `CLAUDE.md`, one has become a check, and one has not fired in a year. Ten is the budget precisely because ranking is uncomfortable. |
|
|
117
|
+
| "I'll note it as a reminder for next time" | A note is grade 3 and expires in two runs. If it is worth remembering it is worth a check or a slot; if it is worth neither, it was never going to be read. |
|
|
@@ -37,15 +37,20 @@ stages/agents/types (see SKILL.md → *Bring your own skills*).
|
|
|
37
37
|
answers for scope, users, constraints, data, edge cases, done-criteria.
|
|
38
38
|
- **Phase 1 — harvest the knowledge sources FIRST**
|
|
39
39
|
([`knowledge-sources.md`](knowledge-sources.md)). Before the first question:
|
|
40
|
-
query what the project already knows about this task — code,
|
|
40
|
+
query what the project already knows about this task — code, **the code graph**
|
|
41
|
+
when one is built ([`knowledge-graph.md`](knowledge-graph.md): `graphify query` /
|
|
42
|
+
`affected` / `god-nodes` answer *reach*, which is what grep cannot), `CLAUDE.md`,
|
|
41
43
|
`CONTEXT.md`/ADRs, `docs/` + `docs/ux/`, past pipeline briefs and carry-over
|
|
42
|
-
ledgers, the
|
|
44
|
+
ledgers, **the retro's standing instructions** (`docs/superpowers/retro.md`, read
|
|
45
|
+
**in full** — they are capped at ten and they bind this run; stamp each one as it
|
|
46
|
+
fires, [`retrospective.md`](retrospective.md)), the **knowledge wiki** if one is
|
|
47
|
+
installed
|
|
43
48
|
([obsidian-wiki](https://github.com/ar9av/obsidian-wiki) — recommended,
|
|
44
49
|
never required), and any **other repo or hosted doc system the project names as
|
|
45
50
|
its docs**. Write the **source ledger** into the brief (a row per source, or an
|
|
46
|
-
explicit "none found"
|
|
47
|
-
read of everything — and it is what makes
|
|
48
|
-
merely confident.
|
|
51
|
+
explicit "none found"; the graph's row carries its build date). It is retrieval
|
|
52
|
+
scoped by the task's own nouns, not a read of everything — and it is what makes
|
|
53
|
+
phase 2's answers checkable instead of merely confident.
|
|
49
54
|
- **How it runs: [`grill.md`](grill.md)** — the full doctrine, built into this
|
|
50
55
|
skill (nothing to install). In short: one question per turn, a recommended
|
|
51
56
|
answer with each, explore the codebase before asking, depth-first through the
|
|
@@ -257,12 +262,27 @@ stages/agents/types (see SKILL.md → *Bring your own skills*).
|
|
|
257
262
|
`~/.obsidian-wiki/config`, or the skill resolves). Not installed → recommend it
|
|
258
263
|
once with its install line and continue; a missing wiki never blocks the gate.
|
|
259
264
|
Distil the knowledge (decisions, seams, why), not a diff summary.
|
|
265
|
+
- **Refresh the code graph** — `/graphify . --update` when one exists
|
|
266
|
+
([`knowledge-graph.md`](knowledge-graph.md)). The close-out has **three**
|
|
267
|
+
artifacts, not two: docs, wiki, graph. The graph is the source the *next* run's
|
|
268
|
+
harvest queries first, so a stale one is a false premise carrying the authority of
|
|
269
|
+
a machine — a wrong doc gets argued with, a wrong graph gets believed. Incremental
|
|
270
|
+
and model-free for code; a run that deleted code legitimately rebuilds smaller
|
|
271
|
+
(`--force`).
|
|
272
|
+
- **Then check the graph against the docs** — the cheap half of the divergence sweep
|
|
273
|
+
(`graphify god-nodes`; any doc naming a module the graph no longer has). A hub no
|
|
274
|
+
doc names, or an edge the docs deny, is either a leak in the code or a lie in the
|
|
275
|
+
docs; a doc naming a node that no longer exists is a stale ledger row found
|
|
276
|
+
mechanically. Doc-side findings are fixed here; **absences go to stage 10's ladder
|
|
277
|
+
walk as REQ rows** ([`audit.md`](audit.md)).
|
|
260
278
|
- **Docs living in another repository** are outward: propose the edit, get an
|
|
261
279
|
explicit go, then open a PR there. No go → the exact edit goes in the carry-over
|
|
262
280
|
ledger.
|
|
263
281
|
- **GATE (auto):** docs in sync with code; every stale row in the source ledger
|
|
264
282
|
either updated or carried over with its edit; UI: super-ux layers current +
|
|
265
|
-
linter green; wiki synced (or absent and recommended once);
|
|
283
|
+
linter green; wiki synced (or absent and recommended once); **the code graph
|
|
284
|
+
refreshed where one exists, or the reason it wasn't written into the carry-over
|
|
285
|
+
ledger** (absent and recommended once is fine); dangling links fixed.
|
|
266
286
|
|
|
267
287
|
## 10 — Acceptance
|
|
268
288
|
- **What:** the closing stage — go back to the brief and account for **every**
|
|
@@ -313,8 +333,23 @@ stages/agents/types (see SKILL.md → *Bring your own skills*).
|
|
|
313
333
|
`/agent-sync finish` runs exactly that. The fix is two commands and the second is
|
|
314
334
|
the forgotten one: `git -C <submodule> push`, then
|
|
315
335
|
`git add <submodule> && git commit`.
|
|
336
|
+
- **The retrospective is the run's last act** ([`retrospective.md`](retrospective.md)),
|
|
337
|
+
written to `docs/superpowers/retro.md` — one file per project, not per run. The
|
|
338
|
+
pipeline's gates are good at *this* run and blind across runs: the same class of
|
|
339
|
+
failure can be caught, fixed and forgotten five times and nothing in the flow
|
|
340
|
+
notices it is the same one. So, in this order: **prune first** (every standing
|
|
341
|
+
instruction against its three retirement triggers — it became a check, its
|
|
342
|
+
surface is gone, it hasn't fired in five run stamps — and the list held to its cap
|
|
343
|
+
of ten, every deletion logged), **stamp the run**, then **write an entry only if
|
|
344
|
+
the run diverged** (symptom · the stage it surfaced at · the stage that *owned* it
|
|
345
|
+
· root cause · fix, mechanical before instruction before expiring note · the check
|
|
346
|
+
that catches it next time). Every run prunes and stamps; a retro left empty after
|
|
347
|
+
a messy run is the failure the file exists to stop. Stage 0 reads the standing
|
|
348
|
+
instructions in full next time, which is why the cap is not negotiable.
|
|
316
349
|
- **GATE (manual):** the ladder walk ran and its absences became REQ rows before
|
|
317
|
-
the table was written; **
|
|
350
|
+
the table was written; **the retrospective is written — prune before entry, the
|
|
351
|
+
list at or under its cap with every deletion logged, the run stamped, and the
|
|
352
|
+
counts printed beside this verdict**; **every repository is closed — the parent included:
|
|
318
353
|
`git submodule status` shows no `+`, each repo clean and pushed**; **every check this gate leans on has been seen failing
|
|
319
354
|
once against a planted defect** (an unproven check's green is not evidence);
|
|
320
355
|
every REQ has a status (none `unknown`); every `verified`
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
# templates
|
|
2
2
|
|
|
3
|
-
Skeletons task-pipeline seeds into a host project.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
Skeletons task-pipeline seeds into a host project. Two are **seeded files** — the
|
|
4
|
+
**brief** (the stage-0 intake artifact) and the **retro** (created at the first
|
|
5
|
+
stage-10 close-out, then appended to for the life of the project). The spec and plan
|
|
6
|
+
have no skeleton here — their required structure is prescribed inline by
|
|
7
|
+
`references/spec.md` and `references/planning.md`; the `docs/ux/*` skeletons come
|
|
8
|
+
from `super-ux`.
|
|
7
9
|
|
|
8
10
|
| Template | Seeded to | Stage |
|
|
9
11
|
|---|---|---|
|
|
@@ -11,10 +13,14 @@ their required structure is prescribed inline by `references/spec.md` and
|
|
|
11
13
|
| `carryover.md` | `docs/superpowers/specs/YYYY-MM-DD-<topic>-carryover.md` | 0 seeds, all stages append, 10 reads |
|
|
12
14
|
| `context.md` | `CONTEXT.md` at the repo root (or per context) | 0 — grill, domain awareness |
|
|
13
15
|
| `adr.md` | `docs/adr/NNNN-<slug>.md` | 0 — grill, hard-to-reverse decisions |
|
|
16
|
+
| `retro.md` | `docs/superpowers/retro.md` — **one per project, not per run** | 10 writes (prune → stamp → entry), 0 reads the standing instructions in full |
|
|
14
17
|
|
|
15
18
|
`context.md` and `adr.md` are **format references**, not files to copy wholesale:
|
|
16
19
|
the grill writes `CONTEXT.md` entries and ADRs in their shape, lazily — only once
|
|
17
20
|
there is a resolved term or a decision worth recording.
|
|
18
21
|
|
|
19
22
|
Seeding rule (per the ssheleg canon): create a template copy **only when the
|
|
20
|
-
target is absent**; never overwrite an existing brief.
|
|
23
|
+
target is absent**; never overwrite an existing brief. The rule is hardest and most
|
|
24
|
+
important for `retro.md`: it is the only artifact that accumulates across runs, so
|
|
25
|
+
overwriting it with the skeleton destroys every lesson the project has bought —
|
|
26
|
+
seed it once, then read, prune and append.
|
|
@@ -19,17 +19,25 @@ premise if the run leaves it wrong.
|
|
|
19
19
|
| Source | What it says about this task | Fresh? | Authority | Stale after this run? |
|
|
20
20
|
|---|---|---|---|---|
|
|
21
21
|
| `docs/adr/NNNN-….md` | … | YYYY-MM | decision | no |
|
|
22
|
+
| `graphify-out/graph.json` | reach: what calls it, what breaks if it moves | built YYYY-MM-DD | index | **yes — refresh at stage 9** |
|
|
22
23
|
| wiki: `projects/…/concepts/…` | … | YYYY-MM | context | **yes — update at stage 9** |
|
|
23
24
|
| `CLAUDE.md` | test/lint/deploy commands, house rules | current | convention | no |
|
|
24
25
|
|
|
25
|
-
Precedence when two disagree: **code
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
Precedence when two disagree, in one direction: **code first, then host docs and
|
|
27
|
+
ADRs, then the code graph, then the wiki, then memory.** The graph points; the code
|
|
28
|
+
decides. The operator outranks every document — but only **out loud**: an override
|
|
29
|
+
quoted against its source is a recorded decision, an unquoted one is an undetected
|
|
28
30
|
divergence.
|
|
29
31
|
|
|
30
32
|
- **Doc repos / hosted doc systems this project names:** … (or `none`)
|
|
31
33
|
- **Knowledge wiki:** installed / not installed
|
|
32
34
|
([obsidian-wiki](https://github.com/ar9av/obsidian-wiki); recommended, never a gate)
|
|
35
|
+
- **Retro standing instructions:** `docs/superpowers/retro.md` — none / N in force
|
|
36
|
+
(read **in full**; list which ones bind this run, and stamp each as it fires —
|
|
37
|
+
that date is the only evidence behind stage 10's cold-retirement rule)
|
|
38
|
+
- **Code graph:** built / installed-not-built / not installed
|
|
39
|
+
([graphify](https://github.com/Graphify-Labs/graphify); recommended, never a gate —
|
|
40
|
+
built → its row above carries the build date and stage 9 refreshes it)
|
|
33
41
|
|
|
34
42
|
## Scope
|
|
35
43
|
|
|
@@ -79,7 +87,7 @@ is not neutral — it is a scheduled interruption.
|
|
|
79
87
|
|---|---|---|
|
|
80
88
|
| run-wide | Model for this run | … (most capable available unless overridden; per-stage overrides here) |
|
|
81
89
|
| run-wide | Decide autonomously vs escalate to me | … |
|
|
82
|
-
| 0 Harvest | Doc sources beyond this repo — other repos, hosted docs, the knowledge wiki; and may stage 9 write to them? | … (another repo is outward: propose + PR, never a direct push) |
|
|
90
|
+
| 0 Harvest | Doc sources beyond this repo — other repos, hosted docs, the knowledge wiki, the code graph; and may stage 9 write to them? | … (another repo is outward: propose + PR, never a direct push; graph built / not built) |
|
|
83
91
|
| 1 Docs | External libs/APIs/SDKs in play; any context7 can't resolve → where their docs live | … |
|
|
84
92
|
| 2 Decompose | Platform (several capabilities/surfaces) or one module? If platform — deploy cadence: per module, or once at the end | … |
|
|
85
93
|
| 2–3 Spec | UI verdict (arms super-ux); scenario-tracing waiver, if any | … |
|
|
@@ -92,8 +100,8 @@ is not neutral — it is a scheduled interruption.
|
|
|
92
100
|
| 7 Deploy | Target + path; release automation on/off; deploy-from-main rule | … |
|
|
93
101
|
| 7 Deploy | **Authorization** — standing go, or ask every time? | … |
|
|
94
102
|
| 8 Post-deploy | Where logs / health live (app name, endpoint, workflow) | … |
|
|
95
|
-
| 9 Docs+wiki | Which module docs / runbooks this change updates; wiki sync yes/no; which stale ledger rows get fixed | … |
|
|
96
|
-
| 10 Acceptance | Who signs off; where deferred REQs get tracked (issue tracker / backlog) | … |
|
|
103
|
+
| 9 Docs+wiki | Which module docs / runbooks this change updates; wiki sync yes/no; **code-graph refresh yes/no** (`/graphify . --update`); which stale ledger rows get fixed | … |
|
|
104
|
+
| 10 Acceptance | Who signs off; where deferred REQs get tracked (issue tracker / backlog); **retro file** — `docs/superpowers/retro.md` present? which standing instructions bind this run? | … |
|
|
97
105
|
|
|
98
106
|
> **Deploy authorization has a hard floor.** A standing go counts only if it is
|
|
99
107
|
> **specific** — named target and named preconditions ("staging, once lint and the
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Pipeline retrospective — <project>
|
|
2
|
+
|
|
3
|
+
One file per project, not per run. Written as the **last act of stage 10**:
|
|
4
|
+
prune first, then stamp, then write an entry **only if the run diverged**.
|
|
5
|
+
Doctrine: `references/retrospective.md`.
|
|
6
|
+
|
|
7
|
+
Stage 0 reads *Standing instructions* in full, every run — which is why the list
|
|
8
|
+
has a hard cap of **ten**.
|
|
9
|
+
|
|
10
|
+
## Standing instructions (max 10 — in force right now)
|
|
11
|
+
|
|
12
|
+
Every row is a rule an agent must follow, that **no check can decide**. A rule a
|
|
13
|
+
check *can* decide is not written here: it is written as the check (grade 1).
|
|
14
|
+
No row is accepted without its **retire-when** trigger, written at birth.
|
|
15
|
+
|
|
16
|
+
| id | Born | Instruction | Because (incident) | Retire when | Last fired |
|
|
17
|
+
|---|---|---|---|---|---|
|
|
18
|
+
| R-001 | 2026-05-04 · `<topic>` | … | … (one line, links the log entry) | … (e.g. "the export path is covered by a test") | 2026-06-18 |
|
|
19
|
+
|
|
20
|
+
Retire on **any** of: it became a check · every path/command it names is gone · it
|
|
21
|
+
has not fired in the last five run stamps. At eleven rows, the oldest never-fired
|
|
22
|
+
row goes — the cap is not negotiable, ranking is.
|
|
23
|
+
|
|
24
|
+
## Log — problem → cause → fix (newest first)
|
|
25
|
+
|
|
26
|
+
Retirements are logged here too, one line each: *silent deletion is forbidden; the
|
|
27
|
+
record stays, the instruction leaves.*
|
|
28
|
+
|
|
29
|
+
### 2026-05-04 · `<topic>` · gate 6 reopened twice
|
|
30
|
+
|
|
31
|
+
- **Symptom:** … (one line + evidence — a command, a `file:line`, the gate)
|
|
32
|
+
- **Surfaced at:** stage 6 · **Owned by:** stage 4 (the plan never named the check)
|
|
33
|
+
- **Root cause:** … (why the pipeline permitted it — "the agent was careless" is
|
|
34
|
+
not a cause; it is the absence of one, and it produces no fix)
|
|
35
|
+
- **Fix:** grade 1 (mechanical) — … / grade 2 → `R-00N` / grade 3, expires in
|
|
36
|
+
2 runs
|
|
37
|
+
- **The check:** … (what catches this the first time, from now on)
|
|
38
|
+
- **Upstream?** … (a lesson true in any repo belongs in the skill's own
|
|
39
|
+
`references/learned.md` — open an issue and say so here)
|
|
40
|
+
|
|
41
|
+
### 2026-05-04 · retired R-000 — became a check (`npm run lint:paths`)
|
|
42
|
+
|
|
43
|
+
## Run stamps
|
|
44
|
+
|
|
45
|
+
One line per run, appended at stage 10. This is what makes "five runs" countable
|
|
46
|
+
— without it the cold-rule is a guess and the prune becomes a mood.
|
|
47
|
+
|
|
48
|
+
| Date | Topic | Verdict | Retro |
|
|
49
|
+
|---|---|---|---|
|
|
50
|
+
| 2026-05-04 | `<topic>` | 14/14 verified | 1 entry · 7 standing (was 9) · retired 3 · added 1 |
|
|
51
|
+
| 2026-05-02 | `<topic>` | 9/9 verified | no divergence · 9 standing · retired 0 |
|