opencode-swarm 7.145.1 → 7.146.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/.opencode/skills/phase-wrap/SKILL.md +3 -2
  2. package/README.md +5 -1
  3. package/dist/cli/{config-doctor-96jmxr7s.js → config-doctor-vs6hvbew.js} +3 -3
  4. package/dist/cli/{core-w78pc1hh.js → core-jvvm935f.js} +2 -2
  5. package/dist/cli/{curation-policy-smyc2mrm.js → curation-policy-xv0j8zyt.js} +6 -6
  6. package/dist/cli/{curator-59hzdxrv.js → curator-5bxh1djq.js} +28 -28
  7. package/dist/cli/{curator-llm-factory-g794pv51.js → curator-llm-factory-pe6skby4.js} +28 -28
  8. package/dist/cli/{evidence-summary-service-41m0cna6.js → evidence-summary-service-6m9jmzk8.js} +12 -12
  9. package/dist/cli/{gate-evidence-7aywx7qa.js → gate-evidence-84sfx6g8.js} +7 -7
  10. package/dist/cli/{guardrail-explain-j88dhm6w.js → guardrail-explain-jhbxq8yb.js} +29 -29
  11. package/dist/cli/{guardrail-log-xcb3ke8s.js → guardrail-log-vpbp3rm4.js} +4 -4
  12. package/dist/cli/{hive-promoter-nnnx5692.js → hive-promoter-mmmfszv8.js} +28 -28
  13. package/dist/cli/{index-34tawmyx.js → index-0a0asz2s.js} +1 -1
  14. package/dist/cli/{index-2qrd8mfa.js → index-4p3qfb05.js} +1 -1
  15. package/dist/cli/{index-gey2257h.js → index-5e5a1y2r.js} +1 -1
  16. package/dist/cli/{index-17e73wac.js → index-5qwmpamg.js} +1 -1
  17. package/dist/cli/{index-41t3hgaa.js → index-92cxd0r1.js} +247 -29
  18. package/dist/cli/{index-rtkttser.js → index-97psh79d.js} +1 -1
  19. package/dist/cli/{index-gf03198s.js → index-bghwrr59.js} +1 -1
  20. package/dist/cli/{index-tw8ck794.js → index-bma2wrqx.js} +2 -2
  21. package/dist/cli/{index-v3y3qg48.js → index-cpg98bh1.js} +17 -1
  22. package/dist/cli/{index-kxzgnz2h.js → index-d4e6wpkg.js} +14 -7
  23. package/dist/cli/{index-sfemjcb8.js → index-f17j50dx.js} +5 -5
  24. package/dist/cli/{index-7axx11dt.js → index-fay8h6v8.js} +25 -5
  25. package/dist/cli/{index-19v4tccw.js → index-fyr2wbvz.js} +2 -2
  26. package/dist/cli/{index-cqfp05jb.js → index-fzqhn96z.js} +3 -3
  27. package/dist/cli/{index-mrkgxfeh.js → index-g3xt1d16.js} +4 -4
  28. package/dist/cli/{index-evpgszmp.js → index-gxbhp7sx.js} +2 -2
  29. package/dist/cli/{index-mpf01swm.js → index-j20fzn0w.js} +2 -2
  30. package/dist/cli/{index-xz4x17z0.js → index-j43qndgc.js} +30 -30
  31. package/dist/cli/{index-neh8azwc.js → index-jfcgnvg6.js} +3 -3
  32. package/dist/cli/{index-qpke2x5h.js → index-kfmee1cr.js} +6 -6
  33. package/dist/cli/{index-4evasm2b.js → index-kggqpefz.js} +5 -5
  34. package/dist/cli/{index-90w06fqr.js → index-kwxp0z0n.js} +4 -4
  35. package/dist/cli/{index-b7ntt9cw.js → index-n6ke10ck.js} +4 -4
  36. package/dist/cli/{index-fwnhh6s7.js → index-nsr5b69r.js} +2 -2
  37. package/dist/cli/{index-bst6epnr.js → index-pz2py5v7.js} +1876 -1065
  38. package/dist/cli/{index-8ef23wex.js → index-q2mvacjr.js} +4 -4
  39. package/dist/cli/{index-dppzthm9.js → index-qyvjp0bq.js} +2 -2
  40. package/dist/cli/{index-tm0bezd9.js → index-s8qyaqs2.js} +1 -1
  41. package/dist/cli/{index-ymyke19q.js → index-vk15nbh4.js} +2 -2
  42. package/dist/cli/{index-dzan8czb.js → index-x8pm918t.js} +1 -1
  43. package/dist/cli/{index-ff66fbjt.js → index-zd1mfygt.js} +177 -29
  44. package/dist/cli/{index-zpp507z0.js → index-zsmsy1dh.js} +2 -2
  45. package/dist/cli/index.js +28 -28
  46. package/dist/cli/{knowledge-escalator-s6acdpwj.js → knowledge-escalator-c9p3w12b.js} +12 -12
  47. package/dist/cli/{knowledge-events-jprkz49t.js → knowledge-events-d201414m.js} +10 -10
  48. package/dist/cli/{knowledge-link-zvtmj756.js → knowledge-link-82ew2yc4.js} +5 -5
  49. package/dist/cli/{knowledge-store-mc4awds4.js → knowledge-store-ds45k9th.js} +6 -6
  50. package/dist/cli/{knowledge-validator-pe4ncrvj.js → knowledge-validator-707vsncy.js} +8 -8
  51. package/dist/cli/{model-preflight-77dwxfv5.js → model-preflight-7ea00h34.js} +1 -1
  52. package/dist/cli/{pending-delegations-epzht3d7.js → pending-delegations-kkrczqv7.js} +3 -3
  53. package/dist/cli/{pr-subscriptions-2ahy8g87.js → pr-subscriptions-2xn238xt.js} +3 -3
  54. package/dist/cli/{runner-ra9pjhp2.js → runner-pqsf809k.js} +6 -6
  55. package/dist/cli/{scan-cursor-hdzhqwzj.js → scan-cursor-znhqb8xa.js} +7 -7
  56. package/dist/cli/{schema-pg85z06v.js → schema-dnnm0p40.js} +2 -2
  57. package/dist/cli/{scope-persistence-v8we8ja7.js → scope-persistence-4n24a1e2.js} +8 -8
  58. package/dist/cli/{skill-generator-ctskfct2.js → skill-generator-5s0p3y8k.js} +14 -14
  59. package/dist/cli/{telemetry-c21dgffc.js → telemetry-t109dhv7.js} +1 -1
  60. package/dist/cli/{worktree-collision-ownership-f7se4wbf.js → worktree-collision-ownership-2jtg2my1.js} +3 -3
  61. package/dist/cli/{worktree-isolation-j4qb7mgb.js → worktree-isolation-1v2mythh.js} +28 -28
  62. package/dist/commands/memory.d.ts +8 -0
  63. package/dist/commands/registry.d.ts +8 -0
  64. package/dist/config/schema.d.ts +16 -2
  65. package/dist/evidence/task-gate-repair.d.ts +26 -0
  66. package/dist/evidence/task-gate-requirements.d.ts +20 -0
  67. package/dist/gate-evidence.d.ts +7 -0
  68. package/dist/hooks/knowledge-receipt-ledger-storage.d.ts +2 -0
  69. package/dist/hooks/knowledge-receipt-ledger.d.ts +72 -3
  70. package/dist/hooks/knowledge-receipt-observability.d.ts +1 -1
  71. package/dist/hooks/phase-complete-directive-gate.d.ts +9 -0
  72. package/dist/index.js +593 -537
  73. package/dist/memory/config.d.ts +20 -0
  74. package/dist/memory/errors.d.ts +14 -0
  75. package/dist/memory/gateway.d.ts +32 -0
  76. package/dist/memory/index.d.ts +3 -2
  77. package/dist/memory/pii.d.ts +66 -0
  78. package/dist/memory/prompt-block.d.ts +1 -1
  79. package/dist/memory/provider.d.ts +15 -0
  80. package/dist/memory/redaction.d.ts +31 -8
  81. package/dist/memory/schema.d.ts +18 -0
  82. package/dist/memory/sentinel.d.ts +12 -0
  83. package/dist/memory/sqlite-provider.d.ts +93 -0
  84. package/dist/memory/types.d.ts +9 -0
  85. package/dist/plan/manager.d.ts +8 -0
  86. package/dist/review/diff-source.d.ts +30 -0
  87. package/dist/review/engine.d.ts +1 -0
  88. package/dist/review/evidence.d.ts +16 -2
  89. package/dist/review/phase-runner.d.ts +1 -0
  90. package/dist/tools/completion-verify.d.ts +2 -0
  91. package/dist/tools/convene-council.d.ts +1 -1
  92. package/dist/tools/index.d.ts +4 -0
  93. package/dist/tools/manifest.d.ts +4 -0
  94. package/dist/tools/phase-complete/gates/final-review-gate.d.ts +3 -3
  95. package/dist/tools/phase-complete/gates/types.d.ts +2 -2
  96. package/dist/tools/phase-complete/preflight-report.d.ts +66 -0
  97. package/dist/tools/phase-complete/snapshot-identity.d.ts +1 -0
  98. package/dist/tools/phase-complete.d.ts +66 -3
  99. package/dist/tools/record-directive-override.d.ts +14 -0
  100. package/dist/tools/repair-gate-evidence.d.ts +6 -0
  101. package/dist/tools/repair-knowledge-receipt-ledger.d.ts +27 -0
  102. package/dist/tools/run-phase-review.d.ts +37 -0
  103. package/dist/tools/submit-phase-council-verdicts.d.ts +1 -1
  104. package/dist/tools/tool-metadata.d.ts +32 -16
  105. package/dist/tools/write-final-council-evidence.d.ts +1 -1
  106. package/dist/tools/write-retro.d.ts +2 -0
  107. package/package.json +12 -2
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  authorizeCuration
4
- } from "./index-2qrd8mfa.js";
4
+ } from "./index-4p3qfb05.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-qpke2x5h.js";
12
+ } from "./index-kfmee1cr.js";
13
13
  import {
14
14
  resolveKnowledgeStoreDir
15
- } from "./index-dzan8czb.js";
15
+ } from "./index-x8pm918t.js";
16
16
  import {
17
17
  atomicWriteFile
18
- } from "./index-mpf01swm.js";
18
+ } from "./index-j20fzn0w.js";
19
19
  import {
20
20
  require_proper_lockfile
21
21
  } from "./index-7g4c7s5r.js";
