opencode-swarm 7.199.6 → 7.200.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 (114) 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/attest-task-sg8b5a5j.js +2209 -0
  4. package/dist/cli/{auto-checkpoint-gv21fb1h.js → auto-checkpoint-bywgxh27.js} +9 -9
  5. package/dist/cli/{checkpoint-rd1bt793.js → checkpoint-k2092cbw.js} +20 -18
  6. package/dist/cli/{coder-settlement-21zd1g3a.js → coder-settlement-y0hkcngn.js} +12 -12
  7. package/dist/cli/{config-doctor-mxe9nr78.js → config-doctor-0fnrwkga.js} +16 -16
  8. package/dist/cli/{core-7bd1sd36.js → core-mfyaj8b4.js} +3 -3
  9. package/dist/cli/{curation-policy-w9y0db1n.js → curation-policy-fth5n93x.js} +6 -6
  10. package/dist/cli/{curator-7rf98h3k.js → curator-1s64jkc3.js} +44 -44
  11. package/dist/cli/{curator-drift-21y19fnz.js → curator-drift-famx6p6s.js} +8 -8
  12. package/dist/cli/curator-llm-factory-vya4epq6.js +82 -0
  13. package/dist/cli/{doctor-knowledge-receipt-phase-id-6pdjxgfa.js → doctor-knowledge-receipt-phase-id-v4y6pbek.js} +9 -9
  14. package/dist/cli/{evidence-summary-service-vdcx7fqd.js → evidence-summary-service-rd7y6yjq.js} +20 -20
  15. package/dist/cli/{gate-evidence-ernx9gck.js → gate-evidence-kama66h5.js} +15 -7
  16. package/dist/cli/guardrail-explain-8fkhq0cg.js +83 -0
  17. package/dist/cli/{guardrail-log-jr6b9rt3.js → guardrail-log-gdj19fq5.js} +7 -7
  18. package/dist/cli/{guardrail-reset-0qyt8vpd.js → guardrail-reset-bmg6czzk.js} +44 -44
  19. package/dist/cli/{hive-promoter-2qwxrrsc.js → hive-promoter-ychygdgc.js} +44 -44
  20. package/dist/cli/{index-s4wbe96z.js → index-0ptf66x5.js} +4 -4
  21. package/dist/cli/{index-cyp3r8ar.js → index-0tygsk8b.js} +10 -10
  22. package/dist/cli/{index-b9f2j9bx.js → index-12h2rtdj.js} +3 -3
  23. package/dist/cli/{index-eyq1q1xn.js → index-1v277wxc.js} +2 -2
  24. package/dist/cli/{index-syaa76vg.js → index-2dm42tgp.js} +48 -46
  25. package/dist/cli/{index-exj9yb0x.js → index-2hnnkj64.js} +1979 -1945
  26. package/dist/cli/{index-7m2gcmm7.js → index-2m740hyt.js} +6 -6
  27. package/dist/cli/{index-cs1d9e03.js → index-2w5grmmj.js} +2 -2
  28. package/dist/cli/{index-88d5kpjj.js → index-3020n6d9.js} +1 -1
  29. package/dist/cli/{index-vgb679vr.js → index-3exe6k66.js} +3 -3
  30. package/dist/cli/{index-gx2vp8gx.js → index-3t46mez1.js} +27 -1
  31. package/dist/cli/{index-38fgg593.js → index-3zspah3v.js} +2 -2
  32. package/dist/cli/{index-f02p4yn4.js → index-51dw4bjc.js} +2 -2
  33. package/dist/cli/{index-hx2f3j9w.js → index-5snwc3dz.js} +2 -2
  34. package/dist/cli/{index-eqw5vq9r.js → index-b0d8ra32.js} +1 -1
  35. package/dist/cli/{index-tsg61z0r.js → index-b4kdms7x.js} +2 -2
  36. package/dist/cli/{index-cwg99gea.js → index-bn3aa5q1.js} +7 -7
  37. package/dist/cli/{index-dtwj4hsk.js → index-c2k7q723.js} +2 -2
  38. package/dist/cli/{index-tqtfjzb0.js → index-c9g3hkjz.js} +3 -3
  39. package/dist/cli/{index-r227g76y.js → index-dgyddtje.js} +6 -6
  40. package/dist/cli/{index-270zfq1f.js → index-epzadpmm.js} +7 -7
  41. package/dist/cli/{index-txh6dtnj.js → index-f6nrw8am.js} +44 -44
  42. package/dist/cli/{index-n1ddn12j.js → index-g57p8p1k.js} +1 -1
  43. package/dist/cli/{index-9y6yk1n0.js → index-na6ph1fp.js} +1 -1
  44. package/dist/cli/{index-bef4nhtj.js → index-nawp90n7.js} +4 -4
  45. package/dist/cli/{index-3mzc5rqc.js → index-nzfq1ms2.js} +3 -3
  46. package/dist/cli/{index-0bw1jyen.js → index-p6v544jn.js} +1 -1
  47. package/dist/cli/{index-s5tgnsmh.js → index-parkaa70.js} +6 -6
  48. package/dist/cli/{index-exr153j1.js → index-pe77h482.js} +5 -5
  49. package/dist/cli/{index-dz15f98h.js → index-q8vfw61p.js} +1 -1
  50. package/dist/cli/{index-s9hekeej.js → index-qaqyq25k.js} +7 -7
  51. package/dist/cli/{index-jhjmf5sn.js → index-qzakbjcg.js} +3 -3
  52. package/dist/cli/{index-2cb644vj.js → index-rzkmg02a.js} +918 -154
  53. package/dist/cli/{index-0je0mees.js → index-s3w41p1x.js} +1 -1
  54. package/dist/cli/{index-zzpy5cx3.js → index-s8eac99p.js} +12 -8
  55. package/dist/cli/{index-j3rfbs45.js → index-s9y49avf.js} +2 -2
  56. package/dist/cli/{index-dqkr60bw.js → index-sva5swrs.js} +172 -14
  57. package/dist/cli/{index-3ct8kgfj.js → index-sz67z90q.js} +4 -4
  58. package/dist/cli/{index-gdyqdhz1.js → index-th667k1y.js} +4 -4
  59. package/dist/cli/{index-jmhn6ab5.js → index-traz987v.js} +2 -2
  60. package/dist/cli/{index-0veqvgny.js → index-v1h70r3y.js} +1 -1
  61. package/dist/cli/{index-snx2vb1x.js → index-ves1rtqt.js} +1 -1
  62. package/dist/cli/{index-qbhjey8k.js → index-vtkgg2qn.js} +3 -3
  63. package/dist/cli/{index-x6rv0e00.js → index-w2bhrp6z.js} +21 -14
  64. package/dist/cli/{index-4cyc18bc.js → index-wgf1780e.js} +7 -7
  65. package/dist/cli/{index-b3ws03kp.js → index-xyvsdn07.js} +1 -1
  66. package/dist/cli/{index-zbygz217.js → index-ypxq0x7r.js} +2 -2
  67. package/dist/cli/{index-t67n8jhb.js → index-z9mysg5m.js} +2 -2
  68. package/dist/cli/index.js +45 -45
  69. package/dist/cli/{knowledge-escalator-rsj9nqqt.js → knowledge-escalator-zxd76jna.js} +15 -15
  70. package/dist/cli/{knowledge-events-appww5kb.js → knowledge-events-z8h0wmaw.js} +13 -13
  71. package/dist/cli/{knowledge-link-t0ce3mw7.js → knowledge-link-wfhsfyn2.js} +5 -5
  72. package/dist/cli/{knowledge-store-n76rzv27.js → knowledge-store-g2gm13s8.js} +6 -6
  73. package/dist/cli/{knowledge-validator-ycxvjasa.js → knowledge-validator-2sech2sx.js} +8 -8
  74. package/dist/cli/{mcp-jy0gk3c8.js → mcp-t88363gj.js} +1 -1
  75. package/dist/cli/{model-preflight-rg0mppzf.js → model-preflight-akj8g1m2.js} +44 -44
  76. package/dist/cli/{pending-delegations-e6brjxp2.js → pending-delegations-bqp6b6as.js} +13 -13
  77. package/dist/cli/{pr-subscriptions-vjsb5ydq.js → pr-subscriptions-wxjvkg56.js} +12 -12
  78. package/dist/cli/{pr-workflow-gate-bj66aa9k.js → pr-workflow-gate-2wcrfa6g.js} +44 -44
  79. package/dist/cli/{runner-wq954cda.js → runner-s1a73y5h.js} +6 -6
  80. package/dist/cli/{scan-cursor-kkg94g0t.js → scan-cursor-8br4x41t.js} +7 -7
  81. package/dist/cli/{schema-d1exxwv8.js → schema-mc419qh8.js} +1 -1
  82. package/dist/cli/{scope-persistence-3v9hce7b.js → scope-persistence-5gyjt70q.js} +16 -16
  83. package/dist/cli/{server-jkcwkh8t.js → server-bp247fqe.js} +46 -46
  84. package/dist/cli/{skill-generator-wg8qfdm8.js → skill-generator-q4afafh3.js} +17 -17
  85. package/dist/cli/{snapshot-coordination-init-xyffgya9.js → snapshot-coordination-init-b4kmrgh7.js} +44 -44
  86. package/dist/cli/{speckit-checkoff-61xn2c2v.js → speckit-checkoff-1v02b2dt.js} +4 -4
  87. package/dist/cli/{telemetry-gena5typ.js → telemetry-cr8q16wk.js} +1 -1
  88. package/dist/cli/{workspace-snapshot-hzhz0rxw.js → workspace-snapshot-93gzfac2.js} +3 -3
  89. package/dist/cli/{worktree-collision-ownership-gsv009xc.js → worktree-collision-ownership-84m9f5an.js} +14 -14
  90. package/dist/cli/{worktree-isolation-3sdvs69a.js → worktree-isolation-xwbszhja.js} +44 -44
  91. package/dist/commands/attest.d.ts +10 -0
  92. package/dist/commands/close/internals.d.ts +1 -1
  93. package/dist/commands/close/orchestrator.d.ts +7 -0
  94. package/dist/commands/destructive-purge.d.ts +15 -0
  95. package/dist/commands/git-status-read.d.ts +23 -0
  96. package/dist/commands/index.d.ts +1 -0
  97. package/dist/commands/registry.d.ts +9 -1
  98. package/dist/commands/rollback-gate.d.ts +77 -10
  99. package/dist/config/plan-schema.d.ts +44 -0
  100. package/dist/gate-evidence.d.ts +138 -1
  101. package/dist/git/branch.d.ts +22 -0
  102. package/dist/index.js +570 -562
  103. package/dist/session/snapshot-coordination-init.d.ts +34 -0
  104. package/dist/session/snapshot-writer.d.ts +5 -1
  105. package/dist/tools/attest-task.d.ts +67 -0
  106. package/dist/tools/checkpoint.d.ts +17 -0
  107. package/dist/tools/phase-complete.d.ts +12 -0
  108. package/dist/tools/save-plan.d.ts +16 -0
  109. package/dist/tools/update-task-status.d.ts +1 -1
  110. package/dist/workflow/task-terminal.d.ts +1 -0
  111. package/dist/workflow/workflow-wal-schema.d.ts +2 -0
  112. package/package.json +1 -1
  113. package/dist/cli/curator-llm-factory-ab821je6.js +0 -82
  114. package/dist/cli/guardrail-explain-7jef0dhs.js +0 -83
