@naswerks/engineering-loop 0.5.1 → 0.7.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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: spec-seat
3
- description: The CONTRACT for any seat a pipeline coordinator arms — the blackboard, the question lane, the parked-call discriminator, the verdict vocabulary, the BELIEFS sha, git shapes, the six-section FINAL TLDR, and the close-out order. Invoked FIRST, then the job skill (spec-child | spec-review | docs-process). Not a seat of its own; the shared half of every seat's procedure.
3
+ description: The CONTRACT for any seat a pipeline coordinator arms — the blackboard, the question lane, the parked-call discriminator, the verdict vocabulary, the BELIEFS sha, git shapes, the six-section FINAL TLDR, and the close-out order. Invoked FIRST, then the job skill (spec-build | spec-review | docs-process). Not a seat of its own; the shared half of every seat's procedure.
4
4
  ---
5
5
 
6
6
  # spec-seat
@@ -10,13 +10,13 @@ the review row, the docs-process row — runs THIS, then its own job skill:
10
10
 
11
11
  | Seat kind | Composes |
12
12
  |---|---|
13
- | `build` · `fixit` | `spec-seat` + **`spec-child`** |
13
+ | `build` · `fixit` | `spec-seat` + **`spec-build`** |
14
14
  | `review` | `spec-seat` + **`spec-review`** |
15
15
  | `docs-process` | `spec-seat` + **`docs-process`** |
16
16
 
17
17
  **THE PAIRING IS SEVEN-WAY AND NON-UNIFORM, and the three kinds missing from that table are missing
18
18
  DELIBERATELY.** `coordinator`, `retro` and `witness` each carry their OWN whole contract
19
- (`spec-parent` · `spec-retro` · `spec-witness`) and are **never** told to invoke this file — prefixing
19
+ (`spec-coordinator` · `spec-retro` · `spec-witness`) and are **never** told to invoke this file — prefixing
20
20
  `spec-seat` onto a skill that already carries a whole contract ships a seed contradicting the skill it
21
21
  points at. The control plane composes each kind's seed from this table and has no catch-all: an unknown
22
22
  kind is refused by name (`seat-kind-has-no-seed`) rather than ignited wrongly.
@@ -26,7 +26,7 @@ contradicts it. Where they genuinely conflict, that is **a finding to report**,
26
26
  quietly — say so in your PLAN TLDR and let the coordinator rule.
27
27
 
28
28
  **The coordinator does NOT compose this.** It writes rulings rather than receiving them, owns the tracker,
29
- and holds the close — a different contract, and `spec-parent` carries it whole.
29
+ and holds the close — a different contract, and `spec-coordinator` carries it whole.
30
30
 
31
31
  **Why this file exists:** a base contract that every seat kind shared, with the build job mixed in, sent
32
32
  the review row into the umbrella its own charter excluded and offered the docs-process row a `docs-write`
@@ -98,16 +98,26 @@ that is your scope — do not widen it on the theory that more reading is safer.
98
98
  `plan.md` (the full plan document) and `tldr.md` (the chat: your PLAN TLDR, any mid-build updates, the
99
99
  FINAL TLDR — **append, never overwrite**) are FILES, not just chat text.
100
100
 
101
+ **ONE CEREMONY IN BOTH MODES: you write your file, then you poke; your coordinator appends its ruling to the
102
+ SAME file, then pokes you. Nobody pastes a document into a message.**
103
+
101
104
  - **Hand-cranked:** create them under `docs/research/{topic}/sessions/{slug}/` at plan time and end your
102
105
  turn announcing the path. The coordinator reads `tldr.md` with normal file tools and APPENDS its ruling
