opencode-swarm 7.171.2 → 7.172.1

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 (128) hide show
  1. package/README.md +5 -0
  2. package/binaries/win32-arm64/swarm-sandbox-runner.exe +0 -0
  3. package/binaries/win32-x64/swarm-sandbox-runner.exe +0 -0
  4. package/dist/background/delegation-lifecycle.d.ts +21 -5
  5. package/dist/background/pending-delegations.d.ts +118 -6
  6. package/dist/cli/ast-diff-f2a1y02y.js +13 -0
  7. package/dist/cli/{coder-settlement-9e696204.js → coder-settlement-pw4jbrez.js} +14 -14
  8. package/dist/cli/{config-doctor-zr748h4m.js → config-doctor-ab0ckcsc.js} +6 -6
  9. package/dist/cli/{core-aa3jmzcs.js → core-ty98bsnz.js} +5 -5
  10. package/dist/cli/{curation-policy-fakrpw5t.js → curation-policy-cvjd6kz8.js} +7 -7
  11. package/dist/cli/{curator-drift-r9r8gepb.js → curator-drift-b0pbzjxv.js} +8 -8
  12. package/dist/cli/curator-llm-factory-69vje2m7.js +72 -0
  13. package/dist/cli/{curator-xgpxtaf1.js → curator-rvrhbsy2.js} +45 -45
  14. package/dist/cli/{dispatch-hwwj3qrb.js → dispatch-9yqqqfr6.js} +2 -2
  15. package/dist/cli/{evidence-summary-service-5e2323zr.js → evidence-summary-service-wmer0c5b.js} +22 -22
  16. package/dist/cli/{gate-evidence-5htpsr5y.js → gate-evidence-6d0f6ekr.js} +9 -9
  17. package/dist/cli/guardrail-explain-z06dyan0.js +73 -0
  18. package/dist/cli/guardrail-log-bmyxcdfk.js +23 -0
  19. package/dist/cli/{guardrail-reset-rdqxeqy0.js → guardrail-reset-9wmbhwff.js} +45 -45
  20. package/dist/cli/hive-promoter-mc8xssba.js +87 -0
  21. package/dist/cli/{index-mazy938h.js → index-008sppht.js} +4 -4
  22. package/dist/cli/{index-aa2eyfvr.js → index-31fes86t.js} +2 -2
  23. package/dist/cli/{index-vqb65csb.js → index-3r17j2gc.js} +138 -28
  24. package/dist/cli/{index-wfh89qct.js → index-66tshqdp.js} +4 -4
  25. package/dist/cli/{index-e7yv4xw1.js → index-93z2fhyp.js} +3 -3
  26. package/dist/cli/{index-6k5aq7b9.js → index-9bg5vc22.js} +2 -2
  27. package/dist/cli/{index-g6nen3gt.js → index-9p00xent.js} +1 -1
  28. package/dist/cli/{index-yqbnsmmv.js → index-bdqefjxg.js} +1 -1
  29. package/dist/cli/{index-f1rj1j8t.js → index-br08k19k.js} +2713 -1429
  30. package/dist/cli/{index-ee6ydtfe.js → index-c1ggtmpm.js} +1 -1
  31. package/dist/cli/{index-2ryy0cwt.js → index-c5wyannc.js} +30 -18
  32. package/dist/cli/{index-qcy7eg6z.js → index-dg5znyqw.js} +154 -37
  33. package/dist/cli/{index-sxt7fgcw.js → index-ecaws78e.js} +1 -1
  34. package/dist/cli/{index-j6rq132j.js → index-edext37b.js} +7 -7
  35. package/dist/cli/{index-cw912re7.js → index-fpbcxykc.js} +1 -1
  36. package/dist/cli/{index-3qf1vxtb.js → index-frcemc0b.js} +1 -1
  37. package/dist/cli/{index-nfs78aqj.js → index-gdrdtbw6.js} +2 -2
  38. package/dist/cli/{index-bpmtbmy9.js → index-gknz3bv1.js} +1 -1
  39. package/dist/cli/{index-kb66he4e.js → index-h91jjw6t.js} +1 -1
  40. package/dist/cli/{index-er6sk4e6.js → index-ha3wsy2e.js} +2 -2
  41. package/dist/cli/{index-5400m33a.js → index-hnvmj9wx.js} +1 -1
  42. package/dist/cli/{index-dsgc303n.js → index-hx0pas8b.js} +4 -4
  43. package/dist/cli/{index-0caqxnby.js → index-hydccmm1.js} +1 -1
  44. package/dist/cli/{index-r60cw2jt.js → index-j8warkkj.js} +7 -7
  45. package/dist/cli/{index-rrc08h4q.js → index-jc0as97z.js} +5 -5
  46. package/dist/cli/{index-9dz2ee2g.js → index-jmn35na4.js} +70 -50
  47. package/dist/cli/{index-95e3a9en.js → index-jzrx2sx2.js} +1 -1
  48. package/dist/cli/{index-b3pmzbh1.js → index-ma38q4rf.js} +2 -2
  49. package/dist/cli/{index-fhh02gwx.js → index-mq69g46a.js} +2 -2
  50. package/dist/cli/{index-3jcp3zb6.js → index-nzpw41w6.js} +2 -2
  51. package/dist/cli/{index-9txyxbqc.js → index-pmg1k4mv.js} +8 -8
  52. package/dist/cli/{index-b43rt5ph.js → index-pt7h91zc.js} +19 -1
  53. package/dist/cli/{index-7hnjs7tf.js → index-q58xegd7.js} +2 -2
  54. package/dist/cli/{index-0yffa3np.js → index-qfz31dcy.js} +5 -5
  55. package/dist/cli/{ast-diff-b0esr2kf.js → index-qss1s93b.js} +3 -6
  56. package/dist/cli/{index-d79q2f8z.js → index-re1ey51s.js} +4 -4
  57. package/dist/cli/{index-jr6pypmj.js → index-rhe9zbe2.js} +45 -45
  58. package/dist/cli/{index-qdy4a48x.js → index-sakgsnxj.js} +3 -3
  59. package/dist/cli/{index-04ph4jp2.js → index-tm6z0wgj.js} +2 -2
  60. package/dist/cli/{index-nyn01yrz.js → index-tr3tbtgw.js} +2 -2
  61. package/dist/cli/{index-q2yk70rs.js → index-twpzfwga.js} +4 -3
  62. package/dist/cli/{index-ph94evsh.js → index-vqs7dxp7.js} +7 -7
  63. package/dist/cli/{index-gq2zdxep.js → index-w0141tkw.js} +8 -8
  64. package/dist/cli/{index-11gz0few.js → index-wf6pbrg7.js} +1 -1
  65. package/dist/cli/{index-n832052r.js → index-wrt875kh.js} +1 -1
  66. package/dist/cli/{index-nbdmdyke.js → index-ws3ggk1h.js} +7 -7
  67. package/dist/cli/{index-9vfp6g53.js → index-y21gyrt6.js} +47 -47
  68. package/dist/cli/{index-7qqwx64h.js → index-y5x1swr8.js} +8 -8
  69. package/dist/cli/{index-evxd1art.js → index-yf1mvexg.js} +2 -2
  70. package/dist/cli/{semantic-classifier-ygqk0me1.js → index-ykamkw55.js} +2 -5
  71. package/dist/cli/{index-9br68j86.js → index-z2deqhpp.js} +1 -1
  72. package/dist/cli/{index-5a8q4qr5.js → index-zcjdw8dw.js} +2 -2
  73. package/dist/cli/index.js +53 -47
  74. package/dist/cli/{knowledge-escalator-kn74r5w8.js → knowledge-escalator-k4ab3f1f.js} +17 -17
  75. package/dist/cli/{knowledge-events-7gpw741m.js → knowledge-events-aqy4hb15.js} +15 -15
  76. package/dist/cli/{knowledge-link-vh9pfnb9.js → knowledge-link-51m3c09s.js} +6 -6
  77. package/dist/cli/{knowledge-store-3f9kke7z.js → knowledge-store-xgkga9xj.js} +7 -7
  78. package/dist/cli/{knowledge-validator-c2z68v8v.js → knowledge-validator-vvgs8m7m.js} +9 -9
  79. package/dist/cli/mcp-qvgka4c8.js +78 -0
  80. package/dist/cli/mcp.d.ts +27 -0
  81. package/dist/cli/{model-preflight-1ycat9jz.js → model-preflight-2mvdbj0c.js} +1 -1
  82. package/dist/cli/{pending-delegations-d5c07rb7.js → pending-delegations-1xvmbw29.js} +21 -13
  83. package/dist/cli/{pr-subscriptions-krv0jvds.js → pr-subscriptions-13xqrhwx.js} +13 -13
  84. package/dist/cli/{pr-workflow-gate-hmdht1he.js → pr-workflow-gate-6qzpckxa.js} +45 -45
  85. package/dist/cli/{runner-8m8qhngm.js → runner-k2t9n662.js} +7 -7
  86. package/dist/cli/{scan-cursor-b57xxs3q.js → scan-cursor-q5nycpzb.js} +8 -8
  87. package/dist/cli/{schema-r8tv8dqm.js → schema-a8gskpey.js} +3 -3
  88. package/dist/cli/{scope-persistence-0sc90mpj.js → scope-persistence-q0n6y3n7.js} +17 -17
  89. package/dist/cli/semantic-classifier-bjsez0v5.js +8 -0
  90. package/dist/cli/server-wmbahe8h.js +18129 -0
  91. package/dist/cli/{skill-generator-syxa1mxm.js → skill-generator-z76whwng.js} +19 -19
  92. package/dist/cli/snapshot-coordination-init-k2fgw463.js +86 -0
  93. package/dist/cli/{telemetry-0mz37v3h.js → telemetry-zed80n86.js} +3 -3
  94. package/dist/cli/{workspace-snapshot-hkz2wt1c.js → workspace-snapshot-93dx9rbt.js} +4 -4
  95. package/dist/cli/{worktree-collision-ownership-1tzw8qzp.js → worktree-collision-ownership-deyrgr70.js} +14 -14
  96. package/dist/cli/{worktree-isolation-ez0e48v3.js → worktree-isolation-9rjxaxp6.js} +45 -45
  97. package/dist/hooks/pr-workflow-gate.d.ts +14 -2
  98. package/dist/hooks/pr-workflow-session-resolver.d.ts +45 -0
  99. package/dist/hooks/search-knowledge.d.ts +7 -0
  100. package/dist/index.js +108 -108
  101. package/dist/mcp/adapters/knowledge-memory.d.ts +16 -0
  102. package/dist/mcp/adapters/scope-repo.d.ts +14 -0
  103. package/dist/mcp/adapters/verification.d.ts +20 -0
  104. package/dist/mcp/pipeline.d.ts +25 -0
  105. package/dist/mcp/registry.d.ts +47 -0
  106. package/dist/mcp/server.d.ts +35 -0
  107. package/dist/memory/gateway.d.ts +9 -1
  108. package/dist/observability/catalog.d.ts +4 -3
  109. package/dist/plan/index.d.ts +1 -0
  110. package/dist/plan/ledger.d.ts +10 -0
  111. package/dist/plan/manager.d.ts +38 -2
  112. package/dist/pr-review/completion.d.ts +12 -0
  113. package/dist/telemetry.d.ts +11 -1
  114. package/dist/tools/dispatch-lanes.d.ts +5 -1
  115. package/dist/tools/phase-complete.d.ts +1 -1
  116. package/dist/tools/placeholder-scan.d.ts +10 -0
  117. package/dist/tools/pr-workflow-status.d.ts +6 -0
  118. package/dist/tools/quality-budget.d.ts +10 -0
  119. package/dist/tools/repo-map.d.ts +5 -0
  120. package/dist/tools/sast-scan.d.ts +11 -0
  121. package/dist/tools/swarm-memory-recall.d.ts +12 -0
  122. package/dist/tools/syntax-check.d.ts +12 -1
  123. package/package.json +2 -1
  124. package/dist/cli/curator-llm-factory-nshzhgs4.js +0 -72
  125. package/dist/cli/guardrail-explain-d0h0p73g.js +0 -73
  126. package/dist/cli/guardrail-log-heejmjce.js +0 -23
  127. package/dist/cli/hive-promoter-n262tkm3.js +0 -87
  128. package/dist/cli/snapshot-coordination-init-x18mwxyv.js +0 -86