@@ -572,7 +572,7 @@ var CATALOG_SOURCE = [
572
572
  category: "plan",
573
573
  severity: "warning",
574
574
  privacyClass: "sensitive",
575
- producer: "src/plan/manager.ts:1842",
575
+ producer: "src/plan/manager.ts:1861",
576
576
  consumers: NO_CONSUMERS,
577
577
  futureOwnerIssue: ISSUE_SINK,
578
578
  retentionOwnerIssue: ISSUE_PLAN_EVIDENCE_RETENTION,
@@ -626,7 +626,7 @@ var CATALOG_SOURCE = [
626
626
  category: "knowledge",
627
627
  severity: "info",
628
628
  privacyClass: "pseudonymous",
629
- producer: "src/hooks/knowledge-receipt-observability.ts:191",
629
+ producer: "src/hooks/knowledge-receipt-observability.ts:197",
630
630
  consumers: NO_CONSUMERS,
631
631
  futureOwnerIssue: ISSUE_SINK,
632
632
  retentionOwnerIssue: ISSUE_LIFECYCLE_RETENTION,
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  redactPath,
4
4
  redactShellCommand
5
- } from "./index-ymyke19q.js";
5
+ } from "./index-vk15nbh4.js";
6
6
 
7
7
  // src/services/guardrail-log-service.ts
8
8
  import * as fs from "fs/promises";
