opencode-swarm 7.109.3 → 7.110.0

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.
@@ -6,7 +6,10 @@ description: >
6
6
  requested changes, CI/check failures, merge conflicts, stale PR branches, or
7
7
  PR follow-up work that must close all known issues without dropping findings.
8
8
  Supports multi-round bot reviews (the repository's bot posts a new review
9
- after every push) via the iterative pattern documented in the body.
9
+ after every push) via the iterative pattern documented in the body. Stage A
10
+ (structural pre-checks) and Stage B (reviewer + test_engineer) gates and the
11
+ reviewer + critic closeout gate are MANDATORY for any change made as part of
12
+ this process.
10
13
  ---
11
14
 
12
15
  # Swarm PR Feedback
@@ -16,6 +19,12 @@ Use this skill to close known PR feedback. This is not a fresh broad PR review.
16
19
  feedback surfaces, verifies each claim, clusters related problems, fixes confirmed
17
20
  issues, validates the branch, and reports closure status for every item.
18
21
 
22
+ **Mandatory gate contract.** Stage A (structural pre-checks) and Stage B
23
+ (reviewer + test_engineer) gates and the reviewer + critic closeout gate are
24
+ MANDATORY for any change made as part of this process. No fix lands, no closure
25
+ ledger row is marked FIXED, and no PR is published until all three gates pass on
26
+ the current diff. See "Mandatory Gates" below for the full protocol.
27
+
19
28
  When the work starts from a prior `swarm-pr-review` run, ingest the review's
20
29
  handoff artifact (for example
21
30
  `.swarm/pr-review/<run_id>/feedback-handoff.md` or `.json`) before triage.
@@ -188,11 +197,11 @@ tree:
188
197
  filesystem (`Read`/`Glob`/`Grep`), and fixes must land on the PR branch — without a
189
198
  checkout you would verify and patch the base branch's code instead. Record the
190
199
  `base_ref..head_ref` range for diff-scoped inspection.
191
- - Pass the `base_ref..head_ref` commit range in every read-only verification or
192
- explorer/advisory-lane delegation so lane agents can inspect specific revisions
193
- with `git show` when needed.
200
+ - Pass the `base_ref..head_ref` commit range in every read-only verification or
201
+ explorer/advisory-lane delegation so lane agents can inspect specific revisions
202
+ with `git show` when needed.
194
203
  - If no PR reference was provided (a pasted-feedback session on the current branch),
195
- confirm the current branch is the intended PR branch before editing.
204
+ confirm the current branch is the intended PR branch before editing.
196
205
 
197
206
  When a verification lane result includes `output_ref`, treat `output` as a
198
207
  preview and call `retrieve_lane_output` before using it to classify, resolve,
@@ -481,25 +490,85 @@ or compatibility policy, mark the item `NEEDS_USER_DECISION` and ask.
481
490
  and let the merge queue perform final current-base validation. Still resolve real
482
491
  merge conflicts and SHA-dependent review threads before queuing.
483
492
 
