task-pipeline-skill 1.31.0 → 1.33.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 CHANGED
@@ -1,5 +1,120 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.33.0 — the number, the list, and the command that shows them with no task running
4
+
5
+ Three modules shipped as one, because they are one capability: the index, the list it
6
+ produces, and the command that prints them when nothing else is running.
7
+
8
+ **Exposure is a vector with its components named, never a probability.** The request that
9
+ started this asked for *"the probability of an error"*. It is not computable from these
10
+ inputs, and a number dressed as one is the class this repository has spent its history
11
+ removing — so the guard rejects a `%` on that line outright:
12
+
13
+ ```
14
+ exposure: 99 unverified · never checked · 10 releases carry one
15
+ REQ-001 references/setup.md — the entry audit: when it runs … v1.10.0
16
+
17
+ and 91 more — the full list is `/task-pipeline checkup`
18
+ ```
19
+
20
+ **`never checked`, not `0 days`.** When no row has ever been confirmed — this repo's
21
+ exact state — a zero would read as *checked today*, the precise inversion this pipeline
22
+ exists to prevent. The literal is required by its own guard.
23
+
24
+ **A single score was refused on purpose.** One number invites a threshold, and a
25
+ threshold here is a target on `never`, which `verification.md` says may never have one.
26
+ The components are one line; a reader can hold three.
27
+
28
+ **`/task-pipeline checkup` runs with no task in flight**, which is the whole point:
29
+ accumulated unconfirmed work is invisible precisely because nobody is running a pipeline,
30
+ so a check living only inside a run can never say *stop, fourteen things are
31
+ unconfirmed*. It reads four files this pipeline already keeps and writes nothing unless
32
+ asked — and then only board rows whose `Source` names the checkup, printed before they
33
+ are added.
34
+
35
+ **And `continuity.md` finally names the file it always demanded.** It has required each
36
+ iteration to re-measure the work-list since the beginning, and said *"next up is X"* is
37
+ a claim no gate reads. The board is that list; the claim now cites a `B-NNN`, which can
38
+ be checked, rather than a description, which cannot.
39
+
40
+ **Two defects in the new guard, both self-inflicted and both instructive.** Its needle
41
+ looked for *"never a percentage"* while the doctrine it guards says *"no percentage,
42
+ ever"* — guard and prose written an hour apart, already disagreeing. And the `%` check
43
+ searched for a literal that its own line necessarily contains, so it matched **itself**
44
+ and passed a planted percentage. A detector that matches itself first is checking the
45
+ wrong thing.
46
+
47
+ Guards: 185 → **188**, property checks 8.
48
+
49
+ ## v1.32.0 — the column a machine may not fill
50
+
51
+ Stage 8 already performs the verification trio, reads the CI verdict and opens the
52
+ rendered page. All of it **per run**, none of it accumulating — so *"which features has
53
+ nobody confirmed since they shipped?"* had no artifact to be asked of.
54
+
55
+ `docs/superpowers/verification.md` is one row per shipped REQ, and its point is a single
56
+ column: **`Human` — a date, or the literal `never`.** Nothing else. *"soon"*, *"mostly"*
57
+ and *"looks fine"* are how a column stops being answerable, and this is the one thing in
58
+ the pipeline a machine may not write on your behalf.
59
+
60
+ **`never` is a fact, not a failure.** The count has no floor, no direction, and may
61
+ never be given a target — the moment `never` becomes something to avoid writing, the
62
+ column starts lying and the pipeline loses its only signal about the world outside its
63
+ own checks. One of the new checks is a **property check** proving that filling the
64
+ column does not fail the build: a gate that punishes an honest answer guarantees there
65
+ will not be one.
66
+
67
+ **It keys to the brief, not to the coverage table**, and that was a measurement rather
68
+ than a preference. Ten acceptance files here carry their first REQ-bearing table in
69
+ nearly as many shapes, because `acceptance.md` fixes it in prose — the same drift the
70
+ carry-over ledger reached with six header shapes. Eight of nine briefs carry
71
+ machine-readable `| REQ-NNN |` rows; the ninth was this programme's own brief, fixed the
72
+ day it was measured. That the coverage table has no template is a real finding with a
73
+ real cost, and it is on the board rather than fixed here.
74
+
75
+ Both directions, because they are different failures: a shipped REQ that entered no
76
+ ledger, and a ledger row about a requirement no brief carries.
77
+
78
+ **Seeded truthfully: 103 rows, every one `never`.** Thirty-one versions shipped, and not
79
+ one recorded instance of a person confirming a shipped requirement afterwards. That is
80
+ not a new problem — it is the first time it can be stated.
81
+
82
+ **Review round: N1's lesson carried forward by its wrong half.** The Human check
83
+ scanned *every* cell for a date or `never`, so a bare date sitting in the Note column
84
+ satisfied a row whose Human read *"soon"* — precisely the prose the guard exists to
85
+ reject. N1 concluded *"the header names the candidate columns and the match happens
86
+ inside them"*, not *"never look at columns"*; this file is templated and has exactly one
87
+ shape, so the column is located by name and read alone.
88
+
89
+ **A file that states one truth twice, and drifted for two modules.** `artifacts.md`
90
+ carries an ASCII layout tree *and* the tables that name the same files — and the tree
91
+ never gained `backlog.md` (shipped in v1.31.0) or `verification.md` (this release), both
92
+ named in tables a hundred lines above it. A reader found it; nothing compared them. The
93
+ tree is now computed against those tables.
94
+
95
+ The seeded ledger also truncated its `What` column at 72 characters, leaving unterminated
96
+ code spans, while the template it follows says *"copied from the brief, not re-worded"* —
97
+ sixty-seven of a hundred and three rows landing at exactly 72 is a script's fingerprint,
98
+ not an editor's. Reseeded in full: 26 to 246 characters, none at 72.
99
+
100
+ **The ledger recorded unbuilt features as shipped and verified.** The seed took every
101
+ REQ from every brief — including this programme's own, whose REQ-004/008/009/010 belong
102
+ to modules that do not exist yet, and whose N2 rows were stamped with N1's version. In
103
+ the file whose entire purpose is *what actually shipped*. Reseeded: **99 rows**, four
104
+ omitted as not yet built, each module stamped with its own release.
105
+
106
+ **And the count is printed.** It was computed and dropped on the floor for a release — a
107
+ measurement nobody surfaces is the same silence as no measurement:
108
+
109
+ ```
110
+ verification: 99 shipped REQ · 99 never confirmed by a person (disclosure — no floor, no target)
111
+ ```
112
+
113
+ Ninety-nine shipped requirements, not one confirmed by a person. That is the answer to a
114
+ question this repository could not previously ask.
115
+
116
+ Guards: 175 → **185**, property checks 4 → 8.
117
+
3
118
  ## v1.31.0 — the board, and the pointer that was never the one dangling