@@ -11,10 +11,10 @@ import {
11
11
  import {
12
12
  init_schema,
13
13
  stripKnownSwarmPrefix
14
- } from "./index-7axx11dt.js";
14
+ } from "./index-fay8h6v8.js";
15
15
  import {
16
16
  init_constants
17
- } from "./index-v3y3qg48.js";
17
+ } from "./index-cpg98bh1.js";
18
18
  import {
19
19
  init_logger,
20
20
  warn
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  atomicWriteFile
4
- } from "./index-mpf01swm.js";
4
+ } from "./index-j20fzn0w.js";
5
5
  import {
6
6
  init_logger,
7
7
  warn
@@ -1,11 +1,11 @@
1
1
  // @bun
2
2
  import {
3
3
  loadPluginConfigWithMeta
4
- } from "./index-17e73wac.js";
4
+ } from "./index-5qwmpamg.js";
5
5
  import {
6
6
  KnowledgeConfigSchema,
7
7
  init_schema
8
- } from "./index-7axx11dt.js";
8
+ } from "./index-fay8h6v8.js";
9
9
  import {
10
10
  validateSwarmPath
11
11
  } from "./index-w8pgjr75.js";
@@ -14,16 +14,16 @@ import {
14
14
  } from "./index-ae75rja9.js";
15
15
  import {
16
16
  resolveKnowledgeStoreDir
17
- } from "./index-dzan8czb.js";
17
+ } from "./index-x8pm918t.js";
18
18
  import {
19
19
  atomicWriteFile
20
- } from "./index-mpf01swm.js";
20
+ } from "./index-j20fzn0w.js";
21
21
  import {
22
22
  assertProjectRoot
23
- } from "./index-gf03198s.js";
23
+ } from "./index-bghwrr59.js";
24
24
  import {
25
25
  emit
26
- } from "./index-dppzthm9.js";
26
+ } from "./index-qyvjp0bq.js";
27
27
  import {
28
28
  require_proper_lockfile
29
29
  } from "./index-7g4c7s5r.js";
@@ -45,7 +45,7 @@ import * as path2 from "path";
45
45
  init_logger();
46
46
 
47
47
  // src/hooks/knowledge-receipt-ledger.ts
48
- import { randomUUID as randomUUID2 } from "crypto";
48
+ import { createHash as createHash2, randomUUID as randomUUID2 } from "crypto";
49
49
  import { existsSync as existsSync2 } from "fs";
50
50
  init_schema();
51
51
 
@@ -356,17 +356,39 @@ function receiptRecordHash(value) {
356
356
  return createHash("sha256").update(JSON.stringify(value)).digest("hex");
357
357
  }