@@ -6,37 +6,37 @@ import {
6
6
  WORKTREE_PROVISIONING_OWNER_LEASE_MS,
7
7
  removeWorktreeProvisioningOwner,
8
8
  scanWorktreeProvisioningOwnersForRecovery
9
- } from "./index-tsg61z0r.js";
9
+ } from "./index-b4kdms7x.js";
10
10
  import {
11
11
  scanDelegationFallbacksForRecovery,
12
12
  scanDelegationsForRecovery
13
- } from "./index-cyp3r8ar.js";
13
+ } from "./index-0tygsk8b.js";
14
14
  import {
15
15
  scanWorktreeMergeFailuresForRecovery
16
16
  } from "./index-v3bmwmqw.js";
17
- import"./index-b3ws03kp.js";
18
- import"./index-j3rfbs45.js";
19
- import"./index-9y6yk1n0.js";
20
- import"./index-snx2vb1x.js";
17
+ import"./index-xyvsdn07.js";
18
+ import"./index-s9y49avf.js";
19
+ import"./index-na6ph1fp.js";
20
+ import"./index-ves1rtqt.js";
21
21
  import"./index-ry16d01s.js";
22
22
  import"./index-rdm3px0g.js";
23
- import"./index-3mzc5rqc.js";
23
+ import"./index-nzfq1ms2.js";
24
24
  import"./index-7pmbnjvj.js";
