@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,266 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec-review
|
|
3
|
+
description: Become the REVIEW SEAT for a spec pipeline that has finished building — the outside look, before the retro and before the PR. Reviews the shipped code against the repo's patterns, the composition across session seams, and the loop's own comms; classifies which findings earn a fixit; files sessions/code-review.md. Its value is having NONE of the pipeline's context. Use as the review seat of a pipeline, or run spec-review {topic}.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# spec-review
|
|
7
|
+
|
|
8
|
+
Turn this session into the **review seat**: the fresh-eyes look at a pipeline that has finished building,
|
|
9
|
+
run **before the coordinator's retro and before the PR exists.**
|
|
10
|
+
|
|
11
|
+
**Your value is the absence of the context every other seat has.** The builders lived inside one slice
|
|
12
|
+
each; the coordinator judged them all and formed beliefs doing it. You arrive with none of that, which is
|
|
13
|
+
why you can see the seams between sessions that no session's own verification structurally covers.
|
|
14
|
+
|
|
15
|
+
Two documents come out of a pipeline's close and they are deliberately different: **the retro looks
|
|
16
|
+
inward, and you look in from outside.** They are independent grades, and reconciling them is somebody
|
|
17
|
+
else's job.
|
|
18
|
+
|
|
19
|
+
## The hard fences
|
|
20
|
+
|
|
21
|
+
- **You NEVER read the coordinator's retrospective.** It does not exist yet, and if it does, skip it.
|
|
22
|
+
Reading it anchors you on that grade and the pipeline pays for two opinions to get one.
|
|
23
|
+
- **You do not fix anything.** Findings get classified and filed. A reviewer that repairs its own findings
|
|
24
|
+
cannot be trusted to count them.
|
|
25
|
+
- **You do not decide whether a fixit runs — you classify.** The parent rules on it. A reviewer that can
|
|
26
|
+
trigger work is grading its own necessity.
|
|
27
|
+
- **Every TLDR, spec, and doc claim is TESTIMONY to verify, never a fact to build on.** That includes
|
|
28
|
+
anything your coordinator tells you: if a ruling arrives in your `tldr.md`, record it and treat it as a
|
|
29
|
+
claim like any other.
|
|
30
|
+
|
|
31
|
+
## What you should have been handed
|
|
32
|
+
|
|
33
|
+
Your seed carries **no beliefs about the pipeline, and that is deliberate** — but it should carry an
|
|
34
|
+
**inventory**, because you cannot review what you cannot find:
|
|
35
|
+
|
|
36
|
+
- the **topic**, the **branch**, and the **diff range** (`main...<branch>`);
|
|
37
|
+
- **every numbered spec path** — you read them as claims, not facts;
|
|
38
|
+
- the **`sessions/`** folder, holding each build seat's `plan.md` + `tldr.md`;
|
|
39
|
+
- the **working docs for this effort, named explicitly** — `docs/working/` is a shared queue and you must
|
|
40
|
+
not infer membership from the folder;
|
|
41
|
+
- the **tracker** (`project-status.md`), which is the process record lens 3 grades from.
|
|
42
|
+
|
|
43
|
+
**If any of that is missing, ask for it** — a numbered question in your `tldr.md`, same lane as any seat.
|
|
44
|
+
Do not hunt, and do not guess a scope. **What you must NOT be given, and must not accept as fact if it
|
|
45
|
+
arrives anyway:** prior-shapes bullets, a provenance list, or any framing about what is already settled.
|
|
46
|
+
That is testimony; record it and treat it as a claim.
|
|
47
|
+
|
|
48
|
+
## Reading order (it matters)
|
|
49
|
+
|
|
50
|
+
1. **The specs** — what the pipeline said it would do, per slice, including each escape hatch and the
|
|
51
|
+
declared out-of-scope.
|
|
52
|
+
2. **The session docs** — every seat's `tldr.md` in `sessions/`. What each seat claims it shipped,
|
|
53
|
+
its honest gaps, its deferred findings, its receipts.
|
|
54
|
+
3. **The working docs** in `docs/working/` — the narrative: what was tried, what failed, what changed.
|
|
55
|
+
4. **The tracker** — `project-status.md`, the coordinator's journal: rulings and their reasoning, recon
|
|
56
|
+
corrections, incidents.
|
|
57
|
+
5. **THEN the diff** — `git diff main...<pipeline-branch>`, plus `git log --oneline main..<pipeline-branch>`.
|
|
58
|
+
|
|
59
|
+
**Read the artifacts before the code, and the code before you conclude.** Reading the diff first makes
|
|
60
|
+
you review a patch; reading the claims first makes you review whether the pipeline did what it said.
|
|
61
|
+
|
|
62
|
+
**No PR exists yet** — you run before the coordinator's close-out, deliberately, so your findings land in time
|
|
63
|
+
to shape the PR body rather than arriving after it.
|
|
64
|
+
|
|
65
|
+
## Two passes, then a consolidation — this is the shape, not a nicety
|
|
66
|
+
|
|
67
|
+
**One review is one draw.** Ask once and you cannot tell a good answer from an outlier. An effort that ran
|
|
68
|
+
this ceremony by hand with two independent reviews found they **corrected each other ten times** — each
|
|
69
|
+
catching what the other missed, each killing some of the other's false positives.
|
|
70
|
+
|
|
71
|
+
So: run **two independent passes** (subagents, same charter, **no shared context between them** — do not
|
|
72
|
+
let the second see the first's findings), then **consolidate yourself**:
|
|
73
|
+
|
|
74
|
+
- **Both passes found it**: a confirmed finding.
|
|
75
|
+
- **One pass found it**: scrutinise it before filing; say in the report that it was single-sourced.
|
|
76
|
+
- **They disagree**: say so, with both readings. A visible disagreement is worth more than a resolved
|
|
77
|
+
one you can't show your work for.
|
|
78
|
+
|
|
79
|
+
The consolidation is where the value is, not in either pass. **Correlated reviewers are the hazard** —
|
|
80
|
+
passes that share framing agree for reasons that have nothing to do with the code.
|
|
81
|
+
|
|
82
|
+
**THE NOTIFICATION IS THE ONLY ROUTE TO A PASS'S OUTPUT. READ IT WHEN IT ARRIVES.** Spawning the two
|
|
83
|
+
passes flows freely; **the verb that would fetch a subagent's report after the fact is a boundary tool**
|
|
84
|
+
(`walled-by-policy`) — it sits in the boundary set for cross-session influence, and nothing at the gate
|
|
85
|
+
can tell "retrieving my own subagent's report" from that without a new discriminator; inventing one to
|
|
86
|
+
save a relaunch would widen a publish boundary to fix an inconvenience. A lost notification costs a full
|
|
87
|
+
relaunch of the pass. **So: do not start other work across a pass's completion, and if you do lose one,
|
|
88
|
+
relaunching it is the supported path — say in the report that the pass was re-run.**
|
|
89
|
+
|
|
90
|
+
**State the pass count in the report, and when it is not two, state WHY.** *"Second pass dropped at the
|
|
91
|
+
stated rail threshold"* and *"second pass refused by rate limits"* are different facts about how much
|
|
92
|
+
weight the review carries — the first is a budgeted choice, the second is a truncation. A single-pass
|
|
93
|
+
review that says it was single-sourced is honest; one that quietly draws once is not, and one that says
|
|
94
|
+
"single pass" without the reason leaves the reader unable to weigh it.
|
|
95
|
+
|
|
96
|
+
## The three lenses
|
|
97
|
+
|
|
98
|
+
**Lens 1 — correctness, security, and COMPOSITION.** Your distinct duty is the seams: what happens
|
|
99
|
+
*between* sessions, which no single session could see from inside its slice. Look for a capability welded
|
|
100
|
+
onto an assumption an earlier session made and a later one broke; a guard that each session left to the
|
|
101
|
+
other; an identity or authorization plane that is trustworthy per-slice and forgeable in composition. Then
|
|
102
|
+
ordinary correctness: null and error paths, concurrency, data loss, exception swallowing.
|
|
103
|
+
|
|
104
|
+
**Lens 2 — the patterns, and the language.** Read the diff against `patterns/backend-patterns.md`,
|
|
105
|
+
`patterns/frontend-patterns.md`, `patterns/vertical-slice-anatomy.md`, `patterns/testing.md`,
|
|
106
|
+
`patterns/codegen.md` — and against ordinary good practice in the language, which no pattern doc covers
|
|
107
|
+
exhaustively.
|
|
108
|
+
|
|
109
|
+
**A pattern break is not automatically a defect.** There are legitimate reasons to depart. Your job is
|
|
110
|
+
that **every departure is IDENTIFIED and its reason stated** — an intentional break with a recorded reason
|
|
111
|
+
is fine; an unremarked one is a finding, because the next reader cannot tell which it was.
|
|
112
|
+
|
|
113
|
+
**ACROSS ALL THREE LENSES: when you find a fact, SEARCH FOR THE CLAIMS IT FALSIFIES.** Finding a defect
|
|
114
|
+
and finding the sentence that says the defect cannot exist are **two different searches**, and the second
|
|
115
|
+
is the one nobody performs. A review once found that a guard had a third blind spot — while the entry
|
|
116
|
+
describing that guard said, in its headline, that it had exactly two. The review reported the defect,
|
|
117
|
+
walked past the sentence, and the contradiction was closed later by an audit ordered for an unrelated
|
|
118
|
+
reason.
|
|
119
|
+
|
|
120
|
+
So for each finding: grep the docs, specs and comments for what they assert about that thing. **A document
|
|
121
|
+
describing intent as behaviour is a finding in its own right**, and it is usually sitting one line above
|
|
122
|
+
the code you just read.
|
|
123
|
+
|
|
124
|
+
**Lens 3 — the loop and the comms.** Read the tldrs and the tracker as a record of how the pipeline *ran*:
|
|
125
|
+
- Where did a seat wait on something it could not observe? Where did a message fail to produce action?
|
|
126
|
+
- Which questions went unanswered, and which rulings dropped between being given and being applied?
|
|
127
|
+
- What did a seat have to work out for itself that a document should have told it?
|
|
128
|
+
- What was hard that did not need to be — and what would you change in the ceremony to make it cheaper?
|
|
129
|
+
|
|
130
|
+
Grade this from the evidence and say what you would change. **This lens is why the seat reads the process
|
|
131
|
+
record and not just the code:** a defect and the process failure that let it through are usually the same
|
|
132
|
+
finding seen twice.
|
|
133
|
+
|
|
134
|
+
## Classifying findings — which earn a fixit
|
|
135
|
+
|
|
136
|
+
**A fixit exists when the pipeline would otherwise ship something UNTRUE, and only then.** Both conditions:
|
|
137
|
+
|
|
138
|
+
**(a) The pipeline ships a claim that isn't true** — one of exactly two flavours:
|
|
139
|
+
- **It does not work, or works unsafely** — a broken feature, a security hole, a data-loss or forgeable
|
|
140
|
+
path. Security findings are in by construction.
|
|
141
|
+
- **A receipt is false** — a TLDR, spec, or doc asserts something proven that the code does not do. This
|
|
142
|
+
matters as much as a bug, because the next pipeline builds on it.
|
|
143
|
+
|
|
144
|
+
**(b) Leaving it costs more than a session costs** — it reaches main, propagates to the next pipeline, or a
|
|
145
|
+
human discovers it live.
|
|
146
|
+
|
|
147
|
+
Everything else is a finding with a home, and you name the home:
|
|
148
|
+
|
|
149
|
+
| Finding | Where it goes |
|
|
150
|
+
|---|---|
|
|
151
|
+
| (a) and (b) | **FIXIT CANDIDATE** — you classify, the coordinator rules |
|
|
152
|
+
| (a) but not (b) | `docs/research/{topic}/project-status.md` § `## Deferred findings log`, with its receipt |
|
|
153
|
+
| An unremarked pattern break | documented — the departure and its (missing) reason |
|
|
154
|
+
| A loop/comms finding | `## Deferred findings log` + the retro's backlog |
|
|
155
|
+
| Trivial or environmental — a config value, a one-line guard, "start the container" | **not a session.** Name it as a rider or a live-check row |
|
|
156
|
+
|
|
157
|
+
**NAME THE PATH AND THE VERBATIM HEADING, NEVER A NICKNAME.** *"the deferred log"* is a name, not
|
|
158
|
+
a place — and you are the one seat that cannot resolve it, because your entire value is having none
|
|
159
|
+
of the pipeline's context. A finding filed to a nickname lands nowhere. If the tracker does not carry
|
|
160
|
+
the heading verbatim, that mismatch is itself a finding: report it, and file to the section that exists.
|
|
161
|
+
|
|
162
|
+
**YOU DO NOT MINT AN ID NAMESPACE.** The effort has ONE finding sequence, allocated by the coordinator
|
|
163
|
+
(`spec-pipeline`'s template says so). Number your findings **report-locally** and label them as such —
|
|
164
|
+
`R-1`, `R-2`, … — and state plainly that the effort id is the coordinator's to assign at the ruling. A
|
|
165
|
+
second sequence beside the coordinator's produces two different findings under one id; everything
|
|
166
|
+
downstream cites the coordinator's, and the review's looks handled while it sits unread. A finding is not
|
|
167
|
+
filed until it carries an effort id in the log.
|
|
168
|
+
|
|
169
|
+
**ONE fixit seat per pipeline, maximum.** If three findings qualify they go into **one** session with a
|
|
170
|
+
named list. Anything that does not fit is a chartered follow-up, stated honestly with its reason — a
|
|
171
|
+
pipeline that needs two fixit seats is telling you the remainder belongs to the next one. This bound is
|
|
172
|
+
what stops a review-fix-review spiral.
|
|
173
|
+
|
|
174
|
+
## Asking questions
|
|
175
|
+
|
|
176
|
+
You may ask, and you should when an artifact is genuinely ambiguous — same lane as any seat: append a
|
|
177
|
+
question section to your own `tldr.md`, post, end your turn. **Two literal headings, both poke:**
|
|
178
|
+
`## QUESTIONS` during your recon/plan phase, `## MID-BUILD QUESTION` after your plan was accepted, and
|
|
179
|
+
**open the body with `BLOCKING:` or `NOT BLOCKING:`** — that first line is machine-read. The detector is
|
|
180
|
+
heading-matched, so a synonym — or a bare `QUESTIONS:` label with no `##` — is an invisible question that
|
|
181
|
+
no banner announces and no re-raise can rescue.
|
|
182
|
+
|
|
183
|
+
**But ask for FACTS and POINTERS, not for verdicts.** *"Which session owns this file?"* and *"where is the
|
|
184
|
+
decision about X recorded?"* are good questions. *"Is this break acceptable?"* invites the answer that
|
|
185
|
+
replaces your judgement with your coordinator's. If a verdict arrives anyway, record it and treat it as
|
|
186
|
+
testimony.
|
|
187
|
+
|
|
188
|
+
## The report — `sessions/code-review.md`
|
|
189
|
+
|
|
190
|
+
Files beside `parent-retrospective.md` in the pipeline's `sessions/` folder. It is a pipeline artifact,
|
|
191
|
+
not a chat transcript, and it archives with the effort.
|
|
192
|
+
|
|
193
|
+
```markdown
|
|
194
|
+
# Code + session review — {topic}, pipeline {id}
|
|
195
|
+
|
|
196
|
+
> The outside look, written before the retro and before the PR. Two independent passes, consolidated.
|
|
197
|
+
> Reviewed `main..{sha}` across N sessions. **This seat did not read the coordinator's retrospective.**
|
|
198
|
+
<!-- meta: type=session; status=final; verified={date}; lineage=N -->
|
|
199
|
+
|
|
200
|
+
## The verdict, first
|
|
201
|
+
{The one thing a reader must not miss. If the pipeline ships something untrue, say it here in bold.}
|
|
202
|
+
|
|
203
|
+
## Grades — from outside
|
|
204
|
+
| Dimension | Grade | Evidence |
|
|
205
|
+
|---|---|---|
|
|
206
|
+
| Correctness & security | | |
|
|
207
|
+
| Composition across seams | | |
|
|
208
|
+
| Pattern conformance | | |
|
|
209
|
+
| Loop & comms | | |
|
|
210
|
+
{Your grade is your own. The coordinator's retro grades the same run from inside; two independent grades
|
|
211
|
+
are the point.}
|
|
212
|
+
|
|
213
|
+
## FIXIT CANDIDATES — (a) + (b), for the coordinator to rule on
|
|
214
|
+
{Numbered. Each: what is untrue · the receipt · why leaving it costs more than a session ·
|
|
215
|
+
the smallest fix that makes the claim true. If none: say NONE, plainly.}
|
|
216
|
+
|
|
217
|
+
## Composition findings — the seams
|
|
218
|
+
{What no single session could see. Name the sessions whose interaction produced it.}
|
|
219
|
+
|
|
220
|
+
## Pattern departures — identified, with reasons
|
|
221
|
+
| Where | Departure | Reason given | Verdict |
|
|
222
|
+
{"No reason recorded" IS the finding.}
|
|
223
|
+
|
|
224
|
+
## Deferred findings — with their DESTINATIONS
|
|
225
|
+
| R-n | Finding | Found by | Destination |
|
|
226
|
+
{Report-local ids — the coordinator allocates the effort id at the ruling. A DESTINATION is a place that
|
|
227
|
+
exists and that someone reads: a working doc's Living-Docs checklist · a `live-checks.md` row · a
|
|
228
|
+
named input in the NEXT pipeline's brief · an in-code revisit note at the symbol · a chartered fixit ·
|
|
229
|
+
or CLOSED with its reason. **"deferred log" is not a destination** — it is the holding pen the
|
|
230
|
+
finding sits in until the retro's disposition pass drains it. A row whose destination is a document
|
|
231
|
+
that does not exist yet (an unauthored row, an unwritten charter) is NOT homed: say so here.}
|
|
232
|
+
## Loop & comms — what was hard, and what to change
|
|
233
|
+
## Passes disagreed on
|
|
234
|
+
{Where the two passes differed, both readings. Do not silently resolve.}
|
|
235
|
+
## What I could not verify
|
|
236
|
+
{Stated, not omitted.}
|
|
237
|
+
|
|
238
|
+
## Lineage
|
|
239
|
+
- **Pipeline** — the tracker · the umbrella · sessions 02..NN
|
|
240
|
+
- **Counterpart** — `parent-retrospective.md` (the inside look; written after this)
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Ceremony
|
|
244
|
+
|
|
245
|
+
**Your contract is `spec-seat`** — invoke it first if you have not. It carries recon, the plain-text PLAN
|
|
246
|
+
TLDR with beliefs and numbered questions, the question lane, the parked-call discriminator, the verdict
|
|
247
|
+
vocabulary, the six-section FINAL TLDR, and the close-out order. You commit `sessions/code-review.md` on
|
|
248
|
+
your coordinator's call like any seat.
|
|
249
|
+
|
|
250
|
+
**The close-out receipt's heading token is the literal `child·` for you too** — it is a protocol anchor,
|
|
251
|
+
not a description of your seat, and writing `[review·…]` stales your own acceptance. `spec-seat` carries
|
|
252
|
+
the detail.
|
|
253
|
+
|
|
254
|
+
Only your **seed** differs from other seats: it carries no coordinator beliefs, no provenance list, and no
|
|
255
|
+
framing about what is already settled — **but it DOES carry an inventory**, and that inventory is your
|
|
256
|
+
reading list. The control plane composes it for the `review` kind: `spec-seat` first, then this skill,
|
|
257
|
+
and nothing else.
|
|
258
|
+
|
|
259
|
+
Your baselines are reads, not builds: you run the suites to confirm the pipeline's reported numbers, and a
|
|
260
|
+
number you cannot reproduce is a finding.
|
|
261
|
+
|
|
262
|
+
## Related
|
|
263
|
+
- `spec-parent` (rules on your fixit candidates; writes the retro after you) · `spec-child` (the seats you
|
|
264
|
+
are reviewing) · `spec-retro` (the inside look) · `spec-witness` (the live read-only seat; its ledger, if
|
|
265
|
+
one exists, is evidence like any other artifact) · `docs-process` (consumes this report and gives every
|
|
266
|
+
finding a disposition)
|