task-pipeline-skill 1.16.2 → 1.19.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,108 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.19.0
4
+
5
+ ### The copy you are about to edit may not be the copy that ships — `learned.md` rule 17
6
+
7
+ A machine keeps a skill twice: the working copy it publishes from and the installed plugin it runs.
8
+ On 2026-08-07 the working copy was **two commits behind its own origin** — `v1.16.2` against
9
+ `v1.18.0` — and the newer commits carried rule 16 itself. The tree was clean and nothing had
10
+ diverged; the copy had simply never been pulled. An edit there would have landed on 1.16.2 and the
11
+ release would have **deleted rule 16 and two versions of work by fast-forward** — not as a conflict
12
+ git would show, but silently. The project's own instruction names that directory as the source, so
13
+ whoever did it would have been following the documentation.
14
+
15
+ The check is one command and it runs **before the first edit**:
16
+
17
+ ```bash
18
+ git fetch -q && git rev-list --count HEAD..@{u} # 0, or stop and pull
19
+ ```
20
+
21
+ - `references/learned.md` — rule 17 and incident 17.
22
+ - `references/knowledge-sources.md` — a harvest section, because this is a property of the sources
23
+ that reading them cannot reveal.
24
+ - `references/grill.md` + `templates/brief.md` — autonomy-sweep row `0 Source`, in both files: the
25
+ grill asks it, the brief records it, and a topic in only one is a question with nowhere to land.
26
+ - `test/validate.py` — a guard in the shape of rule 16's, so dropping a citation fails the build
27
+ rather than quietly ending the coverage. Both halves were watched failing against planted defects.
28
+
29
+ ## v1.18.0 — 2026-08-06
30
+
31
+ ### Added
32
+ - **`references/deploy-targets.md`** — stages 7 and 8 knew what a deploy must
33
+ satisfy and never said what to run. This carries the runbook template, the
34
+ per-platform verbs (Heroku, DO App Platform, droplet over SSH, CI-as-deploy,
35
+ and the quick table for Fly/Vercel/Cloudflare), and the verification trio.
36
+
37
+ ### Changed
38
+ - **Stage 7: a missing runbook is now the stage's first deliverable**, not a
39
+ reason to improvise. A deploy performed from an agent's inference about the
40
+ project is one nobody can repeat or roll back, and the operator is already
41
+ standing at that manual gate — the questions cost two minutes there and cannot
42
+ be reconstructed during an incident.
43
+ - **Stage 8 names all three verifications, and says to check the deploy job**,
44
+ not only the build. A green build beside a skipped or failed deploy is the
45
+ commonest way a run reports success while nothing shipped — previously the
46
+ stage said "confirm clean boot" and left the shape of the confirmation open.
47
+
48
+ ### Notes
49
+ - Ported from a standalone `deploy` skill that lived only in a Cursor skills
50
+ directory. The pipeline already owned the gates; what it lacked was the
51
+ concrete verbs behind them, so the skill folded in rather than shipping beside.
52
+
53
+ ## v1.17.0 — 2026-08-06
54
+
55
+ **A carried-in claim is a recollection — `learned.md` rule 16, and the four places
56
+ it binds.**
57
+
58
+ A long autonomous run advanced one roadmap row per iteration and was correct every
59
+ time: gates green, defects planted and watched to fail, docs closed in the same
60
+ change. What was wrong was the sentence between the iterations — *"the remaining
61
+ rows are these"* — taken from a list that had reached the context through a
62
+ compaction, had once been a filtered subset, and had lost its provenance on the
63
+ way. Eleven iterations later one command over the register printed **36 open rows
64
+ out of 99**. Nothing had failed, because nothing compares a run's belief about the
65
+ work-list against the register: the claim only ever existed in prose.
66
+
67
+ The same class had already bitten that project twice from the other side, and its
68
+ own roadmap names the property — seven rows reading `blocked` on producers the
69
+ dependency board recorded as delivered, *"no gate can catch it because it breaks
70
+ nothing, it only removes work from consideration"*. **Stale state does not throw.**
71
+ It narrows what gets considered, and every downstream gate then passes honestly on
72
+ the smaller world.
73
+
74
+ Rule 8 was the neighbour and not the same rule: it governs a number *inside a
75
+ document*, checked when that document is. Rule 16 governs a fact that crossed a
76
+ **session boundary** and is being reported as current — where there is no document
77
+ to check, only a memory that reads like one.
78
+
79
+ What changed:
80
+
81
+ - **`references/learned.md`** — rule 16 with its incident, and two binding rows:
82
+ stage 0 harvest, and stage 10 plus every loop iteration.
83
+ - **`references/knowledge-sources.md`** — a new source (the task register, read for
84
+ its *state*, with a command) and a new section, *Carried-in claims — measured or
85
+ recalled*. Every inherited claim starts `recalled`; before it is acted on **or
86
+ reported to the operator** it is re-derived and marked `measured`, or it is not
87
+ stated. Three claims go stale most reliably and all three are cheap: the
88
+ work-list, `green`, and a blocker or premise.
89
+ - **`references/continuity.md`** — in loop mode the harvest's documents may be
90
+ carried between iterations; the work-list line may not, because the previous
91
+ iteration is what invalidated it. And *"next up is X"* in a closing report is a
92
+ claim about the board — the one sentence in the cycle no gate reads.
93
+ - **`references/audit.md`** — a third exit criterion at stage 10: the work-list is
94
+ re-measured and **printed beside the count the run opened with**. A pair of
95
+ numbers that has to agree cannot be filled in without looking, which is what
96
+ keeps the measurement load-bearing instead of ceremonial.
97
+ - **`references/grill.md`** + **`templates/brief.md`** — one autonomy-sweep row:
98
+ which register holds task state, and the command that reads it. Settled once; a
99
+ project without one records it empty and the rule costs nothing.
100
+ - **Guard + negative self-test** — the rule's own failure mode applied to itself:
101
+ doctrine carried in one file reads like doctrine in force. The validator names
102
+ each consumer, so a file that drops its citation fails rather than silently
103
+ ending the coverage. Guard count 119 → 120.
104
+
105
+
3
106
  ## v1.16.2 — 2026-08-06
