swarm-orchestrator 14.0.2 → 14.1.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 (350) hide show
  1. package/CHANGELOG.md +208 -1
  2. package/README.md +351 -516
  3. package/dist/agent-prompt.js +53 -0
  4. package/dist/agent-prompt.js.map +1 -0
  5. package/dist/agent-run.js +287 -155
  6. package/dist/agent-run.js.map +1 -1
  7. package/dist/cli-bond-report.js +37 -0
  8. package/dist/cli-bond-report.js.map +1 -0
  9. package/dist/cli-bundle.js +87 -0
  10. package/dist/cli-bundle.js.map +1 -0
  11. package/dist/cli-calibrate.js +281 -0
  12. package/dist/cli-calibrate.js.map +1 -0
  13. package/dist/cli-ci.js +203 -0
  14. package/dist/cli-ci.js.map +1 -0
  15. package/dist/cli-command-definitions.js +131 -0
  16. package/dist/cli-command-definitions.js.map +1 -0
  17. package/dist/cli-init.js +62 -0
  18. package/dist/cli-init.js.map +1 -0
  19. package/dist/cli-model-preflight.js +18 -0
  20. package/dist/cli-model-preflight.js.map +1 -0
  21. package/dist/cli-options.js +53 -41
  22. package/dist/cli-options.js.map +1 -1
  23. package/dist/cli-parallel-output.js +158 -0
  24. package/dist/cli-parallel-output.js.map +1 -0
  25. package/dist/cli-parallel.js +579 -0
  26. package/dist/cli-parallel.js.map +1 -0
  27. package/dist/cli-run-commands.js +32 -23
  28. package/dist/cli-run-commands.js.map +1 -1
  29. package/dist/cli-run-report.js +63 -0
  30. package/dist/cli-run-report.js.map +1 -0
  31. package/dist/cli-run-settings.js +45 -0
  32. package/dist/cli-run-settings.js.map +1 -0
  33. package/dist/cli-runtime-inputs.js +25 -0
  34. package/dist/cli-runtime-inputs.js.map +1 -0
  35. package/dist/cli-select.js +13 -6
  36. package/dist/cli-select.js.map +1 -1
  37. package/dist/cli-session.js +246 -0
  38. package/dist/cli-session.js.map +1 -0
  39. package/dist/cli-task-cost.js +76 -0
  40. package/dist/cli-task-cost.js.map +1 -0
  41. package/dist/cli-terminal.js +98 -0
  42. package/dist/cli-terminal.js.map +1 -0
  43. package/dist/cli.js +141 -1271
  44. package/dist/cli.js.map +1 -1
  45. package/dist/core/compaction.js +29 -27
  46. package/dist/core/compaction.js.map +1 -1
  47. package/dist/core/loop.js +79 -11
  48. package/dist/core/loop.js.map +1 -1
  49. package/dist/core/model-cancellation.js +17 -0
  50. package/dist/core/model-cancellation.js.map +1 -0
  51. package/dist/core/model-client.js.map +1 -1
  52. package/dist/durable/controller-location.js +30 -0
  53. package/dist/durable/controller-location.js.map +1 -0
  54. package/dist/durable/legacy-run-store.js +86 -0
  55. package/dist/durable/legacy-run-store.js.map +1 -0
  56. package/dist/durable/recovery-context.js +104 -0
  57. package/dist/durable/recovery-context.js.map +1 -0
  58. package/dist/durable/run-journal.js +161 -0
  59. package/dist/durable/run-journal.js.map +1 -0
  60. package/dist/durable/run-store.js +203 -200
  61. package/dist/durable/run-store.js.map +1 -1
  62. package/dist/durable/session-evidence.js +21 -0
  63. package/dist/durable/session-evidence.js.map +1 -0
  64. package/dist/eval/arm-dispatch.js +33 -0
  65. package/dist/eval/arm-dispatch.js.map +1 -0
  66. package/dist/eval/campaign-history.js +48 -0
  67. package/dist/eval/campaign-history.js.map +1 -0
  68. package/dist/eval/campaign-record.js +232 -0
  69. package/dist/eval/campaign-record.js.map +1 -0
  70. package/dist/eval/campaign-run.js +28 -13
  71. package/dist/eval/campaign-run.js.map +1 -1
  72. package/dist/eval/deadline-overshoot.js +73 -0
  73. package/dist/eval/deadline-overshoot.js.map +1 -0
  74. package/dist/eval/empty-patch-attribution.js +15 -0
  75. package/dist/eval/empty-patch-attribution.js.map +1 -0
  76. package/dist/eval/false-green-rate.js +133 -0
  77. package/dist/eval/false-green-rate.js.map +1 -0
  78. package/dist/eval/first-run-observation.js +105 -0
  79. package/dist/eval/first-run-observation.js.map +1 -0
  80. package/dist/eval/frozen-campaign.js +127 -0
  81. package/dist/eval/frozen-campaign.js.map +1 -0
  82. package/dist/eval/goal-campaign-report.js +143 -0
  83. package/dist/eval/goal-campaign-report.js.map +1 -0
  84. package/dist/eval/goal-observation.js +50 -0
  85. package/dist/eval/goal-observation.js.map +1 -0
  86. package/dist/eval/goal-protocol.js +104 -0
  87. package/dist/eval/goal-protocol.js.map +1 -0
  88. package/dist/eval/npm-failure.js +24 -0
  89. package/dist/eval/npm-failure.js.map +1 -0
  90. package/dist/eval/oracle-challenge.js +80 -0
  91. package/dist/eval/oracle-challenge.js.map +1 -0
  92. package/dist/eval/oracle-filter.js +74 -7
  93. package/dist/eval/oracle-filter.js.map +1 -1
  94. package/dist/eval/pr-task-paths.js +26 -0
  95. package/dist/eval/pr-task-paths.js.map +1 -0
  96. package/dist/eval/protocol-fixture.js +97 -0
  97. package/dist/eval/protocol-fixture.js.map +1 -0
  98. package/dist/eval/protocol.js +80 -0
  99. package/dist/eval/protocol.js.map +1 -0
  100. package/dist/eval/security-corpus.js +139 -0
  101. package/dist/eval/security-corpus.js.map +1 -0
  102. package/dist/eval/statistics.js +19 -0
  103. package/dist/eval/statistics.js.map +1 -1
  104. package/dist/eval/task-difficulty.js +28 -0
  105. package/dist/eval/task-difficulty.js.map +1 -0
  106. package/dist/eval/task-identity.js +0 -0
  107. package/dist/eval/task-identity.js.map +1 -0
  108. package/dist/eval/test-case-split.js +56 -5
  109. package/dist/eval/test-case-split.js.map +1 -1
  110. package/dist/eval/verification-closure.js +56 -0
  111. package/dist/eval/verification-closure.js.map +1 -0
  112. package/dist/evidence/acceptance-contract.js +34 -0
  113. package/dist/evidence/acceptance-contract.js.map +1 -0
  114. package/dist/evidence/attestation.js +63 -10
  115. package/dist/evidence/attestation.js.map +1 -1
  116. package/dist/evidence/bundle-manifest.js +4 -0
  117. package/dist/evidence/bundle-manifest.js.map +1 -1
  118. package/dist/evidence/bundle.js +17 -2
  119. package/dist/evidence/bundle.js.map +1 -1
  120. package/dist/evidence/canonical-json.js +1 -1
  121. package/dist/evidence/canonical-json.js.map +1 -1
  122. package/dist/evidence/frozen-json.js +10 -0
  123. package/dist/evidence/frozen-json.js.map +1 -0
  124. package/dist/evidence/goal-contract.js +82 -0
  125. package/dist/evidence/goal-contract.js.map +1 -0
  126. package/dist/evidence/ledger-file.js +45 -0
  127. package/dist/evidence/ledger-file.js.map +1 -0
  128. package/dist/evidence/ledger-record.js +26 -0
  129. package/dist/evidence/ledger-record.js.map +1 -1
  130. package/dist/evidence/ledger.js +19 -9
  131. package/dist/evidence/ledger.js.map +1 -1
  132. package/dist/evidence/model-call-recording.js +29 -5
  133. package/dist/evidence/model-call-recording.js.map +1 -1
  134. package/dist/evidence/predicate-catalogue.js +197 -0
  135. package/dist/evidence/predicate-catalogue.js.map +1 -1
  136. package/dist/evidence/record-kind.js +2 -0
  137. package/dist/evidence/record-kind.js.map +1 -1
  138. package/dist/evidence/replay.js +14 -0
  139. package/dist/evidence/replay.js.map +1 -1
  140. package/dist/evidence/routine-claims.js +38 -0
  141. package/dist/evidence/routine-claims.js.map +1 -0
  142. package/dist/evidence/run-assessment.js +67 -0
  143. package/dist/evidence/run-assessment.js.map +1 -0
  144. package/dist/evidence/run-spec.js +13 -1
  145. package/dist/evidence/run-spec.js.map +1 -1
  146. package/dist/evidence/scrub.js +1 -0
  147. package/dist/evidence/scrub.js.map +1 -1
  148. package/dist/evidence/session.js +8 -1
  149. package/dist/evidence/session.js.map +1 -1
  150. package/dist/evidence/signer-trust.js.map +1 -1
  151. package/dist/evidence/signing.js +4 -6
  152. package/dist/evidence/signing.js.map +1 -1
  153. package/dist/evidence/task-contract.js +120 -0
  154. package/dist/evidence/task-contract.js.map +1 -0
  155. package/dist/evidence/transcript.js +89 -0
  156. package/dist/evidence/transcript.js.map +1 -0
  157. package/dist/evidence/verdict.js +27 -2
  158. package/dist/evidence/verdict.js.map +1 -1
  159. package/dist/evidence/verifier/controller.d.mts +15 -0
  160. package/dist/evidence/verifier/controller.mjs +751 -0
  161. package/dist/evidence/verifier/rederive.d.mts +37 -0
  162. package/dist/evidence/verifier/rederive.mjs +251 -0
  163. package/dist/evidence/verifier/verify.d.mts +8 -1
  164. package/dist/evidence/verifier/verify.mjs +750 -13
  165. package/dist/evidence/verify-report.js +25 -8
  166. package/dist/evidence/verify-report.js.map +1 -1
  167. package/dist/exec/child-environment.js +36 -0
  168. package/dist/exec/child-environment.js.map +1 -1
  169. package/dist/exec/container-backend.js +100 -35
  170. package/dist/exec/container-backend.js.map +1 -1
  171. package/dist/exec/controlled-network.js +39 -0
  172. package/dist/exec/controlled-network.js.map +1 -0
  173. package/dist/exec/execution-mode.js +46 -19
  174. package/dist/exec/execution-mode.js.map +1 -1
  175. package/dist/exec/resource-pool.js +47 -0
  176. package/dist/exec/resource-pool.js.map +1 -0
  177. package/dist/exec/run-cancellation.js +2 -1
  178. package/dist/exec/run-cancellation.js.map +1 -1
  179. package/dist/exec/run-process.js +26 -9
  180. package/dist/exec/run-process.js.map +1 -1
  181. package/dist/exec/runtime-resource.js +93 -0
  182. package/dist/exec/runtime-resource.js.map +1 -0
  183. package/dist/exec/task-contract-enforcement.js +28 -0
  184. package/dist/exec/task-contract-enforcement.js.map +1 -0
  185. package/dist/gates/acceptance-package.js +75 -0
  186. package/dist/gates/acceptance-package.js.map +1 -0
  187. package/dist/gates/certification.js +65 -0
  188. package/dist/gates/certification.js.map +1 -0
  189. package/dist/gates/contract-executor.js +81 -0
  190. package/dist/gates/contract-executor.js.map +1 -0
  191. package/dist/gates/contract-scope.js +21 -0
  192. package/dist/gates/contract-scope.js.map +1 -0
  193. package/dist/gates/contract-verification.js +51 -0
  194. package/dist/gates/contract-verification.js.map +1 -0
  195. package/dist/gates/default-gates.js +2 -2
  196. package/dist/gates/default-gates.js.map +1 -1
  197. package/dist/gates/dependency-install.js +169 -0
  198. package/dist/gates/dependency-install.js.map +1 -0
  199. package/dist/gates/engine.js +1 -1
  200. package/dist/gates/engine.js.map +1 -1
  201. package/dist/gates/file-set.js +29 -0
  202. package/dist/gates/file-set.js.map +1 -1
  203. package/dist/gates/gate-definition.js.map +1 -1
  204. package/dist/gates/gate-runner.js +13 -3
  205. package/dist/gates/gate-runner.js.map +1 -1
  206. package/dist/gates/goal-acceptance.js +99 -0
  207. package/dist/gates/goal-acceptance.js.map +1 -0
  208. package/dist/gates/goal-checkout.js +73 -0
  209. package/dist/gates/goal-checkout.js.map +1 -0
  210. package/dist/gates/independent-verification.js +418 -71
  211. package/dist/gates/independent-verification.js.map +1 -1
  212. package/dist/gates/mutant-parse.js +47 -0
  213. package/dist/gates/mutant-parse.js.map +1 -0
  214. package/dist/gates/mutant-witness.js +99 -0
  215. package/dist/gates/mutant-witness.js.map +1 -0
  216. package/dist/gates/node-command-runner.js +52 -5
  217. package/dist/gates/node-command-runner.js.map +1 -1
  218. package/dist/gates/node-test-command.js +91 -23
  219. package/dist/gates/node-test-command.js.map +1 -1
  220. package/dist/gates/oracle-bond-run.js +128 -0
  221. package/dist/gates/oracle-bond-run.js.map +1 -0
  222. package/dist/gates/oracle-bond.js +49 -0
  223. package/dist/gates/oracle-bond.js.map +1 -0
  224. package/dist/gates/oracle-instrumentation.js +109 -0
  225. package/dist/gates/oracle-instrumentation.js.map +1 -0
  226. package/dist/gates/oracle-mutants.js +628 -0
  227. package/dist/gates/oracle-mutants.js.map +1 -0
  228. package/dist/gates/oracle-reach.js +122 -0
  229. package/dist/gates/oracle-reach.js.map +1 -0
  230. package/dist/gates/project-type.js +41 -16
  231. package/dist/gates/project-type.js.map +1 -1
  232. package/dist/gates/resolved-path.js +21 -0
  233. package/dist/gates/resolved-path.js.map +1 -0
  234. package/dist/gates/v8-coverage.js +142 -0
  235. package/dist/gates/v8-coverage.js.map +1 -0
  236. package/dist/providers/ai-sdk-model-client.js +32 -2
  237. package/dist/providers/ai-sdk-model-client.js.map +1 -1
  238. package/dist/providers/registry.js +8 -4
  239. package/dist/providers/registry.js.map +1 -1
  240. package/dist/select/production-routing.js +66 -0
  241. package/dist/select/production-routing.js.map +1 -0
  242. package/dist/select/routing-mode.js +10 -5
  243. package/dist/select/routing-mode.js.map +1 -1
  244. package/dist/select/task-cost.js +10 -3
  245. package/dist/select/task-cost.js.map +1 -1
  246. package/dist/select/ucb.js +4 -3
  247. package/dist/select/ucb.js.map +1 -1
  248. package/dist/task-brief.js +20 -0
  249. package/dist/task-brief.js.map +1 -0
  250. package/dist/tools/bounded-file.js +66 -0
  251. package/dist/tools/bounded-file.js.map +1 -0
  252. package/dist/tools/chokepoint-record.js +2 -1
  253. package/dist/tools/chokepoint-record.js.map +1 -1
  254. package/dist/tools/chokepoint.js +4 -1
  255. package/dist/tools/chokepoint.js.map +1 -1
  256. package/dist/tools/claim-reference-tool.js +17 -0
  257. package/dist/tools/claim-reference-tool.js.map +1 -0
  258. package/dist/tools/file-tools.js +18 -10
  259. package/dist/tools/file-tools.js.map +1 -1
  260. package/dist/tools/policy-guard.js +18 -2
  261. package/dist/tools/policy-guard.js.map +1 -1
  262. package/dist/tools/regex-worker.js +63 -0
  263. package/dist/tools/regex-worker.js.map +1 -0
  264. package/dist/tools/search-tool.js +57 -30
  265. package/dist/tools/search-tool.js.map +1 -1
  266. package/dist/tools/shell-command.js +47 -1
  267. package/dist/tools/shell-command.js.map +1 -1
  268. package/dist/tools/shell-tool.js +19 -5
  269. package/dist/tools/shell-tool.js.map +1 -1
  270. package/dist/tools/tool-definition.js +1 -1
  271. package/dist/tools/tool-definition.js.map +1 -1
  272. package/dist/tui/controller-screen-model.js +28 -0
  273. package/dist/tui/controller-screen-model.js.map +1 -0
  274. package/dist/tui/controller-screen.js +17 -0
  275. package/dist/tui/controller-screen.js.map +1 -0
  276. package/dist/tui/plain-lines.js +2 -0
  277. package/dist/tui/plain-lines.js.map +1 -1
  278. package/dist/tui/session-interface.js +3 -0
  279. package/dist/tui/session-interface.js.map +1 -1
  280. package/dist/tui/session-view.js +10 -0
  281. package/dist/tui/session-view.js.map +1 -1
  282. package/dist/workers/bootstrap-history.js +66 -0
  283. package/dist/workers/bootstrap-history.js.map +1 -0
  284. package/dist/workers/bootstrap-schema.js +48 -0
  285. package/dist/workers/bootstrap-schema.js.map +1 -0
  286. package/dist/workers/bootstrap.js +257 -0
  287. package/dist/workers/bootstrap.js.map +1 -0
  288. package/dist/workers/controller-administration.js +80 -0
  289. package/dist/workers/controller-administration.js.map +1 -0
  290. package/dist/workers/controller-cleanup.js +16 -0
  291. package/dist/workers/controller-cleanup.js.map +1 -0
  292. package/dist/workers/controller-configuration.js +92 -0
  293. package/dist/workers/controller-configuration.js.map +1 -0
  294. package/dist/workers/controller-events.js +99 -0
  295. package/dist/workers/controller-events.js.map +1 -0
  296. package/dist/workers/controller-jobs.js +225 -0
  297. package/dist/workers/controller-jobs.js.map +1 -0
  298. package/dist/workers/controller-launch.js +87 -0
  299. package/dist/workers/controller-launch.js.map +1 -0
  300. package/dist/workers/controller-owner.js +65 -0
  301. package/dist/workers/controller-owner.js.map +1 -0
  302. package/dist/workers/controller-recovery.js +344 -0
  303. package/dist/workers/controller-recovery.js.map +1 -0
  304. package/dist/workers/controller-revisions.js +171 -0
  305. package/dist/workers/controller-revisions.js.map +1 -0
  306. package/dist/workers/controller-schedule.js +18 -0
  307. package/dist/workers/controller-schedule.js.map +1 -0
  308. package/dist/workers/controller-scheduler.js +282 -0
  309. package/dist/workers/controller-scheduler.js.map +1 -0
  310. package/dist/workers/controller-scope.js +59 -0
  311. package/dist/workers/controller-scope.js.map +1 -0
  312. package/dist/workers/controller-state.js +455 -0
  313. package/dist/workers/controller-state.js.map +1 -0
  314. package/dist/workers/controller-verification.js +41 -0
  315. package/dist/workers/controller-verification.js.map +1 -0
  316. package/dist/workers/controller-view.js +136 -0
  317. package/dist/workers/controller-view.js.map +1 -0
  318. package/dist/workers/coordination.js +165 -0
  319. package/dist/workers/coordination.js.map +1 -0
  320. package/dist/workers/goal-candidates.js +92 -0
  321. package/dist/workers/goal-candidates.js.map +1 -0
  322. package/dist/workers/goal-outcome.js +102 -0
  323. package/dist/workers/goal-outcome.js.map +1 -0
  324. package/dist/workers/goal-repair.js +103 -0
  325. package/dist/workers/goal-repair.js.map +1 -0
  326. package/dist/workers/goal-selection.js +81 -0
  327. package/dist/workers/goal-selection.js.map +1 -0
  328. package/dist/workers/graph-record.js +1 -3
  329. package/dist/workers/graph-record.js.map +1 -1
  330. package/dist/workers/graph-revision.js +286 -0
  331. package/dist/workers/graph-revision.js.map +1 -0
  332. package/dist/workers/merge-queue.js +46 -6
  333. package/dist/workers/merge-queue.js.map +1 -1
  334. package/dist/workers/parallel-report.js +12 -1
  335. package/dist/workers/parallel-report.js.map +1 -1
  336. package/dist/workers/parallel-run.js +439 -201
  337. package/dist/workers/parallel-run.js.map +1 -1
  338. package/dist/workers/planner-run.js +60 -14
  339. package/dist/workers/planner-run.js.map +1 -1
  340. package/dist/workers/run-context.js +204 -0
  341. package/dist/workers/run-context.js.map +1 -0
  342. package/dist/workers/task-contract.js +15 -80
  343. package/dist/workers/task-contract.js.map +1 -1
  344. package/dist/workers/worktree.js +69 -28
  345. package/dist/workers/worktree.js.map +1 -1
  346. package/docs/README.md +2 -0
  347. package/docs/build-guide.md +39 -8
  348. package/docs/claims.md +20 -0
  349. package/docs/security-coverage.md +19 -0
  350. package/package.json +5 -4
