swarm-orchestrator 14.0.2 → 14.2.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 (543) hide show
  1. package/CHANGELOG.md +390 -1
  2. package/README.md +217 -524
  3. package/dist/agent-escalation.js +74 -0
  4. package/dist/agent-escalation.js.map +1 -0
  5. package/dist/agent-prompt.js +55 -0
  6. package/dist/agent-prompt.js.map +1 -0
  7. package/dist/agent-run.js +350 -160
  8. package/dist/agent-run.js.map +1 -1
  9. package/dist/cli-bond-report.js +37 -0
  10. package/dist/cli-bond-report.js.map +1 -0
  11. package/dist/cli-bundle.js +64 -0
  12. package/dist/cli-bundle.js.map +1 -0
  13. package/dist/cli-calibrate.js +282 -0
  14. package/dist/cli-calibrate.js.map +1 -0
  15. package/dist/cli-ci.js +227 -0
  16. package/dist/cli-ci.js.map +1 -0
  17. package/dist/cli-command-definitions.js +134 -0
  18. package/dist/cli-command-definitions.js.map +1 -0
  19. package/dist/cli-evidence-summary.js +25 -0
  20. package/dist/cli-evidence-summary.js.map +1 -0
  21. package/dist/cli-gates.js +124 -0
  22. package/dist/cli-gates.js.map +1 -0
  23. package/dist/cli-init.js +175 -0
  24. package/dist/cli-init.js.map +1 -0
  25. package/dist/cli-model-default.js +107 -0
  26. package/dist/cli-model-default.js.map +1 -0
  27. package/dist/cli-model-preflight.js +18 -0
  28. package/dist/cli-model-preflight.js.map +1 -0
  29. package/dist/cli-options.js +104 -155
  30. package/dist/cli-options.js.map +1 -1
  31. package/dist/cli-parallel-output.js +158 -0
  32. package/dist/cli-parallel-output.js.map +1 -0
  33. package/dist/cli-parallel.js +585 -0
  34. package/dist/cli-parallel.js.map +1 -0
  35. package/dist/cli-preflight.js +33 -0
  36. package/dist/cli-preflight.js.map +1 -0
  37. package/dist/cli-provider-settings.js +21 -0
  38. package/dist/cli-provider-settings.js.map +1 -0
  39. package/dist/cli-run-commands.js +32 -23
  40. package/dist/cli-run-commands.js.map +1 -1
  41. package/dist/cli-run-report.js +63 -0
  42. package/dist/cli-run-report.js.map +1 -0
  43. package/dist/cli-run-settings.js +30 -0
  44. package/dist/cli-run-settings.js.map +1 -0
  45. package/dist/cli-runtime-inputs.js +25 -0
  46. package/dist/cli-runtime-inputs.js.map +1 -0
  47. package/dist/cli-select.js +23 -10
  48. package/dist/cli-select.js.map +1 -1
  49. package/dist/cli-session.js +286 -0
  50. package/dist/cli-session.js.map +1 -0
  51. package/dist/cli-task-contract.js +24 -0
  52. package/dist/cli-task-contract.js.map +1 -0
  53. package/dist/cli-task-cost.js +76 -0
  54. package/dist/cli-task-cost.js.map +1 -0
  55. package/dist/cli-task-goal.js +114 -0
  56. package/dist/cli-task-goal.js.map +1 -0
  57. package/dist/cli-terminal.js +103 -0
  58. package/dist/cli-terminal.js.map +1 -0
  59. package/dist/cli-verification-evidence.js +51 -0
  60. package/dist/cli-verification-evidence.js.map +1 -0
  61. package/dist/cli-verify-options.js +146 -0
  62. package/dist/cli-verify-options.js.map +1 -0
  63. package/dist/cli-verify.js +18 -0
  64. package/dist/cli-verify.js.map +1 -0
  65. package/dist/cli.js +259 -1376
  66. package/dist/cli.js.map +1 -1
  67. package/dist/config/approval-mode.js +26 -0
  68. package/dist/config/approval-mode.js.map +1 -0
  69. package/dist/config/init.js +67 -5
  70. package/dist/config/init.js.map +1 -1
  71. package/dist/config/interface-settings.js +7 -0
  72. package/dist/config/interface-settings.js.map +1 -0
  73. package/dist/config/node-harness.js +34 -0
  74. package/dist/config/node-harness.js.map +1 -0
  75. package/dist/config/package-discovery.js +50 -0
  76. package/dist/config/package-discovery.js.map +1 -0
  77. package/dist/config/settings.js +7 -0
  78. package/dist/config/settings.js.map +1 -1
  79. package/dist/config/swarm-toml.js +16 -3
  80. package/dist/config/swarm-toml.js.map +1 -1
  81. package/dist/core/compaction.js +29 -27
  82. package/dist/core/compaction.js.map +1 -1
  83. package/dist/core/degenerate-output.js +44 -0
  84. package/dist/core/degenerate-output.js.map +1 -0
  85. package/dist/core/loop.js +166 -18
  86. package/dist/core/loop.js.map +1 -1
  87. package/dist/core/model-cancellation.js +17 -0
  88. package/dist/core/model-cancellation.js.map +1 -0
  89. package/dist/core/model-client.js.map +1 -1
  90. package/dist/core/termination.js.map +1 -1
  91. package/dist/durable/controller-location.js +30 -0
  92. package/dist/durable/controller-location.js.map +1 -0
  93. package/dist/durable/legacy-run-store.js +86 -0
  94. package/dist/durable/legacy-run-store.js.map +1 -0
  95. package/dist/durable/recovery-context.js +179 -0
  96. package/dist/durable/recovery-context.js.map +1 -0
  97. package/dist/durable/run-journal.js +161 -0
  98. package/dist/durable/run-journal.js.map +1 -0
  99. package/dist/durable/run-store.js +203 -200
  100. package/dist/durable/run-store.js.map +1 -1
  101. package/dist/durable/session-evidence.js +21 -0
  102. package/dist/durable/session-evidence.js.map +1 -0
  103. package/dist/eval/agent-session.js +146 -0
  104. package/dist/eval/agent-session.js.map +1 -0
  105. package/dist/eval/arm-dispatch.js +33 -0
  106. package/dist/eval/arm-dispatch.js.map +1 -0
  107. package/dist/eval/arms.js +13 -5
  108. package/dist/eval/arms.js.map +1 -1
  109. package/dist/eval/campaign-history.js +48 -0
  110. package/dist/eval/campaign-history.js.map +1 -0
  111. package/dist/eval/campaign-record.js +232 -0
  112. package/dist/eval/campaign-record.js.map +1 -0
  113. package/dist/eval/campaign-run.js +30 -14
  114. package/dist/eval/campaign-run.js.map +1 -1
  115. package/dist/eval/deadline-overshoot.js +73 -0
  116. package/dist/eval/deadline-overshoot.js.map +1 -0
  117. package/dist/eval/empty-patch-attribution.js +19 -0
  118. package/dist/eval/empty-patch-attribution.js.map +1 -0
  119. package/dist/eval/endpoint-health.js +126 -0
  120. package/dist/eval/endpoint-health.js.map +1 -0
  121. package/dist/eval/false-green-rate.js +133 -0
  122. package/dist/eval/false-green-rate.js.map +1 -0
  123. package/dist/eval/feedback-study-analysis.js +747 -0
  124. package/dist/eval/feedback-study-analysis.js.map +1 -0
  125. package/dist/eval/feedback-study-report.js +156 -0
  126. package/dist/eval/feedback-study-report.js.map +1 -0
  127. package/dist/eval/feedback-study.js +854 -0
  128. package/dist/eval/feedback-study.js.map +1 -0
  129. package/dist/eval/first-run-observation.js +105 -0
  130. package/dist/eval/first-run-observation.js.map +1 -0
  131. package/dist/eval/frozen-campaign.js +127 -0
  132. package/dist/eval/frozen-campaign.js.map +1 -0
  133. package/dist/eval/goal-campaign-report.js +143 -0
  134. package/dist/eval/goal-campaign-report.js.map +1 -0
  135. package/dist/eval/goal-observation.js +50 -0
  136. package/dist/eval/goal-observation.js.map +1 -0
  137. package/dist/eval/goal-protocol.js +104 -0
  138. package/dist/eval/goal-protocol.js.map +1 -0
  139. package/dist/eval/known-total.js +7 -0
  140. package/dist/eval/known-total.js.map +1 -0
  141. package/dist/eval/npm-failure.js +24 -0
  142. package/dist/eval/npm-failure.js.map +1 -0
  143. package/dist/eval/oracle-challenge.js +80 -0
  144. package/dist/eval/oracle-challenge.js.map +1 -0
  145. package/dist/eval/oracle-filter.js +74 -7
  146. package/dist/eval/oracle-filter.js.map +1 -1
  147. package/dist/eval/patch-metrics.js +74 -0
  148. package/dist/eval/patch-metrics.js.map +1 -0
  149. package/dist/eval/pr-task-judge.js +241 -0
  150. package/dist/eval/pr-task-judge.js.map +1 -0
  151. package/dist/eval/pr-task-paths.js +26 -0
  152. package/dist/eval/pr-task-paths.js.map +1 -0
  153. package/dist/eval/protocol-fixture.js +97 -0
  154. package/dist/eval/protocol-fixture.js.map +1 -0
  155. package/dist/eval/protocol.js +80 -0
  156. package/dist/eval/protocol.js.map +1 -0
  157. package/dist/eval/reach-pressure-analysis.js +507 -0
  158. package/dist/eval/reach-pressure-analysis.js.map +1 -0
  159. package/dist/eval/reach-pressure-derivation.js +201 -0
  160. package/dist/eval/reach-pressure-derivation.js.map +1 -0
  161. package/dist/eval/reach-pressure-report.js +266 -0
  162. package/dist/eval/reach-pressure-report.js.map +1 -0
  163. package/dist/eval/reach-pressure.js +645 -0
  164. package/dist/eval/reach-pressure.js.map +1 -0
  165. package/dist/eval/repair-progress.js +109 -0
  166. package/dist/eval/repair-progress.js.map +1 -0
  167. package/dist/eval/sealed-workspace.js +61 -0
  168. package/dist/eval/sealed-workspace.js.map +1 -0
  169. package/dist/eval/security-corpus.js +139 -0
  170. package/dist/eval/security-corpus.js.map +1 -0
  171. package/dist/eval/statistics.js +187 -0
  172. package/dist/eval/statistics.js.map +1 -1
  173. package/dist/eval/task-difficulty.js +28 -0
  174. package/dist/eval/task-difficulty.js.map +1 -0
  175. package/dist/eval/task-identity.js +0 -0
  176. package/dist/eval/task-identity.js.map +1 -0
  177. package/dist/eval/test-case-split.js +56 -5
  178. package/dist/eval/test-case-split.js.map +1 -1
  179. package/dist/eval/verification-closure.js +56 -0
  180. package/dist/eval/verification-closure.js.map +1 -0
  181. package/dist/evidence/acceptance-contract.js +34 -0
  182. package/dist/evidence/acceptance-contract.js.map +1 -0
  183. package/dist/evidence/attestation.js +63 -10
  184. package/dist/evidence/attestation.js.map +1 -1
  185. package/dist/evidence/behavior-check.js +93 -0
  186. package/dist/evidence/behavior-check.js.map +1 -0
  187. package/dist/evidence/blob-manifest.js +5 -1
  188. package/dist/evidence/blob-manifest.js.map +1 -1
  189. package/dist/evidence/browser-execution.js +12 -0
  190. package/dist/evidence/browser-execution.js.map +1 -0
  191. package/dist/evidence/bundle-manifest.js +4 -0
  192. package/dist/evidence/bundle-manifest.js.map +1 -1
  193. package/dist/evidence/bundle.js +36 -4
  194. package/dist/evidence/bundle.js.map +1 -1
  195. package/dist/evidence/canonical-json.js +1 -1
  196. package/dist/evidence/canonical-json.js.map +1 -1
  197. package/dist/evidence/ci-summary.js +58 -0
  198. package/dist/evidence/ci-summary.js.map +1 -0
  199. package/dist/evidence/frozen-json.js +10 -0
  200. package/dist/evidence/frozen-json.js.map +1 -0
  201. package/dist/evidence/goal-contract.js +90 -0
  202. package/dist/evidence/goal-contract.js.map +1 -0
  203. package/dist/evidence/ledger-file.js +45 -0
  204. package/dist/evidence/ledger-file.js.map +1 -0
  205. package/dist/evidence/ledger-record.js +28 -0
  206. package/dist/evidence/ledger-record.js.map +1 -1
  207. package/dist/evidence/ledger.js +19 -9
  208. package/dist/evidence/ledger.js.map +1 -1
  209. package/dist/evidence/model-call-recording.js +32 -5
  210. package/dist/evidence/model-call-recording.js.map +1 -1
  211. package/dist/evidence/predicate-catalogue.js +219 -0
  212. package/dist/evidence/predicate-catalogue.js.map +1 -1
  213. package/dist/evidence/record-kind.js +2 -0
  214. package/dist/evidence/record-kind.js.map +1 -1
  215. package/dist/evidence/replay.js +14 -0
  216. package/dist/evidence/replay.js.map +1 -1
  217. package/dist/evidence/routine-claims.js +38 -0
  218. package/dist/evidence/routine-claims.js.map +1 -0
  219. package/dist/evidence/run-assessment.js +131 -0
  220. package/dist/evidence/run-assessment.js.map +1 -0
  221. package/dist/evidence/run-spec.js +19 -4
  222. package/dist/evidence/run-spec.js.map +1 -1
  223. package/dist/evidence/scrub.js +1 -0
  224. package/dist/evidence/scrub.js.map +1 -1
  225. package/dist/evidence/session.js +8 -1
  226. package/dist/evidence/session.js.map +1 -1
  227. package/dist/evidence/signer-trust.js.map +1 -1
  228. package/dist/evidence/signing.js +14 -6
  229. package/dist/evidence/signing.js.map +1 -1
  230. package/dist/evidence/task-contract.js +120 -0
  231. package/dist/evidence/task-contract.js.map +1 -0
  232. package/dist/evidence/task-preset.js +52 -0
  233. package/dist/evidence/task-preset.js.map +1 -0
  234. package/dist/evidence/transcript.js +89 -0
  235. package/dist/evidence/transcript.js.map +1 -0
  236. package/dist/evidence/verdict.js +62 -2
  237. package/dist/evidence/verdict.js.map +1 -1
  238. package/dist/evidence/verifier/behavior.d.mts +5 -0
  239. package/dist/evidence/verifier/behavior.mjs +161 -0
  240. package/dist/evidence/verifier/controller.d.mts +15 -0
  241. package/dist/evidence/verifier/controller.mjs +751 -0
  242. package/dist/evidence/verifier/rederive.d.mts +44 -1
  243. package/dist/evidence/verifier/rederive.mjs +253 -49
  244. package/dist/evidence/verifier/status.d.mts +9 -0
  245. package/dist/evidence/verifier/status.mjs +157 -0
  246. package/dist/evidence/verifier/upgrade.d.mts +6 -0
  247. package/dist/evidence/verifier/upgrade.mjs +80 -0
  248. package/dist/evidence/verifier/verify.d.mts +8 -1
  249. package/dist/evidence/verifier/verify.mjs +885 -13
  250. package/dist/evidence/verify-report.js +25 -8
  251. package/dist/evidence/verify-report.js.map +1 -1
  252. package/dist/exec/child-environment.js +40 -0
  253. package/dist/exec/child-environment.js.map +1 -1
  254. package/dist/exec/container-backend.js +138 -35
  255. package/dist/exec/container-backend.js.map +1 -1
  256. package/dist/exec/container-image.js +7 -0
  257. package/dist/exec/container-image.js.map +1 -0
  258. package/dist/exec/controlled-network.js +39 -0
  259. package/dist/exec/controlled-network.js.map +1 -0
  260. package/dist/exec/execution-mode.js +46 -19
  261. package/dist/exec/execution-mode.js.map +1 -1
  262. package/dist/exec/isolation-option.js +3 -1
  263. package/dist/exec/isolation-option.js.map +1 -1
  264. package/dist/exec/resource-pool.js +47 -0
  265. package/dist/exec/resource-pool.js.map +1 -0
  266. package/dist/exec/run-cancellation.js +2 -1
  267. package/dist/exec/run-cancellation.js.map +1 -1
  268. package/dist/exec/run-process.js +31 -10
  269. package/dist/exec/run-process.js.map +1 -1
  270. package/dist/exec/runtime-resource.js +93 -0
  271. package/dist/exec/runtime-resource.js.map +1 -0
  272. package/dist/exec/task-contract-enforcement.js +28 -0
  273. package/dist/exec/task-contract-enforcement.js.map +1 -0
  274. package/dist/gates/acceptance-package.js +75 -0
  275. package/dist/gates/acceptance-package.js.map +1 -0
  276. package/dist/gates/auto-resolve.js +18 -0
  277. package/dist/gates/auto-resolve.js.map +1 -1
  278. package/dist/gates/behavior-artifacts.js +88 -0
  279. package/dist/gates/behavior-artifacts.js.map +1 -0
  280. package/dist/gates/behavior-check.js +144 -0
  281. package/dist/gates/behavior-check.js.map +1 -0
  282. package/dist/gates/browser-instrument-runner.mjs +80 -0
  283. package/dist/gates/browser-instrument.js +33 -0
  284. package/dist/gates/browser-instrument.js.map +1 -0
  285. package/dist/gates/browser-results.js +75 -0
  286. package/dist/gates/browser-results.js.map +1 -0
  287. package/dist/gates/certification.js +65 -0
  288. package/dist/gates/certification.js.map +1 -0
  289. package/dist/gates/change-source.js +150 -0
  290. package/dist/gates/change-source.js.map +1 -0
  291. package/dist/gates/contract-executor.js +81 -0
  292. package/dist/gates/contract-executor.js.map +1 -0
  293. package/dist/gates/contract-scope.js +21 -0
  294. package/dist/gates/contract-scope.js.map +1 -0
  295. package/dist/gates/contract-verification.js +51 -0
  296. package/dist/gates/contract-verification.js.map +1 -0
  297. package/dist/gates/default-gates.js +19 -152
  298. package/dist/gates/default-gates.js.map +1 -1
  299. package/dist/gates/dependency-install.js +181 -0
  300. package/dist/gates/dependency-install.js.map +1 -0
  301. package/dist/gates/engine.js +13 -2
  302. package/dist/gates/engine.js.map +1 -1
  303. package/dist/gates/environment-preflight.js +108 -0
  304. package/dist/gates/environment-preflight.js.map +1 -0
  305. package/dist/gates/file-set-tool.js +57 -13
  306. package/dist/gates/file-set-tool.js.map +1 -1
  307. package/dist/gates/file-set.js +105 -9
  308. package/dist/gates/file-set.js.map +1 -1
  309. package/dist/gates/gate-command.js +69 -0
  310. package/dist/gates/gate-command.js.map +1 -0
  311. package/dist/gates/gate-definition.js.map +1 -1
  312. package/dist/gates/gate-runner.js +50 -45
  313. package/dist/gates/gate-runner.js.map +1 -1
  314. package/dist/gates/gate-set-seal.js +11 -1
  315. package/dist/gates/gate-set-seal.js.map +1 -1
  316. package/dist/gates/git-workspace.js +18 -2
  317. package/dist/gates/git-workspace.js.map +1 -1
  318. package/dist/gates/github-source.js +44 -0
  319. package/dist/gates/github-source.js.map +1 -0
  320. package/dist/gates/goal-acceptance.js +167 -0
  321. package/dist/gates/goal-acceptance.js.map +1 -0
  322. package/dist/gates/goal-checkout.js +109 -0
  323. package/dist/gates/goal-checkout.js.map +1 -0
  324. package/dist/gates/goal-effects.js +38 -0
  325. package/dist/gates/goal-effects.js.map +1 -0
  326. package/dist/gates/http-check-runner.mjs +96 -0
  327. package/dist/gates/independent-checks.js +34 -0
  328. package/dist/gates/independent-checks.js.map +1 -0
  329. package/dist/gates/independent-verification.js +623 -97
  330. package/dist/gates/independent-verification.js.map +1 -1
  331. package/dist/gates/inspection-gates.js +25 -3
  332. package/dist/gates/inspection-gates.js.map +1 -1
  333. package/dist/gates/measure-snapshot.js +5 -0
  334. package/dist/gates/measure-snapshot.js.map +1 -1
  335. package/dist/gates/mutant-parse.js +47 -0
  336. package/dist/gates/mutant-parse.js.map +1 -0
  337. package/dist/gates/mutant-witness.js +99 -0
  338. package/dist/gates/mutant-witness.js.map +1 -0
  339. package/dist/gates/node-command-runner.js +67 -6
  340. package/dist/gates/node-command-runner.js.map +1 -1
  341. package/dist/gates/node-gates.js +91 -0
  342. package/dist/gates/node-gates.js.map +1 -0
  343. package/dist/gates/node-test-command.js +91 -23
  344. package/dist/gates/node-test-command.js.map +1 -1
  345. package/dist/gates/oracle-bond-run.js +128 -0
  346. package/dist/gates/oracle-bond-run.js.map +1 -0
  347. package/dist/gates/oracle-bond.js +49 -0
  348. package/dist/gates/oracle-bond.js.map +1 -0
  349. package/dist/gates/oracle-instrumentation.js +115 -0
  350. package/dist/gates/oracle-instrumentation.js.map +1 -0
  351. package/dist/gates/oracle-mutants.js +628 -0
  352. package/dist/gates/oracle-mutants.js.map +1 -0
  353. package/dist/gates/oracle-reach.js +175 -0
  354. package/dist/gates/oracle-reach.js.map +1 -0
  355. package/dist/gates/package-scope.js +115 -0
  356. package/dist/gates/package-scope.js.map +1 -0
  357. package/dist/gates/parsers.js +3 -0
  358. package/dist/gates/parsers.js.map +1 -1
  359. package/dist/gates/prepare-dependencies.js +35 -0
  360. package/dist/gates/prepare-dependencies.js.map +1 -0
  361. package/dist/gates/prepared-python.js +92 -0
  362. package/dist/gates/prepared-python.js.map +1 -0
  363. package/dist/gates/preset-verification.js +65 -0
  364. package/dist/gates/preset-verification.js.map +1 -0
  365. package/dist/gates/project-environment.js +59 -0
  366. package/dist/gates/project-environment.js.map +1 -0
  367. package/dist/gates/project-type.js +79 -15
  368. package/dist/gates/project-type.js.map +1 -1
  369. package/dist/gates/python-gates.js +67 -0
  370. package/dist/gates/python-gates.js.map +1 -0
  371. package/dist/gates/ratchet.js +6 -1
  372. package/dist/gates/ratchet.js.map +1 -1
  373. package/dist/gates/repair-policy.js +64 -0
  374. package/dist/gates/repair-policy.js.map +1 -0
  375. package/dist/gates/resolved-path.js +21 -0
  376. package/dist/gates/resolved-path.js.map +1 -0
  377. package/dist/gates/runner-results.js +77 -0
  378. package/dist/gates/runner-results.js.map +1 -0
  379. package/dist/gates/scratch-index.js +14 -1
  380. package/dist/gates/scratch-index.js.map +1 -1
  381. package/dist/gates/structured-runner.js +37 -0
  382. package/dist/gates/structured-runner.js.map +1 -0
  383. package/dist/gates/upgrade-contract.js +81 -0
  384. package/dist/gates/upgrade-contract.js.map +1 -0
  385. package/dist/gates/upgrade-resolution.js +56 -0
  386. package/dist/gates/upgrade-resolution.js.map +1 -0
  387. package/dist/gates/v8-coverage.js +142 -0
  388. package/dist/gates/v8-coverage.js.map +1 -0
  389. package/dist/install/health.js +26 -0
  390. package/dist/install/health.js.map +1 -1
  391. package/dist/node-floor-check.js +12 -0
  392. package/dist/node-floor-check.js.map +1 -0
  393. package/dist/node-floor.js +32 -13
  394. package/dist/node-floor.js.map +1 -1
  395. package/dist/providers/ai-sdk-model-client.js +32 -2
  396. package/dist/providers/ai-sdk-model-client.js.map +1 -1
  397. package/dist/providers/registry.js +8 -4
  398. package/dist/providers/registry.js.map +1 -1
  399. package/dist/select/calibration-measures.js +17 -3
  400. package/dist/select/calibration-measures.js.map +1 -1
  401. package/dist/select/calibration-run.js +1 -1
  402. package/dist/select/calibration-run.js.map +1 -1
  403. package/dist/select/production-routing.js +66 -0
  404. package/dist/select/production-routing.js.map +1 -0
  405. package/dist/select/recommendation.js +10 -0
  406. package/dist/select/recommendation.js.map +1 -1
  407. package/dist/select/routing-candidates.js +29 -0
  408. package/dist/select/routing-candidates.js.map +1 -0
  409. package/dist/select/routing-mode.js +10 -5
  410. package/dist/select/routing-mode.js.map +1 -1
  411. package/dist/select/served-pick.js +36 -0
  412. package/dist/select/served-pick.js.map +1 -0
  413. package/dist/select/task-cost.js +10 -3
  414. package/dist/select/task-cost.js.map +1 -1
  415. package/dist/select/ucb.js +4 -3
  416. package/dist/select/ucb.js.map +1 -1
  417. package/dist/swarm-verify.js +51 -0
  418. package/dist/swarm-verify.js.map +1 -0
  419. package/dist/task-brief.js +20 -0
  420. package/dist/task-brief.js.map +1 -0
  421. package/dist/tools/bounded-file.js +66 -0
  422. package/dist/tools/bounded-file.js.map +1 -0
  423. package/dist/tools/chokepoint-record.js +16 -2
  424. package/dist/tools/chokepoint-record.js.map +1 -1
  425. package/dist/tools/chokepoint.js +45 -3
  426. package/dist/tools/chokepoint.js.map +1 -1
  427. package/dist/tools/claim-reference-tool.js +17 -0
  428. package/dist/tools/claim-reference-tool.js.map +1 -0
  429. package/dist/tools/file-tools.js +18 -10
  430. package/dist/tools/file-tools.js.map +1 -1
  431. package/dist/tools/policy-guard.js +25 -2
  432. package/dist/tools/policy-guard.js.map +1 -1
  433. package/dist/tools/regex-worker.js +63 -0
  434. package/dist/tools/regex-worker.js.map +1 -0
  435. package/dist/tools/search-tool.js +57 -30
  436. package/dist/tools/search-tool.js.map +1 -1
  437. package/dist/tools/shell-command.js +47 -1
  438. package/dist/tools/shell-command.js.map +1 -1
  439. package/dist/tools/shell-tool.js +19 -5
  440. package/dist/tools/shell-tool.js.map +1 -1
  441. package/dist/tools/tool-definition.js +1 -1
  442. package/dist/tools/tool-definition.js.map +1 -1
  443. package/dist/tui/confirmation-queue.js +6 -6
  444. package/dist/tui/confirmation-queue.js.map +1 -1
  445. package/dist/tui/controller-screen-model.js +28 -0
  446. package/dist/tui/controller-screen-model.js.map +1 -0
  447. package/dist/tui/controller-screen.js +17 -0
  448. package/dist/tui/controller-screen.js.map +1 -0
  449. package/dist/tui/elapsed.js +13 -0
  450. package/dist/tui/elapsed.js.map +1 -1
  451. package/dist/tui/evidence-panel.js +72 -12
  452. package/dist/tui/evidence-panel.js.map +1 -1
  453. package/dist/tui/glyphs.js +23 -0
  454. package/dist/tui/glyphs.js.map +1 -0
  455. package/dist/tui/hyperlink.js +38 -0
  456. package/dist/tui/hyperlink.js.map +1 -0
  457. package/dist/tui/key-bindings.js +2 -0
  458. package/dist/tui/key-bindings.js.map +1 -1
  459. package/dist/tui/key-dispatcher.js +5 -2
  460. package/dist/tui/key-dispatcher.js.map +1 -1
  461. package/dist/tui/layout.js +3 -1
  462. package/dist/tui/layout.js.map +1 -1
  463. package/dist/tui/plain-lines.js +2 -0
  464. package/dist/tui/plain-lines.js.map +1 -1
  465. package/dist/tui/screen-model.js +127 -24
  466. package/dist/tui/screen-model.js.map +1 -1
  467. package/dist/tui/screen.js +5 -3
  468. package/dist/tui/screen.js.map +1 -1
  469. package/dist/tui/session-interface.js +23 -5
  470. package/dist/tui/session-interface.js.map +1 -1
  471. package/dist/tui/session-store.js +3 -3
  472. package/dist/tui/session-store.js.map +1 -1
  473. package/dist/tui/session-view.js +20 -0
  474. package/dist/tui/session-view.js.map +1 -1
  475. package/dist/workers/bootstrap-history.js +66 -0
  476. package/dist/workers/bootstrap-history.js.map +1 -0
  477. package/dist/workers/bootstrap-schema.js +48 -0
  478. package/dist/workers/bootstrap-schema.js.map +1 -0
  479. package/dist/workers/bootstrap.js +257 -0
  480. package/dist/workers/bootstrap.js.map +1 -0
  481. package/dist/workers/controller-administration.js +80 -0
  482. package/dist/workers/controller-administration.js.map +1 -0
  483. package/dist/workers/controller-cleanup.js +16 -0
  484. package/dist/workers/controller-cleanup.js.map +1 -0
  485. package/dist/workers/controller-configuration.js +94 -0
  486. package/dist/workers/controller-configuration.js.map +1 -0
  487. package/dist/workers/controller-events.js +99 -0
  488. package/dist/workers/controller-events.js.map +1 -0
  489. package/dist/workers/controller-jobs.js +225 -0
  490. package/dist/workers/controller-jobs.js.map +1 -0
  491. package/dist/workers/controller-launch.js +87 -0
  492. package/dist/workers/controller-launch.js.map +1 -0
  493. package/dist/workers/controller-owner.js +65 -0
  494. package/dist/workers/controller-owner.js.map +1 -0
  495. package/dist/workers/controller-recovery.js +344 -0
  496. package/dist/workers/controller-recovery.js.map +1 -0
  497. package/dist/workers/controller-revisions.js +171 -0
  498. package/dist/workers/controller-revisions.js.map +1 -0
  499. package/dist/workers/controller-schedule.js +18 -0
  500. package/dist/workers/controller-schedule.js.map +1 -0
  501. package/dist/workers/controller-scheduler.js +282 -0
  502. package/dist/workers/controller-scheduler.js.map +1 -0
  503. package/dist/workers/controller-scope.js +59 -0
  504. package/dist/workers/controller-scope.js.map +1 -0
  505. package/dist/workers/controller-state.js +457 -0
  506. package/dist/workers/controller-state.js.map +1 -0
  507. package/dist/workers/controller-verification.js +41 -0
  508. package/dist/workers/controller-verification.js.map +1 -0
  509. package/dist/workers/controller-view.js +136 -0
  510. package/dist/workers/controller-view.js.map +1 -0
  511. package/dist/workers/coordination.js +165 -0
  512. package/dist/workers/coordination.js.map +1 -0
  513. package/dist/workers/goal-candidates.js +92 -0
  514. package/dist/workers/goal-candidates.js.map +1 -0
  515. package/dist/workers/goal-outcome.js +102 -0
  516. package/dist/workers/goal-outcome.js.map +1 -0
  517. package/dist/workers/goal-repair.js +103 -0
  518. package/dist/workers/goal-repair.js.map +1 -0
  519. package/dist/workers/goal-selection.js +81 -0
  520. package/dist/workers/goal-selection.js.map +1 -0
  521. package/dist/workers/graph-record.js +1 -3
  522. package/dist/workers/graph-record.js.map +1 -1
  523. package/dist/workers/graph-revision.js +286 -0
  524. package/dist/workers/graph-revision.js.map +1 -0
  525. package/dist/workers/merge-queue.js +47 -6
  526. package/dist/workers/merge-queue.js.map +1 -1
  527. package/dist/workers/parallel-report.js +12 -1
  528. package/dist/workers/parallel-report.js.map +1 -1
  529. package/dist/workers/parallel-run.js +439 -201
  530. package/dist/workers/parallel-run.js.map +1 -1
  531. package/dist/workers/planner-run.js +61 -15
  532. package/dist/workers/planner-run.js.map +1 -1
  533. package/dist/workers/run-context.js +204 -0
  534. package/dist/workers/run-context.js.map +1 -0
  535. package/dist/workers/task-contract.js +15 -80
  536. package/dist/workers/task-contract.js.map +1 -1
  537. package/dist/workers/worktree.js +69 -28
  538. package/dist/workers/worktree.js.map +1 -1
  539. package/docs/README.md +5 -0
  540. package/docs/build-guide.md +49 -10
  541. package/docs/claims.md +20 -0
  542. package/docs/security-coverage.md +40 -0
  543. package/package.json +11 -5
