@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.
- package/.pi/extensions/superpowers.ts +18 -6
- package/CHANGELOG.md +44 -2
- package/README.md +41 -28
- package/agents/sdd-escalation-implementer.md +18 -6
- package/agents/sdd-final-reviewer.md +15 -6
- 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 +49 -7
- package/skills/subagent-driven-development/SKILL.md +261 -98
- 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 +18 -9
- package/skills/using-superpowers/references/pi-tools.md +50 -12
- package/skills/writing-plans/SKILL.md +2 -0
|
@@ -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
|
|
260
|
-
|
|
261
|
-
agent to: opus-5 ·
|
|
262
|
-
`task.agentModelOverrides`. Its result has
|
|
263
|
-
`### Ledger triage` over the `Ruling:` lines you
|
|
264
|
-
fix-before-merge is a finding like any other), a
|
|
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`
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
|
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`
|
|
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
|
|
234
|
-
|
|
235
|
-
`
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
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.
|
|
258
|
-
|
|
259
|
-
|
|
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
|
|
265
|
-
|
|
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
|
-
-
|
|
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.
|
|
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
|
|
400
|
-
|
|
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.
|
|
479
|
-
|
|
480
|
-
|
|
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
|
|
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` (
|
|
557
|
-
Selection) with a `task` that says the plan ran subagent-driven
|
|
558
|
-
task
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
|