25
- import"./index-zbygz217.js";
26
- import"./index-cwg99gea.js";
25
+ import"./index-ypxq0x7r.js";
26
+ import"./index-bn3aa5q1.js";
27
27
  import"./index-vzm6zre7.js";
28
28
  import"./index-ae75rja9.js";
29
- import"./index-n1ddn12j.js";
30
- import"./index-jmhn6ab5.js";
31
- import"./index-dz15f98h.js";
29
+ import"./index-g57p8p1k.js";
30
+ import"./index-traz987v.js";
31
+ import"./index-q8vfw61p.js";
32
32
  import"./index-t7hmqgjy.js";
33
- import"./index-dtwj4hsk.js";
33
+ import"./index-c2k7q723.js";
34
34
  import {
35
35
  canonicalRootKeyFresh
36
36
  } from "./index-te9hq2f4.js";
37
37
  import"./index-ejhxgyvm.js";
38
38
  import"./index-7g4c7s5r.js";
39
- import"./index-270zfq1f.js";
39
+ import"./index-epzadpmm.js";
40
40
  import"./index-sp2cxpaq.js";
41
41
  import"./index-qbxk2rn6.js";
42
42
  import"./index-zgwm4ryv.js";
@@ -25,79 +25,79 @@ import {
25
25
  sanitizeWorktreeTaskId,
26
26
  standardWorktreeByCallID,
27
27
  standardWorktreeSerializationSessions
28
- } from "./index-exj9yb0x.js";
29
- import"./index-jhjmf5sn.js";
30
- import"./index-tqtfjzb0.js";
31
- import"./index-exr153j1.js";
28
+ } from "./index-2hnnkj64.js";
29
+ import"./index-s3w41p1x.js";
30
+ import"./index-qzakbjcg.js";
31
+ import"./index-c9g3hkjz.js";
32
+ import"./index-pe77h482.js";
33
+ import"./index-5snwc3dz.js";
32
34
  import"./index-axqyjreb.js";
33
- import"./index-0je0mees.js";
34
- import"./index-hx2f3j9w.js";
35
35
  import"./index-txdagbh7.js";
36
- import"./index-t67n8jhb.js";
36
+ import"./index-dgyddtje.js";
37
+ import"./index-z9mysg5m.js";
37
38
  import"./index-rdec0y3z.js";
38
- import"./index-b9f2j9bx.js";
39
- import"./index-s9hekeej.js";
40
- import"./index-gdyqdhz1.js";
41
- import"./index-r227g76y.js";
42
- import"./index-eyq1q1xn.js";
43
- import"./index-4cyc18bc.js";
39
+ import"./index-12h2rtdj.js";
40
+ import"./index-qaqyq25k.js";
41
+ import"./index-th667k1y.js";
42
+ import"./index-1v277wxc.js";
43
+ import"./index-wgf1780e.js";
44
44
  import"./index-x5jwegqw.js";
