@naswerks/engineering-loop 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/.claude-plugin/marketplace.json +15 -0
  2. package/.claude-plugin/plugin.json +8 -0
  3. package/CHANGELOG.md +32 -0
  4. package/LICENSE +21 -0
  5. package/README.md +78 -0
  6. package/bin/verify-staged.mjs +247 -0
  7. package/package.json +35 -0
  8. package/references/docs-workflow.md +417 -0
  9. package/references/engineering-loop.md +298 -0
  10. package/skills/docs-audit-feature/SKILL.md +88 -0
  11. package/skills/docs-audit-full/SKILL.md +54 -0
  12. package/skills/docs-backlog/SKILL.md +41 -0
  13. package/skills/docs-process/SKILL.md +146 -0
  14. package/skills/docs-status/SKILL.md +47 -0
  15. package/skills/docs-write/SKILL.md +43 -0
  16. package/skills/init/SKILL.md +163 -0
  17. package/skills/init/scripts/doctor.mjs +176 -0
  18. package/skills/spec-child/SKILL.md +149 -0
  19. package/skills/spec-ignite/SKILL.md +277 -0
  20. package/skills/spec-parent/SKILL.md +634 -0
  21. package/skills/spec-pipeline/SKILL.md +453 -0
  22. package/skills/spec-retro/SKILL.md +398 -0
  23. package/skills/spec-review/SKILL.md +266 -0
  24. package/skills/spec-seat/SKILL.md +512 -0
  25. package/skills/spec-witness/SKILL.md +222 -0
  26. package/templates/claude-md-stanza.md +13 -0
  27. package/templates/docs/_meta/doc-index.md +90 -0
  28. package/templates/docs/infrastructure/background-work.md +53 -0
  29. package/templates/docs/infrastructure/realtime-events.md +54 -0
  30. package/templates/docs/patterns/backend-patterns.md +96 -0
  31. package/templates/docs/patterns/codegen.md +69 -0
  32. package/templates/docs/patterns/frontend-patterns.md +92 -0
  33. package/templates/docs/patterns/state-management.md +73 -0
  34. package/templates/docs/patterns/testing.md +103 -0
  35. package/templates/docs/patterns/ui-style-guide.md +76 -0
  36. package/templates/docs/patterns/vertical-slice-anatomy.md +61 -0
  37. package/templates/docs/readme-archive.md +9 -0
  38. package/templates/docs/readme-features.md +7 -0
  39. package/templates/docs/readme-guides.md +7 -0
  40. package/templates/docs/readme-infrastructure.md +7 -0
  41. package/templates/docs/readme-patterns.md +9 -0
  42. package/templates/docs/readme-research.md +9 -0
  43. package/templates/docs/readme-working.md +9 -0
  44. package/templates/settings-pin.json +10 -0