4
119
 
5
120
  The carry-over ledger has always offered `backlog` as a home for a deferred row — a
package/CONTRIBUTING.md CHANGED
@@ -386,7 +386,26 @@ different cell per file and pass open rows in silence. Reading by name was the f
386
386
  design and it was wrong for the same reason.
387
387
  *(guard: `with no board id` and `names no Source`)*
388
388
 
389
- **45. Every invariant above names the guard that enforces it, and that guard exists.**This list claims to be *what the validator enforces*; it was eight guards behind when
389
+ **45. Every shipped REQ has a verification row, and `Human` is a date or `never`.**
390
+ `docs/superpowers/verification.md` records the one thing no check can decide — whether a
391
+ person looked after it shipped. Both directions: a shipped REQ with no row, and a row
392
+ whose REQ is in no brief. It keys to the brief because eight of nine briefs carry
393
+ machine-readable REQ rows while ten acceptance files carry their coverage table in nearly
394
+ as many shapes. **The `never` count has no floor and may never be given a target**; a
395
+ property check proves that filling the column does not fail the build, because a gate
396
+ that punishes an honest answer will not receive one.
397
+ *(guard: `either a date or the literal` and `is in no brief's REQ table`)*
398
+
399
+ **46. Exposure prints as a named vector and never as a probability.** The request that
400
+ produced it asked for `P(defect)`; it is not computable from these inputs, and a single
401
+ score invites a threshold, which is a target on `never` — the one thing the verification
402
+ ledger says may never have one. A `%` on that line fails the build. Where no row has ever
403
+ been confirmed the line prints the literal `never checked`, because `0 days` reads as
404
+ *checked today*. The doctrine carries both rules where a reader proposing a percentage
405
+ will find them.
406
+ *(guard: `may never take` and `carry it where the next reader looks`)*
407
+
408
+ **47. Every invariant above names the guard that enforces it, and that guard exists.**This list claims to be *what the validator enforces*; it was eight guards behind when
390
409
  an audit measured it. A claim of enforcement is now checked like any other claim.
391
410
  *(guard: `whose message does not appear in`)* — and a cited literal must lie inside
392
411
  a **single** string in `test/validate.py`: the check reads that file as text, so a
package/README.md CHANGED
@@ -130,6 +130,8 @@ until it is installed.
130
130
  | any loop | [`loop-guard.md`](plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md) — churn detection, caps, the break protocol |
131
131
  | run-wide pacing | [`continuity.md`](plugins/task-pipeline/skills/task-pipeline/references/continuity.md) — the loop mode (`run.loop`, default off, never collapses a manual gate) and the context budget (fires on a harness signal, never on an estimate) |
132
132
  | the board between runs | [`backlog.md`](plugins/task-pipeline/skills/task-pipeline/references/backlog.md) — the work-list that outlives a run: seeded at stage 0 or picked up, priority **computed** from three stated inputs rather than assigned, and the seam where the carry-over ledger's `backlog` pointer finally resolves |
133
+ | what a human confirmed | [`verification.md`](plugins/task-pipeline/skills/task-pipeline/references/verification.md) — one row per shipped REQ and the one column a machine may not fill: the date somebody **looked**, or `never`. No floor, no target — `never` is a fact, and a count driven down is a column that has started lying |
134
+ | how much is unconfirmed | [`exposure.md`](plugins/task-pipeline/skills/task-pipeline/references/exposure.md) — the unconfirmed count as a **vector with its components named**, never a percentage: `P(defect)` is not computable from these inputs and a single score invites a threshold, which is a target on `never`. Plus the check-list, oldest first, and the `/task-pipeline checkup` mode that prints it with no task in flight |
133
135
  | 0 + 9 + any settled decision | [`documentation.md`](plugins/task-pipeline/skills/task-pipeline/references/documentation.md) — the inventory, registers and ids, SSOT, the Doc Loop, supersede semantics, the propagation matrix, intent vs as-built |
134
136
  | 3 + 4 · every spec and plan | the self-review reads its rules back — is every named check real, does anything contradict a locked decision or a rejected option, and what does this cost now versus at design time. Answers land as a committed `## Self-review` of computed numbers |
