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/CHANGELOG.md CHANGED
@@ -1,6 +1,395 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 14.2.0 - 2026-09-27
4
+
5
+ ### Fixed
6
+
7
+ - Rejected acceptance authority for candidate-controlled Playwright JSON. Sealed browser
8
+ instruments use harness configuration, immutable image dependencies and exact test identities.
9
+ - Retained unavailable package checks through sealing, final assessment and reviewer reports,
10
+ separating absent optional tools from unavailable required checks.
11
+ - Provisioned Chromium and the isolated browser runtime in clean Linux gate workflows;
12
+ nightly failure notifications no longer require an optional repository label.
13
+ - Reopened the prior completion claim after the independent audit. Corrective delivery and
14
+ release status are tracked in [audit corrections](docs/upgrade-audit-corrections.md).
15
+
16
+ ### Added
17
+
18
+ - Shared model-free branch/PR snapshot verification, reviewer Markdown and versioned JSON source
19
+ identities alongside patch mode. Standalone source tarballs build and install without providers.
20
+ - Declared npm/pnpm and uv/existing-venv initialization, explicit package scopes, structured
21
+ Vitest/pytest outcomes, and sealed CLI, local HTTP and optional Playwright behavior checks.
22
+ - Bugfix, refactor and dependency-upgrade presets on the existing engine, with base controls,
23
+ narrow manifest authorization, locked preparation and recorded installed versions.
24
+ - One explicitly authorized capability escalation with deterministic failure classification,
25
+ original budget limits and recovery reconciliation. A configured cloud key grants no consent.
26
+ - Trusted-source Action infrastructure and separate good/bad behavioral workflow controls.
27
+ Source delivery and package publication remain separate; exact validation is tracked in
28
+ [the upgrade ledger](docs/upgrade-completion.md).
29
+
30
+ - **An approval mode, asked once per workspace.** The first terminal run asks whether commands
31
+ off the shell allowlist may be approved automatically and writes the answer to `swarm.toml`
32
+ as `[tools] approval`; `--approve ask|auto` and `SWARM_APPROVAL` override it. Under `auto` the
33
+ run answers an allowlist prompt itself and records it as pre-approved; a derivation-heuristic
34
+ prompt, the injection defence, asks under either mode. Every prompt gains `a`, always: the
35
+ call runs and its off-list programs are allowed for the rest of that run, recorded as a
36
+ `run-allowance` ledger record. The screen's header shows the mode.
37
+ - **The default model is the best served local model for this hardware.** With nothing pinned
38
+ and no calibration, a run discovers the local backends, ranks what they serve by the
39
+ shortlist's tier for the probed hardware, prints the choice and its reason before the session
40
+ opens, and records it as a `model-default` ledger record. A frontier key is used only where
41
+ nothing local is served; with neither, the run stops and names the remedies instead of
42
+ defaulting to a provider it has no key for.
43
+ - **A preflight card, and a screen that says what became of each step.** Before the screen goes
44
+ up, `swarm run` and `swarm session` print four lines to stderr naming the repository and base
45
+ commit, the manifest, the model with the reason it was chosen, and the approval mode. On the
46
+ screen, the header's second line reads elapsed, step, tokens, attempt, ratchet, model,
47
+ approval and workspace, and stays at every width; each timeline row starts with a status
48
+ mark and the clock time it landed; the gate strip counts passed, failed and not-applicable.
49
+ A finished run ends on a finish card: the verdict, duration, steps, tokens and cost, then the
50
+ review page and the bundle as rows a terminal that understands OSC 8 shows as clickable
51
+ links. Marks fall back to ASCII where the locale is not UTF-8. The plain-line stream that CI
52
+ and pipes read is byte-identical to before.
53
+ - **`swarm-verify`, the verification path as its own package.** `packages/swarm-verify` builds a
54
+ binary carrying `verify`, `ci` and `gates` from the same modules `swarm` runs under those names,
55
+ parsed by the same parser, so an invocation reads the same through either. It carries no
56
+ provider, worker or screen module and none of the agent's run assembly: a test walks its import
57
+ closure and the build refuses to emit a crossing. A test verifies a committed bundle through
58
+ both binaries and compares the bytes. Version 0.2.0 has a separate release workflow; the packaged check
59
+ packs it, installs it beside the full CLI, and runs the tamper demo through it.
60
+ - **An agent can record a file as temporary, and is held to removing it.** `declare_file_set`
61
+ and `amend_file_set` take `temporary`: paths created only to investigate, such as a probe
62
+ script. The blocking `file-set` gate fails while one is still in the change and names it. An
63
+ amendment can keep one on purpose with `retain`, and its reason then shows on the ledger, in the
64
+ reviewer's claim and in the gate's output on every pass. Nothing is deleted behind the model's
65
+ back and nothing reads a filename. Two repairs in the reach-pressure run left a scratch script
66
+ in their final patch, and membership alone had passed both.
67
+ - **Derived evidence packs losslessly inside the tree.** `scripts/evidence-pack.mjs` packs tracked
68
+ review pages and run transcripts under a root into one `utf8-file-map-brotli` archive with a
69
+ digest for every original, removes originals only after the written archive has been unpacked
70
+ and compared, and `npm run checks` verifies every committed pack. Ledgers, DAGs, manifests and
71
+ verifiers can never be packed. The tracked tree went from 99.8 MB to about 90.5 MB with every
72
+ cited bundle still verifying, and the weight check now also requires 6 MB of headroom so the next
73
+ experiment's evidence has somewhere to go.
74
+ - **A repair is read as what it did to the verifier's findings.** Experiment rows record, per
75
+ invocation, one of `patch-unchanged`, `findings-identical`, `findings-moved`, `findings-shrank`,
76
+ `findings-grew` or `satisfied`, with both finding sets, both patch digests and the files that
77
+ entered or left the patch, plus the same from the fork to the final patch. No score is computed.
78
+ Generation 3's nine "repairs exhausted" split into six unchanged patches, two that grew the
79
+ findings by leaving a scratch file, and one that changed bytes and no finding.
80
+
81
+ ### Fixed
82
+
83
+ - **Reach reports `unmeasured`, not `reached`, for a change it could not measure at all.** A
84
+ change made only of documentation, types and its own tests skipped every file, left nothing
85
+ unreached and read as a measurement. Certification treats the two alike; a reader does not.
86
+ The verdict now carries every file reach set aside with its reason (`setAsideByReach`) and
87
+ `swarm ci` prints them. One path rule serves reach, the mutant planner, the patch metrics and
88
+ the PR miner, which had each spelled it separately: the miner still read a tsd type test as
89
+ source. tsd's `test-d/` directory and the `_test` suffix are recognized, and scratch scripts and
90
+ JavaScript tool configuration stay judged.
91
+ - **Three campaign runners asked whether the model lists, not whether it generates.** A wedged
92
+ local server answers `/models` and completes nothing. `pr-task-pass` probed `/models`, and only
93
+ when a patch was empty, so a partial patch left by a server that died was judged as the model's;
94
+ the pilot campaign's health effect returned the literal `healthy: true`; `run-campaign` had no
95
+ probe. All three ask the configured model for a bounded completion after every invocation. The
96
+ probes are `endpointListsModels` and `endpointGenerates` in a module of their own, the second
97
+ names why it failed, and `pr-task-pass` keeps an infrastructure attempt apart from `runs`, where
98
+ it used to mark its task done and get re-judged.
99
+ - **A failed model call records whether the harness cancelled it.** A call cut off at the wall
100
+ budget and a provider that raised were both `call-failed`. Every unknown-usage invocation of the
101
+ reach-pressure run was the first kind, and nothing on the ledger said so.
102
+ - **Unknown usage is no longer added in as zero.** The experiment analysis summed a null model-call
103
+ count as 0; arm scoring priced a crashed run at $0 and printed dollars per accepted patch off the
104
+ sum; calibration divided all tokens by all time, so a model with one call cut off measured
105
+ slower than it is. A total is a number only where every part was measured, and the known part
106
+ is kept under its own name. The core loop's token total is unchanged and now travels with
107
+ `callsWithUnknownUsage`.
108
+ - **The experiment analyzer cannot overwrite what a run published.** `analyze` wrote its summary
109
+ and page in place. It now refuses where the bytes differ and writes to `--out` with a
110
+ `derivation.json` naming the acquisition identity, the identities it was derived with, and every
111
+ value changed, added or removed. `run` and `score` refuse to write beside rows of another
112
+ protocol identity, which only `analyze` had checked, and identity is read before a row is
113
+ parsed. Generation 3's published summary re-derives with no value changed.
114
+ - **The router considers every model the table has measured, not only the last sweep's pair.**
115
+ The calibration pick's candidates were the models the last sweep ran together, so a model with
116
+ the best evidence of all on a class was never in the running when a later sweep happened not
117
+ to include it: on one machine qwen3.6 held the best edit share across two sweeps and the router
118
+ chose between gemma4 and mistral. The candidates are now the pick's own plus every model the
119
+ competency table has measured on the task's class, on the same golden set, at or above the
120
+ floor, restricted as before to what the backend serves.
121
+ - **A turn cut off at the output cap is not a completion.** A live run's only turn was the
122
+ marker `<channel|>` repeated to the 8192-token cap around a fragment of a plan, with no tool
123
+ called; the loop read the cut-off text as the model's account of finishing, the gates ran
124
+ green over an unchanged workspace, and the run ended "work accepted" with nothing written.
125
+ Two of five samples of the same request against gemma4:31b behind Ollama spiral the same way.
126
+ A turn cut off at the cap before it called a tool is now sampled again, its text never becomes
127
+ the plan or the claim, and a run whose every sample is cut off stops as `output-cap`. A stream
128
+ that repeats one short unit 96 times in a row is cut off there and sampled again, rather than
129
+ running minutes to the cap. The finish card over an unchanged workspace says nothing was done
130
+ instead of repeating the assessment, and the header's elapsed counter stops when the card
131
+ goes up.
132
+ - **A run stops before the session where it could never go green.** A directory that is not a
133
+ repository, a `--base` that does not resolve, and a repository with no manifest each used to be
134
+ found out after the model had worked: eight steps in one case, three attempts and 112,000
135
+ tokens in another, then a first gate saying "add the manifest". `run` and `session` now check
136
+ the base commit and the manifest first. With no manifest, `swarm` on a terminal offers to add
137
+ a Node harness (`package.json` running `node --test`, and `.gitignore`) and commit it; off a
138
+ terminal, or declined, it stops with the remedy named.
139
+ - **An interpreter cache is not a change.** Running a Python test writes `__pycache__`, and the
140
+ file-set gate charged that as an edit outside the declared set, after which the ratchet
141
+ rejected the attempt for a gate that had passed before and discarded the work. `__pycache__`,
142
+ `.pytest_cache`, `.mypy_cache` and `.ruff_cache` are excluded from the change set by name.
143
+ - **A stopped run says what stopped it.** A cancellation during a model call reported "model
144
+ error: This operation was aborted", the transport's words. The signal now carries the reason
145
+ (cancelled from the keyboard, or the run's wall budget spent) and the loop reports it.
146
+ - **A refused assessment names only what refused.** The status line read "work refused: work
147
+ refused: required checks passed, lifecycle interrupted, ..." beside four failed gates. It now
148
+ reads, for example, "work refused: the gates settled escalated; the run was cancelled".
149
+ - **The macOS keychain is asked whether a default keychain exists before a signing key is
150
+ added.** `security add-generic-password` with no default keychain raises a dialog and blocks
151
+ until the store kills it; the probe fails cleanly instead and the run signs with a per-run key.
152
+
153
+ ### Measured
154
+
155
+ - **Enforcing changed-line reach after visible acceptance changed no held-back verdict in 79
156
+ mined tasks.** A pre-registered shared-prefix experiment ran each task until the visible half of
157
+ its oracle first accepted, took that patch as the control, and forked a reach condition from the
158
+ same workspace that was told which added lines the oracle never executed. Thirteen tasks reached
159
+ visible acceptance, reach triggered on nine, no repair satisfied it, and the held-back half
160
+ agreed on every pair: 12 pass both, 67 fail both, zero discordant, exact McNemar p = 1, paired
161
+ difference 0.0 points, 95% CI [-4.0, +4.0]. Three repairs changed bytes, none narrowed the
162
+ implementation, two left scratch files behind. Six of the nine refusals named a tsd type-test
163
+ file no runner executes. The protocol, rows, patches and a report that re-derives from the rows
164
+ are in [`docs/evidence/2026-09-17/reach-pressure-experiment/`](docs/evidence/2026-09-17/reach-pressure-experiment/report.md).
165
+ Two earlier generations were stopped on instrument defects and are kept beside it. The instrument
166
+ defects it exposed, and what closed each without touching a row, are in
167
+ [`docs/evidence/2026-09-18/reach-pressure-hardening/`](docs/evidence/2026-09-18/reach-pressure-hardening/README.md).
168
+
169
+ ### Changed
170
+
171
+ - **The verify-only commands are command definition data.** `verify`, `ci` and `gates` are marked
172
+ as needing no model, and a test runs each through the real CLI with no provider key and the
173
+ local endpoint pinned to a closed port. `docs/verify-only.md` walks all three through on
174
+ committed artifacts, with every transcript captured from the command it sits under.
175
+
176
+ - **Node 22 runs the tool; Node 24 is needed only for the coverage measurement.** The whole CLI
177
+ refused to start below Node 24 because the changed-line coverage arm spawns node's test runner
178
+ with `--test-isolation=process`, which Node 22 rejects. Now `engines.node` is `>=22`, every
179
+ command runs there, and on a Node below 24 the tests gate runs the project's own test command
180
+ while the coverage arm reports `unmeasured` with the reason named in the gate-run record and in
181
+ the ratchet's abstention. Unmeasured never renders as a pass, so a change touching covered
182
+ lines fails the ratchet on that runtime rather than passing quietly. `swarm doctor` reports
183
+ which Node it found and what that disables.
184
+
185
+ ## 14.1.0 - 2026-09-14
186
+
187
+ ### Added
188
+
189
+ - **Goal runs now complete through adaptive integration.** `swarm parallel --goal` creates one
190
+ shared run context before planning, resolves each task contract into enforced paths, tools,
191
+ checks, runtime policy and budget, and schedules ready work without whole-layer barriers. Merge
192
+ conflicts, behavioral failures and ratchet rejections retain their candidate commits and create
193
+ bounded repair attempts against the current integration tree. Missing prerequisites, coupled
194
+ tasks and repair routes use append-only graph revisions that preserve requirement identities.
195
+ Final status comes from independent checks of the exact integrated tree. `resume` rebuilds the
196
+ durable controller state and will not duplicate an accepted landing. The pilot driver and its
197
+ paired evaluation remain descriptive evidence, not a claim of universal correctness or swarm
198
+ superiority.
199
+
200
+ - **The oracle bond asks something of ordinary code.** Its five operators each needed a particular
201
+ token on the line, and a guard clause, an assignment, a `require` and a callback carry none of
202
+ them, so `not-bonded` was what a bond said when it had nothing to ask rather than when it had
203
+ found a strong oracle. Both adversarial false greens are that shape and produced zero mutants
204
+ between them across every line they add. Three more operators cover the statement shapes that
205
+ went uncovered: an `if` or `while` condition negated whole, the value a plain assignment or
206
+ declaration writes replaced by a sentinel, and the statement removed. They are read off the
207
+ language's own `Statement` productions rather than off the patches that exposed the gap, because
208
+ operators fitted to the cases that motivated them measure the fitting, and the derivation, the
209
+ ordering and which tasks were in sample were committed before any of it was implemented:
210
+ [`docs/oracle-bond-operators.md`](docs/oracle-bond-operators.md). All eight fire on the mined
211
+ corpus and the three new ones account for 25 of the 34 mutants built. `koa#1999`, the patch a
212
+ rejected stricter option would have cost because nothing here could change any of its added
213
+ lines, certifies on `held`.
214
+ - **A deleted statement is confirmed to parse before it is read as evidence.** Statement deletion
215
+ is the one operator that can leave a file which does not compile, and every oracle refuses one of
216
+ those, so a bond counting that refusal would credit the oracle with a rejection it never made. It
217
+ runs `node --check` over the file the patch left and over the file with the line blanked. Where
218
+ the original does not parse, node cannot read the dialect and so cannot tell a syntax error from
219
+ a mutant: the operator proposes nothing for that file and the other seven still apply, which is
220
+ what TypeScript and JSX get.
221
+ - **A vacuous bond names what showed the mutant changed anything.** An oracle accepting a mutant
222
+ means nothing unless the mutant was a change, and what established that was a person reading each
223
+ mutated line: an audit that found two equivalent mutants, does not scale, and is not evidence
224
+ anybody else can re-derive. Every mutant the oracle accepted on a line it ran is now adjudicated
225
+ by a second detector, cheapest first. The oracle runs again under the same instrumentation reach
226
+ uses, and a line other than the mutated one that ran in one reading and not the other is a
227
+ demonstrated difference in what the program did; failing that, the repository's own gates that
228
+ passed with the patch are run again. Neither seeing anything is recorded as such, and a suite run
229
+ that was never spent says so rather than answering. What the pair cannot see is named: a mutant
230
+ that changes only a value on a path that runs either way, in code the project did not have
231
+ before.
232
+ - **`scripts/deadline-overshoot.mjs`, and gate 9 has a number.** Twenty samples with a real child
233
+ that outlives its deadline and the whole cancellation tree between them. Worst overshoot 3ms,
234
+ 1.20% of a 250ms budget against the 2% the gate asks, and the budget floor is printed beside the
235
+ percentage because the percentage depends on both. The wall clock rather than an injected one: a
236
+ driven clock reports zero by construction, which is the one answer this cannot be allowed to
237
+ give.
238
+ - **`scripts/task-difficulty.mjs`, and gate 7's blocker was misdiagnosed.** That row said the
239
+ discriminating corpus has three tasks and more would have to be authored by hand. They are
240
+ already mined: over the pull-request corpus this model solves 11 of 79, 13.9% [8.0, 23.2], spread
241
+ across fourteen repositories. A set where the model both succeeds and fails is what a paired test
242
+ needs and what the golden set does not give. What is left is arm selection in the mined pass and
243
+ a second run of every task, neither of which is authoring.
244
+ - **The adversarial arm's numbers come out of the same script as the rest.** They were in prose and
245
+ nothing re-derived them. `separateAdversarialRows` also keeps them out of every other rate by a
246
+ check rather than by which file a row sits in, since a model shown its acceptance test is a
247
+ different sampling process rather than a harder subset of one.
248
+
249
+ - **`swarm ci` refuses to certify on an oracle that never ran the change.** An oracle is evidence
250
+ only about the code it executed, so the run reports `oracleReach`, and a change the oracle
251
+ demonstrably skipped is not verified. The unreached lines are named, because "extend the oracle
252
+ to cover the lines the patch added" is not actionable without them. Reach is measured only where
253
+ the harness can rebuild the oracle's invocation as an argument vector it controls, per invariant
254
+ 7; anywhere else it reads `unmeasured`, which blocks nothing. koa#1946, the first false green
255
+ this project found, is refused by it: its oracle never executed lines 270-273 of the file it
256
+ certified. Across both corpora the check produced no false reds.
257
+
258
+ ### Fixed
259
+
260
+ - Run the deadline measurement tests after competing test processes finish, retaining the
261
+ existing timing bounds. A hosted macOS run exposed a 255 ms overshoot under concurrent suite
262
+ load; that failed observation remains recorded in the implementation evidence.
263
+
264
+ - **A regular expression is masked like the literal it is.** The claim beside the deletion parse
265
+ check was that no other operator can leave a file which does not parse, and that claim is why
266
+ only one operator is checked at runtime. Measured across every operator over 186 real files, it
267
+ was false: `swap-call-arguments` broke 1 of its 105 on a line splitting on a pattern whose own
268
+ comma is part of it. `withoutLiterals` masked strings and comments and had never masked a
269
+ pattern, so the argument scan read that comma as an argument separator and swapped halves of a
270
+ regex; the same blindness reached every operator that looks for a token, since a comparison
271
+ inside a pattern is not a comparison. Which of two things a slash is gets settled by what
272
+ precedes it, wrong only in the direction that masks too much and costs a mutant. Re-measured over
273
+ the same files: 2,702 mutants and every operator but the deletion at zero.
274
+ - **An empty patch is not charged to the model unless the endpoint answered.** An MLX server ran
275
+ out of GPU memory mid-batch, inside `mx.eval` over its own prompt cache, and every task after it
276
+ came back with a zero-byte patch recorded as the model writing nothing. That is the
277
+ misattribution this corpus was already bitten by in the other direction, when twelve rows the
278
+ agent had failed on were reported as an oracle nobody could run. `scripts/pr-task-pass.mjs` now
279
+ probes the endpoint before the pass and again after any empty patch, records nothing where it
280
+ does not answer, and stops, because every task after an endpoint failure records the same wrong
281
+ thing. Not under `--rejudge`, which re-derives verdicts from recorded patches and asks no model
282
+ anything.
283
+ - **`swarm ci` stops printing one sentence for two different absences.** `unshown` said "the oracle
284
+ accepted, and nothing shows it ran the mutated lines" even where it had run them and no detector
285
+ could show the mutant changed anything, which sends a reader to inspect coverage that is fine. The
286
+ line names which absence it is, and a gap names what witnessed it, because a refusal resting on an
287
+ instrument and one resting on the operator alone are different amounts of evidence.
288
+ - **The deadline overshoot test measured the machine rather than the tool.** It went red inside its
289
+ own suite. Overshoot is scheduling and does not shrink with the budget, so 2% of a 500ms budget is
290
+ 10ms of headroom and the whole suite running in parallel ate it: 3ms idle, 5ms with eight
291
+ processes spinning, more than 10ms under the suite. The 2% claim is now made at a two-second
292
+ budget where 40ms stands against a measured 2 to 5, the absolute number is asserted separately,
293
+ and gate 9's row says the published 1.20% is an idle-machine number.
294
+ - **The bond stops spending detectors once the verdict cannot change.** Which fact the verdict rests
295
+ on also decides when adjudicating can stop, and the loop read only one of the two, so detectors
296
+ were spent looking for something that could not change the answer. One coverage reading and at
297
+ most one suite run per patch now. That also removed a state the record could not describe
298
+ honestly, a mutant past the bound on suite runs recorded as not adjudicated while coverage had
299
+ been asked and been silent.
300
+ - **Two imports nothing in `src/cli-select.ts` used**, and an empty shell argument read as a path.
301
+ `sed -i '' 's/a/b/' file` is the in-place form every macOS invocation uses and it was refused with
302
+ "the path is empty", because the quoted empty argument reached a check whose whole subject is
303
+ paths.
304
+ - **Three attacks that got past the policy guard.** Every security case in this repository was
305
+ written by whoever wrote the defence, so `src/tools/guard-attacks.test.ts` was written the other
306
+ way round. Casing: macOS and Windows are case-insensitive by default, so `.ENV` opens `.env`, and
307
+ every pattern in the credential denylist was case-sensitive. Measured on APFS before the fix,
308
+ `readFileSync('.ENV')` returns what `.env` holds, and `realpathSync` hands back the casing it was
309
+ given rather than the casing on disk, so nothing upstream normalized it; `SWARM.TOML`,
310
+ `server.PEM`, `.git/CONFIG` and a differently cased denied root were the same hole. The denial
311
+ comparisons now fold, whatever the host filesystem does, because a denial whose verdict depends
312
+ on which machine ran it is the defect. The workspace containment check does not fold: that one
313
+ decides whether anything is allowed at all, and folding it is the fail-open direction. A revision
314
+ and a path in one word: `git show HEAD:.env` prints a credential file and the word the guard
315
+ ruled on matched no pattern. A path inside a word the shell passes whole: `sed -n
316
+ 'w /home/dev/.ssh/authorized_keys'` writes outside the workspace and the operand was the whole
317
+ script. A word now offers every path it could open, its whitespace-separated pieces and what
318
+ follows a colon, each through the same guard, with a URL scheme left alone. Two attacks still
319
+ succeed and are asserted as succeeding, because a residual nobody can point at is not named:
320
+ `git config --list` reads a denied file without naming it, and `node -e "..."` is an allowlisted
321
+ interpreter handed a program.
322
+ - **vitest and `@vitest/coverage-v8` to 4.1.11, for GHSA-82fw-gwwq-j7x9.** A path traversal in
323
+ `@vitest/mocker`'s redirect mock, CVSS 5.9, published 2026-09-08 against every version from
324
+ 2.1.0. Dev-only and inside the range `package.json` already declared, so the lockfile was the
325
+ only thing holding the tree on 4.1.10. The coverage provider is pinned exactly rather than
326
+ ranged, so it moves in the same change or it drifts away from the runner it instruments. This is
327
+ the first finding the weekly scan has produced that was the world changing rather than the tree:
328
+ it landed a day after the last scheduled run, and the scan caught it on the next.
329
+ - **A dynamic gate the harness ran itself now counts as having executed the change.** Reported from
330
+ outside against e261c859b: a project declaring a linter and no test runner settled green over a
331
+ changed source file that nothing had executed, because the check for "was this change measured"
332
+ asked only whether some command gate had passed and a linter is one. That reading was replaced by
333
+ what a gate is capable of establishing, and half the old predicate was left behind: it still
334
+ asked for a command as well, which discards the behaviour probe, an inspection that imports the
335
+ changed module and calls its functions. So the probe's classification was dead, and with it the
336
+ two abstentions added to keep a probe that measured nothing from reading as a pass, and a project
337
+ with no declared runner spent every attempt and escalated saying nothing had run over a change
338
+ its own probe had just run. Capability decides it now, and the gate's shape decides nothing. The
339
+ reported case is driven whole in `src/gates/static-only-project.test.ts`, with the changed file
340
+ instrumented so that executing it leaves a trace: it settles green only where the trace exists.
341
+ - **The weekly scan reports what somebody can act on.** It read 16,731 files, nearly all of them
342
+ captured evidence, and 171 of its 177 findings were one rule firing once per copy of the
343
+ re-derivation script that every exported bundle carries. Editing a bundle to quiet a scanner
344
+ falsifies the record it exists to be, so those paths are data the scan does not read, and the
345
+ finding was fixed where it lives: the template in `src/evidence/verifier/rederive.mjs` was
346
+ missing the suppression its mirror in `src/gates/parsers.ts` already carried. The other five in
347
+ source are dispositioned at the line that carries each, one of them a fix: a `replace` stripping
348
+ the first `$` of a pattern where every one of them was meant. The scan now reads 1,050 files and
349
+ reports nothing. It also stops opening a fresh issue every Monday for findings that have not
350
+ changed: it comments on the open one, since three identical notifications is how a scan teaches
351
+ people to close it unread.
352
+ - **An invocation the harness could not read, so it could not measure.** The recognizer that
353
+ decides whether the harness controls a command read quoted text as bare: a title filter's `|`
354
+ tripped its shell-operator scan and its spaces split one argument into several, so no real
355
+ oracle could be vouched. Quoting is read now, which is narrower than a shell rather than wider:
356
+ nothing expands, nothing is escaped, and an operator outside quotes still ends the reading.
357
+ Vouching those commands then exposed that a flag whose value is the next argument was being
358
+ separated from it, which asked node to filter titles by a coverage flag and to run a test file
359
+ named after the titles.
360
+ - **The patch's own tests are not code the oracle skipped.** An acceptance oracle runs its own test
361
+ file and never the candidate's, so the candidate's tests are absent from every coverage report by
362
+ construction. Counting them refused patches that both oracles accept, which is nearly every
363
+ well-behaved change, since a feature is expected to arrive with its tests.
364
+ - **Reach measured the tree the oracle judged.** Two paths reverted the patch and left it reverted:
365
+ the vacuity check stashed it and popped it back without checking the pop, which fails when the
366
+ patch adds a file the oracle overwrites, and attribution reverts it to measure the base. Both
367
+ meant later measurements were taken on the base commit and reported as though they were about the
368
+ patch. The revert and re-apply are checked now, and a checkout that could not be put back makes
369
+ reach abstain rather than measure whatever the tree holds.
370
+ - **`swarm ci` stops what it started.** The command installed no signal handler, so a Ctrl-C or a
371
+ supervisor's SIGTERM ended the CLI and left its test runners reparented and running: two node
372
+ processes from an oracle were found holding a checkout open five hours after the run that started
373
+ them had gone. It takes the same cancellation the run commands use, so a stop reaches the process
374
+ group rather than only the process.
375
+ - **An oracle that cannot judge is not an oracle that refused.** The corner classifier read the
376
+ held-back verdict as a boolean, folding "accepts the base too" and "could not be run" into a
377
+ refusal. Both now classify as unjudgeable and leave the denominator, with the count reported
378
+ beside the rate. This cuts both ways: it stopped charging the tool for certifying work that
379
+ nothing contradicted, and it removed two tasks that were being counted as opportunities the tool
380
+ passed.
381
+ - **Re-judging cannot answer worse than scoring did.** `--rejudge` re-derives verdicts from
382
+ recorded patches after a harness change, and the order-dependence check lived only in the fresh
383
+ scoring pass, so re-judging winston#2256 turned a task already recorded as order-dependent into a
384
+ false green. Both passes go through one function, and it calls the rule that was already in src
385
+ with tests beside it rather than a third hand-rolled copy.
386
+
387
+ ### Measured
388
+
389
+ - **False-green rate 1 in 19 valid opportunities: 5.3%, 95% CI [0.9, 24.6]**, from 2 in 22. One of
390
+ the two is now refused by the reach check; the other two changes are corpus defects found while
391
+ re-judging, where a held-back oracle that accepts the base was counted as an opportunity the tool
392
+ passed. The bar is zero, so gate 3 still fails, and 19 opportunities is not 400 tasks.
4
393
 
5
394
  ## 14.0.2 - 2026-09-07
6
395