103
- under `## PARENT RULING`, so read the answer in your own file and proceed. The full plan is PULL — it is
106
+ under `## COORDINATOR RULING`, so read the answer in your own file and proceed. The full plan is PULL — it is
104
107
  read only on a read-full-plan verdict; never paste it into chat. (If your harness has a plan-approval
105
108
  mode that forbids writes: give the chat summary, get the human's approve, THEN post and stop.)
106
- - **Hosted (a seat inside a pipeline):** the same two files are yours to edit with normal file tools, then
107
- call **`post_plan` / `post_tldr` with the file's whole text as `content`** — the control plane runs on
108
- another machine and cannot read your file. It records a revision and wakes your coordinator with ONE
109
- LINE naming the act and the rev; the coordinator reads your file from the board; nothing you wrote is
110
- pasted into its context (the pointer protocol).
109
+ - **Hosted (a seat inside a pipeline):** the same two files are yours to edit with normal file tools. **Write,
110
+ then poke:** the first time, call `post_tldr` with `path` — the file's path inside your workspace, relative
111
+ to its root — and the control plane reads the file from your runner; after that, call `post_tldr` with
112
+ NOTHING and it reads the same path again (`post_plan` the same way). It records a revision and wakes your
113
+ coordinator with ONE LINE naming the rev and the sections you added. **Your coordinator's ruling arrives
114
+ IN YOUR FILE** — it appends under its coordinator-voice heading, and you are poked with one line naming
115
+ the section (*"Your tldr.md rev 5 adds `## COORDINATOR RULING (plan rev 1 — accept)`"*). Read it with
116
+ your own file tools; it is never pasted to you.
117
+ **If the post answers `host-lacks-workspace-read`** (a runner older than periscope 1.4.0) **or asks for
118
+ `content`** (a control plane that predates reading files), it cannot read your workspace: pass the whole
119
+ file as `content` instead, and read rulings from your board (`seat_content(kind: "ruling")`) as well as
120
+ your file.
111
121
  **THE FILE IS THE RECORD AND THE ROW MIRRORS IT** — one artifact row per rev carrying the whole file
112
122
  verbatim, so the two voices stay interleaved because nothing splits them. The control plane refuses
113
123
  `blackboard-rev-regressed` · `blackboard-shrank` · `blackboard-rev-content-mismatch` at the door: **an
@@ -118,29 +128,33 @@ Either way, `tldr.md` read top-to-bottom is the session's whole conversation in
118
128
 
119
129
  **Greppable turn anchors:** every append gets a stable heading carrying actor + identity —
120
130
  `## [{seat}·{slug} · run {id}] {phase}` when your seat has a run identity, `## [{seat}·{slug}] {phase}`
121
- hand-cranked. The coordinator's voice is always `## PARENT RULING …` / `## PARENT NOTE …`. The stable
122
- prefixes are the contract: one grep for `## PARENT RULING` across every session's `tldr.md` lists every
123
- ruling in the effort.
124
-
125
- **THE HEADING VOCABULARY IS CLOSED, AND THAT IS THE HAZARD AS WELL AS THE CONTRACT.** The parent-voice
126
- list is exactly four — `PARENT NOTE` · `PARENT ACCEPT` · `PARENT RULING` · `OPERATOR RULING` — matched
127
- by the control plane on a word boundary, so `## PARENT NOTEBOOK` cannot pass. A fifth anchor invented
128
- later closes nothing and counts as nothing until the control plane learns it. **Section boundaries are
129
- level-2 headings only** — `### Option A` inside your question block is still inside the question,
130
- deliberately, so a ruling never arrives having truncated your options.
131
-
132
- **Point, don't paste:** to direct anyone at content, say *"read `tldr.md` under `## PARENT RULING`"* —
133
- never re-paste a multi-KB block into a composer.
131
+ hand-cranked. The coordinator's voice is always `## COORDINATOR RULING …` / `## COORDINATOR NOTE …`. The
132
+ stable prefixes are the contract: one grep for `## (COORDINATOR|PARENT) RULING` across every session's
133
+ `tldr.md` lists every ruling in the effort.
134
+
135
+ **THE HEADING VOCABULARY IS CLOSED, AND THAT IS THE HAZARD AS WELL AS THE CONTRACT.** The
136
+ coordinator-voice list is exactly four — `COORDINATOR NOTE` · `COORDINATOR ACCEPT` · `COORDINATOR RULING`
137
+ · `OPERATOR RULING` — matched by the control plane on a word boundary, so `## COORDINATOR NOTEBOOK`
138
+ cannot pass. An older board spells the first three `PARENT NOTE` · `PARENT ACCEPT` · `PARENT RULING`; a
139
+ reader of the anchors takes that spelling as the same three, which is why the grep above carries both. A fifth
140
+ anchor invented later closes nothing and counts as nothing until the control plane learns it. **Section
141
+ boundaries are level-2 headings only** — `### Option A` inside your question block is still inside the
142
+ question, deliberately, so a ruling never arrives having truncated your options.
143
+
144
+ **Point, don't paste:** to direct anyone at content, say *"read `tldr.md` under `## COORDINATOR
145
+ RULING`"* — never re-paste a multi-KB block into a composer.
134
146
 
135
147
  **If `tldr.md` already exists when you go to create your blackboard, APPEND** — machinery may have written
136
- before you, and recreating the file clobbers it (the platform refuses a shrinking rewrite).
148
+ before you, and recreating the file clobbers it (the platform refuses a shrinking rewrite). **And every
149
+ heading already on your board stays exactly as written, an older spelling included:** the platform refuses
150
+ a revision whose earlier headings changed, so never tidy an old heading into the current vocabulary.
137
151
 
138
152
  **Re-read `tldr.md` immediately before every append.** The coordinator appends into the SAME file between
139
153
  your turns — an edit whose old text no longer matches almost always means the conversation moved.
140
154
  Re-read, fold what's new, then append. Never resolve the mismatch by rewriting the whole file; the rev
141
155
  ladder is the history.
142
156
 
143
- **`## PARENT NOTE (FYI — no reply needed)` is the NO-TURN lane:** the coordinator can leave you
157
+ **`## COORDINATOR NOTE (FYI — no reply needed)` is the NO-TURN lane:** the coordinator can leave you
144
158
  informational context WITHOUT waking you — it lands durably in your `tldr.md` and costs you nothing.
145
159
  The re-read above is where you pick FYIs up: fold them as context, owe no reply, and never treat one as
146
160
  a ruling — an FYI cannot answer an open question (only a ruling heading does).
@@ -149,7 +163,7 @@ a ruling — an FYI cannot answer an open question (only a ruling heading does).
149
163
 
150
164
  **When you need a decision at ANY point:** append a question section to your own `tldr.md`, post
151
165
  (`post_tldr`), and **END YOUR TURN.** Your coordinator is woken with your text, and its ruling under a
152
- parent-voice heading is your answer — pick it up from your own file and resume.
166
+ coordinator-voice heading is your answer — pick it up from your own file and resume.
153
167
 
154
168
  **TWO literal headings, one lane — pick by phase, and use a real `##` heading either way:**
155
169
 
@@ -170,7 +184,7 @@ every section and answers `Blocking` / `NotBlocking` / `Undeclared`. Markdown ar
170
184
  - **Never let a reader turn your declaration into liveness.** It is a claim made at the instant you
171
185
  typed it; a seat that wrote `BLOCKING:` and then kept working was telling the truth.
172
186
 
173
- **Both poke the coordinator identically** — same wake, same re-raise, same parent-voice answer. The split
187
+ **Both poke the coordinator identically** — same wake, same re-raise, same coordinator-voice answer. The split
174
188
  is for the READER (a recon fork and a mid-build discovery are different kinds of news), never for the
175
189
  machinery. A question under any OTHER heading — or as a bare `QUESTIONS:` label with no `##` — gets no
176
190
  banner and **the re-raise can never fire**, so it can sit unanswered indefinitely. And never use
@@ -190,17 +204,18 @@ question tool — the relay cannot copy it.
190
204
  **An unanswered question re-raises to your coordinator on a cooldown** until a ruling lands. Asking costs
191
205
  the pipeline a round-trip and nothing else.
192
206
 
193
- **WHAT ACTUALLY CLOSES A QUESTION.** On the hosted plane **nothing you write into a FILE closes anything.**
194
- The latch reads the ACTS LEDGER: a ruling closes your question only when it is delivered as a `callout`
195
- carrying your post's act id as `answeringActId`. A `callout` without one steers you and closes nothing.
207
+ **WHAT ACTUALLY CLOSES A QUESTION.** On the hosted plane **nothing written into a FILE closes anything** —
208
+ not yours, and not your coordinator's section in it. The latch reads the ACTS LEDGER: a ruling closes your
209
+ question only when the coordinator's act carries your post's act id as `answeringActId`. The words arrive in
210
+ your file; the act is what decides. A `callout` without one steers you and closes nothing.
196
211
  **The reason is a security property, not tidiness:** `tldr.md` is written BY YOU, so a file-side close
197
- predicate is a string the audited party can type — a seat could write `## PARENT RULING` into its own file
212
+ predicate is a string the audited party can type — a seat could write `## COORDINATOR RULING` into its own file
198
213
  and switch off the very re-raise that exists to stop it waiting forever. The question is therefore split
199
214
  in two: *was one asked?* — a fact about the file, where forgery only wakes your own coordinator — versus
200
215
  *was it answered?* — a fact about what the coordinator DID, read from the ledger.
201
216
 
202
217
  **The honest rendering of your file is unchanged**: an open-questions read of the file still clears on the
203
- parent-voice heading, because that is what the file SAYS. What differs is what a DECISION may be
218
+ coordinator-voice heading, because that is what the file SAYS. What differs is what a DECISION may be
204
219
  predicated on.
205
220
 
206
221
  ### THREE CONTRACT LINES, all earned by one kind of silence
@@ -238,7 +253,7 @@ Ask what the park is protecting:
238
253
 
239
254
  - **A park on a STATE condition** — the park text names a rev, a hash, or a version: it is STATE, not
240
255
  approval. Do not re-request, do not reshape; read the substrate for the healing signal (your own acts:
241
- the fresh acceptance receipt, or the `## PARENT NOTE (re-accept)` append) and retry ONCE on receipt.
256
+ the fresh acceptance receipt, or the `## COORDINATOR NOTE (re-accept)` append) and retry ONCE on receipt.
242
257
  State parks are machine-healable — one argless re-accept re-binds a stale acceptance. **Never hold for
