opencode-swarm 7.132.0 → 7.132.2

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 (46) hide show
  1. package/.opencode/skills/swarm-pr-feedback/SKILL.md +8 -0
  2. package/.opencode/skills/swarm-pr-review/SKILL.md +17 -5
  3. package/README.md +11 -2
  4. package/dist/cli/{config-doctor-3rssa871.js → config-doctor-bp5spb79.js} +2 -2
  5. package/dist/cli/{curation-policy-3914h3g9.js → curation-policy-7zp2m9gv.js} +2 -2
  6. package/dist/cli/{curator-1e77dq6x.js → curator-h067mrcc.js} +12 -12
  7. package/dist/cli/{curator-llm-factory-41c17ybs.js → curator-llm-factory-605d08hf.js} +12 -12
  8. package/dist/cli/{guardrail-explain-624brj1y.js → guardrail-explain-s7vzm6z7.js} +13 -13
  9. package/dist/cli/{guardrail-log-vfka4tcn.js → guardrail-log-aa112fxv.js} +3 -3
  10. package/dist/cli/{hive-promoter-mw5prfy2.js → hive-promoter-nv0m5rzk.js} +12 -12
  11. package/dist/cli/{index-6mcx76j9.js → index-3s9rfnqq.js} +4 -4
  12. package/dist/cli/{index-q0ysv66x.js → index-630badhp.js} +1 -1
  13. package/dist/cli/{index-zah4qws8.js → index-6ccynjv3.js} +2 -2
  14. package/dist/cli/{index-qg1cj1ev.js → index-8d3m0ge3.js} +14 -14
  15. package/dist/cli/{index-e630fw43.js → index-9cf1yr67.js} +3 -3
  16. package/dist/cli/{index-5x3g1q91.js → index-bvp2v7k1.js} +18 -4
  17. package/dist/cli/{index-sbq3gbjs.js → index-djwemsjn.js} +1 -1
  18. package/dist/cli/{index-8w3sp149.js → index-f6480ee6.js} +48 -39
  19. package/dist/cli/{index-64z5dvam.js → index-fgcmxjp7.js} +1 -1
  20. package/dist/cli/{index-nsxchdx0.js → index-jgfcp9bh.js} +1 -1
  21. package/dist/cli/{index-exs5bt14.js → index-jj4earrh.js} +1 -1
  22. package/dist/cli/{index-99tq1zd5.js → index-k4tmx21m.js} +2 -2
  23. package/dist/cli/{index-ppkp20fp.js → index-mwkwyej1.js} +5 -5
  24. package/dist/cli/{index-2dtwjx39.js → index-rt5jgktq.js} +1 -1
  25. package/dist/cli/{index-zrh07ykv.js → index-y5qp59rc.js} +2 -2
  26. package/dist/cli/{index-fegng5pv.js → index-yvv1wt2h.js} +1 -1
  27. package/dist/cli/index.js +12 -12
  28. package/dist/cli/{knowledge-escalator-5hv2dwhz.js → knowledge-escalator-j0nceas7.js} +3 -3
  29. package/dist/cli/{knowledge-events-434663dp.js → knowledge-events-gpqc62jr.js} +1 -1
  30. package/dist/cli/{knowledge-store-73ykq5j3.js → knowledge-store-ggxr3ww5.js} +1 -1
  31. package/dist/cli/{knowledge-validator-tnadtt1h.js → knowledge-validator-007smap6.js} +4 -4
  32. package/dist/cli/{scan-cursor-e33n9pej.js → scan-cursor-wz4bff7a.js} +2 -2
  33. package/dist/cli/{schema-1kwmcayk.js → schema-023gwne7.js} +1 -1
  34. package/dist/cli/{skill-generator-k111qfdw.js → skill-generator-rtsg1m7x.js} +5 -5
  35. package/dist/config/constants.d.ts +22 -0
  36. package/dist/hooks/guardrails/index.d.ts +32 -0
  37. package/dist/hooks/guardrails/messages-transform.d.ts +7 -0
  38. package/dist/hooks/guardrails.d.ts +1 -1
  39. package/dist/hooks/pr-workflow-gate.d.ts +2 -0
  40. package/dist/hooks/pr-workflow-response-gate.d.ts +44 -26
  41. package/dist/index.d.ts +13 -0
  42. package/dist/index.js +30 -30
  43. package/dist/tools/dispatch-lanes.d.ts +18 -0
  44. package/dist/tools/run-pr-feedback-stage-a.d.ts +2 -0
  45. package/dist/tools/tool-metadata.d.ts +4 -0
  46. package/package.json +1 -1
