@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.
- package/.claude-plugin/marketplace.json +15 -0
- package/.claude-plugin/plugin.json +8 -0
- package/CHANGELOG.md +32 -0
- package/LICENSE +21 -0
- package/README.md +78 -0
- package/bin/verify-staged.mjs +247 -0
- package/package.json +35 -0
- package/references/docs-workflow.md +417 -0
- package/references/engineering-loop.md +298 -0
- package/skills/docs-audit-feature/SKILL.md +88 -0
- package/skills/docs-audit-full/SKILL.md +54 -0
- package/skills/docs-backlog/SKILL.md +41 -0
- package/skills/docs-process/SKILL.md +146 -0
- package/skills/docs-status/SKILL.md +47 -0
- package/skills/docs-write/SKILL.md +43 -0
- package/skills/init/SKILL.md +163 -0
- package/skills/init/scripts/doctor.mjs +176 -0
- package/skills/spec-child/SKILL.md +149 -0
- package/skills/spec-ignite/SKILL.md +277 -0
- package/skills/spec-parent/SKILL.md +634 -0
- package/skills/spec-pipeline/SKILL.md +453 -0
- package/skills/spec-retro/SKILL.md +398 -0
- package/skills/spec-review/SKILL.md +266 -0
- package/skills/spec-seat/SKILL.md +512 -0
- package/skills/spec-witness/SKILL.md +222 -0
- package/templates/claude-md-stanza.md +13 -0
- package/templates/docs/_meta/doc-index.md +90 -0
- package/templates/docs/infrastructure/background-work.md +53 -0
- package/templates/docs/infrastructure/realtime-events.md +54 -0
- package/templates/docs/patterns/backend-patterns.md +96 -0
- package/templates/docs/patterns/codegen.md +69 -0
- package/templates/docs/patterns/frontend-patterns.md +92 -0
- package/templates/docs/patterns/state-management.md +73 -0
- package/templates/docs/patterns/testing.md +103 -0
- package/templates/docs/patterns/ui-style-guide.md +76 -0
- package/templates/docs/patterns/vertical-slice-anatomy.md +61 -0
- package/templates/docs/readme-archive.md +9 -0
- package/templates/docs/readme-features.md +7 -0
- package/templates/docs/readme-guides.md +7 -0
- package/templates/docs/readme-infrastructure.md +7 -0
- package/templates/docs/readme-patterns.md +9 -0
- package/templates/docs/readme-research.md +9 -0
- package/templates/docs/readme-working.md +9 -0
- 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).
|