243
258
  one specific lane: whichever arrives first IS your signal, and the substrate outranks the bus.**
244
259
  - **A park on your own legitimate in-worktree work** — **re-request it** (no self-imposed cap, no
@@ -246,6 +261,9 @@ Ask what the park is protecting:
246
261
  the platform's turn, not your failure; routing around it hides the defect the park is surfacing.
247
262
  - **A park on a boundary command** (push to the base branch, force-push, branch delete — or a command
248
263
  whose *text* merely tripped the scanner) — **never re-request; reshape the command.**
264
+ **A search is data only in one shape:** a quoted literal pattern given to a read-only search tool (`rg`,
265
+ `grep`, `git grep`, `Select-String`, `findstr`), with no `$`, no backtick, no interpreter and no `xargs`
266
+ in the pipeline. Any other command carrying boundary words parks — search for the symbol, not the verb.
249
267
  **THE SCANNER MATCHES TEXT, NOT PARSED VERBS, AND THIS IS THE MOST-PAID FENCE IN THE CEREMONY.** It
250
268
  fires on read-only commands a careful seat runs to PROVE its work: an `echo` label reading
251
269
  `=== remote tip ===` on a `git status`/`git log` block, or `git branch -r --contains <sha>` — a branch
@@ -262,6 +280,16 @@ Ask what the park is protecting:
262
280
  The test: is the park **blocking your work** (re-request + disclose), **guarding the boundary** (reshape),
263
281
  or **a wall** (reshape or escalate — never a click)?
264
282
 
283
+ **BEFORE A CALL YOU KNOW WILL PARK, SAY SO.** When your work needs a boundary command — a lane that tests the
284
+ park, a push your coordinator called for from a state the push bar cannot see — append
285
+
286
+ ```
287
+ ## [seat·{slug} · run {id}] ABOUT TO PARK
288
+ ```
289
+
290
+ with the verbatim command and what it waits on, post, then run it. A seat held by the gate without saying so
291
+ looks idle to everyone watching. Like `HOLDING`, it is a state report, and it does not stale your acceptance.
292
+
265
293
  **EVERY park is DISCLOSED in your next TLDR — including one you resolved yourself in seconds:** the
266
294
  verbatim command AND the verbatim park text. A self-resolved park looks like nothing happened and leaves
267
295
  the coordinator no signal, so the gate's false-park rate is only ever knowable from the seat that paid it.
@@ -342,7 +370,7 @@ naming both. That is why your BELIEFS sha is a contract line and not a courtesy
342
370
  moves mid-build is disclosed FIRST, never absorbed quietly.
343
371
 
344
372
  **The re-accept signal:** after a rev-bound/stale-acceptance park, the re-accept arrives as a
345
- `## PARENT NOTE (re-accept)` append plus a callout — retry your held action on receipt. If your next wake
373
+ `## COORDINATOR NOTE (re-accept)` append plus a callout — retry your held action on receipt. If your next wake
346
374
  shows the fresh acceptance receipt in your own rows WITHOUT the note, **that row IS your signal** — the
347
375
  substrate outranks the bus. Never hold for one specific lane. **A re-accept with no retry order is a
348
376
  doorbell with no follow-through**; if you receive one bare, retry anyway and say that you did.
@@ -375,7 +403,9 @@ doorbell with no follow-through**; if you receive one bare, retry anyway and say
375
403
  parks where the same three commands, sent one at a time, flow unattended. Keep the word "push" out of
376
404
  echo text — the deny layer matches text, not parsed verbs.
377
405
  - Prefer native read/glob/grep tools for reads; a shell read flows with its row like any other
378
- non-boundary call.
406
+ non-boundary call. On a periscope 1.4.0 runner they reach anything outside your workspace except
407
+ credential material; on an older runner Read is jailed to your workspace, so read a file outside it —
408
+ the runner's installed package, say — with a shell command.
379
409
  - **Codegen only through the command `patterns/codegen.md` § Running codegen names** (when the repo has
380
410
  one) — never hand-write a generated folder.
381
411
  - **Never improvise a qualifying path in.** If a push parks and the remedy you can think of is touching a
@@ -416,13 +446,13 @@ produces a working doc**, COMMIT CALL with the message). Execute it exactly.
416
446
  makes the acceptance stale by design. Append your close-out receipt AFTER the push under this heading:
417
447
 
418
448
  ```
419
- ## [child·{slug} · run {id}] CLOSE-OUT RECEIPT
449
+ ## [seat·{slug} · run {id}] CLOSE-OUT RECEIPT
420
450
  ```
421
451
 
422
452
  ## IF YOU HAVE PUSHED AND ARE WAITING, SAY SO. IT DOES NOT STALE YOU.
423
453
 
424
454
  ```
425
- ## [child·{slug} · run {id}] HOLDING
455
+ ## [seat·{slug} · run {id}] HOLDING
426
456
  ```
427
457
 
428
458
  **Then `post_tldr` and end your turn.** Body: what you pushed, and what you are waiting for
@@ -437,16 +467,18 @@ cost a pipeline hours. Preventing it is your job, and it costs you one append.
437
467
  the accepted CONTENT, not to the revision number, so appending your own state or a question leaves it
438
468
  intact. Only **new content** stales.
439
469
 
440
- **The token is the literal `child·`, whatever seat you are.** The control plane's close-out matcher keys
441
- on `[child·…] CLOSE-OUT RECEIPT`, so a review or docs-process seat that writes `[review·…]` or
470
+ **The token is the literal `seat·`, whatever seat you are.** The control plane's close-out matcher keys
471
+ on `[seat·…] CLOSE-OUT RECEIPT`, so a review or docs-process seat that writes `[review·…]` or
442
472
  `[process·…]` **fails the match and stales its own acceptance** — costing a re-post and an argless