358
358
  async function readUtf8IfPresent(filePath, maxBytes = 32 * 1024 * 1024) {
359
+ const bytes = await readBytesIfPresent(filePath, maxBytes);
360
+ return bytes === null ? null : bytes.toString("utf8");
361
+ }
362
+ async function readBytesIfPresent(filePath, maxBytes = 32 * 1024 * 1024) {
363
+ let handle;
359
364
  try {
360
365
  validateExistingRegularFile(filePath);
361
- const info = await stat(filePath);
362
- if (info.size > maxBytes) {
366
+ const before = await stat(filePath);
367
+ if (before.size > maxBytes) {
363
368
  throw new ReceiptStoreError("store_corrupt", `receipt artifact exceeds ${maxBytes} bytes: ${path.basename(filePath)}`);
364
369
  }
365
- return await readFile(filePath, "utf8");
370
+ handle = await open(filePath, "r");
371
+ const opened = await handle.stat();
372
+ if (!opened.isFile() || opened.dev !== before.dev || opened.ino !== before.ino || opened.size !== before.size) {
373
+ throw new ReceiptStoreError("store_unavailable", `receipt artifact changed while opening: ${path.basename(filePath)}`);
374
+ }
375
+ const bytes = await handle.readFile();
376
+ const after = await handle.stat();
377
+ if (after.dev !== opened.dev || after.ino !== opened.ino || after.size !== opened.size || after.mtimeMs !== opened.mtimeMs || after.ctimeMs !== opened.ctimeMs) {
378
+ throw new ReceiptStoreError("store_unavailable", `receipt artifact changed while reading: ${path.basename(filePath)}`);
379
+ }
380
+ if (bytes.byteLength > maxBytes) {
381
+ throw new ReceiptStoreError("store_corrupt", `receipt artifact exceeds ${maxBytes} bytes: ${path.basename(filePath)}`);
382
+ }
383
+ return bytes;
366
384
  } catch (error) {
367
385
  if (error.code === "ENOENT")
368
386
  return null;
369
387
  throw error;
388
+ } finally {
389
+ await handle?.close().catch(() => {
390
+ return;
391
+ });
370
392
  }
371
393
  }
372
394
  async function appendFsynced(filePath, line) {
@@ -473,8 +495,11 @@ var TRANSITIONS = new Set([
473
495
  "terminal_attempt_idempotent",
474
496
  "authorized_transition_committed",
475
497
  "application_marker_committed",
498
+ "gate_release_committed",
476
499
  "phase_close_intent",
477
500
  "phase_closed",
501
+ "repair_uncertainty_installed",
502
+ "repair_uncertainty_cleared",
478
503
  "legacy_imported",
479
504
  "legacy_unverifiable",
480
505
  "cutover_completed",
@@ -563,8 +588,8 @@ var CANONICAL_RECEIPT_SOURCES = new Set([
563
588
  "architect_marker",
564
589
  "test_engineer",
565
590
  "phase_override",
566
- "application_gate_staleness_clear",
567
- "application_gate_denial_limit_clear",
591
+ "application_gate_staleness_release",
592
+ "application_gate_denial_limit_release",
568
593
  "manual",
569
594
  "migration",
570
595
  "unknown"
@@ -582,10 +607,13 @@ var MAX_JOURNAL_BYTES = 32 * 1024 * 1024;
582
607
  var MAX_ARCHIVE_RECORDS = 1e4;
583
608
  var MAX_ARCHIVE_BYTES = 16 * 1024 * 1024;
584
609
  var MAX_LEGACY_BYTES = 32 * 1024 * 1024;
610
+ var MAX_REPAIR_CAPTURE_BYTES = 4 * 1024 * 1024;
611
+ var MAX_REPAIR_QUARANTINE_RECORDS = 8;
585
612
  var DEFAULT_RECEIPT_GRACE_DAYS = 7;
586
613
  var keyOf = (traceId, entryId) => `${traceId.length}:${traceId}${entryId}`;
587
614
  var emptyKeyOf = (traceId, sessionId) => `${traceId.length}:${traceId}${sessionId}`;
588
615
  var phaseLifecycleKey = (phase, sessionId, taskId) => `${sessionId.length}:${sessionId}${phase.length}:${phase}${taskId === undefined ? "u:" : `s:${taskId.length}:${taskId}`}`;
616
+ var repairUncertaintyKey = (phase, sessionId) => `${sessionId.length}:${sessionId}${phase.length}:${phase}`;
589
617
  function nowIso() {
590
618
  return new Date(_internals3.nowMs()).toISOString();
591
619
  }
@@ -607,6 +635,7 @@ function emptyState(observations = []) {
607
635
  legacyTraceRegistry: new Set,
608
636
  legacyUnverifiableTraceIds: new Set,
609
637
  phaseLifecycle: new Map,
638
+ repairUncertainties: new Map,
610
639
  auditTail: [],
611
640
  lastSeq: 0,
612
641
  lastHash: GENESIS_HASH,
@@ -707,6 +736,56 @@ function parseApplicationMarker(value) {
707
736
  committed_at: value.committed_at
708
737
  };
709
738
  }
739
+ function parseGateRelease(value) {
740
+ if (!isPlainRecord(value))
741
+ return null;
742
+ if (!hasOnlyKeys(value, [
743
+ "source",
744
+ "reason",
745
+ "event_id",
746
+ "committed_at",
747
+ "membership_event_id"
748
+ ]) || typeof value.source !== "string" || !isOptionalString(value.reason) || typeof value.event_id !== "string" || !value.event_id || !isValidTimestamp(value.committed_at) || typeof value.membership_event_id !== "string" || !value.membership_event_id) {
749
+ return null;
750
+ }
751
+ return {
752
+ source: value.source,
753
+ reason: value.reason,
754
+ event_id: value.event_id,
755
+ committed_at: value.committed_at,
756
+ membership_event_id: value.membership_event_id
757
+ };
758
+ }
759
+ function parseRepairUncertainty(value) {
760
+ if (!isPlainRecord(value))
761
+ return null;
762
+ if (!hasOnlyKeys(value, [
763
+ "phase",
764
+ "session_id",
765
+ "task_id",
766
+ "reason",
767
+ "repair_id",
768
+ "installed_at",
769
+ "raw_journal_sha256",
770
+ "raw_journal_bytes",
771
+ "salvage_through_seq",
772
+ "salvage_through_hash"
773
+ ]) || typeof value.phase !== "string" || !value.phase || typeof value.session_id !== "string" || !value.session_id || !isOptionalString(value.task_id) || typeof value.reason !== "string" || !value.reason || typeof value.repair_id !== "string" || !value.repair_id || !isValidTimestamp(value.installed_at) || typeof value.raw_journal_sha256 !== "string" || !/^[a-f0-9]{64}$/.test(value.raw_journal_sha256) || !Number.isInteger(value.raw_journal_bytes) || value.raw_journal_bytes < 0 || !Number.isInteger(value.salvage_through_seq) || value.salvage_through_seq < 0 || typeof value.salvage_through_hash !== "string" || !value.salvage_through_hash) {
774
+ return null;
775
+ }
776
+ return {
777
+ phase: value.phase,
778
+ session_id: value.session_id,
779
+ task_id: value.task_id,
780
+ reason: value.reason,
781
+ repair_id: value.repair_id,
782
+ installed_at: value.installed_at,
783
+ raw_journal_sha256: value.raw_journal_sha256,
784
+ raw_journal_bytes: value.raw_journal_bytes,
785
+ salvage_through_seq: value.salvage_through_seq,
786
+ salvage_through_hash: value.salvage_through_hash
787
+ };
788
+ }
710
789
  function parseMembership(value) {
711
790
  if (!isPlainRecord(value))
712
791
  return null;
@@ -728,6 +807,7 @@ function parseMembership(value) {
728
807
  "terminal",
729
808
  "terminal_history",
730
809
  "application_marker",
810
+ "gate_release",
731
811
  "cohort_id",
732
812
  "source_link_id",
733
813
  "exposure_kind",
@@ -753,6 +833,9 @@ function parseMembership(value) {
753
833
  const marker = value.application_marker === undefined ? undefined : parseApplicationMarker(value.application_marker);
754
834
  if (marker === null)
755
835
  return null;
836
+ const gateRelease = value.gate_release === undefined ? undefined : parseGateRelease(value.gate_release);
837
+ if (gateRelease === null)
838
+ return null;
756
839
  return {
757
840
  trace_id: value.trace_id,
758
841
  entry_id: value.entry_id,
@@ -771,6 +854,7 @@ function parseMembership(value) {
771
854
  terminal,
772
855
  terminal_history: terminalHistory,
773
856
  application_marker: marker,
857
+ gate_release: gateRelease,
774
858
  cohort_id: value.cohort_id,
775
859
  source_link_id: value.source_link_id,
776
860
  exposure_kind: value.exposure_kind,
@@ -870,8 +954,11 @@ function parseAuditSummary(value) {
870
954
  "terminal_attempt_idempotent",
871
955
  "authorized_transition_committed",
872
956
  "application_marker_committed",
957
+ "gate_release_committed",
873
958
  "phase_close_intent",
874
959
  "phase_closed",
960
+ "repair_uncertainty_installed",
961
+ "repair_uncertainty_cleared",
875
962
  "legacy_imported",
876
963
  "legacy_unverifiable",
877
964
  "cutover_completed",
@@ -951,6 +1038,7 @@ function applyRecord(state, record) {
951
1038
  state.legacyTraceRegistry.clear();
952
1039
  state.legacyUnverifiableTraceIds.clear();
953
1040
  state.phaseLifecycle.clear();
1041
+ state.repairUncertainties.clear();
954
1042
  state.auditTail = [];
955
1043
  if (Array.isArray(memberships)) {
956
1044
  for (const value of memberships) {
@@ -984,6 +1072,12 @@ function applyRecord(state, record) {
984
1072
  if (lifecycle)
985
1073
  state.phaseLifecycle.set(phaseLifecycleKey(lifecycle.phase, lifecycle.session_id, lifecycle.task_id), lifecycle);
986
1074
  }
1075
+ for (const value of Array.isArray(record.payload.repair_uncertainties) ? record.payload.repair_uncertainties : []) {
1076
+ const uncertainty = parseRepairUncertainty(value);
1077
+ if (uncertainty) {
1078
+ state.repairUncertainties.set(repairUncertaintyKey(uncertainty.phase, uncertainty.session_id), uncertainty);
1079
+ }
1080
+ }
987
1081
  for (const value of Array.isArray(record.payload.audit_tail) ? record.payload.audit_tail : []) {
988
1082
  const summary = parseAuditSummary(value);
989
1083
  if (summary)
@@ -1060,6 +1154,15 @@ function applyRecord(state, record) {
1060
1154
  membership.application_marker = { ...marker };
1061
1155
  }
1062
1156
  }
1157
+ } else if (record.kind === "gate_release_committed") {
1158
+ for (const value of Array.isArray(record.payload.releases) ? record.payload.releases : []) {
1159
+ const transition = value;
1160
+ const membership = state.memberships.get(keyOf(transition.trace_id, transition.entry_id));
1161
+ const release = parseGateRelease(transition.release);
1162
+ if (membership && release && release.membership_event_id === membership.membership_event_id) {
1163
+ membership.gate_release = { ...release };
1164
+ }
1165
+ }
1063
1166
  } else if (record.kind === "phase_close_intent" || record.kind === "phase_closed") {
1064
1167
  const phase = record.payload.phase;
1065
1168
  const sessionId = record.payload.session_id;
@@ -1097,6 +1200,22 @@ function applyRecord(state, record) {
1097
1200
  }
1098
1201
  }
1099
1202
  }
1203
+ } else if (record.kind === "repair_uncertainty_installed") {
1204
+ const uncertainty = parseRepairUncertainty(record.payload.uncertainty);
1205
+ if (uncertainty) {
1206
+ state.repairUncertainties.set(repairUncertaintyKey(uncertainty.phase, uncertainty.session_id), uncertainty);
1207
+ }
1208
+ } else if (record.kind === "repair_uncertainty_cleared") {
1209
+ const phase = record.payload.phase;
1210
+ const sessionId = record.payload.session_id;
1211
+ const repairId = record.payload.repair_id;
1212
+ if (typeof phase === "string" && phase && typeof sessionId === "string" && sessionId) {
1213
+ const key = repairUncertaintyKey(phase, sessionId);
1214
+ const existing = state.repairUncertainties.get(key);
1215
+ if (!repairId || existing?.repair_id === repairId) {
1216
+ state.repairUncertainties.delete(key);
1217
+ }
1218
+ }
1100
1219
  } else if (record.kind === "cutover_completed") {
1101
1220
  state.cutoverCompleted = true;
1102
1221
  for (const traceId of Array.isArray(record.payload.imported_trace_ids) ? record.payload.imported_trace_ids : []) {
@@ -1173,6 +1292,8 @@ function validateRecordPayload(row) {
1173
1292
  }
1174
1293
  case "application_marker_committed":
1175
1294
  return hasOnlyKeys(payload, ["markers", "transitions"]) && (payload.markers === undefined || Array.isArray(payload.markers) && payload.markers.every(isMarkerTransition)) && (payload.transitions === undefined || Array.isArray(payload.transitions) && payload.transitions.every(isTerminalTransition)) && (payload.markers !== undefined || payload.transitions !== undefined);
1295
+ case "gate_release_committed":
1296
+ return hasOnlyKeys(payload, ["releases"]) && Array.isArray(payload.releases) && payload.releases.every((item) => isPlainRecord(item) && hasOnlyKeys(item, ["trace_id", "entry_id", "release"]) && typeof item.trace_id === "string" && !!item.trace_id && typeof item.entry_id === "string" && !!item.entry_id && parseGateRelease(item.release) !== null);
1176
1297
  case "terminal_attempt_idempotent":
1177
1298
  return hasOnlyKeys(payload, ["trace_id", "entry_ids"]) && typeof payload.trace_id === "string" && Array.isArray(payload.entry_ids) && payload.entry_ids.every((entryId) => typeof entryId === "string" && !!entryId);
1178
1299
  case "terminal_attempt_rejected":
@@ -1180,6 +1301,18 @@ function validateRecordPayload(row) {
1180
1301
  case "phase_close_intent":
1181
1302
  case "phase_closed":
1182
1303
  return hasOnlyKeys(payload, ["phase", "session_id", "task_id"]) && typeof payload.phase === "string" && !!payload.phase && typeof payload.session_id === "string" && !!payload.session_id && isOptionalString(payload.task_id);
1304
+ case "repair_uncertainty_installed":
1305
+ return hasOnlyKeys(payload, ["uncertainty"]) && parseRepairUncertainty(payload.uncertainty) !== null;
1306
+ case "repair_uncertainty_cleared":
1307
+ return hasOnlyKeys(payload, [
1308
+ "phase",
1309
+ "session_id",
1310
+ "task_id",
1311
+ "repair_id",
1312
+ "cleared_by_event_id",
1313
+ "cleared_by_trace_id",
1314
+ "cleared_by_kind"
1315
+ ]) && typeof payload.phase === "string" && !!payload.phase && typeof payload.session_id === "string" && !!payload.session_id && isOptionalString(payload.task_id) && isOptionalString(payload.repair_id) && typeof payload.cleared_by_event_id === "string" && !!payload.cleared_by_event_id && typeof payload.cleared_by_trace_id === "string" && !!payload.cleared_by_trace_id && (payload.cleared_by_kind === "membership_committed" || payload.cleared_by_kind === "empty_retrieval_committed");
1183
1316
  case "legacy_unverifiable":
1184
1317
  return hasOnlyKeys(payload, ["reason_codes", "trace_ids"]) && Array.isArray(payload.reason_codes) && payload.reason_codes.every((reason) => typeof reason === "string" && !!reason) && (payload.trace_ids === undefined || Array.isArray(payload.trace_ids) && payload.trace_ids.every((traceId) => typeof traceId === "string" && !!traceId));
1185
1318
  case "cutover_completed":
@@ -1193,8 +1326,9 @@ function validateRecordPayload(row) {
1193
1326
  "legacy_trace_registry",
1194
1327
  "legacy_unverifiable_trace_ids",
1195
1328
  "phase_lifecycle",
1329
+ "repair_uncertainties",
1196
1330
  "audit_tail"
1197
- ]) && Array.isArray(payload.memberships) && payload.memberships.every((item) => parseMembership(item) !== null) && Array.isArray(payload.empty_traces) && payload.empty_traces.every((item) => parseEmptyTrace(item) !== null) && typeof payload.cutover_completed === "boolean" && typeof payload.legacy_unverifiable === "boolean" && Array.isArray(payload.legacy_trace_registry) && payload.legacy_trace_registry.every((traceId) => typeof traceId === "string" && !!traceId) && Array.isArray(payload.legacy_unverifiable_trace_ids) && payload.legacy_unverifiable_trace_ids.every((traceId) => typeof traceId === "string" && !!traceId) && Array.isArray(payload.phase_lifecycle) && payload.phase_lifecycle.every((item) => parsePhaseLifecycle(item) !== null) && Array.isArray(payload.audit_tail) && payload.audit_tail.length <= MAX_AUDIT_TAIL_RECORDS && payload.audit_tail.every((item) => parseAuditSummary(item) !== null);
1331
+ ]) && Array.isArray(payload.memberships) && payload.memberships.every((item) => parseMembership(item) !== null) && Array.isArray(payload.empty_traces) && payload.empty_traces.every((item) => parseEmptyTrace(item) !== null) && typeof payload.cutover_completed === "boolean" && typeof payload.legacy_unverifiable === "boolean" && Array.isArray(payload.legacy_trace_registry) && payload.legacy_trace_registry.every((traceId) => typeof traceId === "string" && !!traceId) && Array.isArray(payload.legacy_unverifiable_trace_ids) && payload.legacy_unverifiable_trace_ids.every((traceId) => typeof traceId === "string" && !!traceId) && Array.isArray(payload.phase_lifecycle) && payload.phase_lifecycle.every((item) => parsePhaseLifecycle(item) !== null) && Array.isArray(payload.repair_uncertainties) && payload.repair_uncertainties.every((item) => parseRepairUncertainty(item) !== null) && Array.isArray(payload.audit_tail) && payload.audit_tail.length <= MAX_AUDIT_TAIL_RECORDS && payload.audit_tail.every((item) => parseAuditSummary(item) !== null);
1198
1332
  }
1199
1333
  }
1200
1334
  function validateRecord(value, state) {
@@ -1209,8 +1343,11 @@ function validateRecord(value, state) {
1209
1343
  "terminal_attempt_idempotent",
1210
1344
  "authorized_transition_committed",
1211
1345
  "application_marker_committed",
1346
+ "gate_release_committed",
1212
1347
  "phase_close_intent",
1213
1348
  "phase_closed",
1349
+ "repair_uncertainty_installed",
1350
+ "repair_uncertainty_cleared",
1214
1351
  "legacy_imported",
1215
1352
  "legacy_unverifiable",
1216
1353
  "cutover_completed",
@@ -1240,19 +1377,8 @@ async function loadState(paths, observations = []) {
1240
1377
  try {
1241
1378
  applyRecord(state, validateRecord(JSON.parse(line), state));
1242
1379
  } catch (error) {
1243
- const isPartialTail = i === lines.length - 1 && !endedWithNewline;
1244
- if (isPartialTail) {
1245
- await atomicWriteFsynced(paths.quarantine, `${JSON.stringify({
1246
- recovered_at: nowIso(),
1247
- partial_tail: line.slice(0, 1024 * 1024)
1248
- })}
1249
- `);
1250
- await atomicWriteFsynced(paths.journal, `${lines.slice(0, i).filter(Boolean).join(`
1251
- `)}
1252
- `);
1253
- return state;
1254
- }
1255
- throw new ReceiptStoreError("store_corrupt", `receipt journal corruption at line ${i + 1}: ${error instanceof Error ? error.message : String(error)}`);
1380
+ const tailDetail = i === lines.length - 1 && !endedWithNewline ? " (including an unterminated final record)" : "";
1381
+ throw new ReceiptStoreError("store_corrupt", `receipt journal corruption at line ${i + 1}${tailDetail}: ${error instanceof Error ? error.message : String(error)}`);
1256
1382
  }
1257
1383
  }
1258
1384
  return state;
@@ -1370,6 +1496,23 @@ function queueRecordObservations(state, row) {
1370
1496
  }
1371
1497
  return;
1372
1498
  }
1499
+ if (row.kind === "gate_release_committed") {
1500
+ for (const value of Array.isArray(row.payload.releases) ? row.payload.releases : []) {
1501
+ if (!isPlainRecord(value))
1502
+ continue;
1503
+ const release = parseGateRelease(value.release);
1504
+ if (!release)
1505
+ continue;
1506
+ state.observations.push({
1507
+ ...base,
1508
+ reasonCode: "committed",
1509
+ knowledgeTraceId: typeof value.trace_id === "string" ? value.trace_id : undefined,
1510
+ knowledgeEntryId: typeof value.entry_id === "string" ? value.entry_id : undefined,
1511
+ receiptSource: release.source
1512
+ });
1513
+ }
1514
+ return;
1515
+ }
1373
1516
  if (row.kind === "terminal_attempt_idempotent") {
1374
1517
  for (const entryId of Array.isArray(row.payload.entry_ids) ? row.payload.entry_ids : []) {
1375
1518
  state.observations.push({
@@ -1403,6 +1546,7 @@ async function writeSnapshot(paths, state) {
1403
1546
  legacy_trace_registry: [...state.legacyTraceRegistry].sort(),
1404
1547
  legacy_unverifiable_trace_ids: [...state.legacyUnverifiableTraceIds].sort(),
1405
1548
  phase_lifecycle: [...state.phaseLifecycle.values()],
1549
+ repair_uncertainties: [...state.repairUncertainties.values()],
1406
1550
  audit_tail: state.auditTail
1407
1551
  };
1408
1552
  await atomicWriteFsynced(paths.snapshot, `${JSON.stringify(snapshot)}
@@ -1764,7 +1908,7 @@ async function reconcilePhaseClose(directory, phase, durablePlanClosed, sessionI
1764
1908
  }
1765
1909
  async function compactIfNeeded(paths, state) {
1766
1910
  const now = _internals3.nowMs();
1767
- const eligible = [...state.memberships.values()].filter((m) => m.terminal && m.phase_closed_at && now >= Date.parse(m.phase_closed_at) + m.grace_days * 86400000);
1911
+ const eligible = [...state.memberships.values()].filter((m) => (m.terminal || m.gate_release) && m.phase_closed_at && now >= Date.parse(m.phase_closed_at) + m.grace_days * 86400000);
1768
1912
  const eligibleEmpty = [...state.emptyTraces.values()].filter((trace) => trace.terminal_event_id && trace.phase_closed_at && now >= Date.parse(trace.phase_closed_at) + trace.grace_days * 86400000);
1769
1913
  if (!eligible.length && !eligibleEmpty.length && state.recordCount <= _internals3.maxJournalRecords)
1770
1914
  return;
@@ -1838,6 +1982,7 @@ async function compactIfNeeded(paths, state) {
1838
1982
  fresh.legacyTraceRegistry = new Set(state.legacyTraceRegistry);
1839
1983
  fresh.legacyUnverifiableTraceIds = new Set(state.legacyUnverifiableTraceIds);
1840
1984
  fresh.phaseLifecycle = new Map(state.phaseLifecycle);
1985
+ fresh.repairUncertainties = new Map(state.repairUncertainties);
1841
1986
  fresh.auditTail = [...state.auditTail];
1842
1987
  const checkpoint = makeRecord(fresh, "checkpoint", {
1843
1988
  memberships: [...state.memberships.values()],
@@ -1847,6 +1992,7 @@ async function compactIfNeeded(paths, state) {
1847
1992
  legacy_trace_registry: [...state.legacyTraceRegistry].sort(),
1848
1993
  legacy_unverifiable_trace_ids: [...state.legacyUnverifiableTraceIds].sort(),
1849
1994
  phase_lifecycle: [...state.phaseLifecycle.values()],
1995
+ repair_uncertainties: [...state.repairUncertainties.values()],
1850
1996
  audit_tail: state.auditTail
1851
1997
  });
1852
1998
  await _internals3.atomicWriteFsynced(paths.journal, `${JSON.stringify(checkpoint)}
@@ -1865,10 +2011,12 @@ var _internals3 = {
1865
2011
  nowMs: () => Date.now(),
1866
2012
  writeSnapshot,
1867
2013
  atomicWriteFsynced,
2014
+ appendFsynced,
1868
2015
  commitApplicationMarkerBatch,
1869
2016
  maxJournalRecords: MAX_JOURNAL_RECORDS,
1870
2017
  maxArchiveRecords: MAX_ARCHIVE_RECORDS,
1871
- maxArchiveBytes: MAX_ARCHIVE_BYTES
2018
+ maxArchiveBytes: MAX_ARCHIVE_BYTES,
2019
+ maxRepairQuarantineRecords: MAX_REPAIR_QUARANTINE_RECORDS
1872
2020
  };
1873
2021
 
1874
2022
  // src/hooks/knowledge-events.ts
@@ -2545,7 +2693,7 @@ async function applyKnowledgeVerdictFeedback(directory, options) {
2545
2693
  }
2546
2694
  let bumps = 0;
2547
2695
  if (deltas.length > 0) {
2548
- const { bumpKnowledgeConfidenceBatch } = await import("./knowledge-store-mc4awds4.js");
2696
+ const { bumpKnowledgeConfidenceBatch } = await import("./knowledge-store-ds45k9th.js");
2549
2697
  bumps = await bumpKnowledgeConfidenceBatch(directory, deltas, options?.floorOptions);
2550
2698
  }
2551
2699
  return {
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  SWARM_WORKTREE_DIR_NAME,
4
4
  init_constants
5
- } from "./index-v3y3qg48.js";
5
+ } from "./index-cpg98bh1.js";
6
6
  import {
7
7
  init_git_executable,
8
8
  resolveGitExecutable
@@ -92,7 +92,7 @@ var _internals = {
92
92
  symlinkSync: fs.symlinkSync
93
93
  },
94
94
  writeScopeToDisk: async (directory, taskId, files) => {
95
- const { writeScopeToDisk: realWrite } = await import("./scope-persistence-v8we8ja7.js");
95
+ const { writeScopeToDisk: realWrite } = await import("./scope-persistence-4n24a1e2.js");
96
96
  return realWrite(directory, taskId, files);
97
97
  },
98
98
  writeLaneProfileToDisk: async (_worktreePath, _laneIndex, _envOverrides) => {
package/dist/cli/index.js CHANGED
@@ -11,52 +11,52 @@ import {
11
11
  readCachePackageVersion,
12
12
  resolveCommand,
13
13
  safeRealpathSync
14
- } from "./index-bst6epnr.js";
15
- import"./index-34tawmyx.js";
16
- import"./index-ymyke19q.js";
17
- import"./index-tw8ck794.js";
18
- import"./index-kxzgnz2h.js";
19
- import"./index-fwnhh6s7.js";
14
+ } from "./index-pz2py5v7.js";
15
+ import"./index-0a0asz2s.js";
16
+ import"./index-vk15nbh4.js";
17
+ import"./index-bma2wrqx.js";
18
+ import"./index-d4e6wpkg.js";
19
+ import"./index-nsr5b69r.js";
20
20
  import"./index-134d35c1.js";
21
21
  import"./index-abtrcs16.js";
22
22
  import"./index-y8552snf.js";
23
- import"./index-sfemjcb8.js";
24
- import"./index-evpgszmp.js";
23
+ import"./index-f17j50dx.js";
24
+ import"./index-gxbhp7sx.js";
25
25
  import"./index-70ha9e09.js";
26
26
  import"./index-c8s9a3zh.js";
27
27
  import"./index-9ss2m4rs.js";
28
28
  import"./index-z9yhhk6q.js";
29
- import"./index-gey2257h.js";
30
- import"./index-mrkgxfeh.js";
31
- import"./index-8ef23wex.js";
32
- import"./index-2qrd8mfa.js";
29
+ import"./index-5e5a1y2r.js";
30
+ import"./index-g3xt1d16.js";
31
+ import"./index-q2mvacjr.js";
32
+ import"./index-4p3qfb05.js";
33
33
  import"./index-rtry5xyf.js";
34
34
  import"./index-zsrtt42s.js";
35
- import"./index-rtkttser.js";
35
+ import"./index-97psh79d.js";
36
36
  import"./index-e1pxav9g.js";
37
- import"./index-41t3hgaa.js";
38
- import"./index-zpp507z0.js";
39
- import"./index-90w06fqr.js";
40
- import"./index-cqfp05jb.js";
37
+ import"./index-92cxd0r1.js";
38
+ import"./index-zsmsy1dh.js";
39
+ import"./index-kwxp0z0n.js";
40
+ import"./index-fzqhn96z.js";
41
41
  import"./index-556ja8an.js";
42
42
  import"./index-7sy3aa9m.js";
43
43
  import"./index-wx8zdh4a.js";
44
44
  import"./index-3g0xk6tk.js";
45
45
  import"./index-85gkedsf.js";
46
- import"./index-qpke2x5h.js";
47
- import"./index-ff66fbjt.js";
48
- import"./index-neh8azwc.js";
46
+ import"./index-kfmee1cr.js";
47
+ import"./index-zd1mfygt.js";
48
+ import"./index-jfcgnvg6.js";
49
49
  import"./index-gprxjmm7.js";
50
50
  import"./index-n832052r.js";
51
- import"./index-17e73wac.js";
51
+ import"./index-5qwmpamg.js";
52
52
  import {
53
53
  init_package,
54
54
  package_default
55
- } from "./index-7axx11dt.js";
55
+ } from "./index-fay8h6v8.js";
56
56
  import {
57
57
  DEFAULT_AGENT_CONFIGS,
58
58
  init_constants
59
- } from "./index-v3y3qg48.js";
59
+ } from "./index-cpg98bh1.js";
60
60
  import"./index-9e6fdz2h.js";
61
61
  import"./index-4rhhvd1a.js";
62
62
  import"./index-w8pgjr75.js";
@@ -64,12 +64,12 @@ import"./index-z6xqpmqg.js";
64
64
  import"./index-zj6t9zgx.js";
65
65
  import"./index-zjygnfay.js";
66
66
  import"./index-ae75rja9.js";
67
- import"./index-dzan8czb.js";
68
- import"./index-mpf01swm.js";
67
+ import"./index-x8pm918t.js";
68
+ import"./index-j20fzn0w.js";
69
69
  import"./index-bk5tah7q.js";
70
- import"./index-4evasm2b.js";
71
- import"./index-gf03198s.js";
72
- import"./index-dppzthm9.js";
70
+ import"./index-kggqpefz.js";
71
+ import"./index-bghwrr59.js";
72
+ import"./index-qyvjp0bq.js";
73
73
  import"./index-7g4c7s5r.js";
74
74
  import"./index-bpmtbmy9.js";
75
75
  import"./index-ed5ykebp.js";
@@ -9,15 +9,15 @@ import {
9
9
  maybeEscalateOnViolation,
10
10
  maybeQuarantineOnContradiction,
11
11
  readRecentEscalations
12
- } from "./index-sfemjcb8.js";
13
- import"./index-qpke2x5h.js";
14
- import"./index-ff66fbjt.js";
15
- import"./index-neh8azwc.js";
12
+ } from "./index-f17j50dx.js";
13
+ import"./index-kfmee1cr.js";
14
+ import"./index-zd1mfygt.js";
15
+ import"./index-jfcgnvg6.js";
16
16
  import"./index-gprxjmm7.js";
17
17
  import"./index-n832052r.js";
18
- import"./index-17e73wac.js";
19
- import"./index-7axx11dt.js";
20
- import"./index-v3y3qg48.js";
18
+ import"./index-5qwmpamg.js";
19
+ import"./index-fay8h6v8.js";
20
+ import"./index-cpg98bh1.js";
21
21
  import"./index-9e6fdz2h.js";
22
22
  import"./index-4rhhvd1a.js";
23
23
  import"./index-w8pgjr75.js";
@@ -25,12 +25,12 @@ import"./index-z6xqpmqg.js";
25
25
  import"./index-zj6t9zgx.js";
26
26
  import"./index-zjygnfay.js";
27
27
  import"./index-ae75rja9.js";
28
- import"./index-dzan8czb.js";
29
- import"./index-mpf01swm.js";
28
+ import"./index-x8pm918t.js";
29
+ import"./index-j20fzn0w.js";
30
30
  import"./index-bk5tah7q.js";
31
- import"./index-4evasm2b.js";
32
- import"./index-gf03198s.js";
33
- import"./index-dppzthm9.js";
31
+ import"./index-kggqpefz.js";
32
+ import"./index-bghwrr59.js";
33
+ import"./index-qyvjp0bq.js";
34
34
  import"./index-7g4c7s5r.js";
35
35
  import"./index-bpmtbmy9.js";
36
36
  import"./index-ed5ykebp.js";