45
- import"./index-tsg61z0r.js";
46
- import"./index-cyp3r8ar.js";
47
- import"./index-8mrentmw.js";
45
+ import"./index-b4kdms7x.js";
46
+ import"./index-0tygsk8b.js";
48
47
  import"./index-pt7h91zc.js";
49
48
  import"./index-q7sjgr1y.js";
50
- import"./index-2cb644vj.js";
51
- import"./index-x6rv0e00.js";
49
+ import"./index-rzkmg02a.js";
50
+ import"./index-w2bhrp6z.js";
52
51
  import"./index-6b295cas.js";
53
52
  import"./index-9nyqt3kb.js";
54
- import"./index-qbhjey8k.js";
53
+ import"./index-vtkgg2qn.js";
55
54
  import"./index-v3bmwmqw.js";
56
- import"./index-38fgg593.js";
57
- import"./index-dqkr60bw.js";
58
- import"./index-vgb679vr.js";
55
+ import"./index-8mrentmw.js";
56
+ import"./index-3zspah3v.js";
57
+ import"./index-sva5swrs.js";
58
+ import"./index-3exe6k66.js";
59
59
  import"./index-spggmr30.js";
60
- import"./index-s4wbe96z.js";
61
- import"./index-s5tgnsmh.js";
60
+ import"./index-0ptf66x5.js";
61
+ import"./index-parkaa70.js";
62
62
  import"./index-m9zzj4ee.js";
63
- import"./index-b3ws03kp.js";
64
- import"./index-3ct8kgfj.js";
65
- import"./index-0veqvgny.js";
63
+ import"./index-xyvsdn07.js";
64
+ import"./index-sz67z90q.js";
65
+ import"./index-v1h70r3y.js";
66
66
  import"./index-rtry5xyf.js";
67
67
  import {
68
68
  resolveWorktreeIsolationConfig
69
- } from "./index-f02p4yn4.js";
69
+ } from "./index-51dw4bjc.js";
70
70
  import"./index-g22dps7x.js";
71
71
  import"./index-0725jpp7.js";
72
- import"./index-7m2gcmm7.js";
73
- import"./index-j3rfbs45.js";
74
- import"./index-zzpy5cx3.js";
75
- import"./index-9y6yk1n0.js";
76
- import"./index-snx2vb1x.js";
72
+ import"./index-2m740hyt.js";
73
+ import"./index-s9y49avf.js";
74
+ import"./index-s8eac99p.js";
75
+ import"./index-na6ph1fp.js";
76
+ import"./index-ves1rtqt.js";
77
77
  import"./index-ry16d01s.js";
78
78
  import"./index-rdm3px0g.js";
79
- import"./index-3mzc5rqc.js";
79
+ import"./index-nzfq1ms2.js";
80
80
  import"./index-7pmbnjvj.js";
81
81
  import"./index-9rwhas09.js";
82
- import"./index-zbygz217.js";
83
- import"./index-cwg99gea.js";
82
+ import"./index-ypxq0x7r.js";
83
+ import"./index-bn3aa5q1.js";
84
84
  import"./index-vzm6zre7.js";
85
85
  import"./index-ae75rja9.js";
86
- import"./index-n1ddn12j.js";
87
- import"./index-jmhn6ab5.js";
88
- import"./index-dz15f98h.js";
86
+ import"./index-g57p8p1k.js";
87
+ import"./index-traz987v.js";
88
+ import"./index-q8vfw61p.js";
89
89
  import"./index-t7hmqgjy.js";
90
- import"./index-dtwj4hsk.js";
90
+ import"./index-c2k7q723.js";
91
91
  import"./index-te9hq2f4.js";
92
92
  import"./index-ejhxgyvm.js";
93
93
  import"./index-7g4c7s5r.js";
94
- import"./index-270zfq1f.js";
95
- import"./index-gx2vp8gx.js";
96
- import"./index-88d5kpjj.js";
94
+ import"./index-epzadpmm.js";
95
+ import"./index-3t46mez1.js";
96
+ import"./index-3020n6d9.js";
97
97
  import"./index-sp2cxpaq.js";
98
98
  import"./index-qbxk2rn6.js";
99
99
  import"./index-zgwm4ryv.js";
100
- import"./index-0bw1jyen.js";
100
+ import"./index-p6v544jn.js";
101
101
  import"./index-xfzkq1k4.js";
102
102
  import"./index-bk5tah7q.js";