package/README.md CHANGED
@@ -1,554 +1,247 @@
1
- # swarm-orchestrator
1
+ <a id="readme-top"></a>
2
2
 
3
- [![gates](https://img.shields.io/github/actions/workflow/status/moonrunnerkc/swarm-orchestrator/gates.yml?branch=v13-main&style=flat-square&label=gates)](https://github.com/moonrunnerkc/swarm-orchestrator/actions/workflows/gates.yml)
4
- [![nightly proof](https://img.shields.io/github/actions/workflow/status/moonrunnerkc/swarm-orchestrator/nightly-proof.yml?branch=v13-main&style=flat-square&label=nightly%20proof)](https://github.com/moonrunnerkc/swarm-orchestrator/actions/workflows/nightly-proof.yml)
5
- [![weekly evidence](https://img.shields.io/github/actions/workflow/status/moonrunnerkc/swarm-orchestrator/weekly-evidence.yml?branch=v13-main&style=flat-square&label=weekly%20evidence)](https://github.com/moonrunnerkc/swarm-orchestrator/actions/workflows/weekly-evidence.yml)
6
- [![npm](https://img.shields.io/npm/v/swarm-orchestrator?style=flat-square&label=npm)](https://www.npmjs.com/package/swarm-orchestrator)
7
- [![node](https://img.shields.io/badge/node-%3E%3D24-blue?style=flat-square)](package.json)
8
- [![license](https://img.shields.io/github/license/moonrunnerkc/swarm-orchestrator?style=flat-square)](LICENSE)
3
+ <div align="center">
9
4
 
10
- A proof-carrying runner and verifier for bounded code changes.
5
+ <h1>swarm-orchestrator</h1>
11
6
 
12
- Give it a task and a git repository and it will make the change. Give it somebody else's patch
13
- and it will tell you what that patch actually establishes. Either way what comes back is a
14
- signed, hash-chained record of what ran, what passed, and what nobody measured, which anybody
15
- can check without installing this tool.
7
+ <p><strong>A coding agent for the terminal that leaves a signed, offline-checkable record of what it ran and what passed.</strong></p>
16
8
 
17
- The model can say whatever it likes. It cannot make a gate pass, it cannot mark a claim
18
- verified, and it cannot change a record after the fact.
9
+ <p>
10
+ The model can say whatever it likes.<br />
11
+ It cannot make a check pass, mark a claim verified, or change a record after the fact.
12
+ </p>
19
13
 
20
- [What it does](#what-it-does) | [Install](#install) | [Use](#use) | [Verifying somebody else's work](#verifying-somebody-elses-work) | [What a run reports](#what-a-run-reports) | [Several workers](#several-workers-at-once) | [Watching it work](#watching-it-work) | [What is claimed](#what-is-claimed) | [What is not claimed](#what-is-not-claimed) | [How it works](#how-it-works) | [Limits](#limits) | [Upgrading from v12](#upgrading-from-v12)
14
+ <p>
15
+ <a href="docs/README.md"><strong>Explore the docs »</strong></a>
16
+ ·
17
+ <a href="docs/evidence/2026-08-18/live-tasks.md">See a real run</a>
18
+ ·
19
+ <a href="https://github.com/moonrunnerkc/swarm-orchestrator/issues/new?labels=bug">Report a bug</a>
20
+ </p>
21
21
 
22
- ## What it does
22
+ [![gates](https://img.shields.io/github/actions/workflow/status/moonrunnerkc/swarm-orchestrator/gates.yml?branch=v13-main&style=for-the-badge&label=gates)](https://github.com/moonrunnerkc/swarm-orchestrator/actions/workflows/gates.yml)
23
+ [![npm](https://img.shields.io/npm/v/swarm-orchestrator?style=for-the-badge&label=npm&color=CB3837)](https://www.npmjs.com/package/swarm-orchestrator)
24
+ [![node](https://img.shields.io/badge/node-%E2%89%A522-5FA04E?style=for-the-badge)](package.json)
25
+ [![license](https://img.shields.io/badge/license-ISC-blue?style=for-the-badge)](LICENSE)
23
26
 
24
- Three jobs, and the second and third do not need this tool's own agent.
27
+ </div>
25
28
 
26
- **Make a bounded change.** Give it a task and a git workspace. It plans, declares the files it
27
- intends to touch, edits through a chokepoint that records every tool call, runs your gates, and
28
- retries failures under a numeric ratchet that refuses a fix which trades away tests, assertions
29
- or coverage. Then it exports the evidence.
29
+ ---
30
30
 
31
- **Verify a patch anybody produced.** `swarm ci --patch <file>` clones the base commit somewhere
32
- the producing tree cannot reach, applies the patch there, and runs the checks in that checkout.
33
- Nothing the producer said travels except the patch. It reads another agent's own event stream
34
- beside it if you have one.
31
+ ## What it is
35
32
 
36
- **Say what a result does and does not establish.** A run reports nine separate answers rather
37
- than a boolean, and `unmeasured` is one of the values. "Nobody checked" and "checked and
38
- failed" are different findings that call for different things, and flattening them is how a
39
- change nothing executed comes to read green.
33
+ `swarm` takes a task and a git repository, makes a bounded change, runs your project's checks
34
+ over it, and writes a record of every command it ran and every check that passed or failed.
35
+ The record is a hash-chained ledger, exported as a signed bundle that carries its own
36
+ dependency-free verifier, so anyone can check it later with nothing but Node and without
37
+ trusting the machine that produced it.
40
38
 
41
- Here is a real run, committed: [`live-tasks.md`](docs/evidence/2026-08-18/live-tasks.md),
42
- with its bundle in [`live-frontier/`](docs/evidence/2026-08-18/live-frontier). And here is the
43
- packaged tool doing it, installed from a tarball into a directory holding nothing else, against
44
- a workspace it had never seen, recorded in a real terminal:
45
- [`installed-package-run.md`](docs/evidence/2026-08-23/installed-package-run.md).
39
+ It is for two kinds of people. Engineers who want an agent to make a change and want to review
40
+ what it did from evidence rather than from the agent's own summary. And reviewers who are handed
41
+ somebody else's patch or bundle and need to check it without installing the agent or believing
42
+ its author.
46
43
 
47
- ## Install
48
-
49
- npm install -g swarm-orchestrator
50
-
51
- That is **14.0.2**, and it leaves `swarm` on your path.
52
-
53
- Installing from a tag works too, but only into a project rather than globally:
54
-
55
- npm install github:moonrunnerkc/swarm-orchestrator#v14.0.2
56
-
57
- `dist/` is not committed, so a git ref builds itself on install and needs this package's
58
- devDependencies to do it. npm does not install those when a git ref is installed with `-g`: it
59
- carries the global context into its git-dependency preparation, places the clone as a root
60
- package, and runs the build without the compiler. The published package needs no build, which
61
- is why the line above it is the one to use.
62
-
63
- Anything below 13 is a different program. This package name carried a pull-request auditor
64
- through 12.x, and `npm install -g swarm-orchestrator@12` still installs it, so pin the major if
65
- you depend on one or the other: [Upgrading from v12](#upgrading-from-v12).
66
-
67
- If `swarm` turns out to be an older version than you installed, something else owns the command.
68
- The usual cause is a development checkout linked into the global prefix with `npm link`, which
69
- owns it until it is removed and which npm cannot install over: the install either fails renaming
70
- a symlinked directory aside, or succeeds behind a stale executable still pointing at the
71
- checkout. `swarm doctor` says which of those happened and `swarm doctor --fix` repairs it.
72
-
73
- Node 24 or newer. That is a runtime floor rather than a preference: the coverage cycle
74
- spawns the test runner with `--test-isolation=process`, which Node 22 rejects as a bad
75
- option, so on anything older that measurement does not happen.
76
-
77
- ## Use
78
-
79
- swarm "make slugify collapse whitespace and strip punctuation"
80
-
81
- swarm # a session: type tasks, one after another
82
- swarm doctor # what owns the swarm command, and --fix to repair it
83
- swarm init # write swarm.toml from package.json's scripts
84
- swarm gates # run the gates over a workspace, no model
85
- --allowed-files <a,b> # the scope you authorise, for the file-set check
86
- swarm select # probe this machine, recommend a local model
87
- swarm calibrate # measure candidate models on the golden set
88
- swarm routing # what the reward log adds up to
89
- swarm parallel --tasks <file> # a worker per task, then a merge queue
90
- swarm parallel --goal <text> # break the goal into tasks, then run them
91
- --redundancy <n> # try each task n ways, land the best of them
92
- --concurrency <n> # how many workers may hold a worktree at once
93
-
94
- swarm ci --patch <file> # verify a patch in a fresh checkout of the base
95
- --immutable <a,b> # paths the patch may not touch
96
- --agent-stream <file> # another agent's event stream, read beside it
97
- --agent-format claude-code # or generic
98
- swarm verify <bundle> # check a bundle, and who signed it
99
- --signer <fingerprint> # the identity you expect, from outside the bundle
100
- swarm review <bundle> # what a past run produced, and open it
101
- swarm replay <bundle> # read a bundle back
102
-
103
- swarm list-runs # runs this machine has state for
104
- swarm inspect <run-id> # what a run did, and what it still owes
105
- swarm resume <run-id> # take up a run that was interrupted
106
- swarm retry-step <run-id> <step> # run one step again
107
- swarm abort <run-id> # stop a run and refuse it new work
108
- swarm repair <run-id> # release what a dead run left held
109
- swarm gc [--older-than 30d] # what stored evidence would be removed, --remove to do it
110
-
111
- swarm --isolation docker "..." # run commands behind a kernel-enforced boundary
112
- swarm --json "..." # line-delimited JSON: one line per event, one result
113
- swarm --no-tui "..." # plain lines even on a terminal
114
- swarm --no-color "..." # no colour, whatever the terminal says
115
- swarm --open-evidence "..." # open the review page when it finishes
116
- swarm --model local:<id> "..." # a specific model
117
- swarm --workspace <dir> "..." # a repository other than the current directory
118
- swarm --base <ref> "..." # what the diff and the ratchet measure against
119
- swarm --attempts <n> "..." # how many times the ratchet may retry a gate
120
- swarm --max-steps <n> "..." # how long the loop may run before it stops
121
- swarm --max-wall-minutes <n> "..." # the whole run's clock: the loop and every retry together
122
- swarm --local-endpoint <url> # an OpenAI-compatible server other than the default
123
-
124
- `swarm --help` prints all of it, including the calibration flags.
125
-
126
- Set `ANTHROPIC_API_KEY`, `OPENAI_API_KEY` or `GOOGLE_GENERATIVE_AI_API_KEY` for a frontier
127
- model, or start Ollama or rapid-mlx and pass `--model local:<id>`. With no model named, the
128
- router picks one from what the calibration measured on this machine, and `swarm routing` shows
129
- what it has learned. Keys come from the environment or your OS keychain and have no
130
- `swarm.toml` setting: that file is committed and cloned, so a key in it has already been shared
131
- with everyone holding the repository, and a file naming one is refused with rotation guidance.
132
-
133
- Settings live in one optional `swarm.toml`: providers and endpoints, gate definitions, budgets,
134
- model pins, and the `[interface]`, `[theme]` and `[keys]` tables. Flags win over the file.
135
-
136
- Two of those are worth knowing about before you need them.
137
-
138
- [providers]
139
- local_thinking = false # the model behind the local endpoint answers without reasoning first
140
-
141
- [interface]
142
- confirm_timeout_minutes = 30 # an unanswered confirmation refuses itself; 0 waits for ever
143
-
144
- `local_thinking` matters on a reasoning model served locally. Left unset, nothing is sent and
145
- the server's own default stands, which is the only safe default: the field is a vendor
146
- extension and a server that rejects what it does not recognise would fail every call rather
147
- than one. Set it, and a model that would otherwise spend its whole output budget thinking
148
- answers instead. Against rapid-mlx serving qwen3.8:27b, one request cost 37 completion tokens
149
- with reasoning on and 2 with it off. Ollama's OpenAI-compatible route ignores the field; that
150
- is the server's limit rather than this one's.
151
-
152
- `confirm_timeout_minutes` is why a run left alone no longer waits for ever. The chokepoint asks
153
- before it runs a command that is not on the allowlist, and a question nobody answers used to
154
- hold the run until somebody came back to it. Refusing is what a declined question records
155
- either way, so the deadline costs that one tool call and the run carries on.
156
-
157
- ## Verifying somebody else's work
158
-
159
- Every gate a run executes runs in the workspace that run was editing, with the tests that run
160
- may have changed, reading reports that run's own processes wrote. The sealed criteria and the
161
- ratchet close most of that. What they cannot close is the shape of it: a subject grading its
162
- own paper.
163
-
164
- `swarm ci` is the separate opinion.
165
-
166
- swarm ci --patch candidate.diff --install --oracle "npx jest tests/the-task.test.ts"
167
-
168
- It clones the base commit into a fresh checkout, applies the patch there, and runs the checks in
169
- that checkout, with the gates assembled from the base commit's manifests rather than the patched
170
- tree's, so a patch that rewrites the test script does not get to choose the instrument that
171
- measures it. A patch touching a path you declared immutable is refused before anything runs. A
172
- patch that will not apply reports that no check happened rather than passing on an unchanged
173
- tree.
174
-
175
- **It reports two answers, not one, and the second is the one a suite cannot give you.**
176
-
177
- regression: pass task: unjudged
178
-
179
- `regression` is whether the repository's own suite still passes: it says nothing broke. `task` is
180
- whether the work was actually done, and only an oracle can say that, because a suite tests the
181
- behaviour a project already had and a task adds behaviour it did not. A patch that adds a
182
- feature badly still passes a suite written before the feature existed. Measured: four of
183
- eighteen real-repository patches passed their project's whole suite and failed a hidden
184
- acceptance test, which is a 22% false-green rate until the two answers were separated.
185
- `--oracle <command>` supplies the second; without it the task is `unjudged` and nothing is
186
- verified, which is the honest answer rather than a pass by omission.
187
-
188
- `--install` installs the fresh checkout's dependencies from its lockfile, with install scripts
189
- off. It is not the default, because installing runs whatever the registry serves. Without it a
190
- real project has no test runner in the checkout and every check stands down, which is reported
191
- as `not measured` rather than as a refusal: those are different findings.
192
-
193
- It does not need this tool's agent to have produced the patch. Pass `--agent-stream` with
194
- `--agent-format claude-code` or `generic` and another agent's own event stream is read beside
195
- it; a line the adapter does not recognise refuses the whole stream by line number rather than
196
- being skipped, because a skipped line is evidence that quietly went unread.
197
-
198
- ## What a run reports
199
-
200
- Nine answers, not one:
201
-
202
- ```
203
- verdict:
204
- integrity valid
205
- signer untrusted
206
- no expected signer was matched, so the signature shows the bundle is
207
- unchanged since it was written and not who wrote it
208
- executionTrust restricted
209
- commands ran under a lexical path and program policy, which is not containment
210
- policy pass
211
- mechanical pass
212
- lint passed
213
- behavioral unmeasured
214
- no dynamic gate ran, so nothing executed the change (tests stood down)
215
- semantic unmeasured
216
- task unjudged
217
- humanApproval not-required
218
-
219
- acceptable: no
220
- ```
221
-
222
- `unmeasured` is a value, not a missing one. A change whose only passing gate was a linter is
223
- not a change anything ran: linting proves the source parses and establishes nothing about
224
- whether any of it was executed. `semantic` abstains by construction, because judging whether a
225
- change means what the task asked for is a judgement about meaning and nothing here is allowed
226
- to make one.
227
-
228
- `--json` gives the same thing as one line of JSON per event and one result at the end, each
229
- naming its schema. Exit codes are a taxonomy rather than zero-or-not: acceptable, not
230
- acceptable, invalid request, cancelled, unavailable, internal error.
44
+ **Upgrading from 12.x?** That was a pull-request auditor; 13 and later are a coding agent under
45
+ the same package name, with no migration path. Stay on the `v12-final` tag, or pin the major.
231
46
 
232
- ## Running behind a boundary
47
+ ## Source upgrade workflows
233
48
 
234
- `--isolation docker` runs every shell command, every gate command and every worker inside a
235
- container with only the workspace mounted, a read-only image filesystem, no network, no
236
- capabilities and bounded memory and process count. The default is the host, because turning
237
- containment on is a decision somebody makes rather than one that happens to them.
49
+ The [broad-use source guide](docs/broad-use.md) covers model-free patch, branch and PR verification;
50
+ Node/Python initialization and selected packages; CLI, local HTTP and optional Playwright checks;
51
+ one explicit escalation; and bugfix, refactor and dependency-upgrade presets. The full and
52
+ standalone CLIs share the verifier. [Delivery evidence](docs/upgrade-completion.md) distinguishes
53
+ implemented source, exact-source validation and remote delivery. These additions are not an
54
+ npm publication; use the documented source tarball installation until a release is verified.
238
55
 
239
- The difference is the layer under the policy guard. `cat $(echo /host/secret)` names no path for
240
- any reader to rule on, which is exactly the case the build guide lists as a residual: on the
241
- host it reads the file, and behind the backend it does not.
56
+ Browser acceptance requires a sealed `instrument` and an immutable Playwright container runtime.
57
+ Project `argv` reports remain unjudged. Unavailable package checks remain visible; missing
58
+ required checks prevent complete verification. See the linked broad-use guide for migration.
242
59
 
243
- A run that is interrupted leaves state you can act on: `swarm list-runs`, `swarm inspect`,
244
- `swarm resume`, `swarm retry-step`, `swarm abort`, `swarm repair`. Intent is written before
245
- every effect, so a crash between the two is visible rather than invisible, and idempotency is
246
- keyed on the work rather than a clock, so resuming does not repeat an effect that already
247
- committed.
248
-
249
- ## A session, or a single task
250
-
251
- Run `swarm` with no task and it opens a session: one process, one ledger, and tasks typed one
252
- after another, each continuing the conversation the last one left.
253
-
254
- ```
255
- › create calculator.js exporting add and multiply, and calculator.test.js covering both
256
- 8 gate(s) passed, 8 step(s)
60
+ ## Install
257
61
 
258
- › add a divide function that throws on division by zero, and cover both cases
62
+ ```sh
63
+ npm install -g swarm-orchestrator
259
64
  ```
260
65
 
261
- Each turn is measured on its own. A turn ends by recording where it left the tree, so the next
262
- one's gates see that turn's changes and not the ones before it. Three turns of this, with the
263
- bundle verified from outside and the page it produced, are in
264
- [`session.md`](docs/evidence/2026-08-24/session.md).
265
-
266
- `swarm "task"` still runs one task and exits, exactly as before.
267
-
268
- ## Several workers at once
66
+ That is **14.1.0**. It runs on Node 22 or newer. Node 24 or newer is recommended, because the
67
+ changed-line coverage measurement spawns node's test runner with `--test-isolation=process`,
68
+ which Node 22 rejects; below 24 that one measurement reports unmeasured and never counts as a
69
+ pass. `swarm doctor` says which Node it found and what owns the `swarm` command, and `--fix`
70
+ repairs an install that an older build is shadowing.
269
71
 
270
- `swarm parallel` gives each task a git worktree of its own and a merge queue that lands them
271
- one at a time under the same ratchet a single run answers to. Nothing is merged into the
272
- branch you are sitting on; the result waits on an integration branch and the report tells you
273
- how to take it.
72
+ ## Try it
274
73
 
275
- Three things sit on top of that, each optional and each off unless asked for.
276
-
277
- **Workers read each other's ledgers.** They coordinate through the record they were already
278
- writing, not through a bus or a daemon: which files a peer has declared, which gates have
279
- failed on it and how often, which approaches it has already spent its attempts on. Nothing a
280
- worker reads there can render green. Every signal comes from a ledger record rather than from
281
- model text, every line names the peer it is about, and no signal reports a success, so there
282
- is nothing in it to mistake for a gate result.
283
-
284
- **`--redundancy <n>` tries each task several ways and lands the best of them.** The winner is
285
- chosen by reading which attempt moved the measured numbers, never by asking a model which
286
- answer it likes. The whole ranking goes on the chain, losers and the reason each was left out
287
- included, so you re-read the choice instead of taking it.
288
-
289
- **`--goal <text>` breaks the goal into tasks itself.** A planner reads the workspace with
290
- read-only tools and declares a task graph, which is checked for unique ids, resolving
291
- dependencies, no cycle, and files that two unordered tasks do not share, and recorded before
292
- the first worker starts. Nodes land layer by layer.
293
-
294
- Two runs of this, committed with their bundles, are in
295
- [`swarm.md`](docs/evidence/2026-08-24/swarm.md). The second one is the more useful: every
296
- structural check passed on a decomposition that could not work, because the planner left out
297
- a dependency. Whether a set of tasks adds up to a goal is a judgement about meaning, and this
298
- tool makes none.
299
-
300
- ## Watching it work
74
+ ```sh
75
+ export ANTHROPIC_API_KEY=... # or OPENAI_API_KEY, GOOGLE_GENERATIVE_AI_API_KEY,
76
+ # or start Ollama and pass --model local:<id>
77
+ cd your-repository
78
+ swarm "make slugify collapse whitespace and strip punctuation"
79
+ ```
301
80
 
302
- On a terminal, a run draws a single screen you can drive. Off one, it writes the same plain
303
- lines it always did, so pipes and CI are unchanged.
81
+ Keys come from the environment or your OS keychain, never from `swarm.toml`: that file is
82
+ committed and cloned, so a key in it has already been shared with everyone holding the
83
+ repository. Every command and flag is in [docs/cli.md](docs/cli.md).
84
+
85
+ <p align="right">(<a href="#readme-top">back to top</a>)</p>
86
+
87
+ ## How it verifies
88
+
89
+ Every tool call and every check goes through one recording chokepoint, and the record is an
90
+ append-only, hash-chained ledger that lives outside the workspace. When a run ends it is
91
+ exported as a signed bundle carrying a dependency-free verifier, so the bundle can be checked
92
+ anywhere with plain Node.
93
+
94
+ Five words carry most of the weight. A **gate** is a check declared as data: a command, a
95
+ parser, and whether it blocks. The **ratchet** is the rule that a retry may not trade away
96
+ tests, assertions or coverage to turn a gate green. A **bond** is one file a passing gate is
97
+ handed that it must refuse, so a pass that cannot fail is caught. An **oracle** is the check
98
+ you supply that says the task was done, as distinct from nothing broke. **Reach** is whether
99
+ that oracle executed the lines a patch added. And **unmeasured** is a verdict of its own:
100
+ nobody checked is not the same as checked and passed, and it never renders green.
101
+
102
+ The mechanics, the nine-answer report and worked examples are in
103
+ [docs/verifying.md](docs/verifying.md). Retries under the ratchet, sessions and several workers
104
+ at once are in [docs/using.md](docs/using.md).
105
+
106
+ ## Use it without a model
107
+
108
+ Three commands need no model, no API key and no local backend. `swarm gates` measures a
109
+ workspace, `swarm ci --patch <file>` verifies a patch in a fresh checkout of its base, and
110
+ `swarm verify <bundle>` checks a bundle and who signed it. They also ship on their own as the
111
+ `swarm-verify` package under [packages/swarm-verify](packages/swarm-verify), the same code with
112
+ none of the agent. The walkthrough, over the committed tamper demo, and the install for the
113
+ standalone package are in [docs/verify-only.md](docs/verify-only.md).
114
+
115
+ <p align="right">(<a href="#readme-top">back to top</a>)</p>
116
+
117
+ ## Measured
118
+
119
+ Every number here links to the committed artifact of the thing happening. The full table, and
120
+ the list of things that may not be said, is [docs/claims.md](docs/claims.md).
121
+
122
+ - **One changed byte breaks verification.** The same bundle verified and then tampered with in
123
+ a single byte, exit 0 and exit 1 side by side, with a script to reproduce it:
124
+ [tamper demo](docs/evidence/2026-08-18/tamper-demo).
125
+ - **A bundle verifies on a machine that has never seen this repository.** Run in a `node:24`
126
+ container with no network and no mount of this repository:
127
+ [clean-container-verification.md](docs/evidence/2026-08-23/clean-container-verification.md).
128
+ - **A green verdict is computed by the harness, and the model cannot produce one.** In a real
129
+ run the model asserted a predicate the language does not parse; the harness rendered it
130
+ `UNVERIFIED` and carried on, twice: [shakedown results](docs/evidence/2026-08-18/shakedown/results.md).
131
+ - **A suite passing is not the task being done.** Four of eighteen real-repository patches
132
+ passed their project's whole suite and failed a hidden acceptance test, which is why `swarm ci`
133
+ reports `regression` and `task` as two answers: [docs/verifying.md](docs/verifying.md).
134
+ - **The oracle is judged too.** Certified tasks turned out to rest on oracles that could not
135
+ fail. The last false green standing, `commander#1671`, was certified by an oracle that runs
136
+ every line the patch adds and never tests the precedence those lines decide; it is refused now
137
+ because that oracle accepted a change to a line it had run:
138
+ [docs/verifying.md](docs/verifying.md#the-oracle-is-judged-too).
139
+ - **The September 6 mined-corpus false-green rate was 0 in 15**, 0.0%, 95% CI [0.0, 20.4], with
140
+ two oracles per task, one handed to the tool and one held back:
141
+ [mined-corpus](docs/evidence/2026-09-06/mined-corpus/README.md). The denominator moved when
142
+ the tool did: four patches both oracles accept are refused because the tool's own oracle never
143
+ ran part of what they changed, five because the sealed half rejects work the held-back half
144
+ accepts, and one because its oracle accepted a change to a line it had run.
145
+ - **Twelve tasks reported as unjudgeable were the agent having written nothing at all**, which
146
+ is a model failure and is recorded as one. An earlier 0-of-18 was withdrawn rather than
147
+ corrected quietly: the same test was handed to the tool and then used as the ground truth it
148
+ was scored against, so it agreed with itself:
149
+ [false-green-measurement.md](docs/evidence/2026-09-05/false-green-measurement.md).
150
+ - **Of the gates this project agreed not to call itself production-ready without**, the
151
+ historical assessment records eight passing, two partial, two unproven, and two reported
152
+ rather than barred: [docs/beta-gates.md](docs/beta-gates.md).
153
+
154
+ <p align="right">(<a href="#readme-top">back to top</a>)</p>
304
155
 
305
- ```
306
- swarm make the parser trim before it splits
307
- local:qwen3-coder:30b-a3b /Users/brad/projects/scratch-repo 20s step 4 5812 tokens attempt 1/3
308
- plan
309
- read the failing test, fix the parser, run the gates
310
- actions
311
- edit path=src/parse.ts find=text.split replace=text.trim().split
312
- shell command=npm test
313
- shell failed: 1 failing
314
- ratchet accepted: tests collected 12 to 12, assertions 34 to 35, skips 0 to 0
315
- gates attempt 1/3
316
- PASS tests: 12 collected, 0 failed
317
- PASS lint: no findings in 208 files
318
- N/A coverage: no lcov artifact was written to the path the harness named
319
- WARN diff-budget (advisory): 1 file changed, 1 line added, budget 12 files and 400 lines
320
- DONE stopped: completed (4 steps, 5812 tokens)
321
- j scroll enter expand tab pane / filter e evidence ? help q detach ctrl+c cancel run
322
- ```
156
+ ## What is not claimed
323
157
 
324
- While it works there is a line that says so: a spinner that turns, what is happening, how long
325
- it has been happening, and, while the model is talking, the tail of what it is saying.
158
+ The five that matter most. The full list is in
159
+ [docs/verifying.md](docs/verifying.md#what-is-not-claimed).
160
+
161
+ - **It is not production-ready.** The counts above describe the linked campaigns, not a fresh
162
+ measurement of every gate on this checkout. Each row and what would settle it:
163
+ [docs/beta-gates.md](docs/beta-gates.md).
164
+ - **Not "fully secure".** The secret detector does known-pattern scrubbing, not secret removal.
165
+ Zero crashes at a fuzz budget is evidence, not proof.
166
+ - **The default execution mode is `restricted`, not `isolated`.** A lexical path and program
167
+ policy in front of interpreters unless you pass `--isolation`. Reported before the run starts
168
+ and recorded on the chain rather than quietly assumed, but it is not containment.
169
+ - **0 in 15 says "under 20%", not "zero".** That upper bound is the honest half of the rate,
170
+ and it is a rate for that corpus and that build, not for this one.
171
+ - **Shown its oracle, a model still gets past this.** A patch written to satisfy a visible test
172
+ has its added lines tested by that test, so the oracle refuses every mutant of them and is
173
+ right to. Bonding asks whether the oracle judged what the patch added. It cannot ask what the
174
+ patch left out, and that is what an adversarial patch does.
175
+
176
+ Gates prove mechanical quality, not design quality. What a bundle buys you is that reviewing the
177
+ change is fast and its claims are checkable, not that review is unnecessary.
178
+
179
+ <p align="right">(<a href="#readme-top">back to top</a>)</p>
180
+
181
+ ## Roadmap
182
+
183
+ The implementation is ahead of the evidence needed to call this production-ready. The audit
184
+ repairs are recorded in [the implementation record](docs/audit-implementation-2026-09-11.md);
185
+ the local campaign and every excluded case are in
186
+ [the September 11 report](docs/evidence/2026-09-11/local-campaign/report.md).
187
+
188
+ - [x] Connect verification, displayed acceptance, cancellation, budgets and recovery to the
189
+ records that establish them. Use standard DSSE signing bytes and literal replacement text.
190
+ - [x] Build the campaign machinery: separate case author, checker and solver models; admission
191
+ controls before grading; frozen schedules; actual baseline dispatch; every failed launch
192
+ retained; raw evidence that can be checked from the checkout.
193
+ - [x] Run the available Docker security and cleanup matrix. Fourteen declared observations
194
+ passed, with working attack controls and a separate check that ordinary work still runs.
195
+ Repair after abrupt harness death was exercised too.
196
+ - [ ] A false-green interval that supports a population claim. The historical 0 in 15 has a
197
+ 20.4% upper bound. The new synthetic pilot admits one evaluation case and cannot narrow
198
+ that bound for real work. Freeze an independent population and a sufficient sample first.
199
+ - [ ] A denominator the tool did not choose. The new admission pass checks references and
200
+ predetermined counterexamples, but model authorship alone does not establish independence
201
+ or complete requirements. Independent admission and review are still needed.
202
+ - [ ] An adversarial verification corpus that covers omitted requirements. Separate local
203
+ models supplied fresh checks and attacks. Mutation of added lines still cannot establish
204
+ that a patch implemented something it left out; the report keeps those outcomes visible.
205
+ - [ ] Task success non-inferior to the strongest alternative. The two local baseline arms now
206
+ execute, with matched tasks and budgets. This pilot is too small to establish which tool
207
+ is strongest or to support a non-inferiority claim.
208
+ - [ ] Security evidence for every supported backend. Docker was measured here; Podman and
209
+ nerdctl were unavailable. Independent attacks and those runtime matrices remain open.
210
+ - [ ] No surviving daemons across the supported runtime boundaries. Docker cleanup passed the
211
+ declared lifecycle cases. Restricted host execution still cannot own a descendant that
212
+ leaves its process group; abrupt harness death requires supervision or later repair.
213
+ - [ ] A new user productive in under ten minutes. The fixture and observer procedure are ready.
214
+ No new users were observed, so setup checks cannot close this item.
215
+
216
+ Each broader claim stays open until its own evidence meets the bar in
217
+ [docs/beta-gates.md](docs/beta-gates.md).
218
+
219
+ <p align="right">(<a href="#readme-top">back to top</a>)</p>
220
+
221
+ ## Contributing
222
+
223
+ The bar is the one the tool applies to itself: `npm run gates` green with the output shown, new
224
+ behaviour covered by a test that failed first, and no claim in a document that its linked artifact
225
+ does not establish.
226
+
227
+ 1. Fork the project
228
+ 2. Create a branch (`git checkout -b feature/amazing-feature`)
229
+ 3. Run `npm run gates` and paste the real output in the pull request
230
+ 4. Commit (`git commit -m 'Add an amazing feature'`)
231
+ 5. Push (`git push origin feature/amazing-feature`)
232
+ 6. Open a pull request
233
+
234
+ New dependencies need a one-line justification; the standard library is preferred.
235
+ [docs/build-guide.md](docs/build-guide.md) is worth reading before structural work.
326
236
 
327
- ```
328
- ⠙ thinking, step 2 5s I don't see calculator.js in the root directory
329
- ⠹ shell npm test 12s
330
- ```
237
+ ## License
331
238
 
332
- One line, deliberately. The whole response lands in the action stream when it arrives and in the
333
- ledger for ever, and repeating it as it streams would be the same text three times. A tool that
334
- finishes inside a frame never draws one.
335
-
336
- `?` lists every key. `enter` expands a row to its whole payload and the ledger record it came
337
- from. `q` leaves the view: the screen comes down and the run keeps going, reporting the plain
338
- lines it writes off a terminal. `ctrl+c` cancels the run. There is no progress bar, because an
339
- agent run has no denominator.
340
-
341
- When the run ends, the screen lists what it produced, says how many claims the harness
342
- verified and how many it refused, and offers to open the review page. It says the bundle
343
- verified only if the bundle's own verifier ran here and exited 0. `swarm review <bundle>`
344
- shows the same panel for any bundle already on disk.
345
-
346
- The keymap, the `swarm.toml` surface, the degradation matrix, and a recording of a session
347
- are in [`interface.md`](docs/evidence/2026-08-23/interface.md), with the frames in
348
- [`interface-frames.txt`](docs/evidence/2026-08-23/interface-frames.txt) and a playable
349
- asciinema capture in [`interface.cast`](docs/evidence/2026-08-23/interface.cast).
350
-
351
- ## What is claimed
352
-
353
- Every line here links to a committed artifact of the thing happening. The full table,
354
- including what backs each one, is [`docs/claims.md`](docs/claims.md).
355
-
356
- **A green verdict is computed by the harness, and the model cannot produce one.** In a real
357
- run, the model asserted a predicate the language does not parse. The harness rendered it
358
- `UNVERIFIED (predicate-unparseable)` and carried on, twice, until the model wrote one that
359
- could be evaluated:
360
- [shakedown results](docs/evidence/2026-08-18/shakedown/results.md).
361
-
362
- **One changed byte breaks verification.** The same bundle, verified and then tampered with
363
- in a single byte of one record, exit 0 and exit 1 side by side, with a script to reproduce
364
- it: [tamper demo](docs/evidence/2026-08-18/tamper-demo).
365
-
366
- **The bundle carries its own verifier, and it works on a machine that has never seen this
367
- repo.** `node verify.mjs <bundle>` checks the manifest, the chain, the signature, every blob
368
- against its content address, and recomputes every claim verdict. Run in a `node:24` container
369
- with no network and no mount of this repository: exit 0 on the committed bundle, exit 1 on the
370
- same bundle one byte later, with the image digest and both transcripts in
371
- [`clean-container-verification.md`](docs/evidence/2026-08-23/clean-container-verification.md).
372
- Transcripts from two earlier runs outside the repository:
373
- [`live-tasks.md`](docs/evidence/2026-08-18/live-tasks.md). Beside the verifier, every bundle
374
- now carries `rederive.mjs`, which recomputes every gate status from the recorded exit code and
375
- output under the rule the record names, every ratchet decision from its recorded measures,
376
- every bond verdict and every claim, and names what it cannot re-derive rather than agreeing
377
- with it: [`gates-bonded/`](docs/evidence/2026-09-02/gates-bonded) is a run with nine gates
378
- sealed, four bonds held, and all seventeen verdicts re-derived.
379
-
380
- **A signature is checked against an identity from outside the bundle.** A bundle carries the
381
- public key its own signature verifies against, so checking it against itself can only say
382
- "unchanged since written". Anyone can edit a bundle, rehash it, sign it with a key of their own
383
- and ship that key in the manifest. `swarm verify <bundle> --signer <fingerprint>` is the check
384
- that catches it: named and matching is trusted, named and not matching is untrusted with both
385
- fingerprints in the message, no signer named is untrusted rather than trusted, and an ephemeral
386
- key is never trusted whatever the policy says because the run generated it for itself. Beside
387
- the bundle signature every run now writes a DSSE envelope binding the patch, the spec digest,
388
- the source commit, the chain head and the verdict under one signature, so a diff and a bundle
389
- can be shown to be about each other.
390
-
391
- **Bundles are signed from the OS keychain**, not from a key in the workspace. Both manifests
392
- in [`live-tasks.md`](docs/evidence/2026-08-18/live-tasks.md) say `"keySource": "keychain"` and
393
- both verifiers confirm it. Where the keychain holds no usable key the run signs with a per-run
394
- key and says which of the three keychain failures happened, rather than signing quietly with
395
- something else; the manifest then records `keySource: ephemeral`, which is what the bundles in
396
- [`installed-package-run.md`](docs/evidence/2026-08-23/installed-package-run.md) carry.
397
-
398
- **Local model choice is measured on your machine.** The probe output and recommendation from
399
- real hardware: [`hardware-select.md`](docs/evidence/2026-08-18/hardware-select.md). A hundred
400
- and eighty calibration runs across three models, distributions rather than averages, with the
401
- pick ranked against the other two:
402
- [`calibration-report.md`](docs/evidence/2026-08-23/calibration-report.md).
403
-
404
- **Eight untrusted boundaries are fuzzed**, and the harnesses are checked against a defect
405
- injected on purpose so a clean run cannot be a blind one: [`fuzz/`](fuzz/README.md) and
406
- [`security-coverage.md`](docs/security-coverage.md).
407
-
408
- **The screen renders from ledger projections, and a keystroke has no route to a verdict.**
409
- Interactive state is a separate type with a separate reducer, and a test asserts across every
410
- action that none of its fields can be mistaken for a gate result:
411
- [`interface.md`](docs/evidence/2026-08-23/interface.md).
412
-
413
- **A choice between competing attempts is made from measured numbers.** One task tried three
414
- ways: three green attempts, coverage measured rather than abstained on, the third ranked last
415
- on the dimension that saw it wrote one test fewer, and the top two identical on everything so
416
- the tie broke on the earliest, which the report says in those words rather than inventing a
417
- reason it did not have: [`swarm.md`](docs/evidence/2026-08-24/swarm.md).
418
-
419
- **Adversarial passes, with each closure locked as a regression test.** Six pass directories
420
- under [`redteam/`](redteam), 49 cases in `src/evidence/redteam-adversarial.test.ts`, and an
421
- accounting record mapping each pass to what it actually was, because the driver ledger
422
- records one completed lap and a directory is not a lap.
239
+ Distributed under the ISC License. See [LICENSE](LICENSE).
423
240
 
424
- ## What is not claimed
241
+ ## Contact
425
242
 
426
- Kept short and kept honest, because the point of the rest of this file is that claims cost
427
- something. The full list, with what would settle each, is
428
- [`docs/beta-gates.md`](docs/beta-gates.md): of the twelve gates this project agreed not to call
429
- itself production-ready without, six pass on measured evidence, three are partial with the gap
430
- named, two are unproven, and one fails on scale. **It is not production-ready**, and that last
431
- one is the largest gap.
432
-
433
- - **Not "fully secure".** The secret detector does known-pattern scrubbing, not secret
434
- removal, with a four-character floor. Zero crashes at a fuzz budget is evidence, not proof.
435
- - **The default execution mode is `restricted`, not `isolated`.** A run gets a lexical path and
436
- program policy in front of interpreters unless you pass `--isolation`. That is reported before
437
- the run starts and recorded on the chain rather than quietly assumed, but it is not
438
- containment. The container backend has not been audited against a determined escape, and a
439
- container is not a virtual machine.
440
- - **The false-green rate is measured, on eleven opportunities.** Each task carries two oracles:
441
- one sealed before the runs and handed to the tool, one written from the task text and held back
442
- from it. A false green is only possible where the tool said `verified`, which happened eleven
443
- times out of eighteen; the held-back oracle refuses none of them. **0 of 11, 95% CI
444
- [0.0, 25.9]**: [`second-oracle/README.md`](docs/evidence/2026-09-06/second-oracle/README.md).
445
- Eleven opportunities is eleven opportunities, and that interval is what a zero buys: what is
446
- shown is that none occurred here, not that the rate is low. Three tasks, and six of the
447
- eighteen runs could not contribute because neither arm ever passed that task's sealed oracle.
448
- An earlier single-oracle version of this number, 0 of 18, was withdrawn as arithmetic rather
449
- than corrected quietly: the same test was handed to the tool and then used as the ground truth
450
- it was scored against, so it agreed with itself. That, and the real 22.2% it replaced, are in
451
- [`false-green-measurement.md`](docs/evidence/2026-09-05/false-green-measurement.md).
452
- - **No comparison against another tool.** Nothing here is measured against a competitor. The
453
- evaluation harness runs matched arms on a local model and has not been run at the scale that
454
- would make an arm comparison worth reading. The calibration results that do exist are
455
- self-run, on one machine, and labelled directional in the file itself.
456
- - **A full clone is still heavy.** Blob payloads, 409 MB of the tracked tree, now live outside
457
- the repository with their digests committed beside them, and a shallow clone packs to about
458
- 19 MB. A full clone still carries the history those blobs were committed into, and shrinking
459
- that means rewriting history, which is a worse trade than the download it saves.
460
- - **Learned routing is not on by default**, and there is a bar under turning it on: held-out
461
- success non-inferior within five points judged by the whole interval, at least thirty tasks
462
- per arm, and cheaper or faster. Nothing has cleared it yet, so routing follows the
463
- calibration and the competency table.
464
- - **Six known gaps ship open**, and none of them is claimed closed. They are in
465
- [build guide 7.1](docs/build-guide.md), which says for each what now catches it and what
466
- still gets past. Four of them have detections built against them and have not yet been
467
- attacked, so what is claimed is a detection and not a closure: a check nobody has tried to
468
- get past is a check nobody has measured. The other two came with the scale-out work and are
469
- unchanged, since a decomposition that is well formed can still be unrunnable and a
470
- comparator built from gate measures reads discipline rather than completeness.
471
- - **A signature does not make the machine honest.** It proves the bundle was not altered
472
- after it left the machine that produced it. The review page says that on its face.
473
-
474
- ## How it works
475
-
476
- - **Claims are predicates, not prose.** A claim names a record, a record kind, and a
477
- machine-checkable predicate. The harness recomputes the record's kind, evaluates the
478
- predicate, and decides. Model narrative always renders as unverified prose.
479
- - **The ledger is append-only and hash-chained.** Each record carries the previous record's
480
- hash. A failed write aborts the run. Nothing is updated or deleted, ever.
481
- - **Every tool call goes through one chokepoint** that records it, tags its provenance, and
482
- applies the policy guard. Credential paths are denied by default and each denial is itself
483
- recorded. The guard is a lexical path and program policy, not a sandbox: it reads a command
484
- into the programs it would run and the words that could name a file, and rules on those. That
485
- bounds which programs start and never what they do once started, because an allowlisted
486
- interpreter runs whatever a workspace script says.
487
- - **What a run executed under is measured, not asserted.** Before the first tool call a
488
- containment self-test runs the escapes rather than reasoning about them: read a host file
489
- outside the workspace, write outside it, open a network connection. Whatever gets through is
490
- named in an `execution-envelope` ledger record and printed before the run starts. With no
491
- kernel-enforced backend in front of it, the honest answer is `restricted`, and that is what
492
- it says. `isolated` is reserved for a backend that refused every probe.
493
- - **Child processes get a built environment, never an inherited one.** A path check cannot see
494
- `process.env.ANTHROPIC_API_KEY`, so the model's shell commands and the repository's own gate
495
- commands run under an allowlist: PATH, the locale names, TERM, a harness-owned HOME, and
496
- whatever the run authorized by name. Provider keys have no `swarm.toml` setting, and a file
497
- that names one is refused with rotation guidance.
498
- - **Gates are data, and each declares what a pass establishes.** A gate declares a command, a
499
- parser, whether it blocks, and its capability: `static` reads the source, `dynamic` executes
500
- the code under change, `policy` rules on the change without doing either. "Did anything run
501
- over this change" is answered by a passing `dynamic` gate, which is why a lint-only pass no
502
- longer reads as one. The engine never special-cases a gate; the capability is read off its id.
503
- - **A run's state outlives its process.** Which activities were dispatched and never came back,
504
- which files are held, what budget is spent, what a person approved: SQLite in WAL mode beside
505
- the ledger, with intent written before every effect. A hundred injected kills, three committed
506
- effects each, three hundred effects and no duplicates.
507
- - **Killing a run kills what it started.** Every child leads a process group and the signal goes
508
- to the group. A wall budget, a Ctrl-C and a supervisor's SIGTERM all reach the same signal,
509
- and in a parallel run a worker starting late is handed what is left of the budget rather than
510
- a fresh one.
511
- - **Evidence has a lifetime.** `swarm gc` says what it would remove and removes nothing until
512
- told. The store is created 0700 and 0600, and a directory made before that rule is narrowed
513
- rather than assumed.
514
- - **A pass is bonded, and the criteria are sealed first.** Before the model is asked for
515
- anything, the gates it will be measured by, with their severities, the rule that reads each,
516
- the budgets and the attempt cap, are one record on the chain, and the verifier holds every
517
- gate run to it. After the fixed point, every gate that passed is handed one file it has to
518
- refuse: a test that throws, a TODO, a credential-shaped token, a file outside the declared
519
- set, a change over the budget. A check that refuses it held. A check that passes over a
520
- bond it demonstrably saw is vacuous, and a vacuous blocking gate makes the run not green.
521
- A pass nothing shows can fail is not a pass.
522
- - **The ratchet is numeric.** Tests collected, assertions in touched test files, coverage of
523
- changed lines, skip markers. The two the runner reports, tests collected and coverage of
524
- changed lines, come from reports the runner wrote where the harness told it to, never from
525
- what a gate printed: a test file that prints its own counter line is the code under
526
- measurement authoring the measurement. Where the harness cannot vouch for the run that would
527
- write those reports it asks for none, and an unobtainable measure is reported as "not
528
- measured" rather than as a pass. Assertions and skip markers need no runner: the harness
529
- counts them out of the text of every test file the run touched.
530
-
531
- The full design, including what it refuses to build and why, is in
532
- [`docs/build-guide.md`](docs/build-guide.md).
533
-
534
- ## Limits
535
-
536
- Gates prove mechanical quality. They do not prove design quality, and nothing here pretends
537
- a passing run means the change is good. What the bundle buys you is that reviewing the
538
- change is fast and that its claims are checkable, not that review is unnecessary.
539
-
540
- The verdict says so in its own vocabulary: `semantic` is `unmeasured` on every run and always
541
- will be, because whether a change means what was asked is a judgement about meaning, and this
542
- tool makes none. `acceptable` means no blocking gate failed, no policy gate failed, and
543
- something executed the change. It does not mean the change is right, and no number here could
544
- tell doing the whole task from doing the minimum that passes its own tests.
545
-
546
- ## Upgrading from v12
547
-
548
- v12 was a PR auditor that ran as a GitHub Action. v13 is a coding agent. Same package name,
549
- different product, no migration path. If you are using v12, stay on it: it is tagged
550
- `v12-final`. Details in [`CHANGELOG.md`](CHANGELOG.md).
243
+ Brad Kinnard, [@KChackerman](https://x.com/KChackerman), bradkinnard@proton.me
551
244
 
552
- ## License
245
+ Project link: [github.com/moonrunnerkc/swarm-orchestrator](https://github.com/moonrunnerkc/swarm-orchestrator)
553
246
 
554
- ISC. See [`LICENSE`](LICENSE).
247
+ <p align="right">(<a href="#readme-top">back to top</a>)</p>