opencode-swarm 7.188.8 → 7.188.10

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 (82) hide show
  1. package/binaries/win32-arm64/swarm-sandbox-runner.exe +0 -0
  2. package/binaries/win32-x64/swarm-sandbox-runner.exe +0 -0
  3. package/dist/cli/{auto-checkpoint-cdcf7yeb.js → auto-checkpoint-c4nesm12.js} +5 -5
  4. package/dist/cli/{checkpoint-jpc3a69d.js → checkpoint-sfnz4843.js} +9 -9
  5. package/dist/cli/{coder-settlement-rmaypr7g.js → coder-settlement-y7wjm4w3.js} +3 -3
  6. package/dist/cli/{config-doctor-b5t9hrzb.js → config-doctor-d01gbn5x.js} +7 -7
  7. package/dist/cli/{core-ky5b3mh6.js → core-1ymsg83x.js} +1 -1
  8. package/dist/cli/{curator-bsafet3m.js → curator-5ynapye5.js} +27 -27
  9. package/dist/cli/{curator-drift-2dwkkykq.js → curator-drift-9tnm8jdz.js} +5 -5
  10. package/dist/cli/{curator-llm-factory-ajtxk3sm.js → curator-llm-factory-9z688c52.js} +27 -27
  11. package/dist/cli/{dispatch-qvcztbpf.js → dispatch-1pbmmj8z.js} +50 -225
  12. package/dist/cli/{doctor-knowledge-receipt-phase-id-mckkwm0c.js → doctor-knowledge-receipt-phase-id-tkkznw6t.js} +5 -5
  13. package/dist/cli/{evidence-summary-service-svrt4se9.js → evidence-summary-service-jsg0x7q1.js} +10 -10
  14. package/dist/cli/{gate-evidence-jcw4mvwr.js → gate-evidence-6r2qbk89.js} +2 -2
  15. package/dist/cli/{guardrail-explain-5j0cg165.js → guardrail-explain-7m0h7db3.js} +28 -28
  16. package/dist/cli/{guardrail-log-h6fc7rnv.js → guardrail-log-p6s1sbxh.js} +3 -3
  17. package/dist/cli/{guardrail-reset-kjmqnr5r.js → guardrail-reset-shvx8e8g.js} +27 -27
  18. package/dist/cli/{hive-promoter-edp5c7k2.js → hive-promoter-f5cd2d49.js} +27 -27
  19. package/dist/cli/{index-kwbgrb3y.js → index-14d4cyxj.js} +1 -1
  20. package/dist/cli/{index-chsaj89g.js → index-3ad6fs6v.js} +1 -1
  21. package/dist/cli/{index-r89wr177.js → index-3j27qc81.js} +1 -1
  22. package/dist/cli/{index-fbw4g7yh.js → index-53t4xt8f.js} +1 -1
  23. package/dist/cli/{index-d4vrpe06.js → index-562bdvys.js} +1 -1
  24. package/dist/cli/{index-8hf3rt47.js → index-6yrx7ggm.js} +4 -4
  25. package/dist/cli/{index-nyy3hpwg.js → index-7cxtwt5e.js} +6 -6
  26. package/dist/cli/{index-js2jykf9.js → index-8xxk1gv4.js} +1 -1
  27. package/dist/cli/{index-hsmvdecz.js → index-9cqw29er.js} +2 -2
  28. package/dist/cli/{index-b81wsm2s.js → index-b0jte72h.js} +1 -1
  29. package/dist/cli/{index-e69469z9.js → index-d7m9qhpe.js} +2 -2
  30. package/dist/cli/{index-qg3tx5az.js → index-drpz069k.js} +1 -1
  31. package/dist/cli/{index-f0kk9daj.js → index-e7t7b5xs.js} +3 -3
  32. package/dist/cli/{index-8gyt9j0a.js → index-gjjn069b.js} +1 -1
  33. package/dist/cli/{index-n8n94des.js → index-hjpspz6z.js} +27 -27
  34. package/dist/cli/{index-h93hm2ew.js → index-hxfsxkb8.js} +245 -177
  35. package/dist/cli/{index-wbjk8xq9.js → index-hzezk176.js} +2 -2
  36. package/dist/cli/{index-vx8a8w3b.js → index-j2vv0h13.js} +506 -211
  37. package/dist/cli/{index-11v15np0.js → index-jna86fsj.js} +2 -2
  38. package/dist/cli/{index-fqyd21v7.js → index-ks6s6pmk.js} +4 -4
  39. package/dist/cli/{index-vhqcqq73.js → index-mbqaxnsy.js} +1 -1
  40. package/dist/cli/{index-9m3pcjf2.js → index-n3h6rwpf.js} +2 -2
  41. package/dist/cli/{index-kbkk7vnh.js → index-pkhbd2t5.js} +2 -1
  42. package/dist/cli/{index-d1yjbjf9.js → index-qq95qr3b.js} +3 -3
  43. package/dist/cli/{index-pd9hkz4f.js → index-rpb18d3f.js} +3 -3
  44. package/dist/cli/{index-s55t0cdc.js → index-rrs4vj8e.js} +5 -5
  45. package/dist/cli/{index-kx0sr39t.js → index-scjtkt0e.js} +29 -29
  46. package/dist/cli/{index-0g7wya30.js → index-sjh07rja.js} +1 -1
  47. package/dist/cli/{index-gfqz06ra.js → index-tegqnetn.js} +2 -2
  48. package/dist/cli/{index-yyh5kegx.js → index-vz1ze26j.js} +1 -1
  49. package/dist/cli/{index-sarq27b9.js → index-w11m4vrb.js} +1 -1
  50. package/dist/cli/{index-mcnqpmw6.js → index-zwn2w04v.js} +2 -2
  51. package/dist/cli/index.js +28 -28
  52. package/dist/cli/{knowledge-escalator-ndsm1023.js → knowledge-escalator-rjwqcj4c.js} +8 -8
  53. package/dist/cli/{knowledge-events-pcbxvykz.js → knowledge-events-0f3tf23t.js} +6 -6
  54. package/dist/cli/{knowledge-store-00t92ypz.js → knowledge-store-azahpegn.js} +1 -1
  55. package/dist/cli/{knowledge-validator-f8mkzp37.js → knowledge-validator-9yvg7gn9.js} +2 -2
  56. package/dist/cli/{mcp-sawqgyk6.js → mcp-mxgxbdd2.js} +1 -1
  57. package/dist/cli/{model-preflight-7rrjh3wp.js → model-preflight-c9qb1630.js} +27 -27
  58. package/dist/cli/{pending-delegations-2161efex.js → pending-delegations-rm86drz1.js} +2 -2
  59. package/dist/cli/{pr-subscriptions-m47zghfv.js → pr-subscriptions-0y73v5dw.js} +1 -1
  60. package/dist/cli/{pr-workflow-gate-hmtae8gc.js → pr-workflow-gate-f1wr818p.js} +27 -27
  61. package/dist/cli/{scan-cursor-gdy1qjed.js → scan-cursor-abq3sdt6.js} +2 -2
  62. package/dist/cli/{schema-qaxjz2de.js → schema-0c4cddzy.js} +1 -1
  63. package/dist/cli/{scope-persistence-dnx61ybv.js → scope-persistence-f8ss7vna.js} +5 -5
  64. package/dist/cli/{server-6wmhhy81.js → server-bc0s1v3y.js} +27 -27
  65. package/dist/cli/{skill-generator-sgv3bdgt.js → skill-generator-2z0p2rjb.js} +9 -9
  66. package/dist/cli/{snapshot-coordination-init-qbtzxwga.js → snapshot-coordination-init-sn7red7a.js} +27 -27
  67. package/dist/cli/{speckit-checkoff-yepzgcmj.js → speckit-checkoff-t3pm0yn0.js} +3 -3
  68. package/dist/cli/{worktree-collision-ownership-cswsfrj6.js → worktree-collision-ownership-g14dwsby.js} +2 -2
  69. package/dist/cli/{worktree-isolation-vj7egepy.js → worktree-isolation-av55nenq.js} +27 -27
  70. package/dist/commands/recover.d.ts +1 -1
  71. package/dist/commands/registry.d.ts +1 -1
  72. package/dist/config/evidence-schema.d.ts +3 -0
  73. package/dist/index.js +208 -208
  74. package/dist/lang/backend.d.ts +7 -0
  75. package/dist/lang/backends/java.d.ts +39 -0
  76. package/dist/lang/default-backend.d.ts +40 -0
  77. package/dist/tools/build-check.d.ts +13 -0
  78. package/dist/tools/test-runner.d.ts +31 -1
  79. package/dist/utils/windows-batch.d.ts +58 -0
  80. package/dist/workflow/session-view.d.ts +47 -0
  81. package/dist/workflow/stage-a-repair.d.ts +1 -0
  82. package/package.json +1 -1