135
137
  | 6–10 + any check you write | [`gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) — the three axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors |
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.31.0 |
15
+ | **Version** | 1.33.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` |
@@ -174,6 +174,11 @@ Seed a **carry-over ledger** next to the brief, append-only. Anything deferred,
174
174
  dropped, or left half-done goes in the moment it's said — including implementer
175
175
  concerns and non-blocking review findings. **Deferred out loud is forgotten.**
176
176
 
177
+ Read **the verification ledger** — `docs/superpowers/verification.md` — and quote how
178
+ many rows sit at `never`: that is the project's standing exposure, and stage 0 is where
179
+ it is cheapest to look. `never` is a fact, not a failure; the count has no floor and may
180
+ never be given a target.
181
+
177
182
  Read **the board** — `docs/superpowers/backlog.md`, the project's work-list *between*
178
183
  runs — and quote its open count in the brief; seed it from the template when absent. Its
179
184
  priority is **computed, never assigned**: `prio = sev × blast + age_bonus`, with the
@@ -341,6 +346,10 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
341
346
  per project, not per run**. Every gate above is good at *this* run and blind
342
347
  across runs: the same class of failure gets caught, fixed and forgotten five
343
348
  times and nothing notices it is the same one. So, in this order —
349
+ **0a. Every REQ this run shipped has a verification row**, and every row names a
350
+ REQ some brief carries — both directions, because a shipped feature that entered no
351
+ ledger and a ledger row about nothing are different failures.
352
+
344
353
  **0. Resolve the ledger onto the board first.** Every carry-over row still
345
354
  `open`, `unresolved`, or homed `backlog` leaves with a `B-NNN` id on
346
355
  `docs/superpowers/backlog.md`, and the ledger row is updated to name it — both
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeline-skill",
3
- "version": "1.31.0",
3
+ "version": "1.33.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 must close with evidence, a loop guard that breaks churn, one provider-agnostic model confirmed up front, and an optional super-ux UX track for user-facing work.",
5
- "version": "1.31.0",
5
+ "version": "1.33.0",
6
6
  "author": {
7
7
  "name": "ssheleg",
8
8
  "url": "https://x.com/sshlg93"
@@ -30,7 +30,7 @@ grill's **domain awareness** (challenge terms against `CONTEXT.md`, sharpen fuzz
30
30
  language, ADRs for hard-to-reverse calls) and covering the **autonomy sweep** (what
31
31
  would otherwise stop stages 1→10: docs sources incl. doc repos, the wiki and the code graph, branch/tracker
32
32
  policy, test and lint commands, deploy target and authorization, log locations, docs/wiki/graph targets, and for UI tasks whether the design is done visually in Figma or text-only, whether the Figma MCP is connected, and — if it isn't — whether to ship text-only or stop and connect it, since the UX chain degrades on its own and never blocks; **and with Figma on, the design destination: which team/org by name and which file** — the recorded one, a URL the operator gives, or creation in that named team explicitly authorized, written into the project's canonical record before the first frame, because a destination decided at drawing time is how a project ends up with three design files and no way to tell which is real. **Never create while a recorded file resolves; if it doesn't resolve, stop and ask — never create a replacement**) —
33
- until the brief is locked — including the **REQ table**, the request as an addressable list where every row names how it is verified — so the rest runs autonomously and the final stage can account for all of it. The list is frozen: adding is free, removing needs the operator's agreement. Anything deferred goes into the carry-over ledger the moment it's said, and **the board** (`docs/superpowers/backlog.md`, `references/backlog.md`) — the work-list between runs — is read at stage 0 with its open count quoted in the brief, or seeded when absent. For any user-facing task, recommend/use
33
+ until the brief is locked — including the **REQ table**, the request as an addressable list where every row names how it is verified — so the rest runs autonomously and the final stage can account for all of it. The list is frozen: adding is free, removing needs the operator's agreement. Anything deferred goes into the carry-over ledger the moment it's said, and **the board** (`docs/superpowers/backlog.md`, `references/backlog.md`) — the work-list between runs — is read at stage 0 with its open count quoted in the brief, or seeded when absent; **the verification ledger** (`docs/superpowers/verification.md`, `references/verification.md`) is read at stage 0 for how many rows sit at `never`, written at stage 8 with one row per shipped REQ, and required at stage 10 in both directions. For any user-facing task, recommend/use
34
34
  **super-ux**. **If the brief describes a platform rather than a change**, stage 2 also cuts it into modules (`references/decomposition.md`) — module map committed, walking skeleton first, every REQ in exactly one module — and stages 3→10 then run per module, one brick at a time. **If any loop starts undoing an earlier pass** (same file edited twice for the same reason, a closed finding returning, a third entry into one stage), stop and run the loop guard (`references/loop-guard.md`): name both shapes, escalate to the layer that owns the conflict, re-plan the check as an ordered list, then go item by item. **The closing stage opens with the ladder walk** (`references/audit.md`): the REQ table finds what was named and lost, but a comparison needs two sides and an absence has one — so walk each REQ bottom-up through its rungs (decision → spec section → contract *and its failure behavior* → task → change → executed test → surface/docs), check the seam at each step, order findings by seam rather than by file, and turn every absence into a new REQ row **before** the coverage table is written. A green from a check nobody has watched fail against a planted defect is not evidence; a finding class seen twice becomes a script rather than a third ledger row; and every ledger row still `open`, `unresolved` or homed `backlog` leaves stage 10 with a board id and the board's priorities are re-derived (`references/backlog.md`); the carry-over ledger's counts are printed beside every gate verdict, so "green" never reads as "verified". If a searching pass starts finding mostly what the previous pass's own fixes broke, the axis is exhausted — rotate it, don't look harder. **The docs stage closes three artifacts, not two:** module docs, the wiki, **and the code graph** (`/graphify . --update` where `graphify-out/` exists — `references/knowledge-graph.md`), because the graph is what the next run's harvest queries first and a stale one is a false premise carrying the authority of a machine. Then check the graph against the docs: a hub `graphify god-nodes` reports that no document names is an undocumented seam; an edge the docs deny is a leak in the code or a lie in the docs; a doc naming a module the graph no longer has is stale. Doc-side findings are fixed there, absences become REQ rows in the closing stage. **In a project of several repositories, stage 10 closes on the parent too:** a parent records each submodule as a pointer to one commit, and moving the submodule does not move the pointer — so the work can be committed, pushed and green while a clone of the parent still gets the commit before it. Neither repo looks wrong alone, which is why it survives every check that runs inside one. Require `git submodule status` with no line starting `+`, and every repo clean and pushed (`git -C <repo> status --porcelain`, `git -C <repo> log @{u}..HEAD`). The fix is two commands and the second gets forgotten: push the submodule, then `git add <submodule> && git commit`. **The run's last act is the retrospective** (`references/retrospective.md` → `docs/superpowers/retro.md`, one file per project): **stamp the run first** (its commit is what makes the cold-retirement trigger computable), **then prune** — every standing instruction against its three retirement triggers (it became a check; the paths/commands it names are gone; it hasn't fired in five run stamps, or in sixty days — the calendar is the unit that still moves when the stamp counter has stopped), the list held to a hard cap of ten, every deletion logged as one line and never silent — then, only if the run diverged, write the entry: symptom with evidence, the stage it surfaced at, the stage that *owned* it, the root cause, the fix by grade (mechanical check > standing instruction > note that expires in two runs), and the check that catches it next time. Stage 0 reads those standing instructions in full, so the prune is a gate criterion, not a good intention: a rule nobody reads to the end is worse than no rule, because everyone believes it is covered. Honor every stage gate by its type (`auto` = verify yourself;
35
35
  `manual` = wait for explicit go). Confirm the **model once at preflight** —
36
36
  recommend the most capable one the environment offers, never a hardcoded id — then
@@ -44,6 +44,17 @@ Idempotent entry — inspect state first, never restart blindly:
44
44
  - Otherwise, begin at stage 0 (intake grill). If no task is given above, the
45
45
  grill's first question asks the operator for the task in one line.
46
46
 
47
+ **`/task-pipeline checkup`** — **runs with no task in flight, and that is the point.**
48
+ Accumulated unconfirmed work is invisible precisely because nobody is running a pipeline,
49
+ so a check living only inside a run can never say *"stop, fourteen things are
50
+ unconfirmed."* It takes no brief, opens no grill, and writes nothing on its own. Four
51
+ sections, each read from a file this pipeline already keeps: the **exposure** line with
52
+ its check-list oldest-first, the **board**'s open rows by computed priority, the
53
+ carry-over ledgers' unresolved count, and the code graph's staleness where one exists.
54
+ Where you ask it to file what it found, it appends board rows whose `Source` names the
55
+ checkup and its date — printing what it would add first, never silently. Doctrine:
56
+ `references/exposure.md`.
57
+
47
58
  **`/task-pipeline setup`** — the entry audit instead of a feature. Runs seven passes
48
59
  over the documentation this project already has, reports findings as `file:line` + the
49
60
  minimal fix ordered by seam, and hands back a fix plan the pipeline can run. Offered
@@ -69,6 +69,8 @@ gate stops until it is installed.
69
69
  | any repeating loop | [`references/loop-guard.md`](references/loop-guard.md) |
70
70
  | run-wide · how a run keeps going (the loop mode + the context budget) | [`references/continuity.md`](references/continuity.md) |
71
71
  | run-wide · the work-list **between** runs, and how its priority is computed | [`references/backlog.md`](references/backlog.md) |
72
+ | run-wide · whether a **human** ever confirmed what shipped, and when | [`references/verification.md`](references/verification.md) |
73
+ | run-wide · how much unconfirmed work has piled up, and what to look at first | [`references/exposure.md`](references/exposure.md) |
72
74
 
73
75
  **Optional bridge.** If the operator already runs an equivalent skill set (e.g.
74
76
  `superpowers:brainstorming` / `writing-plans` / `subagent-driven-development` /
@@ -205,10 +205,15 @@ GATE 10 acceptance: PASS — 14/14 REQ verified
205
205
 
206
206
  All of:
207
207
 
208
- 1. **The ladder walk ran** ([`audit.md`](audit.md)) every REQ's rungs checked
208
+ 1. **Every shipped REQ has a verification row, and every row names a REQ its own run
209
+ carries** ([`verification.md`](verification.md)) — both directions, because a shipped
210
+ feature that entered no ledger and a ledger row about nothing are different failures.
211
+ The row's `Human` is a date or the literal `never`; `never` is a **fact** and its
212
+ count has no floor, no direction and never a target.
213
+ 2. **The ladder walk ran** ([`audit.md`](audit.md)) — every REQ's rungs checked
209
214
  bottom-up, findings ordered by seam, absences turned into REQ rows **before**
210
215
  the table was written, and the two pass counts recorded.
211
- 2. **Every check this gate leans on has been seen failing** at least once against a
216
+ 3. **Every check this gate leans on has been seen failing** at least once against a
212
217
  planted defect (`audit.md` → *Exit criterion*; the procedure, with the commands,
213
218
  is [`gates.md`](gates.md) → *Probing*). An unproven check's green is not
214
219
  evidence. That includes **the documentation gate** the project's doc map names
@@ -216,12 +221,12 @@ All of:
216
221
  is *proven*, and its **ratchet counts are printed beside this verdict**. A
217
222
  documentation gate is the easiest one in a run to inherit unproven, because it
218
223
  was green the first time anyone looked at it.
219
- 3. **Every REQ has a status** — none `unknown`, none blank.
220
- 4. **Every `verified` carries evidence** of the kind above.
221
- 5. **Every `partial` names what's missing** and where it's tracked.
222
- 6. **Every `deferred` / `dropped` has the operator's agreement** recorded (in the
224
+ 4. **Every REQ has a status** — none `unknown`, none blank.
225
+ 5. **Every `verified` carries evidence** of the kind above.
226
+ 6. **Every `partial` names what's missing** and where it's tracked.
227
+ 7. **Every `deferred` / `dropped` has the operator's agreement** recorded (in the
223
228
  ledger or here) and, for `deferred`, a tracker entry.
224
- 7. **No carry-over row is left `unresolved`** — every one has a home, and the
229
+ 8. **No carry-over row is left `unresolved`** — every one has a home, and the
225
230
  ledger's counts are printed with this verdict, not just filed.
226
231
  7a. **Both disclosures are printed** ([`gates.md`](gates.md) → *Disclosures*):
227
232
  `abstained` — every REQ closing `partial`, every `unknown`, every ⚠️ *cannot verify
@@ -230,11 +235,11 @@ All of:
230
235
  a movement either way wants one sentence. A run reporting `abstained: 0` is claiming
231
236
  it knew everything, which is a stronger statement than any run this stage has ever
232
237
  seen close honestly.
233
- 8. **Every repository is closed, the parent included** — `git submodule status`
238
+ 9. **Every repository is closed, the parent included** — `git submodule status`
234
239
  shows no `+`, and each repo is clean and pushed. A submodule is finished when
235
240
  its parent points at it.
236
- 9. **The operator answers the closing question** and signs off.
237
- 10. **The retrospective is written** ([`retrospective.md`](retrospective.md)) — **in
241
+ 10. **The operator answers the closing question** and signs off.
242
+ 11. **The retrospective is written** ([`retrospective.md`](retrospective.md)) — **in
238
243
  order**: the run is stamped with its commit first, **then** the prune runs before
239
244
  anything is added (standing instructions checked against their retirement triggers,
240
245
  the list at or under its cap of ten, every deletion logged), **then** a run that
@@ -25,6 +25,8 @@ docs/
25
25
  NNNN-<slug>.md # the OTHER permitted decision home — one project uses ONE
26
26
  superpowers/
27
27
  retro.md # stage 10's last act — ONE per project, not per run
28
+ backlog.md # the work-list BETWEEN runs — read at 0, resolved at 10
29
+ verification.md # one row per shipped REQ; `Human` is a date or `never`
28
30
  retro/YYYY-QN.md # the archive: rotated entries + retirements, queried not read
29
31
  specs/
30
32
  YYYY-MM-DD-<topic>-brief.md # stage 0 — locked intake brief (grill output)
@@ -76,7 +78,7 @@ whatever the context happens to hold.
76
78
 
77
79
  | Stage | Reads | From where |
78
80
  |---|---|---|
79
- | **0 Harvest** | the project's own knowledge about this task | code · the code graph (`graphify-out/`) · `CLAUDE.md`/`AGENTS.md` · `CONTEXT.md`/`docs/adr/` · `docs/` + `docs/ux/` · past briefs and carry-over ledgers · **the board** (`docs/superpowers/backlog.md`, open count quoted in the brief) · the retro's standing instructions **in full** · the wiki · any doc repo or hosted system the project names |
81
+ | **0 Harvest** | the project's own knowledge about this task | code · the code graph (`graphify-out/`) · `CLAUDE.md`/`AGENTS.md` · `CONTEXT.md`/`docs/adr/` · `docs/` + `docs/ux/` · past briefs and carry-over ledgers · **the board** (`docs/superpowers/backlog.md`, open count quoted in the brief) · **the verification ledger** (`docs/superpowers/verification.md`, how many rows sit at `never`) · the retro's standing instructions **in full** · the wiki · any doc repo or hosted system the project names |
80
82
  | **0 Inventory (1b)** | the documentation regime | `docs/DOCMAP.md` — registers, single homes, propagation matrix, gate commands, ratchet floors. Absent ⇒ seeded ([`adoption.md`](adoption.md)) |
81
83
  | **0 Reconcile (1c)** | intent vs as-built | git (how it *should* be) against the run record (how it *turned out*) |
82
84
  | **0 Grill** | the operator | the interview — every answer checked against the harvest, which is what makes it checkable rather than confident |
@@ -100,6 +102,7 @@ that has not read them is running the pipeline's defaults, not this project's.
100
102
  |---|---|---|---|
101
103
  | `CLAUDE.md` / `AGENTS.md` | commands, deploy path, house rules, which docs exist and where | 0 | 6–10 |
102
104
  | `docs/DOCMAP.md` | the decision home, each fact's single home, the propagation matrix, the gate and its ratchet floors | 0 (1b) | 9 |
105
+ | `docs/superpowers/verification.md` | one row per shipped REQ, and the one column a machine may not fill: the date a **human** confirmed it, or `never` ([`verification.md`](verification.md)) | 0 | written at 8, required at 10 |
103
106
  | `docs/superpowers/backlog.md` | the project's work-list **between** runs — ids, the three priority inputs, state. Mutable; rows leave only into its *Closed* list ([`backlog.md`](backlog.md)) | 0 | re-derived at every iteration's end; resolved at 10 |
104
107
  | `docs/superpowers/retro.md` | standing instructions — the rules no check can decide. Capped at ten, **read in full**, stamped the moment one fires | 0 | pruned at 10 |
105
108
  | `specs/<topic>-brief.md` → *Autonomy* | every pre-resolved decision; stages 1→10 **answer from it instead of asking** | 0 | 1–10 |
@@ -125,6 +128,7 @@ them is a finding, not a tie-break ([`knowledge-sources.md`](knowledge-sources.m
125
128
  | 0 Inventory | `docs/DOCMAP.md` + the registers + `scripts/check-docs.sh` — seeded **only when absent**, and the seeding is the register's first entry ([`documentation.md`](documentation.md)) | every later stage; **stage 9** walks the matrix, **stage 10** proves the gate |
126
129
  | 0 Grill (domain) | `CONTEXT.md`, `docs/adr/NNNN-<slug>.md` — created **lazily**, only when a term resolves or a decision qualifies. Where `docs/adr/` **is** the register, entries carry the register's field set | stages 2–4 + the repo |
127
130
  | any stage | a register entry per settled thing, via the **Doc Loop** — recorded, resolved, propagated, committed with its id | the next run's harvest |
131
+ | 8 Verification row | `docs/superpowers/verification.md` — one row per REQ the run shipped, written right after the deploy verification; `Human` starts at `never` ([`verification.md`](verification.md)) | stage 10 requires it; stage 0 of every later run reads it |
128
132
  | 10 Board resolution | `docs/superpowers/backlog.md` — every unresolved ledger row — homed `backlog` or still `open` — arrives with a real id, and the ledger row is updated to name it; priority re-derived ([`backlog.md`](backlog.md)) | the next run's harvest, and every loop iteration |
129
133
  | 10 Retro rotation | `docs/superpowers/retro/YYYY-QN.md` — entries older than five stamps, plus every retirement, each with its commit | queried by a later run's harvest |
130
134
  | 2 Decompose | `specs/<topic>-modules.md` — module map, build order, contracts, per-module status (platforms only) | stages 3–10, every module's run |
@@ -129,9 +129,16 @@ works a stale board for as long as the loop runs. One command, at the top of the
129
129
  iteration, recorded ([`knowledge-sources.md`](knowledge-sources.md) → *Carried-in
130
130
  claims*; [`learned.md`](learned.md) rule 16).
131
131
 
132
+ **The work-list is `docs/superpowers/backlog.md`** ([`backlog.md`](backlog.md)), and the
133
+ other half of the same measurement is the exposure line ([`exposure.md`](exposure.md)).
134
+ Counted at the top of the iteration, re-derived at the bottom — `age` moves on its own,
135
+ so the re-derivation is the only moment the board stops being stale.
136
+
132
137
  This is also where a loop's report goes wrong most quietly. *"Next up is X"* at the
133
138
  end of an iteration is a claim about the board, and it is the one sentence in the
134
- whole cycle that no gate reads. It cites the measurement or it is not written.
139
+ whole cycle that no gate reads. It cites the measurement or it is not written — **a
140
+ `B-NNN`, not a description**: *"next up: B-014"* can be checked against the file,
141
+ *"next up: the export fix"* cannot.
135
142
 
136
143
  ## Parked at a manual gate
137
144
 
@@ -0,0 +1,103 @@
1
+ # Exposure — how much unverified work has piled up, and what to look at
2
+
3
+ **One job: turn the verification ledger into a number somebody can act on, without
4
+ pretending it is a probability.**
5
+
6
+ [`verification.md`](verification.md) records whether a person ever confirmed each shipped
7
+ REQ. This file turns that record into the line printed beside every verdict, and into the
8
+ list `/task-pipeline checkup` hands an operator.
9
+
10
+ ---
11
+
12
+ ## Contents
13
+
14
+ - Why it is not a probability
15
+ - The components, each named
16
+ - The check-list, and how it is ordered
17
+ - `/task-pipeline checkup`
18
+ - What the loop does with it
19
+ - Rationalizations
20
+
21
+ ## Why it is not a probability
22
+
23
+ The request that produced this file asked for *"the probability of an error"*. That is
24
+ not computable from these inputs, and a number presenting itself as `P(defect)` is the
25
+ false-success class this repository has spent its whole history removing: an estimate
26
+ wearing a measurement's clothes.
27
+
28
+ **So no percentage, ever** — the guard rejects a `%` on the exposure line. What ships is
29
+ a **vector with its components named**, and the reason is not fussiness: a single score
30
+ invites a threshold, and a threshold here is a target on `never`, which is the one thing
31
+ [`verification.md`](verification.md) says may never have one.
32
+
33
+ It could become a real probability later. `verification.md` is exactly the journal that
34
+ would make calibration possible after enough runs carry both a confirmation date and a
35
+ defect. Until then it is named honestly.
36
+
37
+ ## The components, each named
38
+
39
+ ```
40
+ exposure: 99 unverified · never checked · 31 releases since the last human confirmation
41
+ ```
42
+
43
+ - **unverified** — rows whose `Human` reads `never`.
44
+ - **since** — days since the newest `Human` date. When **no** row has ever been
45
+ confirmed, this prints the literal **`never checked`**, not `0 days`: zero would read
46
+ as *checked today*, which is the opposite of the truth and exactly the kind of quiet
47
+ inversion this pipeline exists to prevent.
48
+ - **releases** — tags cut since that date, or since the first shipped row when there is
49
+ no date. It is the component an operator feels: *"how much has gone out on top of
50
+ something nobody looked at."*
51
+
52
+ Every component is derived from files in the repository. None is estimated.
53
+
54
+ ## The check-list, and how it is ordered
55
+
56
+ The list is the deliverable — a number without it tells somebody they have a problem and
57
+ not where. Ordered by what the repository can defend:
58
+
59
+ 1. **Oldest first**, by `Shipped in`. The longest-unconfirmed row is the one whose
60
+ context is most gone, and whose author is least likely to remember it.
61
+ 2. **Tie-broken by blast radius** where the board carries a row for it, reusing
62
+ [`backlog.md`](backlog.md)'s own stated input rather than inventing a weight here.
63
+
64
+ No third factor. A ranking with an unstated input is the hand-assigned priority the board
65
+ already refuses.
66
+
67
+ ## `/task-pipeline checkup`
68
+
69
+ A **mode of the command**, like `setup` — not a new command, because a second command
70
+ costs every surface a command touches and this repository has learned what that means.
71
+
72
+ **It runs with no task in flight, and that is the point.** Accumulated unverified work is
73
+ invisible *precisely because nobody is running a pipeline*; a check that only exists
74
+ inside a run can never say *"stop, fourteen things are unconfirmed."* So it takes no
75
+ brief, opens no grill, and writes nothing on its own.
76
+
77
+ It prints four sections, each read from a file this pipeline already keeps: the exposure
78
+ line and its check-list, the board's open rows by computed priority, the carry-over
79
+ ledgers' unresolved count, and the code graph's staleness where one exists.
80
+
81
+ **Where the operator asks it to file findings**, it appends board rows whose `Source`
82
+ names the checkup and its date — so a row a machine created is distinguishable from one a
83
+ run surfaced. It prints what it would add first. Never silently.
84
+
85
+ ## What the loop does with it
86
+
87
+ [`continuity.md`](continuity.md) has always required each iteration to re-measure the
88
+ work-list, and said that *"next up is X"* is a claim about the board that no gate reads.
89
+ [`backlog.md`](backlog.md) is that board; the exposure line is the other half of the same
90
+ measurement, and both are read at the top of an iteration and re-derived at the bottom.
91
+
92
+ An iteration that reports what it will do next **cites the file**: `B-014`, not *"the
93
+ export fix"*.
94
+
95
+ ## Rationalizations
96
+
97
+ | The excuse | What is actually true |
98
+ |---|---|
99
+ | "Give me one number, I'll decide the threshold" | The threshold would be a target on `never`, and the column would start lying within a week. The components are one line; read them. |
100
+ | "A percentage is easier to communicate" | It is easier to communicate because it says more than is known. That is the whole objection. |
101
+ | "The check-list is long, just show the top three" | Then the fourth is never checked and nobody knows it exists. Print it all; the operator can stop reading. |
102
+ | "Checkup duplicates stage 8" | Stage 8 verifies **this run's** deploy. Checkup asks what has accumulated across all of them, which no stage is ever in a position to ask. |
103
+ | "We'll run checkup when something breaks" | After a break you know where to look. The list exists for before. |
@@ -55,6 +55,8 @@ a row pointing outside the bundle is the defect this file exists to catch.
55
55
  | **The run mode** — item-by-item pacing, default off, what it never collapses | `references/continuity.md` |
56
56
  | **The context budget** — the evidence rule and what a flush actually updates | `references/continuity.md` |
57
57
  | **The board** — the work-list between runs, its computed priority, and the ledger seam it resolves | `references/backlog.md` |
58
+ | **The verification ledger** — what shipped, and whether a human ever confirmed it | `references/verification.md` |
59
+ | **Exposure** — the unconfirmed count as a named vector, never a probability, and the `checkup` mode | `references/exposure.md` |
58
60
  | The retro: prune, cap, commits, archive | `references/retrospective.md` |
59
61
  | Rules earned by failure | `references/learned.md` |
60
62
  | **The routing default and its boundary** | `templates/routing-rule.md` |
@@ -173,6 +173,9 @@ never that the work was skipped quietly.
173
173
  seeded, the model decision is recorded, and the operator confirms the brief. Stop when a
174
174
  re-scan surfaces no new branches (don't grill past diminishing returns;
175
175
  reversible calls can be deferred with a note). Only then start stage 1.
176
+ - **The verification ledger is read.** `docs/superpowers/verification.md` — the harvest
177
+ quotes **how many rows sit at `never`**, because that is the project's standing
178
+ exposure and stage 0 is where it is cheapest to look ([`verification.md`](verification.md)).
176
179
  - **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.
177
180
 
178
181
  ## 1 — Docs study
@@ -393,6 +396,12 @@ never that the work was skipped quietly.
393
396
  steps — never silent success. **The CI verdict is one of the reported facts, with
394
397
  its run id** — "CI is green" written without a command behind it prints the same
395
398
  whether it looked or not ([`gates.md`](gates.md) → *False success*).
399
+ - **Write the verification row.** One line per REQ this run shipped, into
400
+ `docs/superpowers/verification.md` ([`verification.md`](verification.md)) — the run,
401
+ the tag or commit it went out in, what the gate said, and `Human: never` unless the
402
+ operator confirmed during the run. The verification above already happened; this is
403
+ the only step that makes it answerable **later**, and `never` is a fact rather than a
404
+ failure — the count has no floor and may never be given a target.
396
405
 
397
406
  ## 9 — Docs + wiki
398
407
  - **Freedom: low** — the matrix walk and the gate are mechanical; what a doc says is not this stage's call ([`gates.md`](gates.md) → *Axis C*).
@@ -455,6 +464,9 @@ never that the work was skipped quietly.
455
464
  - **Freedom: medium** — the walk and the evidence rule are fixed; whether it is what was asked for is the operator's ([`gates.md`](gates.md) → *Axis C*).
456
465
  - **What:** the closing stage — go back to the brief and account for **every**
457
466
  requirement. Doctrine: [`acceptance.md`](acceptance.md).
467
+ - **Every REQ this run shipped has a verification row, and every row names a REQ some
468
+ brief carries.** Both directions: a shipped feature that entered no ledger and a
469
+ ledger row about nothing are different failures ([`verification.md`](verification.md)).
458
470
  - **The ledger's open rows are resolved onto the board.** Every carry-over row still
459
471
  `open` leaves with a `B-NNN` id on `docs/superpowers/backlog.md`, and the ledger row
460
472
  is updated to name it ([`backlog.md`](backlog.md)). Both directions, because they are
@@ -0,0 +1,89 @@
1
+ # The verification ledger — the column a machine may not fill
2
+
3
+ **One job: record whether a human ever looked at what shipped, and when.**
4
+
5
+ Stage 8 already performs the verification trio, reads the CI verdict and opens the
6
+ rendered page ([`stages.md`](stages.md) → *8 — Post-deploy*). All of it is **per run**,
7
+ and none of it accumulates. Ask a project *"which features has nobody confirmed since
8
+ they shipped?"* and before this file the honest answer was: nobody knows, and no
9
+ artifact could be consulted.
10
+
11
+ **Boundary, so this is not a second coverage table.**
12
+ [`acceptance.md`](acceptance.md)'s table says *an automated check passed at the moment of
13
+ the run*. Three things it does not say, and each is why this file exists:
14
+
15
+ - whether anybody **looked** after it shipped;
16
+ - whether it still works N releases later;
17
+ - anything at all about previous runs — it is per-run and dies with its run.
18
+
19
+ ---
20
+
21
+ ## Contents
22
+
23
+ - Why it keys to the brief, not to the coverage table
24
+ - `never` is a fact
25
+ - What stage 8 writes and what stage 10 refuses
26
+ - Rationalizations
27
+
28
+ ## Why it keys to the brief, not to the coverage table
29
+
30
+ The obvious spine is the coverage table — it already carries one row per REQ with a
31
+ verdict. Measured before building on it: **ten acceptance files in this repository, and
32
+ the first REQ-bearing table differs in nearly every one.** Ladder walks and coverage
33
+ tables share a file with different columns, because `acceptance.md` fixes the shape in
34
+ prose and prose does not hold a shape across ten runs.
35
+
36
+ The brief's REQ table does: **eight of nine briefs here carry machine-readable
37
+ `| REQ-NNN |` rows**, and the ninth was fixed the day this was measured. So the ledger
38
+ keys to the brief, and the coverage table remains what it always was — the run's own
39
+ verdict, quoted into the `Auto` column and never re-derived.
40
+
41
+ That the coverage table has no template and has already drifted is a real finding with a
42
+ real cost, and it is on the board rather than fixed here: a run that widens its own scope
43
+ to fix everything it touches finishes nothing.
44
+
45
+ ## `never` is a fact
46
+
47
+ A `never` is not a defect, not a debt, and **not a number to drive down**. It is what is
48
+ true about the world, written where somebody can act on it.
49
+
50
+ The moment `never` becomes a thing to avoid writing, the column stops describing
51
+ reality — and this is the pipeline's only signal about the world outside its own checks.
52
+ So the count has **no floor, no direction, and may never be given a target**, exactly
53
+ like the disclosures in [`gates.md`](gates.md). A project with forty `never` rows is not
54
+ failing; it is a project that now knows something it could not previously ask.
55
+
56
+ ## What stage 8 writes and what stage 10 refuses
57
+
58
+ **A coverage verdict of `review` becomes `none`.** *No check can decide this* is not
59
+ a pass; `Auto` records what a machine established, and there the honest answer is
60
+ nothing. The first seed wrote `pass` for four such rows — in the file whose whole
61
+ purpose is not to do that.
62
+
63
+ **Stage 8** writes one row per REQ the run shipped, right after the verification it
64
+ already does. `Human` starts at `never` unless the operator confirmed during the run.
65
+
66
+ **A REQ that spans two modules is stamped with the second, not the first.** Its criterion
67
+ is satisfied when the last part of it exists, and stamping the earlier release claims a
68
+ capability the project did not yet have. Caught by a reader on the first ledger this
69
+ skill ever seeded: one row said a file was named in the maps a release before that file
70
+ existed, and the row directly below it said when the file arrived. Two rows of one
71
+ table, disagreeing about the same date.
72
+
73
+ **Stage 10** refuses a REQ that shipped and has no row — and, in the other direction, a
74
+ row whose REQ appears in no brief. They are different failures: a shipped feature that
75
+ entered no ledger, and a ledger row about nothing. One direction alone finds one of them
76
+ ([`learned.md`](learned.md) rule 2).
77
+
78
+ **Nothing else writes here.** Not a script, not the release job, and not stage 10 — a
79
+ file that several stages may write is a file whose rows nobody owns.
80
+
81
+ ## Rationalizations
82
+
83
+ | The excuse | What is actually true |
84
+ |---|---|
85
+ | "The tests passed, that *is* verification" | The tests passed *at the moment of the run*, against the checks somebody thought to write. This column is about the world, and the world is where the checks were not looking. |
86
+ | "I'll fill `Human` in when I get to it" | Then the row says `never`, which is exactly correct until you do. The file is not asking you to lie faster. |
87
+ | "Forty `never` rows looks terrible" | It looks like what it is. The alternative is forty unverified features and no way to name them, which looked fine right up until it didn't. |
88
+ | "Stage 10 can fill it — it runs after the deploy" | Stage 10 is a machine. The single thing this column means is *a person looked*, and a machine writing it deletes the only information in the file. |
89
+ | "We tag rarely, so `Shipped in` is awkward" | Then it carries the commit, and every row of that run carries the same one. What it may not carry is nothing. |
@@ -11,6 +11,7 @@ from `super-ux`.
11
11
  |---|---|---|
12
12
  | `brief.md` | `docs/superpowers/specs/YYYY-MM-DD-<topic>-brief.md` | 0 — intake grill |
13
13
  | `carryover.md` | `docs/superpowers/specs/YYYY-MM-DD-<topic>-carryover.md` | 0 seeds, all stages append, 10 reads |
14
+ | `verification.md` | `docs/superpowers/verification.md` | 8 writes a row per shipped REQ, 10 requires it, a human fills `Human` |
14
15
  | `backlog.md` | `docs/superpowers/backlog.md` | 0 seeds when absent, any stage appends, 10 resolves and re-derives |
15
16
  | `context.md` | `CONTEXT.md` at the repo root (or per context) | 0 — grill, domain awareness |
16
17
  | `adr.md` | `docs/adr/NNNN-<slug>.md` | 0 — grill, hard-to-reverse decisions |
@@ -0,0 +1,55 @@
1
+ # Verification — <project>
2
+
3
+ > **Append-only.** One row per REQ, written by stage 8 when the change ships. Nobody
4
+ > edits a row except to fill `Human` — and filling it is the one thing in this
5
+ > repository a machine may not do.
6
+ >
7
+ > This is not a second coverage table. The coverage table says *an automated check
8
+ > passed at the moment of the run*. It says nothing about whether anybody **looked**
9
+ > after it shipped, nor whether it still works N releases later, and it dies with its
10
+ > run. This file is the column that outlives it.
11
+
12
+ | REQ | What | Run | Shipped in | Auto | Human | Note |
13
+ |---|---|---|---|---|---|---|
14
+ | REQ-001 | CSV export from a report | `2026-07-28-export` | v1.4.0 | pass | 2026-07-30 | opened the deployed page, exported, opened the file |
15
+ | REQ-004 | XLSX export | `2026-07-28-export` | v1.4.0 | pass | **never** | — |
16
+ | REQ-007 | Export respects active filters | `2026-07-28-export` | v1.4.0 | partial | **never** | CSV path only |
17
+
18
+ ## Columns
19
+
20
+ - **REQ** — the id from the run's brief. The brief's REQ table is the spine; a row here
21
+ whose id is in no brief is a row about nothing.
22
+ - **What** — copied from the brief, not re-worded. *"Check REQ-004"* sends a human to
23
+ look something up; *"XLSX export"* sends them to the feature.
24
+ - **Run** — the brief's topic slug, so the context is one file away.
25
+ - **Shipped in** — the tag or commit that carried it. Where a project does not tag,
26
+ the commit, and the same value every row of that run carries.
27
+ - **Auto** — what the run's own gate said: `pass` · `partial` · `none`. Copied from the
28
+ coverage table rather than re-derived; where the two disagree the coverage table wins
29
+ and the disagreement is a finding. A coverage verdict of **`review`** — *no check can
30
+ decide this* — becomes `none`, because this column records what a machine established
31
+ and there the honest answer is *nothing*.
32
+ - **Human** — a date, or the literal **`never`**. Nothing else. *"soon"*, *"mostly"* and
33
+ *"looks fine"* are how a column stops being answerable, and this is the only column in
34
+ the pipeline that a machine may not fill on your behalf.
35
+ - **Note** — what the human actually did. *"opened the deployed page and exported"* is a
36
+ note; *"checked"* is not, and six weeks later nobody can tell those two apart.
37
+
38
+ ## `never` is a fact, not a failure
39
+
40
+ A row sitting at `never` is not a defect and not a debt to be paid down before the next
41
+ release. It is **what is true**, printed where somebody can act on it. The moment
42
+ `never` becomes something to avoid writing, this file starts lying and the pipeline
43
+ loses the only signal it has about the world outside its own checks.
44
+
45
+ That is why nothing here has a floor, a target, or a direction. Count them, print them,
46
+ and let the number be what it is.
47
+
48
+ ## How rows arrive
49
+
50
+ 1. **Stage 8** writes one row per REQ the run shipped, immediately after the deploy
51
+ verification it already performs — `Human` starts at `never` unless the operator
52
+ confirmed during the run, in which case the note says what they did.
53
+ 2. **A human, later** — fills `Human` with the date they looked, and the note with what
54
+ they looked at. This is the only edit any row ever receives.
55
+ 3. **Nothing else writes here.** Not stage 10, not a script, not a release job.