4
107
 
5
108
  ### Added — a CI run is checked by reading it, not by assuming it
@@ -45,6 +148,7 @@ landed and the floor stayed at 104 while the file carried 108. A floor below the
45
148
  cannot notice losing the difference, which is the entire job. Now guarded, and the
46
149
  guard was watched rejecting a lowered floor.
47
150
 
151
+
48
152
  ## v1.16.1 — 2026-08-06
49
153
 
50
154
  ### Fixed — frontmatter that a regex called valid and a YAML parser silently dropped
package/README.md CHANGED
@@ -58,7 +58,7 @@ Every gate is **typed**: `auto` — the orchestrator verifies it itself, pass/fa
58
58
 
59
59
  | # | Stage | Gate | Type |
60
60
  |---|---|---|---|
61
- | 0 | Harvest + intake grill — **mandatory** | source ledger written; the documentation inventory answered into `docs/DOCMAP.md`; intent reconciled against as-built; shared understanding + autonomy sweep; brief locked | manual |
61
+ | 0 | Harvest + intake grill — **mandatory** | source ledger written **with the work-list measured, not recalled**; the documentation inventory answered into `docs/DOCMAP.md`; intent reconciled against as-built; shared understanding + autonomy sweep; brief locked | manual |
62
62
  | 1 | Docs study | contracts grounded on current docs | auto |
63
63
  | 2 | Brainstorm + decompose | design approved; UI verdict recorded; every REQ answered; platform: module map approved | manual |
64
64
  | 3 | Spec | committed + reviewed; UI: super-ux chain validated, linter green | manual |
@@ -799,6 +799,7 @@ recommendation, so you arm the whole run in one exchange. Detail:
799
799
  | [`references/conventions.md`](plugins/task-pipeline/skills/task-pipeline/references/conventions.md) | how stages 6–10 read the host project's `CLAUDE.md`, and how the documentation regime is detected |
800
800
  | [`references/documentation.md`](plugins/task-pipeline/skills/task-pipeline/references/documentation.md) | the doc system: the inventory, registers and ids, SSOT, the Doc Loop, supersede semantics, the propagation matrix, intent vs as-built |
