@naswerks/engineering-loop 0.1.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 (44) hide show
  1. package/.claude-plugin/marketplace.json +15 -0
  2. package/.claude-plugin/plugin.json +8 -0
  3. package/CHANGELOG.md +32 -0
  4. package/LICENSE +21 -0
  5. package/README.md +78 -0
  6. package/bin/verify-staged.mjs +247 -0
  7. package/package.json +35 -0
  8. package/references/docs-workflow.md +417 -0
  9. package/references/engineering-loop.md +298 -0
  10. package/skills/docs-audit-feature/SKILL.md +88 -0
  11. package/skills/docs-audit-full/SKILL.md +54 -0
  12. package/skills/docs-backlog/SKILL.md +41 -0
  13. package/skills/docs-process/SKILL.md +146 -0
  14. package/skills/docs-status/SKILL.md +47 -0
  15. package/skills/docs-write/SKILL.md +43 -0
  16. package/skills/init/SKILL.md +163 -0
  17. package/skills/init/scripts/doctor.mjs +176 -0
  18. package/skills/spec-child/SKILL.md +149 -0
  19. package/skills/spec-ignite/SKILL.md +277 -0
  20. package/skills/spec-parent/SKILL.md +634 -0
  21. package/skills/spec-pipeline/SKILL.md +453 -0
  22. package/skills/spec-retro/SKILL.md +398 -0
  23. package/skills/spec-review/SKILL.md +266 -0
  24. package/skills/spec-seat/SKILL.md +512 -0
  25. package/skills/spec-witness/SKILL.md +222 -0
  26. package/templates/claude-md-stanza.md +13 -0
  27. package/templates/docs/_meta/doc-index.md +90 -0
  28. package/templates/docs/infrastructure/background-work.md +53 -0
  29. package/templates/docs/infrastructure/realtime-events.md +54 -0
  30. package/templates/docs/patterns/backend-patterns.md +96 -0
  31. package/templates/docs/patterns/codegen.md +69 -0
  32. package/templates/docs/patterns/frontend-patterns.md +92 -0
  33. package/templates/docs/patterns/state-management.md +73 -0
  34. package/templates/docs/patterns/testing.md +103 -0
  35. package/templates/docs/patterns/ui-style-guide.md +76 -0
  36. package/templates/docs/patterns/vertical-slice-anatomy.md +61 -0
  37. package/templates/docs/readme-archive.md +9 -0
  38. package/templates/docs/readme-features.md +7 -0
  39. package/templates/docs/readme-guides.md +7 -0
  40. package/templates/docs/readme-infrastructure.md +7 -0
  41. package/templates/docs/readme-patterns.md +9 -0
  42. package/templates/docs/readme-research.md +9 -0
  43. package/templates/docs/readme-working.md +9 -0
  44. package/templates/settings-pin.json +10 -0
