@naswerks/engineering-loop 0.7.1 → 0.9.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.
Files changed (37) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +199 -0
  4. package/README.md +12 -7
  5. package/bin/verify-staged.mjs +136 -23
  6. package/bin/witness-acts.mjs +64 -0
  7. package/bin/witness-bodycheck.mjs +78 -0
  8. package/bin/witness-edits.mjs +60 -0
  9. package/bin/witness-extract-cmd.mjs +57 -0
  10. package/bin/witness-extract-seed.mjs +65 -0
  11. package/bin/witness-file-ledger.mjs +57 -0
  12. package/bin/witness-gaps.mjs +57 -0
  13. package/bin/witness-latency.mjs +55 -0
  14. package/bin/witness-lib.mjs +124 -0
  15. package/bin/witness-plane-window.mjs +57 -0
  16. package/bin/witness-procs.mjs +71 -0
  17. package/bin/witness-spawn-task.mjs +61 -0
  18. package/bin/witness-tx.mjs +60 -0
  19. package/bin/witness-watch.mjs +405 -0
  20. package/bin/witness-writes.mjs +64 -0
  21. package/package.json +1 -1
  22. package/references/docs-workflow.md +44 -24
  23. package/references/engineering-loop.md +42 -24
  24. package/skills/docs-audit-full/SKILL.md +2 -1
  25. package/skills/docs-process/SKILL.md +13 -7
  26. package/skills/docs-write/SKILL.md +1 -1
  27. package/skills/init/scripts/doctor.mjs +43 -5
  28. package/skills/init/scripts/owned.mjs +10 -0
  29. package/skills/spec-build/SKILL.md +12 -4
  30. package/skills/spec-coordinator/SKILL.md +149 -80
  31. package/skills/spec-ignite/SKILL.md +25 -21
  32. package/skills/spec-pipeline/SKILL.md +151 -82
  33. package/skills/spec-retro/SKILL.md +14 -9
  34. package/skills/spec-review/SKILL.md +32 -14
  35. package/skills/spec-seat/SKILL.md +107 -48
  36. package/skills/spec-witness/SKILL.md +267 -212
  37. package/templates/docs/readme-research.md +2 -2
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: spec-pipeline
3
- description: Graduate a plan into a numbered spec pipeline in docs/research/{topic}/ — an umbrella plus one self-contained spec per planned seat. Use when a research idea is "really getting into it" and a plan has come through (a plan-approval mode, if your harness has one) and you want to commit it as specs instead of executing it directly, or run spec-pipeline.
3
+ description: Graduate a plan into a numbered spec pipeline in docs/research/{topic}/ — one ignition brief (the coordinator's spec and the charter every seat reads) plus one self-contained spec per build seat. Use when a research idea is "really getting into it" and a plan has come through (a plan-approval mode, if your harness has one) and you want to commit it as specs instead of executing it directly, or run spec-pipeline.
4
4
  ---
5
5
 
6
6
  # spec-pipeline
@@ -8,7 +8,7 @@ description: Graduate a plan into a numbered spec pipeline in docs/research/{top
8
8
  Turn a *plan* into a durable, numbered **spec pipeline** in `docs/research/{topic}/`. This is phase 2 of
9
9
  the two-phase backlog model: `docs-backlog` parks an idea; `spec-pipeline` graduates the plan behind it
10
10
  into specs. **The plan is throwaway — the specs carry every crumb.** A future session reads ONE spec + the
11
- umbrella and can build without the plan or the original conversation.
11
+ brief and can build without the plan or the original conversation.
12
12
 
13
13
  **Find the format first.** This repository writes its formats (the doc header and status words, where an effort is filed, its rails) in the sections `rg -n '^#+ .*\(repository-owned\)' docs/_meta/` lists; read the one a step names before that step writes. This skill names the section, never the format.
14
14
 
@@ -24,23 +24,29 @@ umbrella and can build without the plan or the original conversation.
24
24
  ## What a pipeline folder contains
25
25
 
26
26
  > **THIS FOLDER IS THE CREATE PAYLOAD.** Ignition does not compose a pipeline from memory or from a
27
- > conversation — it DERIVES one from these files: the folder name is the topic, the umbrella's H1 is the
28
- > title, `## The sequence` is the seat list, and the numbered specs are the seats. Author them knowing
29
- > they will be read mechanically, and the ignition step becomes a verification rather than a
30
- > transcription. The mapping is the table in `spec-ignite` § *the stage card is derived*; keep the two
31
- > in step if either moves.
27
+ > conversation — it DERIVES one from these files: the folder name is the topic, the brief's H1 is the
28
+ > title, its `## The sequence` is the seat list (a `step` row is shown, never a seat), and the numbered
29
+ > specs are the build seats. Author them knowing they will be read mechanically, and the ignition step
30
+ > becomes a verification rather than a transcription. The mapping is the table in `spec-ignite` § *the
31
+ > stage card is derived*; keep the two in step if either moves.
32
32
 
33
33
  ```
34
34
  docs/research/{topic}/
35
- 00-ignition-brief.md the coordinator's standing orders for THIS run (template below)
36
- 01-{topic}.md the umbrella: vision, the row table, settled decisions, hard constraints
37
- 02..NN-{slice}.md one self-contained spec per planned seat, in build order
35
+ 00-ignition-brief.md the coordinator's spec AND the charter every seat reads (template below);
36
+ never a session
37
+ 01..NN-{slice}.md one self-contained spec per build seat, in build order: every numbered
38
+ file is one seat's spec
38
39
  project-status.md the living tracker — the coordinator's journal (template below)
39
- live-checks.md the human's verification rows, accumulated as the run proceeds
40
+ live-checks.md created with NO rows: it holds only the rows the owner dictates
40
41
  sessions/ the CONVERSATION — see below. NOT authored here: the FIRST seat
41
42
  brings it into existence when it files, so a fresh folder has none
42
43
  ```
43
44
 
45
+ **Every numbered file is one seat's spec, and the brief is the coordinator's.** The brief carries what
46
+ binds the whole run — why it exists, the sequence, the owner's rulings, the law, the reference facts, what
47
+ it does not do, the baselines, the platform state — so a seat reads its own spec and the brief, and nothing
48
+ else is a charter. The sequence is written once, in the brief.
49
+
44
50
  ### `sessions/` — the conversation, and its durable record
45
51
 
46
52
  **Nobody creates this folder as an act.** The FIRST seat brings it into existence by committing its two
@@ -58,11 +64,13 @@ sessions/ WHO PUTS IT THERE
58
64
  {spec-slug}/tldr.md each build seat, same commit — the two-voice CHAT: its TLDRs and
59
65
  questions with the coordinator's rulings appended beneath them. Read
60
66
  top-to-bottom it IS the session's whole conversation, in message order
67
+ docs-process/plan.md + tldr.md the docs-process row's board, same shape; it lives here from the start,
68
+ never in a gitignored folder, so it moves with the effort when P files it
69
+ {step-slug}/receipt.md a human `step` row, in its own commit — see "A HUMAN STEP OWES A RECEIPT"
61
70
  code-review.md the review seat, in its own commit, if the run has a review row
62
71
  coordinator-retrospective.md the coordinator, at the close
63
- witness-ledger-*.md a human commit — the witness is zero-writes by contract (its ticket
64
- cannot even carry the write scope), so its testimony reaches the repo
65
- by someone else's hand
72
+ witness-ledger-*.md a human commit — the witness writes nothing into the run, so its
73
+ testimony reaches the repo by someone else's hand, on the human's word
66
74
  ```
67
75
 
68
76
  - **Per-seat artifacts go in a `{spec-slug}/` subfolder; effort-wide artifacts sit at the `sessions/`
@@ -102,7 +110,7 @@ sessions/ WHO PUTS IT THERE
102
110
  slice: recon + plan + build + suite + FINAL TLDR fits in one session with room for two rulings.
103
111
 
104
112
  2b. **Decide the pipeline's SHAPE — ask the human both questions, with your recommendation.** The bookends
105
- are rows in the row table like any other seat, which is why the decision belongs here: nothing
113
+ are rows in the brief's sequence like any other seat, which is why the decision belongs here: nothing
106
114
  downstream needs a flag, and the coordinator learns the shape by reading its own sequence.
107
115
 
108
116
  **"Do you want a REVIEW row?"** Recommend YES when the run ships a lot of code, touches security or
@@ -123,31 +131,55 @@ sessions/ WHO PUTS IT THERE
123
131
  verbs its credential admits, and a kind nobody has heard of composes NOTHING rather than something
124
132
  plausible. Name rows in those words.
125
133
 
126
- Then write the rows into the row table and the brief's sequence, in this order:
134
+ **What is not a seat is a `step` row** — a human act in its place in the order (a publish, a merge, a
135
+ sitting). Its `Kind` cell says `step`, and nothing is staged or seeded for it. `step` is the one
136
+ non-seat word on purpose: no misspelled seat kind can equal it, so a row whose kind is misspelled is
137
+ still refused by name rather than read as a step. A PR the coordinator opens at its close is its own
138
+ close-out, not a row.
139
+
140
+ **A seat row may carry a role** — `backend` · `frontend` · `mixed` — in a `Role` column, when the
141
+ reading list of a build seat should not be left to the default. Leave the column out when no row needs
142
+ it.
143
+
144
+ **A seat row may name the repositories it ALSO writes in** — in a `Repository` column, when the seat
145
+ builds something that lives in another repository: a package this repository consumes, say. The cell
146
+ holds one or more names, as the runner that carries the seat serves them, separated by ` · ` or `,`;
147
+ an empty cell, `-` or `—` means none. **The column never moves a seat:** its home is always the
148
+ pipeline's own repository, where the specs, the boards and the tracker are. The pipeline still closes
149
+ on ONE pull request, its own repository's; a release of the other repository is a `step` row. Leave
150
+ the column out when no row needs it — most pipelines write one repository, and nothing about them
151
+ changes.
152
+
153
+ Then write the rows into the brief's sequence, in this order:
127
154
 
128
155
  ```
129
- 02..NN the build seats
130
- {R} REVIEW — spec-review, if chosen. Runs on `git diff {base}...<branch>` (the rails' base branch); no PR yet
156
+ 0 the coordinator, with the brief as its spec
157
+ 01..NN the build seats, with any `step` rows in their places
158
+ {R} REVIEW — spec-review, if chosen. Runs on `git diff origin/{base}...<branch>` (the rails' base branch); no PR yet
131
159
  {F} FIXIT — MAY materialise, one maximum, only if the review classifies an (a)+(b)
132
160
  finding AND the coordinator rules it in. Not authored up front; the
133
- coordinator charters it from the review's named list
161
+ coordinator charters it from the review's named list. Listed as a row
162
+ only when it must write a further repository: then directly after the
163
+ review row, with its `Repository` cell — anywhere else a launcher reads
164
+ a second fixit beside the one the review implies
134
165
  — the coordinator's retro + PR (its own close-out, not a row)
135
166
  {P} DOCS-PROCESS — if chosen
136
167
  ```
137
168
 
138
169
  **The REVIEW row's seed carries NO coordinator beliefs** — no provenance list, no prior-shapes
139
170
  bullets, no framing about what is already settled. Every other seat's prompt deliberately carries those;
140
- this one must not, because the seat's whole value is the absence of the run's context. **Write that
141
- instruction into the brief**, or it will be seeded helpfully and destroy what it is buying.
171
+ this one must not, because the seat's whole value is the absence of the run's context. It reads the
172
+ brief's sections down to § Platform state and every numbered spec **as claims**, and never the
173
+ coordinator's sections after it. **Write that instruction into the brief**, or it will be seeded
174
+ helpfully and destroy what it is buying.
142
175
 
143
- **The sequence you just decided lands in THREE documents, and they must agree**: the brief's
144
- `## The sequence`, the umbrella's row table, and the tracker's `## Session status`. Write all three
145
- in one pass, listing the same rows in the same order. **The coordinator re-checks this at ignition** —
146
- an effort whose three documents disagree has one seat acting on a shape the others have stopped
147
- describing.
176
+ **The sequence is written ONCE, in the brief.** The tracker's `## Session status` carries one status
177
+ line per row, by the brief's ids, and copies nothing else: no second table, no settled-decisions list.
178
+ **The coordinator compares the two at ignition and before its retro** — a status line with no row, or a
179
+ row with no status line, is a finding.
148
180
 
149
181
  3. **Write the specs**, using the spec-doc template in `docs/_meta/docs-workflow.md`. Each per-seat
150
- spec opens with the spec-doc blockquote (`Builds on [prior]` + `Source: [umbrella / research]`) and the
182
+ spec opens with the spec-doc blockquote (`Builds on [prior]` + `Source: [brief / research]`) and the
151
183
  machine header `docs/_meta/docs-workflow.md` § Doc metadata (repository-owned) prescribes, at the word for
152
184
  `draft`, so the set stays navigable.
153
185
 
@@ -201,20 +233,20 @@ sessions/ WHO PUTS IT THERE
201
233
  exists has a blind spot. **A count pinned in a doc needs a named owning session**, or it rots: say
202
234
  which spec moves it, and have the others leave it alone.
203
235
 
204
- 4. **Name the RESEARCH the effort came from, in the umbrella, by path.** The idea that fed this work
205
- archives *with* it — that is how its archive home ends up holding the whole arc from "thing we'd like to
206
- do" to "done." When the research doc already lives at `research/{topic}/`, it travels for free. **When
207
- it does not** — a standalone `research/{something}.md`, or several — the umbrella's `Source:` / Lineage
208
- is the only record that it belongs to this effort.
236
+ 4. **Name the RESEARCH the effort came from, in the brief, by path** — its `## Where it came from`. The
237
+ idea that fed this work archives *with* it — that is how its archive home ends up holding the whole arc
238
+ from "thing we'd like to do" to "done." When the research doc already lives at `research/{topic}/`, it
239
+ travels for free. **When it does not** — a standalone `research/{something}.md`, or several — the
240
+ brief's `## Where it came from` and its Lineage are the only record that it belongs to this effort.
209
241
 
210
242
  **Say it plainly, because a later seat has to act on it:** whoever archives this gets handed that
211
243
  list, and a research doc nobody named is one that stays behind in the running tab after its effort has
212
- shipped. Two lines in the umbrella now saves a hunt through a shared folder later.
244
+ shipped. Two lines in the brief now saves a hunt through a shared folder later.
213
245
 
214
246
  5. **Name the archive destination when only you can.** Read `docs/_meta/docs-workflow.md` § The archive
215
247
  convention (repository-owned). If where a pipeline files depends on something only this session knows
216
- (which living feature the effort belongs to, say), resolve it now and write the path into the
217
- umbrella's blockquote as an `Archive:` line; `spec-coordinator` hands it to the docs-process row and
248
+ (which living feature the effort belongs to, say), resolve it now and write the path into the brief's
249
+ `## Where it came from` as an `Archive:` line; `spec-coordinator` hands it to the docs-process row and
218
250
  `docs-process` files there. A convention that needs nothing from you needs no line.
219
251
 
220
252
  6. **Stop.** The specs stay in `research/{topic}/`. Do NOT implement, do NOT touch living docs, do NOT
@@ -222,8 +254,10 @@ sessions/ WHO PUTS IT THERE
222
254
 
223
255
  ## The `00-ignition-brief.md` template
224
256
 
225
- The coordinator's standing orders for this run, and **you write all of it here — every section, nothing
226
- left blank.**
257
+ The coordinator seat's spec and the charter every seat reads, and **you write all of it here — every
258
+ section, nothing left blank.** The sections down to § Platform state bind every seat; the three after it
259
+ are the coordinator's orders, and a seat whose charter excludes them (the review row) stops at § Platform
260
+ state.
227
261
 
228
262
  **Why here and not at ignition:** this is the hot session. You just placed the specs, counted the
229
263
  populations, and read the code they cite, so you are the only seat that can state the baselines and the
@@ -236,53 +270,83 @@ That includes the **kick text**: write the coordinator's task string here, ready
236
270
  requires no authoring at all.
237
271
 
238
272
  ```markdown
239
- # {Topic} — Ignition Brief (the coordinator's standing orders)
273
+ # {The pipeline's title}
240
274
 
241
- > You are the COORDINATOR of the {topic} pipeline. Read this, then the umbrella (01-*.md), then the
242
- > tracker (project-status.md — yours), then EVERY numbered spec before arming the first seat.
275
+ > **Every seat reads this file.** It is the coordinator seat's spec and the charter this pipeline stands on,
276
+ > and it is never a session. The sections down to § Platform state bind every seat; the sections after it
277
+ > are the coordinator's orders. The numbered files `01`–`{NN}` are the build seats' specs.
243
278
  {the machine header docs/_meta/docs-workflow.md § Doc metadata (repository-owned) prescribes, at the word for `draft`}
244
279
 
245
280
  **Last verified against:** {date}, `{sha}`. Ignition re-verifies this brief against live HEAD and
246
281
  corrects drift; it does not re-author it.
247
282
 
283
+ ## Why
284
+ What is wrong today and what the effort makes true — the vision a seat builds toward.
285
+
248
286
  ## Birth
249
- Topic · spec path · receipt prefix · attended/unattended · branch `{the effort's branch}`.
287
+ Topic · spec path · receipt prefix · mode (hosted, or by hand) · shape · the effort's branch · **the model
288
+ and the effort every seat starts on** · the rows chosen at authoring (review? docs-process?) and why ·
289
+ **the GATE**: only that the predecessor merged, then re-verify this brief's § Reference and re-measure
290
+ § Baselines.
291
+
292
+ **Name the model and the effort, each in backticks** — the word model then the id, the word effort then the
293
+ level (*every seat starts on model `{id}` at effort `{level}`*) — because the launcher reads both from this
294
+ section. Write the id as the runner's catalog offers it. A brief that names neither leaves both to the
295
+ launcher's default; hand-cranked, the same line tells the human which model to open each seat's session on.
250
296
 
251
297
  ## The sequence
252
298
  | Seat | Spec | Kind | Why it sits here |
253
299
 
254
300
  **THE `Kind` COLUMN IS THE VOCABULARY WORD, VERBATIM** — `build` · `fixit` · `review` ·
255
- `docs-process` · `coordinator` · `retro` · `witness` — **not a prose role.** This table is READ, not
256
- just read by people: ignition derives the create payload from it (`spec-ignite` § the stage card is
257
- derived), and the create door validates the kind against a closed set and refuses an unknown by name.
258
- A cell saying "the one that reviews" composes nothing.
301
+ `docs-process` · `coordinator` · `retro` · `witness`, or `step` for a row that is not a seat — **not a
302
+ prose role.** This table is READ, not just read by people: ignition derives the create payload from it
303
+ (`spec-ignite` § the stage card is derived), the create door validates the kind against a closed set and
304
+ refuses an unknown by name, and the doctor fails a row whose kind is none of these. A cell saying "the one
305
+ that reviews" composes nothing. An optional `Role` column carries `backend` · `frontend` · `mixed` for a
306
+ seat whose reading list should not be left to the default. An optional `Repository` column names the
307
+ repositories a seat also writes in, by the runner's names; a seat's home is always this repository. Neither
308
+ column's cell may hold a kind word or `step`: the table is read by kind value, and a kind word anywhere in
309
+ a row is read as that row's kind.
310
+
311
+ **This is the only copy of the sequence.** The tracker's status lines name these rows by id and copy
312
+ nothing else.
259
313
 
260
314
  **AND THE COORDINATOR IS A ROW.** It is a seat on the create payload like any other, it is not one
261
315
  of the numbered specs, and a pipeline without exactly one is refused at start
262
- (`pipeline-has-no-coordinator` / `-has-many-coordinators`). List it first, at stage 0, with the brief
316
+ (`pipeline-has-no-coordinator` / `-has-many-coordinators`). List it first, at stage 0, with this brief
263
317
  as its spec.
264
318
 
265
319
  Include the REVIEW and DOCS-PROCESS rows if the pipeline has them, and say which it does NOT have —
266
320
  the coordinator needs to know whether a review precedes its retro. If there is a review row, add:
267
- **its seed carries no coordinator beliefs, no provenance, no already-settled framing** · a FIXIT row
268
- may follow it (one maximum, coordinator-ruled from the review's named candidates) · **the retro comes
269
- after the review and after any fixit**, never before. If docs-process is a row, note that its
270
- living-doc patches are contingent on the merge.
321
+ **its seed carries no coordinator beliefs, no provenance, no already-settled framing, and it reads this
322
+ brief down to § Platform state as claims** · a FIXIT row may follow it (one maximum, coordinator-ruled
323
+ from the review's named candidates) · **the retro comes after the review and after any fixit**, never
324
+ before. If docs-process is a row, note that its living-doc patches are contingent on the merge.
271
325
 
272
- ## The coordinator's beliefs, with provenance
273
- Each load-bearing claim and which pipeline, row, or commit established it. A seat that finds a mismatch
274
- has produced something worth more than a build hour. **Never head this section with a claim that
275
- questioning it counts against the session** — that framing gets pointed at exactly the claims that
276
- turn out to be wrong.
326
+ ## The owner's rulings — settled, don't relitigate
327
+ Each decision the owner made while the plan came through, and its consequence for the run. A seat that
328
+ needs one overturned asks; it never rebuilds an argument the owner already ruled on.
329
+
330
+ ## Law — what binds every seat beyond the skills
331
+ Only what OVERRIDES a default, in one section: the relay or the hosted ceremony this run uses, the suite
332
+ and coverage lanes, spend fences, ordering constraints that are not obvious from the specs, the stack
333
+ rules, what is frozen. Never a restatement of a skill.
334
+
335
+ ## Reference — the facts the specs stand on
336
+ The symbols, files and states every spec cites, each read against the tree on a stated date. The specs
337
+ point here instead of each re-deriving them.
277
338
 
278
- ## Pipeline-specific law (beyond the prompt and the skills)
279
- Only what OVERRIDES a default: the suite/coverage lane, spend fences, ordering constraints that are not
280
- obvious from the specs, per-spec riders already ruled.
339
+ ## Where it came from
340
+ The research that fed this effort, by path — it archives with the effort — and an `Archive:` line when
341
+ only this session can name the archive home (step 5).
342
+
343
+ ## What this effort does NOT do
344
+ The out-of-scope list, each item with where it lives instead. A seat never touches what is named here.
281
345
 
282
346
  ## Baselines
283
- MEASURE these — run the suites and quote the real numbers. Ignition re-verifies; it cannot invent them.
284
- Per lane: the result, **the exact invocation**, and **the environment it was measured in**. Three things
285
- that each cost a live run:
347
+ MEASURE these — run the suites and quote the real numbers. The GATE re-measures them; every seat cites
348
+ them and measures only a lane this section does not name. Per lane: the result, **the exact invocation**,
349
+ **the environment it was measured in**, and **its duration**. Three things that each cost a live run:
286
350
  - **A number without its invocation is not a receipt** — it invites the next reader to widen its scope.
287
351
  Say which projects ran, not just a total.
288
352
  - **State the environment.** A baseline measured with the stack down is a different number from one
@@ -307,17 +371,22 @@ If this pipeline CHANGES the machinery it runs on — the ledger, the wake diges
307
371
  sentinel, the gate — say so here, and tell the coordinator to expect to meet that defect while fixing it.
308
372
  Meeting it is a first-hand receipt worth more than the spec's analysis: journal it and cite it in the fix.
309
373
 
374
+ ## The coordinator's beliefs, with provenance
375
+ Each load-bearing claim and which pipeline, row, or commit established it. A seat that finds a mismatch
376
+ has produced something worth more than a build hour. **Never head this section with a claim that
377
+ questioning it counts against the session** — that framing gets pointed at exactly the claims that
378
+ turn out to be wrong.
379
+
310
380
  ## Close-out
311
- Per-seat artifact filing · live-checks aggregation · what the PR must say · the receipt this pipeline
312
- owes about itself.
381
+ Per-seat artifact filing · what the PR must say · the owner's quick pass (short and ordered, offered in
382
+ the chat) · the receipt this pipeline owes about itself.
313
383
 
314
- **A HUMAN ROW OWES A RECEIPT, NOT A NARRATION.** If the pipeline has a human row, carry this rule
315
- into the brief verbatim: the row is exempt from `plan.md` (there is no build to plan) and is **NOT**
316
- exempt from an independent record. It files `sessions/{slug}/receipt.md` in the row's own commit —
317
- each check id, what was run, the literal result, and who observed it. Every other row has TWO
318
- voices, the seat's tldr and the coordinator's tracker, and the retro's ceremony audit is built on
319
- cross-reading them; a human row recorded only by the coordinator has ONE, and the one voice is the
320
- one whose errors nobody else catches.
384
+ **A HUMAN STEP OWES A RECEIPT, NOT A NARRATION.** If the sequence has a human `step` row, carry this rule
385
+ into the brief verbatim: the step is exempt from `plan.md` (there is no build to plan) and is **NOT**
386
+ exempt from an independent record. It files `sessions/{step-slug}/receipt.md` in its own commit — each
387
+ check id, what was run, the literal result, and who observed it. Every seat has TWO voices, the seat's
388
+ tldr and the coordinator's tracker, and the retro's ceremony audit is built on cross-reading them; a step
389
+ recorded only by the coordinator has ONE, and the one voice is the one whose errors nobody else catches.
321
390
 
322
391
  ## The kick — paste this verbatim as the coordinator's task
323
392
  > You are the COORDINATOR of the {topic} pipeline. Invoke the `spec-coordinator` skill, then read
@@ -354,10 +423,11 @@ viewer because they are instructions to the coordinator, not content for the hum
354
423
  {one paragraph}
355
424
 
356
425
  ## Session status
357
- <!-- ready -> building -> SHIPPED {sha} / PARKED {sha}. One line each, no prose. -->
426
+ <!-- ready -> building -> SHIPPED {sha} / PARKED {sha}. One line per row, by the brief's ids; the sequence
427
+ itself lives in the brief and is never copied here. -->
358
428
 
359
- ## Settled decisions
360
- <!-- The don't-relitigate list, carried from the umbrella; append rulings that become standing. -->
429
+ ## Rulings made during the run
430
+ <!-- Append-only. What was settled at authoring is the brief's; this section holds only what the run rules. -->
361
431
 
362
432
  ## What's verified (trust basis)
363
433
  <!-- What a build session may take on faith, and what it must re-check itself. -->
@@ -415,10 +485,10 @@ viewer because they are instructions to the coordinator, not content for the hum
415
485
 
416
486
  ## `live-checks.md`
417
487
 
418
- One file at the effort's root, created with the specs. Every parked demo and human-verification row lands
419
- here — a seat's FINAL TLDR section (e) rows get transcribed into it **at close-out, in the same commit as
420
- the work**. Rows scattered across five sessions' TLDRs and never aggregated is the most common thing to
421
- fall through: name the file at authoring time so nobody invents a new one.
488
+ One file at the effort's root, **created with no rows**. **Live checks are the owner's**: the file holds
489
+ only the rows the owner dictates, the coordinator writes a row only when the owner dictates it, and nothing
490
+ is aggregated into it — a seat's FINAL TLDR section (e) is what the owner could try, said in the chat, and
491
+ never a row. Create the file at authoring time so nobody invents a second one.
422
492
 
423
493
  **The status vocabulary carries a PARTIAL, not just pass/fail:**
424
494
  `owed` · `passed` · `failed` (a failure is a finding, not a retry) · `not exercised` (with the reason — an
@@ -430,10 +500,9 @@ single passed/failed cell over a check whose seed half was clean and whose platf
430
500
  to invent a status to record the truth. **If you can name two owners while writing the row, write two
431
501
  rows.**
432
502
 
433
- **TWO WRITERS ON THIS FILE IS A DIVERGENCE WAITING TO HAPPEN — and it is the file the review grades
434
- from.** The coordinator dictates rows into a seat's close-out call and the SEAT stages them; a seat never
435
- writes it unprompted. Author the file knowing that, and do not write instructions telling the coordinator
436
- to edit it directly.
503
+ **ONE WRITER, ON ONE PERSON'S WORD.** A seat never authors or edits a row. A seat whose change makes a
504
+ dictated row false says so in its FINAL TLDR, quoting the row, and the coordinator corrects it. Author no
505
+ instruction that sends a seat's checks into this file.
437
506
 
438
507
  ## Notes
439
508
 
@@ -444,7 +513,7 @@ to edit it directly.
444
513
  folder), the chat transcript, and any subagent reports vanish. Inline their load-bearing content; never
445
514
  point at ephemeral state as the source of truth. Cross-links to *other durable docs* are fine.
446
515
  - **Lifecycle.** Specs live in `research/{topic}/` through the build. When the effort ships, `docs-process`
447
- archives the umbrella + every spec + the working docs together into the home `docs-workflow.md` § The
516
+ archives the brief + every spec + the working docs together into the home `docs-workflow.md` § The
448
517
  archive convention (repository-owned) names, in its shape — the spec set *is* the design history.
449
518
  - **Anti-fabrication.** A spec's header verified date is the date it was *authored against the code it
450
519
  cites*, not a promise the code stays unchanged. Only write facts you actually checked this run.
@@ -73,9 +73,10 @@ population or only its failures.
73
73
  silently-empty result is usually a broken query, not an empty table.
74
74
  - **A search that times out is not a search that found nothing.** If a sweep backs an ABSENCE claim,
75
75
  re-run it on the tool that completes before you report the absence.
76
- - **A gate scanner matches TEXT.** A query or command whose text contains `git` and `push`, or
77
- `git` + `branch` + a `-d` flag, parks by design. **Reshape the command — never re-request it.** (The
78
- boundary half of `spec-seat`'s discriminator.)
76
+ - **The gate reads the command the shell would run, not its words.** A quoted search pattern naming a
77
+ boundary operation is data; the same words handed to an interpreter, or carrying a substitution, are read
78
+ as something that could run, and park. **Reshape the command — never re-request it.** (The boundary half
79
+ of `spec-seat`'s discriminator.)
79
80
 
80
81
  **READS ONLY. Never write to the platform's store.**
81
82
 
@@ -319,8 +320,10 @@ effort). The pipeline exists to widen the seat's autonomy — **so every wall it
319
320
  ### 9. WHAT FELL THROUGH THE CRACKS
320
321
 
321
322
  Named explicitly, because the alternative is that it stays fallen. Include the open questions the run
322
- could not settle, and say plainly that they are open. **Check the effort's `live-checks.md`** — unaggregated
323
- verification rows are the most common thing to fall through.
323
+ could not settle, and say plainly that they are open. **Check that the owner was offered a quick pass** —
324
+ the seats' "what the owner could try" lines that never reached the owner are the most common thing to fall
325
+ through. `live-checks.md` holds only the rows the owner dictated; an unrun dictated row is the owner's open
326
+ item, said so here.
324
327
 
325
328
  ### 10. THE FINDINGS DISPOSITION PASS — *the drain, and it is the section that decides whether the effort's findings survive it*
326
329
 
@@ -341,7 +344,7 @@ not on this list, the honest answer is CLOSED with a reason:
341
344
  | Destination | Why a later effort reaches it |
342
345
  |---|---|
343
346
  | A working doc's **Living-Docs checklist** | `docs-process` patches a living doc; living docs get read |
344
- | A **`live-checks.md` row** | The owed-checks authority is read at every sitting |
347
+ | A **`live-checks.md` row the owner dictates** | The owner's own checks, read at every sitting — offered to the owner, never written without their word |
345
348
  | A named input in the **NEXT pipeline's brief** | The only legal forward-carry — no standing ledgers |
346
349
  | An **in-code revisit note at the symbol** | Grep-findable by whoever next opens that file |
347
350
  | A **chartered fixit**, with its discharge record | Someone is building it, and the record closes |
@@ -372,7 +375,10 @@ is the look of a record with none of a record's properties.
372
375
  ## Ceremony
373
376
 
374
377
  1. **Read** your own ledger — `docs/research/{topic}/project-status.md`, the one ledger of §4 — every
375
- session's `tldr.md`, and the working docs.
378
+ session's `tldr.md`, the working docs, and **a witness ledger when one exists**
379
+ (`sessions/witness-ledger-*.md`, or the copy the human hands you). The witness watched from outside the
380
+ plane with instruments you do not have: carry every observation of it your retro does not already hold,
381
+ in a section of its own, attributed to the witness — never folded silently into your own findings.
376
382
  2. **Query** the substrate for §§2-5. Verify each query FIRES on a known-positive row before trusting a
377
383
  clean result.
378
384
  3. **Write** `docs/research/{topic}/sessions/coordinator-retrospective.md` — NATIVELY, in the tree you were born
@@ -388,8 +394,7 @@ is the look of a record with none of a record's properties.
388
394
  § This repository's rails (repository-owned) says (when it names no route, ask the human once and suggest
389
395
  recording the answer there); one branch, one PR from any seat. **If one is already open, the push is enough.** These three git commands are your own close-out
390
396
  lane and they are gated and receipted like any other publish. **The push command must be the ENTIRE
391
- command** — a leading `cd` disqualifies it — and keep git-verb words out of any echo label you write
392
- around it; the deny layer matches TEXT, not parsed verbs.
397
+ command** — a leading `cd` disqualifies it.
393
398
  6. **Sweep for stale beliefs BY MEANING, NEVER BY PHRASE — and sweep the SIBLINGS that restate a rule, not
394
399
  just the rule's own home.** A sweep keyed on wording only finds the wording it thought of. Ask what each
395
400
  instruction *depends on being true* — which file it names, which lane it assumes exists, who it thinks
@@ -35,9 +35,14 @@ else's job.
35
35
  Your seed carries **no beliefs about the pipeline, and that is deliberate** — but it should carry an
36
36
  **inventory**, because you cannot review what you cannot find:
37
37
 
38
- - the **topic**, the **branch**, and the **diff range** (`{base}...<branch>` — `{base}` is the base branch
39
- `docs/_meta/engineering-loop.md` § This repository's rails (repository-owned) names, or the remote's
40
- default when it names none);
38
+ - the **topic**, the **branch**, and the **diff range** (`origin/{base}...<branch>` — `{base}` is the base
39
+ branch `docs/_meta/engineering-loop.md` § This repository's rails (repository-owned) names, or the
40
+ remote's default when it names none; it is read from the remote's copy, because a local base branch can
41
+ sit behind it and pull another effort's commits into the range);
42
+ - **one more range per further repository the run wrote**, with that repository's path — by its release
43
+ tags when the run released it mid-run, since its branch is merged by then;
44
+ - **the brief** (`00-ignition-brief.md`) — its sections down to § Platform state, read as claims like the
45
+ specs, and **never the coordinator's sections after it** (its beliefs, its close-out, its kick);
41
46
  - **every numbered spec path** — you read them as claims, not facts;
42
47
  - the **`sessions/`** folder, holding each build seat's `plan.md` + `tldr.md`;
43
48
  - the **working docs for this effort, named explicitly** — `docs/working/` is a shared queue and you must
@@ -45,20 +50,30 @@ Your seed carries **no beliefs about the pipeline, and that is deliberate** —
45
50
  - the **tracker** (`project-status.md`), which is the process record lens 3 grades from.
46
51
 
47
52
  **If any of that is missing, ask for it** — a numbered question in your `tldr.md`, same lane as any seat.
48
- Do not hunt, and do not guess a scope. **What you must NOT be given, and must not accept as fact if it
49
- arrives anyway:** prior-shapes bullets, a provenance list, or any framing about what is already settled.
50
- That is testimony; record it and treat it as a claim.
53
+ Do not hunt, and do not guess a scope. **This inventory wins over a narrower instruction:** a brief or a seed
54
+ that tells you to read less (only the diff and your skill, say) does not shrink it — ask for what is missing,
55
+ and say in your report that the instruction was narrower. **What you must NOT be given, and must not accept
56
+ as fact if it arrives anyway:** prior-shapes bullets, a provenance list, or any framing about what is
57
+ already settled. That is testimony; record it and treat it as a claim.
58
+
59
+ **Say whether this review is COLD or WARM, in your report's first paragraph.** Cold: you were seeded with
60
+ the inventory and nothing else. Warm: you were handed the run's context — a tracker reading before your own
61
+ passes, a coordinator's framing, the owner's briefing. A warm review can be worth having; it is a different
62
+ instrument, and a reader who takes it for a cold one over-trusts its independence.
51
63
 
52
64
  ## Reading order (it matters)
53
65
 
54
- 1. **The specs** — what the pipeline said it would do, per slice, including each escape hatch and the
55
- declared out-of-scope.
66
+ 1. **The brief, down to § Platform state, and the specs** — what the pipeline said it would do, as a
67
+ whole and per slice, including each escape hatch, the owner's rulings and the declared out-of-scope.
56
68
  2. **The session docs** — every seat's `tldr.md` in `sessions/`. What each seat claims it shipped,
57
69
  its honest gaps, its deferred findings, its receipts.
58
70
  3. **The working docs** in `docs/working/` — the narrative: what was tried, what failed, what changed.
59
71
  4. **The tracker** — `project-status.md`, the coordinator's journal: rulings and their reasoning, recon
60
72
  corrections, incidents.
61
- 5. **THEN the diff** — `git diff {base}...<pipeline-branch>`, plus `git log --oneline {base}..<pipeline-branch>`.
73
+ 5. **THEN the diff** — `git diff origin/{base}...<pipeline-branch>`, plus `git log --oneline
74
+ origin/{base}..<pipeline-branch>`; and the same pair for each further range your seed names, run inside
75
+ that repository. Read the two sides of a seam together: what one repository ships and what the other
76
+ consumes are one claim.
62
77
 
63
78
  **Read the artifacts before the code, and the code before you conclude.** Reading the diff first makes
64
79
  you review a patch; reading the claims first makes you review whether the pipeline did what it said.
@@ -203,6 +218,7 @@ a pipeline artifact, not a chat transcript, and it archives with the effort.
203
218
 
204
219
  > The outside look, written before the retro and before the PR. Two independent passes, consolidated.
205
220
  > Reviewed `{base}..{sha}` across N sessions. **This seat did not read the coordinator's retrospective.**
221
+ > **{COLD | WARM}:** {what this seat was seeded with — the inventory alone, or the run's context, and which}.
206
222
  {the machine header docs/_meta/docs-workflow.md § Doc metadata (repository-owned) prescribes, at the word for `shipped`}
207
223
 
208
224
  ## The verdict, first
@@ -232,8 +248,9 @@ the smallest fix that makes the claim true. If none: say NONE, plainly.}
232
248
  ## Deferred findings — with their DESTINATIONS
233
249
  | R-n | Finding | Found by | Destination |
234
250
  {Report-local ids — the coordinator allocates the effort id at the ruling. A DESTINATION is a place that
235
- exists and that someone reads: a working doc's Living-Docs checklist · a `live-checks.md` row · a
236
- named input in the NEXT pipeline's brief · an in-code revisit note at the symbol · a chartered fixit ·
251
+ exists and that someone reads: a working doc's Living-Docs checklist · an item for the owner's quick pass
252
+ (offered in the chat; a `live-checks.md` row only when the owner dictates one) · a named input in the NEXT
253
+ pipeline's brief · an in-code revisit note at the symbol · a chartered fixit ·
237
254
  or CLOSED with its reason. **"deferred log" is not a destination** — it is the holding pen the
238
255
  finding sits in until the retro's disposition pass drains it. A row whose destination is a document
239
256
  that does not exist yet (an unauthored row, an unwritten charter) is NOT homed: say so here.}
@@ -244,7 +261,7 @@ that does not exist yet (an unauthored row, an unwritten charter) is NOT homed:
244
261
  {Stated, not omitted.}
245
262
 
246
263
  ## Lineage _(where § Doc metadata (repository-owned) keeps the footer)_
247
- - **Pipeline** — the tracker · the umbrella · sessions 02..NN
264
+ - **Pipeline** — the tracker · the brief · sessions 01..NN
248
265
  - **Counterpart** — `coordinator-retrospective.md` (the inside look; written after this)
249
266
  ```
250
267
 
@@ -252,8 +269,9 @@ that does not exist yet (an unauthored row, an unwritten charter) is NOT homed:
252
269
 
253
270
  **Your contract is `spec-seat`** — invoke it first if you have not. It carries recon, the plain-text PLAN
254
271
  TLDR with beliefs and numbered questions, the question lane, the parked-call discriminator, the verdict
255
- vocabulary, the six-section FINAL TLDR, and the close-out order. You commit `sessions/code-review.md` on
256
- your coordinator's call like any seat.
272
+ vocabulary, the six-section FINAL TLDR, and the close-out order. You commit `sessions/code-review.md` as
273
+ any seat commits its work: hand-cranked on your plan's approval (the relay), hosted on your coordinator's
274
+ call.
257
275
 
258
276
  **The close-out receipt's heading token is the literal `seat·` for you too** — it is a protocol anchor,
259
277
  not a description of your seat, and writing `[review·…]` stales your own acceptance. `spec-seat` carries