103
103
  import"./index-gknz3bv1.js";
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `/swarm attest <task_id>` (issue #3422): verify a git-external deliverable
3
+ * with the task's pinned read-only git anchors and record the durable
4
+ * external-evidence bundle that admits completion — the in-machine exit for
5
+ * tasks whose deliverable (commit/push, gh ops) can never produce a coder
6
+ * settlement. Human- or agent-invoked; everything fails closed exactly as
7
+ * the underlying executor does (undeclared tasks, non-read-only commands,
8
+ * mismatched anchors, oversized output all refuse).
9
+ */
10
+ export declare function handleAttestCommand(directory: string, args: string[], sessionID?: string): Promise<string>;
@@ -26,7 +26,7 @@ export declare const _internals: {
26
26
  CLOSE_REFLECTION_TIMEOUT_MS: number;
27
27
  detectFullAuto: typeof import("./orchestrator.js").detectFullAuto;
28
28
  guaranteeAllPlansComplete: typeof import("./finalize-stage.js").guaranteeAllPlansComplete;
29
- getGitRepositoryStatus: typeof import("../../git/branch.js").getGitRepositoryStatus;
29
+ getGitRepositoryStatus: typeof import("../../commands/git-status-read.js").readGitRepositoryStatusDetailedAsync;
30
30
  resetToMainAfterMerge: (cwd: string, options?: import("./align-stage.js").GuardedResetToMainOptions) => Promise<import("./align-stage.js").GuardedResetToMainResult>;
31
31
  resetToRemoteBranch: typeof import("../../git/branch.js").resetToRemoteBranch;
32
32
  copyDirRecursive: typeof import("./fs-helpers.js").copyDirRecursive;
@@ -36,6 +36,13 @@ export interface ClosePurgeGate {
36
36
  status: number | null;
37
37
  stderrTail: string;
38
38
  };
39
+ /**
40
+ * #3434: porcelain records whose path normalized outside the project
41
+ * root — excluded from `dirtyPaths`/`candidates` (and therefore from the
42
+ * confirm-token digest) and surfaced as a bounded warning instead of
43
+ * being joined into the scope unvalidated.
44
+ */
45
+ excludedOutOfRoot: string[];
39
46
  }
40
47
  /** Test seam for the #2508 gate (simulate git-status read failures). The
41
48
  * default routes through the #3317 async reader; legacy sync stubs returning
@@ -84,6 +84,18 @@ export declare const GIT_STATUS_ARGS: readonly ["--no-optional-locks", "status",
84
84
  * `src/commands/rollback-gate.ts` exports a same-named parser for
85
85
  * NUL-terminated `--porcelain -z` output (J1/#2946); the two are deliberately
86
86
  * not consolidated in this PR.
87
+ *
88
+ * #3434: `../`-bearing (or absolute) records are excluded from the dirty
89
+ * set and recorded in `excludedOutOfRoot` — the legacy `string[]` export
90
+ * below returns only the in-root paths. The containment predicate itself is
91
+ * the rollback-gate module's `isOutOfRootRelativePath` (single shared
92
+ * definition; the parsers stay separate by design).
93
+ */
94
+ export declare function parseTrackedDirtyPathsWithExclusions(statusOutput: string): import('./rollback-gate.js').TrackedDirtyParseResult;
95
+ /**
96
+ * Legacy `string[]` view of the newline-form parser (in-root paths only) —
97
+ * the export existing suites pin. New consumers that need the exclusion
98
+ * diagnostic use `parseTrackedDirtyPathsWithExclusions`.
87
99
  */
88
100
  export declare function parseTrackedDirtyPaths(statusOutput: string): string[];
89
101
  /**
@@ -94,10 +106,13 @@ export declare function parseTrackedDirtyPaths(statusOutput: string): string[];
94
106
  * helper, so its existing #2508 fail-closed tests keep their injection point.
95
107
  * #3317: async — the read is bounded and killable, and legacy sync stubs
96
108
  * keep working (awaiting a plain value is a no-op).
109
+ * #3434: the ok arm carries `excludedOutOfRoot` so the #2953 re-check
110
+ * compares against the SAME filtered set the operator confirmed.
97
111
  */
98
112
  export declare function readTrackedDirtyPaths(directory: string): Promise<{
99
113
  ok: true;
100
114
  dirtyPaths: string[];
115
+ excludedOutOfRoot: string[];
101
116
  } | {
102
117
  ok: false;
103
118
  /** Structured cause when the reader could tell (absent for legacy `null` stubs). */
@@ -74,3 +74,26 @@ export declare function readGitStatusAsync(args: readonly string[], cwd: string,
74
74
  * non-blocking preview, with no transient-retry chain.
75
75
  */
76
76
  export declare function readGitRepositoryStatusAsync(cwd: string): Promise<boolean>;
77
+ /**
78
+ * Detailed twin of `readGitRepositoryStatusAsync` (issue #3427): the same
79
+ * single-attempt `rev-parse --git-dir` read, mapped to the SAME
80
+ * `GitRepositoryStatus` vocabulary the sync `branch.getGitRepositoryStatus`
81
+ * produces — `{isRepo:true}` / `not_git_repo` / `git_unavailable` /
82
+ * `git_error` with a message — so the finalize align stage can move off the
83
+ * blocking sync probe without losing its reason-specific skip diagnostics.
84
+ *
85
+ * Classification parity with `src/git/branch.ts`:
86
+ * - ENOENT goes through the shared #2236 `classifySpawnFailure` split — a
87
+ * cwd fault is `git_error` NAMING the cwd (never `git_unavailable`);
88
+ * binary-missing keeps the full `gitBinaryMissingMessage` remediation text.
89
+ * - A nonzero child exit is `not_git_repo` only when the bounded stderr
90
+ * matches the shared `isNotGitRepositoryMessage` vocabulary; every other
91
+ * nonzero exit is `git_error` carrying the status.
92
+ * - Spawn-class failures (ETIMEDOUT/ESIGNAL/…) are `git_error` with the
93
+ * failure code ALWAYS carried in the message — empty stderr never
94
+ * discards the class.
95
+ *
96
+ * `ignoreOutput` is deliberately NOT set: the bounded stderr feeds the
97
+ * repo-detection classification.
98
+ */
99
+ export declare function readGitRepositoryStatusDetailedAsync(cwd: string): Promise<import('../git/branch.js').GitRepositoryStatus>;
@@ -8,6 +8,7 @@ export { handleAgentsCommand } from './agents';
8
8
  export { handleAnalyzeCommand } from './analyze';
9
9
  export { handleApproveWriteCommand } from './approve-write';
10
10
  export { handleArchiveCommand } from './archive';
11
+ export { handleAttestCommand } from './attest';
11
12
  export { handleAutoProceedCommand } from './auto-proceed';
12
13
  export { handleBenchmarkCommand } from './benchmark';
13
14
  export { handleBrainstormCommand } from './brainstorm';
@@ -1077,11 +1077,19 @@ export declare const COMMAND_REGISTRY: {
1077
1077
  readonly 'reset-session': {
1078
1078
  readonly handler: (ctx: CommandContext) => Promise<string>;
1079
1079
  readonly description: "Clear session state while preserving plan, evidence, and knowledge";
1080
- readonly details: "Deletes only .swarm/session/state.json and other session files. Clears in-memory agent sessions, delegation chains, and active-agent mappings. Preserves plan, evidence, and knowledge. Also releases this session's pending knowledge-gate obligations (#2398) and recovers stale coder settlements so dispatches cannot wedge on CODER_DISPATCH_IN_PROGRESS (#2268). Auto-backs up removed files to .swarm/reset-backups/ (newest 5 kept).";
1080
+ readonly details: "Deletes .swarm/session/state.json plus other session files; clears in-memory sessions, chains, and active-agent maps. Preserves plan, evidence, and knowledge; releases this session's pending knowledge-gate obligations (#2398); recovers coder settlements wedged on CODER_DISPATCH_IN_PROGRESS (#2268); backs up to .swarm/reset-backups/ (newest 5 kept). If a cleanup step fails, the closing guard stays closed by design, writes pause (an advisory says why), and a reset re-run or restart recovers.";
1081
1081
  readonly args: "--confirm=<token> (purge dirty/live lanes)";
1082
1082
  readonly category: "utility";
1083
1083
  readonly toolPolicy: "restricted";
1084
1084
  };
1085
+ readonly attest: {
1086
+ readonly handler: (ctx: CommandContext) => Promise<string>;
1087
+ readonly description: "Verify a git-external deliverable with pinned anchors <task_id>";
1088
+ readonly details: "Runs the task's pinned read-only git evidence_anchors (issue #3422) inside the project root and records the durable external-evidence bundle that admits completion — the in-machine exit for tasks whose deliverable (commit/push, gh ops) can never produce a coder settlement. Fail-closed: the plan task must declare evidence_class external_git with 1..16 anchors (expect exact / expect_prefix non-empty), every anchor runs as a bounded no-shell argv spawn (stdin ignored, 10s per anchor, 30s total; output over the 4096-char evidence bound refuses the anchor rather than truncating it), and only positively-known read-only git subcommands/flags (rev-list, log, rev-parse, show, diff) are admitted. Undeclared tasks, mismatched anchors, and non-read-only commands refuse exactly as the completion gate does. Declaration changes revoke stale proofs (a fresh attest is then required). See docs/commands.md and docs/plan-durability.md.";
1089
+ readonly args: "<task_id>";
1090
+ readonly category: "utility";
1091
+ readonly toolPolicy: "agent";
1092
+ };
1085
1093
  readonly recover: {
1086
1094
  readonly handler: (ctx: CommandContext) => Promise<string>;
1087
1095
  readonly description: "Recover wedged coder settlements [task_id] [--force]";
@@ -23,6 +23,18 @@ export declare const _rollbackGateInternals: {
23
23
  * repositories; git tracks nothing there.
24
24
  */
25
25
  export declare function isRealGitRepository(directory: string): boolean;
26
+ /** #3434: a parsed porcelain record whose path normalizes outside the repo root. */
27
+ export declare function isOutOfRootRelativePath(rel: string): boolean;
28
+ /**
29
+ * The NUL-form parser's result contract (#3434): the in-root dirty paths that
30
+ * feed the destroy scope, plus any records whose path normalized outside the
31
+ * project root — excluded from the scope and surfaced for the diagnostic
32
+ * instead of being joined into the confirm-token digest unvalidated.
33
+ */
34
+ export interface TrackedDirtyParseResult {
35
+ dirtyPaths: string[];
36
+ excludedOutOfRoot: string[];
37
+ }
26
38
  /**
27
39
  * Parse `git status --porcelain -z` output into repo-relative tracked-dirty
28
40
  * paths. The -z form is NUL-terminated and NEVER quotes paths (core.quotepath
@@ -36,6 +48,16 @@ export declare function isRealGitRepository(directory: string): boolean;
36
48
  * (intent-to-add) — so the test must not anchor to the first column, or the
37
49
  * ORIG_PATH token of an R/C-initial file (README.md, CHANGELOG.md, …) is
38
50
  * misread as the start of a new record and swallows the next real entry.
51
+ *
52
+ * #3434: `../`-bearing (or absolute) records are excluded from the dirty
53
+ * set and recorded in `excludedOutOfRoot` — the legacy `string[]` export
54
+ * below returns only the in-root paths.
55
+ */
56
+ export declare function parseTrackedDirtyPathsWithExclusions(statusOutput: string): TrackedDirtyParseResult;
57
+ /**
58
+ * Legacy `string[]` view of the NUL-form parser (in-root paths only) — the
59
+ * export existing suites pin. New consumers that need the exclusion
60
+ * diagnostic use `parseTrackedDirtyPathsWithExclusions`.
39
61
  */
40
62
  export declare function parseTrackedDirtyPaths(statusOutput: string): string[];
41
63
  /**
@@ -43,11 +65,23 @@ export declare function parseTrackedDirtyPaths(statusOutput: string): string[];
43
65
  * index while a file sits on disk at that path. `git reset --hard` silently
44
66
  * overwrites exactly these untracked (or since-ignored) files when it
45
67
  * materializes the target tree, so they belong in the destruction scope
46
- * alongside tracked-dirty paths (#2976 review F-1). Returns [] when either
47
- * listing cannot be read — the tracked-dirty gate above still applies, and
48
- * the caller's unreadable-status refusal covers real-repo failures.
68
+ * alongside tracked-dirty paths (#2976 review F-1).
69
+ *
70
+ * #3434 fail-closed contract: `failure` is set when either listing cannot
71
+ * be read, carrying the reader's structured cause when it could tell. The
72
+ * caller must REFUSE on it — an unreadable enumeration may not read as a
73
+ * measured "nothing in the way" (the same class #3317 closed for the status
74
+ * reads). A non-git or bare-marker root returns empty paths with NO failure:
75
+ * nothing tracked can be in the way there (#2127 convention).
49
76
  */
50
- export declare function untrackedPathsInTargetTree(directory: string, targetSha: string): Promise<string[]>;
77
+ export declare function untrackedPathsInTargetTree(directory: string, targetSha: string): Promise<{
78
+ paths: string[];
79
+ failure: {
80
+ code: string | null;
81
+ status: number | null;
82
+ stderrTail: string;
83
+ } | null;
84
+ }>;
51
85
  /**
52
86
  * The git-kind candidate set: the absolute paths of tracked-dirty files that
53
87
  * `git reset --hard` would destroy. This is the ONLY derivation for
@@ -63,30 +97,63 @@ export declare function swarmOverwriteCandidates(directory: string, overwriteRel
63
97
  /**
64
98
  * #3317: cause-matched wording for an unreadable destruction measurement —
65
99
  * single source shared by the /swarm rollback command and the checkpoint
66
- * tool sink so the two refusal texts cannot drift.
100
+ * tool sink so the two refusal texts cannot drift. `source` (#3434
101
+ * feedback round) names WHICH read failed: the default 'status' keeps the
102
+ * historical wording BYTE-IDENTICAL (pinned by the #3317 round-2 trace
103
+ * suite checkpoint-restore-cause-3275); 'enumeration' rewords the arms to
104
+ * name the ls-tree/ls-files listing so the operator is pointed at the read
105
+ * that actually failed.
67
106
  */
68
107
  export declare function describeUnreadableCause(measurement: {
69
108
  code?: string | null;
70
109
  status?: number | null;
71
110
  stderrTail?: string;
72
- }): string;
111
+ }, source?: 'status' | 'enumeration'): string;
112
+ /**
113
+ * Sanitize a repo-controlled porcelain record for operator/agent-facing
114
+ * diagnostic text (#3434 feedback round): collapse control characters
115
+ * (ANSI/CR/LF/NUL cannot smuggle terminal escapes or forged lines) and
116
+ * bound the excerpt — the same house discipline as the reader's
117
+ * `stderrTail` and `excerptProbeOutput`. Excluded records never enter the
118
+ * scope digest, so the digest's own NUL/newline rejection does not cover
119
+ * the one place their bytes are rendered.
120
+ */
121
+ export declare function formatExcludedRecord(rel: string): string;
73
122
  /**
74
123
  * Measure the destruction scope for a git checkpoint restore. When
75
124
  * `targetSha` is provided, files that are untracked (or since-ignored) on
76
125
  * disk but tracked in the TARGET tree are included: `git reset --hard`
77
126
  * overwrites them silently, so they are part of the destruction set
78
- * (#2976 review F-1). `unreadable` means git status could not be read
79
- * inside a real repository — callers must fail closed on it (never treat
80
- * it as a clean tree). A non-git or bare-marker root returns an empty
81
- * dirty set: nothing tracked to destroy.
127
+ * (#2976 review F-1). `unreadable` means git status — or, #3434, the
128
+ * ls-tree/ls-files enumeration of the target tree — could not be read
129
+ * inside a real repository; callers must fail closed on it (never treat it
130
+ * as a clean tree, and never let a failed enumeration shrink the measured
131
+ * scope). A non-git or bare-marker root returns an empty dirty set: nothing
132
+ * tracked to destroy. `excludedOutOfRoot` carries porcelain records whose
133
+ * path normalized outside the project root (#3434) — excluded from the
134
+ * scope and surfaced for the preview diagnostic.
82
135
  */
83
136
  export declare function measureGitDestruction(directory: string, targetSha?: string): Promise<{
84
137
  kind: 'ok';
85
138
  dirtyRelPaths: string[];
139
+ /** #3434: out-of-root porcelain records excluded from the scope. */
140
+ excludedOutOfRoot: string[];
86
141
  } | {
87
142
  kind: 'unreadable';
88
143
  /** #3317: why the read failed, when the async reader could tell. */
89
144
  code?: string | null;
90
145
  status?: number | null;
91
146
  stderrTail?: string;
147
+ /**
148
+ * #3434 feedback: WHICH read failed — the status read or the
149
+ * ls-tree/ls-files enumeration. Consumers word the refusal
150
+ * accordingly instead of always blaming git status.
151
+ */
152
+ source: 'status' | 'enumeration';
153
+ /**
154
+ * Out-of-root records already parsed from a SUCCESSFUL status
155
+ * read before the enumeration failed — carried so the refusal
156
+ * can still disclose them instead of dropping them silently.
157
+ */
158
+ excludedOutOfRoot?: string[];
92
159
  }>;
@@ -53,6 +53,23 @@ export declare const MigrationStatusSchema: z.ZodEnum<{
53
53
  migration_failed: "migration_failed";
54
54
  }>;
55
55
  export type MigrationStatus = z.infer<typeof MigrationStatusSchema>;
56
+ /**
57
+ * External-evidence anchor (issue #3422): a pinned read-only git assertion a
58
+ * task declares so `/swarm attest` can verify a git-external deliverable
59
+ * (commit/push, gh ops) without a coder settlement.
60
+ *
61
+ * `expect` matches the trimmed stdout exactly; `expect_prefix` requires a
62
+ * NON-EMPTY prefix of it (an empty prefix would match everything and attest
63
+ * nothing). At least one of the two must be present per anchor; both bounds
64
+ * mirror the durable-evidence storage cap so an anchor is never accepted with
65
+ * output that cannot be persisted verbatim.
66
+ */
67
+ export declare const ExternalEvidenceAnchorSchema: z.ZodObject<{
68
+ command: z.ZodString;
69
+ expect: z.ZodOptional<z.ZodString>;
70
+ expect_prefix: z.ZodOptional<z.ZodString>;
71
+ }, z.core.$strip>;
72
+ export type ExternalEvidenceAnchor = z.infer<typeof ExternalEvidenceAnchorSchema>;
56
73
  export declare const TaskSchema: z.ZodObject<{
57
74
  id: z.ZodString;
58
75
  phase: z.ZodNumber;
@@ -75,6 +92,15 @@ export declare const TaskSchema: z.ZodObject<{
75
92
  evidence_path: z.ZodOptional<z.ZodString>;
76
93
  blocked_reason: z.ZodOptional<z.ZodString>;
77
94
  fr_refs: z.ZodOptional<z.ZodArray<z.ZodString>>;
95
+ evidence_class: z.ZodOptional<z.ZodEnum<{
96
+ coder_mutation: "coder_mutation";
97
+ external_git: "external_git";
98
+ }>>;
99
+ evidence_anchors: z.ZodOptional<z.ZodArray<z.ZodObject<{
100
+ command: z.ZodString;
101
+ expect: z.ZodOptional<z.ZodString>;
102
+ expect_prefix: z.ZodOptional<z.ZodString>;
103
+ }, z.core.$strip>>>;
78
104
  }, z.core.$strip>;
79
105
  export type Task = z.infer<typeof TaskSchema>;
80
106
  export declare const PhaseSchema: z.ZodObject<{
@@ -110,6 +136,15 @@ export declare const PhaseSchema: z.ZodObject<{
110
136
  evidence_path: z.ZodOptional<z.ZodString>;
111
137
  blocked_reason: z.ZodOptional<z.ZodString>;
112
138
  fr_refs: z.ZodOptional<z.ZodArray<z.ZodString>>;
139
+ evidence_class: z.ZodOptional<z.ZodEnum<{
140
+ coder_mutation: "coder_mutation";
141
+ external_git: "external_git";
142
+ }>>;
143
+ evidence_anchors: z.ZodOptional<z.ZodArray<z.ZodObject<{
144
+ command: z.ZodString;
145
+ expect: z.ZodOptional<z.ZodString>;
146
+ expect_prefix: z.ZodOptional<z.ZodString>;
147
+ }, z.core.$strip>>>;
113
148
  }, z.core.$strip>>>;
114
149
  type: z.ZodOptional<z.ZodEnum<{
115
150
  code: "code";
@@ -156,6 +191,15 @@ export declare const PlanSchema: z.ZodObject<{
156
191
  evidence_path: z.ZodOptional<z.ZodString>;
157
192
  blocked_reason: z.ZodOptional<z.ZodString>;
158
193
  fr_refs: z.ZodOptional<z.ZodArray<z.ZodString>>;
194
+ evidence_class: z.ZodOptional<z.ZodEnum<{
195
+ coder_mutation: "coder_mutation";
196
+ external_git: "external_git";
197
+ }>>;
198
+ evidence_anchors: z.ZodOptional<z.ZodArray<z.ZodObject<{
199
+ command: z.ZodString;
200
+ expect: z.ZodOptional<z.ZodString>;
201
+ expect_prefix: z.ZodOptional<z.ZodString>;
202
+ }, z.core.$strip>>>;
159
203
  }, z.core.$strip>>>;
160
204
  type: z.ZodOptional<z.ZodEnum<{
161
205
  code: "code";