@@ -8,14 +8,14 @@ import {
8
8
  protectedRoots,
9
9
  redactDecisionLineForArchive,
10
10
  stableCanonicalStringify
11
- } from "./index-b81wsm2s.js";
11
+ } from "./index-b0jte72h.js";
12
12
  import {
13
13
  detectStraySwarmDirs,
14
14
  readDoctorArtifact,
15
15
  removeStraySwarmDir,
16
16
  resolvePlanParallelizationFlag,
17
17
  runConfigDoctor
18
- } from "./index-gfqz06ra.js";
18
+ } from "./index-tegqnetn.js";
19
19
  import {
20
20
  archiveEvidence,
21
21
  checkRequirementCoverage,
@@ -27,19 +27,27 @@ import {
27
27
  sanitizeTaskId,
28
28
  saveEvidence,
29
29
  validateProjectRoot
30
- } from "./index-9m3pcjf2.js";
30
+ } from "./index-n3h6rwpf.js";
31
31
  import {
32
32
  JAVA_SYMBOL_GRAMMAR,
33
33
  LANGUAGE_REGISTRY,
34
+ WINDOWS_BATCH_WRAPPER_EXTENSIONS,
34
35
  _internals as _internals3,
35
36
  _internals1 as _internals4,
37
+ buildGradleTestCommand,
38
+ buildMavenTestCommand,
36
39
  buildNativeTargetCommand,
40
+ buildPhpVendorCommand,
41
+ buildWindowsBatchCommand,
37
42
  getProfileForFile,
38
43
  isCommandAvailable,
44
+ isWindowsCommandInterpreterLaunch,
39
45
  maskCommentsAndLiterals,
40
46
  parseJavaImports,
41
- resolveLocalNodeTool
42
- } from "./index-vx8a8w3b.js";
47
+ resolveContainedWindowsBatchCommand,
48
+ resolveLocalNodeTool,
49
+ resolveMavenWrapperCommand
50
+ } from "./index-j2vv0h13.js";
43
51
  import {
44
52
  captureWorkingTreeFingerprint,
45
53
  createModelEvaluationExecutor,
@@ -81,7 +89,7 @@ import {
81
89
  alreadyCuratedThisGeneration,
82
90
  claimNextScanBatch,
83
91
  resolveCohortId
84
- } from "./index-0g7wya30.js";
92
+ } from "./index-sjh07rja.js";
85
93
  import {
86
94
  CURATOR_CONSOLIDATION_PROMPT,
87
95
  CURATOR_INIT_PROMPT,
@@ -100,13 +108,13 @@ import {
100
108
  getGroupCommitWriter,
101
109
  importLegacyJsonl,
102
110
  readPriorDriftReports
103
- } from "./index-fbw4g7yh.js";
111
+ } from "./index-53t4xt8f.js";
104
112
  import {
105
113
  assertNoUnsettledCoderDispatch,
106
114
  listCoderSettlementWalStates,
107
115
  recoverCoderSettlement,
108
116
  recoverStaleCoderSettlements
109
- } from "./index-f0kk9daj.js";
117
+ } from "./index-e7t7b5xs.js";
110
118
  import {
111
119
  BUNDLED_PROJECT_SKILL_ROOT,
112
120
  DEFAULT_SKILL_MIN_CONFIDENCE,
@@ -127,11 +135,11 @@ import {
127
135
  retireSkill,
128
136
  selectCandidateEntries,
129
137
  syncBundledProjectSkillsIfMissingAsync
130
- } from "./index-d1yjbjf9.js";
138
+ } from "./index-qq95qr3b.js";
131
139
  import {
132
140
  buildEscalationBriefing,
133
141
  readRecentEscalations
134
- } from "./index-nyy3hpwg.js";
142
+ } from "./index-7cxtwt5e.js";
135
143
  import {
136
144
  parsePorcelainV2Snapshot,
137
145
  resolveCommitCountSince,
@@ -211,7 +219,7 @@ import {
211
219
  resolveWorkingDirectory,
212
220
  swarmOverwriteCandidates,
213
221
  trackedDirtyCandidates
214
- } from "./index-pd9hkz4f.js";
222
+ } from "./index-rpb18d3f.js";
215
223
  import {
216
224
  MAX_TRANSIENT_RETRIES,
217
225
  PlanRecoverySupersededError,
@@ -238,7 +246,7 @@ import {
238
246
  transientBackoff,
239
247
  updateTaskStatus,
240
248
  withPlanLifecycleLock
241
- } from "./index-s55t0cdc.js";
249
+ } from "./index-rrs4vj8e.js";
242
250
  import {
243
251
  containsControlChars,
244
252
  containsPathTraversal,
@@ -254,7 +262,7 @@ import {
254
262
  resolveSpeckitProjection,
255
263
  validateSpeckit,
256
264
  writeProjectedSpecSync
257
- } from "./index-kwbgrb3y.js";
265
+ } from "./index-14d4cyxj.js";
258
266
  import {
259
267
  clearWorktreeMergeStatus,
260
268
  getAllWorktreeMergeFailures,
@@ -285,7 +293,7 @@ import {
285
293
  transitionTaskWorkflowEvidenceWithStatus,
286
294
  withTaskEvidenceTransaction,
287
295
  writeWorkflowWalFile
288
- } from "./index-qg3tx5az.js";
296
+ } from "./index-drpz069k.js";
289
297
  import {
290
298
  isPathUnderSwarmWorktreeBase,
291
299
  listLiveLaneOwners,
@@ -294,7 +302,7 @@ import {
294
302
  recordLiveLaneOwner,
295
303
  removeWorktree,
296
304
  resolveWorktreeBaseDir
297
- } from "./index-vhqcqq73.js";
305
+ } from "./index-mbqaxnsy.js";
298
306
  import {
299
307
  DEFAULT_STALE_DELEGATION_TIMEOUT_MS,
300
308
  DELEGATION_COMPACTION_HIGH_WATER_BYTES,
@@ -328,7 +336,7 @@ import {
328
336
  scanBackgroundCoderReservationsForAdmission,
329
337
  scanDelegationsForRecovery,
330
338
  sweepStaleDelegations
331
- } from "./index-js2jykf9.js";
339
+ } from "./index-8xxk1gv4.js";
332
340
  import {
333
341
  MAX_EVENT_LOG_ENTRIES,
334
342
  _internals,
@@ -340,7 +348,7 @@ import {
340
348
  recordHiveKnowledgeEvent,
341
349
  recordKnowledgeEvent,
342
350
  resolveKnowledgeEventsPath
343
- } from "./index-11v15np0.js";
351
+ } from "./index-jna86fsj.js";
344
352
  import {
345
353
  commitDisplayedMembership,
346
354
  commitEmptyRetrieval,
@@ -353,7 +361,7 @@ import {
353
361
  queryLiveMemberships,
354
362
  reconcilePhaseClose,
355
363
  recordPhaseCloseIntent
356
- } from "./index-mcnqpmw6.js";
364
+ } from "./index-zwn2w04v.js";
357
365
  import {
358
366
  sanitizeContextText
359
367
  } from "./index-m9zzj4ee.js";
