task-pipeline-skill 1.33.0 → 1.38.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 +332 -0
- package/CONTRIBUTING.md +66 -0
- package/README.md +23 -0
- package/SKILL-CARD.md +1 -1
- package/cursor/rules/task-pipeline.mdc +34 -9
- package/evals/task-pipeline.evals.json +87 -0
- package/package.json +3 -2
- package/plugins/task-pipeline/.claude-plugin/plugin.json +2 -2
- package/plugins/task-pipeline/commands/task-pipeline.md +167 -56
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +6 -5
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json +133 -21
- package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +12 -5
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +32 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/continuity.md +10 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/exposure.md +8 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/gates.md +18 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +10 -5
- package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +3 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +52 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/portability.md +1 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/progress.md +190 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +90 -4
- package/plugins/task-pipeline/skills/task-pipeline/references/review.md +56 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +123 -12
- package/plugins/task-pipeline/skills/task-pipeline/templates/README.md +1 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/run.md +77 -0
|
@@ -8,12 +8,27 @@ operator's explicit go). These stages (0 intake + 1→10) are the plugin's
|
|
|
8
8
|
`pipeline.schema.json`; a host project replaces it with its own
|
|
9
9
|
stages/agents/types (see SKILL.md → *Bring your own skills*).
|
|
10
10
|
|
|
11
|
-
## The run checklist —
|
|
11
|
+
## The run checklist — printed, not remembered
|
|
12
12
|
|
|
13
|
-
Complex workflows lose steps silently.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
Complex workflows lose steps silently. **The run says where it is**, at two boundaries
|
|
14
|
+
and only two — task start and iteration close ([`progress.md`](progress.md)):
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
task-pipeline vX.Y.Z · <topic> · module <id> «<name>» (N of M)
|
|
18
|
+
0 ✓ 1 ✓ 2 ✓ 3 ▶ 4 · 5 · 6 · 7 · 8 · 9 · 10 ·
|
|
19
|
+
███████░░░░░░░░░░░░░░░░░░░ gates 3/11 · now 3 Spec · manual
|
|
20
|
+
board B-NNN · carry-over N rows · exposure N never · unlooked N
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The rail's positions come from the project's own `pipeline.json`, never from the count
|
|
24
|
+
below — those eleven are this plugin's example flow. Each glyph is read from the
|
|
25
|
+
verdict its gate wrote to `.task-pipeline/run.md`, and from nothing else: a rail
|
|
26
|
+
written from memory is a summary that is confidently wrong exactly where it is trusted
|
|
27
|
+
at a glance.
|
|
28
|
+
|
|
29
|
+
The checklist below is what that rail summarises. This section said *"copy it, tick
|
|
30
|
+
it"* until 2026-08-10 — an instruction with no gate behind it, which is the same
|
|
31
|
+
failure it was written to prevent, one level up.
|
|
17
32
|
|
|
18
33
|
```
|
|
19
34
|
Pipeline progress
|
|
@@ -35,7 +50,7 @@ never that the work was skipped quietly.
|
|
|
35
50
|
|
|
36
51
|
## Contents
|
|
37
52
|
|
|
38
|
-
- The run checklist —
|
|
53
|
+
- The run checklist — printed, not remembered
|
|
39
54
|
- 0 — Intake grill — MANDATORY
|
|
40
55
|
- 1 — Docs study
|
|
41
56
|
- 2 — Brainstorm + decompose
|
|
@@ -86,9 +101,11 @@ never that the work was skipped quietly.
|
|
|
86
101
|
when one is built ([`knowledge-graph.md`](knowledge-graph.md): `graphify query` /
|
|
87
102
|
`affected` / `god-nodes` answer *reach*, which is what grep cannot), `CLAUDE.md`,
|
|
88
103
|
`CONTEXT.md`/ADRs, `docs/` + `docs/ux/`, past pipeline briefs and carry-over
|
|
89
|
-
ledgers, **the retro's standing instructions** (`docs/superpowers/retro.md`,
|
|
90
|
-
**in full** —
|
|
91
|
-
fires
|
|
104
|
+
ledgers, **the retro's standing instructions and run stamps** (`docs/superpowers/retro.md`,
|
|
105
|
+
read **in full** — ten rows and one line per run, both bounded, and they bind this
|
|
106
|
+
run; stamp each instruction as it fires. Its *Recent log* is **queried** by the
|
|
107
|
+
task's nouns, not read: uncapped narrative inside a binding source is what makes the
|
|
108
|
+
capped part get skimmed, [`retrospective.md`](retrospective.md)), the **knowledge wiki** if one is
|
|
92
109
|
installed
|
|
93
110
|
([obsidian-wiki](https://github.com/ar9av/obsidian-wiki) — recommended,
|
|
94
111
|
never required), and any **other repo or hosted doc system the project names as
|
|
@@ -123,6 +140,27 @@ never that the work was skipped quietly.
|
|
|
123
140
|
or they genuinely disagree and that is a decision. There is no fourth option, and
|
|
124
141
|
starting on an unresolved divergence means building against a system that does
|
|
125
142
|
not exist.
|
|
143
|
+
- **Phase 1d — the short-path triage: printed, proposed, never taken silently.** This
|
|
144
|
+
pipeline's own boundary exempts a typo, a one-line fix and a mechanical rename — and
|
|
145
|
+
nothing measured that until 2026-08-10, so the exemption depended on an agent
|
|
146
|
+
remembering it while eleven stages and four manual gates stood in front of a
|
|
147
|
+
one-paragraph edit. Three questions, each with something behind it:
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
1. files the request names, resolved git ls-files -- <paths> -> N
|
|
151
|
+
2. any of them a public contract the version-synced surfaces,
|
|
152
|
+
pipeline.schema.json, the
|
|
153
|
+
command, the README -> yes/no
|
|
154
|
+
3. behaviour a user or a caller observes changes -> yes/no
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Few files, no contract, no observable change ⇒ **propose** the short path: stages 1,
|
|
158
|
+
2, 3 and 4 marked `⊘` with the triage answer as the reason, and 5→10 running
|
|
159
|
+
unchanged. **Propose, never take.** The answer goes in the brief's autonomy sweep and
|
|
160
|
+
silence takes the full flow — the same floor deploy authorization uses. The glyph is
|
|
161
|
+
what makes it safe: a skipped stage is printed on the rail **with its reason**
|
|
162
|
+
([`progress.md`](progress.md)), and a skip nobody can see is indistinguishable from a
|
|
163
|
+
stage that was never entered.
|
|
126
164
|
- **How it runs: [`grill.md`](grill.md)** — the full doctrine, built into this
|
|
127
165
|
skill (nothing to install). In short: one question per turn, a recommended
|
|
128
166
|
answer with each, explore the codebase before asking, depth-first through the
|
|
@@ -170,12 +208,22 @@ never that the work was skipped quietly.
|
|
|
170
208
|
is now stale), no open contradictions, **every
|
|
171
209
|
autonomy-sweep row is answered or explicitly marked "stop and ask here"**, the
|
|
172
210
|
**REQ table is written and every row names its check**, the carry-over ledger is
|
|
173
|
-
seeded,
|
|
211
|
+
seeded, **`.task-pipeline/run.md` exists and the header block has been printed**
|
|
212
|
+
([`progress.md`](progress.md)), the model decision is recorded, and the operator
|
|
213
|
+
confirms the brief. Stop when a
|
|
174
214
|
re-scan surfaces no new branches (don't grill past diminishing returns;
|
|
175
215
|
reversible calls can be deferred with a note). Only then start stage 1.
|
|
176
216
|
- **The verification ledger is read.** `docs/superpowers/verification.md` — the harvest
|
|
177
217
|
quotes **how many rows sit at `never`**, because that is the project's standing
|
|
178
218
|
exposure and stage 0 is where it is cheapest to look ([`verification.md`](verification.md)).
|
|
219
|
+
- **The run ledger is seeded and the header block is printed** — in that order, before
|
|
220
|
+
the first grill question. `.task-pipeline/run.md` from
|
|
221
|
+
[`../templates/run.md`](../templates/run.md) is the record **two** mechanisms already
|
|
222
|
+
depended on and no run had ever written: [`loop-guard.md`](loop-guard.md) calls its
|
|
223
|
+
own churn detection mechanical and reads the `touch:` lines, and
|
|
224
|
+
[`progress.md`](progress.md) derives the rail and the iteration counter from the
|
|
225
|
+
`stage:` and `iter:` lines. The header goes out before the interview because a run
|
|
226
|
+
that announces its position only at the end announced it to nobody.
|
|
179
227
|
- **The board is read, or seeded.** `docs/superpowers/backlog.md` ([`backlog.md`](backlog.md)) — its **open count is quoted in the brief**, measured by a command at the top of the run rather than inherited from the last run's report. Absent ⇒ seeded from the template and said so; an empty board and no board are the same thing to work on, and only one of them can be appended to.
|
|
180
228
|
|
|
181
229
|
## 1 — Docs study
|
|
@@ -256,6 +304,32 @@ never that the work was skipped quietly.
|
|
|
256
304
|
never rebuild from scratch. If the chain already exists and is validated (e.g.
|
|
257
305
|
the task entered from super-ux), just verify (linter green) and embed it into
|
|
258
306
|
the spec; only build the parts that are missing.
|
|
307
|
+
- **COPY track — how it sounds.** Every string a product's user will read is written
|
|
308
|
+
through super-ux's `copywriting`, against the brand pack (`docs/brand/voice.md`,
|
|
309
|
+
`terminology.md`, `facts.md`). No pack ⇒ `/brand-init` **before** the first string,
|
|
310
|
+
not after: a voice reverse-engineered from copy already written is a description of
|
|
311
|
+
what happened, not a decision. In scope: interface strings, errors, empty states,
|
|
312
|
+
the landing, pricing, the user-facing changelog. **Out of scope, and saying so is
|
|
313
|
+
what keeps the track honest:** commit messages, PR descriptions, code comments, a
|
|
314
|
+
developer README, internal docs. Running a brand pack over a line in a contributors'
|
|
315
|
+
changelog is the fastest way to teach an agent to route around the track.
|
|
316
|
+
- **VISUAL track — how it looks.** Where the task has a visual surface, the visual
|
|
317
|
+
layer goes through `sheleg-design` ([`companion-skills.md`](companion-skills.md)):
|
|
318
|
+
tokens and themes, typography and rhythm, motion and how it degrades to rest, the
|
|
319
|
+
boundary with Figma (tokens as variables, never raw values carried across). Not
|
|
320
|
+
through it: a purely structural change — what sits where is the UX track's — text,
|
|
321
|
+
a backend, an internal script.
|
|
322
|
+
- **Each track's refusal is a sentence, never a silence.** *"Без дизайна" / "as is"*
|
|
323
|
+
ends the visual track; *"без бренда" / "draft"* ends the copy track. Either one is
|
|
324
|
+
the operator's to make and costs nothing — but it is **recorded in the brief and
|
|
325
|
+
said out loud in the close-out**, because a track skipped silently and a track that
|
|
326
|
+
ran are the same thing in a transcript. This is the `⊘` rule one layer up: a skip
|
|
327
|
+
nobody can see is indistinguishable from work that happened.
|
|
328
|
+
- **Three tracks, three questions, and they do not substitute for each other.** super-ux
|
|
329
|
+
decides what the interface must **do**; `copywriting` how it **sounds**;
|
|
330
|
+
`sheleg-design` how it **looks**. Until 2026-08-10 this stage named only the first,
|
|
331
|
+
so a run designed a flow, then wrote its strings by taste and picked its values at the
|
|
332
|
+
keyboard — and every gate in the pipeline reported green over both.
|
|
259
333
|
- **Spec:** write the approved design to
|
|
260
334
|
`docs/superpowers/specs/YYYY-MM-DD-<topic>-design.md` and commit it. Lock all
|
|
261
335
|
shared contracts (types, schemas, signatures, file layout). For UI tasks the
|
|
@@ -274,7 +348,11 @@ never that the work was skipped quietly.
|
|
|
274
348
|
(or an explicit v1-mode/tiny-project waiver by the operator). **With Figma on:
|
|
275
349
|
the canonical record names one file, and every `screens.md` frame link carries
|
|
276
350
|
that same `:fileKey`** — a string match, not a judgement; a differing key means
|
|
277
|
-
the run drew in a second file nobody will open.
|
|
351
|
+
the run drew in a second file nobody will open. **Every user-facing string went
|
|
352
|
+
through the COPY track or the refusal is recorded**, and **the visual layer went
|
|
353
|
+
through the VISUAL track or the refusal is recorded** — a recorded refusal passes
|
|
354
|
+
this gate and an unmentioned one does not, which is the only difference that matters.
|
|
355
|
+
No plan (stage 4)
|
|
278
356
|
starts before this — the chain comes BEFORE interface.
|
|
279
357
|
|
|
280
358
|
## 4 — Plan
|
|
@@ -308,6 +386,16 @@ never that the work was skipped quietly.
|
|
|
308
386
|
watch it fail → minimal impl → watch it pass → commit. Pin subagents to the
|
|
309
387
|
run's confirmed model (`model-tiering.md`). The plan's parallel groups fan out
|
|
310
388
|
**only** when each implementer gets its own worktree; otherwise sequential.
|
|
389
|
+
- **Web front end? The task's own surface is checked in a browser, not in the diff.**
|
|
390
|
+
Where `chrome-devtools` is connected ([`companion-skills.md`](companion-skills.md)):
|
|
391
|
+
after a task that changes a rendered surface, load it, take a snapshot and read the
|
|
392
|
+
console and the network log **before the task is marked DONE** — a component can be
|
|
393
|
+
correct and land under a fixed header, and a review of the diff cannot see that.
|
|
394
|
+
Absent, say the surface was verified by reading the diff and treat it as the weaker
|
|
395
|
+
claim it is. Stage 6 repeats this over the whole tree; this one catches it while the
|
|
396
|
+
implementer that wrote it is still dispatched. The matrix pointed this companion at
|
|
397
|
+
stages 5–6 from the day it was added and **this stage had never named it** — found by
|
|
398
|
+
the guard comparing the two, not by a reader.
|
|
311
399
|
- **Integration closes the stage:** sync with the base branch, re-run the full suite
|
|
312
400
|
on the result, land it the project's way (merge, or a PR — outward, so it needs a
|
|
313
401
|
go), remove the worktree. Stages 7–9 act on the integrated result, so a branch the
|
|
@@ -370,6 +458,23 @@ never that the work was skipped quietly.
|
|
|
370
458
|
tagging, the CI verdict for what was just pushed is READ, not assumed**
|
|
371
459
|
([`conventions.md`](conventions.md) → *The CI verdict*) — a tag on a commit whose
|
|
372
460
|
run nobody read is how a red `main` ships.
|
|
461
|
+
- **The independent reader is dispatched by this stage, and read by its output**
|
|
462
|
+
([`review.md`](review.md) → *The independent reader*). On any change that adds or
|
|
463
|
+
widens a check, the run dispatches a reader — a subagent it can watch, a bot whose
|
|
464
|
+
**verdict** it then reads, or a person — and records exactly one of three states
|
|
465
|
+
beside the verdict: `reader: N findings`, `reader: none found`, or `reader: NO READER
|
|
466
|
+
— <why>`. The third is printed, never omitted; a requested reader and a reading are
|
|
467
|
+
different facts that look identical afterwards. Four pull requests of check work once
|
|
468
|
+
merged on a bot's `skipping` with nobody noticing, which is why this is a stage rather
|
|
469
|
+
than a hope.
|
|
470
|
+
- **The review loop that lives here has a cap, and the cap is a measurement**
|
|
471
|
+
([`loop-guard.md`](loop-guard.md) → *The review loop*). **3 rounds** per artifact by
|
|
472
|
+
default (`pipeline.json` → `run.review.maxRounds`); at the cap the run stops reviewing
|
|
473
|
+
and prints new-versus-self-inflicted per round, and either the numbers end it or the
|
|
474
|
+
operator continues it out loud. This stage's loop was capped by nothing until
|
|
475
|
+
2026-08-10 and ran ten rounds twice in one programme, against a stated ceiling of two
|
|
476
|
+
re-entries per stage — the ceiling simply did not name a review round. Every finding
|
|
477
|
+
left open at the cap leaves as a board row with its evidence, never as a shrug.
|
|
373
478
|
|
|
374
479
|
## 8 — Post-deploy
|
|
375
480
|
- **Freedom: medium** — where the logs live varies; 'clean boot or an honest degradation report' does not ([`gates.md`](gates.md) → *Axis C*).
|
|
@@ -545,7 +650,13 @@ never that the work was skipped quietly.
|
|
|
545
650
|
list at or under its cap, every deletion logged in the archive with its commit,
|
|
546
651
|
entries older than five run stamps rotated into `docs/superpowers/retro/`, the run
|
|
547
652
|
stamped with its commit, every SHA in either file resolvable, and the
|
|
548
|
-
counts printed beside this verdict**; **
|
|
653
|
+
counts printed beside this verdict**; **where `pipeline.json` → `retro.publish` is
|
|
654
|
+
set, the skill-level insight is published as an issue on the skill's repository —
|
|
655
|
+
its body printed in full first, the printed string and the sent string being one
|
|
656
|
+
string, and the five redaction rules applied
|
|
657
|
+
([`retrospective.md`](retrospective.md) → *What may leave the project*). Absent, the
|
|
658
|
+
step does not exist and is not asked about: publishing to another repository is an
|
|
659
|
+
outward act and silence authorizes none**; **the documentation gate has been seen
|
|
549
660
|
failing once against a planted defect and its ratchet counts are printed**
|
|
550
661
|
([`gates.md`](gates.md)); **every repository is closed — the parent included:
|
|
551
662
|
`git submodule status` shows no `+`, each repo clean and pushed**; **every check this gate leans on has been seen failing
|
|
@@ -13,6 +13,7 @@ from `super-ux`.
|
|
|
13
13
|
| `carryover.md` | `docs/superpowers/specs/YYYY-MM-DD-<topic>-carryover.md` | 0 seeds, all stages append, 10 reads |
|
|
14
14
|
| `verification.md` | `docs/superpowers/verification.md` | 8 writes a row per shipped REQ, 10 requires it, a human fills `Human` |
|
|
15
15
|
| `backlog.md` | `docs/superpowers/backlog.md` | 0 seeds when absent, any stage appends, 10 resolves and re-derives |
|
|
16
|
+
| `run.md` | `.task-pipeline/run.md` — **git-ignored**, one per run | 0 seeds it, every gate appends a verdict, every repeating pass a `touch:` line |
|
|
16
17
|
| `context.md` | `CONTEXT.md` at the repo root (or per context) | 0 — grill, domain awareness |
|
|
17
18
|
| `adr.md` | `docs/adr/NNNN-<slug>.md` | 0 — grill, hard-to-reverse decisions |
|
|
18
19
|
| `docmap.md` | `docs/DOCMAP.md` — **one per project** | 0 — the documentation inventory |
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Run ledger — `.task-pipeline/run.md`
|
|
2
|
+
|
|
3
|
+
> **One file per run.** Seeded at stage 0, appended by every stage, never rewritten.
|
|
4
|
+
> Two readers depend on it and neither can work from the agent's memory: the skill's
|
|
5
|
+
> `references/loop-guard.md` reads the `touch:` lines to detect churn mechanically, and
|
|
6
|
+
> its `references/progress.md` reads the `stage:` verdicts and the `iter:` count to
|
|
7
|
+
> print the rail.
|
|
8
|
+
>
|
|
9
|
+
> **This file is the run's memory after a compaction.** Everything else about the
|
|
10
|
+
> run's position lives in a context window that will not survive one.
|
|
11
|
+
|
|
12
|
+
Run: `<topic>` · started `<YYYY-MM-DD>` · module map: `<path or "none">`
|
|
13
|
+
|
|
14
|
+
## Lines
|
|
15
|
+
|
|
16
|
+
Append-only. Three shapes, and nothing else belongs here:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
stage: <id> <name> — gate <auto|manual> — verdict <pass|fail|skip> — <ISO-8601>
|
|
20
|
+
iter: <N> — item <B-NNN or task id> — closed at gate <stage id>
|
|
21
|
+
touch: <file> — pass <N> (<stage|round|module>) — reason: <finding id / gate item>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- **`stage:`** — written when a gate **returns**, not when the stage is entered. The
|
|
25
|
+
rail's `✓` is derived from this line and from nothing else; a glyph set from memory
|
|
26
|
+
is a summary that is confidently wrong exactly when it matters.
|
|
27
|
+
- **`iter:`** — one line per iteration closed. The progress line's counter is
|
|
28
|
+
`grep -c '^iter:'`, never a number anyone remembers.
|
|
29
|
+
- **`touch:`** — one line per file per pass, and the reason names **what forced the
|
|
30
|
+
edit**: a finding id, a failed gate item, an operator instruction. *"Cleanup"*,
|
|
31
|
+
*"polish"* and *"while I was there"* are not reasons; they are churn with better
|
|
32
|
+
manners.
|
|
33
|
+
|
|
34
|
+
A `skip` verdict carries its reason on the same line — a skipped stage and a stage
|
|
35
|
+
never entered look identical from outside, and they mean opposite things.
|
|
36
|
+
|
|
37
|
+
## Log
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
stage: 0 Intake — gate manual — verdict pass — 2026-08-10T11:14Z
|
|
41
|
+
iter: 1 — item B-025 — closed at gate 0
|
|
42
|
+
stage: 1 Docs study — gate auto — verdict pass — 2026-08-10T11:31Z
|
|
43
|
+
touch: src/export.ts — pass 1 (stage 5) — reason: TASK-3
|
|
44
|
+
touch: src/export.ts — pass 2 (stage 5) — reason: F-014
|
|
45
|
+
touch: src/export.ts — pass 3 (stage 5) — reason: F-014
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The last two lines are a **trip**: the same file, two consecutive passes, the same
|
|
49
|
+
reason. `references/loop-guard.md` → *Detection* item 2 — the fix did not fix it, or
|
|
50
|
+
the two passes disagree about what *fixed* means. Stop editing and run the break
|
|
51
|
+
protocol; do not dispatch a fourth pass.
|
|
52
|
+
|
|
53
|
+
## Why it is not the build ledger
|
|
54
|
+
|
|
55
|
+
`.task-pipeline/build/<plan>/progress.md` covers **one stage** — stage 5's tasks, and
|
|
56
|
+
whether a task was already dispatched (`references/build.md`). This file
|
|
57
|
+
covers **the run**: stage verdicts, iterations, and every repeating pass anywhere in
|
|
58
|
+
the pipeline, including the loops between stages that the build ledger cannot see.
|
|
59
|
+
|
|
60
|
+
Keeping them separate is deliberate. A run that has no stage-5 work still loops, still
|
|
61
|
+
re-enters stages and still needs a rail — and it would have no ledger at all if the
|
|
62
|
+
run's memory lived inside the build directory that stage 5 deletes.
|
|
63
|
+
|
|
64
|
+
## What closes it, and what survives it
|
|
65
|
+
|
|
66
|
+
**This file is git-ignored** — `.task-pipeline/` is, and this lives inside it. It is
|
|
67
|
+
the run's working memory, not its record: it exists to survive a **compaction**, which
|
|
68
|
+
is a different problem from surviving the run.
|
|
69
|
+
|
|
70
|
+
So stage 10 **reads it and copies out what outlives the run** — the pass counts and
|
|
71
|
+
any loop-guard ruling go into the acceptance file and the retro stamp, which are
|
|
72
|
+
committed. What is not carried out is gone when the directory is cleared, and that is
|
|
73
|
+
the correct outcome for a `touch:` line whose finding has been closed.
|
|
74
|
+
|
|
75
|
+
Never treat it as evidence in a later run. A file that is not in git cannot be quoted
|
|
76
|
+
at a commit, and a claim nobody can navigate to is the thing this repository's
|
|
77
|
+
documentation canon exists to refuse.
|