443
- re-accept. **It is a PROTOCOL ANCHOR, not a description of you.** A descriptive tail after the marker IS
473
+ re-accept. (An older board's `[child·…]` token matches too; write only `seat·`.) **It is a PROTOCOL
474
+ ANCHOR, not a description of you.** A descriptive tail after the marker IS
444
475
  blessed (`… CLOSE-OUT RECEIPT — addendum: the six staged, tree clean`) — an end-anchored pattern on the
445
476
  one heading seats are told to write would be a trap that fires on ordinary prose.
446
477
 
447
- **Any post-accept append that is NOT one of these four — close-out receipt, HOLDING, a question heading, or
448
- your coordinator's own voice — needs the argless re-accept.** The bar is content, not revision: it asks *is
449
- what you are publishing still what I approved?*, and a state report is not a change of work.
478
+ **Any post-accept append that is NOT one of these five — close-out receipt, HOLDING, ABOUT TO PARK, a
479
+ question heading, or your coordinator's own voice — needs the argless re-accept.** The bar is content, not
480
+ revision: it asks *is what you are publishing still what I approved?*, and a state report is not a change of
481
+ work.
450
482
 
451
483
  **FILE YOUR SESSION ARTIFACTS:** copy your final `plan.md` and `tldr.md` into
452
484
  `docs/research/{topic}/sessions/{slug}/`. **Two files — that is the whole filing step.** Questions ride the
@@ -489,7 +521,7 @@ why. Silence is not compliance.
489
521
  **THE TESTIMONY REGRESS, AND THE DECLARED STOPPING POINT — read this before you copy anything.** The
490
522
  order above puts the COMMIT before the CLOSE-OUT RECEIPT, so the copy you commit ends at your FINAL TLDR
491
523
  and can contain neither the receipt (hash, session id, staging receipt) nor the coordinator's
492
- `## PARENT ACCEPT`. **A follow-up commit does not fix this, it moves it:** any receipt ABOUT that commit is
524
+ `## COORDINATOR ACCEPT`. **A follow-up commit does not fix this, it moves it:** any receipt ABOUT that commit is
493
525
  also written after it. The regress is infinite and the ceremony does not pretend otherwise.
494
526
 
495
527
  **So the rule is a declared stopping point rather than a fix: RE-COPY `plan.md` AND `tldr.md` ONCE,
@@ -519,5 +551,8 @@ plane. The publish receipt is written at your turn's STOP and is structurally un
519
551
  with a clean rerun builds trust, an undisclosed one destroys it.
520
552
  - **A rule recalled from context needs re-reading at the source before it is used to refuse work.** A
521
553
  rule already corrected on disk is the commonest thing a seat blocks itself on.
522
- - Your job skill is next: `spec-child` (build/fixit) · `spec-review` (the outside look) ·
523
- `docs-process` (compile the living docs). Counterpart: `spec-parent` (the seat that arms you).
554
+ - **A control-plane verb that fails with a transport error** (`ECONNRESET`, a socket closed under the call)
555
+ is the transport, not a refusal: call it once more. If it fails again, say so in your next TLDR and carry
556
+ on with work that does not need it. A refusal has a name; a dropped connection does not.
557
+ - Your job skill is next: `spec-build` (build/fixit) · `spec-review` (the outside look) ·
558
+ `docs-process` (compile the living docs). Counterpart: `spec-coordinator` (the seat that arms you).
@@ -78,13 +78,16 @@ git — agree.
78
78
  are a zero-token heartbeat per seat — a growing ladder is a live session, a frozen one dates its last
79
79
  turn. `seat_content` reads the board; read `tldr.md` top-to-bottom and it IS the session's whole
80
80
  conversation in message-flow order — the fastest "where is this seat" there is. The coordinator's
81
- voice is a greppable anchor: `## PARENT RULING (plan rev N — {verdict})` and `## PARENT NOTE (…)`
82
- (actor-suffixed when known) on the hosted plane; the same prefixes without the rev counter under
83
- `docs/research/{topic}/sessions/{spec-slug}/` hand-cranked — so grep the prefix, never the full form.
81
+ voice is a greppable anchor: `## COORDINATOR RULING (plan rev N — {verdict})` and `## COORDINATOR NOTE
82
+ (…)` (actor-suffixed when known) on the hosted plane; the same prefixes without the rev counter under
83
+ `docs/research/{topic}/sessions/{spec-slug}/` hand-cranked — so grep the prefix, never the full form,
84
+ and grep both spellings: an older board writes `## PARENT RULING` / `## PARENT NOTE`
85
+ (`rg -n "## (COORDINATOR|PARENT) (RULING|NOTE)"`).
84
86
  **Honest delivery verdicts:** a ruling act's reply states recorded-vs-delivered truthfully —
85
87
  "recorded, not delivered" is NORMAL (the seats run substrate-first; the board is load-bearing, the
86
88
  pointer is best-effort). A delivery miss is only a finding if the seat ALSO never acted on the
87
- substrate. **Blessed close-outs:** a seat's post-push `## [child·…] CLOSE-OUT RECEIPT` append does NOT
89
+ substrate. **Blessed close-outs:** a seat's post-push `## [seat·…] CLOSE-OUT RECEIPT` append (an older
90
+ board's `[child·…]`) does NOT
88
91
  stale its acceptance — a reap without a fresh acceptance after such an append is correct behaviour,
89
92
  not a skipped step.
90
93
  3. **Change-detection monitors, not tails:** emit only rows past a high-water mark + a terminal-state
@@ -216,7 +219,7 @@ Disciplines that don't fit a numbered step:
216
219
  trusting their silence — silence from a dead monitor looks identical to a quiet run.
217
220
 
218
221
  ## Related
219
- - `spec-parent` (the seat that rules) · `spec-child` (the seats that act) · `spec-seat` (their shared
222
+ - `spec-coordinator` (the seat that rules) · `spec-build` (the seats that act) · `spec-seat` (their shared
220
223
  contract — read it to know what the seats you are watching were told)
221
224
  - **You are one of the three kinds that do NOT compose `spec-seat`** — this skill is your whole
222
225
  contract, and the control plane's seed says so rather than merely omitting it.
@@ -54,7 +54,7 @@
54
54
 
55
55
  ## Role reading lists
56
56
 
57
- The docs a build seat reads on top of the floor every seat reads (`spec-seat` Step 0). The `spec-child`
57
+ The docs a build seat reads on top of the floor every seat reads (`spec-seat` Step 0). The `spec-build`
58
58
  skill names the loop's standard docs by path; this table is the repository's reserved space — one row per
59
59
  doc, saying which roles read it. The coordinator copies a role's rows into every seat's seed as
60
60
  `EXTRA DOCS`, so a seat sees paths, not this index. Add a row for any doc of your own a role should read;