opencode-thrum-pro 0.1.4 → 0.1.6

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.
Files changed (69) hide show
  1. package/assets/commands/thrum-_compact-runtime-commands.md +61 -0
  2. package/assets/commands/thrum-_snapshot-protocol.md +17 -6
  3. package/assets/commands/thrum-_stamp-protocol.md +9 -2
  4. package/assets/commands/thrum-compact-extended.md +352 -0
  5. package/assets/commands/thrum-compact.md +300 -0
  6. package/assets/commands/thrum-inbox.md +1 -1
  7. package/assets/commands/thrum-restart-extended.md +84 -11
  8. package/assets/commands/thrum-restart.md +105 -13
  9. package/assets/commands/thrum-send.md +4 -1
  10. package/assets/commands/thrum-sleep-extended.md +67 -46
  11. package/assets/commands/thrum-sleep.md +67 -58
  12. package/assets/skills/adversarial-critique/SKILL.md +5 -8
  13. package/assets/skills/agent-messaging-protocol/SKILL.md +35 -0
  14. package/assets/skills/brainstorm-steward/SKILL.md +65 -11
  15. package/assets/skills/brainstormer-staying-current/SKILL.md +113 -0
  16. package/assets/skills/choosing-subagent-models/SKILL.md +14 -0
  17. package/assets/skills/conversation-only-context/SKILL.md +11 -11
  18. package/assets/skills/conversation-only-context/resources/driver-subagent-pattern.md +1 -1
  19. package/assets/skills/conversation-only-context/resources/remote-environment-scenarios.md +1 -1
  20. package/assets/skills/coordinator-assessing-agent-completion/SKILL.md +98 -6
  21. package/assets/skills/coordinator-context-monitoring/SKILL.md +29 -19
  22. package/assets/skills/coordinator-deploying-a-node/SKILL.md +124 -0
  23. package/assets/skills/coordinator-dispatching-work/SKILL.md +24 -11
  24. package/assets/skills/coordinator-hotpath-merge-gate/SKILL.md +62 -20
  25. package/assets/skills/coordinator-managing-state-and-lifecycle/SKILL.md +6 -6
  26. package/assets/skills/coordinator-merging-code/SKILL.md +25 -11
  27. package/assets/skills/coordinator-philosophy-merge-gate/SKILL.md +28 -7
  28. package/assets/skills/coordinator-plan-reconcile-gate/SKILL.md +3 -3
  29. package/assets/skills/coordinator-rolling-out-to-nodes/SKILL.md +92 -0
  30. package/assets/skills/coordinator-running-autonomous-feature-development/SKILL.md +3 -3
  31. package/assets/skills/coordinator-running-brainstorm-cycles/SKILL.md +58 -71
  32. package/assets/skills/coordinator-running-review-cycles/SKILL.md +15 -4
  33. package/assets/skills/diagnosing-fleet-and-daemon/SKILL.md +0 -2
  34. package/assets/skills/efficient-multi-agent-research/SKILL.md +6 -7
  35. package/assets/skills/implementer-orchestrating-execution/SKILL.md +11 -14
  36. package/assets/skills/orchestrate/SKILL.md +47 -35
  37. package/assets/skills/persistent-watcher-archetype/SKILL.md +188 -37
  38. package/assets/skills/persistent-watcher-archetype/resources/capture_archive.py +618 -0
  39. package/assets/skills/persistent-watcher-archetype/resources/jev_watcher_filter.py +837 -0
  40. package/assets/skills/persistent-watcher-archetype/resources/roster-watch.sh +1140 -0
  41. package/assets/skills/persistent-watcher-archetype/resources/roster-watch_test.sh +291 -0
  42. package/assets/skills/persistent-watcher-archetype/resources/thrum-capture-fallback.sh +2 -2
  43. package/assets/skills/persistent-watcher-archetype/resources/thrum-watch-pane-capture.sh +20 -8
  44. package/assets/skills/prime-agent/SKILL.md +10 -0
  45. package/assets/skills/project-setup/SKILL.md +22 -16
  46. package/assets/skills/project-setup/resources/implementation-agent.md +56 -35
  47. package/assets/skills/researcher-investigating/SKILL.md +2 -5
  48. package/assets/skills/state-migration/SKILL.md +1 -1
  49. package/assets/skills/thrum/SKILL.md +14 -7
  50. package/assets/skills/thrum/resources/ANTI_PATTERNS.md +16 -18
  51. package/assets/skills/thrum/resources/CLI_REFERENCE.md +17 -11
  52. package/assets/skills/thrum/resources/LISTENER_PATTERN.md +9 -3
  53. package/assets/skills/thrum/resources/MESSAGING.md +18 -11
  54. package/assets/skills/thrum/resources/WORKTREES.md +1 -1
  55. package/assets/skills/thrum-memory/SKILL.md +1 -1
  56. package/assets/skills/trace-spec-to-plan/resources/sweep-agent-prompt.md +1 -1
  57. package/assets/skills/update-queue/SKILL.md +6 -8
  58. package/assets/skills/using-the-dashboard/SKILL.md +30 -0
  59. package/assets/skills/using-the-queue/SKILL.md +76 -5
  60. package/assets/skills/using-thrum-state/SKILL.md +84 -1
  61. package/assets/skills/verify-against-plan/SKILL.md +120 -5
  62. package/assets/skills/watcher-archetype/SKILL.md +18 -0
  63. package/assets/skills/writing-durable-markdown/SKILL.md +5 -0
  64. package/dist/installer.js +4 -4
  65. package/dist/permission-fixture.integration.test.js +4 -4
  66. package/package.json +1 -1
  67. package/assets/skills/coordinator-deploying-the-fleet/SKILL.md +0 -396
  68. package/dist/allowlist-sync.test.d.ts +0 -1
  69. package/dist/allowlist-sync.test.js +0 -44