@@ -0,0 +1,398 @@
1
+ ---
2
+ name: spec-retro
3
+ description: The COORDINATOR's close-out retrospective for a finished spec pipeline — a substrate-VERIFIED grade of the run, the ceremony audit (did the acts the seat believes it performed actually write rows?), the ledger reconciliation, the true economics, the blindnesses, and the ranked fixit backlog. Run at the close, after the last session's commit. Run spec-retro {topic}.
4
+ ---
5
+
6
+ # spec-retro
7
+
8
+ The coordinator is the only participant who sees every session of a pipeline from the inside — and
9
+ today that perspective evaporates the moment the run closes. This skill turns it into an artifact.
10
+
11
+ **It is not a summary. It is an audit — of the pipeline, and of the seat that ran it.**
12
+
13
+ Run it as the **last act of the coordinator seat**, after the final session's close-out commit — before or
14
+ after the PR is cut, either works. Output: `docs/research/{topic}/sessions/parent-retrospective.md`. It is
15
+ a scoped write on the pipeline's branch, so it rides the PR to the base branch either way.
16
+
17
+ **You are one of the three kinds that do NOT compose `spec-seat`** — this skill is your whole contract,
18
+ and the control plane's seed says so rather than merely omitting it.
19
+
20
+ ---
21
+
22
+ ## THE ONE RULE
23
+
24
+ **The retro must be able to fail.**
25
+
26
+ If the ceremony audit shows the seat's acts wrote no rows, the retro says so **in the first paragraph, in
27
+ bold**, and the grade drops. If the ledger was wrong, it says how many times and who caught it.
28
+
29
+ > **A retrospective that cannot indict its own author is marketing.**
30
+
31
+ The section that justifies the skill is §2, and it exists because a coordinator can "accept" every final
32
+ TLDR of a run and have the platform record none of them — the close-out called a prose verb instead of
33
+ the receipt verb, and the push lane's own condition read a row the ceremony never wrote. One query would
34
+ have caught it on day one.
35
+
36
+ ---
37
+
38
+ ## Prerequisite: you must be able to see the substrate
39
+
40
+ <!-- control-plane-specific -->
41
+ **The first-line substrate read is the act sweep, called ARGLESS** — the unfiltered pass over ALL verbs,
42
+ human and exception rows included. **Start every audit with it: "what happened to this run that I did
43
+ not ask about."** A verb-filtered read can only confirm suspicions, never surface surprises — a run can
44
+ certify itself "zero-touch" while `approved_by_human` rows sit one unqueried verb away.
45
+
46
+ **Who holds the instrument, on the hosted plane:** a `retro` seat's ticket carries `acts:read`, so
47
+ `seat_acts` argless IS your sweep. A `coordinator` ticket deliberately does **not** carry it — its mint is
48
+ `seat:read` · `pipeline:read` · `drive:write` — so a coordinator writing this retro from its own seat
49
+ reads `read_blackboard` (argless = the roster) and takes the act sweep from the retro seat, the
50
+ effort's witness, or a credentialed operator. **Say which instrument produced every count in this
51
+ document** — a number whose lane you cannot name is testimony, not an audit.
52
+
53
+ **If the argless sweep is not runnable at your run's scale, that is a day-one escalation, not a
54
+ close-out discovery.** A few thousand rows can exceed the lane's page budget; you cannot retroactively
55
+ obtain the audit your own doctrine mandates. `spec-parent` carries this as a run-time obligation.
56
+
57
+ **Two instruments that share no code are the only way a ceremony audit means anything** — on one
58
+ instrument you are grading your own homework with your own pencil. Where the control plane offers a
59
+ second, code-disjoint read over the same rows, reconcile the two and record that you did; where it
60
+ offers one, say so in the retro rather than implying two.
61
+
62
+ **BEFORE ANY COUNT: STATE WHAT WRITES THE ROW.** A count over rows measures the paths that *write*
63
+ rows, not the population you have in mind — and the gap is invisible in the result. A probe that
64
+ returns **before** the row write when there is nothing to report writes nothing on a clean run: its
65
+ three rows are three *failures*, and every silent run was a success — while three artifacts in a row
66
+ describe it as *"never once worked."* **Absence of a row is not absence of the event.** Read the writer
67
+ before you read the count — one glance at the emit site tells you whether you are measuring the
68
+ population or only its failures.
69
+
70
+ **Query disciplines that each produce a confident false result:**
71
+
72
+ - **Verify your query FIRES on a known-positive row before you trust a clean result.** A
73
+ silently-empty result is usually a broken query, not an empty table.
74
+ - **A search that times out is not a search that found nothing.** If a sweep backs an ABSENCE claim,
75
+ re-run it on the tool that completes before you report the absence.
76
+ - **A gate scanner matches TEXT.** A query or command whose text contains `git` and `push`, or
77
+ `git` + `branch` + a `-d` flag, parks by design. **Reshape the command — never re-request it.** (The
78
+ boundary half of `spec-seat`'s discriminator.)
79
+
80
+ **READS ONLY. Never write to the platform's store.**
81
+
82
+ ---
83
+
84
+ ## The ten sections
85
+
86
+ ### 1. THE GRADE
87
+
88
+ Per dimension, each citing evidence — a grade nobody can dispute because it cites rows.
89
+
90
+ | dimension | what it measures |
91
+ |---|---|
92
+ | **Execution** | sessions shipped · commits landed · plans rejected · undisclosed reds · receipt reconciliation |
93
+ | **Epistemics** | how many times was the seat WRONG, and did the errors propagate? |
94
+ | **Ceremony fidelity** | §2 — did the ceremony write the rows it claims? |
95
+ | **Discovery** | findings the specs never anticipated |
96
+ | **Outcome** | did the run do what it existed to do? |
97
+
98
+ Grade process and outcome **separately**. A pipeline can execute flawlessly and still be unable to
99
+ demonstrate its effect; collapsing the two hides which one failed.
100
+
101
+ ### 2. THE CEREMONY AUDIT — *the section that justifies the skill*
102
+
103
+ **For every ceremonial act you believe you performed, does a durable row exist?**
104
+
105
+ <!-- control-plane-specific -->
106
+ **THE ONE FACT THIS SECTION RESTS ON: a verb count is NOT an act count.** Several acts write rows under
107
+ MORE verbs than their own name, and a row does not always land on the actor's own seat. Before reading
108
+ ANY per-verb count as a population of acts, read the act-to-rows mapping the control plane publishes —
109
+ it is the difference between an audit and an arithmetic error dressed as one.
110
+
111
+ **The verb type is CLOSED** — a bare string cannot become a verb — and two axes are declared SEPARATELY
112
+ because they are different questions: the verbs that mean *an answer exists* are exactly
113
+ `escalation_resolved` and `operator_ruling` — **the only verbs a "was this answered?" reader may count**
114
+ — while the verbs that *terminate an escalation* include three that close the object without anybody
115
+ answering anything (`escalation_defaulted`, `escalation_expired`, `escalation_default_withheld`).
116
+ `injected_by_human` is deliberately in NEITHER: **a human touch is not an answer.**
117
+
118
+ **Start UNFILTERED** (the Prerequisite above), then narrow — by verb, then by actor, because the
119
+ (verb, actor) pair is what separates a seat's own act from the coordinator acting on the seat.
120
+
121
+ **Any zero-touch or ceremony-fidelity claim must cite the argless sweep**, never a verb list the seat
122
+ picked itself — that is the difference between a self-report and an audit. If the sweep could not run,
123
+ say so and state the claim as a FLOOR. The human-touch family is `approved_by_human` /
124
+ `denied_by_human` / `edited_by_human` / `injected_by_human` (one receipt per burst of terminal input)
125
+ plus `operator_ruling`; `escalation_defaulted` and `escalation_expired` are POLICY receipts and never
126
+ count.
127
+
128
+ Then reconcile, explicitly:
129
+
130
+ | the seat believes | the substrate says | verdict |
131
+ |---|---|---|
132
+ | N plans accepted | N `accept_plan` acts? | |
133
+ | N TLDRs accepted | **at least N** `accept` acts? | |
134
+ | M seats reaped | M `complete` acts? | |
135
+ | K escalations held | K escalation acts? | |
136
+ | Q questions answered | Q `callout` acts carrying an `answeringActId`? | |
137
+
138
+ **Read the second row as at-least, not equals.** Argless re-accepts write their own rows, so more
139
+ acceptances than final TLDRs is the healthy case.
140
+
141
+ **RECONCILE THE EXCESS TO AN OBSERVED CAUSE — do not attribute it.** At least two different paths write
142
+ that row: a **forced** re-accept after a rev-bound refusal, and a coordinator **choosing** to re-bind
143
+ inside its own ruling. They are indistinguishable by count. **A count over rows measures every path that
144
+ writes them, not the one you had in mind.** For each excess row, name which path produced it or say you
145
+ could not tell. And do not flatten predicates that were measured apart: a content post after acceptance
146
+ stales a PUSH; a close-out-receipt append does not stale a REAP. Report what you observe; never
147
+ generalise one park into a law.
148
+
149
+ **The derived-row path:** the acceptance's durable record is the `## PARENT ACCEPT (final — {slice})`
150
+ anchor in each seat's `tldr.md`, and the receipt DERIVES from it. Reconcile file against substrate:
151
+
152
+ ```bash
153
+ rg -n "## PARENT ACCEPT" docs/research/{topic}/sessions/*/tldr.md
154
+ ```
155
+
156
+ **AUDIT THE QUESTION LANE THE SAME WAY — it is a heading grep, not a row query.** A seat asks by appending
157
+ to its own `tldr.md` and posting; there is no park, no request id, no queryable object. **An audit that
158
+ looks only for question rows finds zero and concludes nobody ever asked** — which can be flatly false in a
159
+ run whose seats asked repeatedly and changed a ruling by it.
160
+
161
+ **AND ON THE HOSTED PLANE THE FILE IS NOT THE CLOSE PREDICATE — audit BOTH halves, because they answer
162
+ different questions.** *Was one asked?* is a fact about the file (the heading grep below, mirroring the
163
+ control plane's grammar). *Was it answered?* is a fact about the LEDGER — the ruling act carrying the
164
+ asking post's id — and it is deliberately not read from the file, because a seat can type a parent-voice
165
+ heading into its own blackboard. **A retro that audits only the file can be shown a question that
166
+ answered itself.** Reconcile the grep's hits against the ruling acts, and report any hit with no act as an
167
+ unanswered question whatever the file says.
168
+
169
+ **Use the tolerant predicate the platform itself uses** — an anchored `^## MID-BUILD QUESTION` misses
170
+ prefixed and plural headings, and the lane has TWO headings: `## QUESTIONS` (recon-phase) and
171
+ `## MID-BUILD QUESTION` (post-accept). The grep mirrors the platform regex, including its
172
+ `QUESTIONS ANSWERED` refusal:
173
+
174
+ ```bash
175
+ rg -niE '^##[[:space:]]*(\[[^]]*\][[:space:]]*)?(MID-BUILD[[:space:]]+)?QUESTIONS?\b' docs/research/{topic}/sessions/*/tldr.md | rg -viE 'QUESTIONS?[[:space:]]+ANSWERED'
176
+ ```
177
+
178
+ Reconcile each hit against the parent-voice append that answered it (`## PARENT RULING` / `## PARENT NOTE`
179
+ in the same file) — an unanswered question is the finding. **Your audit instrument must be at least as
180
+ tolerant as the code it audits.**
181
+
182
+ - **Hosted:** N `## PARENT ACCEPT` anchors imply N acceptance acts (rev-bound: the act carries the tldr
183
+ rev, the HEAD and a content hash). An anchor with no act means the derivation failed (LOUD in the
184
+ logs — find it); an act with no anchor is a cockpit accept (legitimate; the act says so).
185
+ Acceptance-shaped PROSE without the anchor writes nothing by design — flag it as a ceremony miss.
186
+ - **Hand-cranked:** there is no machinery and no derivation — expect ZERO acceptance acts; the anchors
187
+ plus the coordinator's tracker rows ARE the receipts. Reconcile anchors against tracker rows instead.
188
+
189
+ **If ceremony and substrate disagree, that IS the finding — and it is ALWAYS the ceremony's fault, never
190
+ the lane's.** A lane that requires a durable, attributable receipt is correct. A ceremony that produces
191
+ prose instead of a receipt is broken. **Do not "fix" it by weakening the lane.**
192
+
193
+ ### 3. THE GATE-INTEGRITY CHECK
194
+
195
+ **Every execution row must have exactly one gate-decision row.** Score it TEXTUALLY, never by count
196
+ arithmetic — gate rows cover *all* tool calls while execution rows are transcript-ingested, so the counts
197
+ legitimately differ and a real leak can hide inside that gap.
198
+
199
+ The doctrine, plane-agnostic and the part to carry:
200
+ - **CLEAN only exists with a live control.** Refuse to say clean when the inverted-predicate control
201
+ (turns carrying BOTH populations) is 0 — "0 un-gated" and "the join matched nothing" are the same
202
+ output otherwise, and that is the false-green shape this check exists to catch.
203
+ - **INCONCLUSIVE is a real result.** Report it as INCONCLUSIVE — never as clean, and never as "not
204
+ performed".
205
+ - **A LEAK names its turns** — expand the named rows before drawing conclusions.
206
+ - **Join on the turn-correlation id both row kinds carry**, and nothing else: joining by id-proximity
207
+ collapses many executions onto few gate rows, which yields a confident wrong answer rather than a null
208
+ one.
209
+ - **Establish two things before you claim a result:** is the stamp the join needs DEPLOYED on the build
210
+ this run used (a run that hosts itself cannot restart the gate it runs on — if not, report NOT
211
+ PERFORMED with that reason, an honest non-result worth more than a confident number the substrate
212
+ cannot support); and does your query fire on a known-positive.
213
+
214
+ <!-- control-plane-specific -->
215
+ On the hosted plane the instruments are `seat_acts` (the ceremony half), `seat_parks` (every park with
216
+ its verdict), and `seat_promises` (declared consequents that were never kept — a ruling that never became
217
+ work is a LEFT JOIN with no match rather than a judgement call). Key park-audit queries on the control
218
+ plane's byte-stable park reasons, never on an annotation's presence.
219
+
220
+ ### 4. THE LEDGER RECONCILIATION
221
+
222
+ Every load-bearing claim in the coordinator's ledger, checked against substrate: costs, suite counts,
223
+ commit shas, row counts. **Report every divergence.**
224
+
225
+ **ONE ledger:** `docs/research/{topic}/project-status.md`, which the coordinator owns and advances **live**
226
+ with ordinary file tools in both modes. Check it against substrate; do not go looking for a second one.
227
+
228
+ **THE RETRO CONFIRMS THE ROWS — IT NEVER ADVANCES THEM.** Add the audit and the economics; do **not**
229
+ rewrite session rows to match reality at close. **If a retro has to supersede its own session rows, the
230
+ ledger was not kept, and that is itself the finding to report.** The named anti-pattern is a tracker whose
231
+ close-out section reads *"RETRO ADVANCE — verified reality as of {date} (supersedes the stale rows above)"*.
232
+
233
+ **Verify the readability bound PER ENTRY, not by total size.** Each `### Session X` section must return
234
+ from an ordinary offset/limit read. **A line count is the wrong instrument** — it falls as cells grow, so a
235
+ ledger kept as giant table cells scores *better* on lines while being unreadable to any reader that exists.
236
+
237
+ *Seats read the coordinator's ledger as authoritative.* A wrong count in the tracker is copied by the
238
+ next seat, then the next, and reaches shipped code comments. A ledger that cannot be checked will drift,
239
+ and its drift will be inherited.
240
+
241
+ ### 5. THE TRUE ECONOMICS
242
+
243
+ **Economics is read one row per instrument and NEVER summed across them** — that is the shipped rule, not a
244
+ style note: two instruments measuring the same spend by different paths do not add up, they cross-check.
245
+ Report per-seat totals, your own line, the run total, the account rate-limit rails, per-turn model truth,
246
+ **and the uncosted-turn count** — a total with no uncosted count is a claim with no error bar.
247
+
248
+ <!-- control-plane-specific -->
249
+ The seat-side read is `seat_usage`, one row per instrument. Never sum session footers: they ride the
250
+ seats' wakes and silently omit the coordinator's own spend.
251
+
252
+ **THE PUBLISHED-TOTAL RULE: every total you publish names its exclusion.** Dollar figures are per-seat
253
+ turn usage — subagent (sidechain) spend is excluded from them, and `uncostedTurnCount 0` does NOT make a
254
+ dollar total the whole cost: *a true number that is not the whole number is worse than an obviously
255
+ missing one.* Where the instruments report sidechain TOKENS, quote totals as **"$X plus N sidechain
256
+ tokens"**, and treat the token figure as a FLOOR (it appears only after the conversation sweep ingests
257
+ the session; tokens are deliberately unpriced).
258
+
259
+ **THE COORDINATOR-SHARE CURVE RULE: the share is a CURVE, not a constant.** It opens high (recon before
260
+ any seat exists), falls through the build, and turns SHARPLY UPWARD at close — the close-out is
261
+ disproportionately coordinator work. **Any share you publish, and any cross-effort comparison, must say
262
+ WHERE ON THE CURVE it was taken.** And a retro reporting its own run's cost can never report a final
263
+ number — writing the figure costs money — so publish it as a floor "at the time of writing".
264
+
265
+ **`escalation_defaulted` rows are NEVER human touches.** A declared conservative default coming into
266
+ effect at its deadline is a POLICY receipt — every human-decision count in this retro must exclude it, and
267
+ a run that went on a declared default says so as "policy resolved the wait", never as a human ruling.
268
+ **`escalation_expired` is a THIRD outcome and not a synonym for the second:** the window closed on
269
+ silence with nothing declared. Collapsing expire into fire forges a policy receipt for a decision nobody
270
+ made.
271
+
272
+ **When two instruments disagree, exactly ONE difference is expected: a run that has been DELETED.** An
273
+ instrument that attributes usage by coordinator id keeps a deleted run's spend; one that enumerates
274
+ runs and joins usage onto them drops it. **If a run was deleted, publish the coordinator-attributed
275
+ figure — it is the MORE COMPLETE one** — and say that a deletion explains the gap. **Any other
276
+ divergence is a FINDING, not a retry** — it means one lane is wrong, which is exactly what having two is
277
+ for. Do not generalise the deletion case into a licence to pick the bigger number.
278
+
279
+ Report: total · coordinator share (%) · per-session · uncosted turns. **Every total is a FLOOR while
280
+ `uncostedTurnCount > 0`** — report it with the count, never as a total.
281
+
282
+ A hosted coordinator is not a thin router: it reads plans, verifies claims in source, and writes a live
283
+ ledger, so a coordinator share around a fifth of the run is cheap rather than alarming. An *unusually
284
+ expensive* coordinator is the signal — it is usually diagnosing platform bugs, which is itself an anomaly
285
+ to report.
286
+
287
+ ### 6. THE BLINDNESSES
288
+
289
+ **What could this seat not see, and what would have made it visible?** Each becomes a candidate tool. This
290
+ is the highest-value section for the platform, because the seat's blind spots are the platform's missing
291
+ surfaces. Include the instruments you *read* as well as the ones you lacked — a surface you consult every
292
+ turn can be lying to you for the whole run.
293
+
294
+ ### 7. THE CORRECTIONS — *the honesty rail*
295
+
296
+ **Every time you were wrong, and WHO caught it.**
297
+
298
+ A seat that never concedes gets told only good news. If a seat corrected you and you changed the record,
299
+ say so — that property is entirely social, nothing in the design protects it, and it is doing
300
+ more work than any rail.
301
+
302
+ **And do not manufacture symmetry.** A coordinator that has been logging its own slips can tip into
303
+ *inventing* one to keep the accounting even; a record whose value is accuracy is damaged as much by a
304
+ fabricated error as by a hidden one. **Self-accounting that reaches for errors is no longer measuring
305
+ anything.**
306
+
307
+ **Check this section's own claims against HEAD before you file it.** A retro cataloguing stale-anchor
308
+ errors can ship a fresh one *inside the entry that corrected the previous one*, because a later seat's
309
+ docstring moved the line. **Name symbols here too.**
310
+
311
+ ### 8. THE PAIN LOG — the ranked fixit backlog
312
+
313
+ Every friction point, converted into a proposed fixit, **ranked by the cost of NOT doing it** (not by
314
+ effort). The pipeline exists to widen the seat's autonomy — **so every wall it hit is a spec.**
315
+
316
+ ### 9. WHAT FELL THROUGH THE CRACKS
317
+
318
+ Named explicitly, because the alternative is that it stays fallen. Include the open questions the run
319
+ could not settle, and say plainly that they are open. **Check the effort's `live-checks.md`** — unaggregated
320
+ verification rows are the most common thing to fall through.
321
+
322
+ ### 10. THE FINDINGS DISPOSITION PASS — *the drain, and it is the section that decides whether the effort's findings survive it*
323
+
324
+ **Read `project-status.md` § `## Deferred findings log` entry by entry, and give every one an exit.** The
325
+ log is a HOLDING PEN for a running effort. Nothing else in the ceremony empties it, so when the effort
326
+ archives, every entry archives with it — findable only by someone who already knows it exists, which is
327
+ nobody. **A finding correctly found, correctly reasoned, and honestly written down still dies here.**
328
+
329
+ **The test, and it is the only one that matters:**
330
+
331
+ > **Can an effort that never read this one's review find this finding?**
332
+ > A finding is findable if a later effort reaches it from something it reads ANYWAY. A closed tracker is
333
+ > not that. Neither is `sessions/code-review.md`, which is testimony.
334
+
335
+ Every entry leaves for exactly one of these, and **the set is closed** — if the destination you want is
336
+ not on this list, the honest answer is CLOSED with a reason:
337
+
338
+ | Destination | Why a later effort reaches it |
339
+ |---|---|
340
+ | A working doc's **Living-Docs checklist** | `docs-process` patches a living doc; living docs get read |
341
+ | A **`live-checks.md` row** | The owed-checks authority is read at every sitting |
342
+ | A named input in the **NEXT pipeline's brief** | The only legal forward-carry — no standing ledgers |
343
+ | An **in-code revisit note at the symbol** | Grep-findable by whoever next opens that file |
344
+ | A **chartered fixit**, with its discharge record | Someone is building it, and the record closes |
345
+ | **CLOSED — won't-fix, with the reason** | A complete result, and often the right one |
346
+
347
+ **A destination that does not exist yet is not a destination.** "Row 11 will handle it" is homing a
348
+ finding to an unauthored document. If the row is not written, the finding is unhomed — say so, and pick
349
+ another exit.
350
+
351
+ **PUBLISH THE TALLY, with its derivation:**
352
+
353
+ ```
354
+ N logged · N forwarded · N closed · N UNHOMED
355
+ ```
356
+
357
+ **`UNHOMED` must be zero.** A non-zero count is not a footnote — it is this section's headline finding,
358
+ and it names the run's real defect rather than the findings'.
359
+
360
+ **Count by SUBSTANCE, not by id.** Grep the log's distinctive text at its destination and confirm it
361
+ landed. An id that appears downstream under a *different* finding is a collision, not a placement — and
362
+ narrative prose mentioning a finding inside a process-incident entry is **not** a log record: no id, no
363
+ destination, no status. A review can produce fifteen findings and fourteen can reach nothing; two of
364
+ those can *appear* in the tracker as prose inside an incident narrative, which is worse than absence — it
365
+ is the look of a record with none of a record's properties.
366
+
367
+ ---
368
+
369
+ ## Ceremony
370
+
371
+ 1. **Read** your own ledger — `docs/research/{topic}/project-status.md`, the one ledger of §4 — every
372
+ session's `tldr.md`, and the working docs.
373
+ 2. **Query** the substrate for §§2-5. Verify each query FIRES on a known-positive row before trusting a
374
+ clean result.
375
+ 3. **Write** `docs/research/{topic}/sessions/parent-retrospective.md` — NATIVELY, in the tree you were born
376
+ in: the coordinator lives in the effort's worktree, so the scoped write (the effort home's own `.md`
377
+ files, `sessions/`, the tracker, `live-checks.md` and the specs) lands on the effort's branch and rides
378
+ its PR. Every write earns its loud audit row. **If the write REFUSES, that is a PLATFORM DEFECT:**
379
+ record the refusal verbatim as a finding, escalate, and stop. Never spawn a helper to route around a
380
+ defect the next effort needs fixed.
381
+ 4. **Do not fix anything.** Findings become proposed fixits. The retro is a read.
382
+ 5. **Then** commit the retro (explicit path) and push it (`git push origin <the effort's branch>`), and
383
+ write `BUILD COMPLETE` into `docs/research/{topic}/project-status.md` (the tracker's close marker). **If no
384
+ PR exists yet, create it yourself** — `gh pr create` on the effort's branch; one branch, one PR from any
385
+ seat. **If one is already open, the push is enough.** These three git commands are your own close-out
386
+ lane and they are gated and receipted like any other publish. **The push command must be the ENTIRE
387
+ command** — a leading `cd` disqualifies it — and keep git-verb words out of any echo label you write
388
+ around it; the deny layer matches TEXT, not parsed verbs.
389
+ 6. **Sweep for stale beliefs BY MEANING, NEVER BY PHRASE — and sweep the SIBLINGS that restate a rule, not
390
+ just the rule's own home.** A sweep keyed on wording only finds the wording it thought of. Ask what each
391
+ instruction *depends on being true* — which file it names, which lane it assumes exists, who it thinks
392
+ holds the tools — and check that, not the string. A correction that lands on the primary document and
393
+ leaves an identical belief standing in a sibling that words it differently has to be made twice.
394
+
395
+ ## Related
396
+ - `spec-parent` (the seat, and the run-time half of this skill's close-out demands) · `spec-child` (the
397
+ builders) · `spec-seat` (their shared contract) · `spec-witness` (the read-only verifier) ·
398
+ `spec-pipeline` (which authored the specs you are grading)