@@ -4,7 +4,7 @@ import {
4
4
  readDoctorArtifact,
5
5
  removeStraySwarmDir,
6
6
  runConfigDoctor
7
- } from "./index-q0ysv66x.js";
7
+ } from "./index-630badhp.js";
8
8
  import {
9
9
  EvaluationTaskV1Schema,
10
10
  GateAuditManifestV1Schema,
@@ -94,15 +94,15 @@ import {
94
94
  retireSkill,
95
95
  selectCandidateEntries,
96
96
  syncBundledProjectSkillsIfMissingAsync
97
- } from "./index-e630fw43.js";
97
+ } from "./index-9cf1yr67.js";
98
98
  import {
99
99
  readRecentEscalations
100
- } from "./index-ppkp20fp.js";
100
+ } from "./index-mwkwyej1.js";
101
101
  import {
102
102
  alreadyCuratedThisGeneration,
103
103
  claimNextScanBatch,
104
104
  resolveCohortId
105
- } from "./index-sbq3gbjs.js";
105
+ } from "./index-djwemsjn.js";
106
106
  import {
107
107
  CURATOR_INIT_PROMPT,
108
108
  CURATOR_PHASE_PROMPT,
@@ -135,11 +135,11 @@ import {
135
135
  validateActionability,
136
136
  validateActionableFields,
137
137
  validateLesson
138
- } from "./index-zah4qws8.js";
138
+ } from "./index-6ccynjv3.js";
139
139
  import {
140
140
  authorizeCuration,
141
141
  buildConfigFingerprintInput
142
- } from "./index-2dtwjx39.js";
142
+ } from "./index-rt5jgktq.js";
143
143
  import {
144
144
  cohortConfigFingerprint
145
145
  } from "./index-rtry5xyf.js";
@@ -172,7 +172,7 @@ import {
172
172
  transactFile,
173
173
  transactKnowledge,
174
174
  wordBigrams
175
- } from "./index-6mcx76j9.js";
175
+ } from "./index-3s9rfnqq.js";
176
176
  import {
177
177
  MAX_EVENT_LOG_ENTRIES,
178
178
  _internals,
@@ -182,7 +182,7 @@ import {
182
182
  recordHiveKnowledgeEvent,
183
183
  recordKnowledgeEvent,
184
184
  resolveKnowledgeEventsPath
185
- } from "./index-nsxchdx0.js";
185
+ } from "./index-jgfcp9bh.js";
186
186
  import {
187
187
  resolveHiveDataDir,
188
188
  resolveHiveEventsPath,
@@ -204,7 +204,7 @@ import {
204
204
  init_loader,
205
205
  loadPluginConfig,
206
206
  loadPluginConfigWithMeta
207
- } from "./index-exs5bt14.js";
207
+ } from "./index-jj4earrh.js";
208
208
  import {
209
209
  RetrospectiveEvidenceSchema
210
210
  } from "./index-k5jrywpr.js";