@@ -40,25 +40,23 @@ at every stage:
40
40
  the impl prompt** → 8. Hand off to coord for implementer dispatch.
41
41
 
42
42
  **Three explicit review gates** at stages 3, 6, and 7 — same dual-axis pattern
43
- each time (`verify-against-source` + a prose-quality reviewer, sonnet sub-agents
43
+ each time (`verify-against-source` + a prose-quality reviewer, sub-agents (model per `choosing-subagent-models`)
44
44
  in parallel — see "Review-loop mechanics" below). Skipping any review gate is a
45
45
  documented anti-pattern. The brainstorm review catches design issues; the plan
46
- review catches contract-drift and quality issues `writing-plans`' internal
47
- reviewer misses; the prompt review catches plan→prompt translation errors before
48
- the implementer executes against them.
46
+ review is the SOLE quality gate on the plan doc — the researcher authors the
47
+ plan directly (no external tool with its own internal reviewer sits upstream of
48
+ this gate); the prompt review catches plan→prompt translation errors before the
49
+ implementer executes against them.
49
50
 
50
51
  ## Subagent model selection
51
52
 
52
- > **Model tiers:** pass an explicit `model:` on every dispatch — `sonnet`
53
- > (low effort) mechanical, `sonnet` (medium effort) judgment, Opus only on
54
- > operator-ask or a skill step that names it. See the
55
- > `choosing-subagent-models` skill for the full policy.
53
+ > **Model tiers:** pass an explicit `model:` on every dispatch; choose model and effort per the `choosing-subagent-models` skill (read `runtime.role_models` at the moment of use). Never let a sub-agent inherit your own model.
56
54
 
57
55
  ### Prefer `efficient-multi-agent-research` for multi-part research
58
56
 
59
57
  When a research or investigation task has independent parts, reach for the
60
58
  `efficient-multi-agent-research` skill FIRST — it partitions the work across
61
- many cheap parallel subagents (sonnet-low gatherers, sonnet-medium synthesizers) instead of
59
+ many cheap parallel subagents (cheap gatherers, judgment-tier synthesizers) instead of
62
60
  one expensive serial subagent. It is the preferred research path: cheaper,
63
61
  faster, and it keeps each subagent's context tight.
64
62
 
@@ -72,16 +70,16 @@ names only its stage-specific source.
72
70
  | Axis | Reviewer | Notes |
73
71
  | --------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
74
72
  | **Conformance** | `verify-against-source` (thrum-owned skill) | Does the artifact honor its INPUT(s)? Replaces `verify-against-plan` at prose gates — `verify-against-plan` BAILS without a code diff + a File-Structure table, so it cannot run on a brainstorm/plan/prompt. `verify-against-source` accepts a prose artifact + source doc with neither. |
75
- | **Quality** | general-purpose sonnet + prose-quality rubric (PRIMARY) ∥ `superpowers:requesting-code-review` (SUPPLEMENTARY) | The general-purpose prose-quality pass (internal consistency, gaps, contradiction, ambiguity, scope creep) is AUTHORITATIVE. `requesting-code-review` runs on a DIFF, so point it at the artifact's own commit range (`HEAD~1..HEAD`) — gated on the skill being resolvable; skip gracefully if absent. ⚠️ **That is the diff of the `.md` file, NOT a diff against the production code the artifact describes** — this row does NOT cover the code axis. Prose-vs-code is Conformance's job (see `verify-against-source` § "Second comparison unit"). |
73
+ | **Quality** | general-purpose sub-agent (model per `choosing-subagent-models`) + prose-quality rubric (PRIMARY) ∥ `superpowers:requesting-code-review` (SUPPLEMENTARY) | The general-purpose prose-quality pass (internal consistency, gaps, contradiction, ambiguity, scope creep) is AUTHORITATIVE. `requesting-code-review` runs on a DIFF, so point it at the artifact's own commit range (`HEAD~1..HEAD`) — gated on the skill being resolvable; skip gracefully if absent. ⚠️ **That is the diff of the `.md` file, NOT a diff against the production code the artifact describes** — this row does NOT cover the code axis. Prose-vs-code is Conformance's job (see `verify-against-source` § "Second comparison unit"). |
76
74
 
77
- Both are `general-purpose`, `model: "sonnet"`, `run_in_background: true`. Wait
75
+ Both are `general-purpose`, `model: <per choosing-subagent-models>`, `run_in_background: true`. Wait
78
76
  for BOTH before consolidating. Verify each BLOCKING against source before
79
77
  forwarding.
80
78
 
81
79
  ### Footer → commit → stamp (per stage)
82
80
 
83
81
  1. After the artifact is written, append the gate footer:
84
- `<!-- THRUM-GATE: stage=<brainstorm|plan|prompt> next=<dual-review|writing-plans|project-setup|dispatch> -->`
82
+ `<!-- THRUM-GATE: stage=<brainstorm|plan|prompt> next=<dual-review|plan|project-setup|dispatch> -->`
85
83
  2. **Commit the artifact (WIP) including the footer** — this gives the
86
84
  supplementary `requesting-code-review` pass a real `HEAD~1..HEAD` range.
87
85
  3. Run the dual review against that range; each fix cycle commits its changes
@@ -120,7 +118,7 @@ forwarding.
120
118
 
121
119
  ### Soft pre-flight greps (the SOFT enforcement tier)
122
120
 
123
- Before invoking `writing-plans` (Phase 6) and before `project-setup` (Phase 7),
121
+ Before writing the plan (Phase 6) and before `project-setup` (Phase 7),
124
122
  grep the prior artifact for `THRUM-REVIEW: stage=<S> verdict=Ready:Yes` (or
125
123
  `verdict=OVERRIDE`); absent → STOP and run the review first. Anchor the match —
126
124
  `grep -E '...verdict=Ready:Yes([[:space:]]|-->|$)'`, never `grep -F` — or an
@@ -150,32 +148,22 @@ structurally-enforceable gate is `project-setup` Phase 0 (it hard-bails).
150
148
  `## Deviations from Source` block with attribution `owner decision`, never
151
149
  silently absorbed.
152
150
 
153
- ### Superpowers dependency (D6)
151
+ ### No external plugin drives this pipeline (D6)
154
152
 
155
- The wrapper drives `superpowers:brainstorming` / `writing-plans`. Two distinct
156
- pre-flight behaviors:
153
+ Neither the brainstorm stage (Phase 2) nor the plan stage (Phase 6) invokes an
154
+ external skill — the researcher writes both artifacts directly, governed by
155
+ this skill's own protocol block (Phase 2) and structure/stamp/deviations
156
+ requirements (Phase 6). There is nothing to pre-flight-check or bail on for
157
+ either stage, and no `/plugin install` path: no such plugin is declared
158
+ anywhere in this repo's `.claude-plugin/marketplace.json`.
157
159
 
158
- - `requesting-code-review` not resolvable → SKIP the supplementary quality pass
159
- gracefully (the loop still runs on the general-purpose primary).
160
- - `brainstorming` / `writing-plans` not present → **BAIL** with an install
161
- instruction (`/plugin install superpowers@<marketplace>`).
160
+ The one genuinely optional external supplement is `requesting-code-review`
161
+ (Review-loop mechanics, "Quality" row) — not resolvable → SKIP the
162
+ supplementary quality pass gracefully; the loop still runs on the
163
+ general-purpose primary, which is authoritative regardless.
162
164
 
163
- `verify-against-source` carries no superpowers dependency and always works.
164
-
165
- ### Countermand the superpowers chain (outcome-based)
166
-
167
- `brainstorming` auto-chains to `writing-plans`, and `writing-plans` defaults
168
- pull toward subagent-driven execution — both bypass thrum's `project-setup`. At
169
- each invocation, inject (keyed on the concept, so it survives upstream
170
- rewording):
171
-
172
- > Regardless of any execution-handoff, "recommended" sub-skill, or save-location
173
- > default these skills emit, the ONLY downstream path in thrum is the next thrum
174
- > stage. After the artifact is written, STOP — do not auto-chain. Save to the
175
- > thrum path, not the superpowers default. For `writing-plans`: remove/replace
176
- > the plan-header line matching the stable substring
177
- > `REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development` and ignore
178
- > the Execution-Handoff offer — the plan feeds `project-setup`.
165
+ `verify-against-source` and the general-purpose prose-quality pass carry no
166
+ external-plugin dependency and always work.
179
167
 
180
168
  ## Phase 1 — Set up the worktree, branch, and agent
181
169
 
@@ -235,7 +223,7 @@ noise — start fresh.
235
223
 
236
224
  | Topic shape | Base branch |
237
225
  | ------------------------------------------------------------------------------------ | ----------------------------------------------------- |
238
- | Bug fix, hardening, infra cleanup belonging to the current line | The configured merge target — `jq -r '.orchestration.merge_target' .thrum/config.json` |
226
+ | Bug fix, hardening, infra cleanup belonging to the current line | The configured merge target — `CONFIG=.thrum/config.json; [ -f .thrum/redirect ] && CONFIG="$(cat .thrum/redirect)/config.json"; jq -r '.orchestration.merge_target' "$CONFIG"` (a worktree's `.thrum/` holds only a `redirect` file, not its own `config.json`) |
239
227
  | Work belonging to a multi-epic version program | The version's long-lived branch |
240
228
  | Work tied to an existing feature epic with its own long-lived branch | That branch |
241
229
 
@@ -353,12 +341,10 @@ distinction in the inbox display):
353
341
  8. **Go-deep-then-ready instruction** — one sentence telling them to confirm
354
342
  readiness, research aggressively, and have meaty material ready when the user
355
343
  joins (not to sit idle waiting).
356
- 9. **Countermand callout** — `superpowers:brainstorming`'s terminal state is
357
- "invoke writing-plans". Tell the researcher explicitly: when brainstorming
358
- reaches that terminal state, STOP at the design doc — do NOT auto-chain to
359
- `writing-plans`. The brainstorm goes through the Phase 3 review gate first,
360
- then Phase 6 runs `writing-plans` deliberately (with its own countermand).
361
- See "Review-loop mechanics → Countermand the superpowers chain."
344
+ 9. **Stop-at-the-artifact instruction** — tell the researcher explicitly: once
345
+ the brainstorm design doc is drafted, STOP there. It goes through the
346
+ Phase 3 review gate before anything else happens; the plan doc is a
347
+ separate, deliberate Phase 6 step after the brainstorm is LOCKED.
362
348
 
363
349
  Send the whole thing as one `thrum send` call. The recipient's runtime will
364
350
  display it as a single inbox message; structure beats brevity here.
@@ -408,7 +394,7 @@ When the researcher reports the brainstorm is ready for review, run the
408
394
  SUPPLEMENTARY (internal consistency, technical soundness, anti-patterns,
409
395
  gaps).
410
396
 
411
- Both `general-purpose`, `model: "sonnet"`, `run_in_background: true`. **Have the
397
+ Both `general-purpose`, `model: <per choosing-subagent-models>`, `run_in_background: true`. **Have the
412
398
  researcher append the gate footer and commit (in their own worktree) BEFORE you
413
399
  spawn the dual-review sub-agents** — the brainstorm lives in the researcher's
414
400
  branch, and the supplementary `requesting-code-review` pass needs a real
@@ -433,7 +419,7 @@ confidence about what's already correct and prevents over-editing.
433
419
 
434
420
  When the researcher reports their fixes are done:
435
421
 
436
- - Run a **targeted verification sub-agent** (one sub-agent, sonnet) that reads
422
+ - Run a **targeted verification sub-agent** (one sub-agent, model per `choosing-subagent-models`) that reads
437
423
  the updated doc and confirms each prescribed fix landed correctly. Do NOT
438
424
  re-derive the original findings — that's done.
439
425
  - For tiny cosmetic fixes (one-line format updates, missing citations), ask
@@ -451,10 +437,10 @@ to merge" with stand-down instructions.
451
437
  ## Phase 5 — Overarching coherence pass (when sibling brainstorms close)
452
438
 
453
439
  If the topic is part of a larger program with multiple parallel brainstorms,
454
- once **all sibling brainstorms reach ready-to-merge**, fire an opus-tier
455
- coherence + implementability pass over the corpus before specs are written.
440
+ once **all sibling brainstorms reach ready-to-merge**, fire a deep-review
441
+ (model per `choosing-subagent-models`) coherence + implementability pass over the corpus before specs are written.
456
442
 
457
- Two parallel passes (background, opus model — escalate from sonnet because this
443
+ Two parallel passes (background, a deeper tier per `choosing-subagent-models` — escalate because this
458
444
  is genuinely cross-cutting reasoning over a large corpus):
459
445
 
460
446
  | Pass | Focus |
@@ -475,23 +461,21 @@ expensive footguns hide.
475
461
  ## Phase 6 — Researcher writes the plan (with dual-review gate)
476
462
 
477
463
  Once the brainstorm is LOCKED (and any companion design spec is LOCKED), the
478
- researcher runs `superpowers:writing-plans` to convert brainstorm + spec into
479
- the implementation plan doc. (First, the soft pre-flight grep: `grep -F` the
480
- brainstorm for its `THRUM-REVIEW: stage=brainstorm verdict=Ready:Yes` (or
481
- `OVERRIDE`) stamp — absent → STOP and finish the brainstorm review.) **Inject
482
- the outcome-based countermand** (see Review-loop mechanics) at the
483
- `writing-plans` invocation: stop when the plan is written, save to the thrum
484
- path, and strip the `subagent-driven-development` plan-header line — the plan
485
- feeds `project-setup`, not superpowers execution.
464
+ researcher writes the implementation plan doc directly, converting the
465
+ brainstorm + spec into concrete steps. (First, the soft pre-flight grep:
466
+ `grep -F` the brainstorm for its `THRUM-REVIEW: stage=brainstorm
467
+ verdict=Ready:Yes` (or `OVERRIDE`) stamp — absent → STOP and finish the
468
+ brainstorm review.) The plan feeds `project-setup` — there is no other
469
+ downstream path.
486
470
 
487
471
  **The plan doc gets the SAME dual-review treatment as the brainstorm.** This
488
- review step is mandatory — `writing-plans` has an internal reviewer, but real-
489
- world experience shows that's not sufficient. Independent review catches
490
- contract-drift and quality issues the internal reviewer misses.
472
+ review step is mandatory: there is no internal reviewer upstream of it, so
473
+ this gate is the plan's only quality check. Independent review catches
474
+ contract-drift and quality issues a single author would miss.
491
475
 
492
476
  **The researcher (not coord) dispatches the dual-review** in their own worktree:
493
477
 
494
- 1. Researcher writes plan v1 via `writing-plans` skill (countermand applied).
478
+ 1. Researcher writes plan v1 directly.
495
479
  2. Researcher authors the `## Deviations from Source` block per
496
480
  `claude-plugin/commands/_deviations-protocol.md`, diffing plan v1 against
497
481
  the brainstorm + design spec — BEFORE dual-review, so
@@ -573,9 +557,8 @@ review catches translation errors (plan → prompt) plus prompt-specific quality
573
557
  4. Researcher signals "project-setup complete + post-setup dual-review applied"
574
558
  back to coord, citing both review passes + final artifact paths.
575
559
 
576
- Reaffirmation (countermand at the prompt stage): `project-setup` is the only
577
- downstream path — do not adopt `subagent-driven-development` execution even if a
578
- superpowers skill suggests it.
560
+ Reaffirmation (at the prompt stage): `project-setup` is the only downstream
561
+ path for the implementer prompt.
579
562
 
580
563
  If the researcher signals "project-setup complete" WITHOUT mentioning the
581
564
  post-setup reviews, ASK explicitly: "did the post-setup dual-review run on the
@@ -607,9 +590,9 @@ encodes this; include the verbatim protocol block in every briefing.
607
590
  ❌ **Half-batched findings.** Sending review findings before BOTH dual reviews
608
591
  complete. Researcher fixes batch 1 and never sees batch 2.
609
592
 
610
- ❌ **Skipping the post-plan dual-review.** Treating `writing-plans` skill's
611
- internal reviewer as sufficient and proceeding directly to `project-setup`
612
- without an independent review of the plan doc. The plan and the impl
593
+ ❌ **Skipping the post-plan dual-review.** Proceeding directly to
594
+ `project-setup` without an independent review of the plan doc — there is no
595
+ internal reviewer upstream of it to lean on. The plan and the impl
613
596
  prompt MUST get the same dual-axis review treatment the brainstorm gets — Phase
614
597
  6 + Phase 7 explicit.
615
598
 
@@ -623,10 +606,14 @@ review it before dispatch.
623
606
  misread cited code or stretch citations. Spot-verify any BLOCKING that names a
624
607
  specific file/line/symbol before forwarding.
625
608
 
626
- ❌ **`thrum message read --all` mid-brainstorm.** Classic timing bomb: read
627
- message A → message B arrives during the read → `--all` silently marks B read →
628
- B is never seen. Use `thrum message read <id> [<id>...]` with specific IDs
629
- instead, especially when juggling multiple researchers.
609
+ ❌ **`thrum message read --all --force` mid-brainstorm without checking the
610
+ report.** `--all` alone is a dry run (marks nothing); `--force` only drains
611
+ what THAT dry-run listing named, and reports any later arrival as excluded
612
+ rather than silently sweeping it in — so the old "B arrives
613
+ mid-read and gets silently marked" timing bomb no longer applies. Still
614
+ prefer `thrum message read <id> [<id>...]` with specific IDs when juggling
615
+ multiple researchers — it's simpler to reason about than tracking a listing's
616
+ 10-minute validity window.
630
617
 
631
618
  ❌ **Sub-agents into the researcher's worktree.**
632
619
  For code research in the brainstorm worktree, ask the researcher; for broader
@@ -635,7 +622,7 @@ the worktree path.
635
622
 
636
623
  ❌ **Skipping the coherence pass.** When ≥ 3 sibling brainstorms close in the
637
624
  same program, integration-layer issues that no single review can see are
638
- virtually guaranteed. Fire the opus pass; it's worth the cost.
625
+ virtually guaranteed. Fire the deep-review pass; it's worth the cost.
639
626
 
640
627
  ❌ **Renaming brainstorm researchers between topics.** Identity is bound to the
641
628
  worktree. If a topic is done, kill the tmux session and tear down the worktree;
@@ -17,10 +17,7 @@ they're independent reads of the same diff.
17
17
  reviewers as parallel sub-agents in the same message. Pass each a clear scope
18
18
  ("review the diff at <BASE>...<HEAD> for <criteria>").
19
19
 
20
- > **Model tiers:** pass an explicit `model:` on every dispatch — `sonnet`
21
- > (low effort) mechanical, `sonnet` (medium effort) judgment, Opus only on
22
- > operator-ask or a skill step that names it. See the
23
- > `choosing-subagent-models` skill for the full policy.
20
+ > **Model tiers:** pass an explicit `model:` on every dispatch; choose model and effort per the `choosing-subagent-models` skill (read `runtime.role_models` at the moment of use). Never let a sub-agent inherit your own model.
24
21
 
25
22
  ## Wait for both reviewers before sending anything to the implementer
26
23
 
@@ -48,6 +45,20 @@ one.
48
45
  when re-reviewing fixes, refer to "finding #4" and the implementer can locate
49
46
  it instantly.
50
47
 
48
+ **Route mechanical bookkeeping findings to the gate, not the implementer.** If a
49
+ consolidated finding is itself mechanical bookkeeping of the kind the gate is
50
+ authorized to self-fix (see `coordinator-merging-code`: census/shard regen, line-
51
+ number or key refreshes, ledger totals/ceilings, per-entry waivers or citations
52
+ recording a classification already established elsewhere — never a new safety
53
+ judgment of your own — nosec baseline hashes, comment wording, stale test
54
+ expectations that merely follow a landed change), do not route it to the
55
+ implementer as a normal finding. Dual review runs BEFORE the Pass-3 gate, so at
56
+ this point there is no gate run yet to fix it: tag the finding as
57
+ gate-deferred-bookkeeping in the consolidated list and carry it forward — the
58
+ gate self-fixes it (a `GATE-AUTHORED` commit plus a narrow re-run of only the
59
+ affected checks) when it runs Pass-3 on this branch. Reserve immediate
60
+ implementer round-trips for real defects and design judgment calls.
61
+
51
62
  ## Verify reviewer claims against actual code before forwarding
52
63
 
53
64
  **Why:** Reviewers reading a large diff sometimes cite wrong line numbers or
@@ -195,8 +195,6 @@ hypothesis confirmed.**
195
195
  | Line | Meaning |
196
196
  |---|---|
197
197
  | `sync.apply: M1 relay loop detected … dropped` | Working as designed — loop suppression. |
198
- | `storagegw: gossip: peer … not connected` | Peer offline. Routine. |
199
- | `storagegw: gossip: peer call failed … caller-peer lacks required capability` | **NOT routine** — a live capability gap. Worth a bead if sustained. |
200
198
  | `dead_agent_sweeper: marked dead agent offline` | Routine sweeper work. |
201
199
 
202
200
  ---
@@ -15,10 +15,9 @@ single report.
15
15
  **Core principle:** The coordinator decides, sub-agents investigate. Keep
16
16
  investigation results out of the main context until consolidated.
17
17
 
18
- **REQUIRED BACKGROUND:** Read superpowers:dispatching-parallel-agents before
19
- using this skill. That skill
20
- covers general parallel dispatch. This skill extends it with a specific research
21
- workflow: partition, investigate to disk, consolidate, then decide.
18
+ This skill is self-contained: partition, investigate to disk, consolidate,
19
+ then decide — the full dispatch mechanics (Agent tool syntax, background mode,
20
+ read-only scoping) are in "Core Pattern" below.
22
21
 
23
22
  ## When to Use
24
23
 
@@ -96,13 +95,13 @@ See the `choosing-subagent-models` skill for the full policy. Applied to this
96
95
  skill's fan-out:
97
96
 
98
97
  - **Level 1 — researchers / gatherers:** scope each one DOWN to a narrow slice
99
- so you can run MANY in parallel. Use `model: "sonnet"` (low effort) —
98
+ so you can run MANY in parallel. Use `model: <per choosing-subagent-models>` (cheapest tier) —
100
99
  bounded gather-and-report. Smaller scope = cheaper, concurrent (faster),
101
100
  tighter per-agent context.
102
- - **Level 2 / Level 3 — summarizers / synthesizers:** use `model: "sonnet"` —
101
+ - **Level 2 / Level 3 — summarizers / synthesizers:** use `model: <per choosing-subagent-models>` —
103
102
  aggregating and reconciling Level-1 outputs is judgment work.
104
103
 
105
- Prefer many narrow sonnet-low gatherers over one broad subagent. This is the cheap,
104
+ Prefer many narrow cheap gatherers over one broad subagent. This is the cheap,
106
105
  fast default — equivalent parallelism at a fraction of the token cost.
107
106
 
108
107
  ## Common Mistakes
@@ -6,7 +6,7 @@ description: "Use when starting execution of a scoped implementation task — ab
6
6
  # Implementer: Orchestrating Execution
7
7
 
8
8
  You implement by **orchestrating sub-agents**, not by doing research, edits, and
9
- verification yourself. Your Opus context is for judgment — synthesizing
9
+ verification yourself. Your own context is for judgment — synthesizing
10
10
  research, targeting edits, judging verification against the plan. The legwork
11
11
  goes to cheaper sub-agents. This skill is the procedure; invoke it at the start
12
12
  of executing any scoped task.
@@ -27,10 +27,7 @@ The size bound (~15 lines / 2 files) is the project default; a project-local
27
27
 
28
28
  ## Subagent model selection
29
29
 
30
- > **Model tiers:** pass an explicit `model:` on every dispatch — `sonnet`
31
- > (low effort) mechanical, `sonnet` (medium effort) judgment, Opus only on
32
- > operator-ask or a skill step that names it. See the
33
- > `choosing-subagent-models` skill for the full policy.
30
+ > **Model tiers:** pass an explicit `model:` on every dispatch; choose model and effort per the `choosing-subagent-models` skill (read `runtime.role_models` at the moment of use). Never let a sub-agent inherit your own model.
34
31
 
35
32
  ## Step 1 — Dispatch research
36
33
 
@@ -44,13 +41,13 @@ you do not read the code into your own context. Label the dispatch
44
41
  From the report, decide exactly what changes where, then dispatch
45
42
  general-purpose sub-agent(s) to make the edits. Give each the bd task ID, the
46
43
  exact files, the acceptance criteria, and the relevant slice of the report.
47
- Model: `sonnet`; use `sonnet` (low effort) for purely mechanical edits
44
+ Model: per `choosing-subagent-models`; use the cheapest tier for purely mechanical edits
48
45
  (find/replace, rename). Label `description="implement: <what>"`. Parallelize independent
49
46
  edit-targets; serialize edits to shared files.
50
47
 
51
48
  ## Step 3 — Dispatch verification
52
49
 
53
- Spawn a `sonnet` verifier against **the plan the implementation sub-agent was
50
+ Spawn a verifier sub-agent (model per `choosing-subagent-models`) against **the plan the implementation sub-agent was
54
51
  given** — does the diff satisfy the acceptance criteria and honor the plan?
55
52
  Label `description="verify: <what>"`. (For the full code-quality +
56
53
  spec-compliance review at DONE, `implementer-tdd-and-quality` and the
@@ -89,12 +86,12 @@ hard size bound.
89
86
 
90
87
  | Dispatch | Model |
91
88
  | ------------------ | -------------------------------------------------- |
92
- | research / explore | `sonnet` (or the `Explore` agent type) |
93
- | implementation | `sonnet`; `sonnet` (low effort) for purely mechanical edits |
94
- | verification | `sonnet` |
89
+ | research / explore | per `choosing-subagent-models` (or the `Explore` agent type) |
90
+ | implementation | per `choosing-subagent-models`; cheapest tier for purely mechanical edits |
91
+ | verification | per `choosing-subagent-models` |
95
92
 
96
- Use the bare `sonnet` alias (resolves to the current Sonnet); do not hard-pin a
97
- version id. Never let a sub-agent inherit the parent (Opus) model.
93
+ Use the bare alias from `runtime.role_models`; do not hard-pin a version id.
94
+ Never let a sub-agent inherit the parent model.
98
95
 
99
96
  ## Sub-agent label convention (required)
100
97
 
@@ -105,8 +102,8 @@ delegation shape from these labels.
105
102
  ## Anti-patterns
106
103
 
107
104
  ❌ **Inline Worker** — does the research and edits itself instead of
108
- dispatching. Your Opus context is for orchestration judgment, not hand-typing
109
- edits a Sonnet sub-agent should make.
105
+ dispatching. Your own context is for orchestration judgment, not hand-typing
106
+ edits a sub-agent should make.
110
107
 
111
108
  ❌ **Over-orchestrator** — dispatches a sub-agent for a known one-line change,
112
109
  paying more in prompt-composition than the edit costs. The Step-0 scoping gate
@@ -53,8 +53,11 @@ grep "## Review Gate:" <prompt-file-path>
53
53
  # 4. Dependencies configured
54
54
  bd dep tree <epic-id>
55
55
 
56
- # 5. Merge target in config
57
- cat .thrum/config.json | grep merge_target
56
+ # 5. Merge target in config (resolve through .thrum/redirect when present --
57
+ # a worktree's .thrum/ holds only a `redirect` file, not its own config.json)
58
+ CONFIG=.thrum/config.json
59
+ [ -f .thrum/redirect ] && CONFIG="$(cat .thrum/redirect)/config.json"
60
+ cat "$CONFIG" | grep merge_target
58
61
  ```
59
62
 
60
63
  ### Step 2b: Triage CANDIDATE beads (if the dispatch carries any)
@@ -79,8 +82,8 @@ by the result:
79
82
  > `choosing-subagent-models` skill's job, not this one — see it for the tiers. What
80
83
  > matters here is that you pass one at all: the `roleDefault()` backstop in the
81
84
  > daemon covers `thrum tmux launch` of thrum agents, **not** Agent-tool sub-agents,
82
- > which inherit the PARENT model when unspecified. An orchestrator on Opus that
83
- > omits `model:` gets Opus-priced triage.
85
+ > which inherit the PARENT model when unspecified. An orchestrator whose own tier is
86
+ > costly that omits `model:` gets costly-priced triage.
84
87
 
85
88
  | Result | Action |
86
89
  |---|---|
@@ -181,13 +184,13 @@ thrum worktree create <name>
181
184
  # Pin --model on BOTH create AND launch — create's persist to runtime_config.json
182
185
  # is asynchronous and can lose the race to launch's resolution if launch omits
183
186
  # the flag (see CLAUDE.md "Launching an Agent"). There is no create-only shortcut.
184
- # Always launch implementers at --model sonnet. sonnet-medium is the floor;
185
- # no lower tier exists.
187
+ # Always launch implementers pinned to the tier from runtime.role_models, per
188
+ # choosing-subagent-models; that tier is the floor, no lower tier exists.
186
189
  thrum tmux create <name> --cwd <worktree-path> \
187
190
  --name <agent_name> --role implementer --module <module> \
188
191
  --mode ephemeral --identity ephemeral \
189
- --model sonnet
190
- thrum tmux launch <name> --runtime <runtime> --model sonnet
192
+ --model <from runtime.role_models, per choosing-subagent-models>
193
+ thrum tmux launch <name> --runtime <runtime> --model <from runtime.role_models, per choosing-subagent-models>
191
194
  ```
192
195
 
193
196
  > **Implementer lifecycle:** All implementers are ephemeral+stateless (no agent
@@ -215,7 +218,7 @@ it fails again, escalate to the human.
215
218
  ### Step 3b: Verify the model pin took
216
219
 
217
220
  If `--model` is dropped anywhere in the create/launch sequence, the implementer
218
- launches UNPINNED and the runtime defaults to Opus — the exact expensive
221
+ launches UNPINNED and the runtime defaults to its own (costly) model — the exact expensive
219
222
  failure this tier exists to prevent. Confirm the pin landed before assigning
220
223
  work, using `thrum tmux capture --format=annotated` (see CLAUDE.md "Launching
221
224
  an Agent — Verify the Model by Pane, Never by `runtime-config get`" for the
@@ -226,12 +229,12 @@ NBSP fallback trap, and the by-position read):
226
229
  thrum tmux capture <agent-name> --format=annotated --lines 12
227
230
  ```
228
231
 
229
- That prints the runtime's own footer line, e.g. `Model: Sonnet 5`. **Read the
232
+ That prints the runtime's own footer line, e.g. `Model: <resolved model>`. **Read the
230
233
  intended tier from `.thrum/config.json` → `runtime.role_models`, not from memory.**
231
- If the footer shows a different tier (see the BLOCKED note under Step 2 — there is
232
- no valid `haiku` pin), the pin failed silently — re-pin with
233
- `thrum tmux create ... --model sonnet` (or
234
- `thrum agent runtime-config set <agent_name> --model sonnet`) and relaunch BEFORE
234
+ If the footer shows a different tier (see the BLOCKED note under Step 2 — the model ban
235
+ list lives in `choosing-subagent-models`), the pin failed silently — re-pin with
236
+ `thrum tmux create ... --model <from runtime.role_models, per choosing-subagent-models>` (or
237
+ `thrum agent runtime-config set <agent_name> --model <from runtime.role_models, per choosing-subagent-models>`) and relaunch BEFORE
235
238
  assigning work. **Do not dispatch an unpinned implementer** — the daemon's
236
239
  role-default backstop (`jq -r '.runtime.role_models' .thrum/config.json`) is a
237
240
  net for a forgotten pin, not a substitute for this check.
@@ -329,9 +332,9 @@ Handle each message type:
329
332
  2. Dispatch BOTH reviewers IN PARALLEL (one Agent call per reviewer in the same
330
333
  response). Block until BOTH return:
331
334
  - Code-quality: `superpowers:code-reviewer` (or `feature-dev:code-reviewer`
332
- if the project provides one) — `model: "sonnet"`
335
+ if the project provides one) — `model: <per choosing-subagent-models>`
333
336
  - Spec-compliance: `general-purpose` reviewer cross-referencing the plan/
334
- spec — `model: "sonnet"`
337
+ spec — `model: <per choosing-subagent-models>`
335
338
  3. **Verify** every cited `file:line` claim against the actual source before
336
339
  forwarding. Reviewers can misread files; forwarding unverified findings
337
340
  wastes the implementer's time.
@@ -389,10 +392,7 @@ Handle each message type:
389
392
  **Sub-agent model discipline (applies to ALL Agent tool calls in this phase and
390
393
  Phase 5):**
391
394
 
392
- > **Model tiers:** pass an explicit `model:` on every dispatch — `sonnet`
393
- > (low effort) mechanical, `sonnet` (medium effort) judgment, Opus only on
394
- > operator-ask or a skill step that names it. See the
395
- > `choosing-subagent-models` skill for the full policy.
395
+ > **Model tiers:** pass an explicit `model:` on every dispatch; choose model and effort per the `choosing-subagent-models` skill (read `runtime.role_models` at the moment of use). Never let a sub-agent inherit your own model.
396
396
 
397
397
  **Blocker:**
398
398
 
@@ -508,7 +508,7 @@ in Scope Boundaries). Analyze the conflict using your plan/intent context to
508
508
  determine the correct resolution. Then spawn a targeted edit sub-agent:
509
509
 
510
510
  ```text
511
- Agent(subagent_type="general-purpose", model="sonnet",
511
+ Agent(subagent_type="general-purpose", model="<per choosing-subagent-models>",
512
512
  prompt="Resolve this specific merge conflict.
513
513
  File: <file-path>
514
514
  Conflicted section: <paste the <<<< ==== >>>> block>
@@ -618,18 +618,30 @@ can act on, which is how a guard gets disabled. Classify every hit — only a
618
618
  classifier failure is a real only-copy:
619
619
 
620
620
  ```bash
621
- # STAGE 2 — CLASSIFY every hit from stage 1 against ALL HISTORY, not the tip
622
- # tree (a tip-only check like `git cat-file -e origin/<ref>:<path>` flags
623
- # every file the 19-session sliding window has legitimately trimmed as
624
- # unrecoverable — over-reporting, not under-reporting, but still an alarm
625
- # nobody can act on):
626
- git log --all --oneline -- ".thrum/agents/<path>" | head -1
627
- # NON-EMPTY -> RECOVERABLE (in git history)
628
- # EMPTY -> ONLY-COPY — SALVAGE BEFORE REMOVAL
629
-
630
- # CONTROLS — the classifier must be able to both affirm and refuse:
631
- git log --all --oneline -- ".thrum/agents/<a-real-trimmed-path>" # must be NON-EMPTY
632
- git log --all --oneline -- ".thrum/agents/__nope__/x" # must be EMPTY
621
+ # STAGE 2 — classify every stage-1 hit. Test that a BLOB IS RETRIEVABLE,
622
+ # never that the path merely appears in the log: `git log -- <path>` also
623
+ # matches the commit that DELETED the file, and `| head -1` returns exactly
624
+ # that for a trimmed file.
625
+ git log --all --oneline --name-status -- ".thrum/agents/<path>" # read the A/M/D column; do NOT head -1
626
+ git cat-file -e "<add-or-modify-sha>:.thrum/agents/<path>" # rc=0 proves the BLOB EXISTS
627
+ git show "<that-sha>:.thrum/agents/<path>" > /tmp/x && cmp /tmp/x "<worktree-copy>"
628
+ # blob retrievable AND byte-identical -> RECOVERABLE
629
+ # otherwise -> ONLY-COPY — SALVAGE BEFORE REMOVAL
630
+ # Always check rc explicitly on git show/cat-file; never infer from output size.
631
+ # Form the cmp control from two files KNOWN to differ — comparing an
632
+ # accidentally-empty extraction against /dev/null reports "identical" and
633
+ # reads as a passing control.
634
+
635
+ # CONTROLS — the classifier must be able to both affirm and refuse.
636
+ # Exercise BOTH halves of the decision: existence (cat-file -e) AND
637
+ # byte-identity (cmp). Controlling only existence leaves the cmp step
638
+ # unguarded — and cmp is where an accidentally-empty extraction reads
639
+ # as "identical" and passes.
640
+ git cat-file -e "<add-or-modify-sha>:.thrum/agents/<path>"; echo "rc=$? (must be 0)"
641
+ git cat-file -e "<add-or-modify-sha>:.thrum/agents/__nope__/x"; echo "rc=$? (must be NON-ZERO)"
642
+ printf 'x' > /tmp/ctl-differs
643
+ cmp -s /tmp/x /tmp/ctl-differs; echo "rc=$? (must be NON-ZERO — proves cmp CAN detect a difference)"
644
+ cmp -s /tmp/x /tmp/x; echo "rc=$? (must be 0 — proves cmp CAN affirm)"
633
645
  ```
634
646
 
635
647
  ```bash
@@ -719,7 +731,7 @@ Run review rounds; converge to zero BLOCKING:
719
731
  **Round N:**
720
732
 
721
733
  1. Dispatch BOTH reviewers IN PARALLEL — code-quality (`feature-dev:code-reviewer`,
722
- `model: "sonnet"`) + spec-compliance (`general-purpose`, `model: "sonnet"`).
734
+ `model: <per choosing-subagent-models>`) + spec-compliance (`general-purpose`, `model: <per choosing-subagent-models>`).
723
735
  **In each reviewer dispatch prompt, mandate structured severity:**
724
736
  > "Label every finding BLOCKING / IMPORTANT / MINOR. At least one label per
725
737
  > finding, prefix each finding line."
@@ -775,7 +787,7 @@ them, forward to coordinator at merge-approval.
775
787
  **Hard cap — 2 rounds max:**
776
788
  If BLOCKING findings remain after round 2:
777
789
 
778
- - Step A: REMOVED. sonnet-medium is the implementer floor, so there is no
790
+ - Step A: REMOVED. The implementer tier is the floor, so there is no
779
791
  lower tier to escalate from. A round-2 BLOCKING failure goes straight to
780
792
  Step B.
781
793
  - Step B (escalate up): if the implementer fails to converge, escalate to coordinator