opencode-swarm 7.164.6 → 7.164.8

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 (96) hide show
  1. package/README.md +1 -1
  2. package/dist/background/pending-delegations.d.ts +3 -0
  3. package/dist/background/pr-subscriptions.d.ts +1 -8
  4. package/dist/cli/{coder-settlement-6qgvzx40.js → coder-settlement-qrtjv4jk.js} +14 -14
  5. package/dist/cli/{config-doctor-d1cbh67h.js → config-doctor-hp9dj0fg.js} +5 -3
  6. package/dist/cli/{core-g0cvvj3b.js → core-bmmrm36k.js} +2 -2
  7. package/dist/cli/{curation-policy-7f8x9yg6.js → curation-policy-de7emfqc.js} +7 -6
  8. package/dist/cli/{curator-drift-0r0scc8r.js → curator-drift-5sykmtf5.js} +8 -6
  9. package/dist/cli/{curator-q3qn89wn.js → curator-k8xdr1mn.js} +40 -38
  10. package/dist/cli/curator-llm-factory-pe61p0r6.js +68 -0
  11. package/dist/cli/{dispatch-q4v8x2pk.js → dispatch-dqybvj8v.js} +10 -6
  12. package/dist/cli/{evidence-summary-service-3meyb8rc.js → evidence-summary-service-qzpkdv7a.js} +20 -17
  13. package/dist/cli/{gate-evidence-mhc0w7vp.js → gate-evidence-jmns4e76.js} +14 -8
  14. package/dist/cli/guardrail-explain-vzwbmvyf.js +69 -0
  15. package/dist/cli/{guardrail-log-0nd1eqvz.js → guardrail-log-kckc7cg4.js} +9 -8
  16. package/dist/cli/{guardrail-reset-mzeyd6jh.js → guardrail-reset-acndbsv9.js} +40 -38
  17. package/dist/cli/hive-promoter-wvt5kk99.js +83 -0
  18. package/dist/cli/{index-x6zyc38w.js → index-0zjwnbze.js} +1 -1
  19. package/dist/cli/{index-x76mprg2.js → index-29w778rw.js} +185 -376
  20. package/dist/cli/{index-fxxja498.js → index-2czt53wz.js} +1 -1
  21. package/dist/cli/{index-pvp5tnn2.js → index-3sv8t7ca.js} +2 -2
  22. package/dist/cli/{index-kvb4dwgf.js → index-4pm3v7yc.js} +12 -6
  23. package/dist/cli/{index-jzvrvdmr.js → index-4v28t7jh.js} +4 -4
  24. package/dist/cli/{index-935ww10s.js → index-52m9kter.js} +1236 -1193
  25. package/dist/cli/index-7qefgq4j.js +71 -0
  26. package/dist/cli/{index-zfwd65c2.js → index-8ntf8jnj.js} +19 -18
  27. package/dist/cli/{index-m1nrd3yd.js → index-8psybzzf.js} +1 -1
  28. package/dist/cli/{index-2c3np82d.js → index-8tqqmsav.js} +1 -1
  29. package/dist/cli/{index-tegp2mny.js → index-93znbdam.js} +9 -5
  30. package/dist/cli/{index-hdapetg1.js → index-9ek9d96g.js} +3 -3
  31. package/dist/cli/{index-p56xc59p.js → index-9ydhzegh.js} +28 -17
  32. package/dist/cli/{index-ew99d4y6.js → index-apdp9bc1.js} +1 -1
  33. package/dist/cli/{index-12xzj0hm.js → index-b10yvv6h.js} +4 -4
  34. package/dist/cli/{index-zjg5ajf5.js → index-bv90qkyw.js} +72 -48
  35. package/dist/cli/{index-zypacgjc.js → index-bz8vsc8r.js} +5 -5
  36. package/dist/cli/{index-4k16cz8r.js → index-bzesypf5.js} +36 -27
  37. package/dist/cli/{index-ay9cr8tr.js → index-chcv8c7n.js} +1 -1
  38. package/dist/cli/index-cw912re7.js +200 -0
  39. package/dist/cli/{index-ty3vtqe2.js → index-espcjyrx.js} +4 -4
  40. package/dist/cli/{index-gwg7a00b.js → index-g2e8b3wm.js} +20 -15
  41. package/dist/cli/{index-rysxqae0.js → index-ghnbpez3.js} +7 -7
  42. package/dist/cli/{index-t1nkr7cz.js → index-gkqrk8dd.js} +2 -2
  43. package/dist/cli/{index-1dz8hv7p.js → index-kvq1e82k.js} +3 -3
  44. package/dist/cli/{index-ze5zyv28.js → index-mr3h3sm5.js} +2 -2
  45. package/dist/cli/{index-zaab1wz9.js → index-n4fzmqz8.js} +3 -1
  46. package/dist/cli/{index-g5714mpv.js → index-px4a2ve0.js} +17 -8
  47. package/dist/cli/index-ry16d01s.js +107 -0
  48. package/dist/cli/{index-j3hsjynw.js → index-s3z936wh.js} +100 -97
  49. package/dist/cli/{index-yh8wxegw.js → index-s6ejwhew.js} +21 -11
  50. package/dist/cli/{index-b0m3efpf.js → index-sxxh4ams.js} +2 -2
  51. package/dist/cli/{index-cyhw0der.js → index-t1qzjhnj.js} +13 -13
  52. package/dist/cli/{index-3f7hqtgg.js → index-w3gtqey0.js} +4 -1
  53. package/dist/cli/{index-9qvmsyab.js → index-wgqeqy68.js} +2 -2
  54. package/dist/cli/{index-y4z0rhsa.js → index-whz6am0v.js} +42 -40
  55. package/dist/cli/{index-g94qqwnz.js → index-wtnx33hz.js} +2 -2
  56. package/dist/cli/{index-j645xpsm.js → index-y6s0gpn3.js} +12 -5
  57. package/dist/cli/{index-6f9yvd67.js → index-ya4ta1pd.js} +2 -2
  58. package/dist/cli/{index-5p1tzpwh.js → index-ypjffdrg.js} +3 -2
  59. package/dist/cli/{index-59hvr3f4.js → index-yscwyq3t.js} +9 -6
  60. package/dist/cli/{index-7v3bb0h3.js → index-yzn1fm9a.js} +1 -1
  61. package/dist/cli/{index-qdbgc16x.js → index-z39vxvdx.js} +20 -12
  62. package/dist/cli/index.js +40 -38
  63. package/dist/cli/{knowledge-escalator-aca0nhqg.js → knowledge-escalator-h9834mrp.js} +15 -14
  64. package/dist/cli/{knowledge-events-n5t313ht.js → knowledge-events-e8hrmjf0.js} +13 -12
  65. package/dist/cli/{knowledge-link-8ea4ksda.js → knowledge-link-hhnmc4g1.js} +6 -5
  66. package/dist/cli/{knowledge-store-j97ejf6a.js → knowledge-store-w3w9gchr.js} +7 -6
  67. package/dist/cli/{knowledge-validator-01evhydg.js → knowledge-validator-exd900vc.js} +9 -8
  68. package/dist/cli/{model-preflight-pmnbfzjv.js → model-preflight-bq035tfh.js} +1 -1
  69. package/dist/cli/{pending-delegations-w73abdk3.js → pending-delegations-p4ak2e86.js} +7 -7
  70. package/dist/cli/{pr-subscriptions-05dzvavk.js → pr-subscriptions-73fs8y3n.js} +7 -6
  71. package/dist/cli/{pr-workflow-gate-t0tnkx5f.js → pr-workflow-gate-pvt2ra6e.js} +40 -38
  72. package/dist/cli/{runner-fh7t0mn9.js → runner-5qqh83e2.js} +6 -6
  73. package/dist/cli/{scan-cursor-63zx2qd8.js → scan-cursor-ysd8b563.js} +8 -7
  74. package/dist/cli/{schema-t1scx08g.js → schema-mbb9g4w4.js} +2 -2
  75. package/dist/cli/{scope-persistence-1a5qmchf.js → scope-persistence-jrbnhxvx.js} +12 -10
  76. package/dist/cli/{skill-generator-7werbwgv.js → skill-generator-b4ng5xky.js} +17 -16
  77. package/dist/cli/{sqlite-loader-8zefc142.js → sqlite-loader-xrnf6bq8.js} +1 -1
  78. package/dist/cli/{telemetry-j14cj552.js → telemetry-85gxedng.js} +1 -1
  79. package/dist/cli/{workspace-snapshot-yq0tc49d.js → workspace-snapshot-eh18vgkn.js} +2 -1
  80. package/dist/cli/{worktree-collision-ownership-wzdzky33.js → worktree-collision-ownership-ns8p2fks.js} +12 -15
  81. package/dist/cli/{worktree-isolation-m02ay3kg.js → worktree-isolation-j6zxhjab.js} +40 -38
  82. package/dist/db/canonical-project.d.ts +10 -3
  83. package/dist/db/driver-parity.d.ts +12 -0
  84. package/dist/db/project-db.d.ts +4 -0
  85. package/dist/evidence/task-gate-repair.d.ts +1 -1
  86. package/dist/gate-evidence.d.ts +19 -1
  87. package/dist/index.js +581 -581
  88. package/dist/plan/ledger.d.ts +2 -0
  89. package/dist/tools/pre-check-batch.d.ts +1 -1
  90. package/dist/utils/canonical-root.d.ts +21 -1
  91. package/dist/utils/filesystem-identity.d.ts +59 -0
  92. package/package.json +2 -1
  93. package/dist/cli/curator-llm-factory-dw7md4nr.js +0 -66
  94. package/dist/cli/guardrail-explain-6cbszhw1.js +0 -67
  95. package/dist/cli/hive-promoter-w7g879cm.js +0 -81
  96. package/dist/cli/index-ddszzne4.js +0 -42
