@loneexile/omp-superpowers 6.4.2-omp.1 → 6.4.2-omp.3
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/.pi/extensions/superpowers.ts +13 -5
- package/CHANGELOG.md +40 -2
- package/README.md +38 -27
- package/agents/sdd-escalation-implementer.md +18 -6
- package/agents/sdd-final-reviewer.md +22 -7
- package/agents/sdd-implementer.md +9 -4
- package/agents/sdd-rereviewer.md +15 -4
- package/agents/sdd-reviewer.md +13 -5
- package/package.json +1 -1
- package/skills/executing-plans/SKILL.md +40 -0
- package/skills/subagent-driven-development/SKILL.md +245 -97
- package/skills/subagent-driven-development/implementer-prompt.md +8 -2
- package/skills/subagent-driven-development/re-review-prompt.md +22 -11
- package/skills/subagent-driven-development/task-reviewer-prompt.md +22 -13
- package/skills/using-git-worktrees/SKILL.md +17 -9
- package/skills/using-superpowers/references/pi-tools.md +18 -12
|
@@ -128,6 +128,14 @@ superpowers:using-git-worktrees to create one or verify the existing one.
|
|
|
128
128
|
Never start implementation on a main/master branch without your human
|
|
129
129
|
partner's explicit consent.
|
|
130
130
|
|
|
131
|
+
**On omp, the session must be in the worktree before you dispatch.** A
|
|
132
|
+
subagent starts in the session's cwd (the `task` tool has no `cwd`
|
|
133
|
+
argument), so after `omp worktree add` every SDD subagent still works in the
|
|
134
|
+
ORIGINAL checkout until your human partner runs `/move <path>`. Get `/move`
|
|
135
|
+
first. If you cannot, put the worktree's absolute path in every dispatch and
|
|
136
|
+
tell the subagent to use absolute paths and the `bash` tool's `cwd`
|
|
137
|
+
parameter throughout.
|
|
138
|
+
|
|
131
139
|
Conversation memory does not survive compaction. In real sessions,
|
|
132
140
|
controllers that lost their place have re-dispatched entire completed task
|
|
133
141
|
sequences — the single most expensive failure observed. Track progress in
|
|
@@ -138,9 +146,24 @@ a ledger file, not only in todos.
|
|
|
138
146
|
directory (under `<repo-root>/.superpowers/sdd/`), home to
|
|
139
147
|
every artifact for THIS plan: ledger, briefs, reports, review packages.
|
|
140
148
|
Another plan's directory is never yours to read or write.
|
|
149
|
+
- **On omp, resolve the scripts directory first.** `bash scripts/<name>`
|
|
150
|
+
fails from the repo root ("No such file or directory"), and `omp read
|
|
151
|
+
skill://…` lists the files but gives no filesystem path. Once, before the
|
|
152
|
+
first script, run `realpath skill://subagent-driven-development/scripts` in
|
|
153
|
+
the `bash` tool (omp's bash resolves `skill://` URLs) and add the printed
|
|
154
|
+
path to the ledger, after the identity line, as `SDD scripts: <dir>`.
|
|
155
|
+
Ledger lines are found by their prefix, never by position: another
|
|
156
|
+
executor sharing this ledger (executing-plans) adds its own `… scripts:`
|
|
157
|
+
line, and each executor adds the one it lacks. Then run every
|
|
158
|
+
`bash scripts/<name>` in this skill as `bash <dir>/<name>`, with the
|
|
159
|
+
working directory at the repo root — the scripts call `git rev-parse`.
|
|
160
|
+
The invocation lines in this skill stay as upstream wrote them.
|
|
141
161
|
- Check for this plan's ledger at `<workspace>/progress.md`. If its first
|
|
142
162
|
line names your plan file, tasks with a `Task <N>: complete` line are DONE
|
|
143
163
|
— do not re-dispatch them; resume at the first task without one. A task
|
|
164
|
+
whose last line is `dispatched` or `re-dispatched` is mid-implementation:
|
|
165
|
+
check `git log` from its BASE and read `agent://<id>` before you dispatch
|
|
166
|
+
anything. A task
|
|
144
167
|
whose last line is a fix round is mid-loop: resume the loop at the next
|
|
145
168
|
round. A ledger whose first line names a different plan file — or a stray
|
|
146
169
|
ledger at the old flat path `.superpowers/sdd/progress.md` — is another
|
|
@@ -186,27 +209,59 @@ implementation.
|
|
|
186
209
|
On omp the `task` tool has no `model:` field — the agent TYPE carries the
|
|
187
210
|
model, the thinking level, and the tool set. This fork ships five SDD
|
|
188
211
|
agents (`agents/sdd-*.md`); they appear in the `task` tool's own roster.
|
|
189
|
-
**Always dispatch SDD work with one of them.** The bundled `task`
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
212
|
+
**Always dispatch SDD work with one of them.** The bundled `task` and
|
|
213
|
+
`reviewer` agents are the wrong seats, and not because of their model — the
|
|
214
|
+
SDD seats fall back to `@task` / `@slow` themselves. The SDD agents carry
|
|
215
|
+
what the loop depends on: a `tools:` list sized to the seat (no `task` tool,
|
|
216
|
+
so they cannot dispatch subagents at all), an `output:` schema the
|
|
217
|
+
controller reads field by field, and the report-file and status contract in
|
|
218
|
+
the agent's own definition. The bundled `task` agent has no tool limit,
|
|
219
|
+
may spawn subagents (`spawns: "*"`), has no output schema, and knows
|
|
220
|
+
nothing of the report file or the status line. The bundled `reviewer` has
|
|
221
|
+
`bash`, may spawn `scout`, and yields its own schema (`overall_correctness`,
|
|
222
|
+
P0-P3 `findings`) that the fix loop cannot read. (History: in a real
|
|
223
|
+
157-subagent session both ran on the slowest tier over the widest tool set,
|
|
224
|
+
which is where most of the wall-clock went.)
|
|
225
|
+
|
|
226
|
+
| Role | `agent:` | Shipped default · thinking | Falls back to | Tools |
|
|
227
|
+
|---|---|---|---|---|
|
|
228
|
+
| Implementer (every task, fix rounds 1-2) | `sdd-implementer` | sonnet-5-5 · medium | `@task` | edit/test set, no subagents |
|
|
229
|
+
| Fix round 3, a BLOCKED takeover, or a ruled strongest-seat first implementation | `sdd-escalation-implementer` | opus-5-5 · **max** | `@slow` | same as implementer |
|
|
230
|
+
| Task reviewer | `sdd-reviewer` | sonnet-5-5 · high | `@task` | `read`, `grep`, `glob` — no edit, bash, or file-write tool (see note) |
|
|
231
|
+
| Scoped re-review | `sdd-rereviewer` | sonnet-5-5 · low | `@task` | `read`, `grep`; ≤4 working calls plus `yield` (a justified fifth working call is allowed) |
|
|
232
|
+
| Final whole-branch review | `sdd-final-reviewer` | opus-5-5 · **max** | `@slow` | read-only + focused bash |
|
|
202
233
|
|
|
203
234
|
The shipped defaults are Anthropic (sonnet for the per-task seats, opus for
|
|
204
235
|
the two seats that run once per plan or once per stuck task). The tiers are
|
|
205
236
|
a **thinking ladder** as much as a model ladder: escalation and the final
|
|
206
|
-
review
|
|
237
|
+
review run at `max`, re-reviews drop to `low`. This table is the one place
|
|
238
|
+
the shipped defaults are written down — an agent's `description:` says what
|
|
239
|
+
the seat does and never names a model or level, because hosts override them
|
|
240
|
+
and such a claim goes stale.
|
|
241
|
+
|
|
242
|
+
Every `task` item also carries a one-line `solutionSpace`: omp's wire schema
|
|
243
|
+
requires it (a missing one is tolerated, but the item is malformed). It says
|
|
244
|
+
how open the seat's problem is; each template shows one for its seat — adjust
|
|
245
|
+
it to the task instead of copying it blindly.
|
|
246
|
+
|
|
247
|
+
**The fallback entry.** Each agent's `model:` is an ordered list — the pin,
|
|
248
|
+
then a role alias — and omp takes the first entry whose provider has
|
|
249
|
+
credentials. Measured on omp 18.4.10 with a seat pinned to a provider that
|
|
250
|
+
has none: a single-entry list silently ran the seat on the *controller's*
|
|
251
|
+
model, while the two-entry list ran it on the host's `modelRoles.task` model
|
|
252
|
+
at that role's own level. So the pin wins wherever you have its credentials,
|
|
253
|
+
and `@task` / `@slow` (your `modelRoles.task` / `modelRoles.slow`) catch a host
|
|
254
|
+
that lacks them. An unset `@task` drops out of the list and the seat behaves
|
|
255
|
+
as a single pin; an unset `@slow` expands to omp's built-in strong-model
|
|
256
|
+
ranking. The list is also the seat's runtime retry chain: on a retryable
|
|
257
|
+
error (a rate or usage limit) omp moves to the next entry, gated by
|
|
258
|
+
`retry.modelFallback` (default on); it does not switch on a context overflow.
|
|
259
|
+
To see which model a seat actually ran on, read `resolvedModel` in its
|
|
260
|
+
transcript (`session_init`) or turn on `task.showResolvedModelBadge` (off by
|
|
261
|
+
default).
|
|
207
262
|
|
|
208
263
|
**Per-host override, no file edits:** `task.agentModelOverrides` in
|
|
209
|
-
`~/.omp/agent/config.yml` (or the `/agents`
|
|
264
|
+
`~/.omp/agent/config.yml` (or the `/agents` dashboard) beats the agent file's
|
|
210
265
|
`model:` line and applies on the next dispatch. A bare model keeps the
|
|
211
266
|
agent's `thinkingLevel:`; an explicit `:level` on the override replaces it.
|
|
212
267
|
Example — every seat on a flat-rate model, mapped onto that model's own
|
|
@@ -222,6 +277,10 @@ task:
|
|
|
222
277
|
sdd-final-reviewer: opencode-go/deepseek-v4.1-flash:max
|
|
223
278
|
```
|
|
224
279
|
|
|
280
|
+
An override replaces the agent's whole `model:` list, fallback included. To
|
|
281
|
+
keep a fallback, append it to the override (comma-separated):
|
|
282
|
+
`opencode-go/deepseek-v4.1-flash:high,@task`.
|
|
283
|
+
|
|
225
284
|
Use the exact catalog id and only levels that model offers (`omp models ls
|
|
226
285
|
<provider>`): an unsupported level is silently clamped to the nearest valid
|
|
227
286
|
one, which collapses the ladder without an error. Ids get renamed across
|
|
@@ -230,39 +289,65 @@ catalog refreshes; when a seat's speed or quality shifts overnight, read
|
|
|
230
289
|
(Discovery-only ids accept `:level` in config and overrides but not on the
|
|
231
290
|
`--model` CLI flag.)
|
|
232
291
|
|
|
233
|
-
**What
|
|
234
|
-
|
|
235
|
-
`
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
292
|
+
**What the reviewers' `tools:` list enforces (measured, omp 18.4.10).** A
|
|
293
|
+
`tools:` list restricts built-in tools only. `sdd-reviewer` (`read`, `grep`,
|
|
294
|
+
`glob`) gets no `bash`, `edit`, or file-writing tool, and the device-only
|
|
295
|
+
`write` that omp adds to carry `xd://` devices refuses filesystem paths.
|
|
296
|
+
Everything else still attaches: every subagent that omp itself has not
|
|
297
|
+
restricted (only its internal commit-message, compression, and security
|
|
298
|
+
sessions are) also gets the host's extension tools and MCP tools, mounted as
|
|
299
|
+
`xd://` devices reached through that same `write`. A memory host's `recall`,
|
|
300
|
+
`retain`, and `reflect` (`memory_edit` on mnemopi) are a different case: omp
|
|
301
|
+
creates them for such a subagent, but activates only the tools the agent's
|
|
302
|
+
`tools:` list names. Measured on a hindsight host: a `read, grep, glob` seat
|
|
303
|
+
had no top-level `recall` and no `xd://recall` device, while a seat that
|
|
304
|
+
listed `recall` had it top-level (`memory_edit` takes the same path; not run).
|
|
305
|
+
A live probe on 18.4.10 had `sdd-reviewer`
|
|
306
|
+
run a shell command through `write xd://mcp__context_mode_ctx_execute`. So
|
|
307
|
+
"read-only" is enforced by the prompt, not by the harness: the three reviewer
|
|
308
|
+
agents are told never to call an `xd://` device, or an extension or MCP tool,
|
|
309
|
+
that executes code, writes files, or changes external state, nor a memory
|
|
310
|
+
tool that writes (`retain`, `memory_edit`) should one ever be present. If a
|
|
311
|
+
reviewer's transcript ever shows one, say so in the ledger and re-dispatch
|
|
312
|
+
that review.
|
|
313
|
+
|
|
314
|
+
**Turn count beats token price.** Wall-clock and context cost scale with how
|
|
315
|
+
many turns a subagent takes, and the cheapest models routinely take 2-3× the
|
|
316
|
+
turns on multi-step work — costing more overall. Keep a mid-tier model as the
|
|
317
|
+
floor for the reviewers and for implementers working from prose descriptions.
|
|
318
|
+
When a task's plan text contains the complete code to write, the
|
|
319
|
+
implementation is transcription plus testing, and a cheaper tier does it; so
|
|
320
|
+
does a single-file mechanical fix. Express any of that through
|
|
321
|
+
`task.agentModelOverrides`, per seat, onto the model's own ladder (above) —
|
|
322
|
+
never by editing an agent file. Watch the ledger: a task whose implementer
|
|
323
|
+
needs 100+ turns, or a re-review that wanders, is the signal to rule that
|
|
324
|
+
task onto the escalation seat. Re-reviews are verdict-only work over a small
|
|
325
|
+
diff — `low` reasoning is correct for them, not a compromise.
|
|
326
|
+
|
|
327
|
+
**Scale the task review to the diff's risk.** The reviewer seat is fixed, but
|
|
328
|
+
a small mechanical diff does not need the deepest reasoning and a subtle one
|
|
329
|
+
(concurrency, security, a data migration) does. When `task.enableEffort` is
|
|
330
|
+
on (it is off by default — `omp config get task.enableEffort`), dispatch the
|
|
331
|
+
reviewer for such a diff with `effort: "hi"`: that selects the resolved
|
|
332
|
+
model's top thinking level, capped by `task.maxEffort`. When it is off, ledger
|
|
333
|
+
the risk — `Task <N>: high-risk diff — <class>` — and name that class in the
|
|
334
|
+
final review dispatch.
|
|
254
335
|
|
|
255
336
|
**Escalation (fix round 3):** the implementer that got stuck cannot see its
|
|
256
337
|
own problem. Dispatch a FRESH `sdd-escalation-implementer` with the
|
|
257
|
-
framing below.
|
|
258
|
-
|
|
259
|
-
|
|
338
|
+
framing below. The shipped seat already runs at its model's top level, so
|
|
339
|
+
`effort` adds nothing to it; if a host override lowers the seat,
|
|
340
|
+
`effort: "hi"` (only when `task.enableEffort` is on; the accepted values are
|
|
341
|
+
`"lo"`, `"med"`, `"hi"`) raises it again.
|
|
260
342
|
|
|
261
343
|
**Override, never omit.** If a task genuinely needs the strongest tier for
|
|
262
344
|
its first implementation (design judgment across many files), say so in
|
|
263
|
-
the ledger as a ruling and dispatch `sdd-escalation-implementer` for it
|
|
264
|
-
the
|
|
265
|
-
|
|
345
|
+
the ledger as a ruling and dispatch `sdd-escalation-implementer` for it,
|
|
346
|
+
telling it in the dispatch that this is a first implementation: there is no
|
|
347
|
+
report file yet and there are no findings, so it starts from the brief. The
|
|
348
|
+
default remains `sdd-implementer`. Never reach for the bundled `task`
|
|
349
|
+
agent for an SDD seat — it has none of the seat's tool limits, output
|
|
350
|
+
contract, or no-subagent rule.
|
|
266
351
|
|
|
267
352
|
## The Task Loop
|
|
268
353
|
|
|
@@ -289,6 +374,14 @@ any that finished without reporting. A bounded stretch keeps nearly
|
|
|
289
374
|
all of a long wait's efficiency while guaranteeing a stuck or lost
|
|
290
375
|
child is noticed within minutes, not at the end of the session.
|
|
291
376
|
|
|
377
|
+
**Reading results:** omp previews a subagent result longer than 5,000
|
|
378
|
+
characters head-only and marks the cut with a pointer
|
|
379
|
+
(`<preview full-output="agent://<id>">`). Before you act on any result that
|
|
380
|
+
carries that pointer, read `agent://<id>` in full — or one structured field,
|
|
381
|
+
`agent://<id>/<field>` (nested: `agent://<id>/findings/0/body`). The
|
|
382
|
+
omitted tail is where it hurts: a final review's Ledger triage, Declined to
|
|
383
|
+
judge, and **Mergeable:** come last.
|
|
384
|
+
|
|
292
385
|
### 1. Dispatch the implementer
|
|
293
386
|
|
|
294
387
|
Record BASE (`git rev-parse HEAD`) before dispatching — the review package
|
|
@@ -325,39 +418,35 @@ and fix-round diffs need it.
|
|
|
325
418
|
a pointer to that ledger entry in the dispatch.
|
|
326
419
|
- Record the implementer's agent identity from the dispatch result —
|
|
327
420
|
fix-loop rounds 1-2 resume this agent.
|
|
328
|
-
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
`
|
|
344
|
-
|
|
345
|
-
is
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
`
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
package: FIX_BASE for a task is that task's own previous review head, and
|
|
358
|
-
two tasks' fix rounds may share a dispatch call only if they are isolated
|
|
359
|
-
too. Findings the final whole-branch review raises across wave seams are
|
|
360
|
-
the normal cross-task case — that review exists for them.
|
|
421
|
+
- Never dispatch multiple implementation subagents in parallel (conflicts).
|
|
422
|
+
- **On omp, the agent id is the handle and resume is a message.** The
|
|
423
|
+
`<task-result id="X" …>` envelope (inline, or delivered as a notice)
|
|
424
|
+
reports the agent id and says the agent is now idle. Use that id exactly
|
|
425
|
+
as reported: omp qualifies a nested agent (`Parent.Child`), suffixes a name
|
|
426
|
+
that was already taken (`Name-2`), and calls a follow-up turn's job
|
|
427
|
+
`<id>-2` — the job id is not the agent id. Ledger the dispatch the moment
|
|
428
|
+
you have the id, together with BASE, so both survive compaction:
|
|
429
|
+
`Task <N>: dispatched (BASE <base7>, implementer <id>)`. Fix rounds 1-2
|
|
430
|
+
and the answer to a NEEDS_CONTEXT then go to that agent with
|
|
431
|
+
`write agent://<id>`.
|
|
432
|
+
- **The write has two success answers; only an error means "dispatch
|
|
433
|
+
fresh".** An idle agent is parked after `task.agentIdleTtlMs` (default
|
|
434
|
+
420000 ms, 7 minutes), and a long review outlasts that. A write to a live
|
|
435
|
+
agent answers `Delivered to <id>.`; a write to a parked one answers
|
|
436
|
+
`Queued for <id> (was parked; revived).` Both are success: the parked agent
|
|
437
|
+
is rebuilt from its saved transcript (its live session was disposed), so its
|
|
438
|
+
context is back, nothing held only in the live session carries over, and its
|
|
439
|
+
next result arrives as a notice either way. Only an error answer (`Failed:
|
|
440
|
+
…`, or a write error) means dispatch a fresh `sdd-implementer`. That
|
|
441
|
+
dispatch gets a new id, which omp may suffix (`Name-2`) because the old id is
|
|
442
|
+
taken: ledger it — `Task <N>: re-dispatched (implementer <new id>)` — and use
|
|
443
|
+
it from then on.
|
|
444
|
+
- **One implementer at a time, no isolation.** On omp, SDD dispatches
|
|
445
|
+
implementers one at a time, in plan order, in the shared checkout, and does
|
|
446
|
+
not use `task.isolation.enabled`: under the default
|
|
447
|
+
`task.isolation.merge: patch` an isolated run's work lands as an applied but
|
|
448
|
+
uncommitted diff, so a review package has no commit range to cut, and an
|
|
449
|
+
isolated agent cannot be resumed or messaged, which fix rounds 1-2 need.
|
|
361
450
|
|
|
362
451
|
Template: [implementer-prompt.md](implementer-prompt.md)
|
|
363
452
|
|
|
@@ -369,7 +458,7 @@ Implementer subagents report one of four statuses. Handle each appropriately:
|
|
|
369
458
|
|
|
370
459
|
**DONE_WITH_CONCERNS:** The implementer completed the work but flagged doubts. Read the concerns before proceeding. If the concerns are about correctness or scope, address them before review. If they're observations (e.g., "this file is getting large"), note them and proceed to review.
|
|
371
460
|
|
|
372
|
-
**NEEDS_CONTEXT:** The implementer needs information that wasn't provided. Provide the missing context and re-dispatch.
|
|
461
|
+
**NEEDS_CONTEXT:** The implementer needs information that wasn't provided. Provide the missing context and re-dispatch. On omp, message the idle agent instead (`write agent://<id>`, the id from the ledger's `dispatched` line): it keeps its context and yields again. Only a write error means re-dispatch, with the context carried in the brief.
|
|
373
462
|
|
|
374
463
|
**BLOCKED:** The implementer cannot complete the task. Assess the blocker:
|
|
375
464
|
1. If it's a context problem, provide more context and re-dispatch with the same model
|
|
@@ -377,6 +466,15 @@ Implementer subagents report one of four statuses. Handle each appropriately:
|
|
|
377
466
|
3. If the task is too large, break it into smaller pieces
|
|
378
467
|
4. If the plan itself is wrong, rule on the correction, ledger it, and re-dispatch with the ruling carried in the dispatch
|
|
379
468
|
|
|
469
|
+
On omp there is no model parameter, so map items 1 and 2 onto seats. "The
|
|
470
|
+
same model" is the same seat: `sdd-implementer`, messaged as under
|
|
471
|
+
NEEDS_CONTEXT, or dispatched fresh if that write errors. "A more capable
|
|
472
|
+
model" is `sdd-escalation-implementer`, dispatched fresh with the brief path
|
|
473
|
+
and the blocker. If the blocked implementer wrote a report, the report file
|
|
474
|
+
records what it tried, so this is a takeover: pass its path. If it wrote
|
|
475
|
+
none, this is a first implementation: say so in the dispatch (no report file,
|
|
476
|
+
no findings, start from the brief).
|
|
477
|
+
|
|
380
478
|
**Never** ignore an escalation or force the same model to retry without changes. If the implementer said it's stuck, something needs to change.
|
|
381
479
|
|
|
382
480
|
If the implementer asks questions — before starting or mid-task — answer
|
|
@@ -396,8 +494,13 @@ needed.
|
|
|
396
494
|
it prints (or, without bash: `git log --oneline`, `git diff --stat`,
|
|
397
495
|
and `git diff -U10` for the range, redirected to one uniquely named
|
|
398
496
|
file). The output never enters your own context, and the reviewer sees
|
|
399
|
-
the commit list, stat summary, and full diff with context in one
|
|
400
|
-
|
|
497
|
+
the commit list, stat summary, and full diff with context in one file.
|
|
498
|
+
On omp a bare `read` returns only the first 300 lines, so the reviewer
|
|
499
|
+
must read it with an explicit range: `<path>:1-3000` returns up to 3,000
|
|
500
|
+
lines in one call, and a longer package continues with `:3001-6000`
|
|
501
|
+
(the open-ended `:1-` still stops at 300). The templates carry that
|
|
502
|
+
instruction; keep it in any dispatch you write by hand. Use the BASE you
|
|
503
|
+
recorded before dispatching the implementer —
|
|
401
504
|
never `HEAD~1`, which silently truncates multi-commit tasks. Never
|
|
402
505
|
dispatch a task reviewer without a diff file.
|
|
403
506
|
- **Reviewer inputs:** the task reviewer gets three paths — the same brief
|
|
@@ -430,6 +533,23 @@ complete: you hold the plan and cross-task context the reviewer
|
|
|
430
533
|
lacks. If you confirm an item is a real gap, treat it as a failed spec
|
|
431
534
|
review — it enters the fix loop with the other findings.
|
|
432
535
|
|
|
536
|
+
**Check the result before you act on it.** omp 18.4.10 does not enforce
|
|
537
|
+
the rules between fields in a reviewer's schema — the `metadata.description`
|
|
538
|
+
text in an `output:` schema never reaches the model, and permissive mode
|
|
539
|
+
accepts an invalid result after its retries — so you do, for a task review
|
|
540
|
+
and a re-review alike:
|
|
541
|
+
|
|
542
|
+
- `finding_verdicts` (re-review) holds one entry per finding you
|
|
543
|
+
dispatched, in order.
|
|
544
|
+
- `all_addressed` holds no NOT_ADDRESSED entry and no new Critical/Important
|
|
545
|
+
entry in `new_breakage`.
|
|
546
|
+
- A `package_gap` is never mixed with real verdicts. A task review's two
|
|
547
|
+
verdicts are both `package_gap` with nothing else filled; a re-review's
|
|
548
|
+
`finding_verdicts` is `[]`. A result that mixes them is a malformed gap:
|
|
549
|
+
regenerate the package and re-dispatch — never read half of it as a
|
|
550
|
+
verdict.
|
|
551
|
+
- A result the harness reports as schema-invalid is re-dispatched, not read.
|
|
552
|
+
|
|
433
553
|
Template: [task-reviewer-prompt.md](task-reviewer-prompt.md)
|
|
434
554
|
|
|
435
555
|
### 4. The fix loop
|
|
@@ -475,16 +595,26 @@ minutes, and converged on adjudication anyway.
|
|
|
475
595
|
|
|
476
596
|
**Rounds 1-2 — resume the original implementer.** Send it the open findings
|
|
477
597
|
verbatim. Its context is intact: it knows the task, the code, and its own
|
|
478
|
-
choices.
|
|
479
|
-
|
|
480
|
-
|
|
598
|
+
choices. On omp, that is a message to the idle agent — `write agent://<id>`
|
|
599
|
+
with the findings, using the id from the ledger's `dispatched` line exactly as
|
|
600
|
+
the task result reported it. `Delivered to <id>.` and `Queued for <id> (was
|
|
601
|
+
parked; revived).` are both resumes (see Dispatch); the agent's next result
|
|
602
|
+
arrives later, as a notice, like the first.
|
|
603
|
+
If your harness cannot send another message to a live subagent —
|
|
604
|
+
on omp, only if that write returns an error — dispatch a fresh
|
|
605
|
+
`sdd-implementer` carrying the brief path, the report-file path, and the
|
|
606
|
+
findings — the report file is the persistent memory either way.
|
|
481
607
|
|
|
482
608
|
**Round 3 — escalate:** dispatch a fresh `sdd-escalation-implementer` with
|
|
483
609
|
the brief path, the report-file path, the open findings, and this framing: "A
|
|
484
610
|
prior implementer attempted this task [N] times; you own it now. Read the
|
|
485
611
|
report file for what was tried." A loop that survives two resumes usually
|
|
486
612
|
means the implementer cannot see its own problem — fresh eyes and a
|
|
487
|
-
capability bump in one move.
|
|
613
|
+
capability bump in one move. The bump is whatever this host maps the
|
|
614
|
+
escalation seat to: with the shipped defaults, a stronger model at deeper
|
|
615
|
+
reasoning (opus-5-5 at `max` over sonnet-5-5 at `medium`); a host that maps
|
|
616
|
+
both seats to one model gets deeper reasoning only, and the fresh context
|
|
617
|
+
does the rest.
|
|
488
618
|
|
|
489
619
|
**Every round, either way:** the implementer fixes, re-runs the tests
|
|
490
620
|
covering the amended code, appends its fix report to the same report file,
|
|
@@ -498,12 +628,19 @@ whole suite.
|
|
|
498
628
|
where FIX_BASE is the head the previous review saw, and dispatch
|
|
499
629
|
`sdd-rereviewer` with [re-review-prompt.md](re-review-prompt.md): the
|
|
500
630
|
findings list, the brief, the report file, and the printed diff path. It
|
|
501
|
-
has no
|
|
631
|
+
has no bash, edit, or file-write tool and a four-call working budget plus its
|
|
632
|
+
`yield`. It yields
|
|
502
633
|
`finding_verdicts[]` (ADDRESSED / NOT_ADDRESSED with file:line),
|
|
503
634
|
`new_breakage[]` for the fix diff only, `out_of_scope[]`, and
|
|
504
635
|
`round_verdict`. New Critical/Important entries in `new_breakage` join the
|
|
505
636
|
open findings list. `out_of_scope` goes to the ledger as deferred minors —
|
|
506
|
-
it never extends the loop.
|
|
637
|
+
it never extends the loop. Check the result as described under Review the
|
|
638
|
+
task before you act on it.
|
|
639
|
+
|
|
640
|
+
The re-reviewer cannot run tests. Where its evidence names a focused test it
|
|
641
|
+
would run, run that test yourself before you accept `all_addressed`; a
|
|
642
|
+
failing run reopens that finding as NOT_ADDRESSED and counts as an open
|
|
643
|
+
finding of this round.
|
|
507
644
|
|
|
508
645
|
**After each round,** append to the ledger:
|
|
509
646
|
`Task <N>: fix round <R>/3 (<X> addressed, <Y> open — <finding one-liners>; commits <a7>..<b7>)`
|
|
@@ -553,15 +690,22 @@ The final whole-branch review gets a package too: run
|
|
|
553
690
|
branch started from, e.g. `git merge-base main HEAD`) and include the
|
|
554
691
|
printed path in the final review dispatch, so the final reviewer reads
|
|
555
692
|
one file instead of re-deriving the branch diff with git commands. Dispatch
|
|
556
|
-
`sdd-final-reviewer` (
|
|
557
|
-
Selection) with a `task` that
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
693
|
+
`sdd-final-reviewer` (the deepest seat, once per plan — see Agent
|
|
694
|
+
Selection) with a `task` that says the plan ran subagent-driven — every
|
|
695
|
+
task went through its task review, except the fixes you applied yourself on
|
|
696
|
+
the proven-trivial route, which skipped the re-review — and names: the
|
|
697
|
+
package path, the plan/spec paths, and the ledger's deferred-minor and
|
|
698
|
+
parked-with-ruling lines verbatim, plus every `Task <N>: applied … proof:`
|
|
699
|
+
line (the reviewer checks those fixes as if unreviewed) and any
|
|
700
|
+
`high-risk diff` line (so the last review spends its depth there). Do not
|
|
701
|
+
paste requesting-code-review's `code-reviewer.md` into the dispatch — that
|
|
702
|
+
template asks a prose "Ready to merge?" and has no slot for the package or
|
|
703
|
+
the ledger; the agent reads that file's review rubric itself. The agent
|
|
704
|
+
file's `<output>` governs: findings with file:line, a `### Ledger triage`
|
|
705
|
+
section (each line → fix-before-merge | accept, with reason), a `### Declined
|
|
706
|
+
to judge` section, and a closing **Mergeable:** yes | no. Those sections come
|
|
707
|
+
last, so read the whole result at `agent://<id>` before you act (see Reading
|
|
708
|
+
results). Every "Declined to judge" line is a ruling you
|
|
565
709
|
make and ledger, exactly like a plan conflict — `Final: Ruling: <behavior
|
|
566
710
|
the reviewer set aside> — <what a reasonable person using this software
|
|
567
711
|
gets, and why that stands or why it is now a finding> — <cost if wrong>`;
|
|
@@ -617,18 +761,20 @@ Use superpowers:finishing-a-development-branch.
|
|
|
617
761
|
```
|
|
618
762
|
You: I'm using Subagent-Driven Development to execute this plan.
|
|
619
763
|
|
|
620
|
-
[Setup: worktree verified]
|
|
764
|
+
[Setup: worktree verified; on omp, session moved into it with /move]
|
|
621
765
|
[Read plan file once: docs/superpowers/plans/feature-plan.md]
|
|
622
766
|
[Resolve workspace: bash scripts/sdd-workspace docs/superpowers/plans/feature-plan.md — no ledger inside, fresh start]
|
|
767
|
+
[On omp: scripts dir resolved with realpath skill://subagent-driven-development/scripts and added to the ledger as "SDD scripts: <dir>"; each script runs as bash <dir>/<name>]
|
|
623
768
|
[Create todos for all tasks]
|
|
624
769
|
|
|
625
770
|
Task 1: Hook installation script
|
|
626
771
|
|
|
627
772
|
[Run task-brief for Task 1; dispatch implementer with brief + report paths + context]
|
|
773
|
+
[Ledger: Task 1: dispatched (BASE a1b2c3d, implementer Impl1)]
|
|
628
774
|
|
|
629
775
|
Implementer: "Before I begin - should the hook be installed at user or system level?"
|
|
630
776
|
|
|
631
|
-
You: "User level (~/.config/superpowers/hooks/)"
|
|
777
|
+
You: [write agent://Impl1] "User level (~/.config/superpowers/hooks/)"
|
|
632
778
|
|
|
633
779
|
Implementer: [Later]
|
|
634
780
|
- Implemented install-hook command
|
|
@@ -645,6 +791,7 @@ sdd-reviewer: spec_compliance: compliant · task_quality: approved
|
|
|
645
791
|
Task 2: Recovery modes
|
|
646
792
|
|
|
647
793
|
[Run task-brief for Task 2; dispatch implementer with brief + report paths + context]
|
|
794
|
+
[Ledger: Task 2: dispatched (BASE d4e5f6a, implementer Impl2)]
|
|
648
795
|
|
|
649
796
|
Implementer: [No questions]
|
|
650
797
|
- Added verify/repair modes
|
|
@@ -656,7 +803,7 @@ sdd-reviewer: spec_compliance: issues · task_quality: needs_fixes
|
|
|
656
803
|
spec_issues: ["Missing: progress reporting (spec says 'report every 100 items')"]
|
|
657
804
|
findings: [{severity: Important, location: src/recovery.js:7, body: "Magic number (100)"}]
|
|
658
805
|
|
|
659
|
-
[Fix round 1:
|
|
806
|
+
[Fix round 1: write agent://Impl2 with both findings]
|
|
660
807
|
Implementer: Added progress reporting, extracted PROGRESS_INTERVAL constant.
|
|
661
808
|
Re-ran test/recovery.test.js — 10/10 passing. Fix report appended.
|
|
662
809
|
|
|
@@ -673,7 +820,8 @@ sdd-rereviewer: round_verdict: all_addressed
|
|
|
673
820
|
|
|
674
821
|
[After all tasks]
|
|
675
822
|
[Run review-package PLAN_FILE MERGE_BASE HEAD; dispatch sdd-final-reviewer]
|
|
676
|
-
|
|
823
|
+
[Read the full result at agent://<id>]
|
|
824
|
+
sdd-final-reviewer: Ledger triage: deferred minors — none block merge. **Mergeable:** yes
|
|
677
825
|
|
|
678
826
|
[Delete this plan's workspace — the record now lives in git]
|
|
679
827
|
|
|
@@ -9,6 +9,12 @@ Use this template when dispatching an implementer subagent.
|
|
|
9
9
|
agent: "sdd-implementer", # REQUIRED — carries model, thinking level, tools.
|
|
10
10
|
# Fix round 3 / a ruled strongest-tier exception:
|
|
11
11
|
# "sdd-escalation-implementer". Never plain "task".
|
|
12
|
+
solutionSpace: "one task: requirements and exact values are in the brief",
|
|
13
|
+
# REQUIRED by omp's task schema: one line on how open the
|
|
14
|
+
# problem is. A first implementation on the escalation
|
|
15
|
+
# seat: "design open across files: interfaces given,
|
|
16
|
+
# approach to choose" (and say it is a first
|
|
17
|
+
# implementation: no report file, no findings).
|
|
12
18
|
task: |
|
|
13
19
|
You are implementing Task N: [task name]
|
|
14
20
|
|
|
@@ -88,8 +94,8 @@ Use this template when dispatching an implementer subagent.
|
|
|
88
94
|
|
|
89
95
|
**How to escalate:** Report back with status BLOCKED or NEEDS_CONTEXT. Describe
|
|
90
96
|
specifically what you're stuck on, what you've tried, and what kind of help you need.
|
|
91
|
-
The controller can provide more context,
|
|
92
|
-
or break the task into smaller pieces.
|
|
97
|
+
The controller can provide more context, hand the task to a stronger seat
|
|
98
|
+
(`sdd-escalation-implementer`), or break the task into smaller pieces.
|
|
93
99
|
|
|
94
100
|
## Before Reporting Back: Self-Review
|
|
95
101
|
|
|
@@ -11,8 +11,11 @@ that the fix itself broke nothing.
|
|
|
11
11
|
{ context: "<one line: plan name, branch, read-only re-review of one fix round>",
|
|
12
12
|
tasks: [ {
|
|
13
13
|
name: "ReReviewTaskNRoundR",
|
|
14
|
-
agent: "sdd-rereviewer", # REQUIRED — the
|
|
15
|
-
#
|
|
14
|
+
agent: "sdd-rereviewer", # REQUIRED — the verdict-only seat: read/grep only (no
|
|
15
|
+
# edit, bash, or file-write tool), four working calls
|
|
16
|
+
# plus the final yield.
|
|
17
|
+
solutionSpace: "verdicts only: the findings and the fix diff are given; nothing to design",
|
|
18
|
+
# REQUIRED by omp's task schema: one line on how open the problem is.
|
|
16
19
|
task: |
|
|
17
20
|
You are re-reviewing one task's fix round. A previous review produced
|
|
18
21
|
findings; an implementer has attempted to fix them. Your job is to
|
|
@@ -20,7 +23,7 @@ that the fix itself broke nothing.
|
|
|
20
23
|
|
|
21
24
|
## The Task
|
|
22
25
|
|
|
23
|
-
Read the task brief: [BRIEF_FILE]
|
|
26
|
+
Read the task brief (explicit range: `[BRIEF_FILE]:1-3000`): [BRIEF_FILE]
|
|
24
27
|
|
|
25
28
|
## The Findings Under Verification
|
|
26
29
|
|
|
@@ -28,19 +31,26 @@ that the fix itself broke nothing.
|
|
|
28
31
|
|
|
29
32
|
## The Fix
|
|
30
33
|
|
|
31
|
-
Read the implementer's report
|
|
32
|
-
|
|
34
|
+
Read the implementer's report to its last line — the fix reports are
|
|
35
|
+
appended at the end, past a bare read's 300 lines (explicit range:
|
|
36
|
+
`[REPORT_FILE]:1-3000`): [REPORT_FILE]
|
|
33
37
|
|
|
34
38
|
**Fix base:** [FIX_BASE_SHA] (the head the previous review saw)
|
|
35
39
|
**Head:** [HEAD_SHA]
|
|
36
40
|
**Diff file:** [DIFF_FILE]
|
|
37
41
|
|
|
38
|
-
Read the diff file
|
|
39
|
-
|
|
40
|
-
|
|
42
|
+
Read the diff file in full, with an explicit range: `[DIFF_FILE]:1-3000`
|
|
43
|
+
(a bare read returns only the first 300 lines; while the footer says
|
|
44
|
+
`[Showing lines … of N. Use :M to continue]`, continue with the next
|
|
45
|
+
range). It contains the fix commits, a stat summary, and the fix diff
|
|
46
|
+
with surrounding context. You have no bash tool; if the diff file is
|
|
47
|
+
missing, report that as a gap and stop.
|
|
41
48
|
|
|
42
49
|
Your review is read-only on this checkout. Do not mutate the working
|
|
43
|
-
tree, the index, HEAD, or branch state in any way
|
|
50
|
+
tree, the index, HEAD, or branch state in any way, and never call an
|
|
51
|
+
`xd://` device or an extension, MCP, or memory tool that executes code,
|
|
52
|
+
writes files, or changes external state — your `tools:` list does not
|
|
53
|
+
stop those, this instruction does.
|
|
44
54
|
|
|
45
55
|
## You Do Not Dispatch Subagents
|
|
46
56
|
|
|
@@ -65,10 +75,11 @@ that the fix itself broke nothing.
|
|
|
65
75
|
The implementer re-ran the tests covering the amended code and appended
|
|
66
76
|
the results to the report file. Treat the report as unverified claims:
|
|
67
77
|
confirm the fix report names the covering tests and shows their output,
|
|
68
|
-
and verify the claims against the diff. You have no
|
|
78
|
+
and verify the claims against the diff. You have no bash tool: if reading
|
|
69
79
|
the code raises a specific doubt that no existing run answers, name the
|
|
70
80
|
focused test you would run in that finding's evidence and verdict on
|
|
71
|
-
what the diff shows
|
|
81
|
+
what the diff shows — the controller runs that test before it accepts
|
|
82
|
+
`all_addressed`.
|
|
72
83
|
|
|
73
84
|
## Output
|
|
74
85
|
|