@@ -3,13 +3,13 @@ import {
3
3
  EvaluationRunV1Schema,
4
4
  GateAuditResultV1Schema,
5
5
  getProtectedEvaluationRunIds
6
- } from "./index-3jcp3zb6.js";
6
+ } from "./index-nzpw41w6.js";
7
7
  import {
8
8
  readEffectiveSpecSync
9
- } from "./index-9br68j86.js";
9
+ } from "./index-z2deqhpp.js";
10
10
  import {
11
11
  validateWorkspaceRoot
12
- } from "./index-cw912re7.js";
12
+ } from "./index-fpbcxykc.js";
13
13
  import {
14
14
  getWorktreeMergeFailure
15
15
  } from "./index-zsrtt42s.js";
@@ -23,13 +23,13 @@ import {
23
23
  readTaskEvidence,
24
24
  readTaskEvidenceRaw,
25
25
  sanitizeTaskId
26
- } from "./index-rrc08h4q.js";
26
+ } from "./index-jc0as97z.js";
27
27
  import {
28
28
  estimateCharsForTokens,
29
29
  estimateTokens,
30
30
  readSwarmFileAsync,
31
31
  validateSwarmPath
32
- } from "./index-b3pmzbh1.js";
32
+ } from "./index-ma38q4rf.js";
33
33
  import {
34
34
  bunHash,
35
35
  bunWrite,
@@ -39,7 +39,7 @@ import {
39
39
  EVIDENCE_MAX_JSON_BYTES,
40
40
  EvidenceBundleSchema,
41
41
  EvidenceSchema
42
- } from "./index-3qf1vxtb.js";
42
+ } from "./index-frcemc0b.js";
43
43
  import {
44
44
  LedgerStaleWriterError,
45
45
  appendLedgerEvent,
@@ -58,10 +58,10 @@ import {
58
58
  replayFromLedgerWithStatus,
59
59
  takeSnapshotEvent,
60
60
  takeSnapshotWithRetry
61
- } from "./index-2ryy0cwt.js";
61
+ } from "./index-c5wyannc.js";
62
62
  import {
63
63
  appendCoreEventSync
64
- } from "./index-6k5aq7b9.js";
64
+ } from "./index-9bg5vc22.js";
65
65
  import {
66
66
  derivePlanId,
67
67
  derivePlanIdentityHash,
@@ -69,32 +69,32 @@ import {
69
69
  importCoordinationOnce,
70
70
  listCoordinationStates,
71
71
  transitionCoordinationState
72
- } from "./index-g6nen3gt.js";
72
+ } from "./index-9p00xent.js";
73
73
  import {
74
74
  DURABILITY_CLASSES,
75
75
  getProjectDb,
76
76
  projectDbExists,
77
77
  withDurabilityClass
78
- } from "./index-yqbnsmmv.js";
78
+ } from "./index-bdqefjxg.js";
79
79
  import {
80
80
  assertProjectRoot,
81
81
  tryAcquireLock,
82
82
  withEvidenceLock
83
- } from "./index-evxd1art.js";
83
+ } from "./index-yf1mvexg.js";
84
84
  import {
85
85
  emit
86
- } from "./index-9dz2ee2g.js";
86
+ } from "./index-jmn35na4.js";
87
87
  import {
88
88
  atomicWriteSwarmFileSync,
89
89
  invalidateCachedArtifact,
90
90
  readCachedParsedFile
91
- } from "./index-nbdmdyke.js";
91
+ } from "./index-ws3ggk1h.js";
92
92
  import {
93
93
  canonicalRootKeyFresh
94
94
  } from "./index-1xnse449.js";