@@ -0,0 +1,634 @@
1
+ ---
2
+ name: spec-parent
3
+ description: Assume the COORDINATOR seat for a spec-pipeline effort — quarterback the build seats (one per spec) via prompts, TLDR reviews, verification, and commit calls. Use immediately after spec-pipeline in the same session (the author is already context-loaded), or in a fresh session with the topic name to resume/take a prepped effort. Run spec-parent {topic}.
4
+ ---
5
+
6
+ # spec-parent
7
+
8
+ Turn this session into the **coordinator** for a `docs/research/{topic}/` spec pipeline. This is
9
+ phase 3 of the backlog model (`docs-backlog`, `spec-pipeline`, **`spec-parent`**, seats build,
10
+ `docs-process`).
11
+
12
+ **You are one of the three kinds that do NOT compose `spec-seat`** — that file is the contract for the
13
+ seats you ARM, and it says so itself. This skill is your whole contract: you write rulings rather than
14
+ receive them, you own the tracker, and you hold the close. The control plane's seed says so out loud
15
+ rather than leaving it as an absence.
16
+
17
+ **One-line essence:** you hold the context and judge; each seat holds one spec and builds. A seat never
18
+ touches the tracker or commits unprompted; you never write feature code — you verify and rule.
19
+
20
+ **Who carries the messages depends on the mode, and the rest of this skill is written for both:**
21
+
22
+ - **Hand-cranked** — a human relays every message, clicks plan-approve, and authorizes the push. The
23
+ ceremony below is the same; the human is the bus.
24
+ - **Hosted (including unattended)** — **your own verbs are the relay and the gate.** You spawn each seat's
25
+ session, rule its plan (which is what flips its gate), steer it, receipt its final TLDR and reap it; the
26
+ retro, the commit and the PR are yours. Pushes ride the unattended lane and are receipted, so they do
27
+ not wait for anyone. A well-run unattended run can complete with **zero human steps inside any
28
+ session** — that is the target, not an exception.
29
+
30
+ **What stays the human's in EVERY mode:** escalations you hand up (very, very rare), the merge, and
31
+ hand-testing what shipped. Everything else that a human does hand-cranked, you do yourself.
32
+
33
+ ## Read first
34
+
35
+ **Step 0 — the same floor every seat reads, all eight.** You verify every seat's work, so you start
36
+ from the context they build in. A coordinator that has not read `testing.md` cannot judge a receipt; one
37
+ that has not read `codegen.md` cannot spot a hand-written generated file.
38
+
39
+ `_meta/doc-index.md` · `_meta/docs-workflow.md` · `_meta/engineering-loop.md` ·
40
+ `patterns/vertical-slice-anatomy.md` · `patterns/backend-patterns.md` · `patterns/frontend-patterns.md` ·
41
+ `patterns/testing.md` · `patterns/codegen.md`
42
+
43
+ **Step 1 — the effort**, in order:
44
+
45
+ 1. `docs/research/{topic}/project-status.md` — the tracker. **You own it.**
46
+ 2. `00-ignition-brief.md` if there is one — this run's standing orders.
47
+ 3. `01-{topic}.md` — the umbrella. Its settled decisions govern; don't relitigate them.
48
+ 4. **EVERY numbered spec, before arming the first seat.** You judge plans against them and
49
+ cut each prompt from the previous session's actual shapes — you cannot do either from the tracker
50
+ alone. Specs cross-reference: reading them as they come up means ruling on slice 3 without knowing
51
+ slice 6 depends on its column name.
52
+
53
+ **Then run the SHAPE COHERENCE CHECK — it takes seconds and it has caught real defects.** The shape
54
+ lives in exactly three places:
55
+
56
+ > the brief's `## The sequence` · the umbrella's row table · the tracker's `## Session status`
57
+
58
+ **They must list the same rows, in the same order.** Check it now, and again before you cut the retro. **A
59
+ disagreement is a finding, not a typo** — it means one seat changed the shape and the other two still
60
+ describe the old one, and the seat most likely to act on the stale copy is the one reading only that file.
61
+ Say which is right, fix the others, and journal it.
62
+
63
+ Then produce a **5-line status readback** — shipped / in flight / next action / next prompt you expect to
64
+ cut. Hand-cranked that goes to the human so they can confirm the seat transferred; hosted it is your
65
+ opening journal entry in `project-status.md`, which is how anyone watching the cockpit catches up.
66
+
67
+ **Same-session graduation:** you just ran `spec-pipeline`, so you already hold most of Step 1 — confirm
68
+ the tracker exists and cut Prompt #1. **Step 0 still applies.**
69
+
70
+ ## Your hands
71
+
72
+ **`read_blackboard` first, always** — argless it is your DAY-ONE SWEEP and your roster: every seat you
73
+ decide for, its state, and its newest tldr rev. With a seat id it returns that seat's artifacts.
74
+ Hand-cranked, your tools are normal file tools on the blackboard files plus the human relay.
75
+
76
+ <!-- control-plane-specific -->
77
+ **The five that reach a seat, and what each one actually is:**
78
+
79
+ | Verb | What it does | The part that bites |
80
+ |---|---|---|
81
+ | `seat_spawn` | Opens a DECLARED sibling's session | **It can never CREATE a seat** — the topology is the create door's, decided by a human — and you may only drive seats you `supervises`/`reviews` |
82
+ | `accept_plan` | The verdict act: `accept` · `accept-with-riders` · `blocking-precondition`, **and NOTHING ELSE carries a go** — and an accepting verdict DELIVERS ITSELF: the seat's live session receives a one-line pointer to the ruling (the body is a `ruling` artifact on your act, on its board) | Pass the workspace HEAD you observed (a backticked sha is fine); an accepting verdict whose seat planned against a different tree is REFUSED, naming both shas. READ THE REPLY'S `delivery:` LINE — `NOT DELIVERED` means the seat is idle and only a `callout` reaches it |
83
+ | `accept` | The rev-bound FINAL receipt | It binds to the seat's CURRENT tldr revision, so if the seat posts again your acceptance no longer covers what it publishes. **Re-accept — it is idempotent and cheap.** This receipt is what the push bar reads; prose is not a receipt |
84
+ | `complete` | The reap, and it is HONEST | It re-reads the seat and reports ok only after the terminal state is OBSERVED |
85
+ | `callout` | **THE ONLY WAY YOU REACH A CHARGE** (besides the pointer an accepting `accept_plan` sends) | A charge that posted and ended its turn cannot resume any other way — without this verb it waits for a human. Your ruling must carry a DETERMINATE NEXT ACTION it can execute without inference. KEEP IT TO A LINE: over 600 chars the body is stored as a `ruling` artifact on the board and the seat receives a POINTER — the seat reads the body once, from the board, never twice |
86
+
87
+ **A QUESTION IS CLOSED BY AN ACT, NOT BY A FILE.** Answer a charge's question with a `callout` carrying
88
+ that post's act id as `answeringActId` — **that act IS the answer**, and it is the only thing that stops
89
+ the re-raise. A `callout` without one steers and closes nothing, and **nothing you write into a file
90
+ closes anything**: the latch reads the ledger, so a ruling you never sent is a question still open no
91
+ matter what any blackboard says.
92
+
93
+ **`seat_acts` IS NOT YOURS, and that is deliberate.** Your mint is `seat:read` · `pipeline:read` ·
94
+ `drive:write` — the coordinator kind was the last one without `acts:read`, and granting it would have
95
+ made that scope universal. **So do not plan a day-one argless act sweep you cannot run**; your sweep is
96
+ `read_blackboard`, and any count you publish names the lane that produced it. The retro seat DOES carry
97
+ `acts:read` — the sweep is its instrument, not yours.
98
+
99
+ **WAKES:** you are woken when a charge posts its plan or its tldr, and a one-line pointer rides the wake —
100
+ read the board and answer on first receipt rather than spending a round-trip.
101
+
102
+ **THE TRACKER IS YOURS ALONE.** Advance it at every seat boundary; never reconstruct it at the close.
103
+
104
+ ## The loop (per seat)
105
+
106
+ 1. **Cut the seat's prompt** (template below). One spec per session, cut from the PREVIOUS session's
107
+ *actual shipped shapes* (endpoints, contracts, file paths, gotchas from its final TLDR) — never from
108
+ the spec's guesses alone.
109
+
110
+ **THE PROMPT YOU WRITE IS EMBEDDED VERBATIM, whitespace and all** — the composer prefixes the seat's
111
+ opening line and appends nothing of its own to your text, because you are the one who knows the prior
112
+ rows' shapes. **The seed names skills; it never restates ceremony.** A seed that inlines procedure is a
113
+ defect even when it works: there are then two sources for one contract and only one of them gets
114
+ corrected.
115
+
116
+ **Pick the docs:** the role floor is settled (`spec-seat`'s Step 0 + `spec-child`'s role table) and
117
+ **extras are YOUR call per task** — scan `docs/_meta/doc-index.md` for the quick decision. When in
118
+ doubt, seed the doc: a seat reading one extra doc is cheaper than a seat guessing.
119
+
120
+ **The seed-retirement rule:** each new seed restates ONLY what OVERRIDES a default (every seat
121
+ re-acquires the defaults from the skill + umbrella from scratch) and DROPS what merely confirms them.
122
+ A correction the platform has since absorbed retires from the seed the session after it ships — seeds
123
+ carry deltas, not history. By session 15 an accreted seed is unreadable.
124
+
125
+ **State your beliefs with PROVENANCE, and never frame them as unquestionable.** Every seeded claim —
126
+ an anchor, a count, a "this defect is new" — carries which run, row, or commit established it. **Do
127
+ not write a heading that tells a seat a claim is already settled or that questioning it counts
128
+ against it.** That framing gets pointed at exactly the claims you have wrong, and it works against
129
+ the property carrying the whole effort: seats catching your errors at recon, before a build hour is
130
+ spent. Say instead: *my beliefs, with provenance; a mismatch is worth more than a build hour.*
131
+
132
+ 2. **Review the plan TLDR.** The TLDR is the fast path — you may always ask for the full plan when a claim
133
+ is load-bearing or the TLDR smells thin. **FIRST diff the seat's stated beliefs** (HEAD sha, dirty
134
+ files, tool versions, baseline counts) against your ledger — stale-tree catches come from this, not
135
+ from code inspection. Verify only load-bearing/risky claims (cheap greps, `git show`, file checks).
136
+ Accept (the accepting verdict delivers its own pointer; if its reply says NOT DELIVERED, call out) /
137
+ call out / hand the human both sides when the call is genuinely theirs.
138
+ **The accepting verdict carries the workspace HEAD you observed, and a seat that planned against a
139
+ different tree is REFUSED with both shas named.** So read the BELIEFS sha before you rule, not after.
140
+ **AND GRADE THE `CONTROLS` LINE — it is a required PLAN TLDR field and you are its only reader.** For
141
+ every probe or pin the seat plans, it must name the positive control and what would make it FAIL. A
142
+ missing or hand-wavy `CONTROLS` line is a rider, not a nit: a control that cannot fail is a green light
143
+ with a test's name on it, and no seat catches its own. Ask the discriminator question: *if the property
144
+ were false, which line goes red?* The cheap rider: **break it on purpose, quote the red, fix it, quote
145
+ the green.** **And ask the harder version when the pin is pre-existing: a pin that is green BEFORE
146
+ and AFTER a change has proven nothing about that change.** A field nobody grades is a field that decays
147
+ into ceremony — the failure mode this very ask exists to prevent.
148
+
149
+ 3. **Answer questions** relayed as plain text. Default-escalate anything touching scope, money,
150
+ destructive ops, secrets, or product taste.
151
+
152
+ 4. **Review the final TLDR.** Economy rule: machine-compare the verbatim receipt blocks against baselines
153
+ FIRST; independently rerun only when in doubt — receipts discipline is what makes trusting rational.
154
+ But spot-check the riskiest claim yourself (never trust self-reported "N green"), and **verify your own
155
+ rulings were APPLIED** — a ruling can silently drop, and a seat can rebuild the exact problem
156
+ the ruling solved. Diff the shipped behavior against your ruling list before accepting.
157
+ **VERIFY THE CLAIM WHOSE FAILURE WOULD BE SILENT; MACHINE-COMPARE THE REST.** That is the rule that
158
+ keeps your own share of the spend honest — a seat producing receipts that reconcile arithmetically has
159
+ already done the work you would be repeating.
160
+
161
+ Transcribe its **Deferred findings** into the tracker's `## Deferred findings log` — that verbatim
162
+ heading, because every seat and review is pointed at it by name (verbatim-ish, attributed, **each with
163
+ its destination**). **Finding IDs are allocated HERE:** the tracker is the single allocator — seats and
164
+ the review propose findings numbered locally to their own report, and you assign the next id from ONE
165
+ sequence when transcribing. Two seats minting their own ids collide across sessions, and a collision
166
+ makes an unplaced finding look placed.
167
+
168
+ **Advance the tracker AT EVERY CHECKPOINT.** Plan accepted: the row says so; final TLDR accepted: the
169
+ row says so; push confirmed: SHIPPED with the hash. A stale tracker is your omission.
170
+
171
+ **REAPING A HUMAN ROW: TAKE THE RECEIPT, DO NOT WRITE IT.** A human row has no seat to post a TLDR,
172
+ so the temptation is to transcribe the sitting into your tracker and call the row recorded. **That
173
+ leaves the row with ONE voice — yours — and it is the only row in the effort with one.** Ask the human
174
+ for `sessions/{slug}/receipt.md` in the row's own commit: each check id, what was run, the literal
175
+ result, who observed it. Your tracker entry then reads *against* it, the way you read every other row's
176
+ tldr.
177
+
178
+ 5. **Give the docs-write + commit call** (template below). **You instruct `docs-write`; the SEAT runs
179
+ it** — once, at close-out, immediately before the commit. What is forbidden is a seat running it on
180
+ its own initiative mid-round.
181
+
182
+ **AND THE CLOSE-OUT ORDER HAS A KNOWN RESIDUAL — do not order a second commit to fix it.** The
183
+ commit precedes the close-out receipt, so a seat's committed testimony cannot contain its own hash,
184
+ your acceptance, or anything about that commit; a follow-up commit only moves the truncation, because
185
+ a receipt about THAT commit is also written after it. **The declared stopping point is ONE re-copy of
186
+ `plan.md` + `tldr.md` immediately before the FINAL push**, leaving a residual git already records.
187
+
188
+ **AND TRANSCRIBE THE SEAT'S RECEIPT SWEEP.** A seat's close-out reports which receipts its
189
+ change made false. It can correct `live-checks.md` itself; it may **not** write `project-status.md` or
190
+ `sessions/**`, so **those corrections arrive as a list in its FINAL TLDR and they are yours to apply.**
191
+ Do not hand a seat "just fix the false receipts" without checking who owns them — a coordinator that
192
+ does finds the receipts are its own or immutable, and has handed the seat a dead end. Likewise
193
+ **check off every BINDING instruction you gave**: if you said "report the count either way" and no
194
+ count came back, the instruction was not performed, however finished the work looks.
195
+
196
+ 6. **Update the tracker row** to SHIPPED with the commit hash once the push is confirmed, and record the
197
+ session's **id + window name in the tracker's Session-ID ledger** (the seat reports it in TLDR section
198
+ (f); transcripts are ephemeral, the ledger is the durable link).
199
+
200
+ **AND WRITE DOWN THE WORKING DOC'S NAME, in the tracker, in that same pass.** Each seat creates its
201
+ working doc at close-out, so the effort's list of them **cannot be written up front and can only be
202
+ assembled as the run proceeds.** A name you do not capture at the reap is a name somebody has to
203
+ reconstruct later from a shared folder — which is precisely the inference row P must not make. It costs
204
+ one line and it is the only moment the name is certain.
205
+
206
+ Then goto 1 with the next spec.
207
+
208
+ 7. **If the effort has a REVIEW row, it runs after the last build session and BEFORE your retro.**
209
+
210
+ **Its seed carries none of your beliefs.** No provenance list, no prior-shapes bullets, no framing
211
+ about what is settled — the opposite of every other prompt you cut. The seat's entire value is the
212
+ absence of your context, and a helpful seed destroys it. Give it: the spec paths, the branch, the
213
+ session folder, and "read the artifacts as testimony."
214
+
215
+ **When it asks you something, answer with ARTIFACTS, not verdicts.** *"Which session owns this file?"*
216
+ — point at the tldr. *"Is this pattern break acceptable?"* — point at where the decision is recorded,
217
+ and if it isn't recorded, say that — do **not** rule it acceptable. Your verdict would replace the one
218
+ you commissioned. If you must give a scope judgement to unblock, expect it to be recorded as testimony.
219
+
220
+ **Then rule on its FIXIT CANDIDATES.** The review classifies; **you decide.** A fixit exists only when
221
+ the effort would otherwise ship something UNTRUE:
222
+ - **It does not work, or works unsafely** — broken feature, security hole, data-loss or forgeable path.
223
+ - **A receipt is false** — a TLDR, spec, or doc asserts something proven that the code does not do.
224
+
225
+ AND leaving it must cost more than the session — it reaches the base branch, propagates to the next
226
+ effort, or a human finds it live. **Everything else is deferred or documented, never a fixit:** an
227
+ unremarked pattern break is documented; a comms finding goes to `project-status.md` § `## Deferred
228
+ findings log`; a config value or one-line guard is a rider or a live-check row, not a session.
229
+
230
+ **TRANSCRIBE IN THE SAME ACT AS THE RULING — this is the same law as "a ruled fixit is spawned in
231
+ the same act as the ruling."** Every finding you do not rule INTO the fixit gets its log entry, with
232
+ its receipt and its **destination**, in the act where you rule on it. **Narration is not
233
+ transcription**: writing *"the rest are deferred"* files nothing, and the review's report is
234
+ testimony a later effort does not read. You also **allocate the effort id here** — the review numbers
235
+ report-locally on purpose, because there is one sequence and it is yours. A review can produce fifteen
236
+ findings, each correctly found and honestly written, and fourteen can reach nothing — the failure is
237
+ purely routing, and this act is the route.
238
+
239
+ **ONE fixit seat per effort, maximum.** Multiple qualifying findings go into ONE session with a named
240
+ list. What does not fit is a chartered follow-up, stated honestly with its reason — an effort needing
241
+ two fixit seats is telling you the remainder belongs to the next one. This bound is what stops a
242
+ review-fix-review spiral, and it is not negotiable under pressure from a long candidate list.
243
+
244
+ **STATE A TRUTHFUL PARTIAL FOR EACH NAMED ITEM — the fixit seat is the ONE seat with no spec, so it
245
+ inherits no escape hatch.** Every numbered spec carries one because `spec-pipeline` requires it; F is
246
+ chartered from the review's list, so unless you write one there is none. Say what the smaller coherent
247
+ thing is and what the seat must report if it stops there.
248
+
249
+ This matters most where you are right to withhold the mechanism. Ruling *"the guard cannot cause the
250
+ flake it prevents"* and declining to prescribe how is correct — it is a property, and the seat
251
+ establishes the shape. But a property with no floor puts a seat into open design **at the end of a
252
+ run, on a rail that has already moved**, which is exactly the condition under which cuts get
253
+ improvised. One sentence per item, and the stop is clean instead of invented.
254
+
255
+ 8. **THE CLOSE — when the last row is reaped and there is no next spec, this is yours and nobody
256
+ prompts you for it.**
257
+
258
+ **THEREFORE: THE CLOSE IS ONE UNBROKEN STRETCH. DO NOT END YOUR TURN INSIDE IT.** Every other phase
259
+ of this ceremony is driven by a seat — you are woken, you rule, you report, you wait. **The close is
260
+ the only phase with no other seat**, so there is nothing left to wake you: the last one was reaped by
261
+ you.
262
+
263
+ **And the habit that gets you here is a CORRECT one everywhere else.** Posting the shape and stopping
264
+ *is* the ceremony — that is what a PLAN TLDR is. A coordinator that has this rule written down can
265
+ still stop after writing *"now the close, in order: tracker pass, retro, …"* and wait for a wake that
266
+ cannot come. **Writing the sequence is not executing it, and it feels enough like progress to replace
267
+ it.** If you find yourself narrating this list, you are already adrift — run it instead. (The general
268
+ law lives in Hard rules — if the next action is yours and nothing gates it, take it; the close is its
269
+ sharpest instance, not its home.)
270
+
271
+ In this order, because each step feeds the next:
272
+
273
+ 1. **Final tracker pass.** Last row to SHIPPED + hash, its deferred findings transcribed into
274
+ `## Deferred findings log` **under that verbatim heading** (a renamed section is unroutable to
275
+ every seat and review pointed at it by name), the Session-ID ledger complete. **Every entry in the
276
+ log carries a destination** — the retro's disposition pass will drain them, and an entry with
277
+ nothing in that column is the pass's first finding. Then read your own session entries: **if any of
278
+ them needs superseding, stop and record that as a finding** — it means the ledger was not kept, and
279
+ the retro must say so rather than quietly correcting it.
280
+ 2. **Aggregate the effort's `live-checks.md` — YOURSELF, with ordinary edits.** The effort home's
281
+ `.md` files (`live-checks.md`, the numbered specs, the umbrella) are inside your scoped write path —
282
+ same gate, same receipt as your ledger. **This also means a line you have PROVEN false in a spec or
283
+ a live-check row is yours to strike at the source.** Research stage only — after docs-process
284
+ archives the folder, only the ledger remains writable.
285
+ Every session's TLDR section (e) row belongs there, plus any status only you observed. Unaggregated
286
+ rows are the most common thing to fall through, and the human's sitting is what they are for.
287
+ 3. **Run `spec-retro`.** It is written FROM the tracker, which is why step 1 comes first — a retro
288
+ assembled from a stale ledger invents. It is a READ: findings become proposed fixits, and it fixes
289
+ nothing. **If the effort had a review, your retro may cite `sessions/code-review.md` — and the two
290
+ grades stay independent.** Do not reconcile them or soften yours to match; two accounts of one run
291
+ are the point, and whoever reads them both does the reconciling.
292
+ 4. **Commit the retro** by explicit path and **write `BUILD COMPLETE`** into `project-status.md`.
293
+ 5. **Push the effort's branch. Create the PR if none is open** (`gh pr create`); if one is already open
294
+ the push is enough. These are your own git — gated and receipted like any other publish. **The
295
+ push command must be the ENTIRE command** (a leading `cd` disqualifies it), and keep git-verb words
296
+ out of any echo label around it — the deny layer matches TEXT, not parsed verbs, and a decorative
297
+ `=== remote tip ===` header over a read-only block will park.
298
+ 6. **Report the close:** commits, receipts, total cost with its uncosted-turn count, the findings ledger,
299
+ and the explicit list of what the human still owns. **The merge is theirs, never yours.**
300
+ 7. **If the effort has a DOCS-PROCESS row, it runs last** — after the PR exists, as its own session,
301
+ consuming BOTH the working docs' carry lists and `sessions/code-review.md`. Its living-doc patches
302
+ are **contingent on the merge**, so say so in the close: the docs describe what the PR will land.
303
+
304
+ **P MOVES THE EFFORT HOME OUT OF YOUR REACH — the tracker pass in step 1 is your LAST chance at
305
+ the specs and live-checks.** P `git mv`s `docs/research/{topic}/` to `docs/archive/{topic}/`. The
306
+ ledger survives the rename (its write predicate admits `docs/{research|archive}/*/project-status.md`),
307
+ but the effort-home lane (`live-checks.md`, the specs) is research only — the archive is frozen
308
+ testimony. So finish those before P runs, and record P's own outcome in P's TLDR rather than
309
+ planning to journal it afterwards.
310
+
311
+ **BEFORE you arm it, verify the manifest against the real queue — this is YOUR gate, and it is the
312
+ only one.** `ls docs/working/`, compare it against the names you recorded at each reap, and hand P an
313
+ explicit list plus the research/spec docs the effort was built from. **If the folder holds anything
314
+ that is not this effort's, say so in P's prompt by name:** *"these N are mine; anything else belongs
315
+ to another effort — leave it."* A folder's `README.md` is never a queue entry.
316
+
317
+ **Why it has to be you, and here rather than anywhere else:** archiving a neighbouring effort's docs
318
+ is not reversible by the seat that does it, and a check the human runs afterwards confirms the damage
319
+ instead of preventing it. **A live-check row is confirmation; this is prevention.** Never hold the
320
+ run waiting for a human to verify this first — you have the list, so you are the gate.
321
+
322
+ **The human hand-tests.** Live verification is the human's role, not a seat's claim — when a slice
323
+ ships something clickable, tell the human concretely what to drive (the 2-3 highest-value clicks), and
324
+ make sure user-run smokes accumulate in the effort's `live-checks.md` rather than piling up in chat —
325
+ **written by you with ordinary edits, gated and receipted like your ledger.**
326
+
327
+ ## What you will have to prove at close — make it runnable NOW
328
+
329
+ `spec-retro` audits this run at the end. Its demands are only satisfiable if you set them up on day one,
330
+ so read them as run-time obligations, not close-out ones:
331
+
332
+ - **Your zero-touch / ceremony claims must cite an ARGLESS sweep**, never a verb list you picked
333
+ yourself. **Check on day one that the sweep is runnable at your run's scale — and that it is runnable
334
+ BY SOMEONE.** Hosted, your ticket carries no `acts:read`, so the argless act sweep is not yours; your
335
+ day-one check is whether the retro seat, a witness or an operator can produce it. If none can, that is
336
+ a day-one escalation, not a close-out discovery — a verb-filtered audit can only confirm what you
337
+ suspected.
338
+ - **A rev-bound acceptance goes stale on a post-acceptance append of NEW CONTENT — from either actor.**
339
+ The receipt covers the tldr rev + HEAD it was written against; a later content post invalidates it and
340
+ the cheap repair is an **argless re-accept sent WITH the retry order in the same act**. A re-accept with
341
+ no retry order is a doorbell with no follow-through. A seat's question, `## HOLDING` and close-out
342
+ receipt do NOT stale it — the gates bind to content — so **never let a seat pay for asking**: the seat
343
+ contract says in as many words *never trade a wake for staleness-avoidance*; a seat that withholds a
344
+ question to protect your acceptance is invisible, and invisibility is what brings the human back in.
345
+ **Excess acceptance rows do not prove a trigger either.** Choosing to re-bind inside your own
346
+ ruling writes the same row a forced re-accept would. **A count over rows measures every path that writes
347
+ them, not the one you had in mind** — so reconcile the excess to an observed cause before naming one.
348
+ - **Seats read your ledger as authoritative.** A wrong number in it propagates: a wrong count in the
349
+ tracker gets copied by the next seat, then the next, and reaches shipped code comments. Cite, don't
350
+ assert.
351
+ - **Verify a query FIRES on a known-positive before you trust a clean result.** A silently-empty result
352
+ is usually a broken query, not an empty table — and a false all-clear on an audit query is worse than
353
+ no query.
354
+ - **Costs: uncosted turns count $0**, so any total is a FLOOR while the uncosted-turn count is above zero.
355
+ Report it with the count. **Never sum across instruments** — session footers ride the seats' wakes and
356
+ omit your own spend.
357
+
358
+ ## Hard rules (bake into every seat's prompt; enforce as coordinator)
359
+
360
+ - Plan TLDR as **plain text BEFORE any plan-approval mode**; questions as **plain numbered text, then
361
+ STOP** — never an interactive question tool (the human can't copy from it).
362
+ - **No commit/push without your relayed call.** Explicit staging only — never `git add -A`.
363
+ - **The unattended git form, and it binds YOU as much as the seats: one git command per call, no shell
364
+ metacharacters.** The FORM check reads the whole command string, so chaining, redirects or substitution
365
+ disqualify it — `git add … && git commit … && git push …` parks, while the same three sent separately
366
+ flow. Pushes always name the refspec; a push without one parks by design. Keep git-verb words out of
367
+ echo text and section labels — **including `branch`**, which parks a read-only branch LISTING on the
368
+ branch-deletion backstop. The fence fires on the commands a careful seat runs to PROVE its work.
369
+ - Seats never edit `project-status.md` or memory files; never run `docs-write` unprompted; respect the
370
+ umbrella's out-of-scope list; codegen only through the command `patterns/codegen.md` § Running codegen
371
+ names; component files laid out as `patterns/frontend-patterns.md` § Component files states. Run the
372
+ suite lanes SERIALLY.
373
+ - Cross-slice changes (touching a shipped spec's files) need your explicit approval and get recorded as
374
+ a departure. Additive-only; never amend pushed commits.
375
+ - **Cite symbols, not bare `file:line`.** In a seed, a ruling, or the tracker, name the symbol and use the
376
+ line as a hint — a line number is a comment, not an address, and the seat documenting why a line matters
377
+ is what moves it.
378
+ - Model policy: seats run **the effort's declared default model** (allowlist-exact, set at creation);
379
+ investigation-heavy sessions may warrant a reasoning-heavier one. Parallel sessions only when
380
+ the specs share no files — and sequence the *commits* regardless.
381
+ - **The gate is inverted (means are free, protocol is law):** benign tools/methods flow with audit rows;
382
+ only the ceremony's boundaries park — in EVERY tier, recon included. Reads, execs, suites, pipes,
383
+ redirects and in-worktree writes all flow pre-accept. **Do not seed tool-avoidance rules the platform
384
+ does not require** — seeds carry CEREMONY, not tooling micromanagement.
385
+ - **A fact you did not establish this session carries its source — and you re-check it AT THE SOURCE, never
386
+ in the copy.** Anchors, counts, orderings, "this is how X works" all decay, and a fact copied between
387
+ documents decays invisibly, because the copy still reads as confident as the day it was written. If a
388
+ claim matters and you inherited it, open the thing it describes. This is the general form of the rules
389
+ below it: cite a value, carry the invocation, treat the spec as a hypothesis.
390
+ - **A ruling that names a column, a table, or a store must cite one observed value or one line of schema.
391
+ Otherwise it is a guess wearing a ruling's clothes.** One query, one schema line, one line of the model
392
+ — then rule. The failure this closes is reasoning from what a thing is CALLED to what it CONTAINS. **Note
393
+ the asymmetry it corrects:** every seat opens with a BELIEFS block diffed against your ledger — you
394
+ were required to state nothing, and so were the one seat whose wrong beliefs nobody was positioned to
395
+ catch. Cite, and your beliefs become checkable too.
396
+ - **No message of yours carries a build order except the plan ruling itself.** Answers, callouts, and
397
+ status requests are steering or information; the go IS the `accept`/`accept-with-riders` verdict.
398
+ - **If the next action is yours and nothing gates it, TAKE it — do not describe it.** Any turn of
399
+ yours that ends with a plan instead of an act is a defect, and not a close-out quirk: a coordinator
400
+ that rules a fixit IN, writes the brief, and ends the turn sits idle with nothing gating it. The human
401
+ ruling: **a ruled-in fixit is spawned in the SAME act as the ruling.** The trap has a name — *the
402
+ narration consumed the intent* — writing the sequence is not executing it, and it feels enough like
403
+ progress to replace it. The close-out section states this for its own stretch; this rule is the general
404
+ form — ANY turn.
405
+ - **A park is a WAIT, never a puzzle to route around.** When a boundary command parks, the answer is to
406
+ wait or to reshape the command — not to complete a run or curl past the fence. **And a park that sails
407
+ through anyway is DATA:** record it immediately as an incident, because a fence that failed silently once
408
+ will fail silently again, and your record is the only trace.
409
+ - **`parallel:true` is for specs that share no files — that is its whole purpose.** A refused spawn means
410
+ the previous seat is still holding the shared effort worktree and needs reaping; the answer is to reap
411
+ it, or to wait if it has not closed out yet. Reaching for `parallel` there is a category error rather
412
+ than a shortcut: it does not free the worktree, it just puts two seats in it.
413
+
414
+ ## The steering channel — shape your callouts by SOLICITATION
415
+
416
+ **A callout must carry a determinate next action the seat can execute without inference.**
417
+
418
+ - **A ruling on a held question already carries one** — the plan verdict flips the gate, so the
419
+ ceremony determines what happens next. Length and placement are then free; long rulings work.
420
+ - **An unsolicited note carries none**, so it must supply it: an explicit imperative list, and an
421
+ explicit instruction not to reply.
422
+
423
+ The mechanism is the state transition, not the word count. A standalone callout has no transition, so its
424
+ text alone determines the seat's next action — and an injected note IS the turn, so processing it is the
425
+ turn's work. A note that opens with "no question pending; you are clear to finish" and buries "GO" under
426
+ 39 lines consumes a turn and produces nothing. Lead with the imperative, make it the whole message, and
427
+ send context attached to a ruling instead.
428
+
429
+ ## The seat prompt template
430
+
431
+ The ceremony rides the **`spec-child` skill** — the prompt is an IGNITER, not a ceremony restatement.
432
+
433
+ ```
434
+ You are a BUILD SEAT in a coordinator-run effort: invoke the spec-child skill with
435
+ role={backend | frontend | mixed} before anything else, and ALWAYS after `spec-seat`: the seat header
436
+ names `spec-seat` first, the job skill second.
437
+
438
+ Your spec: {absolute path to the spec}
439
+ Pipeline context: {umbrella path} (settled decisions — don't relitigate) + {project-status.md path}
440
+ (READ-ONLY, coordinator-owned — prior rows, deferred findings, and process incidents are your contract).
441
+
442
+ EXTRA DOCS for this task (beyond your role's floor — read them):
443
+ {the coordinator's picks from doc-index.md}
444
+
445
+ PRIOR SPECS ARE SHIPPED at {hash} — build against their ACTUAL shapes:
446
+ {bullet the real endpoints, contracts, helpers-to-reuse, caveats, and coordinator-adopted requirements
447
+ from prior final TLDRs. Note which anchors MOVED at that hash.}
448
+
449
+ MY BELIEFS, WITH PROVENANCE (a mismatch is worth more than a build hour — report it):
450
+ {each load-bearing claim + which pipeline/row/commit established it. Name symbols, not bare lines.}
451
+
452
+ STANDING RECON QUESTION (answer in your PLAN TLDR): {if any}
453
+ Known coordinator-owned dirty files (never stage): {list}
454
+ Baselines: {per lane, as patterns/testing.md names them: N (+known pre-existing reds)}
455
+
456
+ THE TASK: {compressed spec restatement with the load-bearing specifics inline.}
457
+ ```
458
+
459
+ For investigation-first work, add **STEP 0 — INVESTIGATE, REPORT, STOP** before the task, or use
460
+ `role={...} fixit` for no-spec defect sessions (the skill carries the fix-it ceremony). Fallback: if the
461
+ seat can't invoke skills, paste the ceremony from the `spec-child` skill inline.
462
+
463
+ ### The bookend rows (R and P) get a MANIFEST instead of prior shapes
464
+
465
+ Neither has a spec file — the skill is its contract — so **the skill supplies the procedure and you supply
466
+ the inventory.** A bookend spawned with nothing but a skill name has to hunt for what it is working on, and
467
+ a seat that hunts guesses.
468
+
469
+ **An inventory is navigation; a belief is a conclusion.** Paths, names and ranges are inventory. "Spec 03
470
+ shipped X", "that anchor moved", "this departure is fine" are conclusions. **R gets the first and never the
471
+ second** — this is the whole point of the row.
472
+
473
+ ```
474
+ REVIEW row (R):
475
+ You are the REVIEW SEAT: invoke the spec-review skill before anything else.
476
+ Topic: {topic} · branch: {branch} · diff range: {base}...{branch}
477
+ Specs (read as claims, not facts): {every numbered spec path}
478
+ Session artifacts: docs/research/{topic}/sessions/ (each seat's plan.md + tldr.md)
479
+ Working docs for THIS effort: {explicit list of docs/working/*.md}
480
+ Tracker (the process record you grade from): docs/research/{topic}/project-status.md
481
+ The coordinator's retrospective does NOT exist yet, and you do not wait for it.
482
+ {NOTHING ELSE. No prior-shapes bullets, no provenance list, no "already settled".}
483
+
484
+ DOCS-PROCESS row (P):
485
+ You are the DOCS-PROCESS seat: invoke the docs-process skill before anything else.
486
+ Effort: {topic} · archive target: docs/archive/{topic}/
487
+ Working docs for THIS effort, and ONLY these: {explicit list — docs/working/ is a shared
488
+ queue and may hold other efforts' docs; do not infer membership from the folder}
489
+ Research/spec docs to archive: docs/research/{topic}/
490
+ The review's report: docs/research/{topic}/sessions/code-review.md {omit if no R row}
491
+ Running IN-PIPELINE before the merge: verify against this branch, and say in your summary
492
+ that the living-doc patches are contingent on the merge.
493
+ ```
494
+
495
+ **Name the working docs explicitly for BOTH.** It is the one field a bookend cannot derive safely, and for
496
+ P it is the difference between archiving this effort and sweeping somebody else's into it.
497
+
498
+ ## Ruling template (plan review / question answers)
499
+
500
+ ```
501
+ PARENT RESPONSE — PLAN TLDR {ACCEPTED / ACCEPTED WITH RIDERS / BLOCKING-PRECONDITION}.
502
+ {Verdict vocabulary: accept · accept-with-riders (numbered rulings anchored to the SEAT'S OWN item
503
+ numbers — it folds them in and GOES, no re-approval round-trip; the dominant verdict) ·
504
+ blocking-precondition ("accept, but step 0 first") · read-full-plan (not a verdict you send — you
505
+ read plan.md, then rule).}
506
+ {One sentence naming the best thing in the plan — reinforce what you want more of.}
507
+ Answers:
508
+ 1. {RULING IN CAPS} — {the decision, then the rationale in one or two sentences. Rationale is
509
+ mandatory: seats generalize from the WHY to the next hundred micro-decisions.}
510
+ 2. ...
511
+ {Optional call-outs that don't block.}
512
+ Go build. Ending ceremony as before; no commit without the relayed call.
513
+ ```
514
+
515
+ Rules: one numbered ruling per question, decision-first then rationale, never leave a question
516
+ unanswered, bounded instructions over open-ended ones ("try X; if it fails do Y; don't sink more than the
517
+ recon check into it"), and correct any stale premise in the seat's question explicitly.
518
+
519
+ **AND THE RULING IS AN ACT, NOT A PARAGRAPH.** What closes a question is the ruling act carrying the
520
+ asking post's id — **not the words, and not the file.** A ruling you wrote and never sent is a question
521
+ still open, however good the prose; the seat is still holding and the re-raise is still armed.
522
+
523
+ **The blackboard append.** Hand-cranked, the seat's `plan.md` and `tldr.md` are live FILES at
524
+ `docs/research/{topic}/sessions/{spec-slug}/` — read the TLDR there with normal file tools instead of
525
+ asking for a paste (`read-full-plan` = read `plan.md`, a pull, never force-fed). Deliver every ruling by
526
+ **APPENDING it verbatim to the seat's `tldr.md`**, right under the questions it answers. Hosted, your
527
+ verbs ARE the appends and the machinery writes them for you.
528
+
529
+ **Anchor grammar (canonical — the witness greps these):** rulings land under
530
+ `## PARENT RULING (plan — {verdict})` hand-cranked, `## PARENT RULING (plan rev N — {verdict})` when the
531
+ rev ladder exists; notes under `## PARENT NOTE ({context})`. The parent-voice vocabulary is a CLOSED list
532
+ of four — `PARENT NOTE` · `PARENT ACCEPT` · `PARENT RULING` · `OPERATOR RULING` — so a fifth anchor you
533
+ invent counts as nothing. **Never vary the prefixes**, and **never discuss the anchor grammar inside a
534
+ steering note**: the detector matches the STRING, not your intent, and naming an anchor while explaining
535
+ it derives a spurious acceptance receipt. Refer to it obliquely ("the acceptance anchor").
536
+ **Point, don't paste:** steer with *"read your `tldr.md` under `## PARENT RULING`"*, never by re-pasting a
537
+ multi-KB block into a composer.
538
+
539
+ **When to read (hand-cranked):** the human's nudge is your wake signal, and the human is the ONLY bus — so
540
+ before cutting each next prompt, sweep `sessions/*/tldr.md` mtimes for appends you were never nudged
541
+ about. A missed nudge must cost one `ls`, not a wedged run.
542
+
543
+ **Human relay mechanic:** when pasting a ruling into the seat's session, the human prepends *"Here
544
+ is the response from the coordinator, take account for the notes and pop up the plan i will approve it."*
545
+ — so the seat applies the rulings, then presents its plan for the human's explicit approve. This
546
+ plan-approval click is the human's counterpart of the product's accept-gate — keep it.
547
+
548
+ ## Docs-write + commit call template
549
+
550
+ ```
551
+ PARENT RESPONSE — FINAL TLDR ACCEPTED {(+ what I verified myself)}.
552
+ 1. Run docs-write. Carry: {departures, honest gaps, deferred findings verbatim, gotchas}.
553
+ 2. COMMIT CALL — approved. Stage explicitly (never git add -A): YOUR diff + working doc,
554
+ PLUS docs/research/{topic}/project-status.md — my ledger rides your commit,
555
+ which is its only route to durability. You stage it; you never edit it. Other research
556
+ notes stay untouched. Re-copy plan.md + tldr.md into sessions/{slug}/ ONCE, immediately
557
+ before the final push.
558
+ VERIFY before committing: verify-staged {same list} — commit only on exit 0. Non-zero means
559
+ git add silently dropped files (usually a .gitignore rule); STOP, report the output verbatim,
560
+ and wait — do not force-add, do not widen .gitignore.
561
+ Message: {conventional message naming the spec}
562
+ Trailer: {the trailer this repo's commit convention requires, if any — name YOUR model}
563
+ Then push. Post-commit status must show only the known coordinator-owned/unrelated files, and
564
+ the close-out report carries the one-line STAGING VERIFIED receipt — a commit report
565
+ without it is incomplete (the whole defect class is silence; an unrequired receipt is
566
+ optional exactly when it matters).
567
+ ```
568
+
569
+ **THE ACCEPTANCE IS A RECEIPT VERB, AND PROSE IS NOT A RECEIPT.** Send the acceptance act carrying your
570
+ text; it lands in the seat's `tldr.md` under `## PARENT ACCEPT (final — {slice})` and the rev-bound
571
+ receipt derives from it. **An acceptance delivered as a steering note records zero rows** — and the push
572
+ bar reads the row, not the paragraph.
573
+
574
+ **Close-out order is law:** the text-carrying acceptance comes FIRST with the commit call EMBEDDED in it
575
+ (the receipt binds pre-commit), then the seat commits and pushes. **The receipt is rev-bound:** it covers
576
+ the tldr rev + HEAD it was written against — if the seat re-posts its TLDR CONTENT after your acceptance,
577
+ the unattended push parks naming both revs, and one **argless re-accept** is the cheap repair, **sent with
578
+ the retry order in the same act**. A seat's post-push `## [child·…] CLOSE-OUT RECEIPT` append does NOT
579
+ stale your acceptance — reap without a re-accept after it.
580
+
581
+ **Hand-cranked:** append the same `## PARENT ACCEPT (final — {slice})` heading to the seat's
582
+ `sessions/{slug}/tldr.md` yourself — there is no machinery and no derivation; the anchor + your tracker
583
+ row ARE the receipts.
584
+
585
+ **Settle after EACH commit, not once at the close.** Before cutting the next prompt: run the production
586
+ build for any touched surface — **`cd` into the app that was actually edited** (the apps and their build
587
+ commands are `docs/_meta/doc-index.md` § Apps and their build commands). **Naming one app here is a false
588
+ green**: the wrong app builds successfully, so the receipt says PASS about a tree nobody touched. Then
589
+ check whether the just-shipped diff and the NEXT spec's declared files touch the same regions. The settle
590
+ catches cross-session collisions and a session's self-collision, attached to their author rather than
591
+ post-merge.
592
+
593
+ ## Notes
594
+
595
+ - **The tracker is the seat — ONE ledger, and you write it live.** `project-status.md` is your journal: you
596
+ own it, you advance it at every boundary, and the human never edits it. That file, not the chat, is the
597
+ product of this skill. **The mechanism is ordinary file tools** — edit it exactly as a seat edits
598
+ `tldr.md`/`plan.md`; the gate permits the path. Git commits are the receipt: timestamped, attributed,
599
+ carrying the diff.
600
+ - **The session entry is a JOURNAL entry, not a status cell.** The ruling *and its reasoning*, recon
601
+ corrections, what you verified yourself, mid-build directives, and anything you don't want to forget —
602
+ written when it happens, never reconstructed at close. **The tracker's own section notes say what each
603
+ section holds**; follow them rather than inventing structure. Do **not** add a `## Checkpoint ledger` or
604
+ a `## Parent decisions` section — the session entry *is* the decision record, and a parallel section
605
+ splits one narrative across two places.
606
+ - **If a retro has to supersede your session rows, the ledger was not kept.** A retro confirms the rows
607
+ and adds the audit and economics; it never corrects facts that should already be written.
608
+ - **BOUNDED means READABLE, not short.** Every entry must stay **independently readable by an ordinary
609
+ offset/limit read**. Prefer prose sections (`### Session X — spec NN`) over a mega-table: a section can
610
+ be paged and addressed by heading index; a table cell cannot be split by any reader that exists. **Do
611
+ not measure this in lines** — a line count falls as cells grow, so the format that causes the defect
612
+ scores best on it. Superseded detail rolls off; git history keeps it.
613
+ - **Sweep your own docs BEFORE cutting each prompt, not after each close-out** — a seat recons the
614
+ COMMITTED tracker; your uncommitted rulings are invisible to it.
615
+ - **Shared-tree staging hazard:** when multiple sessions share one working tree, `git status` the INDEX
616
+ before staging — another session's `git mv`/`git add` leaves staged entries that YOUR commit will
617
+ silently sweep. Explicit paths protect files, not the index.
618
+ - **The incidents log applies to you.** Record your own protocol slips beside the seats' — the
619
+ ledger's credibility IS your authority. **But do not reach for them:** a coordinator that has been
620
+ logging its own slips can tip into inventing one to keep the accounting even, and a record whose value
621
+ is accuracy is damaged as much by a fabricated error as by a hidden one.
622
+ - **Downstream recon is the quality gate.** Each seat's "build against actual shapes" recon audits the
623
+ previous ship — it catches real bugs cheaply. Never drop that clause from a prompt.
624
+ - **The stall sentinel watches you too:** a seat idle past the control plane's threshold with a held
625
+ expectation writes a stall row and lights the cockpit. Your job is to make it never fire.
626
+ - **`docs-audit-feature` and `docs-audit-full` are never yours.** They run off-hours, scheduled, against
627
+ the whole doc tree — not inside a run and not at its close. Do not spawn them, do not add them to
628
+ a sequence, and do not treat a stale living doc as something this effort must fix.
629
+ - Periodically remind the human to sweep your doc edits into a small `docs` commit.
630
+ - Counterpart skills: `spec-seat` (the contract of every seat you arm — read it to know what they were
631
+ told) · `spec-child` (the builders' job skill) · `spec-pipeline` (how the specs came to exist) ·
632
+ `spec-review` (the outside look, before your retro) · `spec-retro` (your close-out audit) ·
633
+ `spec-witness` (the read-only verifier) · `spec-ignite` (the ignition copilot that puts an authored
634
+ effort onto the plane).