@@ -6,13 +6,12 @@ import {
6
6
  WORKTREE_PROVISIONING_OWNER_LEASE_MS,
7
7
  removeWorktreeProvisioningOwner,
8
8
  scanWorktreeProvisioningOwnersForRecovery
9
- } from "./index-b0m3efpf.js";
9
+ } from "./index-sxxh4ams.js";
10
10
  import {
11
11
  scanDelegationFallbacksForRecovery,
12
12
  scanDelegationsForRecovery
13
- } from "./index-qdbgc16x.js";
14
- import"./index-ddszzne4.js";
15
- import"./index-2c3np82d.js";
13
+ } from "./index-z39vxvdx.js";
14
+ import"./index-8tqqmsav.js";
16
15
  import"./index-z6xqpmqg.js";
17
16
  import {
18
17
  bunSpawn
@@ -22,11 +21,14 @@ import {
22
21
  resolveGitExecutable
23
22
  } from "./index-9e6fdz2h.js";
24
23
  import"./index-4rhhvd1a.js";
25
- import"./index-p56xc59p.js";
24
+ import"./index-9ydhzegh.js";
26
25
  import"./index-zjygnfay.js";
27
- import"./index-fxxja498.js";
28
- import"./index-cyhw0der.js";
29
- import"./index-1dz8hv7p.js";
26
+ import {
27
+ canonicalRootKeyFresh
28
+ } from "./index-7qefgq4j.js";
29
+ import"./index-2czt53wz.js";
30
+ import"./index-t1qzjhnj.js";
31
+ import"./index-kvq1e82k.js";
30
32
  import"./index-7g4c7s5r.js";
31
33
  import"./index-bpmtbmy9.js";
32
34
  import"./index-zgwm4ryv.js";
@@ -34,7 +36,6 @@ import"./index-a76rekgs.js";
34
36
 
35
37
  // src/hooks/delegation-gate/worktree-collision-ownership.ts
36
38
  import * as fs2 from "fs";
37
- import * as path2 from "path";
38
39
 
39
40
  // src/hooks/delegation-gate/worktree-ownership-tag.ts
40
41
  import * as fs from "fs";
@@ -123,13 +124,9 @@ var _internals = {
123
124
  statSync: fs2.statSync,
124
125
  removeWorktreeProvisioningOwner
125
126
  };
126
- function normalizedPath(value) {
127
- const resolved = path2.normalize(path2.resolve(value));
128
- return process.platform === "win32" ? resolved.toLowerCase() : resolved;
129
- }
130
127
  function descriptorCoordinateMatch(descriptor, identity) {
131
128
  const branchMatches = descriptor.branchName === identity.branchName;
132
- const pathMatches = normalizedPath(descriptor.worktreePath) === normalizedPath(identity.worktreePath);
129
+ const pathMatches = canonicalRootKeyFresh(descriptor.worktreePath) === canonicalRootKeyFresh(identity.worktreePath);
133
130
  if (!branchMatches && !pathMatches)
134
131
  return "none";
135
132
  if (!branchMatches || !pathMatches || descriptor.parentSessionId !== identity.parentSessionId || descriptor.taskId !== identity.taskId) {
@@ -240,7 +237,7 @@ async function inspectStandardWorktreeCollisionOwnership(identity) {
240
237
  return mergeStatus;
241
238
  for (const [, failure] of mergeStatus.failures) {
242
239
  const branchMatches = failure.branch === identity.branchName;
243
- const pathMatches = typeof failure.worktreePath === "string" && normalizedPath(failure.worktreePath) === normalizedPath(identity.worktreePath);
240
+ const pathMatches = typeof failure.worktreePath === "string" && canonicalRootKeyFresh(failure.worktreePath) === canonicalRootKeyFresh(identity.worktreePath);
244
241
  if (!branchMatches && !pathMatches)
245
242
  continue;
246
243
  if (!branchMatches || !pathMatches) {
@@ -21,64 +21,66 @@ import {
21
21
  sanitizeWorktreeTaskId,
22
22
  standardWorktreeByCallID,
23
23
  standardWorktreeSerializationSessions
24
- } from "./index-935ww10s.js";
25
- import"./index-7v3bb0h3.js";
26
- import"./index-12xzj0hm.js";
27
- import"./index-kvb4dwgf.js";
28
- import"./index-x76mprg2.js";
29
- import"./index-9qvmsyab.js";
24
+ } from "./index-52m9kter.js";
25
+ import"./index-yzn1fm9a.js";
26
+ import"./index-b10yvv6h.js";
27
+ import"./index-4pm3v7yc.js";
28
+ import"./index-29w778rw.js";
29
+ import"./index-wgqeqy68.js";
30
30
  import"./index-txdagbh7.js";
31
+ import"./index-cw912re7.js";
31
32
  import"./index-3146wmgv.js";
32
- import"./index-59hvr3f4.js";
33
- import"./index-zypacgjc.js";
34
- import"./index-6f9yvd67.js";
33
+ import"./index-yscwyq3t.js";
34
+ import"./index-bz8vsc8r.js";
35
+ import"./index-ya4ta1pd.js";
35
36
  import"./index-70ha9e09.js";
36
- import"./index-yh8wxegw.js";
37
- import"./index-zjg5ajf5.js";
38
- import"./index-zaab1wz9.js";
39
- import"./index-zfwd65c2.js";
37
+ import"./index-s6ejwhew.js";
38
+ import"./index-bv90qkyw.js";
39
+ import"./index-n4fzmqz8.js";
40
+ import"./index-8ntf8jnj.js";
40
41
  import"./index-zsrtt42s.js";
41
- import"./index-4k16cz8r.js";
42
- import"./index-3f7hqtgg.js";
43
- import"./index-b0m3efpf.js";
44
- import"./index-jzvrvdmr.js";
45
- import"./index-x6zyc38w.js";
42
+ import"./index-bzesypf5.js";
43
+ import"./index-w3gtqey0.js";
44
+ import"./index-sxxh4ams.js";
45
+ import"./index-4v28t7jh.js";
46
+ import"./index-0zjwnbze.js";
46
47
  import"./index-rtry5xyf.js";
47
- import"./index-g5714mpv.js";
48
- import"./index-t1nkr7cz.js";
49
- import"./index-qdbgc16x.js";
50
- import"./index-ddszzne4.js";
51
- import"./index-j3hsjynw.js";
52
- import"./index-j645xpsm.js";
53
- import"./index-pvp5tnn2.js";
48
+ import"./index-px4a2ve0.js";
49
+ import"./index-gkqrk8dd.js";
50
+ import"./index-z39vxvdx.js";
51
+ import"./index-s3z936wh.js";
52
+ import"./index-y6s0gpn3.js";
53
+ import"./index-ry16d01s.js";
54
+ import"./index-3sv8t7ca.js";
54
55
  import"./index-556ja8an.js";
55
56
  import"./index-4fwbbad3.js";
56
57
  import"./index-b43rt5ph.js";
57
58
  import"./index-q7sjgr1y.js";
58
- import"./index-rysxqae0.js";
59
- import"./index-gwg7a00b.js";
59
+ import"./index-ghnbpez3.js";
60
+ import"./index-g2e8b3wm.js";
60
61
  import {
61
62
  resolveWorktreeIsolationConfig
62
- } from "./index-hdapetg1.js";
63
+ } from "./index-9ek9d96g.js";
63
64
  import"./index-zg9d392c.js";
64
65
  import"./index-n832052r.js";
65
- import"./index-2c3np82d.js";
66
+ import"./index-8tqqmsav.js";
66
67
  import"./index-z6xqpmqg.js";
67
68
  import"./index-r3mvsbtq.js";
68
- import"./index-ew99d4y6.js";
69
- import"./index-5p1tzpwh.js";
69
+ import"./index-apdp9bc1.js";
70
+ import"./index-ypjffdrg.js";
70
71
  import"./index-9e6fdz2h.js";
71
72
  import"./index-4rhhvd1a.js";
72
- import"./index-p56xc59p.js";
73
- import"./index-m1nrd3yd.js";
73
+ import"./index-9ydhzegh.js";
74
+ import"./index-8psybzzf.js";
74
75
  import"./index-zjygnfay.js";
75
76
  import"./index-ae75rja9.js";
76
- import"./index-tegp2mny.js";
77
- import"./index-ze5zyv28.js";
77
+ import"./index-93znbdam.js";
78
+ import"./index-mr3h3sm5.js";
78
79
  import"./index-bk5tah7q.js";
79
- import"./index-fxxja498.js";
80
- import"./index-cyhw0der.js";
81
- import"./index-1dz8hv7p.js";
80
+ import"./index-7qefgq4j.js";
81
+ import"./index-2czt53wz.js";
82
+ import"./index-t1qzjhnj.js";
83
+ import"./index-kvq1e82k.js";
82
84
  import"./index-7g4c7s5r.js";
83
85
  import"./index-bpmtbmy9.js";
84
86
  import"./index-zgwm4ryv.js";
@@ -1,5 +1,6 @@
1
1
  /**
2
- * Canonical project identity for the SQLite durable-state foundation (issue #2480).
2
+ * Backward-compatible name for the shared canonical project-root identity
3
+ * helper (issue #2480 / #2474).
3
4
  *
4
5
  * Policy (docs/sqlite-durable-state.md §Identity):
5
6
  * - This helper answers ONE question: "are these two directory spellings the same project
@@ -16,8 +17,14 @@
16
17
  * the project DB from opening; it only risks a duplicate handle for exotic spellings,
17
18
  * which is the pre-existing behavior.
18
19
  */
19
- import { realpathSync } from 'node:fs';
20
- /** DI seam for tests (fault-injected realpath failures). */
20
+ import type { realpathSync } from 'node:fs';
21
+ /**
22
+ * Keep the historical DB-layer seam wired to the shared resolver. A few
23
+ * callers/tests inject a `realpathSync` failure through this compatibility
24
+ * export; forwarding that override to both shared resolver entry points keeps
25
+ * the fault-injection contract intact without reintroducing a second path
26
+ * canonicalization implementation here.
27
+ */
21
28
  export declare const _internals: {
22
29
  realpathSync: typeof realpathSync;
23
30
  };
@@ -14,6 +14,18 @@
14
14
  * many values as the statement has placeholders. `node:sqlite` rejects a
15
15
  * mismatched count (`SQLITE_RANGE`); `bun:sqlite` tolerates some lax forms.
16
16
  * Portable code never relies on the lax form.
17
+ * - NO-BINDINGS run() RETURNS A Changes-SHAPED OBJECT (#2539): bun:sqlite's
18
+ * run() always returns `{ changes, lastInsertRowid }`; the node adapter
19
+ * rebuilds it from connection-level counters after exec(). `.changes` is
20
+ * pinned for single-statement DML only (the form production code reads).
21
+ * The SHAPE is pinned for every form (cases 4/4b/4c). Three value deltas
22
+ * are deliberately NOT pinned because the drivers genuinely diverge and no
23
+ * production reader exists: multi-statement strings (bun SUMS `.changes`
24
+ * across statements, changes() reports the last one), non-DML statements
25
+ * (bun reports 0, changes() keeps the previous DML's count), and
26
+ * trigger-amplified DML (bun's run() INCLUDES trigger-fired rows while
27
+ * SQL changes() — what the adapter probe reads — EXCLUDES them; live-probed:
28
+ * 1 direct + 1 trigger row → bun {changes: 2}, adapter 1).
17
29
  * - Multi-statement strings only through the no-parameter `run(sql)` path
18
30
  * (which routes to `exec` on both drivers).
19
31
  * - Transaction + SAVEPOINT nesting round trip.
@@ -67,3 +67,7 @@ export declare function closeProjectDb(directory: string): void;
67
67
  * Test-only.
68
68
  */
69
69
  export declare function closeAllProjectDbs(): void;
70
+ export declare const _internals: {
71
+ projectDbCount: () => number;
72
+ projectDbAliasCount: () => number;
73
+ };
@@ -1,4 +1,4 @@
1
- export declare const TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL = "requirements_reconstruction";
1
+ export { TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL } from '../gate-evidence.js';
2
2
  export interface RepairGateEvidenceArgs {
3
3
  task_id: string;
4
4
  reason: string;
@@ -8,14 +8,19 @@
8
8
  *
9
9
  * Evidence files survive session restarts (unlike in-memory state).
10
10
  * Agents never write these files directly — only the hook does.
11
- * Gates are append-only: required_gates can only grow, never shrink.
11
+ * Real gates are append-only. The accepted-mutation boundary may retire only
12
+ * the legacy receipt-less repair marker from issue #2525.
12
13
  *
13
14
  * Threat boundary: this store provides atomic, path-contained durability and
14
15
  * auditability for cooperative same-user agents. It is not tamper-proof
15
16
  * authorization against a process with arbitrary same-user workspace access;
16
17
  * that requires a protected trust root outside the project workspace.
17
18
  */
19
+ import { appendTaskGateRequirementsReceiptIfNeeded } from './evidence/task-gate-requirements.js';
18
20
  import type { TaskWorkflowState } from './state';
21
+ export declare const _internals: {
22
+ appendTaskGateRequirementsReceiptIfNeeded: typeof appendTaskGateRequirementsReceiptIfNeeded;
23
+ };
19
24
  export interface GateEvidence {
20
25
  sessionId: string;
21
26
  timestamp: string;
@@ -68,6 +73,12 @@ export interface TaskEvidence {
68
73
  requirements_receipt_hash: string | null;
69
74
  };
70
75
  }
76
+ /**
77
+ * Legacy internal marker written by receipt-less gate-evidence repair before
78
+ * issue #2525. It is read only for recovery and must never be emitted as a
79
+ * real required gate.
80
+ */
81
+ export declare const TASK_GATE_REQUIREMENTS_RECONSTRUCTION_SENTINEL = "requirements_reconstruction";
71
82
  /**
72
83
  * Fence ordinary evidence writers while a terminal or repair plan/evidence
73
84
  * transaction is PREPARED. Only the owning WAL transition may proceed.
@@ -178,6 +189,13 @@ export declare function deriveRequiredGates(agentType: string, context?: GateDer
178
189
  export declare function expandRequiredGates(existingGates: string[], newAgentType: string, context?: GateDerivationContext): string[];
179
190
  export declare function transitionTaskWorkflowEvidence(directory: string, taskId: string, event: TaskWorkflowTransitionEvent): Promise<TaskEvidence>;
180
191
  export declare function withTaskEvidenceTransaction<T>(directory: string, taskId: string, agent: string, callback: (transaction: TaskEvidenceTransaction) => Promise<T>): Promise<T>;
192
+ /**
193
+ * Re-publish a transition receipt after a caller has proven that its evidence
194
+ * transition already committed. Passing a null predecessor forces the
195
+ * idempotent receipt writer to compare against the durable chain tip instead
196
+ * of skipping because the current evidence already equals the settled state.
197
+ */
198
+ export declare function ensureTaskGateRequirementsReceiptForSettledTransition(directory: string, taskId: string, evidence: TaskEvidence, event: TaskWorkflowTransitionEvent): Promise<void>;
181
199
  /**
182
200
  * Creates or updates .swarm/evidence/{taskId}.json with a gate pass entry.
183
201
  * If file doesn't exist: creates with required_gates from deriveRequiredGates(gate).