95
95
  import {
96
96
  PlanSchema
97
- } from "./index-5a8q4qr5.js";
97
+ } from "./index-zcjdw8dw.js";
98
98
  import {
99
99
  GIT_BINARY_ENV_VAR,
100
100
  describeGitResolution,
@@ -104,7 +104,7 @@ import {
104
104
  import {
105
105
  ZodError,
106
106
  init_zod
107
- } from "./index-bpmtbmy9.js";
107
+ } from "./index-gknz3bv1.js";
108
108
  import {
109
109
  init_executor,
110
110
  isUntrustedEnvKey,
@@ -1880,6 +1880,11 @@ var _internals5 = {
1880
1880
  loadPlanJsonOnly,
1881
1881
  readPlanJsonUtf8,
1882
1882
  readPlanFileUtf8,
1883
+ verifyWrittenPlanJson,
1884
+ ledgerExists,
1885
+ replayFromLedger,
1886
+ loadLastApprovedPlan,
1887
+ readLedgerEventsWithIntegrity,
1883
1888
  regeneratePlanMarkdown,
1884
1889
  isGitRepo,
1885
1890
  isEpicModeActiveForProject,
@@ -2265,14 +2270,20 @@ async function loadPlan(directory, cache) {
2265
2270
  rawPlanId = derivePlanId(rawParsed);
2266
2271
  }
2267
2272
  } catch {}
2268
- if (await ledgerExists(directory)) {
2269
- const ledgerEventsForCatch = await readLedgerEvents(directory);
2273
+ if (await _internals5.ledgerExists(directory)) {
2274
+ const catchIntegrity = await _internals5.readLedgerEventsWithIntegrity(directory);
2275
+ const ledgerEventsForCatch = catchIntegrity.events;
2270
2276
  const catchFirstEvent = ledgerEventsForCatch.length > 0 ? ledgerEventsForCatch[0] : null;
2271
2277
  const identityMatch = rawPlanId === null || catchFirstEvent === null || catchFirstEvent.plan_id === rawPlanId;
2272
2278
  if (!identityMatch) {
2273
2279
  warn(`[loadPlan] Ledger identity mismatch in validation-failure path (ledger: ${catchFirstEvent?.plan_id}, plan: ${rawPlanId}) \u2014 skipping ledger rebuild (migration detected).`);
2274
2280
  } else if (catchFirstEvent !== null && rawPlanId !== null) {
2275
- const rebuilt = await replayFromLedger(directory);
2281
+ let rebuilt = null;
2282
+ try {
2283
+ rebuilt = await _internals5.replayFromLedger(directory);
2284
+ } catch (replayError) {
2285
+ warn(`[loadPlan] Ledger replay threw in validation-failure path: ${replayError instanceof Error ? replayError.message : String(replayError)}. Falling back to critic-approved snapshot before legacy migration.`);
2286
+ }
2276
2287
  if (rebuilt) {
2277
2288
  await rebuildPlan(directory, rebuilt, {
2278
2289
  reason: "validation_failure_recovery"
@@ -2280,6 +2291,30 @@ async function loadPlan(directory, cache) {
2280
2291
  warn("[loadPlan] Rebuilt plan from ledger after validation failure. Projection was stale.");
2281
2292
  return rebuilt;
2282
2293
  }
2294
+ try {
2295
+ const approved = await _internals5.loadLastApprovedPlan(directory, catchFirstEvent.plan_id);
2296
+ if (approved) {
2297
+ const { removedCount } = await savePlanWithAutoAcknowledgedRemovals(directory, approved.plan, "load_plan_recovery_from_approved_snapshot", "restore from critic-approved snapshot");
2298
+ if (removedCount > 0) {
2299
+ approved.plan._midLoadRemovals = {
2300
+ count: removedCount,
2301
+ source: "load_plan_recovery_from_approved_snapshot"
2302
+ };
2303
+ }
2304
+ try {
2305
+ await takeSnapshotEvent(directory, approved.plan, {
2306
+ source: "recovery_from_approved_snapshot",
2307
+ approvalMetadata: approved.approval
2308
+ });
2309
+ } catch (healError) {
2310
+ warn(`[loadPlan] Recovery-heal snapshot append failed: ${healError instanceof Error ? healError.message : String(healError)}. Next loadPlan may re-enter recovery path.`);
2311
+ }
2312
+ warn(`[loadPlan] Recovered from critic-approved snapshot seq=${approved.seq} after validation failure with exhausted ledger replay (approved snapshot beats lossy Markdown migration).`);
2313
+ return approved.plan;
2314
+ }
2315
+ } catch (approvedError) {
2316
+ warn(`[loadPlan] Approved-snapshot recovery failed in validation-failure path: ${approvedError instanceof Error ? approvedError.message : String(approvedError)}`);
2317
+ }
2283
2318
  }
2284
2319
  }
2285
2320
  const planMdContent2 = await readSwarmFileAsync(directory, "plan.md", cache);
@@ -2292,12 +2327,13 @@ async function loadPlan(directory, cache) {
2292
2327
  source: "load_plan_migration_from_md"
2293
2328
  };
2294
2329
  }
2330
+ await appendMigrationProvenanceEvent(directory, migrated);
2295
2331
  return migrated;
2296
2332
  }
2297
2333
  }
2298
2334
  }
2299
2335
  }
2300
- if (await ledgerExists(directory)) {
2336
+ if (await _internals5.ledgerExists(directory)) {
2301
2337
  const resolvedDir = canonicalRootKeyFresh(directory);
2302
2338
  const existingMutex = recoveryMutexes.get(resolvedDir);
2303
2339
  if (existingMutex) {
@@ -2312,7 +2348,12 @@ async function loadPlan(directory, cache) {
2312
2348
  });
2313
2349
  recoveryMutexes.set(resolvedDir, mutex);
2314
2350
  try {
2315
- const rebuilt = await replayFromLedger(directory);
2351
+ let rebuilt = null;
2352
+ try {
2353
+ rebuilt = await _internals5.replayFromLedger(directory);
2354
+ } catch (replayError) {
2355
+ warn(`[loadPlan] Ledger replay threw in missing-projection path: ${replayError instanceof Error ? replayError.message : String(replayError)}. Falling back to critic-approved snapshot before legacy migration.`);
2356
+ }
2316
2357
  if (rebuilt) {
2317
2358
  const { removedCount } = await savePlanWithAutoAcknowledgedRemovals(directory, rebuilt, "load_plan_rebuild_from_ledger", "rebuild plan from ledger replay");
2318
2359
  if (removedCount > 0) {
@@ -2324,13 +2365,14 @@ async function loadPlan(directory, cache) {
2324
2365
  return rebuilt;
2325
2366
  }
2326
2367
  try {
2327
- const anchorEvents = await readLedgerEvents(directory);
2368
+ const anchorIntegrity = await _internals5.readLedgerEventsWithIntegrity(directory);
2369
+ const anchorEvents = anchorIntegrity.events;
2328
2370
  if (anchorEvents.length === 0) {
2329
2371
  warn("[loadPlan] Ledger present but no events readable \u2014 refusing approved-snapshot recovery (cannot verify plan identity).");
2330
2372
  return null;
2331
2373
  }
2332
2374
  const expectedPlanId = anchorEvents[0].plan_id;
2333
- const approved = await loadLastApprovedPlan(directory, expectedPlanId);
2375
+ const approved = await _internals5.loadLastApprovedPlan(directory, expectedPlanId);
2334
2376
  if (approved) {
2335
2377
  const approvedPhase = approved.approval && typeof approved.approval === "object" && "phase" in approved.approval ? approved.approval.phase : undefined;
2336
2378
  warn(`[loadPlan] Ledger replay returned no plan \u2014 recovered from critic-approved snapshot seq=${approved.seq} timestamp=${approved.timestamp} (approval phase=${approvedPhase ?? "unknown"}). This may roll the plan back to an earlier phase \u2014 verify before continuing.`);
@@ -2362,7 +2404,14 @@ async function loadPlan(directory, cache) {
2362
2404
  const planMdContent = await readSwarmFileAsync(directory, "plan.md", cache);
2363
2405
  if (planMdContent !== null) {
2364
2406
  const migrated = migrateLegacyPlan(planMdContent);
2365
- await savePlan(directory, migrated);
2407
+ const { removedCount } = await savePlanWithAutoAcknowledgedRemovals(directory, migrated, "load_plan_migration_from_md", "migrate legacy plan.md to plan.json");
2408
+ if (removedCount > 0) {
2409
+ migrated._midLoadRemovals = {
2410
+ count: removedCount,
2411
+ source: "load_plan_migration_from_md"
2412
+ };
2413
+ }
2414
+ await appendMigrationProvenanceEvent(directory, migrated);
2366
2415
  return migrated;
2367
2416
  }
2368
2417
  return null;
@@ -2403,6 +2452,57 @@ async function withPlanLifecycleLock(directory, taskId, fn) {
2403
2452
  }
2404
2453
  }
2405
2454
  }
2455
+
2456
+ class PlanWriteVerificationError extends Error {
2457
+ constructor(message) {
2458
+ super(message);
2459
+ this.name = "PlanWriteVerificationError";
2460
+ }
2461
+ }
2462
+ var PLAN_WRITE_VERIFY_READ_RETRIES = 4;
2463
+ var PLAN_WRITE_VERIFY_READ_BACKOFF_MS = 200;
2464
+ async function verifyWrittenPlanJson(directory, expected) {
2465
+ let content;
2466
+ try {
2467
+ content = await readSwarmFileAsync(directory, "plan.json", undefined, (filePath) => _internals5.readPlanFileUtf8(filePath), false);
2468
+ } catch (error2) {
2469
+ throw new PlanWriteVerificationError(`PLAN_WRITE_VERIFICATION_FAILED: plan.json read-back could not be read (${error2 instanceof Error ? error2.message : String(error2)})`);
2470
+ }
2471
+ for (let attempt = 0;content === null && attempt < PLAN_WRITE_VERIFY_READ_RETRIES; attempt++) {
2472
+ await new Promise((resolve3) => setTimeout(resolve3, PLAN_WRITE_VERIFY_READ_BACKOFF_MS * (attempt + 1)));
2473
+ try {
2474
+ content = await readSwarmFileAsync(directory, "plan.json", undefined, (filePath) => _internals5.readPlanFileUtf8(filePath), false);
2475
+ } catch {}
2476
+ }
2477
+ if (content === null) {
2478
+ throw new PlanWriteVerificationError("PLAN_WRITE_VERIFICATION_FAILED: plan.json read-back returned no content after write");
2479
+ }
2480
+ let parsed;
2481
+ try {
2482
+ parsed = JSON.parse(content);
2483
+ } catch (error2) {
2484
+ throw new PlanWriteVerificationError(`PLAN_WRITE_VERIFICATION_FAILED: plan.json read-back did not parse (${error2 instanceof Error ? error2.message : String(error2)})`);
2485
+ }
2486
+ if (JSON.stringify(parsed) !== JSON.stringify(expected)) {
2487
+ throw new PlanWriteVerificationError("PLAN_WRITE_VERIFICATION_FAILED: plan.json read-back content differs from the projected plan");
2488
+ }
2489
+ }
2490
+ async function appendMigrationProvenanceEvent(directory, plan) {
2491
+ try {
2492
+ await appendLedgerEvent(directory, {
2493
+ event_type: "plan_rebuilt",
2494
+ source: "load_plan_migration_from_md",
2495
+ plan_id: derivePlanId(plan),
2496
+ payload: {
2497
+ reason: "load_plan_migration_from_md",
2498
+ phases_count: plan.phases.length,
2499
+ tasks_count: plan.phases.reduce((sum, phase) => sum + phase.tasks.length, 0)
2500
+ }
2501
+ });
2502
+ } catch (error2) {
2503
+ warn(`[loadPlan] Markdown-migration provenance event append failed (plan remains migrated): ${error2 instanceof Error ? error2.message : String(error2)}`);
2504
+ }
2505
+ }
2406
2506
  async function savePlan(directory, plan, options) {
2407
2507
  if (directory === null || directory === undefined || typeof directory !== "string" || directory.trim().length === 0) {
2408
2508
  throw new Error(`Invalid directory: directory must be a non-empty string`);
@@ -2414,11 +2514,10 @@ async function savePlan(directory, plan, options) {
2414
2514
  throw new PlanConcurrentModificationError(`Plan write blocked: plan.json is locked by ${lockResult.existing?.agent ?? "another agent"} (task: ${lockResult.existing?.taskId ?? "unknown"})`);
2415
2515
  }
2416
2516
  try {
2417
- await savePlan(directory, plan, {
2517
+ return await savePlan(directory, plan, {
2418
2518
  ...options,
2419
2519
  planLockAlreadyHeld: true
2420
2520
  });
2421
- return;
2422
2521
  } finally {
2423
2522
  if (lockResult.lock._release) {
2424
2523
  await lockResult.lock._release().catch(() => {});
@@ -2491,7 +2590,7 @@ async function savePlan(directory, plan, options) {
2491
2590
  throw new PlanConcurrentModificationError("RECONCILE_LEDGER_PROJECTION_STALE: the ledger identity or tail changed before the recovery snapshot could be appended.");
2492
2591
  }
2493
2592
  try {
2494
- const integrity = await readLedgerEventsWithIntegrity(directory);
2593
+ const integrity = await _internals5.readLedgerEventsWithIntegrity(directory);
2495
2594
  if (integrity.truncated) {
2496
2595
  await replaceTruncatedLedgerWithRecoveryRoot(directory, validated, {
2497
2596
  seq: expected.expectedSeq,
@@ -2633,7 +2732,7 @@ async function savePlan(directory, plan, options) {
2633
2732
  }
2634
2733
  }
2635
2734
  const ledgerStatusTaskIds = collectLedgerStatusTaskIds(await readLedgerEvents(directory));
2636
- const replayedBeforeProjection = await replayFromLedger(directory);
2735
+ const replayedBeforeProjection = await _internals5.replayFromLedger(directory);
2637
2736
  const projectionCandidate = replayedBeforeProjection ? mergeStatusesTakingPrecedence(validated, replayedBeforeProjection, ledgerStatusTaskIds) : validated;
2638
2737
  if (replayedBeforeProjection && computePlanLedgerHash(replayedBeforeProjection) !== computePlanLedgerHash(projectionCandidate)) {
2639
2738
  options?.preCommitCheck?.();
@@ -2664,6 +2763,7 @@ async function savePlan(directory, plan, options) {
2664
2763
  } catch {}
2665
2764
  }
2666
2765
  invalidateCachedArtifact(planPath);
2766
+ await _internals5.verifyWrittenPlanJson(directory, projectedPlan);
2667
2767
  try {
2668
2768
  const markerPath = path4.join(swarmDir, ".plan-write-marker");
2669
2769
  const inProgressMarker = JSON.stringify({
@@ -2675,6 +2775,7 @@ async function savePlan(directory, plan, options) {
2675
2775
  });
2676
2776
  await bunWrite(markerPath, inProgressMarker);
2677
2777
  } catch {}
2778
+ let mdWriteError;
2678
2779
  try {
2679
2780
  const contentHash = computePlanContentHash(projectedPlan);
2680
2781
  const markdown = derivePlanMarkdown(projectedPlan);
@@ -2693,6 +2794,7 @@ ${markdown}`;
2693
2794
  invalidateCachedArtifact(mdPath);
2694
2795
  } catch (mdError) {
2695
2796
  const message = mdError instanceof Error ? mdError.message : String(mdError);
2797
+ mdWriteError = message;
2696
2798
  warn(`[savePlan] plan.md write failed (non-fatal, plan.json is authoritative): ${message}`);
2697
2799
  try {
2698
2800
  emit("plan_md_write_failed", {
@@ -2745,6 +2847,14 @@ ${markdown}`;
2745
2847
  warn(`[savePlan] task checkpoint receipt lifecycle sync failed (plan remains authoritative): ${receiptError instanceof Error ? receiptError.message : String(receiptError)}`);
2746
2848
  }
2747
2849
  }
2850
+ if (mdWriteError !== undefined) {
2851
+ return {
2852
+ durability: "incomplete",
2853
+ degraded_surfaces: ["plan.md"],
2854
+ md_write_error: mdWriteError
2855
+ };
2856
+ }
2857
+ return { durability: "complete", degraded_surfaces: [] };
2748
2858
  }
2749
2859
  async function rebuildPlan(directory, plan, options) {
2750
2860
  assertProjectRoot(directory);
@@ -4166,4 +4276,4 @@ function mergeDurableGateEntriesFromEvidence(taskId, entries, evidence) {
4166
4276
  return merged;
4167
4277
  }
4168
4278
 
4169
- export { normalizePath, buildTaskCompletionDescriptor, ensureTaskCheckpointReceipt, updateTaskCheckpointReceipt, MAX_TRANSIENT_RETRIES, isTransientSpawnError, transientBackoff, readLaneEnvFileFromDiskSync, getGitRepositoryStatus, isGitRepo, getDefaultBaseBranch, detectDefaultRemoteBranch, resetToRemoteBranch, resetToMainAfterMerge, isStateUnreadable, loadEpicSessionState, isEpicModeActive, enableEpicMode, disableEpicMode, pathsConflict, isGlobalFile, isProtectedPath, readTaskScopes, loadPlanJsonOnly, loadPlan, withPlanLifecycleLock, savePlan, closePlanTerminalState, updateTaskStatus, derivePlanMarkdown, isValidEvidenceType, isSecretscanEvidence, sanitizeTaskId2 as sanitizeTaskId, validateProjectRoot, saveEvidence, loadEvidence, listEvidenceTaskIds, checkRequirementCoverage, archiveEvidence, readDurableGateEvidence, getDurableGateEvidenceStatus, getDurableGateEvidenceStatusForTask, mergeDurableGateEntriesFromEvidence };
4279
+ export { normalizePath, buildTaskCompletionDescriptor, ensureTaskCheckpointReceipt, updateTaskCheckpointReceipt, MAX_TRANSIENT_RETRIES, isTransientSpawnError, transientBackoff, readLaneEnvFileFromDiskSync, getGitRepositoryStatus, isGitRepo, getDefaultBaseBranch, detectDefaultRemoteBranch, resetToRemoteBranch, resetToMainAfterMerge, isStateUnreadable, loadEpicSessionState, isEpicModeActive, enableEpicMode, disableEpicMode, pathsConflict, isGlobalFile, isProtectedPath, readTaskScopes, loadPlanJsonOnly, loadPlan, withPlanLifecycleLock, savePlan, closePlanTerminalState, updateTaskStatus, derivePlanMarkdown, isValidEvidenceType, isSecretscanEvidence, sanitizeTaskId2 as sanitizeTaskId, validateProjectRoot, saveEvidence, loadEvidence, listEvidenceTaskIds, checkRequirementCoverage, archiveEvidence, _internals7 as _internals, readDurableGateEvidence, getDurableGateEvidenceStatus, getDurableGateEvidenceStatusForTask, mergeDurableGateEntriesFromEvidence };
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  authorizeCuration
4
- } from "./index-0caqxnby.js";
4
+ } from "./index-hydccmm1.js";
5
5
  import {
6
6
  findNearDuplicate,
7
7
  inferTags,
@@ -9,13 +9,13 @@ import {
9
9
  resolveSwarmKnowledgePath,
10
10
  resolveSwarmRejectedPath,
11
11
  transactKnowledge
12
- } from "./index-r60cw2jt.js";
12
+ } from "./index-j8warkkj.js";
13
13
  import {
14
14
  resolveKnowledgeStoreDir
15
- } from "./index-95e3a9en.js";
15
+ } from "./index-jzrx2sx2.js";
16
16
  import {
17
17
  atomicWriteFile
18
- } from "./index-evxd1art.js";
18
+ } from "./index-yf1mvexg.js";
19
19
  import {
20
20
  require_proper_lockfile
21
21
  } from "./index-7g4c7s5r.js";
@@ -2,14 +2,14 @@
2
2
  import {
3
3
  init_loader,
4
4
  loadPluginConfigWithMeta
5
- } from "./index-5a8q4qr5.js";
5
+ } from "./index-zcjdw8dw.js";
6
6
  import {
7
7
  init_schema
8
- } from "./index-q2yk70rs.js";
8
+ } from "./index-twpzfwga.js";
9
9
  import {
10
10
  DEFAULT_WORKTREE_ISOLATION_CONFIG,
11
11
  init_constants
12
- } from "./index-sxt7fgcw.js";
12
+ } from "./index-ecaws78e.js";
13
13
 
14
14
  // src/config/index.ts
15
15
  init_constants();
@@ -1,10 +1,10 @@
1
1
  // @bun
2
2
  import {
3
3
  observeStoreHealth
4
- } from "./index-nfs78aqj.js";
4
+ } from "./index-gdrdtbw6.js";
5
5
  import {
6
6
  telemetry
7
- } from "./index-9dz2ee2g.js";
7
+ } from "./index-jmn35na4.js";
8
8
  import {
9
9
  init_logger,
10
10
  warn
@@ -4,7 +4,7 @@ import {
4
4
  getProjectDb,
5
5
  projectDbExists,
6
6
  withImmediateTransaction
7
- } from "./index-yqbnsmmv.js";
7
+ } from "./index-bdqefjxg.js";
8
8
 
9
9
  // src/db/coordination-store.ts
10
10
  import { createHash } from "crypto";
@@ -7,7 +7,7 @@ import {
7
7
  } from "./index-ry16d01s.js";
8
8
  import {
9
9
  atomicWriteSwarmFileSync
10
- } from "./index-nbdmdyke.js";
10
+ } from "./index-ws3ggk1h.js";
11
11
  import {
12
12
  canonicalRootKeyFresh,
13
13
  lexicalRootAliasKey