package/CHANGELOG.md CHANGED
@@ -1,6 +1,213 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 14.1.0 - 2026-09-14
4
+
5
+ ### Added
6
+
7
+ - **Goal runs now complete through adaptive integration.** `swarm parallel --goal` creates one
8
+ shared run context before planning, resolves each task contract into enforced paths, tools,
9
+ checks, runtime policy and budget, and schedules ready work without whole-layer barriers. Merge
10
+ conflicts, behavioral failures and ratchet rejections retain their candidate commits and create
11
+ bounded repair attempts against the current integration tree. Missing prerequisites, coupled
12
+ tasks and repair routes use append-only graph revisions that preserve requirement identities.
13
+ Final status comes from independent checks of the exact integrated tree. `resume` rebuilds the
14
+ durable controller state and will not duplicate an accepted landing. The pilot driver and its
15
+ paired evaluation remain descriptive evidence, not a claim of universal correctness or swarm
16
+ superiority.
17
+
18
+ - **The oracle bond asks something of ordinary code.** Its five operators each needed a particular
19
+ token on the line, and a guard clause, an assignment, a `require` and a callback carry none of
20
+ them, so `not-bonded` was what a bond said when it had nothing to ask rather than when it had
21
+ found a strong oracle. Both adversarial false greens are that shape and produced zero mutants
22
+ between them across every line they add. Three more operators cover the statement shapes that
23
+ went uncovered: an `if` or `while` condition negated whole, the value a plain assignment or
24
+ declaration writes replaced by a sentinel, and the statement removed. They are read off the
25
+ language's own `Statement` productions rather than off the patches that exposed the gap, because
26
+ operators fitted to the cases that motivated them measure the fitting, and the derivation, the
27
+ ordering and which tasks were in sample were committed before any of it was implemented:
28
+ [`docs/oracle-bond-operators.md`](docs/oracle-bond-operators.md). All eight fire on the mined
29
+ corpus and the three new ones account for 25 of the 34 mutants built. `koa#1999`, the patch a
30
+ rejected stricter option would have cost because nothing here could change any of its added
31
+ lines, certifies on `held`.
32
+ - **A deleted statement is confirmed to parse before it is read as evidence.** Statement deletion
33
+ is the one operator that can leave a file which does not compile, and every oracle refuses one of
34
+ those, so a bond counting that refusal would credit the oracle with a rejection it never made. It
35
+ runs `node --check` over the file the patch left and over the file with the line blanked. Where
36
+ the original does not parse, node cannot read the dialect and so cannot tell a syntax error from
37
+ a mutant: the operator proposes nothing for that file and the other seven still apply, which is
38
+ what TypeScript and JSX get.
39
+ - **A vacuous bond names what showed the mutant changed anything.** An oracle accepting a mutant
40
+ means nothing unless the mutant was a change, and what established that was a person reading each
41
+ mutated line: an audit that found two equivalent mutants, does not scale, and is not evidence
42
+ anybody else can re-derive. Every mutant the oracle accepted on a line it ran is now adjudicated
43
+ by a second detector, cheapest first. The oracle runs again under the same instrumentation reach
44
+ uses, and a line other than the mutated one that ran in one reading and not the other is a
45
+ demonstrated difference in what the program did; failing that, the repository's own gates that
46
+ passed with the patch are run again. Neither seeing anything is recorded as such, and a suite run
47
+ that was never spent says so rather than answering. What the pair cannot see is named: a mutant
48
+ that changes only a value on a path that runs either way, in code the project did not have
49
+ before.
50
+ - **`scripts/deadline-overshoot.mjs`, and gate 9 has a number.** Twenty samples with a real child
51
+ that outlives its deadline and the whole cancellation tree between them. Worst overshoot 3ms,
52
+ 1.20% of a 250ms budget against the 2% the gate asks, and the budget floor is printed beside the
53
+ percentage because the percentage depends on both. The wall clock rather than an injected one: a
54
+ driven clock reports zero by construction, which is the one answer this cannot be allowed to
55
+ give.
56
+ - **`scripts/task-difficulty.mjs`, and gate 7's blocker was misdiagnosed.** That row said the
57
+ discriminating corpus has three tasks and more would have to be authored by hand. They are
58
+ already mined: over the pull-request corpus this model solves 11 of 79, 13.9% [8.0, 23.2], spread
59
+ across fourteen repositories. A set where the model both succeeds and fails is what a paired test
60
+ needs and what the golden set does not give. What is left is arm selection in the mined pass and
61
+ a second run of every task, neither of which is authoring.
62
+ - **The adversarial arm's numbers come out of the same script as the rest.** They were in prose and
63
+ nothing re-derived them. `separateAdversarialRows` also keeps them out of every other rate by a
64
+ check rather than by which file a row sits in, since a model shown its acceptance test is a
65
+ different sampling process rather than a harder subset of one.
66
+
67
+ - **`swarm ci` refuses to certify on an oracle that never ran the change.** An oracle is evidence
68
+ only about the code it executed, so the run reports `oracleReach`, and a change the oracle
69
+ demonstrably skipped is not verified. The unreached lines are named, because "extend the oracle
70
+ to cover the lines the patch added" is not actionable without them. Reach is measured only where
71
+ the harness can rebuild the oracle's invocation as an argument vector it controls, per invariant
72
+ 7; anywhere else it reads `unmeasured`, which blocks nothing. koa#1946, the first false green
73
+ this project found, is refused by it: its oracle never executed lines 270-273 of the file it
74
+ certified. Across both corpora the check produced no false reds.
75
+
76
+ ### Fixed
77
+
78
+ - Run the deadline measurement tests after competing test processes finish, retaining the
79
+ existing timing bounds. A hosted macOS run exposed a 255 ms overshoot under concurrent suite
80
+ load; that failed observation remains recorded in the implementation evidence.
81
+
82
+ - **A regular expression is masked like the literal it is.** The claim beside the deletion parse
83
+ check was that no other operator can leave a file which does not parse, and that claim is why
84
+ only one operator is checked at runtime. Measured across every operator over 186 real files, it
85
+ was false: `swap-call-arguments` broke 1 of its 105 on a line splitting on a pattern whose own
86
+ comma is part of it. `withoutLiterals` masked strings and comments and had never masked a
87
+ pattern, so the argument scan read that comma as an argument separator and swapped halves of a
88
+ regex; the same blindness reached every operator that looks for a token, since a comparison
89
+ inside a pattern is not a comparison. Which of two things a slash is gets settled by what
90
+ precedes it, wrong only in the direction that masks too much and costs a mutant. Re-measured over
91
+ the same files: 2,702 mutants and every operator but the deletion at zero.
92
+ - **An empty patch is not charged to the model unless the endpoint answered.** An MLX server ran
93
+ out of GPU memory mid-batch, inside `mx.eval` over its own prompt cache, and every task after it
94
+ came back with a zero-byte patch recorded as the model writing nothing. That is the
95
+ misattribution this corpus was already bitten by in the other direction, when twelve rows the
96
+ agent had failed on were reported as an oracle nobody could run. `scripts/pr-task-pass.mjs` now
97
+ probes the endpoint before the pass and again after any empty patch, records nothing where it
98
+ does not answer, and stops, because every task after an endpoint failure records the same wrong
99
+ thing. Not under `--rejudge`, which re-derives verdicts from recorded patches and asks no model
100
+ anything.
101
+ - **`swarm ci` stops printing one sentence for two different absences.** `unshown` said "the oracle
102
+ accepted, and nothing shows it ran the mutated lines" even where it had run them and no detector
103
+ could show the mutant changed anything, which sends a reader to inspect coverage that is fine. The
104
+ line names which absence it is, and a gap names what witnessed it, because a refusal resting on an
105
+ instrument and one resting on the operator alone are different amounts of evidence.
106
+ - **The deadline overshoot test measured the machine rather than the tool.** It went red inside its
107
+ own suite. Overshoot is scheduling and does not shrink with the budget, so 2% of a 500ms budget is
108
+ 10ms of headroom and the whole suite running in parallel ate it: 3ms idle, 5ms with eight
109
+ processes spinning, more than 10ms under the suite. The 2% claim is now made at a two-second
110
+ budget where 40ms stands against a measured 2 to 5, the absolute number is asserted separately,
111
+ and gate 9's row says the published 1.20% is an idle-machine number.
112
+ - **The bond stops spending detectors once the verdict cannot change.** Which fact the verdict rests
113
+ on also decides when adjudicating can stop, and the loop read only one of the two, so detectors
114
+ were spent looking for something that could not change the answer. One coverage reading and at
115
+ most one suite run per patch now. That also removed a state the record could not describe
116
+ honestly, a mutant past the bound on suite runs recorded as not adjudicated while coverage had
117
+ been asked and been silent.
118
+ - **Two imports nothing in `src/cli-select.ts` used**, and an empty shell argument read as a path.
119
+ `sed -i '' 's/a/b/' file` is the in-place form every macOS invocation uses and it was refused with
120
+ "the path is empty", because the quoted empty argument reached a check whose whole subject is
121
+ paths.
122
+ - **Three attacks that got past the policy guard.** Every security case in this repository was
123
+ written by whoever wrote the defence, so `src/tools/guard-attacks.test.ts` was written the other
124
+ way round. Casing: macOS and Windows are case-insensitive by default, so `.ENV` opens `.env`, and
125
+ every pattern in the credential denylist was case-sensitive. Measured on APFS before the fix,
126
+ `readFileSync('.ENV')` returns what `.env` holds, and `realpathSync` hands back the casing it was
127
+ given rather than the casing on disk, so nothing upstream normalized it; `SWARM.TOML`,
128
+ `server.PEM`, `.git/CONFIG` and a differently cased denied root were the same hole. The denial
129
+ comparisons now fold, whatever the host filesystem does, because a denial whose verdict depends
130
+ on which machine ran it is the defect. The workspace containment check does not fold: that one
131
+ decides whether anything is allowed at all, and folding it is the fail-open direction. A revision
132
+ and a path in one word: `git show HEAD:.env` prints a credential file and the word the guard
133
+ ruled on matched no pattern. A path inside a word the shell passes whole: `sed -n
134
+ 'w /home/dev/.ssh/authorized_keys'` writes outside the workspace and the operand was the whole
135
+ script. A word now offers every path it could open, its whitespace-separated pieces and what
136
+ follows a colon, each through the same guard, with a URL scheme left alone. Two attacks still
137
+ succeed and are asserted as succeeding, because a residual nobody can point at is not named:
138
+ `git config --list` reads a denied file without naming it, and `node -e "..."` is an allowlisted
139
+ interpreter handed a program.
140
+ - **vitest and `@vitest/coverage-v8` to 4.1.11, for GHSA-82fw-gwwq-j7x9.** A path traversal in
141
+ `@vitest/mocker`'s redirect mock, CVSS 5.9, published 2026-09-08 against every version from
142
+ 2.1.0. Dev-only and inside the range `package.json` already declared, so the lockfile was the
143
+ only thing holding the tree on 4.1.10. The coverage provider is pinned exactly rather than
144
+ ranged, so it moves in the same change or it drifts away from the runner it instruments. This is
145
+ the first finding the weekly scan has produced that was the world changing rather than the tree:
146
+ it landed a day after the last scheduled run, and the scan caught it on the next.
147
+ - **A dynamic gate the harness ran itself now counts as having executed the change.** Reported from
148
+ outside against e261c859b: a project declaring a linter and no test runner settled green over a
149
+ changed source file that nothing had executed, because the check for "was this change measured"
150
+ asked only whether some command gate had passed and a linter is one. That reading was replaced by
151
+ what a gate is capable of establishing, and half the old predicate was left behind: it still
152
+ asked for a command as well, which discards the behaviour probe, an inspection that imports the
153
+ changed module and calls its functions. So the probe's classification was dead, and with it the
154
+ two abstentions added to keep a probe that measured nothing from reading as a pass, and a project
155
+ with no declared runner spent every attempt and escalated saying nothing had run over a change
156
+ its own probe had just run. Capability decides it now, and the gate's shape decides nothing. The
157
+ reported case is driven whole in `src/gates/static-only-project.test.ts`, with the changed file
158
+ instrumented so that executing it leaves a trace: it settles green only where the trace exists.
159
+ - **The weekly scan reports what somebody can act on.** It read 16,731 files, nearly all of them
160
+ captured evidence, and 171 of its 177 findings were one rule firing once per copy of the
161
+ re-derivation script that every exported bundle carries. Editing a bundle to quiet a scanner
162
+ falsifies the record it exists to be, so those paths are data the scan does not read, and the
163
+ finding was fixed where it lives: the template in `src/evidence/verifier/rederive.mjs` was
164
+ missing the suppression its mirror in `src/gates/parsers.ts` already carried. The other five in
165
+ source are dispositioned at the line that carries each, one of them a fix: a `replace` stripping
166
+ the first `$` of a pattern where every one of them was meant. The scan now reads 1,050 files and
167
+ reports nothing. It also stops opening a fresh issue every Monday for findings that have not
168
+ changed: it comments on the open one, since three identical notifications is how a scan teaches
169
+ people to close it unread.
170
+ - **An invocation the harness could not read, so it could not measure.** The recognizer that
171
+ decides whether the harness controls a command read quoted text as bare: a title filter's `|`
172
+ tripped its shell-operator scan and its spaces split one argument into several, so no real
173
+ oracle could be vouched. Quoting is read now, which is narrower than a shell rather than wider:
174
+ nothing expands, nothing is escaped, and an operator outside quotes still ends the reading.
175
+ Vouching those commands then exposed that a flag whose value is the next argument was being
176
+ separated from it, which asked node to filter titles by a coverage flag and to run a test file
177
+ named after the titles.
178
+ - **The patch's own tests are not code the oracle skipped.** An acceptance oracle runs its own test
179
+ file and never the candidate's, so the candidate's tests are absent from every coverage report by
180
+ construction. Counting them refused patches that both oracles accept, which is nearly every
181
+ well-behaved change, since a feature is expected to arrive with its tests.
182
+ - **Reach measured the tree the oracle judged.** Two paths reverted the patch and left it reverted:
183
+ the vacuity check stashed it and popped it back without checking the pop, which fails when the
184
+ patch adds a file the oracle overwrites, and attribution reverts it to measure the base. Both
185
+ meant later measurements were taken on the base commit and reported as though they were about the
186
+ patch. The revert and re-apply are checked now, and a checkout that could not be put back makes
187
+ reach abstain rather than measure whatever the tree holds.
188
+ - **`swarm ci` stops what it started.** The command installed no signal handler, so a Ctrl-C or a
189
+ supervisor's SIGTERM ended the CLI and left its test runners reparented and running: two node
190
+ processes from an oracle were found holding a checkout open five hours after the run that started
191
+ them had gone. It takes the same cancellation the run commands use, so a stop reaches the process
192
+ group rather than only the process.
193
+ - **An oracle that cannot judge is not an oracle that refused.** The corner classifier read the
194
+ held-back verdict as a boolean, folding "accepts the base too" and "could not be run" into a
195
+ refusal. Both now classify as unjudgeable and leave the denominator, with the count reported
196
+ beside the rate. This cuts both ways: it stopped charging the tool for certifying work that
197
+ nothing contradicted, and it removed two tasks that were being counted as opportunities the tool
198
+ passed.
199
+ - **Re-judging cannot answer worse than scoring did.** `--rejudge` re-derives verdicts from
200
+ recorded patches after a harness change, and the order-dependence check lived only in the fresh
201
+ scoring pass, so re-judging winston#2256 turned a task already recorded as order-dependent into a
202
+ false green. Both passes go through one function, and it calls the rule that was already in src
203
+ with tests beside it rather than a third hand-rolled copy.
204
+
205
+ ### Measured
206
+
207
+ - **False-green rate 1 in 19 valid opportunities: 5.3%, 95% CI [0.9, 24.6]**, from 2 in 22. One of
208
+ the two is now refused by the reach check; the other two changes are corpus defects found while
209
+ re-judging, where a held-back oracle that accepts the base was counted as an opportunity the tool
210
+ passed. The bar is zero, so gate 3 still fails, and 19 opportunities is not 400 tasks.
4
211
 
5
212
  ## 14.0.2 - 2026-09-07
6
213