@@ -384,7 +392,7 @@ import {
384
392
  validateActionableFields,
385
393
  validateLesson,
386
394
  validateSkillPath
387
- } from "./index-r89wr177.js";
395
+ } from "./index-3j27qc81.js";
388
396
  import {
389
397
  MAX_CURATION_PROPOSALS,
390
398
  authorizeCuration,
@@ -395,10 +403,10 @@ import {
395
403
  } from "./index-rtry5xyf.js";
396
404
  import {
397
405
  resolveWorktreeIsolationConfig
398
- } from "./index-wbjk8xq9.js";
406
+ } from "./index-hzezk176.js";
399
407
  import {
400
408
  RetrospectiveEvidenceSchema
401
- } from "./index-kbkk7vnh.js";
409
+ } from "./index-pkhbd2t5.js";
402
410
  import {
403
411
  MAX_PENDING_SCOPE_BINDINGS,
404
412
  canonicalWorkspaceIdentity,
@@ -407,7 +415,7 @@ import {
407
415
  clearScopeBindings,
408
416
  readAuthoritativeScopeBindingSet,
409
417
  readDeclaredScopeFilesFromBindings
410
- } from "./index-sarq27b9.js";
418
+ } from "./index-w11m4vrb.js";
411
419
  import {
412
420
  clearPlanLedgerForReset,
413
421
  computePlanStructureHash,
@@ -423,7 +431,7 @@ import {
423
431
  replayFromLedgerWithStatus,
424
432
  resolvePlanningProfile,
425
433
  takeSnapshotEvent
426
- } from "./index-e69469z9.js";
434
+ } from "./index-d7m9qhpe.js";
427
435
  import {
428
436
  CORE_EVENT_LOCKED,
429
437
  appendCoreEventSync,
@@ -512,7 +520,7 @@ import {
512
520
  transactFile,
513
521
  transactKnowledge,
514
522
  wordBigrams
515
- } from "./index-8hf3rt47.js";
523
+ } from "./index-6yrx7ggm.js";
516
524
  import {
517
525
  readTailJsonl,
518
526
  readTailJsonlDetailed,
@@ -593,7 +601,7 @@ import {
593
601
  loadGateOverrides,
594
602
  loadPluginConfig,
595
603
  loadPluginConfigWithMeta
596
- } from "./index-yyh5kegx.js";
604
+ } from "./index-vz1ze26j.js";
597
605
  import {
598
606
  addDeferredWarning,
599
607
  advisoryWarn,
@@ -625,7 +633,7 @@ import {
625
633
  resolveContextWindow,
626
634
  resolveGeneratedAgentRole,
627
635
  stripKnownSwarmPrefix
628
- } from "./index-d4vrpe06.js";
636
+ } from "./index-562bdvys.js";
629
637
  import {
630
638
  AGENT_TOOL_MAP,
631
639
  ALL_AGENT_NAMES,
@@ -3414,7 +3422,7 @@ async function importLegacyPrWorkflowGateStateIfNeeded(directory, sessionID, all
3414
3422
  return null;
3415
3423
  throw error2;
3416
3424
  }
3417
- const legacy = allowSalvagedImport ? (await (await import("./pr-workflow-gate-hmtae8gc.js")).readPrWorkflowGateStateForRecovery(directory, sessionID))?.state ?? null : await readPrWorkflowGateStateFileFromDisk(filePath, sessionID);
3425
+ const legacy = allowSalvagedImport ? (await (await import("./pr-workflow-gate-f1wr818p.js")).readPrWorkflowGateStateForRecovery(directory, sessionID))?.state ?? null : await readPrWorkflowGateStateFileFromDisk(filePath, sessionID);
3418
3426
  if (!legacy)
3419
3427
  return null;
3420
3428
  const namespace = workflowGateStateCoordinationNamespace(sessionID);
@@ -3501,7 +3509,7 @@ async function deleteStateWhileLocked(directory, sessionID, options = {}) {
3501
3509
  let recoveryState = null;
3502
3510
  if (!currentAuthoritative) {
3503
3511
  if (options.allowSalvagedRead) {
3504
- const { readPrWorkflowGateStateForRecovery } = await import("./pr-workflow-gate-hmtae8gc.js");
3512
+ const { readPrWorkflowGateStateForRecovery } = await import("./pr-workflow-gate-f1wr818p.js");
3505
3513
  recoveryState = (await readPrWorkflowGateStateForRecovery(directory, normalizedSessionID))?.state ?? null;
3506
3514
  }
3507
3515
  if (!recoveryState) {
@@ -15074,7 +15082,7 @@ function isLaneOwnedByCurrentSession(branchName, expectedSessionId) {
15074
15082
  return extracted === expectedSessionId;
15075
15083
  }
15076
15084
  async function inspectStandardWorktreeCollisionOwnership(identity) {
15077
- const collisionOwnership = await import("./worktree-collision-ownership-cswsfrj6.js");
15085
+ const collisionOwnership = await import("./worktree-collision-ownership-g14dwsby.js");
15078
15086
  return collisionOwnership.inspectStandardWorktreeCollisionOwnership(identity);
15079
15087
  }
15080
15088
  async function runRecoveryGit(directory, args, timeoutMs = 15000) {
@@ -15500,7 +15508,7 @@ async function precreateStandardWorktreeSession(args) {
15500
15508
  const laneProfile = computeLaneRuntimeProfile(worktreeConfig.runtime_isolation, laneIndex, handle.worktreePath);
15501
15509
  if (laneProfile) {
15502
15510
  try {
15503
- const { writeLaneProfileToDiskReal } = await import("./core-ky5b3mh6.js");
15511
+ const { writeLaneProfileToDiskReal } = await import("./core-1ymsg83x.js");
15504
15512
  await writeLaneProfileToDiskReal(handle.worktreePath, laneProfile.laneIndex, laneProfile.envOverrides);
15505
15513
  } catch {}
15506
15514
  }
@@ -16479,7 +16487,7 @@ async function finishStandardWorktreeDispatch(directory, dispatch, config, callI
16479
16487
  }
16480
16488
  clearWorktreeMergeStatus(statusKey);
16481
16489
  try {
16482
- const { removeLaneProfileFromDiskReal } = await import("./core-ky5b3mh6.js");
16490
+ const { removeLaneProfileFromDiskReal } = await import("./core-1ymsg83x.js");
16483
16491
  await removeLaneProfileFromDiskReal(dispatch.handle.worktreePath, dispatch.laneIndex);
16484
16492
  } catch {}
16485
16493
  const state = serializationStateBySessionID.get(dispatch.parentSessionID);
@@ -24117,7 +24125,7 @@ function clearCriticalShownIds(sessionID) {
24117
24125
  async function rehydratePrSubscriptions(sessionID, directory) {
24118
24126
  const map = new Map;
24119
24127
  try {
24120
- const { listActive: listActive2 } = await import("./pr-subscriptions-m47zghfv.js");
24128
+ const { listActive: listActive2 } = await import("./pr-subscriptions-0y73v5dw.js");
24121
24129
  const records = await listActive2(directory);
24122
24130
  for (const record of records) {
24123
24131
  if (record.sessionID !== sessionID)
@@ -40664,9 +40672,9 @@ function hashContent(content) {
40664
40672
  return createHash27("sha1").update(content).digest("hex");
40665
40673
  }
40666
40674
  async function loadConfigForPolicyCurator(directory) {
40667
- const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-qaxjz2de.js");
40675
+ const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-0c4cddzy.js");
40668
40676
  try {
40669
- const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-fqyd21v7.js");
40677
+ const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-ks6s6pmk.js");
40670
40678
  const { config: loadedConfig } = loadPluginConfigWithMeta2(directory);
40671
40679
  return KnowledgeConfigSchema2.parse(loadedConfig.knowledge ?? {});
40672
40680
  } catch {
@@ -43724,7 +43732,7 @@ async function resolveCuratorLLMDelegate(directory, mode, sessionId) {
43724
43732
  const seam = _internals38.createCuratorLLMDelegate;
43725
43733
  if (seam)
43726
43734
  return seam(directory, mode, sessionId);
43727
- const { createCuratorLLMDelegate } = await import("./curator-llm-factory-ajtxk3sm.js");
43735
+ const { createCuratorLLMDelegate } = await import("./curator-llm-factory-9z688c52.js");
43728
43736
  return createCuratorLLMDelegate(directory, mode, sessionId);
43729
43737
  }
43730
43738
  async function reconcileCloseTerminalStateForPlan(directory, targetPlan, options) {
@@ -44119,7 +44127,7 @@ async function runFinalizeStage(ctx) {
44119
44127
  }
44120
44128
  }
44121
44129
  try {
44122
- const { CuratorConfigSchema: CCS } = await import("./schema-qaxjz2de.js");
44130
+ const { CuratorConfigSchema: CCS } = await import("./schema-0c4cddzy.js");
44123
44131
  const { config: pmLoadedConfig } = _internals38.loadPluginConfigWithMeta(ctx.directory);
44124
44132
  const curatorCfg = CCS.parse(pmLoadedConfig.curator ?? {});
44125
44133
  if (curatorCfg.enabled && curatorCfg.postmortem_enabled) {
@@ -46356,7 +46364,7 @@ function serializeAgentSession(s) {
46356
46364
  }
46357
46365
  async function writeSnapshot(directory, state) {
46358
46366
  try {
46359
- const { ensureSnapshotCoordinationReady } = await import("./snapshot-coordination-init-qbtzxwga.js");
46367
+ const { ensureSnapshotCoordinationReady } = await import("./snapshot-coordination-init-sn7red7a.js");
46360
46368
  await ensureSnapshotCoordinationReady(directory);
46361
46369
  const snapshot = {
46362
46370
  version: 3,
@@ -49366,7 +49374,7 @@ function planMerges(active, threshold, maxComparisons, maxMerges) {
49366
49374
  };
49367
49375
  }
49368
49376
  async function sweepActiveNearDuplicates(directory, options = {}) {
49369
- const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-fqyd21v7.js");
49377
+ const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-ks6s6pmk.js");
49370
49378
  const { config } = loadPluginConfigWithMeta2(directory);
49371
49379
  const sweepConfig = config.learning?.dedup_sweep;
49372
49380
  if (sweepConfig?.enabled === false)
@@ -50490,7 +50498,7 @@ async function runCuratorPhase(directory, phase, agentsDispatched, config, knowl
50490
50498
  }
50491
50499
  if (config.skill_generation_enabled === true && skillCandidates.length > 0) {
50492
50500
  try {
50493
- const skillModule = await import("./skill-generator-sgv3bdgt.js");
50501
+ const skillModule = await import("./skill-generator-2z0p2rjb.js");
50494
50502
  for (const cand of skillCandidates) {
50495
50503
  if (cand.confidence < (config.min_skill_confidence ?? DEFAULT_SKILL_MIN_CONFIDENCE)) {
50496
50504
  continue;
@@ -50962,7 +50970,7 @@ async function applyCuratorKnowledgeUpdates(directory, recommendations, knowledg
50962
50970
  } catch {}
50963
50971
  }
50964
50972
  if (contradictedEntries.length > 0 && knowledgeConfig.contradiction_threshold_action === "quarantine") {
50965
- const { maybeQuarantineOnContradiction } = await import("./knowledge-escalator-ndsm1023.js");
50973
+ const { maybeQuarantineOnContradiction } = await import("./knowledge-escalator-rjwqcj4c.js");
50966
50974
  for (const { id } of contradictedEntries) {
50967
50975
  try {
50968
50976
  await maybeQuarantineOnContradiction(directory, id, knowledgeConfig.contradiction_quarantine_threshold, knowledgeConfig.contradiction_quarantine_window_days);
@@ -51794,7 +51802,7 @@ async function runCuratorPostMortem(directory, options = {}) {
51794
51802
  warnings.push("Failed to collect knowledge summary.");
51795
51803
  }
51796
51804
  try {
51797
- const { getScanStatus } = await import("./scan-cursor-gdy1qjed.js");
51805
+ const { getScanStatus } = await import("./scan-cursor-abq3sdt6.js");
51798
51806
  const scanStatus = await getScanStatus(directory);
51799
51807
  if (scanStatus.remaining_estimate > 0) {
51800
51808
  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.`);
@@ -51966,9 +51974,9 @@ var _internals56 = {
51966
51974
  verifyPostMortemKnowledgeActions,
51967
51975
  repairPostMortemActions,
51968
51976
  loadDefaultKnowledgeConfig: async (directory) => {
51969
- const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-qaxjz2de.js");
51977
+ const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-0c4cddzy.js");
51970
51978
  try {
51971
- const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-fqyd21v7.js");
51979
+ const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-ks6s6pmk.js");
51972
51980
  const loaded = loadPluginConfigWithMeta2(directory);
51973
51981
  return KnowledgeConfigSchema2.parse(loaded.config.knowledge ?? {});
51974
51982
  } catch {
@@ -51976,11 +51984,11 @@ var _internals56 = {
51976
51984
  }
51977
51985
  },
51978
51986
  applyCuratorKnowledgeUpdates: async (directory, recommendations, knowledgeConfig, generation) => {
51979
- const { applyCuratorKnowledgeUpdates: applyCuratorKnowledgeUpdates2 } = await import("./curator-bsafet3m.js");
51987
+ const { applyCuratorKnowledgeUpdates: applyCuratorKnowledgeUpdates2 } = await import("./curator-5ynapye5.js");
51980
51988
  return applyCuratorKnowledgeUpdates2(directory, recommendations, knowledgeConfig, generation);
51981
51989
  },
51982
51990
  checkHivePromotions: async (entries2, knowledgeConfig, directory) => {
51983
- const { checkHivePromotions } = await import("./hive-promoter-edp5c7k2.js");
51991
+ const { checkHivePromotions } = await import("./hive-promoter-f5cd2d49.js");
51984
51992
  return checkHivePromotions(entries2, knowledgeConfig, directory);
51985
51993
  },
51986
51994
  applyProposalTriage: async (directory, triage) => {
@@ -51989,7 +51997,7 @@ var _internals56 = {
51989
51997
  activateProposal,
51990
51998
  listSkills: listSkills2,
51991
51999
  sanitizeSlug
51992
- } = await import("./skill-generator-sgv3bdgt.js");
52000
+ } = await import("./skill-generator-2z0p2rjb.js");
51993
52001
  const result = {
51994
52002
  approved: [],
51995
52003
  rejected: [],
@@ -52031,7 +52039,7 @@ var _internals56 = {
52031
52039
  return result;
52032
52040
  },
52033
52041
  readPriorDriftReports: async (directory) => {
52034
- const { readPriorDriftReports: readPriorDriftReports2 } = await import("./curator-drift-2dwkkykq.js");
52042
+ const { readPriorDriftReports: readPriorDriftReports2 } = await import("./curator-drift-9tnm8jdz.js");
52035
52043
  return readPriorDriftReports2(directory);
52036
52044
  },
52037
52045
  readSwarmKnowledge: (directory) => readKnowledge(resolveSwarmKnowledgePath(directory))
@@ -61834,9 +61842,9 @@ var _internals66 = {
61834
61842
  loadPluginConfigWithMeta,
61835
61843
  loadCuratorDeps: async () => {
61836
61844
  const [{ CuratorConfigSchema }, curator, { createCuratorLLMDelegate }] = await Promise.all([
61837
- import("./schema-qaxjz2de.js"),
61838
- import("./curator-bsafet3m.js"),
61839
- import("./curator-llm-factory-ajtxk3sm.js")
61845
+ import("./schema-0c4cddzy.js"),
61846
+ import("./curator-5ynapye5.js"),
61847
+ import("./curator-llm-factory-9z688c52.js")
61840
61848
  ]);
61841
61849
  return { CuratorConfigSchema, curator, createCuratorLLMDelegate };
61842
61850
  }
@@ -63522,6 +63530,33 @@ import { readdir as readdir5 } from "fs/promises";
63522
63530
  init_path_identity();
63523
63531
  init_logger();
63524
63532
 
63533
+ // src/workflow/session-view.ts
63534
+ function applySessionWorkflowView(session, taskId, workflow) {
63535
+ session.taskWorkflowStates.set(taskId, workflow.state);
63536
+ session.stageBCompletion?.delete(taskId);
63537
+ session.taskCouncilApproved?.delete(taskId);
63538
+ session.taskCouncilWorkflowGeneration?.delete(taskId);
63539
+ updateTaskWorkflowCache(session, taskId, workflow);
63540
+ }
63541
+ var STAGE_A_RECOVERED_STATES = [
63542
+ "pre_check_passed",
63543
+ "reviewer_run",
63544
+ "tests_run"
63545
+ ];
63546
+ function isStageARecoveredState(state) {
63547
+ return STAGE_A_RECOVERED_STATES.includes(state);
63548
+ }
63549
+ function shouldRefreshStageARecoveryView(view, recoveredState) {
63550
+ if (view === undefined)
63551
+ return true;
63552
+ if (view === "rework_required" || view === "blocked")
63553
+ return true;
63554
+ if (view === "tests_run" || view === "closed" || view === "complete") {
63555
+ return false;
63556
+ }
63557
+ return compareTaskWorkflowStateRank(recoveredState, view) > 0;
63558
+ }
63559
+
63525
63560
  // src/workflow/task-recovery-status.ts
63526
63561
  init_path_identity();
63527
63562
  function identitySuffix(status) {
@@ -63823,6 +63858,7 @@ async function scanWedgedStageA(directory, options) {
63823
63858
  }
63824
63859
  async function repairWedgedStageA(directory, options) {
63825
63860
  const requested = options?.taskIds;
63861
+ const refreshSession = options?.sessionId ? getAgentSession(options.sessionId) : undefined;
63826
63862
  const { selected, truncated } = await enumerateStageACandidates(directory, requested);
63827
63863
  const { states: walStates } = await listCoderSettlementWalStates(directory);
63828
63864
  const results = [];
@@ -63830,6 +63866,12 @@ async function repairWedgedStageA(directory, options) {
63830
63866
  try {
63831
63867
  const scan = await scanStageATask(directory, taskId, walStates);
63832
63868
  if (scan.kind === "not_wedged") {
63869
+ if (refreshSession && isStageARecoveredState(scan.state)) {
63870
+ const snapshot = getTaskWorkflowSnapshot(await readTaskEvidence(directory, taskId));
63871
+ if (snapshot.authoritative && isStageARecoveredState(snapshot.state) && shouldRefreshStageARecoveryView(refreshSession.taskWorkflowStates.get(taskId), snapshot.state)) {
63872
+ applySessionWorkflowView(refreshSession, taskId, snapshot);
63873
+ }
63874
+ }
63833
63875
  results.push({
63834
63876
  taskId,
63835
63877
  outcome: "skipped_not_wedged",
@@ -63846,12 +63888,18 @@ async function repairWedgedStageA(directory, options) {
63846
63888
  continue;
63847
63889
  }
63848
63890
  const transitionId = `stage-a-repair:${taskId}:${scan.generation}`;
63849
- const { duplicated } = await transitionTaskWorkflowEvidenceWithStatus(directory, taskId, {
63891
+ const { evidence: updatedEvidence, duplicated } = await transitionTaskWorkflowEvidenceWithStatus(directory, taskId, {
63850
63892
  type: "stage_a_passed",
63851
63893
  ...scan.mode === "settlement_wedge" ? { settlementRecovery: true } : {},
63852
63894
  expectedGeneration: scan.generation,
63853
63895
  transitionId
63854
63896
  });
63897
+ if (refreshSession) {
63898
+ const snapshot = getTaskWorkflowSnapshot(updatedEvidence);
63899
+ if (isStageARecoveredState(snapshot.state) && shouldRefreshStageARecoveryView(refreshSession.taskWorkflowStates.get(taskId), snapshot.state)) {
63900
+ applySessionWorkflowView(refreshSession, taskId, snapshot);
63901
+ }
63902
+ }
63855
63903
  if (!duplicated) {
63856
63904
  await appendStageARepairEvent(directory, {
63857
63905
  action: "repaired",
@@ -64234,7 +64282,7 @@ async function computeCurationDiagnostics(directory, entries2) {
64234
64282
  let scanCompleted = false;
64235
64283
  let scanRemaining = 0;
64236
64284
  try {
64237
- const { getScanStatus } = await import("./scan-cursor-gdy1qjed.js");
64285
+ const { getScanStatus } = await import("./scan-cursor-abq3sdt6.js");
64238
64286
  const status = await getScanStatus(directory);
64239
64287
  scanGeneration = status.generation;
64240
64288
  scanCompleted = status.completed;
@@ -64244,10 +64292,10 @@ async function computeCurationDiagnostics(directory, entries2) {
64244
64292
  try {
64245
64293
  const { isLinked: isLinked2 } = await import("./knowledge-link-h4pdcnya.js");
64246
64294
  if (isLinked2(directory)) {
64247
- const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-qaxjz2de.js");
64295
+ const { KnowledgeConfigSchema: KnowledgeConfigSchema2 } = await import("./schema-0c4cddzy.js");
64248
64296
  let config;
64249
64297
  try {
64250
- const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-fqyd21v7.js");
64298
+ const { loadPluginConfigWithMeta: loadPluginConfigWithMeta2 } = await import("./index-ks6s6pmk.js");
64251
64299
  const loaded = loadPluginConfigWithMeta2(directory);
64252
64300
  config = KnowledgeConfigSchema2.parse(loaded.config.knowledge ?? {});
64253
64301
  } catch {
@@ -65703,7 +65751,7 @@ async function handleDoctorCommand(directory, args) {
65703
65751
  const result = runConfigDoctor(config, directory, planParallelizationEnabled);
65704
65752
  let output;
65705
65753
  if (enableAutoFix && result.hasAutoFixableIssues) {
65706
- const { runConfigDoctorWithFixes } = await import("./config-doctor-b5t9hrzb.js");
65754
+ const { runConfigDoctorWithFixes } = await import("./config-doctor-d01gbn5x.js");
65707
65755
  const fixResult = await runConfigDoctorWithFixes(directory, config, true, {
65708
65756
  applyLossy: true
65709
65757
  });
@@ -65741,7 +65789,7 @@ async function handleDoctorCommand(directory, args) {
65741
65789
  `;
65742
65790
  }
65743
65791
  try {
65744
- const { runModelPreflight } = await import("./model-preflight-7rrjh3wp.js");
65792
+ const { runModelPreflight } = await import("./model-preflight-c9qb1630.js");
65745
65793
  const preflight = await runModelPreflight(config, swarmState.opencodeClient, { generatedAgentNames: swarmState.generatedAgentNames });
65746
65794
  const missingSelection = preflight.resolutions.filter((resolution) => resolution.status === "missing-selection");
65747
65795
  const unresolved = preflight.catalogAvailable ? preflight.resolutions.filter((resolution) => resolution.status === "unresolved") : [];
@@ -65775,7 +65823,7 @@ async function handleDoctorCommand(directory, args) {
65775
65823
  }
65776
65824
  } catch {}
65777
65825
  try {
65778
- const { renderKnowledgeReceiptPhaseIdSection } = await import("./doctor-knowledge-receipt-phase-id-mckkwm0c.js");
65826
+ const { renderKnowledgeReceiptPhaseIdSection } = await import("./doctor-knowledge-receipt-phase-id-tkkznw6t.js");
65779
65827
  output += await renderKnowledgeReceiptPhaseIdSection(directory, enableAutoFix);
65780
65828
  } catch {}
65781
65829
  const strayDirs = detectStraySwarmDirs(directory);
@@ -66672,7 +66720,7 @@ async function handleEvidenceCommand(directory, args) {
66672
66720
  return formatTaskEvidenceMarkdown(evidenceData);
66673
66721
  }
66674
66722
  async function handleEvidenceSummaryCommand(directory) {
66675
- const { buildEvidenceSummary } = await import("./evidence-summary-service-svrt4se9.js");
66723
+ const { buildEvidenceSummary } = await import("./evidence-summary-service-jsg0x7q1.js");
66676
66724
  const artifact = await buildEvidenceSummary(directory);
66677
66725
  if (!artifact) {
66678
66726
  return "No plan found. Run `/swarm plan` to check plan status.";
@@ -91119,7 +91167,7 @@ function createCuratorLLMDelegate(directory, mode = "init", sessionId) {
91119
91167
  }
91120
91168
  const sdkOpts = signal ? { signal } : {};
91121
91169
  try {
91122
- const { getSwarmAgents: getSwarmAgents2, resolveFallbackModel: resolveFallbackModel2 } = await import("./index-n8n94des.js");
91170
+ const { getSwarmAgents: getSwarmAgents2, resolveFallbackModel: resolveFallbackModel2 } = await import("./index-hjpspz6z.js");
91123
91171
  const createResult = await client.session.create({
91124
91172
  ...sessionId ? {
91125
91173
  body: {
@@ -93456,7 +93504,7 @@ async function cancelPrFeedbackLoopUnlocked(directory, sessionID, reason) {
93456
93504
  clearedEvents: []
93457
93505
  };
93458
93506
  try {
93459
- const { cancelPrFeedbackPublication: cancelPrFeedbackPublication2 } = await import("./pr-workflow-gate-hmtae8gc.js");
93507
+ const { cancelPrFeedbackPublication: cancelPrFeedbackPublication2 } = await import("./pr-workflow-gate-f1wr818p.js");
93460
93508
  await cancelPrFeedbackPublication2(directory, sessionID, reason);
93461
93509
  } catch (err) {
93462
93510
  warn(`[pr-feedback-loop] cancelPrFeedbackPublication failed (fail-open): ${err instanceof Error ? err.message : String(err)}`);
@@ -94757,8 +94805,12 @@ var BIN_DIRECTORY = ".bin";
94757
94805
  var MAX_PACKAGE_MANIFEST_BYTES = 256 * 1024;
94758
94806
  var MAX_PATH_SHIM_BYTES = 64 * 1024;
94759
94807
  var UNSAFE_SHELL_WRAPPER_EXTENSIONS = new Set([".bat", ".cmd", ".ps1"]);
94760
- var WINDOWS_BATCH_WRAPPER_EXTENSIONS = [".cmd", ".bat"];
94761
- var WINDOWS_CMD_UNSAFE_TOKEN = /["%!^&|<>\r\n]/;
94808
+ var lintWindowsBatchDeps = {
94809
+ platform: () => _internals106.platform(),
94810
+ comSpec: () => _internals106.comSpec(),
94811
+ realpathSync: (candidate2) => _internals106.realpathSync(candidate2),
94812
+ statSync: (candidate2) => _internals106.statSync(candidate2)
94813
+ };
94762
94814
  var LINTER_PACKAGES = {
94763
94815
  biome: "@biomejs/biome",
94764
94816
  eslint: "eslint"
@@ -95184,62 +95236,17 @@ function resolveAdditionalExecutable(name) {
95184
95236
  }
95185
95237
  return resolveExecutableFromPath([`${name}.exe`], _internals106.pathEnv(), platform);
95186
95238
  }
95187
- function resolveWindowsCommandInterpreter() {
95188
- const candidate2 = _internals106.comSpec();
95189
- if (!candidate2 || !path128.isAbsolute(candidate2) || path128.basename(candidate2).toLowerCase() !== "cmd.exe" || !isRegularFile(candidate2)) {
95190
- return null;
95191
- }
95192
- try {
95193
- const canonical = _internals106.realpathSync(candidate2);
95194
- return path128.basename(canonical).toLowerCase() === "cmd.exe" ? canonical : null;
95195
- } catch {
95196
- return null;
95197
- }
95198
- }
95199
- function buildWindowsBatchCommand(wrapperPath, args) {
95200
- const interpreter = resolveWindowsCommandInterpreter();
95201
- if (!interpreter)
95202
- return null;
95203
- let canonicalWrapper;
95204
- try {
95205
- canonicalWrapper = _internals106.realpathSync(wrapperPath);
95206
- } catch {
95207
- return null;
95208
- }
95209
- if (!isRegularFile(canonicalWrapper) || !WINDOWS_BATCH_WRAPPER_EXTENSIONS.includes(path128.extname(canonicalWrapper).toLowerCase())) {
95210
- return null;
95211
- }
95212
- const tokens = [canonicalWrapper, ...args];
95213
- if (tokens.some((token) => WINDOWS_CMD_UNSAFE_TOKEN.test(token)))
95214
- return null;
95215
- const command = `call ${tokens.map((token) => `"${token}"`).join(" ")}`;
95216
- return [interpreter, "/d", "/s", "/v:off", "/c", command];
95239
+ function buildWindowsBatchCommand2(wrapperPath, args) {
95240
+ return buildWindowsBatchCommand(wrapperPath, args, lintWindowsBatchDeps);
95217
95241
  }
95218
95242
  function resolveWindowsBatchCommandFromPath(name, args) {
95219
95243
  if (_internals106.platform() !== "win32")
95220
95244
  return null;
95221
95245
  const wrapper = resolveExecutableFromPath(WINDOWS_BATCH_WRAPPER_EXTENSIONS.map((extension) => `${name}${extension}`), _internals106.pathEnv(), "win32");
95222
- return wrapper ? buildWindowsBatchCommand(wrapper, args) : null;
95246
+ return wrapper ? buildWindowsBatchCommand2(wrapper, args) : null;
95223
95247
  }
95224
- function resolveContainedWindowsBatchCommand(cwd, fileName, args) {
95225
- if (_internals106.platform() !== "win32")
95226
- return null;
95227
- const candidate2 = path128.join(cwd, fileName);
95228
- if (!isRegularFile(candidate2))
95229
- return null;
95230
- let canonicalCwd;
95231
- let canonicalCandidate;
95232
- try {
95233
- canonicalCwd = _internals106.realpathSync(cwd);
95234
- canonicalCandidate = _internals106.realpathSync(candidate2);
95235
- } catch {
95236
- return null;
95237
- }
95238
- const relative22 = path128.relative(canonicalCwd, canonicalCandidate);
95239
- if (relative22 === "" || relative22.startsWith("..") || path128.isAbsolute(relative22)) {
95240
- return null;
95241
- }
95242
- return buildWindowsBatchCommand(canonicalCandidate, args);
95248
+ function resolveContainedWindowsBatchCommand2(cwd, fileName, args) {
95249
+ return resolveContainedWindowsBatchCommand(cwd, fileName, args, lintWindowsBatchDeps);
95243
95250
  }
95244
95251
  function buildAdditionalCommand(name, args) {
95245
95252
  const executable = resolveAdditionalExecutable(name);
@@ -95268,7 +95275,7 @@ function resolveCheckstyleCommand(cwd) {
95268
95275
  const hasGradleSignal = hasCheckstyleGradleSignal(cwd);
95269
95276
  if (hasGradleSignal) {
95270
95277
  if (_internals106.platform() === "win32") {
95271
- const gradlew = resolveContainedWindowsBatchCommand(cwd, "gradlew.bat", [
95278
+ const gradlew = resolveContainedWindowsBatchCommand2(cwd, "gradlew.bat", [
95272
95279
  "checkstyleMain"
95273
95280
  ]);
95274
95281
  if (gradlew)
@@ -98062,6 +98069,7 @@ var MAX_SAFE_SOURCE_FILES = 1;
98062
98069
  var MAX_RAW_FILE_ENTRIES = 512;
98063
98070
  var MAX_FILE_PATH_LENGTH2 = 4096;
98064
98071
  var MAX_GRAPH_FILE_BYTES = 4 * 1024 * 1024;
98072
+ var MAX_MAVEN_MODULE_PROBE_ENTRIES = 100;
98065
98073
  var DEFAULT_LOAD_IMPACT_MAP = loadImpactMap;
98066
98074
  async function estimateFanOut(sourceFiles, cwd) {
98067
98075
  try {
@@ -98444,7 +98452,7 @@ var DISPATCH_FRAMEWORK_MAP = {
98444
98452
  };
98445
98453
  async function detectTestFrameworkViaDispatch(cwd) {
98446
98454
  try {
98447
- const { pickBackend } = await import("./dispatch-qvcztbpf.js");
98455
+ const { pickBackend } = await import("./dispatch-1pbmmj8z.js");
98448
98456
  const backend = await pickBackend(cwd);
98449
98457
  if (!backend?.selectTestFramework)
98450
98458
  return "none";
@@ -98460,7 +98468,7 @@ async function buildTestCommandViaDispatch(framework, scope, files, coverage, ba
98460
98468
  if (framework === "none")
98461
98469
  return null;
98462
98470
  try {
98463
- const { pickBackend } = await import("./dispatch-qvcztbpf.js");
98471
+ const { pickBackend } = await import("./dispatch-1pbmmj8z.js");
98464
98472
  const backend = await pickBackend(baseDir);
98465
98473
  if (backend?.buildTestCommand) {
98466
98474
  const cmd = backend.buildTestCommand(framework, files, baseDir, {
@@ -98482,7 +98490,7 @@ async function parseTestOutputViaDispatch(framework, output, baseDir) {
98482
98490
  if (framework === "none")
98483
98491
  return null;
98484
98492
  try {
98485
- const { pickBackend } = await import("./dispatch-qvcztbpf.js");
98493
+ const { pickBackend } = await import("./dispatch-1pbmmj8z.js");
98486
98494
  const backend = await pickBackend(baseDir);
98487
98495
  if (!backend?.parseTestOutput)
98488
98496
  return null;
@@ -98502,7 +98510,82 @@ async function parseTestOutputViaDispatch(framework, output, baseDir) {
98502
98510
  return null;
98503
98511
  }
98504
98512
  }
98505
- async function detectTestFramework(cwd) {
98513
+ function relativeEscapesRoot(relative24) {
98514
+ return relative24 === ".." || relative24.startsWith(`..${path132.sep}`) || path132.isAbsolute(relative24);
98515
+ }
98516
+ function resolveMavenModuleDir(root, files) {
98517
+ const resolvedRoot = path132.resolve(root);
98518
+ let rootReal;
98519
+ const isContainedModuleDir = (dir) => {
98520
+ if (rootReal === undefined) {
98521
+ try {
98522
+ rootReal = _internals110.realpathSync(resolvedRoot);
98523
+ } catch {
98524
+ rootReal = null;
98525
+ }
98526
+ }
98527
+ if (rootReal === null)
98528
+ return false;
98529
+ let dirReal;
98530
+ try {
98531
+ dirReal = _internals110.realpathSync(dir);
98532
+ } catch {
98533
+ return false;
98534
+ }
98535
+ return !relativeEscapesRoot(path132.relative(rootReal, dirReal));
98536
+ };
98537
+ if (files && files.length > 0) {
98538
+ for (const file of files) {
98539
+ const resolvedFile = path132.resolve(resolvedRoot, file);
98540
+ const relativeToRoot = path132.relative(resolvedRoot, resolvedFile);
98541
+ if (relativeEscapesRoot(relativeToRoot)) {
98542
+ continue;
98543
+ }
98544
+ let current = path132.dirname(resolvedFile);
98545
+ while (true) {
98546
+ if (_internals110.existsSync(path132.join(current, "pom.xml")) && isContainedModuleDir(current)) {
98547
+ return current;
98548
+ }
98549
+ if (current === resolvedRoot)
98550
+ break;
98551
+ const parent = path132.dirname(current);
98552
+ if (parent === current)
98553
+ break;
98554
+ if (relativeEscapesRoot(path132.relative(resolvedRoot, parent))) {
98555
+ break;
98556
+ }
98557
+ current = parent;
98558
+ }
98559
+ }
98560
+ return null;
98561
+ }
98562
+ let entries2;
98563
+ try {
98564
+ entries2 = _internals110.readdirSync(resolvedRoot);
98565
+ } catch {
98566
+ return null;
98567
+ }
98568
+ entries2.sort((a, b) => a.localeCompare(b));
98569
+ let inspected = 0;
98570
+ for (const entry of entries2) {
98571
+ if (entry.startsWith(".") || entry === "node_modules")
98572
+ continue;
98573
+ if (inspected >= MAX_MAVEN_MODULE_PROBE_ENTRIES)
98574
+ break;
98575
+ inspected++;
98576
+ const candidate2 = path132.join(resolvedRoot, entry);
98577
+ if (_internals110.existsSync(path132.join(candidate2, "pom.xml")) && isContainedModuleDir(candidate2)) {
98578
+ return candidate2;
98579
+ }
98580
+ }
98581
+ return null;
98582
+ }
98583
+ function resolveNestedMavenModuleDir(root, files) {
98584
+ if (_internals110.existsSync(path132.join(root, "pom.xml")))
98585
+ return null;
98586
+ return resolveMavenModuleDir(root, files);
98587
+ }
98588
+ async function detectTestFramework(cwd, files) {
98506
98589
  const baseDir = cwd;
98507
98590
  try {
98508
98591
  const packageJsonPath = path132.join(baseDir, "package.json");
@@ -98594,6 +98677,10 @@ async function detectTestFramework(cwd) {
98594
98677
  return "rspec";
98595
98678
  if (detectMinitest(baseDir))
98596
98679
  return "minitest";
98680
+ const mavenModuleDir = resolveNestedMavenModuleDir(baseDir, files);
98681
+ if (mavenModuleDir && (_internals110.isCommandAvailable("mvn") || resolveMavenWrapperCommand(mavenModuleDir, ["test"]) !== null)) {
98682
+ return "maven";
98683
+ }
98597
98684
  return "none";
98598
98685
  }
98599
98686
  function detectPhpTest(cwd) {
@@ -98985,30 +99072,10 @@ function buildTestCommand(framework, scope, files, coverage, baseDir, bail, targ
98985
99072
  return args;
98986
99073
  }
98987
99074
  case "maven": {
98988
- const args = ["mvn", "test"];
98989
- if (targets && targets.length > 0) {
98990
- args.push(`-Dtest=${targets.join(",")}`);
98991
- }
98992
- return args;
99075
+ return buildMavenTestCommand(baseDir, targets);
98993
99076
  }
98994
99077
  case "gradle": {
98995
- const isWindows = process.platform === "win32";
98996
- const hasGradlewBat = fs68.existsSync(path132.join(baseDir, "gradlew.bat"));
98997
- const hasGradlew = fs68.existsSync(path132.join(baseDir, "gradlew"));
98998
- const args = [];
98999
- if (hasGradlewBat && isWindows)
99000
- args.push("gradlew.bat");
99001
- else if (hasGradlew)
99002
- args.push("./gradlew");
99003
- else
99004
- args.push("gradle");
99005
- args.push("test");
99006
- if (targets && targets.length > 0) {
99007
- for (const target of targets) {
99008
- args.push("--tests", target);
99009
- }
99010
- }
99011
- return args;
99078
+ return buildGradleTestCommand(baseDir, targets);
99012
99079
  }
99013
99080
  case "dotnet-test": {
99014
99081
  const args = ["dotnet", "test"];
@@ -99064,16 +99131,10 @@ function buildTestCommand(framework, scope, files, coverage, baseDir, bail, targ
99064
99131
  'Dir.glob("test/**/*_test.rb").sort.each { |f| require_relative f }'
99065
99132
  ];
99066
99133
  case "pest": {
99067
- const args = [phpVendorBin("pest")];
99068
- if (scope !== "all" && files.length > 0)
99069
- args.push(...files);
99070
- return args;
99134
+ return buildPhpVendorCommand(baseDir, "pest", scope !== "all" && files.length > 0 ? files : []);
99071
99135
  }
99072
99136
  case "phpunit": {
99073
- const args = [phpVendorBin("phpunit")];
99074
- if (scope !== "all" && files.length > 0)
99075
- args.push(...files);
99076
- return args;
99137
+ return buildPhpVendorCommand(baseDir, "phpunit", scope !== "all" && files.length > 0 ? files : []);
99077
99138
  }
99078
99139
  case "php-artisan": {
99079
99140
  const args = ["php", "artisan", "test"];
@@ -99085,9 +99146,6 @@ function buildTestCommand(framework, scope, files, coverage, baseDir, bail, targ
99085
99146
  return null;
99086
99147
  }
99087
99148
  }
99088
- function phpVendorBin(name) {
99089
- return path132.join("vendor", "bin", process.platform === "win32" ? `${name}.bat` : name);
99090
- }
99091
99149
  function mapFrameworkStatusToResult(status) {
99092
99150
  if (typeof status !== "string")
99093
99151
  return null;
@@ -99597,7 +99655,8 @@ async function runTests(framework, scope, files, coverage, timeout_ms, cwd, bail
99597
99655
  stderr: "pipe",
99598
99656
  cwd: executionCwd,
99599
99657
  timeout: timeout_ms,
99600
- killProcessTree: true
99658
+ killProcessTree: true,
99659
+ ...isWindowsCommandInterpreterLaunch(command) ? { windowsVerbatimArguments: true } : {}
99601
99660
  });
99602
99661
  const stdoutPromise = readBoundedStream2(proc.stdout, MAX_OUTPUT_BYTES5);
99603
99662
  const stderrPromise = readBoundedStream2(proc.stderr, MAX_OUTPUT_BYTES5);
@@ -99653,8 +99712,9 @@ async function runTests(framework, scope, files, coverage, timeout_ms, cwd, bail
99653
99712
  totals.total = parsedTestCases.length;
99654
99713
  }
99655
99714
  const isTimeout = timedOutByDeadline;
99715
+ const spawnFailure = proc.spawnError;
99656
99716
  const nativeTargetObserved = resolvedNativeTarget ? didExecuteNativeTarget(resolvedNativeTarget, output) : true;
99657
- const testPassed = exitCode === 0 && !isTimeout && totals.failed === 0 && nativeTargetObserved;
99717
+ const testPassed = exitCode === 0 && !isTimeout && !spawnFailure && totals.failed === 0 && nativeTargetObserved;
99658
99718
  if (testPassed) {
99659
99719
  const result = {
99660
99720
  success: true,
@@ -99683,9 +99743,9 @@ async function runTests(framework, scope, files, coverage, timeout_ms, cwd, bail
99683
99743
  duration_ms,
99684
99744
  totals,
99685
99745
  rawOutput: output,
99686
- error: isTimeout ? `Tests timed out after ${timeout_ms}ms` : !nativeTargetObserved ? `Native target "${resolvedNativeTarget?.name}" did not execute` : `Tests failed with ${totals.failed} failures`,
99687
- message: isTimeout ? `${framework} tests timed out after ${timeout_ms}ms` : !nativeTargetObserved ? `${framework} did not report the exact requested native target; refusing a false-green 0/0 result` : `${framework} tests failed (${totals.failed}/${totals.total} failed)`,
99688
- outcome: isTimeout ? "error" : "regression",
99746
+ error: spawnFailure ? `Test command failed to launch: ${spawnFailure.message}` : isTimeout ? `Tests timed out after ${timeout_ms}ms` : !nativeTargetObserved ? `Native target "${resolvedNativeTarget?.name}" did not execute` : `Tests failed with ${totals.failed} failures`,
99747
+ message: spawnFailure ? `${framework} test process could not be started: ${spawnFailure.message} \u2014 a launch failure (for example a missing executable or unusable working directory), not a test regression. Check the command, PATH, and cwd instead of the tests.` : isTimeout ? `${framework} tests timed out after ${timeout_ms}ms` : !nativeTargetObserved ? `${framework} did not report the exact requested native target; refusing a false-green 0/0 result` : `${framework} tests failed (${totals.failed}/${totals.total} failed)`,
99748
+ outcome: spawnFailure || isTimeout ? "error" : "regression",
99689
99749
  testCases: parsedTestCases
99690
99750
  };
99691
99751
  if (coveragePercent !== undefined) {
@@ -99893,7 +99953,7 @@ var test_runner = createSwarmTool({
99893
99953
  path: exports_external.string()
99894
99954
  }).optional().describe('For scope "target": exact framework-native test name plus a workspace-relative package/build directory. Absolute paths, traversal, coverage, bail, and broad fallback are rejected.'),
99895
99955
  files: exports_external.array(exports_external.string().min(1).max(MAX_FILE_PATH_LENGTH2)).max(MAX_RAW_FILE_ENTRIES).optional().describe('Specific files to test. For "convention", pass source files or direct test files. For "graph" and "impact", pass source files only.'),
99896
- targets: exports_external.array(exports_external.string()).optional().describe("Framework-native test names or patterns to filter which tests run. Supported by cargo, go-test, maven, gradle, dotnet-test, ctest, and swift-test. Each entry is passed as-is to the framework's native filter flag."),
99956
+ targets: exports_external.array(exports_external.string()).optional().describe("Framework-native test names or patterns to filter which tests run. Supported by cargo, go-test, maven, gradle, dotnet-test, ctest, and swift-test. Each entry is passed as-is to the framework's native filter flag. Targets only filter a files-driven selection \u2014 provide a non-empty files array for the convention, graph, and impact scopes; targets alone cannot drive discovery."),
99897
99957
  coverage: exports_external.boolean().optional().describe("Enable coverage reporting if supported"),
99898
99958
  bail: exports_external.boolean().optional().describe("Stop running tests after the first failure. Default false. Note: coverage may be incomplete when bail=true with coverage=true."),
99899
99959
  timeout_ms: exports_external.number().int().min(1).default(DEFAULT_TIMEOUT_MS3).describe("Timeout in milliseconds (default 60000, max 300000)"),
@@ -100000,13 +100060,13 @@ var test_runner = createSwarmTool({
100000
100060
  return JSON.stringify(errorResult, null, 2);
100001
100061
  }
100002
100062
  }
100003
- if ((scope === "convention" || scope === "graph" || scope === "impact") && (!args.files || args.files.length === 0) && (!args.targets || args.targets.length === 0)) {
100063
+ if ((scope === "convention" || scope === "graph" || scope === "impact") && (!args.files || args.files.length === 0)) {
100004
100064
  const errorResult = {
100005
100065
  success: false,
100006
100066
  framework: "none",
100007
100067
  scope,
100008
- error: 'scope "convention", "graph", and "impact" require explicit files or targets array - omitting both causes unsafe full-project discovery',
100009
- message: 'When using scope "convention", "graph", or "impact", you must provide a non-empty "files" array (or "targets" for framework-native test names). Example: { scope: "convention", files: ["tests/test_calc.py"] }',
100068
+ error: 'scope "convention", "graph", and "impact" require a non-empty files array - targets only filter which tests run and cannot substitute for files (omitting files causes unsafe full-project discovery)',
100069
+ message: 'When using scope "convention", "graph", or "impact", provide at least one source or direct-test file in "files"; "targets" only filter which tests run within that selection and cannot drive discovery on their own. Example: { scope: "convention", files: ["tests/test_calc.py"] }',
100010
100070
  outcome: "error",
100011
100071
  resolution: makeResolution(scope, scope, [], [], "skip", workingDir)
100012
100072
  };
@@ -100023,10 +100083,10 @@ var test_runner = createSwarmTool({
100023
100083
  } else if (useDispatch) {
100024
100084
  framework = await detectTestFrameworkViaDispatch(workingDir);
100025
100085
  if (framework === "none") {
100026
- framework = await detectTestFramework(workingDir);
100086
+ framework = await detectTestFramework(workingDir, _files);
100027
100087
  }
100028
100088
  } else {
100029
- framework = await detectTestFramework(workingDir);
100089
+ framework = await detectTestFramework(workingDir, _files);
100030
100090
  }
100031
100091
  if (framework === "none") {
100032
100092
  const result2 = {
@@ -100048,6 +100108,12 @@ var test_runner = createSwarmTool({
100048
100108
  };
100049
100109
  return JSON.stringify(result2, null, 2);
100050
100110
  }
100111
+ if (scope !== "target" && framework === "maven") {
100112
+ const mavenModuleDir = resolveNestedMavenModuleDir(workingDir, _files);
100113
+ if (mavenModuleDir) {
100114
+ nativeExecutionDirectory = mavenModuleDir;
100115
+ }
100116
+ }
100051
100117
  let testFiles = [];
100052
100118
  let graphFallbackReason;
100053
100119
  let effectiveScope = scope;
@@ -100055,14 +100121,14 @@ var test_runner = createSwarmTool({
100055
100121
  let selectionCacheStatus;
100056
100122
  let selectionSourceFiles = [];
100057
100123
  if (scope === "target") {} else if (scope === "all") {} else if (scope === "convention") {
100058
- const directTestFiles = args.files.filter((file) => isConventionTestFilePath(file));
100059
- const sourceFiles = args.files.filter((file) => {
100124
+ const directTestFiles = _files.filter((file) => isConventionTestFilePath(file));
100125
+ const sourceFiles = _files.filter((file) => {
100060
100126
  if (directTestFiles.includes(file))
100061
100127
  return false;
100062
100128
  const ext = path132.extname(file).toLowerCase();
100063
100129
  return SOURCE_EXTENSIONS.has(ext);
100064
100130
  });
100065
- const invalidFiles = args.files.filter((file) => !directTestFiles.includes(file) && !sourceFiles.includes(file));
100131
+ const invalidFiles = _files.filter((file) => !directTestFiles.includes(file) && !sourceFiles.includes(file));
100066
100132
  if (directTestFiles.length === 0 && sourceFiles.length === 0) {
100067
100133
  const errorResult = {
100068
100134
  success: false,
@@ -100085,7 +100151,7 @@ var test_runner = createSwarmTool({
100085
100151
  };
100086
100152
  return JSON.stringify(errorResult, null, 2);
100087
100153
  }
100088
- selectionSourceFiles = normalizeSelectionFiles(args.files, workingDir);
100154
+ selectionSourceFiles = normalizeSelectionFiles(_files, workingDir);
100089
100155
  if (sourceFiles.length > MAX_SAFE_SOURCE_FILES) {
100090
100156
  const errorResult = {
100091
100157
  success: false,
@@ -100103,7 +100169,7 @@ var test_runner = createSwarmTool({
100103
100169
  ...getTestFilesFromConvention(sourceFiles, workingDir)
100104
100170
  ].filter((file, index, items) => items.indexOf(file) === index);
100105
100171
  } else if (scope === "graph") {
100106
- const sourceFiles = normalizeSelectionFiles(args.files.filter((f) => {
100172
+ const sourceFiles = normalizeSelectionFiles(_files.filter((f) => {
100107
100173
  if (isConventionTestFilePath(f)) {
100108
100174
  return false;
100109
100175
  }
@@ -100146,7 +100212,7 @@ var test_runner = createSwarmTool({
100146
100212
  testFiles = getTestFilesFromConvention(sourceFiles, workingDir).slice(0, MAX_SAFE_TEST_FILES2 + 1);
100147
100213
  }
100148
100214
  } else if (scope === "impact") {
100149
- const sourceFiles = normalizeSelectionFiles(args.files.filter((f) => {
100215
+ const sourceFiles = normalizeSelectionFiles(_files.filter((f) => {
100150
100216
  if (isConventionTestFilePath(f)) {
100151
100217
  return false;
100152
100218
  }
@@ -100316,6 +100382,7 @@ var _internals110 = {
100316
100382
  existsSync: fs68.existsSync,
100317
100383
  readdirSync: fs68.readdirSync,
100318
100384
  readFileSync: fs68.readFileSync,
100385
+ realpathSync: fs68.realpathSync,
100319
100386
  resolveLocalNodeTool,
100320
100387
  bunSpawn,
100321
100388
  buildNativeTargetCommand,
@@ -101442,7 +101509,7 @@ function renderStageARepairOutcome(outcome) {
101442
101509
  return `\u274C Task ${outcome.taskId}: unknown repair outcome`;
101443
101510
  }
101444
101511
  }
101445
- async function handleRecoverCommand(directory, args) {
101512
+ async function handleRecoverCommand(directory, args, sessionID) {
101446
101513
  const force = args.includes("--force");
101447
101514
  if (args.includes("--coordination")) {
101448
101515
  try {
@@ -101499,7 +101566,8 @@ async function handleRecoverCommand(directory, args) {
101499
101566
  }
101500
101567
  try {
101501
101568
  const { results: repairResults, truncated: repairTruncated } = await repairWedgedStageA(directory, {
101502
- ...taskId ? { taskIds: [taskId] } : {}
101569
+ ...taskId ? { taskIds: [taskId] } : {},
101570
+ ...sessionID ? { sessionId: sessionID } : {}
101503
101571
  });
101504
101572
  const repaired = repairResults.filter((r) => r.outcome === "repaired");
101505
101573
  if (repairResults.length > 0) {
@@ -109830,7 +109898,7 @@ function buildDetailedHelp(commandName, entry) {
109830
109898
  async function handleHelpCommand(ctx) {
109831
109899
  const targetCommand = ctx.args.join(" ");
109832
109900
  if (!targetCommand) {
109833
- const { buildHelpText } = await import("./index-kx0sr39t.js");
109901
+ const { buildHelpText } = await import("./index-scjtkt0e.js");
109834
109902
  return buildHelpText();
109835
109903
  }
109836
109904
  const tokens = targetCommand.split(/\s+/);
@@ -109844,7 +109912,7 @@ async function handleHelpCommand(ctx) {
109844
109912
  > Note: \`/swarm ${resolved.key}\` is a deprecated alias for \`/swarm ${aliasTarget}\`.` : detailed;
109845
109913
  }
109846
109914
  const similar = _internals27.findSimilarCommands(targetCommand);
109847
- const { buildHelpText: fullHelp } = await import("./index-kx0sr39t.js");
109915
+ const { buildHelpText: fullHelp } = await import("./index-scjtkt0e.js");
109848
109916
  if (similar.length > 0) {
109849
109917
  return `Command '/swarm ${targetCommand}' not found.
109850
109918
 
@@ -110172,7 +110240,7 @@ var COMMAND_REGISTRY = {
110172
110240
  },
110173
110241
  "guardrail explain": {
110174
110242
  handler: async (ctx) => {
110175
- const { handleGuardrailExplain } = await import("./guardrail-explain-5j0cg165.js");
110243
+ const { handleGuardrailExplain } = await import("./guardrail-explain-7m0h7db3.js");
110176
110244
  return handleGuardrailExplain(ctx.directory, ctx.args);
110177
110245
  },
110178
110246
  description: "Dry-run: show what the guardrails would do to a command or write target (executes nothing)",
@@ -110182,7 +110250,7 @@ var COMMAND_REGISTRY = {
110182
110250
  },
110183
110251
  "guardrail reset": {
110184
110252
  handler: async (ctx) => {
110185
- const { handleGuardrailReset } = await import("./guardrail-reset-kjmqnr5r.js");
110253
+ const { handleGuardrailReset } = await import("./guardrail-reset-shvx8e8g.js");
110186
110254
  return handleGuardrailReset(ctx.args, ctx.sessionID);
110187
110255
  },
110188
110256
  description: "Reset one exact active invocation/action circuit after repair",
@@ -110203,7 +110271,7 @@ var COMMAND_REGISTRY = {
110203
110271
  },
110204
110272
  "guardrail-log": {
110205
110273
  handler: async (ctx) => {
110206
- const { handleGuardrailLog } = await import("./guardrail-log-h6fc7rnv.js");
110274
+ const { handleGuardrailLog } = await import("./guardrail-log-p6s1sbxh.js");
110207
110275
  return handleGuardrailLog(ctx.directory, ctx.args);
110208
110276
  },
110209
110277
  description: "Read the guardrail decision log (use --blocks-only for blocks)",
@@ -110978,9 +111046,9 @@ Subcommands:
110978
111046
  toolPolicy: "restricted"
110979
111047
  },
110980
111048
  recover: {
110981
- handler: (ctx) => handleRecoverCommand(ctx.directory, ctx.args),
111049
+ handler: (ctx) => handleRecoverCommand(ctx.directory, ctx.args, ctx.sessionID),
110982
111050
  description: "Recover wedged coder settlements [task_id] [--force]",
110983
- details: "Settles stale coder-settlement WALs in .swarm/coder-settlements/ \u2014 the CODER_DISPATCH_IN_PROGRESS wedge where a dispatch's completion never fired (issue #2268). Safe mode recovers settlements whose owner process is gone. --force also releases ownership keys held by this process: use only when no dispatch is genuinely running (a late completion then reports CODER_SETTLEMENT_IDEMPOTENCY_CONFLICT, safe to ignore). Never interrupts another live OpenCode process. Also repairs tasks wedged at coder_delegated with unattributed green pre_check evidence \u2014 the post-reset TASK_WORKFLOW_STAGE_A_REQUIRED wedge \u2014 and the settlement-wedge class (issue #2828): a task whose workflow drifted to idle or blocked while a COMMITTED accepted coder settlement and green post-settlement pre-check evidence still justify Stage A gets the missing stage_a_passed written directly, with a settlementRecovery marker and a stage_a_repair audit event in .swarm/events.jsonl; the architect-side audited escape hatch for the same receipts is the recover_stage_a_task tool. Note that --force affects only in-process settlement-WAL ownership and does not override Stage A wedge-classification refusals. Pass [task_id] to scope both phases to one task. Diagnose and repair emit per-category status explanations (missing/stale/ambiguous/corrupt/live_wedge/settlement_wedge) with shell-correct invocation guidance per host \u2014 see docs/troubleshooting/recovery-runbook.md (#2665). Human-only.",
111051
+ details: "Settles stale coder-settlement WALs in .swarm/coder-settlements/ \u2014 the CODER_DISPATCH_IN_PROGRESS wedge where a dispatch's completion never fired (issue #2268). Safe mode recovers settlements whose owner process is gone. --force also releases ownership keys held by this process: use only when no dispatch is genuinely running (a late completion then reports CODER_SETTLEMENT_IDEMPOTENCY_CONFLICT, safe to ignore). Never interrupts another live OpenCode process. Also repairs tasks wedged at coder_delegated with unattributed green pre_check evidence \u2014 the post-reset TASK_WORKFLOW_STAGE_A_REQUIRED wedge \u2014 and the settlement-wedge class (issue #2828): a task whose workflow drifted to idle or blocked while a COMMITTED accepted coder settlement and green post-settlement pre-check evidence still justify Stage A gets the missing stage_a_passed written directly, with a settlementRecovery marker and a stage_a_repair audit event in .swarm/events.jsonl; the architect-side audited escape hatch for the same receipts is the recover_stage_a_task tool. Both recovery surfaces also refresh the invoking session's in-memory task workflow view, so a blocked-start wedge does not survive the recovery in the session that ran it (#3043). Note that --force affects only in-process settlement-WAL ownership and does not override Stage A wedge-classification refusals. Pass [task_id] to scope both phases to one task. Diagnose and repair emit per-category status explanations (missing/stale/ambiguous/corrupt/live_wedge/settlement_wedge) with shell-correct invocation guidance per host \u2014 see docs/troubleshooting/recovery-runbook.md (#2665). Human-only.",
110984
111052
  args: "[task_id] [--force]",
110985
111053
  category: "utility",
110986
111054
  toolPolicy: "human-only"
@@ -114762,7 +114830,7 @@ EXECUTION BOUNDARY:
114762
114830
  - scope: "all" is PROHIBITED for test_engineer \u2014 full-suite output can destabilize opencode's SSE streaming, and the architect handles regression sweeps separately via scope: "graph"
114763
114831
  - If you need to verify tests beyond your assigned file, report the concern in your VERDICT and the architect will handle it
114764
114832
  - If you wrote tests/foo.test.ts for src/foo.ts, you MUST run only tests/foo.test.ts
114765
- - The test_runner convention scope recognises direct test files in supported locations/naming conventions: Python (test_*.py, *_test.py), Ruby (*_spec.rb), Java/Kotlin (*Test.*), C# (*Tests.cs), and PowerShell (*.Tests.ps1). For Go and CTest, use scope "target" with an exact framework-native name; never broaden to a package/build sweep. For target-based frameworks (cargo, maven, gradle, dotnet-test, swift-test), you may also pass framework-native test names or patterns in the \`targets\` array parameter alongside \`files\`.
114833
+ - The test_runner convention scope recognises direct test files in supported locations/naming conventions: Python (test_*.py, *_test.py), Ruby (*_spec.rb), Java/Kotlin (*Test.*), C# (*Tests.cs), and PowerShell (*.Tests.ps1). For Go and CTest, use scope "target" with an exact framework-native name; never broaden to a package/build sweep. For target-based frameworks (cargo, maven, gradle, dotnet-test, swift-test), you may also pass framework-native test names or patterns in the \`targets\` array parameter alongside \`files\` (\`targets\` alone cannot drive discovery: the convention, graph, and impact scopes require a non-empty \`files\` array).
114766
114834
 
114767
114835
  TOOL USAGE:
114768
114836
  - Use \`test_runner\` tool for test execution