484
- ## Validation
493
+ ## Mandatory Gates
494
+
495
+ **Stage A and Stage B gates and the reviewer + critic closeout gate are
496
+ MANDATORY for any change made as part of the PR-feedback process.** No fix
497
+ lands, no closure ledger row is marked FIXED, and no PR is published until all
498
+ three gates pass on the current diff. This section uses the repository's
499
+ established Stage A/B meaning: Stage A = `pre_check_batch`-equivalent structural
500
+ pre-checks; Stage B = `reviewer` + `test_engineer` per-task gates (consistent
501
+ with `execute`, `plan`, `specify`, `brainstorm`, `docs/swarm-briefing.md`, and
502
+ `docs/council/README.md`).
503
+
504
+ If a gate failure is suspected pre-existing, prove it on the base branch or
505
+ label it `UNVERIFIED`. Do not call the branch green while required checks are
506
+ non-green.
507
+
508
+ ### Stage A — structural pre-checks (mandatory before Stage B)
509
+
510
+ Run for every changed surface. No "where relevant" — every PR-feedback change
511
+ runs these; if a surface is genuinely untouched, state that explicitly rather
512
+ than skipping silently.
513
+
514
+ - `bun run build` (or the repository's build command) — must succeed.
515
+ - typecheck — must pass.
516
+ - lint/format (e.g. `biome ci .`) — must pass.
517
+ - `git diff --check` — no whitespace or merge-marker errors.
518
+ - exact failing CI/test command reproduced locally when a ledger item is rooted
519
+ in a CI/test failure — the reproduction must fail on the pre-fix tree and pass
520
+ after the fix.
521
+
522
+ ### Stage B — reviewer + test_engineer (mandatory after Stage A passes)
523
+
524
+ Two independent agents on the Stage-A-green diff:
525
+
526
+ - **reviewer** — independent (fresh context, not the implementer, not a continued
527
+ conversation). Validates each fix on the current diff against the feedback
528
+ item it closes. Verdict per item: APPROVE / NEEDS_REVISION / BLOCKED.
529
+ - **test_engineer** — writes and runs the falsification probe or regression test
530
+ that proves each fix actually resolves its item (tests for changed behavior or
531
+ newly covered gaps). Verdict per item: PASS / FAIL / BLOCKED.
485
532
 
486
- Run targeted validation for every changed surface:
533
+ Address every NEEDS_REVISION / BLOCKED / FAIL, then re-run the affected agent on
534
+ the current diff.
487
535
 
488
- - exact failing CI/test command when reproducing a failure,
489
- - tests for changed behavior or newly covered gaps,
490
- - lint/format/typecheck/build where relevant,
491
- - `git diff --check`,
492
- - PR metadata checks after push: head SHA, check status, mergeability/conflicts,
493
- and unresolved feedback state.
536
+ ### Closeout gate reviewer + critic (mandatory after Stage B)
537
+
538
+ A *separate* reviewer + critic pair on the Stage-B-approved diff. This is the
539
+ swarm closeout contract (see `../swarm/SKILL.md` "Mandatory implementation
540
+ closeout gate"); because this skill edits code, docs, release notes, or skill files it applies in full — Stage B
541
+ alone does not satisfy it.
542
+
543
+ - **independent reviewer** (fresh context, separate from the Stage B reviewer)
544
+ → APPROVE / NEEDS_REVISION / BLOCKED per item.
545
+ - **final critic** (separate fresh context, not a continued conversation with
546
+ the reviewer, dispatched after the reviewer returns APPROVE) → APPROVE /
547
+ NEEDS_REVISION / BLOCKED per item. The critic challenges: is every original
548
+ feedback item actually resolved? Any requirement drift, weak evidence, missing
549
+ sibling-file checks, stale approvals, anything unwired or silently deferred?
550
+
551
+ Address every NEEDS_REVISION / BLOCKED item, re-review with the reviewer if the
552
+ critic surfaces correctness issues, then re-critic. **Any edit after the
553
+ reviewer's or critic's approval invalidates that approval** — re-run the
554
+ affected gate on the current diff before publishing.
555
+
556
+ Record both closeout verdicts (reviewer + critic, with HEAD/diff) in
557
+ `.claude/session/tasks/<slug>/gates.md` per the `durable-session-state` skill
558
+ (`.swarm/` is the plugin's runtime state — never write task artifacts there).
559
+
560
+ ### Post-publish verification (mandatory after the PR is pushed)
561
+
562
+ These checks run after the fix lands on the remote — they are NOT Stage A
563
+ pre-checks and must not be folded into Stage A.
564
+
565
+ - PR metadata checks after push: head SHA, check status,
566
+ mergeability/conflicts, and unresolved feedback state.
494
567
  - After conflict fixes, verify remote mergeability is clean (`MERGEABLE` /
495
568
  `CLEAN`), not only that local conflict markers disappeared.
496
569
  - For current-head CI, prefer run-level details when PR checks look stale:
497
570
  `gh run view <run-id> --json headSha,status,conclusion,jobs,url`.
498
571
 
499
- If a validation failure is suspected pre-existing, prove it on the base branch or
500
- label it `UNVERIFIED`. Do not call the branch green while required checks are
501
- non-green.
502
-
503
572
  ## Publishing And Communication
504
573
 
505
574
  After fixes, update the PR body or comment with a closure ledger:
@@ -12,8 +12,8 @@ import {
12
12
  shouldRunOnStartup,
13
13
  writeBackupArtifact,
14
14
  writeDoctorArtifact
15
- } from "./index-fm7xz1ne.js";
16
- import"./index-h4c4rrwx.js";
15
+ } from "./index-zjh648z4.js";
16
+ import"./index-18690p15.js";
17
17
  import"./index-bfwt3abw.js";
18
18
  import"./index-5e4e2hvv.js";
19
19
  import"./index-p0arc26j.js";
@@ -11,17 +11,17 @@ import {
11
11
  runCuratorInit,
12
12
  runCuratorPhase,
13
13
  writeCuratorSummary
14
- } from "./index-xyz8epk6.js";
15
- import"./index-wj4jeavn.js";
14
+ } from "./index-1mc2yfc2.js";
15
+ import"./index-d3txrx5q.js";
16
16
  import"./index-mtzjbaaa.js";
17
17
  import"./index-c8s9a3zh.js";
18
- import"./index-fm7xz1ne.js";
18
+ import"./index-zjh648z4.js";
19
19
  import"./index-j2v3w1ds.js";
20
20
  import"./index-scww5b77.js";
21
21
  import"./index-yw8qpf51.js";
22
22
  import"./index-85bacexr.js";
23
23
  import"./index-09xpycan.js";
24
- import"./index-h4c4rrwx.js";
24
+ import"./index-18690p15.js";
25
25
  import"./index-b15qbvph.js";
26
26
  import"./index-y5z2qdvk.js";
27
27
  import"./index-41fgssqr.js";
@@ -1,17 +1,17 @@
1
1
  // @bun
2
2
  import {
3
3
  createCuratorLLMDelegate
4
- } from "./index-xyz8epk6.js";
5
- import"./index-wj4jeavn.js";
4
+ } from "./index-1mc2yfc2.js";
5
+ import"./index-d3txrx5q.js";
6
6
  import"./index-mtzjbaaa.js";