801
801
  | [`references/gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) | the two axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors, where a gate runs |
802
+ | [`references/deploy-targets.md`](plugins/task-pipeline/skills/task-pipeline/references/deploy-targets.md) | stages 7–8: writing the runbook when there is none, the template, per-platform deploy and log verbs, the verification trio |
802
803
  | [`references/hooks.md`](plugins/task-pipeline/skills/task-pipeline/references/hooks.md) | the `PreToolUse` contract, the fail-open hazard, placement, and the Claude-Code-only limit |
803
804
  | [`references/knowledge-graph.md`](plugins/task-pipeline/skills/task-pipeline/references/knowledge-graph.md) | the code graph: install line, stage-0 reach queries, the stage-9 refresh, the graph↔docs divergence check |
804
805
  | [`references/retrospective.md`](plugins/task-pipeline/skills/task-pipeline/references/retrospective.md) | the project retro: the three grades of fix, the mandatory prune, the cap of ten |
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.16.2 |
15
+ | **Version** | 1.19.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 (15 evals, 5 categories). **Never executed** — see [`evals/RESULTS.md`](evals/RESULTS.md) |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeline-skill",
3
- "version": "1.16.2",
3
+ "version": "1.19.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.16.2",
5
+ "version": "1.19.0",
6
6
  "author": {
7
7
  "name": "ssheleg",
8
8
  "url": "https://x.com/sshlg93"
@@ -49,6 +49,7 @@ gate stops until it is installed.
49
49
  | 0 + 9 + any settled decision · The documentation system | [`references/documentation.md`](references/documentation.md) |
50
50
  | any claim that will be read as true · The canons, and where each is enforced | [`evidence-docs`](../evidence-docs/SKILL.md) — the sibling skill in this plugin |
51
51
  | 6–10 + any check you write · Gates | [`references/gates.md`](references/gates.md) |
52
+ | 7–8 · Deploy targets | [`references/deploy-targets.md`](references/deploy-targets.md) |
52
53
  | any agent-time enforcement · Hooks | [`references/hooks.md`](references/hooks.md) |
53
54
  | 0 Knowledge harvest (pre-grill) | [`references/knowledge-sources.md`](references/knowledge-sources.md) |
54
55
  | 0 + 9 The code graph (graphify — recommended, never required) | [`references/knowledge-graph.md`](references/knowledge-graph.md) |
@@ -330,6 +331,7 @@ automation is on — `pipeline.schema.json` is the only contract.
330
331
  - `references/retrospective.md` — stage 10's last act: the project retro (`docs/superpowers/retro.md`), the three grades of fix, the mandatory prune and its cap of ten
331
332
  - `references/documentation.md` — cross-cutting: the doc inventory, registers and ids, SSOT, the Doc Loop, supersede semantics, the propagation matrix, intent vs as-built
332
333
  - `references/gates.md` — cross-cutting: the two axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors, where a gate runs
334
+ - `references/deploy-targets.md` — stages 7–8: writing the runbook when there is none, the template, per-platform deploy and log verbs, and the verification trio
333
335
  - `references/hooks.md` — agent-time enforcement: the PreToolUse contract, the fail-open hazard, placement, and the Claude-Code-only limit
334
336
  - `references/audit.md` — cross-cutting: the L0→L7 ladder and its seams (what was never written), axis rotation, ratchets, proven checks
335
337
  - `references/learned.md` — cross-cutting: fifteen rules earned by failure on a real multi-repository build, each with the incident behind it, its check and its exit criterion; plus the two that no check can decide
@@ -180,7 +180,22 @@ A deliverable is **not** audited when somebody has read it. It is audited when:
180
180
 
181
181
  1. every rung has its artefact, **and**
182
182
  2. **every check you are relying on has fired at least once against a planted
183
- defect.**
183
+ defect**, **and**
184
+ 3. **the work-list is re-measured and printed beside the count the run opened
185
+ with.**
186
+
187
+ Point 3 costs one command and covers the one claim nothing else reads. A run's
188
+ closing report says what shipped — and then, almost always, what is left and what
189
+ is next. That second half is a statement about the register, and if it came from
190
+ the same list the run started with, it has never been checked against anything. A
191
+ run can be entirely correct and still hand the operator a false map of the work
192
+ ([`learned.md`](learned.md) rule 16, [`knowledge-sources.md`](knowledge-sources.md)
193
+ → *Carried-in claims*).
194
+
195
+ Printing both numbers is what makes the measurement load-bearing rather than
196
+ ceremonial: **opened 36 open · closed 34 open · 2 rows closed this run.** A row in
197
+ a ledger that nobody reconciles stops being read by the third run. A pair of
198
+ numbers that has to agree cannot be filled in without looking.
184
199
 
185
200
  **A green result from an unproven check is worth nothing.** This is the iron law of
186
201
  [`tdd.md`](tdd.md) — *if you didn't watch it fail, you don't know it tests the
@@ -121,6 +121,18 @@ Do not write, and do not believe, that the ledger is what makes the interval saf
121
121
  Someone will eventually remove the ledger on the strength of that sentence, and
122
122
  the protection they think they are keeping is in the scheduler.
123
123
 
124
+ **Each iteration re-measures the work-list.** The harvest's *documents* may be
125
+ carried across iterations — an ADR did not change while you worked. The line that
126
+ says **what is still open** may not: the previous iteration is precisely what
127
+ invalidated it, and a loop that picks its next item from the list it started with
128
+ works a stale board for as long as the loop runs. One command, at the top of the
129
+ iteration, recorded ([`knowledge-sources.md`](knowledge-sources.md) → *Carried-in
130
+ claims*; [`learned.md`](learned.md) rule 16).
131
+
132
+ This is also where a loop's report goes wrong most quietly. *"Next up is X"* at the
133
+ 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.
135
+
124
136
  ## Parked at a manual gate
125
137
 
126
138
  A fixed interval firing into a `manual` gate is a nag. Five minutes later it fires
@@ -0,0 +1,184 @@
1
+ # Deploy targets — the runbook, and the verbs when the runbook is thin
2
+
3
+ **Load this when:** stage 7 is about to deploy or stage 8 is about to verify, and
4
+ the project's own runbook either does not exist yet or does not say enough to
5
+ act on.
6
+
7
+ The project's `docs/DEPLOYMENT.md` outranks everything here. This file exists for
8
+ the two moments it cannot help: when there is no runbook to read, and when the
9
+ runbook names a platform whose verbs you have to recall. `conventions.md` says
10
+ where to look; this says what to run once you know.
11
+
12
+ ## Contents
13
+
14
+ - If there is no runbook, write one first
15
+ - Runbook template
16
+ - Heroku
17
+ - DigitalOcean App Platform
18
+ - Droplet / bare server over SSH
19
+ - Deploy that happens in CI
20
+ - Other platforms, quick verbs
21
+ - The verification trio
22
+
23
+ ---
24
+
25
+ ## If there is no runbook, write one first
26
+
27
+ A deploy performed from an agent's inference about the project is a deploy
28
+ nobody can repeat or roll back. Stage 7's authorization floor assumes a
29
+ documented procedure; absent one, **the runbook is the first deliverable of the
30
+ stage**, gathered from the operator and committed before anything ships.
31
+
32
+ Ask for what the template below leaves blank — the target, the trigger, the
33
+ gate commands, where secrets live, the migration step, the health check, the
34
+ rollback — and write the answers down. The questions take two minutes at the
35
+ gate where the operator is already present. Reconstructing them during an
36
+ incident does not.
37
+
38
+ ## Runbook template
39
+
40
+ Scaffold `docs/DEPLOYMENT.md` with this. Fill every placeholder, delete what does
41
+ not apply, keep it short — it is the source of truth stage 7 follows, and a long
42
+ one goes stale.
43
+
44
+ ```markdown
45
+ # Deployment
46
+
47
+ ## Overview
48
+ - Project: <name>
49
+ - Environments: <production | staging | ...>
50
+ - Deploy branch: <main>
51
+ - Deploy trigger: <CLI push | container registry | CI on push>
52
+
53
+ ## Platforms / targets
54
+ | Env | Platform | App / service | Region | Notes |
55
+ |-----|----------|---------------|--------|-------|
56
+ | production | <Heroku / DO App Platform / Droplet / Fly / Vercel / AWS / SSH> | <app-name or id> | <region> | <notes> |
57
+
58
+ ## Pre-deploy gate
59
+ Commands that must pass before deploying:
60
+ - Lint: `<command>`
61
+ - Type check: `<command>`
62
+ - Tests: `<command>`
63
+ - Build: `<command>`
64
+
65
+ ## Deploy steps
66
+ 1. <exact commands, in order>
67
+ 2. <release / migration commands>
68
+
69
+ ## Environment variables / secrets
70
+ - Stored in: <Heroku config vars | DO app-level secrets | .env on server | GitHub secrets>
71
+ - Required keys (NAMES ONLY, never values): <KEY_A, KEY_B, ...>
72
+
73
+ ## Migrations / release-phase commands
74
+ - <e.g. release phase in Procfile, or `heroku run <migrate> -a <app>`>
75
+
76
+ ## Post-deploy verification
77
+ - Health check URL: <https://.../health> → expected `<200 / payload>`
78
+ - Logs: <exact command per platform>
79
+ - CI build (if any): <workflow name / link>
80
+
81
+ ## Rollback
82
+ - <exact procedure — the one thing nobody writes down and everybody needs>
83
+
84
+ ## Contacts / ownership
85
+ - Owner: <who>
86
+ - Escalation: <who / where>
87
+ ```
88
+
89
+ **Never write secret values into the runbook.** Names only. A runbook is
90
+ committed; a secret in it is a secret in git history.
91
+
92
+ ---
93
+
94
+ ## Heroku
95
+
96
+ Check you are authenticated before relying on any of it: `heroku auth:whoami`.
97
+
98
+ ```bash
99
+ # git-based deploy (build runs on Heroku)
100
+ git push heroku <local-branch>:main
101
+
102
+ # container-based deploy
103
+ heroku container:push web -a <app>
104
+ heroku container:release web -a <app>
105
+
106
+ # migrations / release-phase, when not automated in the Procfile
107
+ heroku run "<migrate command>" -a <app>
108
+ ```
109
+
110
+ Verify:
111
+
112
+ ```bash
113
+ heroku ps -a <app> # dyno state — this is where a crash loop shows
114
+ heroku logs --tail -a <app> # boot and runtime errors
115
+ heroku releases -a <app> # confirm the new release landed; `heroku rollback` reverts
116
+ ```
117
+
118
+ ## DigitalOcean App Platform
119
+
120
+ `doctl account get` first.
121
+
122
+ ```bash
123
+ # an app connected to a branch deploys on the push from stage 7; to force one:
124
+ doctl apps create-deployment <app-id> --wait
125
+ ```
126
+
127
+ Verify:
128
+
129
+ ```bash
130
+ doctl apps get <app-id> # active deployment and its phase
131
+ doctl apps logs <app-id> --follow # runtime
132
+ doctl apps logs <app-id> --type build # build — a different stream, and usually the answer
133
+ ```
134
+
135
+ ## Droplet / bare server over SSH
136
+
137
+ Shape only — the runbook's exact steps win, because this is the target where
138
+ "typical" is least likely to be true.
139
+
140
+ ```bash
141
+ ssh <user>@<host> '
142
+ cd <app-dir> &&
143
+ git pull &&
144
+ <build command> &&
145
+ <restart command> # systemctl restart <service> | docker compose up -d
146
+ '
147
+ ssh <user>@<host> 'systemctl status <service> --no-pager'
148
+ ssh <user>@<host> 'journalctl -u <service> -n 100 --no-pager'
149
+ ```
150
+
151
+ ## Deploy that happens in CI
152
+
153
+ When the push itself is the deploy, stage 8 verifies the run, not the host:
154
+
155
+ ```bash
156
+ gh run list --branch <branch> --limit 5
157
+ gh run watch <run-id>
158
+ gh run view <run-id>
159
+ gh run view <run-id> --log-failed # only the failed step's log
160
+ ```
161
+
162
+ **Confirm the deploy job, not just the build job.** A green build with a skipped
163
+ or failed deploy is the most common way a run reports success while nothing
164
+ shipped — and it is exactly what the stage-8 gate is for.
165
+
166
+ ## Other platforms, quick verbs
167
+
168
+ | Platform | Deploy | Verify |
169
+ |---|---|---|
170
+ | Fly.io | `fly deploy` | `fly status`, `fly logs` |
171
+ | Vercel | `vercel --prod`, or CI on push | `vercel ls`, the deployment URL |
172
+ | Cloudflare Workers/Pages | `wrangler deploy` | `wrangler tail` |
173
+
174
+ ## The verification trio
175
+
176
+ Whatever the platform, stage 8's gate needs the same three, and all three:
177
+
178
+ 1. **Process/deployment state** — is the new version the running version
179
+ 2. **Runtime logs** — clean boot, no error spike
180
+ 3. **A health-check request** — from outside, against the live URL
181
+
182
+ One or two of the three is where "deployed successfully" gets said about a
183
+ service that is crash-looping. If any of the three cannot be obtained, that is
184
+ the honest degradation report the gate asks for — not a reason to call it green.
@@ -142,6 +142,8 @@ explicit "stop and ask me here":
142
142
  | run-wide | the model decision ([`model-tiering.md`](model-tiering.md)); what to decide autonomously vs escalate |
143
143
  | run-wide Pacing | the **run mode** ([`continuity.md`](continuity.md)): does the run advance item-by-item with no check-in between items, and on what interval? Read `pipeline.json` → `run.loop` first — a recorded mode is the answer and is not re-asked. **Absent, it is off**: recommend it, take the answer, record it. It never collapses a `manual` gate or an outward act, so this row buys pacing, not authorization |
144
144
  | 0 Harvest | doc sources beyond this repo — other repos, hosted doc systems, the knowledge wiki, **the code graph** ([`knowledge-graph.md`](knowledge-graph.md): built / installed-not-built / absent) — and whether stage 9 may write to them (another repo is outward: propose + PR, never a direct push) |
145
+ | 0 Source | for a repository with an upstream — **is this checkout the one that ships**. `git rev-list --count HEAD..@{u}`, printed, before the first edit. Behind means stop and pull: an edit on a stale copy deletes newer work by fast-forward, and nothing complains (`learned.md` rule 17) | the count, stated |
146
+ | 0 Work-list | which register holds task **state** — a roadmap, a board, a backlog, a tracker — and the **command that reads it**. Recorded once; the harvest and every loop iteration re-run it, and a closing report that names what is left cites it. No register → record the row empty, and the rule costs nothing ([`knowledge-sources.md`](knowledge-sources.md) → *Carried-in claims*) |
145
147
  | 0 Setup audit | doc map absent or stale: run the entry audit over the existing documentation before building on it ([`setup.md`](setup.md))? Asked once; a refusal is recorded and never re-asked |
146
148
  | run-wide Escalation | cost of being wrong: decide alone while it stays inside the repository and reversible; escalate price, legal posture, promise, money, reputation, irreversible outward acts. Project exceptions? |
147
149
  | 0 Docs regime | where settled things live (the decision home — **one** per project, and an existing `docs/adr/` **is** it), who may write it, whether a lease mechanism is present or the run is `ungated`, the gate command and its ratchet floors, and whether this run may raise a floor ([`documentation.md`](documentation.md)) |
@@ -17,6 +17,8 @@ that goes stale when the answer changes.
17
17
  - The knowledge wiki — recommended
18
18
  - How to harvest — retrieval, not reading
19
19
  - Record it — the source ledger
20
+ - The source is not the copy you have
21
+ - Carried-in claims — measured or recalled
20
22
  - Phase 2 — validate the answers against the harvest
21
23
  - Close the loop — stage 9 updates what stage 0 read
22
24
  - Rationalizations
@@ -43,6 +45,7 @@ makes the grill's answers *checkable* instead of merely confident.
43
45
  | 3 | **Host agent docs** | `CLAUDE.md`, `AGENTS.md`, `.cursor/rules/` | conventions, commands, deploy path, house rules |
44
46
  | 4 | **Domain docs** | `CONTEXT.md` / `CONTEXT-MAP.md`, `docs/adr/` | the glossary and the decisions with their reasons |
45
47
  | 4a | **The decision register and the doc map** | `docs/DECISIONS.md` **or** `docs/adr/` — `docs/DOCMAP.md` says which ([`documentation.md`](documentation.md)) | what is already settled, what it superseded, and which documents this run will owe |
48
+ | 4b | **The task register, for its *state*** | `docs/ROADMAP.md`, a board, a backlog, the tracker `CLAUDE.md` names | **what is open right now** — read with a command, never from memory; see *Carried-in claims* |
46
49
  | 5 | **Product/UX docs** | `docs/ux/` (super-ux chain), `README`, runbooks | user-facing behavior that is already specified |
47
50
  | 6 | **Pipeline history** | `docs/superpowers/specs/`, `plans/`, past `-carryover.md` | what a previous run of this pipeline decided or deferred |
48
51
  | 7 | **The retro, in force** | `docs/superpowers/retro.md` ([`retrospective.md`](retrospective.md)) | what previous runs got wrong here — **read in full**: standing instructions (capped at ten), run stamps and the recent-log window, all bounded by construction |
@@ -169,6 +172,70 @@ source nobody will update.
169
172
  **"No sources found" is a valid, recorded outcome.** Write the row. An empty ledger
170
173
  tells the next run that the search happened and came back empty — silence doesn't.
171
174
 
175
+ ## The source is not the copy you have
176
+
177
+ `learned.md` rule 17. The harvest reads the project's own files, and one property of them is
178
+ invisible to reading: **whether this checkout is the one that ships.** A working copy two commits
179
+ behind its upstream looks exactly like a current one — clean tree, no conflict, `git status` says
180
+ nothing is wrong — and an edit on top of it deletes the newer work by fast-forward rather than by
181
+ collision.
182
+
183
+ Before the first edit, in any repository that has an upstream:
184
+
185
+ ```bash
186
+ git fetch -q && git rev-list --count HEAD..@{u} # 0, or stop and pull
187
+ ```
188
+
189
+ Print the number. `0` is the measurement; the absence of a complaint is not.
190
+
191
+ This matters most where it is least suspected — a skill, a plugin, a fork, a vendored library —
192
+ because those are the repositories a machine keeps **twice**, once to publish from and once to run,
193
+ and the one a person opens is chosen by a path in some documentation rather than by which is
194
+ current.
195
+
196
+ ## Carried-in claims — measured or recalled
197
+
198
+ The harvest exists because *the operator misremembers*. This section exists because
199
+ **the agent does too**, and it is the harder case: a run that resumes from a
200
+ summary, a handoff note or a compacted context inherits a pile of statements that
201
+ read exactly like findings and have no source attached.
202
+
203
+ They are not lies and they were not wrong when they were written. They are **stale
204
+ by construction** — a filtered subset that lost its filter, a status true two weeks
205
+ ago, a blocker that cleared while nobody was looking. And unlike a wrong number,
206
+ stale state **does not throw**. It narrows what the run considers, and every gate
207
+ after it passes honestly on the smaller world ([`learned.md`](learned.md) rule 16).
208
+
209
+ **Every inherited claim starts as `recalled`.** Before it is acted on *or reported
210
+ to the operator*, it is either re-derived from its source and marked `measured`, or
211
+ it is not stated. Add the column to the ledger and use it:
212
+
213
+ | Claim | Whence | State | Re-derived by |
214
+ |---|---|---|---|
215
+ | 36 of 99 rows open; 4 blocked | `docs/ROADMAP.md` | measured | `bash scripts/board.sh` |
216
+ | the suite is green | prior session | measured | `npm test` → 601 pass |
217
+ | `NBA-046` has no producer | prior session | **recalled** | not checked — do not report |
218
+
219
+ Three claims that go stale most reliably, and all three are cheap to re-derive:
220
+
221
+ - **The work-list.** What is open, what is blocked, and *on what*. If the project
222
+ has a register, the harvest reads it with a command and records the counts. A run
223
+ that says *"what remains is X"* without this is guessing out loud.
224
+ - **Green.** A suite, a gate, a deploy. Run it; the answer is a minute old, not a
225
+ session old.
226
+ - **A blocker or a premise.** *"Blocked on Y"*, *"nothing produces this"*,
227
+ *"that endpoint doesn't exist"*. These clear silently — somebody else's work
228
+ lands and no signal reaches this run.
229
+
230
+ **Where the command comes from.** The grill's autonomy sweep settles it once, at
231
+ stage 0: which register holds task state and what reads it. A project without one
232
+ records the row empty and the rule costs nothing.
233
+
234
+ **And it is per iteration, not per session.** In loop mode ([`continuity.md`](continuity.md))
235
+ the harvest's documents may be carried between iterations — they did not change.
236
+ **The work-list line may not.** It is the one row the previous iteration's own work
237
+ invalidates.
238
+
172
239
  ## Phase 2 — validate the answers against the harvest
173
240
 
174
241
  This is the payoff, and it belongs to the grill loop
@@ -251,3 +318,6 @@ written list instead of from whatever the search happened to surface.
251
318
  | "The operator knows their own system" | They do — a year ago, before three other people changed it. That's the exact case where quoting the doc pays. |
252
319
  | "Reading the whole wiki costs too much" | The harvest is a query per task noun, not a read. If it feels expensive, you're reading instead of retrieving. |
253
320
  | "I'll update the docs at the end from memory" | The ledger exists because the end is exactly when you no longer remember which sources you leaned on. |
321
+ | "The summary said what's left, that's the same list" | It was a list *once*, under a filter nobody wrote down. Re-deriving it costs one command; being wrong about it costs every iteration after. |
322
+ | "Nothing changed since last iteration" | The previous iteration changed it. That is what an iteration is. |
323
+ | "Re-measuring every cycle is overhead" | It is one command against a file you already have open. The overhead is the eleven cycles spent working from a list that was wrong at cycle one. |
@@ -40,6 +40,8 @@ to be enforced and is not is the same failure as a gate that prints `FAIL` and e
40
40
  | 13 | **Local infrastructure does not fight the host** | any dev compose or service definition | assume the host already runs the defaults | services reachable with the host's own still running |
41
41
  | 14 | **A document may not send a reader to something absent** | any instruction naming a command, file or install | resolve it | the gate fails when the target does not exist |
42
42
  | 15 | **Identity before coordination** | any lease, lock, claim or run id | ask what two instances with the same identity would do, and make the tool answer it | two instances demonstrably get two identities |
43
+ | 16 | **A carried-in claim is a recollection** | any run resuming from a summary, a handoff or a compacted context | re-derive the claim from its source before acting on it or reporting it | every state claim the run makes is marked `measured` with the command behind it, or it is not made |
44
+ | 17 | **The copy you are about to edit may not be the copy that ships** | any run editing a repository that has an upstream — a skill, a plugin, a vendored library, a fork | `git rev-list --count HEAD..@{u}` **before the first edit**; non-zero means stop and pull | the run states the count it measured, or it has not started |
43
45
 
44
46
  ---
45
47
 
@@ -115,6 +117,28 @@ than only in that list because it **has** a check. Follow-on, from the first two
115
117
  in a process command line matched the throwaway shell of every tool call, and matching the binary
116
118
  path hit the same wall. Prefer a fact something authoritative wrote down.
117
119
 
120
+ **16 · A carried-in claim.** A long autonomous run advanced one roadmap row per iteration. Each
121
+ iteration was correct: gates green, defects planted and watched to fail, docs closed. What was wrong
122
+ was the sentence between them — *"the remaining rows are these"* — taken from a list that had
123
+ arrived in the context through a compaction, had once been a filtered subset, and had lost its
124
+ provenance on the way. Eleven iterations later a single command over the register printed **36 open
125
+ rows out of 99**, not the handful being worked from. Nothing had failed, because nothing compares a
126
+ run's belief about the work-list against the register; the claim only ever appeared in prose.
127
+
128
+ **17 · The stale source.** A machine keeps its skills in two places: the working copy it publishes from and the installed plugin it runs. On 2026-08-07 the working copy was **two commits behind its own origin** — `v1.16.2` against `v1.18.0` — and the newer commits carried rule 16 itself. The repository was clean, nothing had diverged, and `git status` said so; the copy was simply never pulled. An edit made there would have landed on top of 1.16.2, and the release would have **silently deleted rule 16 and everything else in two versions** — not as a conflict, which git would have shown, but as a fast-forward over work that was already published. The project's own instruction names that directory as the source, so the person doing it would have been following the documentation. Nothing in the pipeline asked the one question that separates a source from a copy of one, and the check is a single command.
129
+
130
+ The same class had already bitten that project twice from the other side, and its roadmap names the
131
+ property exactly: seven rows read `blocked` on producers the dependency board recorded as delivered,
132
+ and *"no gate can catch it because it breaks nothing — it only removes work from consideration"*;
133
+ and a row filed as *"the object nothing produces"* whose producer had shipped in between. **Stale
134
+ state does not throw.** It narrows what gets considered, silently, and every downstream gate passes
135
+ honestly on the smaller world.
136
+
137
+ Rule 8 is the neighbour, not the same rule: it governs a number *inside a document*, checked when
138
+ that document is checked. This one governs a fact that crossed a **session boundary** and is being
139
+ reported as current — the case where there is no document to check, only a memory that reads like
140
+ one.
141
+
118
142
  ---
119
143
 
120
144
  ## The two that are not in the table, and why
@@ -150,6 +174,7 @@ answer would have exposed it in a minute.
150
174
  | Stage | Rules that apply |
151
175
  |---|---|
152
176
  | 0 Inventory · 9 Docs · any register write | 8 (compute), 14 (targets resolve — including every commit SHA in the retro), 15 (identity before a lease) — see [`documentation.md`](documentation.md) |
177
+ | 0 Harvest · any run resuming from a summary | 16 — the work-list and every inherited state claim re-derived before use, [`knowledge-sources.md`](knowledge-sources.md) → *Carried-in claims* |
153
178
  | any check you write | 4, 5, 7, 10, 11 — the procedure is [`gates.md`](gates.md) |
154
179
  | 3 Spec · 4 Plan | 2 (both directions), 8 (compute, never restate) |
155
180
  | 5 Dev | 9 (generators seed green), 12 (tests create their own state), 13 (local infra) |
@@ -158,9 +183,10 @@ answer would have exposed it in a minute.
158
183
  | 4 Plan | 14 — every command, path and file a DoD names must resolve |
159
184
  | 9 Docs | 8, 14 — every number computed, every target resolvable |
160
185
  | 10 Acceptance | 1, 3, 6, 7 — axis rotation recorded, closure verified against artefacts, classes swept, ratchets printed |
186
+ | 10 Acceptance · every loop iteration | 16 — the work-list re-measured at close and printed beside its opening count ([`audit.md`](audit.md), [`continuity.md`](continuity.md)) |
161
187
 
162
- **This file is the shipped list; a project keeps its own.** These fifteen were
163
- earned on someone else's build and travel with the skill. The lessons *your*
188
+ **This file is the shipped list; a project keeps its own.** Every rule in the table
189
+ above was earned on someone else's build and travels with the skill. The lessons *your*
164
190
  project buys go in its retro ([`retrospective.md`](retrospective.md) →
165
191
  `docs/superpowers/retro.md`), where they are capped, pruned and retired — and a
166
192
  lesson there that would be true in any repository belongs here instead, as an issue
@@ -46,6 +46,7 @@ a row pointing outside the bundle is the defect this file exists to catch.
46
46
  | The knowledge harvest and its source ledger | `references/knowledge-sources.md` |
47
47
  | The documentation system, the Doc Loop, supersede semantics | `references/documentation.md` |
48
48
  | Gate types, the enforcement ladder, degrees of freedom, probing | `references/gates.md` |
49
+ | Deploy runbook template, per-platform verbs, the verification trio | `references/deploy-targets.md` |
49
50
  | The Claude Code hook contract | `references/hooks.md` |
50
51
  | First run in a project: greenfield and brownfield | `references/adoption.md` |
51
52
  | The entry audit and what it inspects | `references/setup.md` |
@@ -339,7 +339,11 @@ never that the work was skipped quietly.
339
339
  the **super-ux linter** (`python3 docs/ux/lint.py` / `/ux-lint`) is part of lint —
340
340
  it must pass too (no UX drift merges). Then deploy per the project's convention;
341
341
  if the project defines release automation (`pipeline.json` → `release`, toggle
342
- on), that is what "deploy" runs here.
342
+ on), that is what "deploy" runs here. **No runbook, or one too thin to act on?
343
+ Write it first** ([`deploy-targets.md`](deploy-targets.md)) — a deploy performed
344
+ from inference about the project is one nobody can repeat or roll back, and the
345
+ operator is standing at this gate anyway. That reference also carries the CLI
346
+ verbs per target for when the runbook names a platform you have to recall.
343
347
  - **GATE (manual):** lint clean (host linter **and**, for UI projects, the super-ux
344
348
  linter) **and** suite green **before** deploy, **and no REQ is still `open`** — a
345
349
  `partial` ships only with the operator's explicit acceptance. A gap is cheapest to
@@ -353,7 +357,12 @@ never that the work was skipped quietly.
353
357
  ## 8 — Post-deploy
354
358
  - **Freedom: medium** — where the logs live varies; 'clean boot or an honest degradation report' does not ([`gates.md`](gates.md) → *Axis C*).
355
359
  - Tail deploy logs / health-check per conventions. Confirm clean boot, no error
356
- spike, live subsystems healthy.
360
+ spike, live subsystems healthy. **All three of the verification trio, not one of
361
+ them** ([`deploy-targets.md`](deploy-targets.md) → *The verification trio*):
362
+ deployment/process state, runtime logs, and a health-check request from outside.
363
+ Where deploy happens in CI, verify the **deploy** job and not only the build —
364
+ a green build beside a skipped deploy is the commonest way a run reports success
365
+ while nothing shipped.
357
366
  - **Read the CI verdict for the deploy's own commit** ([`conventions.md`](conventions.md)
358
367
  → *The CI verdict*): the run's conclusion quoted, the **failing step's log quoted**
359
368
  on anything but `success`, and one of the three states stated — including **`no run
@@ -120,6 +120,8 @@ is not neutral — it is a scheduled interruption.
120
120
  | run-wide | Decide autonomously vs escalate to me | … |
121
121
  | run-wide Pacing | Run mode: item-by-item with no check-in between items, and on what interval? (the skill's `references/continuity.md`; read `pipeline.json` → `run.loop` first) | … (**absent ⇒ off**; it never collapses a manual gate or an outward act) |
122
122
  | 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) |
123
+ | 0 Source | `git rev-list --count HEAD..@{u}` before the first edit, printed. Behind means stop and pull — an edit on a stale checkout deletes newer work by fast-forward and nothing complains (`learned.md` rule 17) | |
124
+ | 0 Work-list | Which register holds task **state**, and the command that reads it — re-run at every harvest, at every loop iteration and at the close | … (e.g. `bash scripts/board.sh`; none → record empty) |
123
125
  | 0 Setup audit | … (yes / no — recorded either way) | doc map absent or stale: run the entry audit over the existing documentation before building on it (the skill's `references/setup.md`)? Asked once; a refusal is recorded and never re-asked |
124
126
  | 0 Docs regime | Where settled things live (register or ADR set — one home, never both); who may write it; lease mechanism present, or is this run `ungated`? Gate command + ratchet floors; may this run raise a floor? | … |
125
127
  | 1 Docs | External libs/APIs/SDKs in play; any context7 can't resolve → where their docs live | … |