@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +87 -0
- package/README.md +2 -2
- package/package.json +1 -1
- package/references/docs-workflow.md +10 -10
- package/references/engineering-loop.md +56 -48
- package/skills/docs-process/SKILL.md +2 -1
- package/skills/init/SKILL.md +1 -1
- package/skills/init/scripts/doctor.mjs +9 -5
- package/skills/init/scripts/owned.mjs +26 -0
- package/skills/{spec-child → spec-build}/SKILL.md +6 -6
- package/skills/{spec-parent → spec-coordinator}/SKILL.md +61 -44
- package/skills/spec-ignite/SKILL.md +5 -5
- package/skills/spec-pipeline/SKILL.md +7 -7
- package/skills/spec-retro/SKILL.md +22 -21
- package/skills/spec-review/SKILL.md +7 -6
- package/skills/spec-seat/SKILL.md +81 -46
- package/skills/spec-witness/SKILL.md +8 -5
- package/templates/docs/_meta/doc-index.md +1 -1
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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 `##
|
|
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,
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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 `##
|
|
122
|
-
prefixes are the contract: one grep for `## PARENT RULING` across every session's
|
|
123
|
-
ruling in the effort.
|
|
124
|
-
|
|
125
|
-
**THE HEADING VOCABULARY IS CLOSED, AND THAT IS THE HAZARD AS WELL AS THE CONTRACT.** The
|
|
126
|
-
list is exactly four — `
|
|
127
|
-
by the control plane on a word boundary, so `##
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
**`##
|
|
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
|
-
|
|
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
|
|
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
|
|
194
|
-
The latch reads the ACTS LEDGER: a ruling closes your
|
|
195
|
-
|
|
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 `##
|
|
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
|
-
|
|
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 `##
|
|
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
|
-
`##
|
|
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
|
-
## [
|
|
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
|
-
## [
|
|
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 `
|
|
441
|
-
on `[
|
|
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.
|
|
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
|
|
448
|
-
your coordinator's own voice — needs the argless re-accept.** The bar is content, not
|
|
449
|
-
what you are publishing still what I approved?*, and a state report is not a change of
|
|
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
|
-
`##
|
|
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
|
-
-
|
|
523
|
-
|
|
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: `##
|
|
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 `## [
|
|
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-
|
|
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-
|
|
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;
|