7
7
  import"./index-c8s9a3zh.js";
8
- import"./index-fm7xz1ne.js";
8
+ import"./index-zjh648z4.js";
9
9
  import"./index-j2v3w1ds.js";
10
10
  import"./index-scww5b77.js";
11
11
  import"./index-yw8qpf51.js";
12
12
  import"./index-85bacexr.js";
13
13
  import"./index-09xpycan.js";
14
- import"./index-h4c4rrwx.js";
14
+ import"./index-18690p15.js";
15
15
  import"./index-b15qbvph.js";
16
16
  import"./index-y5z2qdvk.js";
17
17
  import"./index-41fgssqr.js";
@@ -1,18 +1,18 @@
1
1
  // @bun
2
2
  import {
3
3
  handleGuardrailExplain
4
- } from "./index-r9dbs4zr.js";
5
- import"./index-xyz8epk6.js";
6
- import"./index-wj4jeavn.js";
4
+ } from "./index-xhsba2sn.js";
5
+ import"./index-1mc2yfc2.js";
6
+ import"./index-d3txrx5q.js";
7
7
  import"./index-mtzjbaaa.js";
8
8
  import"./index-c8s9a3zh.js";
9
- import"./index-fm7xz1ne.js";
9
+ import"./index-zjh648z4.js";
10
10
  import"./index-j2v3w1ds.js";
11
11
  import"./index-scww5b77.js";
12
12
  import"./index-yw8qpf51.js";
13
13
  import"./index-85bacexr.js";
14
14
  import"./index-09xpycan.js";
15
- import"./index-h4c4rrwx.js";
15
+ import"./index-18690p15.js";
16
16
  import"./index-b15qbvph.js";
17
17
  import"./index-y5z2qdvk.js";
18
18
  import"./index-41fgssqr.js";
@@ -1,9 +1,9 @@
1
1
  // @bun
2
2
  import {
3
3
  handleGuardrailLog
4
- } from "./index-vx76tcxe.js";
5
- import"./index-wj4jeavn.js";
6
- import"./index-h4c4rrwx.js";
4
+ } from "./index-p5vm9gy9.js";
5
+ import"./index-d3txrx5q.js";
6
+ import"./index-18690p15.js";
7
7
  import"./index-bfwt3abw.js";
8
8
  import"./index-5e4e2hvv.js";
9
9
  import"./index-p0arc26j.js";
@@ -5,17 +5,17 @@ import {
5
5
  isHiveEligible,
6
6
  promoteFromSwarm,
7
7
  promoteToHive
8
- } from "./index-xyz8epk6.js";
9
- import"./index-wj4jeavn.js";
8
+ } from "./index-1mc2yfc2.js";
9
+ import"./index-d3txrx5q.js";
10
10
  import"./index-mtzjbaaa.js";
11
11
  import"./index-c8s9a3zh.js";
12
- import"./index-fm7xz1ne.js";
12
+ import"./index-zjh648z4.js";
13
13
  import"./index-j2v3w1ds.js";
14
14
  import"./index-scww5b77.js";
15
15
  import"./index-yw8qpf51.js";
16
16
  import"./index-85bacexr.js";
17
17
  import"./index-09xpycan.js";
18
- import"./index-h4c4rrwx.js";
18
+ import"./index-18690p15.js";
19
19
  import"./index-b15qbvph.js";
20
20
  import"./index-y5z2qdvk.js";
21
21
  import"./index-41fgssqr.js";
@@ -1126,6 +1126,27 @@ var QualityBudgetConfigSchema = GateFeatureSchema.extend({
1126
1126
  enforce_on_globs: exports_external.array(exports_external.string()).default(["src/**"]),
1127
1127
  exclude_globs: exports_external.array(exports_external.string()).default(["docs/**", "tests/**", "**/*.test.*"])
1128
1128
  });
