@naswerks/engineering-loop 0.7.1 → 0.8.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 +105 -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 +41 -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 +17 -5
- package/skills/init/scripts/owned.mjs +10 -0
- package/skills/spec-build/SKILL.md +8 -4
- package/skills/spec-coordinator/SKILL.md +103 -58
- package/skills/spec-ignite/SKILL.md +25 -21
- package/skills/spec-pipeline/SKILL.md +128 -80
- package/skills/spec-retro/SKILL.md +9 -4
- package/skills/spec-review/SKILL.md +22 -10
- package/skills/spec-seat/SKILL.md +63 -31
- package/skills/spec-witness/SKILL.md +267 -212
- package/templates/docs/readme-research.md +2 -2
|
@@ -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
|
|
@@ -46,22 +47,24 @@ cannot spot a hand-written generated file.
|
|
|
46
47
|
**Step 1 — the effort**, in order:
|
|
47
48
|
|
|
48
49
|
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
|
-
|
|
50
|
+
2. `00-ignition-brief.md` — **your spec, and the charter every seat reads.** Its sections down to
|
|
51
|
+
§ Platform state bind every seat; the owner's rulings in it are settled — don't relitigate them; the
|
|
52
|
+
sections after § Platform state are your orders.
|
|
53
|
+
3. **EVERY numbered spec, before arming the first seat.** Every numbered file is one build seat's spec.
|
|
54
|
+
You judge plans against them and cut each prompt from the previous session's actual shapes — you cannot
|
|
55
|
+
do either from the tracker alone. Specs cross-reference: reading them as they come up means ruling on
|
|
56
|
+
slice 3 without knowing slice 6 depends on its column name.
|
|
57
|
+
|
|
58
|
+
**When no ignition copilot verified the brief — a run by hand — the GATE is yours.** Check that the
|
|
59
|
+
predecessor merged (only that: never a gate on another pipeline's seats), re-verify § Reference against
|
|
60
|
+
HEAD, and re-measure § Baselines, before the first seat is armed. A seat cites those baselines; it measures
|
|
61
|
+
only a lane the brief does not name.
|
|
62
|
+
|
|
63
|
+
**Then run the SHAPE CHECK — one comparison, seconds, and it has caught real defects.** The sequence is
|
|
64
|
+
written once, in the brief's `## The sequence`; the tracker's `## Session status` carries one status line
|
|
65
|
+
per row, by the brief's ids. **Every row has its status line and every status line has its row.** Check it
|
|
66
|
+
now, and again before you cut the retro. **A disagreement is a finding, not a typo** — it means the shape
|
|
67
|
+
changed in one place and not the other. Say which is right, fix the other, and journal it.
|
|
65
68
|
|
|
66
69
|
Then produce a **5-line status readback** — shipped / in flight / next action / next prompt you expect to
|
|
67
70
|
cut. Hand-cranked that goes to the human so they can confirm the seat transferred; hosted it is your
|
|
@@ -134,7 +137,12 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
134
137
|
opening line and appends nothing of its own to your text, because you are the one who knows the prior
|
|
135
138
|
rows' shapes. **The seed names skills; it never restates ceremony.** A seed that inlines procedure is a
|
|
136
139
|
defect even when it works: there are then two sources for one contract and only one of them gets
|
|
137
|
-
corrected.
|
|
140
|
+
corrected. **Hosted, the control plane's opening line already names the skills and the role** — start
|
|
141
|
+
your text at the spec, and never restate either.
|
|
142
|
+
|
|
143
|
+
**Keep each seed as you sent it.** Save the task text verbatim in the effort's record (the tracker's
|
|
144
|
+
session entry, or a `seed.md` beside the seat's board) at the moment you send it. The review and the
|
|
145
|
+
retro grade what each seat was told, and a seed reconstructed later from memory is not that.
|
|
138
146
|
|
|
139
147
|
**Pick the docs:** the floor and the loop's standard docs are settled (`spec-seat`'s Step 0 +
|
|
140
148
|
`spec-build`'s role table). **This repository's own docs are yours to seed, by path, every time:** copy
|
|
@@ -144,7 +152,7 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
144
152
|
seat guessing.
|
|
145
153
|
|
|
146
154
|
**The seed-retirement rule:** each new seed restates ONLY what OVERRIDES a default (every seat
|
|
147
|
-
re-acquires the defaults from the skill +
|
|
155
|
+
re-acquires the defaults from the skill + the brief from scratch) and DROPS what merely confirms them.
|
|
148
156
|
A correction the platform has since absorbed retires from the seed the session after it ships — seeds
|
|
149
157
|
carry deltas, not history. By session 15 an accreted seed is unreadable.
|
|
150
158
|
|
|
@@ -194,10 +202,10 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
194
202
|
**Advance the tracker AT EVERY CHECKPOINT.** Plan accepted: the row says so; final TLDR accepted: the
|
|
195
203
|
row says so; push confirmed: SHIPPED with the hash. A stale tracker is your omission.
|
|
196
204
|
|
|
197
|
-
**
|
|
198
|
-
so the temptation is to transcribe the sitting into your tracker and call the
|
|
199
|
-
leaves
|
|
200
|
-
for `sessions/{slug}/receipt.md` in the
|
|
205
|
+
**CLOSING A HUMAN STEP: TAKE THE RECEIPT, DO NOT WRITE IT.** A `step` row has no seat to post a TLDR,
|
|
206
|
+
so the temptation is to transcribe the sitting into your tracker and call the step recorded. **That
|
|
207
|
+
leaves it with ONE voice — yours — and it is the only row in the effort with one.** Ask the human
|
|
208
|
+
for `sessions/{step-slug}/receipt.md` in the step's own commit: each check id, what was run, the literal
|
|
201
209
|
result, who observed it. Your tracker entry then reads *against* it, the way you read every other row's
|
|
202
210
|
tldr.
|
|
203
211
|
|
|
@@ -212,8 +220,8 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
212
220
|
`plan.md` + `tldr.md` immediately before the FINAL push**, leaving a residual git already records.
|
|
213
221
|
|
|
214
222
|
**AND TRANSCRIBE THE SEAT'S RECEIPT SWEEP.** A seat's close-out reports which receipts its
|
|
215
|
-
change made false. It
|
|
216
|
-
|
|
223
|
+
change made false. It may **not** write `project-status.md`, `sessions/**` or a row of `live-checks.md`
|
|
224
|
+
(the owner's), so **those corrections arrive as a list in its FINAL TLDR and they are yours to apply.**
|
|
217
225
|
Do not hand a seat "just fix the false receipts" without checking who owns them — a coordinator that
|
|
218
226
|
does finds the receipts are its own or immutable, and has handed the seat a dead end. Likewise
|
|
219
227
|
**check off every BINDING instruction you gave**: if you said "report the count either way" and no
|
|
@@ -303,13 +311,15 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
303
311
|
nothing in that column is the pass's first finding. Then read your own session entries: **if any of
|
|
304
312
|
them needs superseding, stop and record that as a finding** — it means the ledger was not kept, and
|
|
305
313
|
the retro must say so rather than quietly correcting it.
|
|
306
|
-
2. **
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
314
|
+
2. **Offer the owner a short, ordered quick pass — in the chat.** Live checks are the owner's, never
|
|
315
|
+
a seat's job and never a row you aggregate. From the seats' section (e) ("what the owner could try")
|
|
316
|
+
pick the few that matter most and write them as a numbered pass the owner can follow cold: what to
|
|
317
|
+
open, what to do, what passing looks like. A long list nobody can follow is the failure this
|
|
318
|
+
replaces. `live-checks.md` holds only the rows the owner dictates; write a row there only when the
|
|
319
|
+
owner dictates it. The effort home's `.md` files (`live-checks.md`, the numbered specs, the brief)
|
|
320
|
+
are inside your scoped write path — same gate, same receipt as your ledger — so **a line you have
|
|
321
|
+
PROVEN false in a spec, or a dictated row a seat reported false, is yours to strike at the source.**
|
|
322
|
+
Research stage only — after docs-process files the folder, only the ledger remains writable.
|
|
313
323
|
3. **Run `spec-retro`.** It is written FROM the tracker, which is why step 1 comes first — a retro
|
|
314
324
|
assembled from a stale ledger invents. It is a READ: findings become proposed fixits, and it fixes
|
|
315
325
|
nothing. **If the effort had a review, your retro may cite `sessions/code-review.md` — and the two
|
|
@@ -331,7 +341,7 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
331
341
|
|
|
332
342
|
**P MOVES THE EFFORT HOME OUT OF YOUR REACH — the tracker pass in step 1 is your LAST chance at
|
|
333
343
|
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
|
|
344
|
+
`docs/_meta/docs-workflow.md` § The archive convention (repository-owned) names, or to the brief's
|
|
335
345
|
`Archive:` line when it carries one. The ledger survives the
|
|
336
346
|
rename (its write predicate admits `docs/{research|archive}/*/project-status.md`; a home elsewhere
|
|
337
347
|
is outside it, so there P's write to the tracker is the last one), but the effort-home lane
|
|
@@ -356,10 +366,10 @@ and a seat's close-out. Never reconstruct it at the close.
|
|
|
356
366
|
while any seat is still live or when none shipped. Hand-cranked there is no `finish`; the human closes
|
|
357
367
|
the effort.
|
|
358
368
|
|
|
359
|
-
**The human hand-tests.** Live verification is the
|
|
360
|
-
ships something clickable, tell the
|
|
361
|
-
|
|
362
|
-
|
|
369
|
+
**The human hand-tests.** Live verification is the owner's, not a seat's claim and not a seat's job —
|
|
370
|
+
when a slice ships something clickable, tell the owner concretely what to drive (the 2-3 highest-value
|
|
371
|
+
clicks), in the chat. A check becomes a row of `live-checks.md` only when the owner dictates it, and then
|
|
372
|
+
you write it, with ordinary edits, gated and receipted like your ledger.
|
|
363
373
|
|
|
364
374
|
## What you will have to prove at close — make it runnable NOW
|
|
365
375
|
|
|
@@ -395,7 +405,21 @@ so read them as run-time obligations, not close-out ones:
|
|
|
395
405
|
|
|
396
406
|
- Plan TLDR as **plain text BEFORE any plan-approval mode**; questions as **plain numbered text, then
|
|
397
407
|
STOP** — never an interactive question tool (the human can't copy from it).
|
|
398
|
-
- **
|
|
408
|
+
- **Approved work includes its commit, its push and the PR — you do not ask for them.** Hand-cranked, an
|
|
409
|
+
approved seat commits and pushes its branch itself (the relay, below); hosted, the commit call rides your
|
|
410
|
+
acceptance. The PR is yours at the close. The merge is the human's, always. Explicit staging only —
|
|
411
|
+
never `git add -A` — and never a push to the base branch.
|
|
412
|
+
- **One pipeline at a time.** A brief's GATE checks only that its predecessor merged; never gate a run on
|
|
413
|
+
another pipeline's seats, and never run two pipelines over one another.
|
|
414
|
+
- **Never advise or run a runner restart while a seat is live.** A restart ends every live session on that
|
|
415
|
+
runner, and the plane may not notice. "Restarting it is fine" said to the human in that state is how a
|
|
416
|
+
run loses every seat at once; say instead which seats are live and that the restart waits.
|
|
417
|
+
- **When your plane calls fail, stop — never sleep-poll.** Journal the failure, report it, and end your
|
|
418
|
+
turn. A timer that wakes you to retry a plane that is not answering spends a whole context on every wake
|
|
419
|
+
and produces nothing; the human resumes you when the plane is back.
|
|
420
|
+
- **An escalation is an act, never chat text alone.** Write it where it is read — the seat's board under a
|
|
421
|
+
coordinator-voice heading, and the tracker — and carry it with a verb the owner's queue shows. Text in
|
|
422
|
+
your own terminal reaches the owner only if they happen to read that terminal.
|
|
399
423
|
- **This repository's rails add to these rules.** `docs/_meta/engineering-loop.md` § This repository's rails
|
|
400
424
|
(repository-owned) names the policy, the gates a commit passes, the suite before a PR, the PR route and
|
|
401
425
|
any stricter staging — bake every rail in beside these, and never let one subtract from them.
|
|
@@ -405,8 +429,8 @@ so read them as run-time obligations, not close-out ones:
|
|
|
405
429
|
flow. Pushes always name the refspec; a push without one parks by design. Keep git-verb words out of
|
|
406
430
|
echo text and section labels — **including `branch`**, which parks a read-only branch LISTING on the
|
|
407
431
|
branch-deletion backstop. The fence fires on the commands a careful seat runs to PROVE its work.
|
|
408
|
-
- Seats never edit `project-status.md` or memory files; never run `docs-write` unprompted;
|
|
409
|
-
|
|
432
|
+
- Seats never edit `project-status.md`, `live-checks.md` or memory files; never run `docs-write` unprompted;
|
|
433
|
+
respect the brief's § What this effort does NOT do; codegen only through the command `patterns/codegen.md` § Running codegen
|
|
410
434
|
names (when the repo has one); component files laid out as `patterns/frontend-patterns.md` § Component files states. Run the
|
|
411
435
|
suite lanes SERIALLY.
|
|
412
436
|
- Cross-slice changes (touching a shipped spec's files) need your explicit approval and get recorded as
|
|
@@ -434,6 +458,12 @@ so read them as run-time obligations, not close-out ones:
|
|
|
434
458
|
catch. Cite, and your beliefs become checkable too.
|
|
435
459
|
- **No message of yours carries a build order except the plan ruling itself.** Answers, callouts, and
|
|
436
460
|
status requests are steering or information; the go IS the `accept`/`accept-with-riders` verdict.
|
|
461
|
+
- **A ruling that binds a running seat goes onto that seat's board in the same act as your tracker entry.**
|
|
462
|
+
Recorded is not delivered: a ruling that lives only in your tracker never reaches the seat it binds.
|
|
463
|
+
Hosted, write it into the seat's file and call the verb (a `callout` when no verdict carries it).
|
|
464
|
+
- **A ruling counts only when its act lands.** Write it into the file, call the verb, and say "landed" only
|
|
465
|
+
from the verb's reply. A ruling written ahead of its act — a claim about a build that has not finished, a
|
|
466
|
+
verdict the verb then refuses — is a board ahead of the ledger, and the seat may act on the board.
|
|
437
467
|
- **If the next action is yours and nothing gates it, TAKE it — do not describe it.** Any turn of
|
|
438
468
|
yours that ends with a plan instead of an act is a defect, and not a close-out quirk: a coordinator
|
|
439
469
|
that rules a fixit IN, writes the brief, and ends the turn sits idle with nothing gating it. The human
|
|
@@ -474,10 +504,11 @@ The ceremony rides the **`spec-build` skill** — the prompt is an IGNITER, not
|
|
|
474
504
|
```
|
|
475
505
|
You are a BUILD SEAT in a coordinator-run effort: invoke the spec-build skill with
|
|
476
506
|
role={backend | frontend | mixed} before anything else, and ALWAYS after `spec-seat`: the seat header
|
|
477
|
-
names `spec-seat` first, the job skill second.
|
|
507
|
+
names `spec-seat` first, the job skill second. <- hand-cranked only; hosted, start at the spec
|
|
478
508
|
|
|
479
509
|
Your spec: {absolute path to the spec}
|
|
480
|
-
Pipeline context: {
|
|
510
|
+
Pipeline context: {brief path} — the charter: its sections down to § Platform state bind you, and the owner's
|
|
511
|
+
rulings in it are settled (don't relitigate) + {project-status.md path}
|
|
481
512
|
(READ-ONLY, coordinator-owned — prior rows, deferred findings, and process incidents are your contract).
|
|
482
513
|
|
|
483
514
|
EXTRA DOCS for this task (beyond your role's floor — read them):
|
|
@@ -493,7 +524,7 @@ MY BELIEFS, WITH PROVENANCE (a mismatch is worth more than a build hour — repo
|
|
|
493
524
|
|
|
494
525
|
STANDING RECON QUESTION (answer in your PLAN TLDR): {if any}
|
|
495
526
|
Known coordinator-owned dirty files (never stage): {list}
|
|
496
|
-
Baselines: {per lane,
|
|
527
|
+
Baselines (cite, don't re-measure): {per lane, from the brief's § Baselines: N (+known pre-existing reds)}
|
|
497
528
|
|
|
498
529
|
THE TASK: {compressed spec restatement with the load-bearing specifics inline.}
|
|
499
530
|
```
|
|
@@ -516,6 +547,8 @@ second** — this is the whole point of the row.
|
|
|
516
547
|
REVIEW row (R):
|
|
517
548
|
You are the REVIEW SEAT: invoke the spec-review skill before anything else.
|
|
518
549
|
Topic: {topic} · branch: {branch} · diff range: {base}...{branch}
|
|
550
|
+
The brief, down to § Platform state and never past it (read as claims, not facts):
|
|
551
|
+
docs/research/{topic}/00-ignition-brief.md
|
|
519
552
|
Specs (read as claims, not facts): {every numbered spec path}
|
|
520
553
|
Session artifacts: docs/research/{topic}/sessions/ (each seat's plan.md + tldr.md)
|
|
521
554
|
Working docs for THIS effort: {explicit list of docs/working/*.md}
|
|
@@ -526,7 +559,8 @@ REVIEW row (R):
|
|
|
526
559
|
DOCS-PROCESS row (P):
|
|
527
560
|
You are the DOCS-PROCESS seat: invoke the docs-process skill before anything else.
|
|
528
561
|
Effort: {topic} · archive target: {per docs/_meta/docs-workflow.md § The archive convention
|
|
529
|
-
(repository-owned), or the
|
|
562
|
+
(repository-owned), or the brief's Archive: line when it carries one} · shape: {as that section says}
|
|
563
|
+
Your board: docs/research/{topic}/sessions/docs-process/ (plan.md + tldr.md; never a gitignored folder)
|
|
530
564
|
Working docs for THIS effort, and ONLY these: {explicit list — docs/working/ is a shared
|
|
531
565
|
queue and may hold other efforts' docs; do not infer membership from the folder}
|
|
532
566
|
Research/spec docs to archive: docs/research/{topic}/
|
|
@@ -552,7 +586,7 @@ Answers:
|
|
|
552
586
|
mandatory: seats generalize from the WHY to the next hundred micro-decisions.}
|
|
553
587
|
2. ...
|
|
554
588
|
{Optional call-outs that don't block.}
|
|
555
|
-
|
|
589
|
+
{Hand-cranked: the run-to-done order (the relay, below). Hosted: Go build; the ending ceremony as before.}
|
|
556
590
|
```
|
|
557
591
|
|
|
558
592
|
Rules: one numbered ruling per question, decision-first then rationale, never leave a question
|
|
@@ -566,9 +600,10 @@ still open, however good the prose; the seat is still holding and the re-raise i
|
|
|
566
600
|
**The blackboard append.** Hand-cranked, the seat's `plan.md` and `tldr.md` are live FILES at
|
|
567
601
|
`docs/research/{topic}/sessions/{spec-slug}/` — read the TLDR there with normal file tools instead of
|
|
568
602
|
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
|
-
|
|
603
|
+
**APPENDING it verbatim at the END of the seat's `tldr.md`** — never between its sections, not even under
|
|
604
|
+
the question it answers: the file is the conversation read top to bottom, in message order, and an insert
|
|
605
|
+
above a later post rewrites that order. Hosted, the same append, then the verb: the control plane mirrors
|
|
606
|
+
the file before your act and points the seat at the section (§ Your hands, the coordinator's append).
|
|
572
607
|
|
|
573
608
|
**Anchor grammar (canonical — the witness greps these):** rulings land under
|
|
574
609
|
`## COORDINATOR RULING (plan — {verdict})` hand-cranked, `## COORDINATOR RULING (plan rev N — {verdict})`
|
|
@@ -587,21 +622,31 @@ re-pasting a multi-KB block into a composer.
|
|
|
587
622
|
before cutting each next prompt, sweep `sessions/*/tldr.md` mtimes for appends you were never nudged
|
|
588
623
|
about. A missed nudge must cost one `ls`, not a wedged run.
|
|
589
624
|
|
|
590
|
-
**
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
plan
|
|
625
|
+
**The hand-cranked relay.** A seat posts its PLAN TLDR and numbered questions **in the chat**, before any
|
|
626
|
+
plan-approval presentation. The human relays them, and you answer in **ONE message of notes**: the
|
|
627
|
+
verdict, the answers, the riders, and the standing run-to-done order. The seat folds them in and the human
|
|
628
|
+
approves its plan — that approval is the human's counterpart of the product's accept-gate. The seat then
|
|
629
|
+
writes `plan.md` and `tldr.md`, your notes transcribed verbatim under `## COORDINATOR RULING (plan —
|
|
630
|
+
{verdict})`, and **runs to done without a stop**: build, suites, `docs-write`, commits with
|
|
631
|
+
`verify-staged`, its branch pushes (never the base branch), and its FINAL TLDR in the chat. Its only stops
|
|
632
|
+
are a destructive act outside the effort's branches, a credential exposure, a host restart and a
|
|
633
|
+
`verify-staged` failure; a red it cannot fix takes its escape hatch, and it still closes out. A mid-build
|
|
634
|
+
question gets your ruling appended to its `tldr.md`. After its last push you review the FINAL against the
|
|
635
|
+
tree and write `## COORDINATOR ACCEPT (final — {slice})` into its `tldr.md` yourself. The hosted ceremony —
|
|
636
|
+
the acceptance that carries the commit call, the receipted push bar — is unchanged.
|
|
594
637
|
|
|
595
638
|
## Docs-write + commit call template
|
|
596
639
|
|
|
640
|
+
The hosted close-out call. Hand-cranked, the relay's run-to-done order carries the same content and the
|
|
641
|
+
seat closes out without waiting for it.
|
|
642
|
+
|
|
597
643
|
```
|
|
598
644
|
COORDINATOR RESPONSE — FINAL TLDR ACCEPTED {(+ what I verified myself)}.
|
|
599
645
|
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.
|
|
646
|
+
2. COMMIT CALL — approved. Stage explicitly (never git add -A): YOUR diff + working doc +
|
|
647
|
+
sessions/{slug}/. Never stage docs/research/{topic}/project-status.md — I commit my ledger
|
|
648
|
+
myself. Other research notes stay untouched. Re-copy plan.md + tldr.md into sessions/{slug}/
|
|
649
|
+
ONCE, immediately before the final push.
|
|
605
650
|
VERIFY before committing: verify-staged {same list} — commit only on exit 0. Non-zero means
|
|
606
651
|
git add silently dropped files (usually a .gitignore rule); STOP, report the output verbatim,
|
|
607
652
|
and wait — do not force-add, do not widen .gitignore.
|
|
@@ -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 -->
|