@loneexile/omp-superpowers 6.4.2-omp.2 → 6.4.2-omp.4

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.
@@ -42,6 +42,22 @@ that norms say you ask about first (a merge, a push to a shared branch, a
42
42
  publish); and a plan so broken that every path forward is a guess. For
43
43
  those, stop and ask.
44
44
 
45
+ **On omp in vibe mode** (your tools include `vibe_spawn` but not `task`)
46
+ you are the director, and you cannot execute the plan "yourself": you have
47
+ no `bash`, `edit` or `write`. Hand the whole run to ONE `good` worker. It
48
+ executes the plan, including the final review it dispatches to
49
+ `sdd-final-reviewer` through its own `task` tool. Its brief tells it to
50
+ `read skill://executing-plans` and execute `<plan>` in `<worktree>`, and
51
+ gives two rules. First, run every test, build and script the skill calls
52
+ for: the brief must say so explicitly, because an omp 18.4.12 worker skips
53
+ checks unless its assignment explicitly instructs them. Second, when the
54
+ skill says to stop and ask your human partner, end the turn with the
55
+ question. The worker has no `todo`, so the ledger is its record. You keep
56
+ the todo list from its ledger (`<workspace>/progress.md`), take its
57
+ questions to your human partner, and `vibe_send` the answers. The
58
+ worktree and budget limits are in "Vibe mode" in
59
+ `skill://using-superpowers/references/pi-tools.md`.
60
+
45
61
  ## When to Use
46
62
 
47
63
  - You have a plan from superpowers:writing-plans and your human partner
@@ -139,6 +155,22 @@ and the new one resumes from the same ledger.
139
155
  `# SDD ledger — plan: <plan file path>`.
