opencode-swarm 7.99.4 → 7.99.5
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/.opencode/skills/brainstorm/SKILL.md +1 -0
- package/.opencode/skills/codebase-review-swarm/SKILL.md +1 -1
- package/.opencode/skills/council/SKILL.md +5 -3
- package/.opencode/skills/deep-dive/SKILL.md +2 -2
- package/.opencode/skills/deep-research/SKILL.md +7 -4
- package/.opencode/skills/plan/SKILL.md +1 -0
- package/.opencode/skills/specify/SKILL.md +1 -0
- package/.opencode/skills/swarm-pr-feedback/SKILL.md +3 -1
- package/.opencode/skills/swarm-pr-review/SKILL.md +9 -9
- package/dist/cli/{config-doctor-9fhfy6p7.js → config-doctor-1j77p1jy.js} +1 -1
- package/dist/cli/{guardrail-explain-3dxh8t8v.js → guardrail-explain-2q5q86jv.js} +3 -3
- package/dist/cli/{index-svf2zjxs.js → index-0d3pmjf9.js} +28 -0
- package/dist/cli/{index-0avc4356.js → index-gjyrjr08.js} +7 -7
- package/dist/cli/{index-r431nee9.js → index-s0nsx5v6.js} +3 -3
- package/dist/cli/{index-rq7arj2r.js → index-tn5exv94.js} +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/commands/registry.d.ts +1 -1
- package/dist/index.js +44 -4
- package/package.json +1 -1
|
@@ -86,6 +86,7 @@ Present the eleven gates with their defaults (DEFAULT_QA_GATES), parallel coder
|
|
|
86
86
|
|
|
87
87
|
Additionally, present these two sub-items as part of the same exchange:
|
|
88
88
|
- Parallel coders (default: 1, range: 1-6) -- how many coders should run in parallel. Parallel coders each run in an isolated git worktree (separate working dir + branch) and merge back automatically, so they never overwrite each other's files -- safe and faster, but only for tasks whose file scopes do NOT overlap. The per-task file scopes that determine a safe parallel count are not known until the plan is finalized, so default to 1 (serial) here; the precise recommendation is made at plan time once the tasks and their scopes exist.
|
|
89
|
+
> COMMON MISCONCEPTION: worktree isolation is baseline for standard parallel coders, governed by the parallel execution profile plus top-level `worktree.policy`. It is not provided by Lean Turbo or Epic. Do not recommend Lean Turbo or Epic to obtain worktree isolation; recommend them only for what they add beyond baseline (Lean Turbo: lane planning, file locks, phase reviewer, integrated diff; Epic: co-change awareness and auto-decide). Worktrees also do not make overlapping scopes safe: dependency readiness, file-disjoint scopes, and merge-back ownership are still required.
|
|
89
90
|
- Commit frequency (default: phase-level only) -- optional per-task checkpoint commit after each task completion.
|
|
90
91
|
- auto_proceed (boolean, default: false) -- when true, auto-advance to the next phase without asking "Ready for Phase N+1?"; runtime toggle via /swarm auto-proceed on|off.
|
|
91
92
|
|
|
@@ -70,4 +70,4 @@ When selected-track inventory or candidate generation decomposes into independen
|
|
|
70
70
|
|
|
71
71
|
**Incremental collection:** While lanes are running, poll with `collect_lane_results` (without `wait` or `wait: false`) to check progress and process any settled lanes immediately — call `retrieve_lane_output` for full text when `output_ref` is present, extract candidates, update coverage ledger entries, validate output quality — while continuing independent work between polls. Only use `wait: true` if lanes are still pending and no more independent architect work remains.
|
|
72
72
|
|
|
73
|
-
At every coverage, validation, and synthesis boundary, all lanes in the relevant batch must be settled before proceeding. Missing, stale, cancelled, or failed lanes are coverage gaps that must be closed before proceeding — they map to the existing `BLOCKED` invariant (#2 Coverage Closure) but with stricter resolution: (1) retry max 2 times with materially different parameters; (2) if retries fail, deploy a verified equivalent alternative (same agent type, same prompt, same scope, same isolation — different dispatch mechanism acceptable when equivalence is verified); (3) if no equivalent exists, the coverage unit becomes `BLOCKED` and the
|
|
73
|
+
At every coverage, validation, and synthesis boundary, all lanes in the relevant batch must be settled before proceeding. Missing, stale, cancelled, or failed lanes are coverage gaps that must be closed before proceeding — they map to the existing `BLOCKED` invariant (#2 Coverage Closure) but with stricter resolution: (1) retry max 2 times with materially different parameters; (2) if retries fail, deploy a verified equivalent alternative (same agent type, same prompt, same scope, same isolation — different dispatch mechanism acceptable when equivalence is verified, including Task-tool dispatch as the final fallback when lane tools do not work); (3) if no equivalent exists, the coverage unit becomes `BLOCKED` and the architect must surface the lane failure to the user before producing a report. `SKIPPED_WITH_REASON` is not acceptable for dispatch-lane failures — it must be `BLOCKED` with an explicit retry/equivalent/escalation trail, and no degraded review report is written.
|
|
@@ -115,9 +115,11 @@ Do NOT share other agents' responses at this stage.
|
|
|
115
115
|
use `wait: true` if lanes are still pending and no more independent work
|
|
116
116
|
remains. All three lanes must be settled before proceeding to synthesis.
|
|
117
117
|
If `dispatch_lanes_async` is unavailable, use blocking `dispatch_lanes`
|
|
118
|
-
and record that async advisory lanes were unavailable
|
|
119
|
-
|
|
120
|
-
|
|
118
|
+
as the first fallback and record that async advisory lanes were unavailable.
|
|
119
|
+
This changes only when the architect waits, not whether all council lanes
|
|
120
|
+
must settle. Do not substitute Task-tool dispatch unless lane tools are
|
|
121
|
+
unavailable; when they are unavailable, Task is the final fallback and must be
|
|
122
|
+
verified as equivalent by agent type, prompt, scope, and isolation. The
|
|
121
123
|
`round1Responses` array will contain entries with `memberId` of
|
|
122
124
|
`council_generalist`, `council_skeptic`, and `council_domain_expert` and
|
|
123
125
|
`role` of `generalist`, `skeptic`, and `domain_expert` respectively. If
|
|
@@ -85,9 +85,9 @@ Explorer missions are dispatched in parallel waves. Launch the wave promptly —
|
|
|
85
85
|
|
|
86
86
|
**Incremental collection pattern:** While lanes are running, use `collect_lane_results` without `wait` (or `wait: false`) to poll progress. Process any settled lanes immediately — extract candidates, check `output_ref`, update the candidate ledger — while continuing independent architect work (scope refinement, local evidence reads, reviewer preparation) between polls. This avoids idle waiting and lets you pipeline candidate normalization with lane completion. Only use `wait: true` at the Step 4 boundary if lanes are still pending and no more independent work remains.
|
|
87
87
|
|
|
88
|
-
At the Step 4 boundary, all lanes must be settled before proceeding. If non-blocking polls show lanes still running and you have exhausted independent work, call `collect_lane_results` with `wait: true` to block on the remaining lanes. **COVERAGE GATE:** Every lane must produce validated candidate output before proceeding. Missing, stale, cancelled, or failed lanes are coverage gaps that must be closed — not documented and skipped. If a lane fails: (1) retry max 2 times with materially different parameters; (2) if retries fail, deploy an equivalent alternative (same agent type, same prompt, same scope, same isolation — different dispatch mechanism acceptable when verified); (3) if no equivalent exists,
|
|
88
|
+
At the Step 4 boundary, all lanes must be settled before proceeding. If non-blocking polls show lanes still running and you have exhausted independent work, call `collect_lane_results` with `wait: true` to block on the remaining lanes. **COVERAGE GATE:** Every lane must produce validated candidate output before proceeding. Missing, stale, cancelled, or failed lanes are coverage gaps that must be closed — not documented and skipped. If a lane fails: (1) retry max 2 times with materially different parameters; (2) if retries fail, deploy an equivalent alternative (same agent type, same prompt, same scope, same isolation — different dispatch mechanism acceptable when verified, including Task-tool dispatch as the final fallback when lane tools do not work); (3) if no equivalent exists, stop and surface the lane failure to the user as BLOCKED. Do not proceed past a required lane with unclosed coverage or produce a degraded review.
|
|
89
89
|
|
|
90
|
-
When a collected or blocking lane result includes `output_ref`, treat `output` as a preview and call `retrieve_lane_output` before extracting candidate findings or declaring a lane clean. If the result is `output_degraded`, `transcript_incomplete`, truncated without a usable ref, missing, stale, cancelled, or failed — or if the lane reports `status: completed` but `parse_lane_candidates` returns 0 candidates (Mode B: intermediate reasoning only) — apply the COVERAGE GATE: retry, deploy equivalent, or
|
|
90
|
+
When a collected or blocking lane result includes `output_ref`, treat `output` as a preview and call `retrieve_lane_output` before extracting candidate findings or declaring a lane clean. If the result is `output_degraded`, `transcript_incomplete`, truncated without a usable ref, missing, stale, cancelled, or failed — or if the lane reports `status: completed` but `parse_lane_candidates` returns 0 candidates (Mode B: intermediate reasoning only) — apply the COVERAGE GATE: retry, deploy equivalent including Task-tool dispatch as the final fallback when lane tools do not work, or stop and surface the lane failure to the user as BLOCKED. Do not mark findings/coverage UNVERIFIED to proceed past the gap.
|
|
91
91
|
|
|
92
92
|
Explorers generate CANDIDATE FINDINGS only — they do NOT make verdicts. All findings are unverified until Step 5.
|
|
93
93
|
|
|
@@ -127,10 +127,13 @@ lanes are still pending and no independent work remains. Do not advance to Step
|
|
|
127
127
|
until every synthesis lane is settled. Collect all completed worker responses into
|
|
128
128
|
a candidate findings set, each finding tagged with its subtopic, evidence refs,
|
|
129
129
|
and the worker's confidence. Treat missing, stale, cancelled, or failed lanes as
|
|
130
|
-
explicit coverage gaps. If `dispatch_lanes_async` is unavailable, use
|
|
131
|
-
`dispatch_lanes` and record that async advisory lanes were
|
|
132
|
-
|
|
133
|
-
|
|
130
|
+
explicit coverage gaps. If `dispatch_lanes_async` is unavailable, use
|
|
131
|
+
blocking `dispatch_lanes` as the first fallback and record that async advisory lanes were
|
|
132
|
+
unavailable. This changes only when the architect waits, not whether every
|
|
133
|
+
synthesis lane must settle before Step 5. Do not substitute Task-tool dispatch
|
|
134
|
+
unless lane tools are unavailable; when they are unavailable, Task is the final fallback
|
|
135
|
+
and must be verified as equivalent by agent type, prompt, scope, and
|
|
136
|
+
isolation.
|
|
134
137
|
|
|
135
138
|
## Step 5 — Dual-Reviewer Claim Verification
|
|
136
139
|
|
|
@@ -228,6 +228,7 @@ After `save_plan` succeeds, read `.swarm/context.md`:
|
|
|
228
228
|
- final_council (default: OFF) - when enabled, after all phases complete the architect dispatches the full 5-member council (critic, reviewer, sme, test_engineer, explorer) -- NOT the General Council -- at project scope, collects `CouncilMemberVerdict` objects, and calls `write_final_council_evidence`. This does not require `council.general.enabled`.
|
|
229
229
|
Additionally, present these two sub-items as part of the same exchange:
|
|
230
230
|
- Parallel coders (default: 1, range: 1-6) - how many coders should run in parallel. Parallel coders each run in an isolated git worktree (separate working dir + branch) and merge back automatically, so they never overwrite each other's files - safe and faster, but only for tasks whose declared file scopes do NOT overlap. Inspect the plan and recommend a count equal to the number of dependency-ready, file-disjoint task groups (clamped 1-6); recommend 1 (serial) when scopes overlap or are unknown. State your recommendation and reasoning when you ask.
|
|
231
|
+
> COMMON MISCONCEPTION: worktree isolation is baseline for standard parallel coders, governed by the parallel execution profile plus top-level `worktree.policy`. It is not provided by Lean Turbo or Epic. Do not recommend Lean Turbo or Epic to obtain worktree isolation; recommend them only for what they add beyond baseline (Lean Turbo: lane planning, file locks, phase reviewer, integrated diff; Epic: co-change awareness and auto-decide). Worktrees also do not make overlapping scopes safe: dependency readiness, file-disjoint scopes, and merge-back ownership are still required.
|
|
231
232
|
- Commit frequency (default: phase-level only) - optional per-task checkpoint commit after each task completion.
|
|
232
233
|
The user answers all three (gates, parallel coders, commit frequency) in one exchange. Wait for the user's response.
|
|
233
234
|
If the user says parallel coders > 1, write a `## Pending Parallelization Config` section to `.swarm/context.md` alongside the gate selection:
|
|
@@ -49,6 +49,7 @@ Present the eleven gates with their defaults (DEFAULT_QA_GATES), parallel coder
|
|
|
49
49
|
|
|
50
50
|
Additionally, present these three sub-items as part of the same exchange:
|
|
51
51
|
- Parallel coders (default: 1, range: 1-6) -- how many coders should run in parallel. Parallel coders each run in an isolated git worktree (separate working dir + branch) and merge back automatically, so they never overwrite each other's files -- safe and faster, but only for tasks whose file scopes do NOT overlap. The per-task file scopes that determine a safe parallel count are not known until the plan is finalized, so default to 1 (serial) here; the precise recommendation is made at plan time once the tasks and their scopes exist.
|
|
52
|
+
> COMMON MISCONCEPTION: worktree isolation is baseline for standard parallel coders, governed by the parallel execution profile plus top-level `worktree.policy`. It is not provided by Lean Turbo or Epic. Do not recommend Lean Turbo or Epic to obtain worktree isolation; recommend them only for what they add beyond baseline (Lean Turbo: lane planning, file locks, phase reviewer, integrated diff; Epic: co-change awareness and auto-decide). Worktrees also do not make overlapping scopes safe: dependency readiness, file-disjoint scopes, and merge-back ownership are still required.
|
|
52
53
|
- Commit frequency (default: phase-level only) -- optional per-task checkpoint commit after each task completion.
|
|
53
54
|
- auto_proceed (boolean, default: false) -- when true, auto-advance to the next phase without asking "Ready for Phase N+1?"; runtime toggle via /swarm auto-proceed on|off.
|
|
54
55
|
|
|
@@ -222,7 +222,9 @@ independent work is exhausted, to confirm every lane is settled.
|
|
|
222
222
|
Missing, stale, cancelled, or failed lanes are coverage gaps that must be closed
|
|
223
223
|
before marking any item RESOLVED/DISPROVED/PRE_EXISTING. Apply the COVERAGE GATE:
|
|
224
224
|
retry failed lanes (max 2), deploy a verified equivalent alternative (same agent
|
|
225
|
-
type, same prompt, same scope, same isolation
|
|
225
|
+
type, same prompt, same scope, same isolation, with Task-tool dispatch as the
|
|
226
|
+
final fallback when lane tools do not work), or stop and surface the lane failure
|
|
227
|
+
to the user as BLOCKED.
|
|
226
228
|
Do not proceed with "blocking verification and record that async advisory lanes
|
|
227
229
|
were unavailable" — record-and-continue is not coverage closure.
|
|
228
230
|
|
|
@@ -146,7 +146,7 @@ Before deeper analysis, verify the PR meets the commit-pr skill's publication co
|
|
|
146
146
|
- **Title format:** `<type>(<scope>): <description>` — lowercase description, no trailing period, allowed types: `feat`, `fix`, `perf`, `revert`, `docs`, `chore`, `refactor`, `test`, `ci`, `build`.
|
|
147
147
|
- **Body contract:** `Closes #<issue-number>` as the first line (when the PR resolves an issue), followed by `## Summary`, `## Invariant audit` (all 12 invariants), and `## Test plan` sections.
|
|
148
148
|
|
|
149
|
-
**`Closes #N` claim integrity (apply the COVERAGE GATE):** if the PR body claims `Closes #<issue-number>`, verify (a) the issue is currently open (`gh issue view <N> --json state`), and (b) the diff addresses the issue's acceptance criteria (read the issue, map each criterion to changed files/symbols, and inspect the diff for those areas). If the issue is already closed by another merged PR, do NOT re-close it — the duplicate `Closes #N` reference is misleading and will confuse release-please aggregation. If the issue is open but the diff does not address the acceptance criteria, mark the claim as `UNVERIFIED — claim integrity` in the validation provenance and
|
|
149
|
+
**`Closes #N` claim integrity (apply the COVERAGE GATE):** if the PR body claims `Closes #<issue-number>`, verify (a) the issue is currently open (`gh issue view <N> --json state`), and (b) the diff addresses the issue's acceptance criteria (read the issue, map each criterion to changed files/symbols, and inspect the diff for those areas). If the issue is already closed by another merged PR, do NOT re-close it — the duplicate `Closes #N` reference is misleading and will confuse release-please aggregation. If the issue is open but the diff does not address the acceptance criteria, mark the claim as `UNVERIFIED — claim integrity` in the validation provenance and surface the unresolved claim-integrity gap to the user before synthesis.
|
|
150
150
|
|
|
151
151
|
Non-compliance is a ledger item (advisory, not blocking — CI will catch it). If the PR is from an external contributor, note the compliance gap for the maintainer to address before merge.
|
|
152
152
|
|
|
@@ -517,8 +517,8 @@ Before Phase 4 or synthesis, all base lanes must be settled. `dispatch_lanes_asy
|
|
|
517
517
|
|
|
518
518
|
For ANY lane that failed (either mode):
|
|
519
519
|
1. **Retry** (max 2 attempts) with materially different parameters — different session, different prompt decomposition, or blocking `dispatch_lanes`.
|
|
520
|
-
2. If retries fail, **deploy an equivalent alternative** and **verify equivalence**: same agent type, same prompt, same scope, same isolation.
|
|
521
|
-
3. If no equivalent alternative can be verified, **
|
|
520
|
+
2. If retries fail, **deploy an equivalent alternative** and **verify equivalence**: same agent type, same prompt, same scope, same isolation. Fallback order is explicit: retry or re-collect `dispatch_lanes_async` first, use blocking `dispatch_lanes` when async dispatch or collection cannot close coverage, then use the Task tool as the last-resort equivalent dispatch mechanism when lane tools do not work. State the Task fallback equivalence verification explicitly. Task is not an early-poll or empty-partial-output fallback; use `retrieve_lane_output` to inspect the full artifact before declaring equivalence or failure.
|
|
521
|
+
3. If no equivalent alternative can be verified, **STOP and surface the lane failure to the user as BLOCKED** with the lane id, scope, failure mode, retry attempts, and why equivalence could not be proven. Do not present partial findings, do not issue a review verdict, and do not synthesize from successful lanes. A low-quality partial review is worse than no review.
|
|
522
522
|
|
|
523
523
|
### Candidate extraction via parser
|
|
524
524
|
|
|
@@ -543,7 +543,7 @@ rather than preview-text extraction:
|
|
|
543
543
|
lists. Each reviewer lane receives only the candidates from its assigned
|
|
544
544
|
chunk.
|
|
545
545
|
|
|
546
|
-
If a lane has `output_degraded: true`, `transcript_incomplete: true`, or no usable `output_ref`, apply the COVERAGE GATE from Phase 3: retry (max 2) with materially different parameters,
|
|
546
|
+
If a lane has `output_degraded: true`, `transcript_incomplete: true`, or no usable `output_ref`, apply the COVERAGE GATE from Phase 3: retry (max 2) with materially different parameters, then use blocking `dispatch_lanes` or the Task tool as verified-equivalent fallbacks when lane tools do not work. If the gap cannot be closed, stop and surface the lane failure to the user as BLOCKED. Do not mark affected candidates UNVERIFIED to proceed past the gap. Never infer candidate absence from a preview.
|
|
547
547
|
|
|
548
548
|
**Fallback convention:** If the parser is unavailable, the explorer MAY emit
|
|
549
549
|
`[CANDIDATE]` rows in the lane output as a fallback convention (see the
|
|
@@ -603,7 +603,7 @@ Explorers must not use `CONFIRMED`, `DISPROVED`, or `PRE_EXISTING`.
|
|
|
603
603
|
|
|
604
604
|
After base lanes are settled, inspect the context pack risk triggers. Launch focused micro-lanes for triggered categories only, using `dispatch_lanes_async` again when more than one read-only micro-lane is needed (`dispatch_lanes_async` accepts max 8 lanes per call — micro-lanes are dispatched in a separate batch from base lanes). Use the same incremental collection pattern: poll with `collect_lane_results` (without `wait`) to process settled micro-lanes while continuing independent work, falling back to `wait: true` only when no independent work remains. All micro-lanes must be settled before reviewer classification. Do not launch irrelevant micro-lanes.
|
|
605
605
|
|
|
606
|
-
Apply the same parser-based extraction to micro-lanes: call `parse_lane_candidates` on each micro-lane `output_ref` (filter the returned `candidates[]` array by `row_format_family === "micro_lane"` after parsing). Apply the COVERAGE GATE from Phase 3 to micro-lanes: degraded, incomplete, or candidate-less lane artifacts are coverage gaps that must be closed by retry, verified
|
|
606
|
+
Apply the same parser-based extraction to micro-lanes: call `parse_lane_candidates` on each micro-lane `output_ref` (filter the returned `candidates[]` array by `row_format_family === "micro_lane"` after parsing). Apply the COVERAGE GATE from Phase 3 to micro-lanes: degraded, incomplete, or candidate-less lane artifacts are coverage gaps that must be closed by retry, blocking `dispatch_lanes`, or Task-tool dispatch as a verified-equivalent fallback when lane tools do not work. If the gap cannot be closed, stop and surface it to the user as BLOCKED before reviewer classification — never treat it as clean negative evidence and never proceed with a degraded review.
|
|
607
607
|
|
|
608
608
|
Each micro-lane receives:
|
|
609
609
|
|
|
@@ -772,7 +772,7 @@ The `[CRITIC]` row in the format above is **mandatory contract**, not advisory o
|
|
|
772
772
|
|
|
773
773
|
**Re-dispatch trigger:** when a critic lane response is missing the verdict row, the orchestrator must automatically re-dispatch that lane with the explicit instruction: "Your final line MUST be exactly the Phase 8 contract row: `[CRITIC] | finding_id | UPHELD/DOWNGRADED/DISPROVED/NEEDS_MORE_EVIDENCE | final_severity | reason | required_report_change`. A response without that exact row will be treated as a planning message and re-dispatched." Do not synthesize findings from the planning preamble; only from the re-dispatched verdict.
|
|
774
774
|
|
|
775
|
-
**COVERAGE GATE alignment:** Critic lane failures follow the same COVERAGE GATE as explorer lanes: retry (max 2 attempts) with materially different parameters. If retries fail, deploy a verified equivalent alternative (same agent type, same prompt, same scope, same isolation). If no equivalent can be verified,
|
|
775
|
+
**COVERAGE GATE alignment:** Critic lane failures follow the same COVERAGE GATE as explorer lanes: retry (max 2 attempts) with materially different parameters. If retries fail, deploy a verified equivalent alternative (same agent type, same prompt, same scope, same isolation), including Task-tool dispatch as the final fallback when lane tools do not work. If no equivalent can be verified, stop and surface the critic-lane failure to the user as BLOCKED — do NOT mark findings UNVERIFIED or continue past the gap. The orchestrator NEVER fabricates a critic verdict by parsing prose, by tolerating a planning preamble, by presenting partial findings, or by silently accepting reduced coverage.
|
|
776
776
|
|
|
777
777
|
Refuted findings become `DISPROVED` or `ADVISORY`, depending on critic rationale. Downgrades must be listed in the final validation provenance.
|
|
778
778
|
|
|
@@ -1200,9 +1200,9 @@ Council findings are supplementary, not authoritative overrides. Do not adopt co
|
|
|
1200
1200
|
11. Obligation precedence is deterministic. Do not skip higher-precedence sources to fill gaps with LLM synthesis.
|
|
1201
1201
|
12. Do not leak secrets from logs, evidence bundles, config files, URLs, or scanner output.
|
|
1202
1202
|
13. Do not recommend destructive git or filesystem actions as fixes unless they are clearly scoped, safe, and necessary.
|
|
1203
|
-
14. If subagents fail, timeout, or return malformed output, retry with corrected parameters (max 2 attempts). If retries fail, deploy a provably equivalent alternative (same agent type, same prompt, same scope, same isolation — different dispatch mechanism acceptable) and verify equivalence. If no equivalent alternative exists, the affected coverage dimension is
|
|
1203
|
+
14. If subagents fail, timeout, or return malformed output, retry with corrected parameters (max 2 attempts). If retries fail, deploy a provably equivalent alternative (same agent type, same prompt, same scope, same isolation — different dispatch mechanism acceptable), with Task-tool dispatch explicitly allowed as the final fallback when lane tools do not work, and verify equivalence. If no equivalent alternative exists, the affected coverage dimension is BLOCKED and must be surfaced to the user before synthesis. Do not fabricate validation results, do not present partial findings, and do not silently mark candidates UNVERIFIED to proceed past the gap.
|
|
1204
1204
|
|
|
1205
|
-
15. If context pack, repo graph, deterministic signals, or Swarm artifacts are unavailable, retry with alternative access paths. If unavailable after retry, the affected coverage dimension is
|
|
1205
|
+
15. If context pack, repo graph, deterministic signals, or Swarm artifacts are unavailable, retry with alternative access paths. If unavailable after retry, the affected coverage dimension is BLOCKED and must be surfaced to the user. Do not proceed to synthesis with unclosed coverage gaps under a "best available evidence" rationale — the architect is not authorized to produce a degraded review.
|
|
1206
1206
|
|
|
1207
1207
|
---
|
|
1208
1208
|
|
|
@@ -1245,7 +1245,7 @@ Before writing the final output, print this checklist with filled values. Every
|
|
|
1245
1245
|
|
|
1246
1246
|
If the reviewer returned `REJECTED` or `CONCERNS`, route the issue back to implementation context or mark the candidate invalid with reason. Do not silently downgrade a rejection.
|
|
1247
1247
|
|
|
1248
|
-
**COVERAGE GATE CONDITION:** If ANY validation dimension shows incomplete coverage (lanes that failed and were not closed by retry or verified equivalent alternative, CI that did not run, tools that were unavailable after retry), the Pre-Synthesis Gate FAILS. Do not proceed to final output.
|
|
1248
|
+
**COVERAGE GATE CONDITION:** If ANY validation dimension shows incomplete coverage (lanes that failed and were not closed by retry or verified equivalent alternative, CI that did not run, tools that were unavailable after retry), the Pre-Synthesis Gate FAILS. Do not proceed to final output. Surface the unclosed gaps to the user as BLOCKED with exact failing dimensions and retry/equivalence evidence. Do not include partial findings from successful dimensions, do not issue a review verdict, and do not silently accept reduced coverage.
|
|
1249
1249
|
|
|
1250
1250
|
---
|
|
1251
1251
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
handleGuardrailExplain
|
|
4
|
-
} from "./index-
|
|
5
|
-
import"./index-
|
|
4
|
+
} from "./index-tn5exv94.js";
|
|
5
|
+
import"./index-gjyrjr08.js";
|
|
6
6
|
import"./index-xsswhy6k.js";
|
|
7
7
|
import"./index-ydgy7vg5.js";
|
|
8
8
|
import"./index-vwyjkzgs.js";
|
|
9
9
|
import"./index-f7nma02k.js";
|
|
10
|
-
import"./index-
|
|
10
|
+
import"./index-0d3pmjf9.js";
|
|
11
11
|
import"./index-7hnwnw5g.js";
|
|
12
12
|
import"./index-9twtnjkv.js";
|
|
13
13
|
import"./index-adz3nk9b.js";
|
|
@@ -79,6 +79,21 @@ function emitObjectTypeMismatch(key, value, findings) {
|
|
|
79
79
|
});
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
|
+
function emitWorktreeIsolationLayeringAdvisory(config, findings) {
|
|
83
|
+
const parallelization = config.parallelization;
|
|
84
|
+
const worktreePolicy = config.worktree?.policy ?? "auto";
|
|
85
|
+
if (parallelization?.enabled === true && (parallelization.maxConcurrentTasks ?? 1) > 1 && worktreePolicy !== "disabled") {
|
|
86
|
+
findings.push({
|
|
87
|
+
id: "worktree-isolation-baseline-active",
|
|
88
|
+
title: "Worktree isolation is already active for standard parallel coders",
|
|
89
|
+
description: "Standard parallel coders already use baseline worktree isolation through the parallel execution profile plus top-level worktree.policy. Lean Turbo and Epic are additive strategies, not requirements for obtaining worktree isolation.",
|
|
90
|
+
severity: "warn",
|
|
91
|
+
path: "worktree.policy",
|
|
92
|
+
currentValue: worktreePolicy,
|
|
93
|
+
autoFixable: false
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
82
97
|
function getUserConfigDir() {
|
|
83
98
|
return process.env.XDG_CONFIG_HOME || path.join(os.homedir(), ".config");
|
|
84
99
|
}
|
|
@@ -639,6 +654,14 @@ function validateConfigKey(path2, value) {
|
|
|
639
654
|
emitObjectTypeMismatch("summaries", value, findings);
|
|
640
655
|
break;
|
|
641
656
|
}
|
|
657
|
+
case "auto_review": {
|
|
658
|
+
emitObjectTypeMismatch("auto_review", value, findings);
|
|
659
|
+
break;
|
|
660
|
+
}
|
|
661
|
+
case "repo_graph": {
|
|
662
|
+
emitObjectTypeMismatch("repo_graph", value, findings);
|
|
663
|
+
break;
|
|
664
|
+
}
|
|
642
665
|
case "review_passes": {
|
|
643
666
|
emitObjectTypeMismatch("review_passes", value, findings);
|
|
644
667
|
break;
|
|
@@ -715,6 +738,10 @@ function validateConfigKey(path2, value) {
|
|
|
715
738
|
emitObjectTypeMismatch("skill_improver", value, findings);
|
|
716
739
|
break;
|
|
717
740
|
}
|
|
741
|
+
case "skills": {
|
|
742
|
+
emitObjectTypeMismatch("skills", value, findings);
|
|
743
|
+
break;
|
|
744
|
+
}
|
|
718
745
|
case "spec_writer": {
|
|
719
746
|
emitObjectTypeMismatch("spec_writer", value, findings);
|
|
720
747
|
break;
|
|
@@ -900,6 +927,7 @@ function walkConfigAndValidate(obj, path2, findings, visited = new WeakSet) {
|
|
|
900
927
|
function runConfigDoctor(config, directory) {
|
|
901
928
|
const findings = [];
|
|
902
929
|
walkConfigAndValidate(config, "", findings);
|
|
930
|
+
emitWorktreeIsolationLayeringAdvisory(config, findings);
|
|
903
931
|
const summary = {
|
|
904
932
|
info: findings.filter((f) => f.severity === "info").length,
|
|
905
933
|
warn: findings.filter((f) => f.severity === "warn").length,
|
|
@@ -57,7 +57,7 @@ import {
|
|
|
57
57
|
readDoctorArtifact,
|
|
58
58
|
removeStraySwarmDir,
|
|
59
59
|
runConfigDoctor
|
|
60
|
-
} from "./index-
|
|
60
|
+
} from "./index-0d3pmjf9.js";
|
|
61
61
|
import {
|
|
62
62
|
AGENT_TOOL_MAP,
|
|
63
63
|
ALL_SUBAGENT_NAMES,
|
|
@@ -909,7 +909,7 @@ var init_executor = __esm(() => {
|
|
|
909
909
|
// package.json
|
|
910
910
|
var package_default = {
|
|
911
911
|
name: "opencode-swarm",
|
|
912
|
-
version: "7.99.
|
|
912
|
+
version: "7.99.5",
|
|
913
913
|
description: "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
|
|
914
914
|
main: "dist/index.js",
|
|
915
915
|
types: "dist/index.d.ts",
|
|
@@ -17137,7 +17137,7 @@ async function handleDoctorCommand(directory, args) {
|
|
|
17137
17137
|
const result = runConfigDoctor(config, directory);
|
|
17138
17138
|
let output;
|
|
17139
17139
|
if (enableAutoFix && result.hasAutoFixableIssues) {
|
|
17140
|
-
const { runConfigDoctorWithFixes } = await import("./config-doctor-
|
|
17140
|
+
const { runConfigDoctorWithFixes } = await import("./config-doctor-1j77p1jy.js");
|
|
17141
17141
|
const fixResult = await runConfigDoctorWithFixes(directory, config, true);
|
|
17142
17142
|
output = formatDoctorMarkdown(fixResult.result);
|
|
17143
17143
|
} else {
|
|
@@ -32296,7 +32296,7 @@ function buildDetailedHelp(commandName, entry) {
|
|
|
32296
32296
|
async function handleHelpCommand(ctx) {
|
|
32297
32297
|
const targetCommand = ctx.args.join(" ");
|
|
32298
32298
|
if (!targetCommand) {
|
|
32299
|
-
const { buildHelpText } = await import("./index-
|
|
32299
|
+
const { buildHelpText } = await import("./index-s0nsx5v6.js");
|
|
32300
32300
|
return buildHelpText();
|
|
32301
32301
|
}
|
|
32302
32302
|
const tokens = targetCommand.split(/\s+/);
|
|
@@ -32305,7 +32305,7 @@ async function handleHelpCommand(ctx) {
|
|
|
32305
32305
|
return _internals46.buildDetailedHelp(resolved.key, resolved.entry);
|
|
32306
32306
|
}
|
|
32307
32307
|
const similar = _internals46.findSimilarCommands(targetCommand);
|
|
32308
|
-
const { buildHelpText: fullHelp } = await import("./index-
|
|
32308
|
+
const { buildHelpText: fullHelp } = await import("./index-s0nsx5v6.js");
|
|
32309
32309
|
if (similar.length > 0) {
|
|
32310
32310
|
return `Command '/swarm ${targetCommand}' not found.
|
|
32311
32311
|
|
|
@@ -32438,7 +32438,7 @@ var COMMAND_REGISTRY = {
|
|
|
32438
32438
|
},
|
|
32439
32439
|
"guardrail explain": {
|
|
32440
32440
|
handler: async (ctx) => {
|
|
32441
|
-
const { handleGuardrailExplain } = await import("./guardrail-explain-
|
|
32441
|
+
const { handleGuardrailExplain } = await import("./guardrail-explain-2q5q86jv.js");
|
|
32442
32442
|
return handleGuardrailExplain(ctx.directory, ctx.args);
|
|
32443
32443
|
},
|
|
32444
32444
|
description: "Dry-run: show what the guardrails would do to a command or write target (executes nothing)",
|
|
@@ -32777,7 +32777,7 @@ Subcommands:
|
|
|
32777
32777
|
handler: (ctx) => handleModeCommandWithBundledSkills(ctx, handlePrReviewCommand),
|
|
32778
32778
|
description: "Launch deep PR review with multi-lane analysis [url] [--council]",
|
|
32779
32779
|
args: "<pr-url|owner/repo#N|N> [--council]",
|
|
32780
|
-
details: "Launches a structured PR review: reconstructs PR intent via obligation extraction cascade,
|
|
32780
|
+
details: "Launches a structured PR review: reconstructs PR intent via obligation extraction cascade, launches all 6 fixed base explorer lanes through dispatch_lanes_async while the architect keeps doing non-dependent work, polls collect_lane_results incrementally, runs every triggered micro-lane, validates findings through independent reviewer confirmation, applies critic challenge to HIGH/CRITICAL findings, then synthesizes only after coverage is closed. If lane tools cannot close coverage, Task-tool dispatch is the final verified-equivalent fallback; if equivalence cannot be proven, the review is BLOCKED rather than degraded. --council variant fires adversarial multi-model review. Supports full GitHub URL, owner/repo#N shorthand, or bare PR number (resolves against origin remote).",
|
|
32781
32781
|
category: "agent",
|
|
32782
32782
|
toolPolicy: "none"
|
|
32783
32783
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
handleGuardrailExplain
|
|
4
|
-
} from "./index-
|
|
4
|
+
} from "./index-tn5exv94.js";
|
|
5
5
|
import {
|
|
6
6
|
handleGuardrailLog
|
|
7
7
|
} from "./index-h9ptj4b1.js";
|
|
@@ -79,12 +79,12 @@ import {
|
|
|
79
79
|
handleWriteRetroCommand,
|
|
80
80
|
normalizeSwarmCommandInput,
|
|
81
81
|
resolveCommand
|
|
82
|
-
} from "./index-
|
|
82
|
+
} from "./index-gjyrjr08.js";
|
|
83
83
|
import"./index-xsswhy6k.js";
|
|
84
84
|
import"./index-ydgy7vg5.js";
|
|
85
85
|
import"./index-vwyjkzgs.js";
|
|
86
86
|
import"./index-f7nma02k.js";
|
|
87
|
-
import"./index-
|
|
87
|
+
import"./index-0d3pmjf9.js";
|
|
88
88
|
import {
|
|
89
89
|
AGENT_TOOL_MAP,
|
|
90
90
|
ORCHESTRATOR_NAME,
|
package/dist/cli/index.js
CHANGED
|
@@ -7,12 +7,12 @@ import {
|
|
|
7
7
|
getPluginLockFilePaths,
|
|
8
8
|
package_default,
|
|
9
9
|
resolveCommand
|
|
10
|
-
} from "./index-
|
|
10
|
+
} from "./index-gjyrjr08.js";
|
|
11
11
|
import"./index-xsswhy6k.js";
|
|
12
12
|
import"./index-ydgy7vg5.js";
|
|
13
13
|
import"./index-vwyjkzgs.js";
|
|
14
14
|
import"./index-f7nma02k.js";
|
|
15
|
-
import"./index-
|
|
15
|
+
import"./index-0d3pmjf9.js";
|
|
16
16
|
import {
|
|
17
17
|
DEFAULT_AGENT_CONFIGS
|
|
18
18
|
} from "./index-7hnwnw5g.js";
|
|
@@ -485,7 +485,7 @@ export declare const COMMAND_REGISTRY: {
|
|
|
485
485
|
readonly handler: (ctx: CommandContext) => CommandResult;
|
|
486
486
|
readonly description: "Launch deep PR review with multi-lane analysis [url] [--council]";
|
|
487
487
|
readonly args: "<pr-url|owner/repo#N|N> [--council]";
|
|
488
|
-
readonly details: "Launches a structured PR review: reconstructs PR intent via obligation extraction cascade,
|
|
488
|
+
readonly details: "Launches a structured PR review: reconstructs PR intent via obligation extraction cascade, launches all 6 fixed base explorer lanes through dispatch_lanes_async while the architect keeps doing non-dependent work, polls collect_lane_results incrementally, runs every triggered micro-lane, validates findings through independent reviewer confirmation, applies critic challenge to HIGH/CRITICAL findings, then synthesizes only after coverage is closed. If lane tools cannot close coverage, Task-tool dispatch is the final verified-equivalent fallback; if equivalence cannot be proven, the review is BLOCKED rather than degraded. --council variant fires adversarial multi-model review. Supports full GitHub URL, owner/repo#N shorthand, or bare PR number (resolves against origin remote).";
|
|
489
489
|
readonly category: "agent";
|
|
490
490
|
readonly toolPolicy: "none";
|
|
491
491
|
};
|
package/dist/index.js
CHANGED
|
@@ -69,7 +69,7 @@ var package_default;
|
|
|
69
69
|
var init_package = __esm(() => {
|
|
70
70
|
package_default = {
|
|
71
71
|
name: "opencode-swarm",
|
|
72
|
-
version: "7.99.
|
|
72
|
+
version: "7.99.5",
|
|
73
73
|
description: "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
|
|
74
74
|
main: "dist/index.js",
|
|
75
75
|
types: "dist/index.d.ts",
|
|
@@ -77880,6 +77880,21 @@ function emitObjectTypeMismatch(key, value, findings) {
|
|
|
77880
77880
|
});
|
|
77881
77881
|
}
|
|
77882
77882
|
}
|
|
77883
|
+
function emitWorktreeIsolationLayeringAdvisory(config3, findings) {
|
|
77884
|
+
const parallelization = config3.parallelization;
|
|
77885
|
+
const worktreePolicy = config3.worktree?.policy ?? "auto";
|
|
77886
|
+
if (parallelization?.enabled === true && (parallelization.maxConcurrentTasks ?? 1) > 1 && worktreePolicy !== "disabled") {
|
|
77887
|
+
findings.push({
|
|
77888
|
+
id: "worktree-isolation-baseline-active",
|
|
77889
|
+
title: "Worktree isolation is already active for standard parallel coders",
|
|
77890
|
+
description: "Standard parallel coders already use baseline worktree isolation through the parallel execution profile plus top-level worktree.policy. Lean Turbo and Epic are additive strategies, not requirements for obtaining worktree isolation.",
|
|
77891
|
+
severity: "warn",
|
|
77892
|
+
path: "worktree.policy",
|
|
77893
|
+
currentValue: worktreePolicy,
|
|
77894
|
+
autoFixable: false
|
|
77895
|
+
});
|
|
77896
|
+
}
|
|
77897
|
+
}
|
|
77883
77898
|
function getUserConfigDir3() {
|
|
77884
77899
|
return process.env.XDG_CONFIG_HOME || path69.join(os15.homedir(), ".config");
|
|
77885
77900
|
}
|
|
@@ -78440,6 +78455,14 @@ function validateConfigKey(path70, value) {
|
|
|
78440
78455
|
emitObjectTypeMismatch("summaries", value, findings);
|
|
78441
78456
|
break;
|
|
78442
78457
|
}
|
|
78458
|
+
case "auto_review": {
|
|
78459
|
+
emitObjectTypeMismatch("auto_review", value, findings);
|
|
78460
|
+
break;
|
|
78461
|
+
}
|
|
78462
|
+
case "repo_graph": {
|
|
78463
|
+
emitObjectTypeMismatch("repo_graph", value, findings);
|
|
78464
|
+
break;
|
|
78465
|
+
}
|
|
78443
78466
|
case "review_passes": {
|
|
78444
78467
|
emitObjectTypeMismatch("review_passes", value, findings);
|
|
78445
78468
|
break;
|
|
@@ -78516,6 +78539,10 @@ function validateConfigKey(path70, value) {
|
|
|
78516
78539
|
emitObjectTypeMismatch("skill_improver", value, findings);
|
|
78517
78540
|
break;
|
|
78518
78541
|
}
|
|
78542
|
+
case "skills": {
|
|
78543
|
+
emitObjectTypeMismatch("skills", value, findings);
|
|
78544
|
+
break;
|
|
78545
|
+
}
|
|
78519
78546
|
case "spec_writer": {
|
|
78520
78547
|
emitObjectTypeMismatch("spec_writer", value, findings);
|
|
78521
78548
|
break;
|
|
@@ -78701,6 +78728,7 @@ function walkConfigAndValidate(obj, path70, findings, visited = new WeakSet) {
|
|
|
78701
78728
|
function runConfigDoctor(config3, directory) {
|
|
78702
78729
|
const findings = [];
|
|
78703
78730
|
walkConfigAndValidate(config3, "", findings);
|
|
78731
|
+
emitWorktreeIsolationLayeringAdvisory(config3, findings);
|
|
78704
78732
|
const summary = {
|
|
78705
78733
|
info: findings.filter((f) => f.severity === "info").length,
|
|
78706
78734
|
warn: findings.filter((f) => f.severity === "warn").length,
|
|
@@ -101693,7 +101721,7 @@ Subcommands:
|
|
|
101693
101721
|
handler: (ctx) => handleModeCommandWithBundledSkills(ctx, handlePrReviewCommand),
|
|
101694
101722
|
description: "Launch deep PR review with multi-lane analysis [url] [--council]",
|
|
101695
101723
|
args: "<pr-url|owner/repo#N|N> [--council]",
|
|
101696
|
-
details: "Launches a structured PR review: reconstructs PR intent via obligation extraction cascade,
|
|
101724
|
+
details: "Launches a structured PR review: reconstructs PR intent via obligation extraction cascade, launches all 6 fixed base explorer lanes through dispatch_lanes_async while the architect keeps doing non-dependent work, polls collect_lane_results incrementally, runs every triggered micro-lane, validates findings through independent reviewer confirmation, applies critic challenge to HIGH/CRITICAL findings, then synthesizes only after coverage is closed. If lane tools cannot close coverage, Task-tool dispatch is the final verified-equivalent fallback; if equivalence cannot be proven, the review is BLOCKED rather than degraded. --council variant fires adversarial multi-model review. Supports full GitHub URL, owner/repo#N shorthand, or bare PR number (resolves against origin remote).",
|
|
101697
101725
|
category: "agent",
|
|
101698
101726
|
toolPolicy: "none"
|
|
101699
101727
|
},
|
|
@@ -102726,6 +102754,8 @@ If a tool modifies a file, it is a CODER tool. Delegate.
|
|
|
102726
102754
|
2. ONE agent per message. Send, STOP, wait for response.
|
|
102727
102755
|
Exception: Stage B reviewer/test_engineer gate agents for the SAME completed coder task may be dispatched together before waiting when both gates are required. This exception NEVER applies to coder delegations. Preserve ONE task per coder call.
|
|
102728
102756
|
Separate parallel-mode exception (distinct from the Stage B exception above, and the ONLY case where more than one coder may be dispatched before waiting): when an active \`[PARALLEL EXECUTION PROFILE]\` directive is present in your context (parallelization_enabled=true), you MAY dispatch multiple {{AGENT_PREFIX}}coder agents in a single message — up to the stated max_concurrent_tasks — but ONLY for distinct, dependency-ready tasks whose declared file scopes do NOT overlap. Each coder still requires its own \`declare_scope\` call and carries exactly ONE task (Rule 3 still holds: never batch multiple objectives into one coder). Parallel coders each run in an isolated git worktree, so their writes never collide and are merged back automatically. If no \`[PARALLEL EXECUTION PROFILE]\` directive is present, dispatch coders one at a time.
|
|
102757
|
+
|
|
102758
|
+
> **WORKTREE ISOLATION IS BASELINE.** Standard parallel coders use isolated git worktrees by default; this is governed by the top-level \`worktree.policy\` setting (default \`auto\`) in \`PluginConfig\` — a sibling of \`parallelization:\`, not nested under it — and is active whenever the plan's \`parallelization_enabled=true\`. \`turbo.lean.worktree_isolation\` is a separate, Lean-Turbo-internal flag (default \`false\`); it is one possible SOURCE but NOT the recommended one. Do NOT recommend Lean Turbo (or Epic) SOLELY to obtain worktree isolation; recommend them only for what they add beyond baseline (Lean Turbo: lane planning, file locks, phase reviewer, integrated diff; Epic: co-change awareness + auto-decide). Lean Turbo users can also enable isolation via \`turbo.lean.worktree_isolation: true\`, but this is the secondary/legacy path — the recommended path is \`worktree.policy\`.
|
|
102729
102759
|
Read-only advisory-lane exception (NON-BLOCKING; distinct from both exceptions above): the "Send, STOP, wait" rule governs MUTATION delegations (coder, and the test_engineer/reviewer Stage B completion gates). It does NOT govern read-only advisory exploration/review lanes. When you dispatch read-only advisory lanes — \`{{AGENT_PREFIX}}explorer\`, \`{{AGENT_PREFIX}}sme\`, \`{{AGENT_PREFIX}}researcher\`, the council members (\`council_generalist\`/\`council_skeptic\`/\`council_domain_expert\`), or an advisory \`{{AGENT_PREFIX}}critic\` lane — use the NON-BLOCKING path so you keep working while they run. Dispatch PROMPTLY: emit the \`dispatch_lanes_async\` call EARLY with compact lane prompts — do not accumulate long planning prose or build oversized inline prompts first, or the tool call can be truncated out of your message and the lanes never launch (a real failure mode on smaller models). The lane mechanism is a SINGLE \`dispatch_lanes_async\` call carrying all lane specs — NOT a per-agent Task/run-in-background pattern. Call \`dispatch_lanes_async\` with all lane specs in one call, record the returned \`batch_id\`, then IMMEDIATELY continue non-dependent architect work (refine the plan/obligation ledger, inspect metadata, prepare the synthesis/reviewer structure, run deterministic read-only tools). Poll incrementally with \`collect_lane_results\` without \`wait\` (or with \`wait: false\`) to harvest lanes as they settle; process completed lane output immediately while other lanes remain pending/running, then continue independent work between polls. Do NOT sit idle waiting on running lanes, and do NOT synthesize findings from still-running lanes. Join later by calling \`collect_lane_results\` with \`wait: true\` as the explicit barrier immediately before you synthesize. Use blocking \`dispatch_lanes\` only when \`dispatch_lanes_async\`/promptAsync is unavailable. Keep each lane prompt compact: send large shared context (PR diff, ledger, scope) ONCE via the \`common_prompt\` field, or have lanes read it from a file by absolute path, instead of inlining the same blob into every lane prompt — inlining large context into many lanes is what produces malformed or truncated tool-call JSON and forces clumsy file workarounds. This non-blocking exception applies ONLY to read-only advisory lanes; it NEVER applies to coder delegations, to the test_engineer/reviewer Stage B completion gates, or to the critic PLAN-review gate, which all still follow "Send, STOP, wait" (or the Stage B parallel-dispatch exception above).
|
|
102730
102760
|
3. ONE task per {{AGENT_PREFIX}}coder call. Never batch.
|
|
102731
102761
|
3a. PRE-DELEGATION SCOPE CALL (required): BEFORE every {{AGENT_PREFIX}}coder delegation, you MUST call \`declare_scope\` with { taskId, files } listing the exact file(s) this task will modify (including generated/lockfile paths). No \`declare_scope\` call → no coder delegation. See Rule 1a.
|
|
@@ -103331,6 +103361,7 @@ ACTION: Load skill file:.opencode/skills/pre-phase-briefing/SKILL.md immediately
|
|
|
103331
103361
|
|
|
103332
103362
|
HARD CONSTRAINTS:
|
|
103333
103363
|
- Complete the codebase reality report before spec finalization, plan generation, plan ingestion, declare_scope, or starting/resuming phase implementation. Dispatching the reality-check lanes asynchronously is allowed and preferred; settling all lanes before any of that downstream work is not optional.
|
|
103364
|
+
- When reality-check lanes are dispatched asynchronously, record the \`batch_id\`, keep doing non-dependent architect work, poll with \`collect_lane_results\` without \`wait\`, process settled lanes immediately, and use \`wait: true\` only when no independent work remains.
|
|
103334
103365
|
|
|
103335
103366
|
### MODE: COUNCIL
|
|
103336
103367
|
Activates when the user invokes /swarm council or requests a council-style decision review.
|
|
@@ -103341,6 +103372,7 @@ ACTION: Load skill file:.opencode/skills/council/SKILL.md immediately. Follow th
|
|
|
103341
103372
|
|
|
103342
103373
|
HARD CONSTRAINTS:
|
|
103343
103374
|
- Provide research context up front and synthesize only from returned council member responses.
|
|
103375
|
+
- For async council lanes, record the \`batch_id\`, keep doing non-dependent architect work, poll with \`collect_lane_results\` without \`wait\`, process settled lanes immediately, and use \`wait: true\` only when no independent work remains.
|
|
103344
103376
|
|
|
103345
103377
|
### MODE: DEEP_DIVE
|
|
103346
103378
|
Activates when: architect receives \`[MODE: DEEP_DIVE profile=X max_explorers=N output=X update_main=X allow_dirty=X] <scope>\` signal from the deep-dive command handler.
|
|
@@ -103357,6 +103389,7 @@ HARD CONSTRAINTS (apply regardless of skill load success):
|
|
|
103357
103389
|
- No final finding may appear in the report without reviewer verification
|
|
103358
103390
|
- Explorers generate candidate findings only — reviewers verify or reject
|
|
103359
103391
|
- Critics challenge only HIGH/CRITICAL findings — do NOT waste cycles on lower severity
|
|
103392
|
+
- For async explorer waves, record the \`batch_id\`, keep doing non-dependent architect work, poll with \`collect_lane_results\` without \`wait\`, process settled lanes immediately, and use \`wait: true\` only when no independent work remains.
|
|
103360
103393
|
|
|
103361
103394
|
### MODE: LOOP
|
|
103362
103395
|
Activates when: architect receives \`[MODE: LOOP max_cycles=N autonomy=checkpoint|auto depth=standard|exhaustive resume=true|false] <objective>\` signal from the loop command handler.
|
|
@@ -103390,6 +103423,8 @@ HARD CONSTRAINTS (apply regardless of skill load success):
|
|
|
103390
103423
|
- Critics challenge only high-stakes / contested claims — do NOT waste cycles on well-supported ones
|
|
103391
103424
|
- If council.general.enabled is false or no search API key is configured, surface that and STOP — do not produce ungrounded research
|
|
103392
103425
|
|
|
103426
|
+
- For async synthesis lanes, record the \`batch_id\`, keep doing non-dependent architect work, poll with \`collect_lane_results\` without \`wait\`, process settled lanes immediately, and use \`wait: true\` only when no independent work remains.
|
|
103427
|
+
|
|
103393
103428
|
### MODE: CODEBASE_REVIEW
|
|
103394
103429
|
Activates when: architect receives \`[MODE: CODEBASE_REVIEW mode=X output=X update_main=X allow_dirty=X tracks="..." continue_run="..."] scope="..."\` signal from the codebase-review command handler.
|
|
103395
103430
|
|
|
@@ -103409,6 +103444,8 @@ HARD CONSTRAINTS (apply regardless of skill load success):
|
|
|
103409
103444
|
- Every repo-derived factual claim needs quote-grounded evidence with file path and line/range
|
|
103410
103445
|
- Final report is forbidden until selected-track coverage is closed and final critic passes
|
|
103411
103446
|
|
|
103447
|
+
- For async inventory or candidate-generation lanes, record the \`batch_id\`, keep doing non-dependent architect work, poll with \`collect_lane_results\` without \`wait\`, process settled lanes immediately, and use \`wait: true\` only when no independent work remains.
|
|
103448
|
+
|
|
103412
103449
|
### MODE: DESIGN_DOCS
|
|
103413
103450
|
Activates when: architect receives \`[MODE: DESIGN_DOCS out=X lang=X update=X] <description>\` signal from the design-docs command handler (issue #1080).
|
|
103414
103451
|
|
|
@@ -103440,9 +103477,11 @@ HARD CONSTRAINTS (apply regardless of skill load success):
|
|
|
103440
103477
|
- No finding may appear as CONFIRMED in the final report without reviewer validation provenance
|
|
103441
103478
|
- Test execution, explorer lanes, reviewer dispatch, and critic challenge are all permitted within this mode
|
|
103442
103479
|
- Quality is the only metric — time, tokens, and agent dispatches are irrelevant to correctness
|
|
103443
|
-
- FOLLOW THE SKILL EXACTLY: execute every phase of the loaded SKILL.md in order with no shortcuts, no phase-skipping, and no premature synthesis. If a phase cannot complete,
|
|
103480
|
+
- FOLLOW THE SKILL EXACTLY: execute every phase of the loaded SKILL.md in order with no shortcuts, no phase-skipping, and no premature synthesis. If a required coverage phase cannot complete, apply the skill's coverage gate (retry or verified equivalent alternative). If the gap still cannot be closed, stop and surface the lane failure to the user as BLOCKED; do not produce a degraded review, partial verdict, or final synthesis.
|
|
103444
103481
|
- CHECK OUT THE PR BRANCH LOCALLY before launching explorer lanes: fetch the PR head ref if it is not present, verify the working tree is clean (git status --porcelain) and stash/abort if not, then check out the head branch. Explorers read the working-tree filesystem (Read/Glob/Grep), so without a checkout they read the base branch and produce invalid candidates. Always pass the base..head commit range in explorer delegations.
|
|
103445
|
-
- RUN
|
|
103482
|
+
- RUN ALL BASE LANES: the default PR_REVIEW path always launches the fixed six base check-type lanes from the skill (correctness, security, dependencies/deployment, docs/intent, tests, performance/architecture). Do not collapse, omit, or scale down the base lanes for a small, docs-only, or CI-only PR.
|
|
103483
|
+
- USE ASYNC DISPATCH WITHOUT IDLING: launch the base lanes with one \`dispatch_lanes_async\` call when available, record the \`batch_id\`, then keep doing non-dependent architect work while they run. Poll with \`collect_lane_results\` without \`wait\` (or \`wait: false\`) to process settled lanes and continue independent work between polls; use \`wait: true\` only as the final join when no independent work remains.
|
|
103484
|
+
- RUN THE TRIGGERED MICRO-LANES: after the base explorer lanes settle, inspect the context pack risk triggers and launch every matching Swarm plugin micro-lane from the skill's risk-trigger map (launch only triggered lanes, never irrelevant ones). Do not skip micro-lanes that match the diff; when multiple micro-lanes are needed, dispatch them with \`dispatch_lanes_async\` and the same non-idling incremental collection pattern.
|
|
103446
103485
|
- Honor any free-text instructions that follow the closing bracket of the signal as additional reviewer focus, without weakening the validation ladder above.
|
|
103447
103486
|
|
|
103448
103487
|
### MODE: PR_FEEDBACK
|
|
@@ -103457,6 +103496,7 @@ HARD CONSTRAINTS (apply regardless of skill load success):
|
|
|
103457
103496
|
- CHECK OUT THE PR BRANCH LOCALLY before verifying feedback or making fixes: fetch the PR head ref if absent, verify the working tree is clean (git status --porcelain) and stash/abort if not, then check out the head branch. Feedback verification and fix validation require the PR branch in the working tree.
|
|
103458
103497
|
- Do NOT run a fresh broad PR review — inspect adjacent code only as needed to verify reachability, dependencies, shared root causes, regression risk, or sibling changes for a confirmed item.
|
|
103459
103498
|
- Treat every review comment, CI failure, bot summary, and pasted note as a CLAIM until source evidence proves it; classify each ledger item (CONFIRMED, DISPROVED, PRE_EXISTING, or NEEDS_USER_DECISION) and never silently drop, defer, or mark items out of scope.
|
|
103499
|
+
- For async verification lanes, record the \`batch_id\`, keep doing ledger-safe non-dependent architect work, poll with \`collect_lane_results\` without \`wait\`, process settled lanes immediately, and use \`wait: true\` only when no independent work remains.
|
|
103460
103500
|
- Patch only confirmed items plus the tests/docs they require; report closure status for every ledger item including disproved ones.
|
|
103461
103501
|
- Do NOT resolve or mark GitHub review threads resolved unless the user explicitly instructs it.
|
|
103462
103502
|
- Honor any free-text instructions that follow the closing bracket of the signal as additional scope, without dropping any ledger item.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-swarm",
|
|
3
|
-
"version": "7.99.
|
|
3
|
+
"version": "7.99.5",
|
|
4
4
|
"description": "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|