@@ -223,7 +223,7 @@ import {
223
223
  init_schema,
224
224
  init_tool_metadata,
225
225
  stripKnownSwarmPrefix
226
- } from "./index-5x3g1q91.js";
226
+ } from "./index-bvp2v7k1.js";
227
227
  import {
228
228
  KNOWLEDGE_SCHEMA_VERSION,
229
229
  OUTCOME_BLOCK_THRESHOLD,
@@ -703,6 +703,7 @@ var _test_exports = {
703
703
  resolveRemoteRefsContainingHeadAsync,
704
704
  parseCriticVerdict,
705
705
  isProcessAlive,
706
+ isSafeStandaloneGitCommit,
706
707
  rename: fsp.rename,
707
708
  nowMs: () => Date.now()
708
709
  };
@@ -721,8 +722,6 @@ var PR_WORKFLOW_SHARED_CONTROLLER_TOOLS = new Set([
721
722
  "collect_lane_results",
722
723
  "complete_pr_workflow",
723
724
  "dispatch_lanes_async",
724
- "get_async_result",
725
- "get_async_status",
726
725
  "prepare_pr_workflow_checkout"
727
726
  ]);
728
727
  var PR_REVIEW_CONTROLLER_TOOLS = new Set([
@@ -752,6 +751,16 @@ var PR_REVIEW_READ_ONLY_TOOL_NAMES = new Set([
752
751
  "webfetch",
753
752
  "websearch"
754
753
  ]);
754
+ function hasUnsafeShellControlSyntax(command) {
755
+ return /[;&|<>`\r\n]/.test(command) || /\$\(/.test(command);
756
+ }
757
+ function isSafeStandaloneGitCommit(command) {
758
+ if (hasUnsafeShellControlSyntax(command))
759
+ return false;
760
+ if (/(?:^|\s)--(?:allow-empty|amend)(?:\s|=|$)/i.test(command))
761
+ return false;
762
+ return /^[Gg][Ii][Tt](?:\s+-C(?:=|\s+)(?:"[^"\r\n]+"|'[^'\r\n]+'|[^\s;&|<>`]+))?\s+commit(?:\s+(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\s;&|<>`]+))*\s*$/.test(command.trim());
763
+ }
755
764
  function normalizePrHeadSha(prHeadSha) {
756
765
  const normalized = prHeadSha.trim();
757
766
  if (!normalized) {
@@ -13817,7 +13826,7 @@ function planMerges(active, threshold, maxComparisons, maxMerges) {
13817
13826
  };
13818
13827
  }
13819
13828
  async function sweepActiveNearDuplicates(directory, options = {}) {
13820
- const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-zrh07ykv.js");
13829
+ const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-y5qp59rc.js");
13821
13830
  const { config } = loadPluginConfigWithMeta2(directory);
13822
13831
  const sweepConfig = config.learning?.dedup_sweep;
13823
13832
  if (sweepConfig?.enabled === false)
@@ -15410,7 +15419,7 @@ async function runCuratorPhase(directory, phase, agentsDispatched, config, knowl
15410
15419
  }
15411
15420
  if (config.skill_generation_enabled === true && skillCandidates.length > 0) {
15412
15421
  try {
15413
- const skillModule = await import("./skill-generator-k111qfdw.js");
15422
+ const skillModule = await import("./skill-generator-rtsg1m7x.js");
15414
15423
  for (const cand of skillCandidates) {
15415
15424
  if (cand.confidence < (config.min_skill_confidence ?? DEFAULT_SKILL_MIN_CONFIDENCE)) {
15416
15425
  continue;
@@ -15811,7 +15820,7 @@ async function applyCuratorKnowledgeUpdates(directory, recommendations, knowledg
15811
15820
  } catch {}
15812
15821
  }
15813
15822
  if (contradictedEntries.length > 0 && knowledgeConfig.contradiction_threshold_action === "quarantine") {
15814
- const { maybeQuarantineOnContradiction } = await import("./knowledge-escalator-5hv2dwhz.js");
15823
+ const { maybeQuarantineOnContradiction } = await import("./knowledge-escalator-j0nceas7.js");
15815
15824
  for (const { id } of contradictedEntries) {
15816
15825
  try {
15817
15826
  await maybeQuarantineOnContradiction(directory, id, knowledgeConfig.contradiction_quarantine_threshold, knowledgeConfig.contradiction_quarantine_window_days);
@@ -16619,7 +16628,7 @@ async function runCuratorPostMortem(directory, options = {}) {
16619
16628
  warnings.push("Failed to collect knowledge summary.");
16620
16629
  }
16621
16630
  try {
16622
- const { getScanStatus } = await import("./scan-cursor-e33n9pej.js");
16631
+ const { getScanStatus } = await import("./scan-cursor-wz4bff7a.js");
16623
16632
  const scanStatus = await getScanStatus(directory);
16624
16633
  if (scanStatus.remaining_estimate > 0) {
16625
16634
  warnings.push(`Fair scan: reviewed ${knowledgeSummary.length} entries this sweep (generation ${scanStatus.generation}); ${scanStatus.remaining_estimate} more eligible entries will be visited in future curation sweeps.`);
@@ -16791,9 +16800,9 @@ var _internals22 = {
16791
16800
  verifyPostMortemKnowledgeActions,
16792
16801
  repairPostMortemActions,
16793
16802
  loadDefaultKnowledgeConfig: async (directory) => {
16794
- const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-1kwmcayk.js");
16803
+ const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-023gwne7.js");
16795
16804
  try {
16796
- const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-zrh07ykv.js");
16805
+ const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-y5qp59rc.js");
16797
16806
  const loaded = loadPluginConfigWithMeta2(directory);
16798
16807
  return KnowledgeConfigSchema2.parse(loaded.config.knowledge ?? {});
16799
16808
  } catch {
@@ -16801,11 +16810,11 @@ var _internals22 = {
16801
16810
  }
16802
16811
  },
16803
16812
  applyCuratorKnowledgeUpdates: async (directory, recommendations, knowledgeConfig, generation) => {
16804
- const { applyCuratorKnowledgeUpdates: applyCuratorKnowledgeUpdates2 } = await import("./curator-1e77dq6x.js");
16813
+ const { applyCuratorKnowledgeUpdates: applyCuratorKnowledgeUpdates2 } = await import("./curator-h067mrcc.js");
16805
16814
  return applyCuratorKnowledgeUpdates2(directory, recommendations, knowledgeConfig, generation);
16806
16815
  },
16807
16816
  checkHivePromotions: async (entries, knowledgeConfig, directory) => {
16808
- const { checkHivePromotions } = await import("./hive-promoter-mw5prfy2.js");
16817
+ const { checkHivePromotions } = await import("./hive-promoter-nv0m5rzk.js");
16809
16818
  return checkHivePromotions(entries, knowledgeConfig, directory);
16810
16819
  },
16811
16820
  applyProposalTriage: async (directory, triage) => {
@@ -16814,7 +16823,7 @@ var _internals22 = {
16814
16823
  activateProposal,
16815
16824
  listSkills: listSkills2,
16816
16825
  sanitizeSlug
16817
- } = await import("./skill-generator-k111qfdw.js");
16826
+ } = await import("./skill-generator-rtsg1m7x.js");
16818
16827
  const result = {
16819
16828
  approved: [],
16820
16829
  rejected: [],
@@ -19441,9 +19450,9 @@ function hashContent(content) {
19441
19450
  return createHash7("sha1").update(content).digest("hex");
19442
19451
  }
19443
19452
  async function loadConfigForPolicyCurator(directory) {
19444
- const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-1kwmcayk.js");
19453
+ const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-023gwne7.js");
19445
19454
  try {
19446
- const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-zrh07ykv.js");
19455
+ const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-y5qp59rc.js");
19447
19456
  const { config: loadedConfig } = loadPluginConfigWithMeta2(directory);
19448
19457
  return KnowledgeConfigSchema2.parse(loadedConfig.knowledge ?? {});
19449
19458
  } catch {
@@ -22788,7 +22797,7 @@ async function runFinalizeStage(ctx) {
22788
22797
  }
22789
22798
  }
22790
22799
  try {
22791
- const { CuratorConfigSchema: CCS } = await import("./schema-1kwmcayk.js");
22800
+ const { CuratorConfigSchema: CCS } = await import("./schema-023gwne7.js");
22792
22801
  const { config: pmLoadedConfig } = _internals32.loadPluginConfigWithMeta(ctx.directory);
22793
22802
  const curatorCfg = CCS.parse(pmLoadedConfig.curator ?? {});
22794
22803
  if (curatorCfg.enabled && curatorCfg.postmortem_enabled) {
@@ -24906,9 +24915,9 @@ var _internals36 = {
24906
24915
  loadPluginConfigWithMeta,
24907
24916
  loadCuratorDeps: async () => {
24908
24917
  const [{ CuratorConfigSchema }, curator, { createCuratorLLMDelegate: createCuratorLLMDelegate2 }] = await Promise.all([
24909
- import("./schema-1kwmcayk.js"),
24910
- import("./curator-1e77dq6x.js"),
24911
- import("./curator-llm-factory-41c17ybs.js")
24918
+ import("./schema-023gwne7.js"),
24919
+ import("./curator-h067mrcc.js"),
24920
+ import("./curator-llm-factory-605d08hf.js")
24912
24921
  ]);
24913
24922
  return { CuratorConfigSchema, curator, createCuratorLLMDelegate: createCuratorLLMDelegate2 };
24914
24923
  }
@@ -25413,7 +25422,7 @@ import { fileURLToPath } from "url";
25413
25422
  // package.json
25414
25423
  var package_default = {
25415
25424
  name: "opencode-swarm",
25416
- version: "7.132.0",
25425
+ version: "7.132.2",
25417
25426
  description: "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
25418
25427
  main: "dist/index.js",
25419
25428
  types: "dist/index.d.ts",
@@ -25935,7 +25944,7 @@ async function computeCurationDiagnostics(directory, entries) {
25935
25944
  let scanCompleted = false;
25936
25945
  let scanRemaining = 0;
25937
25946
  try {
25938
- const { getScanStatus } = await import("./scan-cursor-e33n9pej.js");
25947
+ const { getScanStatus } = await import("./scan-cursor-wz4bff7a.js");
25939
25948
  const status = await getScanStatus(directory);
25940
25949
  scanGeneration = status.generation;
25941
25950
  scanCompleted = status.completed;
@@ -25945,17 +25954,17 @@ async function computeCurationDiagnostics(directory, entries) {
25945
25954
  try {
25946
25955
  const { isLinked: isLinked2 } = await import("./knowledge-link-4yd2z8ev.js");
25947
25956
  if (isLinked2(directory)) {
25948
- const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-1kwmcayk.js");
25957
+ const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-023gwne7.js");
25949
25958
  let config;
25950
25959
  try {
25951
- const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-zrh07ykv.js");
25960
+ const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-y5qp59rc.js");
25952
25961
  const loaded = loadPluginConfigWithMeta2(directory);
25953
25962
  config = KnowledgeConfigSchema2.parse(loaded.config.knowledge ?? {});
25954
25963
  } catch {
25955
25964
  config = KnowledgeConfigSchema2.parse({});
25956
25965
  }
25957
25966
  const { cohortConfigFingerprint: cohortConfigFingerprint2 } = await import("./config-fingerprint-v22xh5a2.js");
25958
- const { buildConfigFingerprintInput: buildConfigFingerprintInput2, readCohortConfigFingerprint } = await import("./curation-policy-3914h3g9.js");
25967
+ const { buildConfigFingerprintInput: buildConfigFingerprintInput2, readCohortConfigFingerprint } = await import("./curation-policy-7zp2m9gv.js");
25959
25968
  const currentFp = cohortConfigFingerprint2(buildConfigFingerprintInput2(config));
25960
25969
  const cohortFp = await readCohortConfigFingerprint(directory);
25961
25970
  configMatch = cohortFp === null ? null : currentFp === cohortFp;
@@ -27153,7 +27162,7 @@ async function handleDoctorCommand(directory, args) {
27153
27162
  const result = runConfigDoctor(config, directory);
27154
27163
  let output;
27155
27164
  if (enableAutoFix && result.hasAutoFixableIssues) {
27156
- const { runConfigDoctorWithFixes } = await import("./config-doctor-3rssa871.js");
27165
+ const { runConfigDoctorWithFixes } = await import("./config-doctor-bp5spb79.js");
27157
27166
  const fixResult = await runConfigDoctorWithFixes(directory, config, true, {
27158
27167
  applyLossy: true
27159
27168
  });
@@ -45948,7 +45957,7 @@ function buildDetailedHelp(commandName, entry) {
45948
45957
  async function handleHelpCommand(ctx) {
45949
45958
  const targetCommand = ctx.args.join(" ");
45950
45959
  if (!targetCommand) {
45951
- const { buildHelpText } = await import("./index-qg1cj1ev.js");
45960
+ const { buildHelpText } = await import("./index-8d3m0ge3.js");
45952
45961
  return buildHelpText();
45953
45962
  }
45954
45963
  const tokens = targetCommand.split(/\s+/);
@@ -45957,7 +45966,7 @@ async function handleHelpCommand(ctx) {
45957
45966
  return _internals9.buildDetailedHelp(resolved.key, resolved.entry);
45958
45967
  }
45959
45968
  const similar = _internals9.findSimilarCommands(targetCommand);
45960
- const { buildHelpText: fullHelp } = await import("./index-qg1cj1ev.js");
45969
+ const { buildHelpText: fullHelp } = await import("./index-8d3m0ge3.js");
45961
45970
  if (similar.length > 0) {
45962
45971
  return `Command '/swarm ${targetCommand}' not found.
45963
45972
 
@@ -46096,7 +46105,7 @@ var COMMAND_REGISTRY = {
46096
46105
  },
46097
46106
  "guardrail explain": {
46098
46107
  handler: async (ctx) => {
46099
- const { handleGuardrailExplain } = await import("./guardrail-explain-624brj1y.js");
46108
+ const { handleGuardrailExplain } = await import("./guardrail-explain-s7vzm6z7.js");
46100
46109
  return handleGuardrailExplain(ctx.directory, ctx.args);
46101
46110
  },
46102
46111
  description: "Dry-run: show what the guardrails would do to a command or write target (executes nothing)",
@@ -46106,7 +46115,7 @@ var COMMAND_REGISTRY = {
46106
46115
  },
46107
46116
  "guardrail-explain": {
46108
46117
  handler: async (ctx) => {
46109
- const { handleGuardrailExplain } = await import("./guardrail-explain-624brj1y.js");
46118
+ const { handleGuardrailExplain } = await import("./guardrail-explain-s7vzm6z7.js");
46110
46119
  return handleGuardrailExplain(ctx.directory, ctx.args);
46111
46120
  },
46112
46121
  description: "Dry-run: show what the guardrails would do to a command or write target (executes nothing)",
@@ -46116,7 +46125,7 @@ var COMMAND_REGISTRY = {
46116
46125
  },
46117
46126
  "guardrail-log": {
46118
46127
  handler: async (ctx) => {
46119
- const { handleGuardrailLog } = await import("./guardrail-log-vfka4tcn.js");
46128
+ const { handleGuardrailLog } = await import("./guardrail-log-aa112fxv.js");
46120
46129
  return handleGuardrailLog(ctx.directory, ctx.args);
46121
46130
  },
46122
46131
  description: "Read the guardrail decision log (use --blocks-only for blocks)",
@@ -47167,7 +47176,7 @@ If a tool modifies a file, it is a CODER tool. Delegate.
47167
47176
  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 \u2014 up to the stated max_concurrent_tasks \u2014 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.
47168
47177
 
47169
47178
  > **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\` \u2014 a sibling of \`parallelization:\`, not nested under it \u2014 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 \u2014 the recommended path is \`worktree.policy\`.
47170
- 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 \u2014 \`{{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 \u2014 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 \u2014 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 \u2014 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 \u2014 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).
47179
+ 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 \u2014 \`{{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 \u2014 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 \u2014 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 \u2014 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. A settled lane's inline \`output\` is delivered only once: if you poll the same lane again after already receiving its output, the repeat poll returns \`output_omitted_repeat: true\` with no \`output\` (not a sign the result was lost) \u2014 use the accompanying \`output_ref\` with \`retrieve_lane_output\` if you need the text again, and do not re-dispatch the lane. 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 \u2014 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).
47171
47180
  3. ONE task per {{AGENT_PREFIX}}coder call. Never batch.
47172
47181
  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 \u2192 no coder delegation. See Rule 1a.
47173
47182
  3b. PRE-DELEGATION SCOPE CALL (test_engineer): BEFORE any {{AGENT_PREFIX}}test_engineer delegation that will CREATE or MODIFY test files, you MUST call \`declare_scope\` with { taskId, files } listing the exact test file path(s) to write. Omitting this call leaves the write scope undeclared and will block the write. See Rule 1a.
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  redactPath,
4
4
  redactShellCommand
5
- } from "./index-fegng5pv.js";
5
+ } from "./index-yvv1wt2h.js";
6
6
 
7
7
  // src/services/guardrail-log-service.ts
8
8
  import * as fs from "fs/promises";
@@ -608,7 +608,7 @@ async function applyKnowledgeVerdictFeedback(directory, options) {
608
608
  deltas.push({ id, delta });
609
609
  }
610
610
  if (deltas.length > 0) {
611
- const { bumpKnowledgeConfidenceBatch } = await import("./knowledge-store-73ykq5j3.js");
611
+ const { bumpKnowledgeConfidenceBatch } = await import("./knowledge-store-ggxr3ww5.js");
612
612
  await bumpKnowledgeConfidenceBatch(directory, deltas, options?.floorOptions);
613
613
  }
614
614
  return {
@@ -8,7 +8,7 @@ import {
8
8
  init_constants,
9
9
  init_schema,
10
10
  resolveExternalSkillsConfig
11
- } from "./index-5x3g1q91.js";
11
+ } from "./index-bvp2v7k1.js";
12
12
  import {
13
13
  advisoryWarn,
14
14
  init_warning_buffer
@@ -12,14 +12,14 @@ import {
12
12
  detectPosixWrites,
13
13
  detectWindowsWrites,
14
14
  resolveWriteTargets
15
- } from "./index-8w3sp149.js";
15
+ } from "./index-f6480ee6.js";
16
16
  import {
17
17
  checkFileAuthority,
18
18
  classifyFile,
19
19
  isInDeclaredScope,
20
20
  redactPath,
21
21
  redactShellCommand
22
- } from "./index-fegng5pv.js";
22
+ } from "./index-yvv1wt2h.js";
23
23
 
24
24
  // src/services/guardrail-explain-service.ts
25
25
  import path from "path";
@@ -6,13 +6,13 @@ import {
6
6
  resolveSwarmKnowledgePath,
7
7
  transactKnowledge,
8
8
  wordBigrams
9
- } from "./index-6mcx76j9.js";
9
+ } from "./index-3s9rfnqq.js";
10
10
  import {
11
11
  countEntryContradictionsInWindow,
12
12
  countEntryViolationsInWindow,
13
13
  readKnowledgeEvents,
14
14
  recordKnowledgeEvent
15
- } from "./index-nsxchdx0.js";
15
+ } from "./index-jgfcp9bh.js";
16
16
  import {
17
17
  init_knowledge_types,
18
18
  isActiveStatus
@@ -190,11 +190,11 @@ async function maybeQuarantineOnContradiction(directory, entryId, threshold, win
190
190
  alreadyInactive: true
191
191
  };
192
192
  }
193
- const { quarantineEntry } = await import("./knowledge-validator-tnadtt1h.js");
193
+ const { quarantineEntry } = await import("./knowledge-validator-007smap6.js");
194
194
  let policyConfig;
195
195
  try {
196
- const { KnowledgeConfigSchema } = await import("./schema-1kwmcayk.js");
197
- const { loadPluginConfigWithMeta } = await import("./index-zrh07ykv.js");
196
+ const { KnowledgeConfigSchema } = await import("./schema-023gwne7.js");
197
+ const { loadPluginConfigWithMeta } = await import("./index-y5qp59rc.js");
198
198
  const { config: loadedConfig } = loadPluginConfigWithMeta(directory);
199
199
  policyConfig = KnowledgeConfigSchema.parse(loadedConfig.knowledge ?? {});
200
200
  } catch {
@@ -4,7 +4,7 @@ import {
4
4
  } from "./index-rtry5xyf.js";
5
5
  import {
6
6
  readKnowledgeEvents
7
- } from "./index-nsxchdx0.js";
7
+ } from "./index-jgfcp9bh.js";
8
8
  import {
9
9
  isLinked,
10
10
  readLinkPointer,
@@ -7,7 +7,7 @@ import {
7
7
  loadPluginConfigWithMeta,
8
8
  loadPluginConfigWithMetaAsync,
9
9
  resolveWorktreeIsolationConfig
10
- } from "./index-exs5bt14.js";
10
+ } from "./index-jj4earrh.js";
11
11
  import {
12
12
  ApprovalEvidenceSchema,
13
13
  BaseEvidenceSchema,
@@ -59,7 +59,7 @@ import {
59
59
  WorktreeIsolationConfigSchema,
60
60
  isQAAgent,
61
61
  isSubagent
62
- } from "./index-5x3g1q91.js";
62
+ } from "./index-bvp2v7k1.js";
63
63
  import"./index-bk5tah7q.js";
64
64
  import {
65
65
  MigrationStatusSchema,
@@ -3,7 +3,7 @@ import {
3
3
  init_constants,
4
4
  init_schema,
5
5
  stripKnownSwarmPrefix
6
- } from "./index-5x3g1q91.js";
6
+ } from "./index-bvp2v7k1.js";
7
7
  import {
8
8
  init_logger,
9
9
  warn
package/dist/cli/index.js CHANGED
@@ -7,34 +7,34 @@ import {
7
7
  getPluginLockFilePaths,
8
8
  package_default,
9
9
  resolveCommand
10
- } from "./index-8w3sp149.js";
11
- import"./index-fegng5pv.js";
12
- import"./index-q0ysv66x.js";
10
+ } from "./index-f6480ee6.js";
11
+ import"./index-yvv1wt2h.js";
12
+ import"./index-630badhp.js";
13
13
  import"./index-03zyn94g.js";
14
14
  import"./index-4905hd2m.js";
15
15
  import"./index-134d35c1.js";
16
16
  import"./index-9f71ye47.js";
17
- import"./index-e630fw43.js";
18
- import"./index-ppkp20fp.js";
19
- import"./index-sbq3gbjs.js";
17
+ import"./index-9cf1yr67.js";
18
+ import"./index-mwkwyej1.js";
19
+ import"./index-djwemsjn.js";
20
20
  import"./index-vxv732ex.js";
21
21
  import"./index-c8s9a3zh.js";
22
22
  import"./index-9ss2m4rs.js";
23
23
  import"./index-g4mnf3p5.js";
24
- import"./index-zah4qws8.js";
25
- import"./index-2dtwjx39.js";
24
+ import"./index-6ccynjv3.js";
25
+ import"./index-rt5jgktq.js";
26
26
  import"./index-rtry5xyf.js";
27
- import"./index-6mcx76j9.js";
28
- import"./index-nsxchdx0.js";
27
+ import"./index-3s9rfnqq.js";
28
+ import"./index-jgfcp9bh.js";
29
29
  import"./index-ae75rja9.js";
30
30
  import"./index-q27bajqb.js";
31
- import"./index-exs5bt14.js";
31
+ import"./index-jj4earrh.js";
32
32
  import"./index-k5jrywpr.js";
33
33
  import"./index-n832052r.js";
34
34
  import {
35
35
  DEFAULT_AGENT_CONFIGS,
36
36
  init_constants
37
- } from "./index-5x3g1q91.js";
37
+ } from "./index-bvp2v7k1.js";
38
38
  import"./index-bk5tah7q.js";
39
39
  import"./index-8fwhhayc.js";
40
40
  import"./index-q1exe2b3.js";
@@ -8,9 +8,9 @@ import {
8
8
  maybeEscalateOnViolation,
9
9
  maybeQuarantineOnContradiction,
10
10
  readRecentEscalations
11
- } from "./index-ppkp20fp.js";
12
- import"./index-6mcx76j9.js";
13
- import"./index-nsxchdx0.js";
11
+ } from "./index-mwkwyej1.js";
12
+ import"./index-3s9rfnqq.js";
13
+ import"./index-jgfcp9bh.js";
14
14
  import"./index-ae75rja9.js";
15
15
  import"./index-q27bajqb.js";
16
16
  import"./index-bk5tah7q.js";
@@ -26,7 +26,7 @@ import {
26
26
  resolveKnowledgeCounterBaselinePath,
27
27
  resolveKnowledgeEventsPath,
28
28
  resolveLegacyApplicationLogPath
29
- } from "./index-nsxchdx0.js";
29
+ } from "./index-jgfcp9bh.js";
30
30
  import"./index-ae75rja9.js";
31
31
  import"./index-q27bajqb.js";
32
32
  import"./index-zgwm4ryv.js";
@@ -41,7 +41,7 @@ import {
41
41
  transactKnowledge,
42
42
  transactKnowledgeWithCas,
43
43
  wordBigrams
44
- } from "./index-6mcx76j9.js";
44
+ } from "./index-3s9rfnqq.js";
45
45
  import {
46
46
  resolveHiveDataDir
47
47
  } from "./index-ae75rja9.js";
@@ -23,11 +23,11 @@ import {
23
23
  validateLesson,
24
24
  validateSkillCandidatePath,
25
25
  validateSkillPath
26
- } from "./index-zah4qws8.js";
27
- import"./index-2dtwjx39.js";
26
+ } from "./index-6ccynjv3.js";
27
+ import"./index-rt5jgktq.js";
28
28
  import"./index-rtry5xyf.js";
29
- import"./index-6mcx76j9.js";
30
- import"./index-nsxchdx0.js";
29
+ import"./index-3s9rfnqq.js";
30
+ import"./index-jgfcp9bh.js";
31
31
  import"./index-ae75rja9.js";
32
32
  import"./index-q27bajqb.js";
33
33
  import"./index-bk5tah7q.js";
@@ -4,8 +4,8 @@ import {
4
4
  alreadyCuratedThisGeneration,
5
5
  claimNextScanBatch,
6
6
  getScanStatus
7
- } from "./index-sbq3gbjs.js";
8
- import"./index-6mcx76j9.js";
7
+ } from "./index-djwemsjn.js";
8
+ import"./index-3s9rfnqq.js";
9
9
  import"./index-ae75rja9.js";
10
10
  import"./index-q27bajqb.js";
11
11
  import"./index-bk5tah7q.js";
@@ -91,7 +91,7 @@ import {
91
91
  resolveGeneratedAgentRole,
92
92
  resolveGuardrailsConfig,
93
93
  stripKnownSwarmPrefix
94
- } from "./index-5x3g1q91.js";
94
+ } from "./index-bvp2v7k1.js";
95
95
  import"./index-bk5tah7q.js";
96
96
  import"./index-zjygnfay.js";
97
97
  import"./index-bpmtbmy9.js";
@@ -33,12 +33,12 @@ import {
33
33
  sanitizeSlug,
34
34
  selectCandidateEntries,
35
35
  writeEvalStub
36
- } from "./index-e630fw43.js";
37
- import"./index-zah4qws8.js";
38
- import"./index-2dtwjx39.js";
36
+ } from "./index-9cf1yr67.js";
37
+ import"./index-6ccynjv3.js";
38
+ import"./index-rt5jgktq.js";
39
39
  import"./index-rtry5xyf.js";
40
- import"./index-6mcx76j9.js";
41
- import"./index-nsxchdx0.js";
40
+ import"./index-3s9rfnqq.js";
41
+ import"./index-jgfcp9bh.js";
42
42
  import"./index-ae75rja9.js";
43
43
  import"./index-q27bajqb.js";
44
44
  import"./index-bk5tah7q.js";
@@ -30,6 +30,28 @@ export declare const SKILL_AGENT_TOOL_MAP: Partial<Record<AgentName, ToolName[]>
30
30
  */
31
31
  export declare const WRITE_TOOL_NAMES: readonly ["write", "edit", "patch", "apply_patch", "swarm_apply_patch", "create_file", "insert", "replace", "append", "prepend", "extract_code_blocks"];
32
32
  export type WriteToolName = (typeof WRITE_TOOL_NAMES)[number];
33
+ /**
34
+ * Single source of truth for tools that must NEVER have their output rewritten
35
+ * by the tool-output summarizer (tool-summarizer.ts) or the context-budget
36
+ * tool-output masker (context-budget.ts). Two independent admission reasons:
37
+ *
38
+ * (a) Retrieval tools (`retrieve_summary`, `retrieve_lane_output`, `task`,
39
+ * `read`) — rewriting their output would destroy the recovery mechanism
40
+ * itself, creating a retrieval loop where the summary/artifact gets
41
+ * summarized again.
42
+ * (b) Ref-carrying lane tools (`dispatch_lanes`, `dispatch_lanes_async`,
43
+ * `collect_lane_results`, `parse_lane_candidates`) — their payloads are
44
+ * already self-bounding AND carry the `output_ref`/structured rows that
45
+ * the PR-workflow gate requires to settle lanes. Rewriting them to a
46
+ * type-signature summary destroys the rows and the refs, so the gate
47
+ * can never settle and the model cannot recover.
48
+ *
49
+ * This list is a FLOOR, not a default: every consumer must treat these tool
50
+ * names as always exempt regardless of operator-supplied `exempt_tools`
51
+ * config — an operator narrowing `exempt_tools` must never be able to strip
52
+ * this floor.
53
+ */
54
+ export declare const SUMMARIZER_EXEMPT_TOOL_NAMES: readonly ["retrieve_summary", "retrieve_lane_output", "task", "read", "dispatch_lanes", "dispatch_lanes_async", "collect_lane_results", "parse_lane_candidates"];
33
55
  export declare const DEFAULT_MODELS: Record<string, string>;
34
56
  export declare const DEFAULT_AGENT_CONFIGS: Record<string, {
35
57
  model: string;