140
156
  - `git clean -fdx` will destroy the workspace (it's git-ignored scratch);
141
157
  if that happens, recover from `git log`.
158
+ - **On omp, resolve the scripts directories first.** The relative paths in
159
+ this skill (`scripts/task-start`, `../subagent-driven-development/scripts/…`)
160
+ do not resolve from the repo root, and `omp read skill://…` lists the files
161
+ but gives no filesystem path. Once, before the first script, run
162
+ `realpath skill://executing-plans/scripts` and
163
+ `realpath skill://subagent-driven-development/scripts` in the `bash` tool
164
+ (omp's bash resolves `skill://` URLs) and add the printed paths to the
165
+ ledger, after the identity line, as `Executing-plans scripts: <dir>` and
166
+ `SDD scripts: <dir>`. Ledger lines are found by their prefix, never by
167
+ position. This ledger is shared with subagent-driven-development, which
168
+ writes only `SDD scripts:`: add whichever of the two lines it lacks. Then run
169
+ each script as `bash <dir>/<name>` — `scripts/task-start` and
170
+ `scripts/task-done` from the executing-plans directory, `sdd-workspace` and
171
+ `review-package` from the SDD one — with the working directory at the repo
172
+ root; the scripts call `git rev-parse`. The invocation lines in this skill
173
+ stay as upstream wrote them.
142
174
 
143
175
  Read the plan once, note its context and Global Constraints, and create a
144
176
  todo per task. If the plan names a Spec, read that too: the spec is the
@@ -256,13 +288,23 @@ agent. Dispatch `sdd-final-reviewer`, the whole-branch reviewer this
256
288
  plugin ships, not the bundled `reviewer` or `task` agent. Give it the
257
289
  inputs above and say the plan ran inline, with no task reviewed, so it
258
290
  checks every change rather than only cross-task seams. Do not paste
259
- code-reviewer.md into the dispatch: the agent file carries the review
260
- method and the output format. Its model is whatever this host maps that
261
- agent to: opus-5 · xhigh by default, re-pointed with
262
- `task.agentModelOverrides`. Its result has findings with severities, a
263
- `### Ledger triage` over the `Ruling:` lines you passed (a line it marks
264
- fix-before-merge is a finding like any other), a `### Declined to judge`
265
- list, and **Mergeable:**.
291
+ code-reviewer.md into the dispatch: the agent reads the review rubric from
292
+ it itself, and its own `<output>` governs. Its model is whatever this host
293
+ maps that agent to: opus-5-5 · max by default (`@slow` when that pin has no
294
+ credentials), re-pointed with `task.agentModelOverrides`. Its result has
295
+ findings with severities, a `### Ledger triage` over the `Ruling:` lines you
296
+ passed (a line it marks fix-before-merge is a finding like any other), a
297
+ `### Declined to judge` list, and **Mergeable:**, in that order. The task
298
+ result previews only the first 5,000 characters and those sections come
299
+ last, so read the whole result at `agent://<id>` — the id exactly as the
300
+ result reports it — before you sort any finding.
301
+
302
+ The reviewer starts in the session's cwd — the `task` tool has no `cwd`
303
+ argument. If the plan runs in a worktree made with `omp worktree add` and
304
+ your human partner has not run `/move <path>`, it would read and run `git`
305
+ in the ORIGINAL checkout. Get `/move` first. If you cannot, put the
306
+ worktree's absolute path in the dispatch and tell the reviewer to use
307
+ absolute paths and the `bash` tool's `cwd` parameter throughout.
266
308
 
267
309
  **Without a subagent tool:** read code-reviewer.md and perform that review
268
310
  yourself against the package, as a separate pass after the last task's
@@ -30,6 +30,22 @@ that norms say you ask about first (a merge, a push to a shared branch, a
30
30
  publish); and a plan so broken that every path forward is a guess. For those,
31
31
  stop and ask.
32
32
 
33
+ **On omp in vibe mode** (your tools include `vibe_spawn` but not `task`)
34
+ you are the director, and this loop cannot run in your session: you have
35
+ no `task` or `bash`, and the `fast` and `good` workers are not SDD seats.
36
+ Hand the whole run to ONE `good` worker. Its brief tells it to
37
+ `read skill://subagent-driven-development` and execute `<plan>` as the
38
+ controller in `<worktree>`, and gives two rules. First, run every test,
39
+ build and script the skill calls for: the brief must say so explicitly,
40
+ because an omp 18.4.12 worker skips checks unless its assignment
41
+ explicitly instructs them. Second, when the skill says to stop and ask
42
+ your human partner, end the turn with the question. The worker has no
43
+ `todo`, so the ledger is its record. It dispatches the `sdd-*` seats
44
+ through its own `task` tool. You keep the todo list from its ledger
45
+ (`<workspace>/progress.md`), take its questions to your human partner, and
46
+ `vibe_send` the answers. The worktree and budget limits are in "Vibe mode"
47
+ in `skill://using-superpowers/references/pi-tools.md`.
48
+
33
49
  ## When to Use
34
50
 
35
51
  ```dot
@@ -128,6 +144,14 @@ superpowers:using-git-worktrees to create one or verify the existing one.
128
144
  Never start implementation on a main/master branch without your human
129
145
  partner's explicit consent.
130
146
 
147
+ **On omp, the session must be in the worktree before you dispatch.** A
148
+ subagent starts in the session's cwd (the `task` tool has no `cwd`
149
+ argument), so after `omp worktree add` every SDD subagent still works in the
150
+ ORIGINAL checkout until your human partner runs `/move <path>`. Get `/move`
151
+ first. If you cannot, put the worktree's absolute path in every dispatch and
152
+ tell the subagent to use absolute paths and the `bash` tool's `cwd`
153
+ parameter throughout.
154
+
131
155
  Conversation memory does not survive compaction. In real sessions,
132
156
  controllers that lost their place have re-dispatched entire completed task
133
157
  sequences — the single most expensive failure observed. Track progress in
@@ -138,9 +162,24 @@ a ledger file, not only in todos.
138
162
  directory (under `<repo-root>/.superpowers/sdd/`), home to
139
163
  every artifact for THIS plan: ledger, briefs, reports, review packages.
140
164
  Another plan's directory is never yours to read or write.
165
+ - **On omp, resolve the scripts directory first.** `bash scripts/<name>`
166
+ fails from the repo root ("No such file or directory"), and `omp read
167
+ skill://…` lists the files but gives no filesystem path. Once, before the
168
+ first script, run `realpath skill://subagent-driven-development/scripts` in
169
+ the `bash` tool (omp's bash resolves `skill://` URLs) and add the printed
170
+ path to the ledger, after the identity line, as `SDD scripts: <dir>`.
171
+ Ledger lines are found by their prefix, never by position: another
172
+ executor sharing this ledger (executing-plans) adds its own `… scripts:`
173
+ line, and each executor adds the one it lacks. Then run every
174
+ `bash scripts/<name>` in this skill as `bash <dir>/<name>`, with the
175
+ working directory at the repo root — the scripts call `git rev-parse`.
176
+ The invocation lines in this skill stay as upstream wrote them.
141
177
  - Check for this plan's ledger at `<workspace>/progress.md`. If its first
142
178
  line names your plan file, tasks with a `Task <N>: complete` line are DONE
143
179
  — do not re-dispatch them; resume at the first task without one. A task
180
+ whose last line is `dispatched` or `re-dispatched` is mid-implementation:
181
+ check `git log` from its BASE and read `agent://<id>` before you dispatch
182
+ anything. A task
144
183
  whose last line is a fix round is mid-loop: resume the loop at the next
145
184
  round. A ledger whose first line names a different plan file — or a stray
146
185
  ledger at the old flat path `.superpowers/sdd/progress.md` — is another
@@ -186,27 +225,59 @@ implementation.
186
225
  On omp the `task` tool has no `model:` field — the agent TYPE carries the
187
226
  model, the thinking level, and the tool set. This fork ships five SDD
188
227
  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 |
228
+ **Always dispatch SDD work with one of them.** The bundled `task` and
229
+ `reviewer` agents are the wrong seats, and not because of their model — the
230
+ SDD seats fall back to `@task` / `@slow` themselves. The SDD agents carry
231
+ what the loop depends on: a `tools:` list sized to the seat (no `task` tool,
232
+ so they cannot dispatch subagents at all), an `output:` schema the
233
+ controller reads field by field, and the report-file and status contract in
234
+ the agent's own definition. The bundled `task` agent has no tool limit,
235
+ may spawn subagents (`spawns: "*"`), has no output schema, and knows
236
+ nothing of the report file or the status line. The bundled `reviewer` has
237
+ `bash`, may spawn `scout`, and yields its own schema (`overall_correctness`,
238
+ P0-P3 `findings`) that the fix loop cannot read. (History: in a real
239
+ 157-subagent session both ran on the slowest tier over the widest tool set,
240
+ which is where most of the wall-clock went.)
241
+
242
+ | Role | `agent:` | Shipped default · thinking | Falls back to | Tools |
243
+ |---|---|---|---|---|
244
+ | Implementer (every task, fix rounds 1-2) | `sdd-implementer` | sonnet-5-5 · medium | `@task` | edit/test set, no subagents |
245
+ | Fix round 3, a BLOCKED takeover, or a ruled strongest-seat first implementation | `sdd-escalation-implementer` | opus-5-5 · **max** | `@slow` | same as implementer |
246
+ | Task reviewer | `sdd-reviewer` | sonnet-5-5 · high | `@task` | `read`, `grep`, `glob` — no edit, bash, or file-write tool (see note) |
247
+ | Scoped re-review | `sdd-rereviewer` | sonnet-5-5 · low | `@task` | `read`, `grep`; ≤4 working calls plus `yield` (a justified fifth working call is allowed) |
248
+ | Final whole-branch review | `sdd-final-reviewer` | opus-5-5 · **max** | `@slow` | read-only + focused bash |
202
249
 
203
250
  The shipped defaults are Anthropic (sonnet for the per-task seats, opus for
204
251
  the two seats that run once per plan or once per stuck task). The tiers are
205
252
  a **thinking ladder** as much as a model ladder: escalation and the final
206
- review raise reasoning to `xhigh`, re-reviews drop to `low`.
253
+ review run at `max`, re-reviews drop to `low`. This table is the one place
254
+ the shipped defaults are written down — an agent's `description:` says what
255
+ the seat does and never names a model or level, because hosts override them
256
+ and such a claim goes stale.
257
+
258
+ Every `task` item also carries a one-line `solutionSpace`: omp's wire schema
259
+ requires it (a missing one is tolerated, but the item is malformed). It says
260
+ how open the seat's problem is; each template shows one for its seat — adjust
261
+ it to the task instead of copying it blindly.
262
+
263
+ **The fallback entry.** Each agent's `model:` is an ordered list — the pin,
264
+ then a role alias — and omp takes the first entry whose provider has
265
+ credentials. Measured on omp 18.4.10 with a seat pinned to a provider that
266
+ has none: a single-entry list silently ran the seat on the *controller's*
267
+ model, while the two-entry list ran it on the host's `modelRoles.task` model
268
+ at that role's own level. So the pin wins wherever you have its credentials,
269
+ and `@task` / `@slow` (your `modelRoles.task` / `modelRoles.slow`) catch a host
270
+ that lacks them. An unset `@task` drops out of the list and the seat behaves
271
+ as a single pin; an unset `@slow` expands to omp's built-in strong-model
272
+ ranking. The list is also the seat's runtime retry chain: on a retryable
273
+ error (a rate or usage limit) omp moves to the next entry, gated by
274
+ `retry.modelFallback` (default on); it does not switch on a context overflow.
275
+ To see which model a seat actually ran on, read `resolvedModel` in its
276
+ transcript (`session_init`) or turn on `task.showResolvedModelBadge` (off by
277
+ default).
207
278
 
208
279
  **Per-host override, no file edits:** `task.agentModelOverrides` in
209
- `~/.omp/agent/config.yml` (or the `/agents` hub) beats the agent file's
280
+ `~/.omp/agent/config.yml` (or the `/agents` dashboard) beats the agent file's
210
281
  `model:` line and applies on the next dispatch. A bare model keeps the
211
282
  agent's `thinkingLevel:`; an explicit `:level` on the override replaces it.
212
283
  Example — every seat on a flat-rate model, mapped onto that model's own
@@ -222,6 +293,10 @@ task:
222
293
  sdd-final-reviewer: opencode-go/deepseek-v4.1-flash:max
223
294
  ```
224
295
 
296
+ An override replaces the agent's whole `model:` list, fallback included. To
297
+ keep a fallback, append it to the override (comma-separated):
298
+ `opencode-go/deepseek-v4.1-flash:high,@task`.
299
+
225
300
  Use the exact catalog id and only levels that model offers (`omp models ls
226
301
  <provider>`): an unsupported level is silently clamped to the nearest valid
227
302
  one, which collapses the ladder without an error. Ids get renamed across
@@ -230,39 +305,65 @@ catalog refreshes; when a seat's speed or quality shifts overnight, read
230
305
  (Discovery-only ids accept `:level` in config and overrides but not on the
231
306
  `--model` CLI flag.)
232
307
 
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.
308
+ **What the reviewers' `tools:` list enforces (measured, omp 18.4.10).** A
309
+ `tools:` list restricts built-in tools only. `sdd-reviewer` (`read`, `grep`,
310
+ `glob`) gets no `bash`, `edit`, or file-writing tool, and the device-only
311
+ `write` that omp adds to carry `xd://` devices refuses filesystem paths.
312
+ Everything else still attaches: every subagent that omp itself has not
313
+ restricted (only its internal commit-message, compression, and security
314
+ sessions are) also gets the host's extension tools and MCP tools, mounted as
315
+ `xd://` devices reached through that same `write`. A memory host's `recall`,
316
+ `retain`, and `reflect` (`memory_edit` on mnemopi) are a different case: omp
317
+ creates them for such a subagent, but activates only the tools the agent's
318
+ `tools:` list names. Measured on a hindsight host: a `read, grep, glob` seat
319
+ had no top-level `recall` and no `xd://recall` device, while a seat that
320
+ listed `recall` had it top-level (`memory_edit` takes the same path; not run).
321
+ A live probe on 18.4.10 had `sdd-reviewer`
322
+ run a shell command through `write xd://mcp__context_mode_ctx_execute`. So
323
+ "read-only" is enforced by the prompt, not by the harness: the three reviewer
324
+ agents are told never to call an `xd://` device, or an extension or MCP tool,
325
+ that executes code, writes files, or changes external state, nor a memory
326
+ tool that writes (`retain`, `memory_edit`) should one ever be present. If a
327
+ reviewer's transcript ever shows one, say so in the ledger and re-dispatch
328
+ that review.
329
+
330
+ **Turn count beats token price.** Wall-clock and context cost scale with how
331
+ many turns a subagent takes, and the cheapest models routinely take 2-3× the
332
+ turns on multi-step work — costing more overall. Keep a mid-tier model as the
333
+ floor for the reviewers and for implementers working from prose descriptions.
334
+ When a task's plan text contains the complete code to write, the
335
+ implementation is transcription plus testing, and a cheaper tier does it; so
336
+ does a single-file mechanical fix. Express any of that through
337
+ `task.agentModelOverrides`, per seat, onto the model's own ladder (above) —
338
+ never by editing an agent file. Watch the ledger: a task whose implementer
339
+ needs 100+ turns, or a re-review that wanders, is the signal to rule that
340
+ task onto the escalation seat. Re-reviews are verdict-only work over a small
341
+ diff — `low` reasoning is correct for them, not a compromise.
342
+
343
+ **Scale the task review to the diff's risk.** The reviewer seat is fixed, but
344
+ a small mechanical diff does not need the deepest reasoning and a subtle one
345
+ (concurrency, security, a data migration) does. When `task.enableEffort` is
346
+ on (it is off by default — `omp config get task.enableEffort`), dispatch the
347
+ reviewer for such a diff with `effort: "hi"`: that selects the resolved
348
+ model's top thinking level, capped by `task.maxEffort`. When it is off, ledger
349
+ the risk — `Task <N>: high-risk diff — <class>` — and name that class in the
350
+ final review dispatch.
254
351
 
255
352
  **Escalation (fix round 3):** the implementer that got stuck cannot see its
256
353
  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.
354
+ framing below. The shipped seat already runs at its model's top level, so
355
+ `effort` adds nothing to it; if a host override lowers the seat,
356
+ `effort: "hi"` (only when `task.enableEffort` is on; the accepted values are
357
+ `"lo"`, `"med"`, `"hi"`) raises it again.
260
358
 
261
359
  **Override, never omit.** If a task genuinely needs the strongest tier for
262
360
  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.
361
+ the ledger as a ruling and dispatch `sdd-escalation-implementer` for it,
362
+ telling it in the dispatch that this is a first implementation: there is no
363
+ report file yet and there are no findings, so it starts from the brief. The
364
+ default remains `sdd-implementer`. Never reach for the bundled `task`
365
+ agent for an SDD seat — it has none of the seat's tool limits, output
366
+ contract, or no-subagent rule.
266
367
 
267
368
  ## The Task Loop
268
369
 
@@ -289,6 +390,14 @@ any that finished without reporting. A bounded stretch keeps nearly
289
390
  all of a long wait's efficiency while guaranteeing a stuck or lost
290
391
  child is noticed within minutes, not at the end of the session.
291
392
 
393
+ **Reading results:** omp previews a subagent result longer than 5,000
394
+ characters head-only and marks the cut with a pointer
395
+ (`<preview full-output="agent://<id>">`). Before you act on any result that
396
+ carries that pointer, read `agent://<id>` in full — or one structured field,
397
+ `agent://<id>/<field>` (nested: `agent://<id>/findings/0/body`). The
398
+ omitted tail is where it hurts: a final review's Ledger triage, Declined to
399
+ judge, and **Mergeable:** come last.
400
+
292
401
  ### 1. Dispatch the implementer
293
402
 
294
403
  Record BASE (`git rev-parse HEAD`) before dispatching — the review package
@@ -325,39 +434,35 @@ and fix-round diffs need it.
325
434
  a pointer to that ledger entry in the dispatch.
326
435
  - Record the implementer's agent identity from the dispatch result —
327
436
  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.
437
+ - Never dispatch multiple implementation subagents in parallel (conflicts).
438
+ - **On omp, the agent id is the handle and resume is a message.** The
439
+ `<task-result id="X" …>` envelope (inline, or delivered as a notice)
440
+ reports the agent id and says the agent is now idle. Use that id exactly
441
+ as reported: omp qualifies a nested agent (`Parent.Child`), suffixes a name
442
+ that was already taken (`Name-2`), and calls a follow-up turn's job
443
+ `<id>-2` — the job id is not the agent id. Ledger the dispatch the moment
444
+ you have the id, together with BASE, so both survive compaction:
445
+ `Task <N>: dispatched (BASE <base7>, implementer <id>)`. Fix rounds 1-2
446
+ and the answer to a NEEDS_CONTEXT then go to that agent with
447
+ `write agent://<id>`.
448
+ - **The write has two success answers; only an error means "dispatch
449
+ fresh".** An idle agent is parked after `task.agentIdleTtlMs` (default
450
+ 420000 ms, 7 minutes), and a long review outlasts that. A write to a live
451
+ agent answers `Delivered to <id>.`; a write to a parked one answers
452
+ `Queued for <id> (was parked; revived).` Both are success: the parked agent
453
+ is rebuilt from its saved transcript (its live session was disposed), so its
454
+ context is back, nothing held only in the live session carries over, and its
455
+ next result arrives as a notice either way. Only an error answer (`Failed:
456
+ …`, or a write error) means dispatch a fresh `sdd-implementer`. That
457
+ dispatch gets a new id, which omp may suffix (`Name-2`) because the old id is
458
+ taken: ledger it — `Task <N>: re-dispatched (implementer <new id>)` — and use
459
+ it from then on.
460
+ - **One implementer at a time, no isolation.** On omp, SDD dispatches
461
+ implementers one at a time, in plan order, in the shared checkout, and does
462
+ not use `task.isolation.enabled`: under the default
463
+ `task.isolation.merge: patch` an isolated run's work lands as an applied but
464
+ uncommitted diff, so a review package has no commit range to cut, and an
465
+ isolated agent cannot be resumed or messaged, which fix rounds 1-2 need.
361
466
 
362
467
  Template: [implementer-prompt.md](implementer-prompt.md)
363
468
 
@@ -369,7 +474,7 @@ Implementer subagents report one of four statuses. Handle each appropriately:
369
474
 
370
475
  **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
476
 
372
- **NEEDS_CONTEXT:** The implementer needs information that wasn't provided. Provide the missing context and re-dispatch.
477
+ **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
478
 
374
479
  **BLOCKED:** The implementer cannot complete the task. Assess the blocker:
375
480
  1. If it's a context problem, provide more context and re-dispatch with the same model
@@ -377,6 +482,15 @@ Implementer subagents report one of four statuses. Handle each appropriately:
377
482
  3. If the task is too large, break it into smaller pieces
378
483
  4. If the plan itself is wrong, rule on the correction, ledger it, and re-dispatch with the ruling carried in the dispatch
379
484
 
485
+ On omp there is no model parameter, so map items 1 and 2 onto seats. "The
486
+ same model" is the same seat: `sdd-implementer`, messaged as under
487
+ NEEDS_CONTEXT, or dispatched fresh if that write errors. "A more capable
488
+ model" is `sdd-escalation-implementer`, dispatched fresh with the brief path
489
+ and the blocker. If the blocked implementer wrote a report, the report file
490
+ records what it tried, so this is a takeover: pass its path. If it wrote
491
+ none, this is a first implementation: say so in the dispatch (no report file,
492
+ no findings, start from the brief).
493
+
380
494
  **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
495
 
382
496
  If the implementer asks questions — before starting or mid-task — answer
@@ -396,8 +510,13 @@ needed.
396
510
  it prints (or, without bash: `git log --oneline`, `git diff --stat`,
397
511
  and `git diff -U10` for the range, redirected to one uniquely named
398
512
  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 —
513
+ the commit list, stat summary, and full diff with context in one file.
514
+ On omp a bare `read` returns only the first 300 lines, so the reviewer
515
+ must read it with an explicit range: `<path>:1-3000` returns up to 3,000
516
+ lines in one call, and a longer package continues with `:3001-6000`
517
+ (the open-ended `:1-` still stops at 300). The templates carry that
518
+ instruction; keep it in any dispatch you write by hand. Use the BASE you
519
+ recorded before dispatching the implementer —
401
520
  never `HEAD~1`, which silently truncates multi-commit tasks. Never
402
521
  dispatch a task reviewer without a diff file.
403
522
  - **Reviewer inputs:** the task reviewer gets three paths — the same brief
@@ -430,6 +549,23 @@ complete: you hold the plan and cross-task context the reviewer
430
549
  lacks. If you confirm an item is a real gap, treat it as a failed spec
431
550
  review — it enters the fix loop with the other findings.
432
551
 
552
+ **Check the result before you act on it.** omp 18.4.10 does not enforce
553
+ the rules between fields in a reviewer's schema — the `metadata.description`
554
+ text in an `output:` schema never reaches the model, and permissive mode
555
+ accepts an invalid result after its retries — so you do, for a task review
556
+ and a re-review alike:
557
+
558
+ - `finding_verdicts` (re-review) holds one entry per finding you
559
+ dispatched, in order.
560
+ - `all_addressed` holds no NOT_ADDRESSED entry and no new Critical/Important
561
+ entry in `new_breakage`.
562
+ - A `package_gap` is never mixed with real verdicts. A task review's two
563
+ verdicts are both `package_gap` with nothing else filled; a re-review's
564
+ `finding_verdicts` is `[]`. A result that mixes them is a malformed gap:
565
+ regenerate the package and re-dispatch — never read half of it as a
566
+ verdict.
567
+ - A result the harness reports as schema-invalid is re-dispatched, not read.
568
+
433
569
  Template: [task-reviewer-prompt.md](task-reviewer-prompt.md)
434
570
 
435
571
  ### 4. The fix loop
@@ -475,16 +611,26 @@ minutes, and converged on adjudication anyway.
475
611
 
476
612
  **Rounds 1-2 — resume the original implementer.** Send it the open findings
477
613
  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.
614
+ choices. On omp, that is a message to the idle agent — `write agent://<id>`
615
+ with the findings, using the id from the ledger's `dispatched` line exactly as
616
+ the task result reported it. `Delivered to <id>.` and `Queued for <id> (was
617
+ parked; revived).` are both resumes (see Dispatch); the agent's next result
618
+ arrives later, as a notice, like the first.
619
+ If your harness cannot send another message to a live subagent —
620
+ on omp, only if that write returns an error — dispatch a fresh
621
+ `sdd-implementer` carrying the brief path, the report-file path, and the
622
+ findings — the report file is the persistent memory either way.
481
623
 
482
624
  **Round 3 — escalate:** dispatch a fresh `sdd-escalation-implementer` with
483
625
  the brief path, the report-file path, the open findings, and this framing: "A
484
626
  prior implementer attempted this task [N] times; you own it now. Read the
485
627
  report file for what was tried." A loop that survives two resumes usually
486
628
  means the implementer cannot see its own problem — fresh eyes and a
487
- capability bump in one move.
629
+ capability bump in one move. The bump is whatever this host maps the
630
+ escalation seat to: with the shipped defaults, a stronger model at deeper
631
+ reasoning (opus-5-5 at `max` over sonnet-5-5 at `medium`); a host that maps
632
+ both seats to one model gets deeper reasoning only, and the fresh context
633
+ does the rest.
488
634
 
489
635
  **Every round, either way:** the implementer fixes, re-runs the tests
490
636
  covering the amended code, appends its fix report to the same report file,
@@ -498,12 +644,19 @@ whole suite.
498
644
  where FIX_BASE is the head the previous review saw, and dispatch
499
645
  `sdd-rereviewer` with [re-review-prompt.md](re-review-prompt.md): the
500
646
  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
647
+ has no bash, edit, or file-write tool and a four-call working budget plus its
648
+ `yield`. It yields
502
649
  `finding_verdicts[]` (ADDRESSED / NOT_ADDRESSED with file:line),
503
650
  `new_breakage[]` for the fix diff only, `out_of_scope[]`, and
504
651
  `round_verdict`. New Critical/Important entries in `new_breakage` join the
505
652
  open findings list. `out_of_scope` goes to the ledger as deferred minors —
506
- it never extends the loop.
653
+ it never extends the loop. Check the result as described under Review the
654
+ task before you act on it.
655
+
656
+ The re-reviewer cannot run tests. Where its evidence names a focused test it
657
+ would run, run that test yourself before you accept `all_addressed`; a
658
+ failing run reopens that finding as NOT_ADDRESSED and counts as an open
659
+ finding of this round.
507
660
 
508
661
  **After each round,** append to the ledger:
509
662
  `Task <N>: fix round <R>/3 (<X> addressed, <Y> open — <finding one-liners>; commits <a7>..<b7>)`
@@ -553,16 +706,22 @@ The final whole-branch review gets a package too: run
553
706
  branch started from, e.g. `git merge-base main HEAD`) and include the
554
707
  printed path in the final review dispatch, so the final reviewer reads
555
708
  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
709
+ `sdd-final-reviewer` (the deepest seat, once per plan — see Agent
710
+ Selection) with a `task` that says the plan ran subagent-driven — every
711
+ task went through its task review, except the fixes you applied yourself on
712
+ the proven-trivial route, which skipped the re-review — and names: the
713
+ package path, the plan/spec paths, and the ledger's deferred-minor and
714
+ parked-with-ruling lines verbatim, plus every `Task <N>: applied … proof:`
715
+ line (the reviewer checks those fixes as if unreviewed) and any
716
+ `high-risk diff` line (so the last review spends its depth there). Do not
717
+ paste requesting-code-review's `code-reviewer.md` into the dispatch — that
718
+ template asks a prose "Ready to merge?" and has no slot for the package or
719
+ the ledger; the agent reads that file's review rubric itself. The agent
720
+ file's `<output>` governs: findings with file:line, a `### Ledger triage`
721
+ section (each line → fix-before-merge | accept, with reason), a `### Declined
722
+ to judge` section, and a closing **Mergeable:** yes | no. Those sections come
723
+ last, so read the whole result at `agent://<id>` before you act (see Reading
724
+ results). Every "Declined to judge" line is a ruling you
566
725
  make and ledger, exactly like a plan conflict — `Final: Ruling: <behavior
567
726
  the reviewer set aside> — <what a reasonable person using this software
568
727
  gets, and why that stands or why it is now a finding> — <cost if wrong>`;
@@ -618,18 +777,20 @@ Use superpowers:finishing-a-development-branch.
618
777
  ```
619
778
  You: I'm using Subagent-Driven Development to execute this plan.
620
779
 
621
- [Setup: worktree verified]
780
+ [Setup: worktree verified; on omp, session moved into it with /move]
622
781
  [Read plan file once: docs/superpowers/plans/feature-plan.md]
623
782
  [Resolve workspace: bash scripts/sdd-workspace docs/superpowers/plans/feature-plan.md — no ledger inside, fresh start]
783
+ [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
784
  [Create todos for all tasks]
625
785
 
626
786
  Task 1: Hook installation script
627
787
 
628
788
  [Run task-brief for Task 1; dispatch implementer with brief + report paths + context]
789
+ [Ledger: Task 1: dispatched (BASE a1b2c3d, implementer Impl1)]
629
790
 
630
791
  Implementer: "Before I begin - should the hook be installed at user or system level?"
631
792
 
632
- You: "User level (~/.config/superpowers/hooks/)"
793
+ You: [write agent://Impl1] "User level (~/.config/superpowers/hooks/)"
633
794
 
634
795
  Implementer: [Later]
635
796
  - Implemented install-hook command
@@ -646,6 +807,7 @@ sdd-reviewer: spec_compliance: compliant · task_quality: approved
646
807
  Task 2: Recovery modes
647
808
 
648
809
  [Run task-brief for Task 2; dispatch implementer with brief + report paths + context]
810
+ [Ledger: Task 2: dispatched (BASE d4e5f6a, implementer Impl2)]
649
811
 
650
812
  Implementer: [No questions]
651
813
  - Added verify/repair modes
@@ -657,7 +819,7 @@ sdd-reviewer: spec_compliance: issues · task_quality: needs_fixes
657
819
  spec_issues: ["Missing: progress reporting (spec says 'report every 100 items')"]
658
820
  findings: [{severity: Important, location: src/recovery.js:7, body: "Magic number (100)"}]
659
821
 
660
- [Fix round 1: resume the implementer with both findings]
822
+ [Fix round 1: write agent://Impl2 with both findings]
661
823
  Implementer: Added progress reporting, extracted PROGRESS_INTERVAL constant.
662
824
  Re-ran test/recovery.test.js — 10/10 passing. Fix report appended.
663
825
 
@@ -674,7 +836,8 @@ sdd-rereviewer: round_verdict: all_addressed
674
836
 
675
837
  [After all tasks]
676
838
  [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.
839
+ [Read the full result at agent://<id>]
840
+ sdd-final-reviewer: Ledger triage: deferred minors — none block merge. **Mergeable:** yes
678
841
 
679
842
  [Delete this plan's workspace — the record now lives in git]
680
843