@loneexile/omp-superpowers 6.4.2-omp.2 → 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.
@@ -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` agent
190
- resolves to whatever `modelRoles.task` is configured to (else the session
191
- model) and the bundled `reviewer` to `@slow` — in a real 157-subagent
192
- session both were the slowest tier over the widest tool set, which is where
193
- most of the wall-clock went.
194
-
195
- | Role | `agent:` | Shipped default · thinking | Tools |
196
- |---|---|---|---|
197
- | Implementer (every task, fix rounds 1-2) | `sdd-implementer` | sonnet-5 · medium | edit/test set, no subagents |
198
- | Fix round 3 | `sdd-escalation-implementer` | opus-5 · **xhigh** | same as implementer |
199
- | Task reviewer | `sdd-reviewer` | sonnet-5 · high | `read`, `grep`, `glob` — no file writes, no shell (see note) |
200
- | Scoped re-review | `sdd-rereviewer` | sonnet-5 · low | `read`, `grep`; ≤4 tool calls (a justified fifth is allowed) |
201
- | Final whole-branch review | `sdd-final-reviewer` | opus-5 · **xhigh** | read-only + focused bash |
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 raise reasoning to `xhigh`, re-reviews drop to `low`.
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` hub) beats the agent file's
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 "no shell" enforces (measured, omp 18.1.15).** A `tools:` list is
234
- honoured: the reviewers get no `bash`/`edit`, and their `write` is only the
235
- `xd://` device transport — a filesystem write is refused ("Filesystem
236
- writes are not available elsewhere"). Two things the frontmatter cannot
237
- remove: `hub` (always-on for every non-restricted subagent) and, with it,
238
- `hub start`, which launches an executable directly — a probe from
239
- `sdd-reviewer` ran `echo` that way. The executor's `restrictToolNames`
240
- option would strip it, but only omp's own compression and security
241
- sessions set it; no agent frontmatter field maps to it. So the guarantee
242
- is "cannot edit the tree and cannot run a shell", not "cannot spawn a
243
- process". The prompts forbid mutation; the harness enforces the file and
244
- shell parts.
245
-
246
- **Turn count beats token price.** Wall-clock scales with how many turns a
247
- subagent takes, and the cheap model here takes 2-3× the turns of a
248
- sonnet-class model on multi-step work — that is the trade this
249
- configuration makes deliberately (flat-rate cost, ~17 s/turn). Watch the
250
- ledger: a task whose implementer needs 100+ turns, or a re-review that
251
- wanders, is the signal to rule that task onto the escalation seat.
252
- Re-reviews are verdict-only work over a small diff — `low` reasoning is
253
- correct for them, not a compromise.
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. If `task.enableEffort` is on you may add `effort: "hi"`
258
- (the only accepted values are `"lo"`, `"med"`, `"hi"`) to raise thinking
259
- further; it is optional — the agent's own tier is the escalation.
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 default remains `sdd-implementer`. Never reach for the bundled `task`
265
- agent for an SDD seat — its tier is whatever the session configured.
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
- - **Waves, only with isolation.** Disjoint files are not enough on omp:
329
- subagents share the controller's checkout — one index, one HEAD, one
330
- working tree — unless subagent isolation is on (`task.isolation.enabled`,
331
- default `false`; the backend is `isolation.backend`, default `auto`).
332
- Two concurrent implementers in one tree sweep each other's half-written
333
- files into their commits and test against each other's in-flight code.
334
- So: at setup, run `omp config get task.isolation.enabled` and ledger the
335
- answer — read it from the live CLI, not from memory or a source tree, the
336
- key has been renamed across omp versions (older builds spelled it
337
- `task.isolation.mode`). If it is `false`, every implementer runs alone,
338
- in plan order, and the rest of this bullet does not apply. If it is
339
- `true`, group tasks into waves from your pre-flight table (it already
340
- names every pair sharing a file or interface — it IS the dependency
341
- graph): a wave holds tasks with no shared row between them and no
342
- unfinished producer. Dispatch a wave as ONE `task` call, one
343
- `sdd-implementer` per task, each with its own brief and report path and
344
- the per-item `isolated: true` flag the `task` tool exposes once isolation
345
- is on (check the tool's own schema); record the same BASE for every task
346
- in the wave. Tasks that share a row run in later waves, in
347
- producer→consumer order. A task whose brief you had to amend with a
348
- ruling runs alone. When in doubt about a shared file, serialize — a
349
- conflict costs more than the parallelism buys.
350
- - **A wave shares the dispatch call, never the diff.** Each task keeps its
351
- own review package: after the wave's results integrate, run
352
- `bash scripts/review-package PLAN_FILE <task BASE> <task HEAD>` per task — the range
353
- the harness reports as that task's integrated commits — and dispatch one
354
- `sdd-reviewer` per task in one `task` call, each pointed at its own brief,
355
- report, and package. A reviewer that sees sibling hunks cannot decide
356
- "nothing extra" for its own brief. Fix rounds stay per task and per
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 Read
400
- call. Use the BASE you recorded before dispatching the implementer —
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. If your harness cannot send another message to a live subagent,
479
- dispatch a fresh `sdd-implementer` carrying the brief path, the report-file
480
- path, and the findings — the report file is the persistent memory either way.
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 shell and no file writes, and a four-call budget. It yields
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,16 +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` (xhigh reasoning, once per plan — see Agent
557
- Selection) with a `task` that says the plan ran subagent-driven (every
558
- task passed its task review) and names: the package path, the plan/spec
559
- paths, and the ledger's deferred-minor and parked-with-ruling lines
560
- verbatim. Do not wrap it in requesting-code-review's `code-reviewer.md` —
561
- that template asks a prose "Ready to merge?" and has no slot for the
562
- package or the ledger. The agent file's `<output>` governs: findings with
563
- file:line, a `### Ledger triage` section (each line → fix-before-merge |
564
- accept, with reason), a `### Declined to judge` section, and a closing
565
- **Mergeable:** yes | no. Every "Declined to judge" line is a ruling you
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
566
709
  make and ledger, exactly like a plan conflict — `Final: Ruling: <behavior
567
710
  the reviewer set aside> — <what a reasonable person using this software
568
711
  gets, and why that stands or why it is now a finding> — <cost if wrong>`;
@@ -618,18 +761,20 @@ Use superpowers:finishing-a-development-branch.
618
761
  ```
619
762
  You: I'm using Subagent-Driven Development to execute this plan.
620
763
 
621
- [Setup: worktree verified]
764
+ [Setup: worktree verified; on omp, session moved into it with /move]
622
765
  [Read plan file once: docs/superpowers/plans/feature-plan.md]
623
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>]
624
768
  [Create todos for all tasks]
625
769
 
626
770
  Task 1: Hook installation script
627
771
 
628
772
  [Run task-brief for Task 1; dispatch implementer with brief + report paths + context]
773
+ [Ledger: Task 1: dispatched (BASE a1b2c3d, implementer Impl1)]
629
774
 
630
775
  Implementer: "Before I begin - should the hook be installed at user or system level?"
631
776
 
632
- You: "User level (~/.config/superpowers/hooks/)"
777
+ You: [write agent://Impl1] "User level (~/.config/superpowers/hooks/)"
633
778
 
634
779
  Implementer: [Later]
635
780
  - Implemented install-hook command
@@ -646,6 +791,7 @@ sdd-reviewer: spec_compliance: compliant · task_quality: approved
646
791
  Task 2: Recovery modes
647
792
 
648
793
  [Run task-brief for Task 2; dispatch implementer with brief + report paths + context]
794
+ [Ledger: Task 2: dispatched (BASE d4e5f6a, implementer Impl2)]
649
795
 
650
796
  Implementer: [No questions]
651
797
  - Added verify/repair modes
@@ -657,7 +803,7 @@ sdd-reviewer: spec_compliance: issues · task_quality: needs_fixes
657
803
  spec_issues: ["Missing: progress reporting (spec says 'report every 100 items')"]
658
804
  findings: [{severity: Important, location: src/recovery.js:7, body: "Magic number (100)"}]
659
805
 
660
- [Fix round 1: resume the implementer with both findings]
806
+ [Fix round 1: write agent://Impl2 with both findings]
661
807
  Implementer: Added progress reporting, extracted PROGRESS_INTERVAL constant.
662
808
  Re-ran test/recovery.test.js — 10/10 passing. Fix report appended.
663
809
 
@@ -674,7 +820,8 @@ sdd-rereviewer: round_verdict: all_addressed
674
820
 
675
821
  [After all tasks]
676
822
  [Run review-package PLAN_FILE MERGE_BASE HEAD; dispatch sdd-final-reviewer]
677
- sdd-final-reviewer: Mergeable: yes. Ledger triage: deferred minors — none block merge.
823
+ [Read the full result at agent://<id>]
824
+ sdd-final-reviewer: Ledger triage: deferred minors — none block merge. **Mergeable:** yes
678
825
 
679
826
  [Delete this plan's workspace — the record now lives in git]
680
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, re-dispatch with a more capable model,
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 cheap seat: low thinking,
15
- # read/grep only (no file writes, no shell), four-call budget.
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 (fix reports are appended at the end):
32
- [REPORT_FILE]
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 once — it contains the fix commits, a stat summary,
39
- and the fix diff with surrounding context. You have no shell; if the
40
- diff file is missing, report that as a gap and stop.
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 shell: if reading
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