1129
+ var GATE_CONFIG_KNOWN_SECTION_KEYS = {
1130
+ syntax_check: ["enabled"],
1131
+ placeholder_scan: [
1132
+ "enabled",
1133
+ "deny_patterns",
1134
+ "allow_globs",
1135
+ "max_allowed_findings"
1136
+ ],
1137
+ sast_scan: ["enabled"],
1138
+ sbom_generate: ["enabled"],
1139
+ build_check: ["enabled"],
1140
+ quality_budget: [
1141
+ "enabled",
1142
+ "max_complexity_delta",
1143
+ "max_public_api_delta",
1144
+ "max_duplication_ratio",
1145
+ "min_test_to_code_ratio",
1146
+ "enforce_on_globs",
1147
+ "exclude_globs"
1148
+ ]
1149
+ };
1129
1150
  var GateConfigSchema = exports_external.object({
1130
1151
  syntax_check: GateFeatureSchema.default({ enabled: true }),
1131
1152
  placeholder_scan: PlaceholderScanConfigSchema.default({
@@ -1154,7 +1175,7 @@ var GateConfigSchema = exports_external.object({
1154
1175
  sast_scan: GateFeatureSchema.default({ enabled: true }),
1155
1176
  sbom_generate: GateFeatureSchema.default({ enabled: true }),
1156
1177
  build_check: GateFeatureSchema.default({ enabled: true }),
1157
- quality_budget: QualityBudgetConfigSchema
1178
+ quality_budget: QualityBudgetConfigSchema.default(() => QualityBudgetConfigSchema.parse({}))
1158
1179
  });
1159
1180
  var PipelineConfigSchema = exports_external.object({
1160
1181
  parallel_precheck: exports_external.boolean().default(true)
@@ -2362,4 +2383,4 @@ var PluginConfigSchema = exports_external.object({
2362
2383
  skills: SkillsConfigSchema.optional()
2363
2384
  });
2364
2385
 
2365
- export { ORCHESTRATOR_NAME, ALL_SUBAGENT_NAMES, ALL_AGENT_NAMES, TOOL_NAMES, TOOL_NAME_SET, AGENT_TOOL_MAP, DEFAULT_AGENT_CONFIGS, _internals, isKnownCanonicalRole, getCanonicalAgentRole, resolveGeneratedAgentRole, stripKnownSwarmPrefix, AgentReasoningConfigSchema, AgentThinkingConfigSchema, AgentOverrideConfigSchema, SwarmConfigSchema, ModelPricingConfigSchema, PricingConfigSchema, HooksConfigSchema, ScoringWeightsSchema, DecisionDecaySchema, TokenRatiosSchema, ScoringConfigSchema, ContextBudgetConfigSchema, EvidenceConfigSchema, GateFeatureSchema, PlaceholderScanConfigSchema, QualityBudgetConfigSchema, GateConfigSchema, PipelineConfigSchema, PhaseCompleteConfigSchema, SummaryConfigSchema, ReviewPassesConfigSchema, AutoReviewConfigSchema, AdversarialDetectionConfigSchema, AdversarialTestingConfigSchema, IntegrationAnalysisConfigSchema, DocsConfigSchema, DesignDocsConfigSchema, UIReviewConfigSchema, CompactionAdvisoryConfigSchema, LintConfigSchema, SecretscanConfigSchema, GuardrailsProfileSchema, DEFAULT_AGENT_PROFILES, DEFAULT_ARCHITECT_PROFILE, GuardrailsConfigSchema, WatchdogConfigSchema, SelfReviewConfigSchema, resolveGuardrailsConfig, ToolFilterConfigSchema, PlanCursorConfigSchema, ContextMapConfigSchema, RepoGraphConfigSchema, CheckpointConfigSchema, AutomationModeSchema, AutomationCapabilitiesSchema, AutomationConfigSchema, KnowledgeConfigSchema, MemoryConfigSchema, CuratorConfigSchema, ArchitecturalSupervisionConfigSchema, KnowledgeApplicationConfigSchema, SkillPropagationConfigSchema, SkillImproverConfigSchema, SkillsConfigSchema, SpecWriterConfigSchema, SlopDetectorConfigSchema, IncrementalVerifyConfigSchema, CompactionConfigSchema, PrmConfigSchema, AgentAuthorityRuleSchema, AuthorityConfigSchema, GeneralCouncilConfigSchema, CouncilConfigSchema, PrMonitorConfigSchema, ParallelizationConfigSchema, WorktreeIsolationConfigSchema, LeanTurboConfigSchema, EpicConfigSchema, StandardTurboConfigSchema, LeanTurboStrategyConfigSchema, TurboConfigSchema, ExternalSkillCandidateSourceTypeSchema, ExternalSkillCandidateEvaluationVerdictSchema, DiscoverySourceSchema, ExternalSkillCandidateSchema, ExternalSkillsConfigSchema, DEFAULT_EXTERNAL_SKILLS_CONFIG, DEFAULT_SKILLS_CONFIG, resolveExternalSkillsConfig, PluginConfigSchema };
2386
+ export { ORCHESTRATOR_NAME, ALL_SUBAGENT_NAMES, ALL_AGENT_NAMES, TOOL_NAMES, TOOL_NAME_SET, AGENT_TOOL_MAP, DEFAULT_AGENT_CONFIGS, _internals, isKnownCanonicalRole, getCanonicalAgentRole, resolveGeneratedAgentRole, stripKnownSwarmPrefix, AgentReasoningConfigSchema, AgentThinkingConfigSchema, AgentOverrideConfigSchema, SwarmConfigSchema, ModelPricingConfigSchema, PricingConfigSchema, HooksConfigSchema, ScoringWeightsSchema, DecisionDecaySchema, TokenRatiosSchema, ScoringConfigSchema, ContextBudgetConfigSchema, EvidenceConfigSchema, GateFeatureSchema, PlaceholderScanConfigSchema, QualityBudgetConfigSchema, GATE_CONFIG_KNOWN_SECTION_KEYS, GateConfigSchema, PipelineConfigSchema, PhaseCompleteConfigSchema, SummaryConfigSchema, ReviewPassesConfigSchema, AutoReviewConfigSchema, AdversarialDetectionConfigSchema, AdversarialTestingConfigSchema, IntegrationAnalysisConfigSchema, DocsConfigSchema, DesignDocsConfigSchema, UIReviewConfigSchema, CompactionAdvisoryConfigSchema, LintConfigSchema, SecretscanConfigSchema, GuardrailsProfileSchema, DEFAULT_AGENT_PROFILES, DEFAULT_ARCHITECT_PROFILE, GuardrailsConfigSchema, WatchdogConfigSchema, SelfReviewConfigSchema, resolveGuardrailsConfig, ToolFilterConfigSchema, PlanCursorConfigSchema, ContextMapConfigSchema, RepoGraphConfigSchema, CheckpointConfigSchema, AutomationModeSchema, AutomationCapabilitiesSchema, AutomationConfigSchema, KnowledgeConfigSchema, MemoryConfigSchema, CuratorConfigSchema, ArchitecturalSupervisionConfigSchema, KnowledgeApplicationConfigSchema, SkillPropagationConfigSchema, SkillImproverConfigSchema, SkillsConfigSchema, SpecWriterConfigSchema, SlopDetectorConfigSchema, IncrementalVerifyConfigSchema, CompactionConfigSchema, PrmConfigSchema, AgentAuthorityRuleSchema, AuthorityConfigSchema, GeneralCouncilConfigSchema, CouncilConfigSchema, PrMonitorConfigSchema, ParallelizationConfigSchema, WorktreeIsolationConfigSchema, LeanTurboConfigSchema, EpicConfigSchema, StandardTurboConfigSchema, LeanTurboStrategyConfigSchema, TurboConfigSchema, ExternalSkillCandidateSourceTypeSchema, ExternalSkillCandidateEvaluationVerdictSchema, DiscoverySourceSchema, ExternalSkillCandidateSchema, ExternalSkillsConfigSchema, DEFAULT_EXTERNAL_SKILLS_CONFIG, DEFAULT_SKILLS_CONFIG, resolveExternalSkillsConfig, PluginConfigSchema };
@@ -10,7 +10,7 @@ import {
10
10
  readDoctorArtifact,
11
11
  removeStraySwarmDir,
12
12
  runConfigDoctor
13
- } from "./index-fm7xz1ne.js";
13
+ } from "./index-zjh648z4.js";
14
14
  import {
15
15
  MAX_TRANSIENT_RETRIES,
16
16
  PlanSchema,
@@ -85,6 +85,8 @@ import {
85
85
  AGENT_TOOL_MAP,
86
86
  ALL_SUBAGENT_NAMES,
87
87
  ExternalSkillsConfigSchema,
88
+ GATE_CONFIG_KNOWN_SECTION_KEYS,
89
+ GateConfigSchema,
88
90
  KnowledgeConfigSchema,
89
91
  ORCHESTRATOR_NAME,
90
92
  PluginConfigSchema,
@@ -94,7 +96,7 @@ import {
94
96
  getCanonicalAgentRole,
95
97
  resolveExternalSkillsConfig,
96
98
  stripKnownSwarmPrefix
97
- } from "./index-h4c4rrwx.js";
99
+ } from "./index-18690p15.js";
98
100
  import {
99
101
  DEFAULT_SKILL_MIN_CONFIDENCE,
100
102
  DEFAULT_SKILL_MIN_CONFIRMATIONS,
@@ -4859,6 +4861,62 @@ function sanitizeExternalSkillsConfig(raw) {
4859
4861
  delete cleaned.external_skills;
4860
4862
  return cleaned;
4861
4863
  }
4864
+ function sanitizeGatesConfig(raw) {
4865
+ if (!("gates" in raw) || raw.gates === undefined) {
4866
+ return raw;
4867
+ }
4868
+ if (typeof raw.gates !== "object" || raw.gates === null || Array.isArray(raw.gates)) {
4869
+ console.warn("[opencode-swarm] gates config validation failed: expected an object. Quality gates will use defaults; other config sections remain active.");
4870
+ const cleaned2 = { ...raw };
4871
+ delete cleaned2.gates;
4872
+ return cleaned2;
4873
+ }
4874
+ const gateSchemas = GateConfigSchema.shape;
4875
+ const cleanedGates = { ...raw.gates };
4876
+ for (const [key, value] of Object.entries(cleanedGates)) {
4877
+ const schema = gateSchemas[key];
4878
+ if (!schema) {
4879
+ console.warn(`[opencode-swarm] Unknown gates config section "gates.${key}" ignored. Other config sections remain active.`);
4880
+ delete cleanedGates[key];
4881
+ continue;
4882
+ }
4883
+ const knownFields = GATE_CONFIG_KNOWN_SECTION_KEYS[key];
4884
+ let sectionValue = value;
4885
+ if (knownFields && typeof value === "object" && value !== null && !Array.isArray(value)) {
4886
+ const cleanedSection = { ...value };
4887
+ const knownFieldSet = new Set(knownFields);
4888
+ for (const fieldName of Object.keys(cleanedSection)) {
4889
+ if (!knownFieldSet.has(fieldName)) {
4890
+ console.warn(`[opencode-swarm] Unknown gates config key "gates.${key}.${fieldName}" ignored. Other config sections remain active.`);
4891
+ delete cleanedSection[fieldName];
4892
+ }
4893
+ }
4894
+ sectionValue = cleanedSection;
4895
+ cleanedGates[key] = cleanedSection;
4896
+ }
4897
+ const sectionResult = schema.safeParse(sectionValue);
4898
+ if (!sectionResult.success) {
4899
+ console.warn(`[opencode-swarm] gates.${key} config validation failed; that gate section will use defaults and other config sections remain active:`);
4900
+ console.warn(sectionResult.error.format());
4901
+ delete cleanedGates[key];
4902
+ }
4903
+ }
4904
+ const gatesResult = GateConfigSchema.safeParse(cleanedGates);
4905
+ if (gatesResult.success) {
4906
+ return {
4907
+ ...raw,
4908
+ gates: gatesResult.data
4909
+ };
4910
+ }
4911
+ console.warn("[opencode-swarm] gates config validation failed after section cleanup; quality gates will use defaults and other config sections remain active:");
4912
+ console.warn(gatesResult.error.format());
4913
+ const cleaned = { ...raw };
4914
+ delete cleaned.gates;
4915
+ return cleaned;
4916
+ }
4917
+ function sanitizeSectionConfigs(raw) {
4918
+ return sanitizeGatesConfig(sanitizeExternalSkillsConfig(raw));
4919
+ }
4862
4920
  function rawFullAutoLocked(raw) {
4863
4921
  if (!raw || typeof raw !== "object")
4864
4922
  return false;
@@ -4889,11 +4947,11 @@ function loadPluginConfig(directory) {
4889
4947
  };
4890
4948
  }
4891
4949
  mergedRaw = migratePresetsConfig(mergedRaw);
4892
- mergedRaw = sanitizeExternalSkillsConfig(mergedRaw);
4950
+ mergedRaw = sanitizeSectionConfigs(mergedRaw);
4893
4951
  const result = PluginConfigSchema.safeParse(mergedRaw);
4894
4952
  if (!result.success) {
4895
4953
  if (rawUserConfig) {
4896
- const userParseResult = PluginConfigSchema.safeParse(sanitizeExternalSkillsConfig(rawUserConfig ?? {}));
4954
+ const userParseResult = PluginConfigSchema.safeParse(sanitizeSectionConfigs(rawUserConfig ?? {}));
4897
4955
  if (userParseResult.success) {
4898
4956
  console.warn("[opencode-swarm] Project config ignored due to validation errors. Using user config.");
4899
4957
  return userParseResult.data;
@@ -4950,8 +5008,10 @@ var BUNDLED_PROJECT_SKILLS = [
4950
5008
  "swarm-implement",
4951
5009
  "design-docs",
4952
5010
  "swarm-pr-review",
5011
+ "swarm",
4953
5012
  "swarm-pr-feedback",
4954
5013
  "swarm-pr-subscribe",
5014
+ "swarm-ci-monitor",
4955
5015
  "issue-ingest",
4956
5016
  "plan",
4957
5017
  "critic-gate",
@@ -7207,15 +7267,15 @@ var _internals7 = {
7207
7267
  executePostMortemActions,
7208
7268
  repairPostMortemActions,
7209
7269
  loadDefaultKnowledgeConfig: async () => {
7210
- const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-x17zmd03.js");
7270
+ const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-5vmb5dh8.js");
7211
7271
  return KnowledgeConfigSchema2.parse({});
7212
7272
  },
7213
7273
  applyCuratorKnowledgeUpdates: async (directory, recommendations, knowledgeConfig) => {
7214
- const { applyCuratorKnowledgeUpdates } = await import("./curator-9q3m25va.js");
7274
+ const { applyCuratorKnowledgeUpdates } = await import("./curator-4qqzpd85.js");
7215
7275
  return applyCuratorKnowledgeUpdates(directory, recommendations, knowledgeConfig);
7216
7276
  },
7217
7277
  checkHivePromotions: async (entries, knowledgeConfig) => {
7218
- const { checkHivePromotions } = await import("./hive-promoter-xnx734y3.js");
7278
+ const { checkHivePromotions } = await import("./hive-promoter-wvxqyayt.js");
7219
7279
  return checkHivePromotions(entries, knowledgeConfig);
7220
7280
  },
7221
7281
  applyProposalTriage: async (directory, triage) => {
@@ -14475,7 +14535,7 @@ async function runFinalizeStage(ctx) {
14475
14535
  }
14476
14536
  }
14477
14537
  try {
14478
- const { CuratorConfigSchema: CCS } = await import("./schema-x17zmd03.js");
14538
+ const { CuratorConfigSchema: CCS } = await import("./schema-5vmb5dh8.js");
14479
14539
  const { config: pmLoadedConfig } = _internals17.loadPluginConfigWithMeta(ctx.directory);
14480
14540
  const curatorCfg = CCS.parse(pmLoadedConfig.curator ?? {});
14481
14541
  if (curatorCfg.enabled && curatorCfg.postmortem_enabled) {
@@ -16588,9 +16648,9 @@ var _internals21 = {
16588
16648
  readSwarmFileAsync,
16589
16649
  loadCuratorDeps: async () => {
16590
16650
  const [{ CuratorConfigSchema }, curator, { createCuratorLLMDelegate: createCuratorLLMDelegate2 }] = await Promise.all([
16591
- import("./schema-x17zmd03.js"),
16592
- import("./curator-9q3m25va.js"),
16593
- import("./curator-llm-factory-78dyv010.js")
16651
+ import("./schema-5vmb5dh8.js"),
16652
+ import("./curator-4qqzpd85.js"),
16653
+ import("./curator-llm-factory-y4kvr1ph.js")
16594
16654
  ]);
16595
16655
  return { CuratorConfigSchema, curator, createCuratorLLMDelegate: createCuratorLLMDelegate2 };
16596
16656
  }
@@ -17086,7 +17146,7 @@ import { fileURLToPath } from "url";
17086
17146
  // package.json
17087
17147
  var package_default = {
17088
17148
  name: "opencode-swarm",
17089
- version: "7.109.3",
17149
+ version: "7.110.0",
17090
17150
  description: "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
17091
17151
  main: "dist/index.js",
17092
17152
  types: "dist/index.d.ts",
@@ -17141,8 +17201,10 @@ var package_default = {
17141
17201
  ".opencode/skills/swarm-implement",
17142
17202
  ".opencode/skills/design-docs",
17143
17203
  ".opencode/skills/swarm-pr-review",
17204
+ ".opencode/skills/swarm",
17144
17205
  ".opencode/skills/swarm-pr-feedback",
17145
17206
  ".opencode/skills/swarm-pr-subscribe",
17207
+ ".opencode/skills/swarm-ci-monitor",
17146
17208
  ".opencode/skills/issue-ingest",
17147
17209
  ".opencode/skills/plan",
17148
17210
  ".opencode/skills/critic-gate",
@@ -18536,7 +18598,7 @@ async function handleDoctorCommand(directory, args) {
18536
18598
  const result = runConfigDoctor(config, directory);
18537
18599
  let output;
18538
18600
  if (enableAutoFix && result.hasAutoFixableIssues) {
18539
- const { runConfigDoctorWithFixes } = await import("./config-doctor-q354tb2w.js");
18601
+ const { runConfigDoctorWithFixes } = await import("./config-doctor-9vjyj9m3.js");
18540
18602
  const fixResult = await runConfigDoctorWithFixes(directory, config, true);
18541
18603
  output = formatDoctorMarkdown(fixResult.result);
18542
18604
  } else {
@@ -31809,7 +31871,7 @@ function buildDetailedHelp(commandName, entry) {
31809
31871
  async function handleHelpCommand(ctx) {
31810
31872
  const targetCommand = ctx.args.join(" ");
31811
31873
  if (!targetCommand) {
31812
- const { buildHelpText } = await import("./index-3nd7bz90.js");
31874
+ const { buildHelpText } = await import("./index-khj0knr0.js");
31813
31875
  return buildHelpText();
31814
31876
  }
31815
31877
  const tokens = targetCommand.split(/\s+/);
@@ -31818,7 +31880,7 @@ async function handleHelpCommand(ctx) {
31818
31880
  return _internals46.buildDetailedHelp(resolved.key, resolved.entry);
31819
31881
  }
31820
31882
  const similar = _internals46.findSimilarCommands(targetCommand);
31821
- const { buildHelpText: fullHelp } = await import("./index-3nd7bz90.js");
31883
+ const { buildHelpText: fullHelp } = await import("./index-khj0knr0.js");
31822
31884
  if (similar.length > 0) {
31823
31885
  return `Command '/swarm ${targetCommand}' not found.
31824
31886
 
@@ -31951,7 +32013,7 @@ var COMMAND_REGISTRY = {
31951
32013
  },
31952
32014
  "guardrail explain": {
31953
32015
  handler: async (ctx) => {
31954
- const { handleGuardrailExplain } = await import("./guardrail-explain-csnawe0d.js");
32016
+ const { handleGuardrailExplain } = await import("./guardrail-explain-10hh57cr.js");
31955
32017
  return handleGuardrailExplain(ctx.directory, ctx.args);
31956
32018
  },
31957
32019
  description: "Dry-run: show what the guardrails would do to a command or write target (executes nothing)",
@@ -31961,7 +32023,7 @@ var COMMAND_REGISTRY = {
31961
32023
  },
31962
32024
  "guardrail-log": {
31963
32025
  handler: async (ctx) => {
31964
- const { handleGuardrailLog } = await import("./guardrail-log-8mqqsssq.js");
32026
+ const { handleGuardrailLog } = await import("./guardrail-log-5240bawg.js");
31965
32027
  return handleGuardrailLog(ctx.directory, ctx.args);
31966
32028
  },
31967
32029
  description: "Read the guardrail decision log (use --blocks-only for blocks)",
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  stripKnownSwarmPrefix
4
- } from "./index-h4c4rrwx.js";
4
+ } from "./index-18690p15.js";
5
5
  import {
6
6
  init_logger,
7
7
  warn
@@ -1,10 +1,10 @@
1
1
  // @bun
2
2
  import {
3
3
  handleGuardrailExplain
4
- } from "./index-r9dbs4zr.js";
4
+ } from "./index-xhsba2sn.js";
5
5
  import {
6
6
  handleGuardrailLog
7
- } from "./index-vx76tcxe.js";
7
+ } from "./index-p5vm9gy9.js";
8
8
  import {
9
9
  COMMAND_REGISTRY,
10
10
  SWARM_COMMAND_TOOL_ALLOWLIST,
@@ -80,11 +80,11 @@ import {
80
80
  handleWriteRetroCommand,
81
81
  normalizeSwarmCommandInput,
82
82
  resolveCommand
83
- } from "./index-xyz8epk6.js";
84
- import"./index-wj4jeavn.js";
83
+ } from "./index-1mc2yfc2.js";
84
+ import"./index-d3txrx5q.js";
85
85
  import"./index-mtzjbaaa.js";
86
86
  import"./index-c8s9a3zh.js";
87
- import"./index-fm7xz1ne.js";
87
+ import"./index-zjh648z4.js";
88
88
  import"./index-j2v3w1ds.js";
89
89
  import"./index-scww5b77.js";
90
90
  import"./index-yw8qpf51.js";
@@ -94,7 +94,7 @@ import {
94
94
  AGENT_TOOL_MAP,
95
95
  ORCHESTRATOR_NAME,
96
96
  stripKnownSwarmPrefix
97
- } from "./index-h4c4rrwx.js";
97
+ } from "./index-18690p15.js";
98
98
  import"./index-b15qbvph.js";
99
99
  import"./index-y5z2qdvk.js";
100
100
  import"./index-41fgssqr.js";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  redactPath,
4
4
  redactShellCommand
5
- } from "./index-wj4jeavn.js";
5
+ } from "./index-d3txrx5q.js";
6
6
 
7
7
  // src/services/guardrail-log-service.ts
8
8
  import * as fs from "fs/promises";
@@ -12,14 +12,14 @@ import {
12
12
  detectPosixWrites,
13
13
  detectWindowsWrites,
14
14
  resolveWriteTargets
15
- } from "./index-xyz8epk6.js";
15
+ } from "./index-1mc2yfc2.js";
16
16
  import {
17
17
  checkFileAuthority,
18
18
  classifyFile,
19
19
  isInDeclaredScope,
20
20
  redactPath,
21
21
  redactShellCommand
22
- } from "./index-wj4jeavn.js";
22
+ } from "./index-d3txrx5q.js";
23
23
 
24
24
  // src/services/guardrail-explain-service.ts
25
25
  import path from "path";