@naswerks/engineering-loop 0.7.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +199 -0
- package/README.md +12 -7
- package/bin/verify-staged.mjs +136 -23
- package/bin/witness-acts.mjs +64 -0
- package/bin/witness-bodycheck.mjs +78 -0
- package/bin/witness-edits.mjs +60 -0
- package/bin/witness-extract-cmd.mjs +57 -0
- package/bin/witness-extract-seed.mjs +65 -0
- package/bin/witness-file-ledger.mjs +57 -0
- package/bin/witness-gaps.mjs +57 -0
- package/bin/witness-latency.mjs +55 -0
- package/bin/witness-lib.mjs +124 -0
- package/bin/witness-plane-window.mjs +57 -0
- package/bin/witness-procs.mjs +71 -0
- package/bin/witness-spawn-task.mjs +61 -0
- package/bin/witness-tx.mjs +60 -0
- package/bin/witness-watch.mjs +405 -0
- package/bin/witness-writes.mjs +64 -0
- package/package.json +1 -1
- package/references/docs-workflow.md +44 -24
- package/references/engineering-loop.md +42 -24
- package/skills/docs-audit-full/SKILL.md +2 -1
- package/skills/docs-process/SKILL.md +13 -7
- package/skills/docs-write/SKILL.md +1 -1
- package/skills/init/scripts/doctor.mjs +43 -5
- package/skills/init/scripts/owned.mjs +10 -0
- package/skills/spec-build/SKILL.md +12 -4
- package/skills/spec-coordinator/SKILL.md +149 -80
- package/skills/spec-ignite/SKILL.md +25 -21
- package/skills/spec-pipeline/SKILL.md +151 -82
- package/skills/spec-retro/SKILL.md +14 -9
- package/skills/spec-review/SKILL.md +32 -14
- package/skills/spec-seat/SKILL.md +107 -48
- package/skills/spec-witness/SKILL.md +267 -212
- package/templates/docs/readme-research.md +2 -2
|
@@ -22,7 +22,8 @@ Invoked as `spec-build {role} {spec-path}`, or told "you are a build session" wi
|
|
|
22
22
|
apply** (`spec-seat`, Step 0). This list is for a build seat working from a spec.
|
|
23
23
|
|
|
24
24
|
1. **Your spec** — fully, INCLUDING any Addendum sections. It is self-contained.
|
|
25
|
-
2. **The
|
|
25
|
+
2. **The brief** (`00-ignition-brief.md`) — the charter: its sections down to § Platform state bind you,
|
|
26
|
+
and the owner's rulings in it are settled; don't relitigate them.
|
|
26
27
|
3. **The tracker** — `docs/research/{topic}/project-status.md`. The coordinator's live journal and
|
|
27
28
|
READ-ONLY to you. Prior session rows, deferred findings, and process incidents are your contract: build
|
|
28
29
|
against what ACTUALLY shipped, not the spec's guesses. **If anything in it disagrees with your spec or
|
|
@@ -49,6 +50,9 @@ your role's rows from `docs/_meta/doc-index.md` § Role reading lists into your
|
|
|
49
50
|
Read those the same way. If your prompt carries no `EXTRA DOCS` line, read that section yourself once and
|
|
50
51
|
say in your PLAN TLDR which rows you took.
|
|
51
52
|
|
|
53
|
+
**Your role is the one your prompt names** — the brief's sequence row carries it in a `Role` cell when the
|
|
54
|
+
author set one — and `mixed` when neither says.
|
|
55
|
+
|
|
52
56
|
A role is *which docs does this build session read* — nothing else. Jobs are SEAT KINDS, not roles:
|
|
53
57
|
`docs-process` is a session type of its own, and a spec that touches a surface with no role of its own is
|
|
54
58
|
`mixed` with that surface's rows.
|
|
@@ -63,9 +67,9 @@ minutes while assuming the work is pending rebuilds what already exists.
|
|
|
63
67
|
Run `git status`; identify which dirty files are yours-to-be vs NOT yours (coordinator-owned docs appear
|
|
64
68
|
mid-run — never stage them). Answer any STANDING RECON QUESTION your spec or prompt carries.
|
|
65
69
|
|
|
66
|
-
**
|
|
67
|
-
|
|
68
|
-
cannot reproduce is a finding.
|
|
70
|
+
**The floor is cited, never measured in a pipeline.** The brief's § Baselines was measured at authoring
|
|
71
|
+
and re-measured at the GATE: cite it, lane by lane. **Measure only a lane the brief does not name, and
|
|
72
|
+
measure it before you edit.** A number you cannot reproduce when you do run a lane is a finding.
|
|
69
73
|
|
|
70
74
|
## Build
|
|
71
75
|
|
|
@@ -89,6 +93,10 @@ signal that a VERDICT changed, not that the test is stale.
|
|
|
89
93
|
Run the suite lanes **SERIALLY** — the lanes and their exact invocations are `patterns/testing.md`
|
|
90
94
|
§ Running tests; concurrent runs flake.
|
|
91
95
|
|
|
96
|
+
**A seat that wrote a further repository runs THAT repository's gate too, inside its tree of it** — the
|
|
97
|
+
lanes its own contributing rules name, serially, never beside this repository's — and reports each
|
|
98
|
+
repository's summaries under its own name. This repository's lanes do not run the code you wrote there.
|
|
99
|
+
|
|
92
100
|
**Capture FULL runner output to a UTF-8 file and search failures by name** — redirect to a file, then
|
|
93
101
|
search `^failed ` / `Failed!`. Piping through a "last N lines" filter destroys failure names.
|
|
94
102
|
|
|
@@ -21,8 +21,9 @@ touches the tracker or commits unprompted; you never write feature code — you
|
|
|
21
21
|
|
|
22
22
|
**Who carries the messages depends on the mode, and the rest of this skill is written for both:**
|
|
23
23
|
|
|
24
|
-
- **Hand-cranked** — a human relays every message
|
|
25
|
-
|
|
24
|
+
- **Hand-cranked** — a human relays every message and approves each plan; an approved seat then runs to
|
|
25
|
+
done, its commits and branch pushes included (§ The hand-cranked relay). The ceremony below is the same;
|
|
26
|
+
the human is the bus.
|
|
26
27
|
- **Hosted (including unattended)** — **your own verbs are the relay and the gate.** You spawn each seat's
|
|
27
28
|
session, rule its plan (which is what flips its gate), steer it, receipt its final TLDR and reap it; the
|
|
28
29
|
retro, the commit and the PR are yours. Pushes ride the unattended lane and are receipted, so they do
|
|
@@ -34,38 +35,42 @@ hand-testing what shipped. Everything else that a human does hand-cranked, you d
|
|
|
34
35
|
|
|
35
36
|
## Read first
|
|
36
37
|
|
|
37
|
-
**Step 0 —
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
cannot spot a hand-written generated file.
|
|
38
|
+
**Step 0 — two reads, and neither is optional.** You verify every seat's work, so you start from the
|
|
39
|
+
context they build in. A coordinator that has not read `testing.md` cannot judge a receipt; one that has
|
|
40
|
+
not read `codegen.md` (when the repo has one) cannot spot a hand-written generated file.
|
|
41
41
|
|
|
42
|
-
`_meta/doc-index.md` · `_meta/docs-workflow.md` ·
|
|
43
|
-
`
|
|
44
|
-
`patterns/
|
|
42
|
+
1. **The floor every seat reads, all seven:** `_meta/doc-index.md` · `_meta/docs-workflow.md` ·
|
|
43
|
+
`_meta/engineering-loop.md` · `patterns/code-organization.md` · `patterns/backend-patterns.md` ·
|
|
44
|
+
`patterns/frontend-patterns.md` · `patterns/testing.md`.
|
|
45
|
+
2. **Then every doc `doc-index.md` § Role reading lists carries a path for.** Open that section and read
|
|
46
|
+
each one. The floor alone is not Step 0.
|
|
45
47
|
|
|
46
48
|
**Step 1 — the effort**, in order:
|
|
47
49
|
|
|
48
50
|
1. `docs/research/{topic}/project-status.md` — the tracker. **You own it.**
|
|
49
|
-
2. `00-ignition-brief.md`
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
51
|
+
2. `00-ignition-brief.md` — **your spec, and the charter every seat reads.** Its sections down to
|
|
52
|
+
§ Platform state bind every seat; the owner's rulings in it are settled — don't relitigate them; the
|
|
53
|
+
sections after § Platform state are your orders.
|
|
54
|
+
3. **EVERY numbered spec, before arming the first seat.** Every numbered file is one build seat's spec.
|
|
55
|
+
You judge plans against them and cut each prompt from the previous session's actual shapes — you cannot
|
|
56
|
+
do either from the tracker alone. Specs cross-reference: reading them as they come up means ruling on
|
|
57
|
+
slice 3 without knowing slice 6 depends on its column name.
|
|
58
|
+
|
|
59
|
+
**When no ignition copilot verified the brief — a run by hand — the GATE is yours.** Check that the
|
|
60
|
+
predecessor merged (only that: never a gate on another pipeline's seats), re-verify § Reference against
|
|
61
|
+
HEAD, and re-measure § Baselines, before the first seat is armed. A seat cites those baselines; it measures
|
|
62
|
+
only a lane the brief does not name.
|
|
63
|
+
|
|
64
|
+
**Then run the SHAPE CHECK — one comparison, seconds, and it has caught real defects.** The sequence is
|
|
65
|
+
written once, in the brief's `## The sequence`; the tracker's `## Session status` carries one status line
|
|
66
|
+
per row, by the brief's ids. **Every row has its status line and every status line has its row.** Check it
|
|
67
|
+
now, and again before you cut the retro. **A disagreement is a finding, not a typo** — it means the shape
|
|
68
|
+
changed in one place and not the other. Say which is right, fix the other, and journal it.
|
|
65
69
|
|
|
66
70
|
Then produce a **5-line status readback** — shipped / in flight / next action / next prompt you expect to
|
|
67
|
-
cut. Hand-cranked that goes to the human so
|
|
68
|
-
opening journal entry in `project-status.md`,
|
|
71
|
+
cut — opening with how many docs each of Step 0's two reads took. Hand-cranked that goes to the human so
|
|
72
|
+
they can confirm the seat transferred; hosted it is your opening journal entry in `project-status.md`,
|
|
73
|
+
which is how anyone watching the cockpit catches up.
|
|
69
74
|
|
|
70
75
|
**Same-session graduation:** you just ran `spec-pipeline`, so you already hold most of Step 1 — confirm
|
|
71
76
|
the tracker exists and cut Prompt #1. **Step 0 still applies.**
|
|
@@ -85,7 +90,7 @@ plus the human relay.
|
|
|
85
90
|
| Verb | What it does | The part that bites |
|
|
86
91
|
|---|---|---|
|
|
87
92
|
| `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`. With no `hostId` it opens on the host carrying your own session; `model` and `effort` override the seat's own for this session, judged against what the runner offers |
|
|
88
|
-
| `accept_plan` | The verdict act: `accept` · `accept-with-riders` · `blocking-precondition`, **and NOTHING ELSE carries a go** — and it DELIVERS ITSELF: the seat's live session receives a one-line pointer to the ruling, for an accepting verdict and for any verdict that filed a ruling in the seat's file | Write the ruling into the seat's `tldr.md` FIRST (`## COORDINATOR RULING (plan rev N — {verdict})`), then call with a one-line `ruling`: the file is mirrored before your act and the pointer names your section. Pass the workspace HEAD you observed
|
|
93
|
+
| `accept_plan` | The verdict act: `accept` · `accept-with-riders` · `blocking-precondition`, **and NOTHING ELSE carries a go** — and it DELIVERS ITSELF: the seat's live session receives a one-line pointer to the ruling, for an accepting verdict and for any verdict that filed a ruling in the seat's file | Write the ruling into the seat's `tldr.md` FIRST (`## COORDINATOR RULING (plan rev N — {verdict})`), then call with a one-line `ruling`: the file is mirrored before your act and the pointer names your section. Pass the workspace HEAD you observed as the bare 40-hex sha `git rev-parse HEAD` prints — a backticked or quoted one is refused and records nothing, though a seat's board may fence its own; an accepting verdict whose seat planned against a different tree is REFUSED, naming both shas. READ THE REPLY'S `delivery:` and `file:` LINES — `NOT DELIVERED` means the seat is idle and only a `callout` reaches it. When the verdict also answers the seat's question, pass `answeringActId` — one act rules and closes it |
|
|
89
94
|
| `accept` | The rev-bound FINAL receipt — and it TELLS the seat, so it carries your commit call | Put the next instruction (commit, push, close-out) in `ruling`, or write it under `## COORDINATOR ACCEPT` in the seat's `tldr.md` first — the receipt then binds to that mirrored revision. It binds to the seat's CURRENT tldr revision, so if the seat posts NEW CONTENT 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. `answeringActId` closes the question it answers, as on `accept_plan` |
|
|
90
95
|
| `complete` | The reap, and it is HONEST | It re-reads the seat and reports ok only after the terminal state is OBSERVED |
|
|
91
96
|
| `callout` | **THE ONLY WAY YOU REACH A CHARGE** (besides the pointers `accept_plan` and `accept` send) | 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. **Write it into the seat's `tldr.md` first and pass a one-line `ruling`:** the file is mirrored before your act and the seat is pointed at your section. Without a file, 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, never twice |
|
|
@@ -134,7 +139,12 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
134
139
|
opening line and appends nothing of its own to your text, because you are the one who knows the prior
|
|
135
140
|
rows' shapes. **The seed names skills; it never restates ceremony.** A seed that inlines procedure is a
|
|
136
141
|
defect even when it works: there are then two sources for one contract and only one of them gets
|
|
137
|
-
corrected.
|
|
142
|
+
corrected. **Hosted, the control plane's opening line already names the skills and the role** — start
|
|
143
|
+
your text at the spec, and never restate either.
|
|
144
|
+
|
|
145
|
+
**Keep each seed as you sent it.** Save the task text verbatim in the effort's record (the tracker's
|
|
146
|
+
session entry, or a `seed.md` beside the seat's board) at the moment you send it. The review and the
|
|
147
|
+
retro grade what each seat was told, and a seed reconstructed later from memory is not that.
|
|
138
148
|
|
|
139
149
|
**Pick the docs:** the floor and the loop's standard docs are settled (`spec-seat`'s Step 0 +
|
|
140
150
|
`spec-build`'s role table). **This repository's own docs are yours to seed, by path, every time:** copy
|
|
@@ -144,7 +154,7 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
144
154
|
seat guessing.
|
|
145
155
|
|
|
146
156
|
**The seed-retirement rule:** each new seed restates ONLY what OVERRIDES a default (every seat
|
|
147
|
-
re-acquires the defaults from the skill +
|
|
157
|
+
re-acquires the defaults from the skill + the brief from scratch) and DROPS what merely confirms them.
|
|
148
158
|
A correction the platform has since absorbed retires from the seed the session after it ships — seeds
|
|
149
159
|
carry deltas, not history. By session 15 an accreted seed is unreadable.
|
|
150
160
|
|
|
@@ -163,6 +173,8 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
163
173
|
call out / hand the human both sides when the call is genuinely theirs.
|
|
164
174
|
**The accepting verdict carries the workspace HEAD you observed, and a seat that planned against a
|
|
165
175
|
different tree is REFUSED with both shas named.** So read the BELIEFS sha before you rule, not after.
|
|
176
|
+
**A seat whose row names a further repository states that tree too,** on an `ALSO WRITING` line beneath
|
|
177
|
+
its BELIEFS: diff its commit and branch against that repository's branch, with your own `git` read of it.
|
|
166
178
|
**AND GRADE THE `CONTROLS` LINE — it is a required PLAN TLDR field and you are its only reader.** For
|
|
167
179
|
every probe or pin the seat plans, it must name the positive control and what would make it FAIL. A
|
|
168
180
|
missing or hand-wavy `CONTROLS` line is a rider, not a nit: a control that cannot fail is a green light
|
|
@@ -180,6 +192,8 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
180
192
|
But spot-check the riskiest claim yourself (never trust self-reported "N green"), and **verify your own
|
|
181
193
|
rulings were APPLIED** — a ruling can silently drop, and a seat can rebuild the exact problem
|
|
182
194
|
the ruling solved. Diff the shipped behavior against your ruling list before accepting.
|
|
195
|
+
**A seat that wrote two repositories returns two of everything:** a staging list and its receipt per
|
|
196
|
+
repository, and each repository's gate under its own name. A green in one says nothing about the other.
|
|
183
197
|
**VERIFY THE CLAIM WHOSE FAILURE WOULD BE SILENT; MACHINE-COMPARE THE REST.** That is the rule that
|
|
184
198
|
keeps your own share of the spend honest — a seat producing receipts that reconcile arithmetically has
|
|
185
199
|
already done the work you would be repeating.
|
|
@@ -194,10 +208,14 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
194
208
|
**Advance the tracker AT EVERY CHECKPOINT.** Plan accepted: the row says so; final TLDR accepted: the
|
|
195
209
|
row says so; push confirmed: SHIPPED with the hash. A stale tracker is your omission.
|
|
196
210
|
|
|
197
|
-
**
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
211
|
+
**WHEN A BRANCH A SEAT PUSHES HAS A PULL REQUEST OPEN, READ ITS CHECKS AT EVERY SEAT REPORT,** in
|
|
212
|
+
whichever repository it is, with your own read and not the seat's sentence about it: a check read at
|
|
213
|
+
the first commit says nothing about the tenth.
|
|
214
|
+
|
|
215
|
+
**CLOSING A HUMAN STEP: TAKE THE RECEIPT, DO NOT WRITE IT.** A `step` row has no seat to post a TLDR,
|
|
216
|
+
so the temptation is to transcribe the sitting into your tracker and call the step recorded. **That
|
|
217
|
+
leaves it with ONE voice — yours — and it is the only row in the effort with one.** Ask the human
|
|
218
|
+
for `sessions/{step-slug}/receipt.md` in the step's own commit: each check id, what was run, the literal
|
|
201
219
|
result, who observed it. Your tracker entry then reads *against* it, the way you read every other row's
|
|
202
220
|
tldr.
|
|
203
221
|
|
|
@@ -212,8 +230,8 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
212
230
|
`plan.md` + `tldr.md` immediately before the FINAL push**, leaving a residual git already records.
|
|
213
231
|
|
|
214
232
|
**AND TRANSCRIBE THE SEAT'S RECEIPT SWEEP.** A seat's close-out reports which receipts its
|
|
215
|
-
change made false. It
|
|
216
|
-
|
|
233
|
+
change made false. It may **not** write `project-status.md`, `sessions/**` or a row of `live-checks.md`
|
|
234
|
+
(the owner's), so **those corrections arrive as a list in its FINAL TLDR and they are yours to apply.**
|
|
217
235
|
Do not hand a seat "just fix the false receipts" without checking who owns them — a coordinator that
|
|
218
236
|
does finds the receipts are its own or immutable, and has handed the seat a dead end. Likewise
|
|
219
237
|
**check off every BINDING instruction you gave**: if you said "report the count either way" and no
|
|
@@ -303,13 +321,15 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
303
321
|
nothing in that column is the pass's first finding. Then read your own session entries: **if any of
|
|
304
322
|
them needs superseding, stop and record that as a finding** — it means the ledger was not kept, and
|
|
305
323
|
the retro must say so rather than quietly correcting it.
|
|
306
|
-
2. **
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
324
|
+
2. **Offer the owner a short, ordered quick pass — in the chat.** Live checks are the owner's, never
|
|
325
|
+
a seat's job and never a row you aggregate. From the seats' section (e) ("what the owner could try")
|
|
326
|
+
pick the few that matter most and write them as a numbered pass the owner can follow cold: what to
|
|
327
|
+
open, what to do, what passing looks like. A long list nobody can follow is the failure this
|
|
328
|
+
replaces. `live-checks.md` holds only the rows the owner dictates; write a row there only when the
|
|
329
|
+
owner dictates it. The effort home's `.md` files (`live-checks.md`, the numbered specs, the brief)
|
|
330
|
+
are inside your scoped write path — same gate, same receipt as your ledger — so **a line you have
|
|
331
|
+
PROVEN false in a spec, or a dictated row a seat reported false, is yours to strike at the source.**
|
|
332
|
+
Research stage only — after docs-process files the folder, only the ledger remains writable.
|
|
313
333
|
3. **Run `spec-retro`.** It is written FROM the tracker, which is why step 1 comes first — a retro
|
|
314
334
|
assembled from a stale ledger invents. It is a READ: findings become proposed fixits, and it fixes
|
|
315
335
|
nothing. **If the effort had a review, your retro may cite `sessions/code-review.md` — and the two
|
|
@@ -320,9 +340,7 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
320
340
|
`docs/_meta/engineering-loop.md` § This repository's rails (repository-owned) says (when it names no
|
|
321
341
|
route, ask the human once and suggest recording the answer there); if one is already open the push is
|
|
322
342
|
enough. These are your own git — gated and receipted like any other publish. **The
|
|
323
|
-
push command must be the ENTIRE command** (a leading `cd` disqualifies it)
|
|
324
|
-
out of any echo label around it — the deny layer matches TEXT, not parsed verbs, and a decorative
|
|
325
|
-
`=== remote tip ===` header over a read-only block will park.
|
|
343
|
+
push command must be the ENTIRE command** (a leading `cd` disqualifies it).
|
|
326
344
|
6. **Report the close:** commits, receipts, total cost with its uncosted-turn count, the findings ledger,
|
|
327
345
|
and the explicit list of what the human still owns. **The merge is theirs, never yours.**
|
|
328
346
|
7. **If the effort has a DOCS-PROCESS row, it runs last** — after the PR exists, as its own session,
|
|
@@ -331,7 +349,7 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
331
349
|
|
|
332
350
|
**P MOVES THE EFFORT HOME OUT OF YOUR REACH — the tracker pass in step 1 is your LAST chance at
|
|
333
351
|
the specs and live-checks.** P `git mv`s `docs/research/{topic}/` to the archive home
|
|
334
|
-
`docs/_meta/docs-workflow.md` § The archive convention (repository-owned) names, or to the
|
|
352
|
+
`docs/_meta/docs-workflow.md` § The archive convention (repository-owned) names, or to the brief's
|
|
335
353
|
`Archive:` line when it carries one. The ledger survives the
|
|
336
354
|
rename (its write predicate admits `docs/{research|archive}/*/project-status.md`; a home elsewhere
|
|
337
355
|
is outside it, so there P's write to the tracker is the last one), but the effort-home lane
|
|
@@ -356,10 +374,10 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
356
374
|
while any seat is still live or when none shipped. Hand-cranked there is no `finish`; the human closes
|
|
357
375
|
the effort.
|
|
358
376
|
|
|
359
|
-
**The human hand-tests.** Live verification is the
|
|
360
|
-
ships something clickable, tell the
|
|
361
|
-
|
|
362
|
-
|
|
377
|
+
**The human hand-tests.** Live verification is the owner's, not a seat's claim and not a seat's job —
|
|
378
|
+
when a slice ships something clickable, tell the owner concretely what to drive (the 2-3 highest-value
|
|
379
|
+
clicks), in the chat. A check becomes a row of `live-checks.md` only when the owner dictates it, and then
|
|
380
|
+
you write it, with ordinary edits, gated and receipted like your ledger.
|
|
363
381
|
|
|
364
382
|
## What you will have to prove at close — make it runnable NOW
|
|
365
383
|
|
|
@@ -387,7 +405,7 @@ so read them as run-time obligations, not close-out ones:
|
|
|
387
405
|
- **Verify a query FIRES on a known-positive before you trust a clean result.** A silently-empty result
|
|
388
406
|
is usually a broken query, not an empty table — and a false all-clear on an audit query is worse than
|
|
389
407
|
no query.
|
|
390
|
-
- **Costs: uncosted
|
|
408
|
+
- **Costs: an uncosted turn counts as nothing**, so any total is a FLOOR while the uncosted-turn count is above zero.
|
|
391
409
|
Report it with the count. **Never sum across instruments** — session footers ride the seats' wakes and
|
|
392
410
|
omit your own spend.
|
|
393
411
|
|
|
@@ -395,18 +413,34 @@ so read them as run-time obligations, not close-out ones:
|
|
|
395
413
|
|
|
396
414
|
- Plan TLDR as **plain text BEFORE any plan-approval mode**; questions as **plain numbered text, then
|
|
397
415
|
STOP** — never an interactive question tool (the human can't copy from it).
|
|
398
|
-
- **
|
|
416
|
+
- **Approved work includes its commit, its push and the PR — you do not ask for them.** Hand-cranked, an
|
|
417
|
+
approved seat commits and pushes its branch itself (the relay, below); hosted, the commit call rides your
|
|
418
|
+
acceptance. The PR is yours at the close. The merge is the human's, always. Explicit staging only —
|
|
419
|
+
never `git add -A` — and never a push to the base branch.
|
|
420
|
+
- **Pipelines never intertwine.** A brief's GATE checks only that its predecessor merged; never gate a run
|
|
421
|
+
on another pipeline's seats, and never make a seat wait on one. Independent pipelines may run at the same
|
|
422
|
+
time, each on its own branch; never two over the same files or on one branch. When the base branch moves
|
|
423
|
+
under your run, take it in between seats, by a merge, never under a live seat and never as a rebase.
|
|
424
|
+
- **Never advise or run a runner restart while a seat is live.** A restart ends every live session on that
|
|
425
|
+
runner, and the plane may not notice. "Restarting it is fine" said to the human in that state is how a
|
|
426
|
+
run loses every seat at once; say instead which seats are live and that the restart waits.
|
|
427
|
+
- **When your plane calls fail, stop — never sleep-poll.** Journal the failure, report it, and end your
|
|
428
|
+
turn. A timer that wakes you to retry a plane that is not answering spends a whole context on every wake
|
|
429
|
+
and produces nothing; the human resumes you when the plane is back.
|
|
430
|
+
- **An escalation is an act, never chat text alone.** Write it where it is read — the seat's board under a
|
|
431
|
+
coordinator-voice heading, and the tracker — and carry it with a verb the owner's queue shows. Text in
|
|
432
|
+
your own terminal reaches the owner only if they happen to read that terminal.
|
|
399
433
|
- **This repository's rails add to these rules.** `docs/_meta/engineering-loop.md` § This repository's rails
|
|
400
434
|
(repository-owned) names the policy, the gates a commit passes, the suite before a PR, the PR route and
|
|
401
435
|
any stricter staging — bake every rail in beside these, and never let one subtract from them.
|
|
402
436
|
- **The unattended git form, and it binds YOU as much as the seats: one git command per call, no shell
|
|
403
437
|
metacharacters.** The FORM check reads the whole command string, so chaining, redirects or substitution
|
|
404
438
|
disqualify it — `git add … && git commit … && git push …` parks, while the same three sent separately
|
|
405
|
-
flow. Pushes always name the refspec; a push without one parks by design.
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
- Seats never edit `project-status.md` or memory files; never run `docs-write` unprompted;
|
|
409
|
-
|
|
439
|
+
flow. Pushes always name the refspec; a push without one parks by design. The gate reads the command
|
|
440
|
+
the shell would run, not its words: an echo label or a quoted search naming a git verb is data, unless
|
|
441
|
+
a shell or an interpreter is on the same line.
|
|
442
|
+
- Seats never edit `project-status.md`, `live-checks.md` or memory files; never run `docs-write` unprompted;
|
|
443
|
+
respect the brief's § What this effort does NOT do; codegen only through the command `patterns/codegen.md` § Running codegen
|
|
410
444
|
names (when the repo has one); component files laid out as `patterns/frontend-patterns.md` § Component files states. Run the
|
|
411
445
|
suite lanes SERIALLY.
|
|
412
446
|
- Cross-slice changes (touching a shipped spec's files) need your explicit approval and get recorded as
|
|
@@ -414,9 +448,11 @@ so read them as run-time obligations, not close-out ones:
|
|
|
414
448
|
- **Cite symbols, not bare `file:line`.** In a seed, a ruling, or the tracker, name the symbol and use the
|
|
415
449
|
line as a hint — a line number is a comment, not an address, and the seat documenting why a line matters
|
|
416
450
|
is what moves it.
|
|
417
|
-
- Model policy: seats run **the effort's declared default model**
|
|
418
|
-
investigation-heavy sessions may warrant a
|
|
419
|
-
the
|
|
451
|
+
- Model policy: seats run **the effort's declared default model and effort** — the pair the brief's
|
|
452
|
+
`## Birth` names (allowlist-exact, set at creation); investigation-heavy sessions may warrant a
|
|
453
|
+
reasoning-heavier one. **A seat's BELIEFS line states the pair it started on, and one the brief does not
|
|
454
|
+
name is settled before you rule its plan:** re-open the seat on the named pair, or rule the difference in
|
|
455
|
+
by name. Parallel sessions only when the specs share no files — and sequence the *commits* regardless.
|
|
420
456
|
- **The gate is inverted (means are free, protocol is law):** benign tools/methods flow with audit rows;
|
|
421
457
|
only the ceremony's boundaries park — in EVERY tier, recon included. Reads, execs, suites, pipes,
|
|
422
458
|
redirects and in-worktree writes all flow pre-accept. **Do not seed tool-avoidance rules the platform
|
|
@@ -434,6 +470,12 @@ so read them as run-time obligations, not close-out ones:
|
|
|
434
470
|
catch. Cite, and your beliefs become checkable too.
|
|
435
471
|
- **No message of yours carries a build order except the plan ruling itself.** Answers, callouts, and
|
|
436
472
|
status requests are steering or information; the go IS the `accept`/`accept-with-riders` verdict.
|
|
473
|
+
- **A ruling that binds a running seat goes onto that seat's board in the same act as your tracker entry.**
|
|
474
|
+
Recorded is not delivered: a ruling that lives only in your tracker never reaches the seat it binds.
|
|
475
|
+
Hosted, write it into the seat's file and call the verb (a `callout` when no verdict carries it).
|
|
476
|
+
- **A ruling counts only when its act lands.** Write it into the file, call the verb, and say "landed" only
|
|
477
|
+
from the verb's reply. A ruling written ahead of its act — a claim about a build that has not finished, a
|
|
478
|
+
verdict the verb then refuses — is a board ahead of the ledger, and the seat may act on the board.
|
|
437
479
|
- **If the next action is yours and nothing gates it, TAKE it — do not describe it.** Any turn of
|
|
438
480
|
yours that ends with a plan instead of an act is a defect, and not a close-out quirk: a coordinator
|
|
439
481
|
that rules a fixit IN, writes the brief, and ends the turn sits idle with nothing gating it. The human
|
|
@@ -474,10 +516,14 @@ The ceremony rides the **`spec-build` skill** — the prompt is an IGNITER, not
|
|
|
474
516
|
```
|
|
475
517
|
You are a BUILD SEAT in a coordinator-run effort: invoke the spec-build skill with
|
|
476
518
|
role={backend | frontend | mixed} before anything else, and ALWAYS after `spec-seat`: the seat header
|
|
477
|
-
names `spec-seat` first, the job skill second.
|
|
519
|
+
names `spec-seat` first, the job skill second. <- hand-cranked only; hosted, start at the spec
|
|
478
520
|
|
|
479
521
|
Your spec: {absolute path to the spec}
|
|
480
|
-
|
|
522
|
+
{only when the seat's row names a further repository, one line each; hand-cranked only — hosted, the
|
|
523
|
+
seed says where:}
|
|
524
|
+
You also write: {repository} — your tree of it is {absolute path}, on branch {branch}. Never its owner's checkout.
|
|
525
|
+
Pipeline context: {brief path} — the charter: its sections down to § Platform state bind you, and the owner's
|
|
526
|
+
rulings in it are settled (don't relitigate) + {project-status.md path}
|
|
481
527
|
(READ-ONLY, coordinator-owned — prior rows, deferred findings, and process incidents are your contract).
|
|
482
528
|
|
|
483
529
|
EXTRA DOCS for this task (beyond your role's floor — read them):
|
|
@@ -493,11 +539,15 @@ MY BELIEFS, WITH PROVENANCE (a mismatch is worth more than a build hour — repo
|
|
|
493
539
|
|
|
494
540
|
STANDING RECON QUESTION (answer in your PLAN TLDR): {if any}
|
|
495
541
|
Known coordinator-owned dirty files (never stage): {list}
|
|
496
|
-
Baselines: {per lane,
|
|
542
|
+
Baselines (cite, don't re-measure): {per lane, from the brief's § Baselines: N (+known pre-existing reds)}
|
|
497
543
|
|
|
498
544
|
THE TASK: {compressed spec restatement with the load-bearing specifics inline.}
|
|
499
545
|
```
|
|
500
546
|
|
|
547
|
+
**A seat that also writes a further repository is told WHERE, and nothing else about it:** what it does
|
|
548
|
+
there is `spec-seat` § Git shapes, and a prompt that restates it is a second copy of the contract. A seat
|
|
549
|
+
whose row names none gets no such line, and a prompt exactly as it would have been.
|
|
550
|
+
|
|
501
551
|
For investigation-first work, add **STEP 0 — INVESTIGATE, REPORT, STOP** before the task, or use
|
|
502
552
|
`role={...} fixit` for no-spec defect sessions (the skill carries the fix-it ceremony). Fallback: if the
|
|
503
553
|
seat can't invoke skills, paste the ceremony from the `spec-build` skill inline.
|
|
@@ -515,7 +565,12 @@ second** — this is the whole point of the row.
|
|
|
515
565
|
```
|
|
516
566
|
REVIEW row (R):
|
|
517
567
|
You are the REVIEW SEAT: invoke the spec-review skill before anything else.
|
|
518
|
-
Topic: {topic} · branch: {branch} · diff range: {base}...{branch}
|
|
568
|
+
Topic: {topic} · branch: {branch} · diff range: origin/{base}...{branch}
|
|
569
|
+
{when the run wrote a further repository, one more line each:}
|
|
570
|
+
Also: {repository}, at {its path} · diff range: origin/{its base}...{its branch}, or by its release
|
|
571
|
+
tags ({the release before}...{this run's release}) when the run released it mid-run
|
|
572
|
+
The brief, down to § Platform state and never past it (read as claims, not facts):
|
|
573
|
+
docs/research/{topic}/00-ignition-brief.md
|
|
519
574
|
Specs (read as claims, not facts): {every numbered spec path}
|
|
520
575
|
Session artifacts: docs/research/{topic}/sessions/ (each seat's plan.md + tldr.md)
|
|
521
576
|
Working docs for THIS effort: {explicit list of docs/working/*.md}
|
|
@@ -526,7 +581,8 @@ REVIEW row (R):
|
|
|
526
581
|
DOCS-PROCESS row (P):
|
|
527
582
|
You are the DOCS-PROCESS seat: invoke the docs-process skill before anything else.
|
|
528
583
|
Effort: {topic} · archive target: {per docs/_meta/docs-workflow.md § The archive convention
|
|
529
|
-
(repository-owned), or the
|
|
584
|
+
(repository-owned), or the brief's Archive: line when it carries one} · shape: {as that section says}
|
|
585
|
+
Your board: docs/research/{topic}/sessions/docs-process/ (plan.md + tldr.md; never a gitignored folder)
|
|
530
586
|
Working docs for THIS effort, and ONLY these: {explicit list — docs/working/ is a shared
|
|
531
587
|
queue and may hold other efforts' docs; do not infer membership from the folder}
|
|
532
588
|
Research/spec docs to archive: docs/research/{topic}/
|
|
@@ -552,7 +608,7 @@ Answers:
|
|
|
552
608
|
mandatory: seats generalize from the WHY to the next hundred micro-decisions.}
|
|
553
609
|
2. ...
|
|
554
610
|
{Optional call-outs that don't block.}
|
|
555
|
-
|
|
611
|
+
{Hand-cranked: the run-to-done order (the relay, below). Hosted: Go build; the ending ceremony as before.}
|
|
556
612
|
```
|
|
557
613
|
|
|
558
614
|
Rules: one numbered ruling per question, decision-first then rationale, never leave a question
|
|
@@ -566,9 +622,10 @@ still open, however good the prose; the seat is still holding and the re-raise i
|
|
|
566
622
|
**The blackboard append.** Hand-cranked, the seat's `plan.md` and `tldr.md` are live FILES at
|
|
567
623
|
`docs/research/{topic}/sessions/{spec-slug}/` — read the TLDR there with normal file tools instead of
|
|
568
624
|
asking for a paste (`read-full-plan` = read `plan.md`, a pull, never force-fed). Deliver every ruling by
|
|
569
|
-
**APPENDING it verbatim
|
|
570
|
-
|
|
571
|
-
|
|
625
|
+
**APPENDING it verbatim at the END of the seat's `tldr.md`** — never between its sections, not even under
|
|
626
|
+
the question it answers: the file is the conversation read top to bottom, in message order, and an insert
|
|
627
|
+
above a later post rewrites that order. Hosted, the same append, then the verb: the control plane mirrors
|
|
628
|
+
the file before your act and points the seat at the section (§ Your hands, the coordinator's append).
|
|
572
629
|
|
|
573
630
|
**Anchor grammar (canonical — the witness greps these):** rulings land under
|
|
574
631
|
`## COORDINATOR RULING (plan — {verdict})` hand-cranked, `## COORDINATOR RULING (plan rev N — {verdict})`
|
|
@@ -587,21 +644,31 @@ re-pasting a multi-KB block into a composer.
|
|
|
587
644
|
before cutting each next prompt, sweep `sessions/*/tldr.md` mtimes for appends you were never nudged
|
|
588
645
|
about. A missed nudge must cost one `ls`, not a wedged run.
|
|
589
646
|
|
|
590
|
-
**
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
plan
|
|
647
|
+
**The hand-cranked relay.** A seat posts its PLAN TLDR and numbered questions **in the chat**, before any
|
|
648
|
+
plan-approval presentation. The human relays them, and you answer in **ONE message of notes**: the
|
|
649
|
+
verdict, the answers, the riders, and the standing run-to-done order. The seat folds them in and the human
|
|
650
|
+
approves its plan — that approval is the human's counterpart of the product's accept-gate. The seat then
|
|
651
|
+
writes `plan.md` and `tldr.md`, your notes transcribed verbatim under `## COORDINATOR RULING (plan —
|
|
652
|
+
{verdict})`, and **runs to done without a stop**: build, suites, `docs-write`, commits with
|
|
653
|
+
`verify-staged`, its branch pushes (never the base branch), and its FINAL TLDR in the chat. Its only stops
|
|
654
|
+
are a destructive act outside the effort's branches, a credential exposure, a host restart and a
|
|
655
|
+
`verify-staged` failure; a red it cannot fix takes its escape hatch, and it still closes out. A mid-build
|
|
656
|
+
question gets your ruling appended to its `tldr.md`. After its last push you review the FINAL against the
|
|
657
|
+
tree and write `## COORDINATOR ACCEPT (final — {slice})` into its `tldr.md` yourself. The hosted ceremony —
|
|
658
|
+
the acceptance that carries the commit call, the receipted push bar — is unchanged.
|
|
594
659
|
|
|
595
660
|
## Docs-write + commit call template
|
|
596
661
|
|
|
662
|
+
The hosted close-out call. Hand-cranked, the relay's run-to-done order carries the same content and the
|
|
663
|
+
seat closes out without waiting for it.
|
|
664
|
+
|
|
597
665
|
```
|
|
598
666
|
COORDINATOR RESPONSE — FINAL TLDR ACCEPTED {(+ what I verified myself)}.
|
|
599
667
|
1. Run docs-write. Carry: {departures, honest gaps, deferred findings verbatim, gotchas}.
|
|
600
|
-
2. COMMIT CALL — approved. Stage explicitly (never git add -A): YOUR diff + working doc
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
before the final push.
|
|
668
|
+
2. COMMIT CALL — approved. Stage explicitly (never git add -A): YOUR diff + working doc +
|
|
669
|
+
sessions/{slug}/. Never stage docs/research/{topic}/project-status.md — I commit my ledger
|
|
670
|
+
myself. Other research notes stay untouched. Re-copy plan.md + tldr.md into sessions/{slug}/
|
|
671
|
+
ONCE, immediately before the final push.
|
|
605
672
|
VERIFY before committing: verify-staged {same list} — commit only on exit 0. Non-zero means
|
|
606
673
|
git add silently dropped files (usually a .gitignore rule); STOP, report the output verbatim,
|
|
607
674
|
and wait — do not force-add, do not widen .gitignore.
|
|
@@ -642,7 +709,9 @@ post-merge.
|
|
|
642
709
|
- **The tracker is the seat — ONE ledger, and you write it live.** `project-status.md` is your journal: you
|
|
643
710
|
own it, you advance it at every boundary, and the human never edits it. That file, not the chat, is the
|
|
644
711
|
product of this skill. **The mechanism is ordinary file tools** — edit it exactly as a seat edits
|
|
645
|
-
`tldr.md`/`plan.md`; the gate permits the path.
|
|
712
|
+
`tldr.md`/`plan.md`; the gate permits the path. **Never a shell heredoc or an interpreter one-liner,
|
|
713
|
+
for the tracker or for a seat's board:** one collapses backslashes in what it writes, and one whose
|
|
714
|
+
text quotes a publish is held as if it ran it. Git commits are the receipt: timestamped, attributed,
|
|
646
715
|
carrying the diff.
|
|
647
716
|
- **The session entry is a JOURNAL entry, not a status cell.** The ruling *and its reasoning*, recon
|
|
648
717
|
corrections, what you verified yourself, mid-build directives, and anything you don't want to forget —
|
|
@@ -30,9 +30,10 @@ the named-finding discipline are UNCHANGED either way — **only the mouse hand
|
|
|
30
30
|
1. Confirm the specs are **committed to the base branch** — seats read specs from their checkouts, so
|
|
31
31
|
uncommitted specs reach no worktree. If they are not committed, that commit is the coordinator's call
|
|
32
32
|
first.
|
|
33
|
-
2. Enumerate the **ignition gates** explicitly and check each:
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
2. Enumerate the **ignition gates** explicitly and check each: the predecessor merged (name the PR) — one
|
|
34
|
+
pipeline runs at a time, so that is the only gate on another pipeline, never one of its seats; known-blocker
|
|
35
|
+
fixits landed (name them); the control plane up and a runner connected; the human's words per stage.
|
|
36
|
+
Report any gate not yet green — you WAIT, never work around.
|
|
36
37
|
3. **VERIFY the ignition brief — you do not author it.** `spec-pipeline` wrote `00-ignition-brief.md`
|
|
37
38
|
complete, from the hot session that placed the specs. **You may be a cold session, and that is fine,
|
|
38
39
|
because your job is the check:** re-run the **Baselines** and confirm the quoted numbers; re-verify each
|
|
@@ -53,32 +54,33 @@ the named-finding discipline are UNCHANGED either way — **only the mouse hand
|
|
|
53
54
|
| Payload field | Derived from | Note |
|
|
54
55
|
|---|---|---|
|
|
55
56
|
| `topic` | the folder name (`docs/research/{topic}/`) | kebab-case, as authored |
|
|
56
|
-
| `title` | the
|
|
57
|
+
| `title` | the brief's H1 (the pipeline's title) | |
|
|
57
58
|
| `specPath` | `docs/research/{topic}/` | **the folder, trailing slash** — a seat's own spec is a different field |
|
|
58
59
|
| `shape` | the brief's `## Birth` | closed set; the create door refuses an unknown by name |
|
|
59
60
|
| `defaultModel` | the brief's `## Birth` | **allowlist-exact** — a near-miss is refused, not coerced |
|
|
60
61
|
| `defaultEffort` | the brief's `## Birth` | |
|
|
61
62
|
| `seats[0]` | **THE COORDINATOR — it is a SEAT, and it is not one of the numbered specs** | omit it and the start door answers `pipeline-has-no-coordinator`; two answer `pipeline-has-many-coordinators` |
|
|
62
|
-
| `seats[1..]` | the brief's `## The sequence`, in order | one row per numbered spec, plus the review / docs-process rows if the pipeline has them |
|
|
63
|
+
| `seats[1..]` | the brief's `## The sequence`, in order | one row per numbered spec, plus the review / docs-process rows if the pipeline has them. **A `step` row is shown on the card and never staged** — it is a human act, not a seat |
|
|
63
64
|
| `seats[].kind` | the sequence row's kind, **verbatim from the closed vocabulary** | `build · fixit · review · docs-process · coordinator · retro · witness`. A kind nobody has heard of composes NOTHING; `unknown-seat-kind` names it |
|
|
65
|
+
| `seats[].role` | the row's `Role` cell, when the sequence has the column | `backend · frontend · mixed`; omitted when absent, and the seat's default applies |
|
|
64
66
|
| `seats[].title` | the spec's H1, or the sequence row's label | |
|
|
65
67
|
| `seats[].specPath` | `docs/research/{topic}/NN-{slug}.md` | **the FILE.** Confirm each exists — a spec named in the sequence and missing from disk reaches no worktree |
|
|
66
68
|
| `seats[].stageOrdinal` / `ordinal` | position in the sequence | sequential unless the brief declares stages |
|
|
67
69
|
| `edges[]` | the shape + the sequence | `fromSeatIndex`/`toSeatIndex` are **indices into your own `seats` array**, not seat ids — the ids do not exist until the create answers. `unknown-seat-relation` names a bad relation |
|
|
68
70
|
|
|
69
|
-
**A FIXIT
|
|
70
|
-
possibility — *"MAY materialise… not authored up front; the coordinator charters it from the
|
|
71
|
-
named list."*
|
|
72
|
-
|
|
71
|
+
**A CONDITIONAL FIXIT IS A PLANNED SEAT, NEVER A SPEC.** `spec-pipeline` authors at most one and only
|
|
72
|
+
as a possibility — *"MAY materialise… not authored up front; the coordinator charters it from the
|
|
73
|
+
review's named list."* When the card carries it, the control plane creates it as a planned seat the
|
|
74
|
+
coordinator supervises, shown as "if needed": it opens only when the coordinator charters it, and
|
|
75
|
+
`finish` closes it as not chartered when it never opened. Never give it a spec file, and never stage a
|
|
76
|
+
second one.
|
|
73
77
|
|
|
74
|
-
**DERIVING THE CARD *IS* THE
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
others have stopped describing, and the create you are about to stage would make one of them true by
|
|
81
|
-
force.
|
|
78
|
+
**DERIVING THE CARD *IS* THE SHAPE CHECK, AND THAT IS WHY THIS SEAT DERIVES IT.** The sequence is
|
|
79
|
+
written once, in the brief's `## The sequence`; the tracker's `## Session status` carries one status
|
|
80
|
+
line per row by the brief's ids. Build the seat list from the brief, then confirm every row has its
|
|
81
|
+
status line and every status line its row. **A disagreement is a finding, reported to the authoring
|
|
82
|
+
seat — never something you reconcile silently by picking one** — the create you are about to stage
|
|
83
|
+
would make one of them true by force.
|
|
82
84
|
|
|
83
85
|
**The card names only controls that exist.** A card that promises a budget cap or an artifact prefix
|
|
84
86
|
the launcher cannot take hands over values the form refuses and omits the ones it needs. **If you want
|
|
@@ -105,7 +107,8 @@ the named-finding discipline are UNCHANGED either way — **only the mouse hand
|
|
|
105
107
|
if a retry is needed, re-announce and say the failed attempts had zero side effects.
|
|
106
108
|
9. Verify ignition receipts — the coordinator's opening ledger write, its first `seat_spawn`, any scripted
|
|
107
109
|
probe's refusal — and **narrate each beat as it lands**, plain language. A loud row at ignite is
|
|
108
|
-
information, not a failure.
|
|
110
|
+
information, not a failure. **When a witness is on duty, hand it the packet** (`spec-witness` § The
|
|
111
|
+
packet) before you go hands-off: it watches from outside the plane and cannot read the kick for itself.
|
|
109
112
|
10. **HANDS OFF.** Heartbeats only (one line per phase change; long output to files, never into context).
|
|
110
113
|
The human owns the parks, the reaps, and the kill-switch from the first second. If the run wedges:
|
|
111
114
|
report state + STOP — the kill-switch is theirs.
|
|
@@ -130,9 +133,10 @@ reviewed the way a committed file can, so anything longer than a pointer is law
|
|
|
130
133
|
place — and accumulated prompt-law breaks the coordinator it was meant to steer.
|
|
131
134
|
|
|
132
135
|
**Your job is to READ it and confirm the brief behind it holds up** — the coordinator reviews the text
|
|
133
|
-
before kick. Before you hand it over, check the brief actually covers: the
|
|
134
|
-
|
|
135
|
-
|
|
136
|
+
before kick. Before you hand it over, check the brief actually covers: why the effort exists · the
|
|
137
|
+
sequence and roles · the owner's rulings · the law and per-spec riders · the reference facts · what the
|
|
138
|
+
effort does not do · verified baselines · platform state · the coordinator's beliefs with provenance ·
|
|
139
|
+
close-out (artifact filing, what the PR must say, the owner's quick pass). **A gap you
|
|
136
140
|
find is a finding to report, not a section for you to write** — send it back to the authoring seat.
|
|
137
141
|
|
|
138
142
|
<!-- control-plane-specific -->
|