@iowarp/clio-coder 0.4.1 → 0.4.3

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 (604) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/CONTRIBUTING.md +142 -52
  3. package/README.md +434 -473
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-ZILU3AUO.js → acp-H2NGRPWO.js} +12 -12
  6. package/dist/{agents-HYWGBGQR.js → agents-TL5LLUQP.js} +56 -55
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-N3QT7CBO.js → auth-E5SW4HMS.js} +23 -21
  9. package/dist/builtins-IA7V7FUC.js +22 -0
  10. package/dist/{chunk-7RY5VZPH.js → chunk-2APPQIER.js} +8 -8
  11. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  12. package/dist/{chunk-JA5QWE4Z.js → chunk-2UG5F4C5.js} +1973 -1664
  13. package/dist/{chunk-5YHDIDBP.js → chunk-2UH2KFUP.js} +2 -2
  14. package/dist/{chunk-CTJ4RNAA.js → chunk-2VIKGWFZ.js} +2 -2
  15. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  16. package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
  17. package/dist/chunk-3EBYEESD.js +314 -0
  18. package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
  19. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  20. package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
  21. package/dist/chunk-4UVU7BJ5.js +39 -0
  22. package/dist/{chunk-VKRH2TCS.js → chunk-4WR7VSYB.js} +2 -2
  23. package/dist/{chunk-BBTJOK6Y.js → chunk-54CBCGIR.js} +5 -5
  24. package/dist/{chunk-AP73CFDC.js → chunk-5ICU3EUH.js} +2 -2
  25. package/dist/chunk-5MEZN6CB.js +1334 -0
  26. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  27. package/dist/{chunk-ABLSQ6JX.js → chunk-64I3JVYM.js} +8 -2
  28. package/dist/{chunk-AFKWHWXF.js → chunk-6PTFB5VS.js} +39 -22
  29. package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
  30. package/dist/chunk-7DRAWPTZ.js +360 -0
  31. package/dist/chunk-7E7I3WLS.js +3762 -0
  32. package/dist/{chunk-BJGUKIG4.js → chunk-7ZYNNDKC.js} +7 -7
  33. package/dist/{chunk-XKA2ICR3.js → chunk-AF4YM7Z4.js} +652 -252
  34. package/dist/{chunk-GVQJ5CCZ.js → chunk-AX2THNSA.js} +12 -12
  35. package/dist/{chunk-IG7BCQBA.js → chunk-B4OAX3SI.js} +65 -3
  36. package/dist/{chunk-TD3PGPQA.js → chunk-B4VEBZKF.js} +3 -3
  37. package/dist/{chunk-74YWRRU5.js → chunk-BEPZRGGU.js} +10 -10
  38. package/dist/{chunk-FEFIFZTL.js → chunk-CE5AX47J.js} +2 -2
  39. package/dist/{chunk-UAPGZHYC.js → chunk-DWUOQKRU.js} +25 -11
  40. package/dist/{chunk-THYWACCR.js → chunk-E3TPLWFX.js} +3 -3
  41. package/dist/{chunk-7EPLI7VL.js → chunk-EKCHAPYA.js} +2 -2
  42. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  43. package/dist/{chunk-PJJ6MY27.js → chunk-F5JHEYZM.js} +7 -7
  44. package/dist/{chunk-6CCS4G3W.js → chunk-FTMGRKEF.js} +3 -3
  45. package/dist/{chunk-SINK3QR6.js → chunk-G76U63X4.js} +17 -17
  46. package/dist/{chunk-EIMVLWB3.js → chunk-GHS5EBTQ.js} +64 -9
  47. package/dist/{chunk-QMXC4JB7.js → chunk-GI7YYQ3F.js} +187 -1419
  48. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  49. package/dist/{chunk-6HMJX2VU.js → chunk-GWZNEVM2.js} +44 -12
  50. package/dist/chunk-GYV6VZOC.js +26 -0
  51. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  52. package/dist/{chunk-UXN6JT4W.js → chunk-HEQY7ZFI.js} +3 -3
  53. package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
  54. package/dist/{chunk-GCSMB2KY.js → chunk-I7ZPNEJM.js} +145 -102
  55. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  56. package/dist/{chunk-QTFGO774.js → chunk-IGLP3ODT.js} +29 -16
  57. package/dist/chunk-IJNZMHLA.js +101 -0
  58. package/dist/{chunk-BDPT6GTK.js → chunk-INY6HTFL.js} +7 -7
  59. package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
  60. package/dist/{chunk-6NJQITNH.js → chunk-IWT4SF4R.js} +6 -3
  61. package/dist/{chunk-R23Z6K6I.js → chunk-JDAY6FIL.js} +19 -19
  62. package/dist/chunk-JEQ3XTHC.js +42 -0
  63. package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
  64. package/dist/{chunk-TVH4ONAM.js → chunk-JKKCYP3C.js} +10 -10
  65. package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
  66. package/dist/{chunk-C537JADH.js → chunk-KK4JZPBQ.js} +19 -141
  67. package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
  68. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  69. package/dist/{chunk-6DWBAZ5U.js → chunk-L47TF46W.js} +5 -7
  70. package/dist/{chunk-HUAS7ITX.js → chunk-LDJG7DW3.js} +91 -42
  71. package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
  72. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  73. package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
  74. package/dist/{chunk-VKFQTNDV.js → chunk-MUW2BDDH.js} +4 -4
  75. package/dist/{chunk-E67WX76H.js → chunk-MWUZBSAQ.js} +104 -152
  76. package/dist/{chunk-OJTRZGR3.js → chunk-N2Z7HLVY.js} +21 -21
  77. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  78. package/dist/{chunk-FYUN5KZ3.js → chunk-NIQJ66N4.js} +21 -21
  79. package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
  80. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  81. package/dist/{chunk-VEGN6WIQ.js → chunk-O5CVSAG5.js} +3 -3
  82. package/dist/{chunk-MOPSG2X7.js → chunk-OML5D5V5.js} +8 -8
  83. package/dist/{chunk-2VG7KLYV.js → chunk-PAJQJ7BS.js} +5816 -3255
  84. package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
  85. package/dist/{chunk-BTGG6BG2.js → chunk-QWGDJJYJ.js} +158 -19
  86. package/dist/chunk-R6Q67RJH.js +134 -0
  87. package/dist/{chunk-ZJLUDYFY.js → chunk-RRNP2ANY.js} +6 -6
  88. package/dist/{chunk-PVAMAVBB.js → chunk-RSJ25QSL.js} +102 -2
  89. package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
  90. package/dist/chunk-SKHCAU7K.js +385 -0
  91. package/dist/chunk-SZAA6XDG.js +30 -0
  92. package/dist/{chunk-J4HBWF6Y.js → chunk-TM6LQDI3.js} +131 -28
  93. package/dist/chunk-UOIZ7DA4.js +41 -0
  94. package/dist/{chunk-MA3H6DM5.js → chunk-UPZU6GE4.js} +25 -3
  95. package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
  96. package/dist/{chunk-N5UK64DP.js → chunk-V2ANDPVT.js} +4 -4
  97. package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
  98. package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
  99. package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
  100. package/dist/{chunk-QKIFBZKT.js → chunk-VW6DOEDG.js} +497 -81
  101. package/dist/{chunk-SCYB3HA4.js → chunk-W6RRQCPQ.js} +63 -19
  102. package/dist/{chunk-2NM363SV.js → chunk-WBKFA554.js} +10 -10
  103. package/dist/{chunk-R32CLGZ6.js → chunk-WCXUNS7U.js} +82 -21
  104. package/dist/{chunk-GPPB3JBE.js → chunk-WRBAGUNF.js} +3 -3
  105. package/dist/{chunk-IXJT6DCX.js → chunk-XIVNBFZS.js} +85 -30
  106. package/dist/{chunk-UEDMSP56.js → chunk-XPWWI35G.js} +417 -201
  107. package/dist/chunk-XRZT5WY5.js +47 -0
  108. package/dist/{chunk-3QSOM6PA.js → chunk-Y3CBHOR6.js} +2 -2
  109. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  110. package/dist/{chunk-AKB4GYDL.js → chunk-YQWYVTMC.js} +5 -5
  111. package/dist/{chunk-6I5ILFOF.js → chunk-ZA4VCIGV.js} +3 -3
  112. package/dist/{chunk-7OBGU7UB.js → chunk-ZDN3Y73Y.js} +12 -18
  113. package/dist/{chunk-3I5NY75V.js → chunk-ZWPRK62N.js} +8 -5
  114. package/dist/cli/index.js +41 -39
  115. package/dist/{clio-IT3G3VQH.js → clio-CMMK4KRR.js} +9 -9
  116. package/dist/{code-nav-RK6S7F6E.js → code-nav-MDZNQS33.js} +89 -21
  117. package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
  118. package/dist/{config-3QZRWZJF.js → config-SVM5P5YI.js} +131 -84
  119. package/dist/{configure-FL7Y3KJF.js → configure-LE3IK2TJ.js} +28 -26
  120. package/dist/{context-5HE7ODYK.js → context-2OHRKS42.js} +69 -64
  121. package/dist/{context-KYQFRVDC.js → context-E3VC7RX5.js} +15 -11
  122. package/dist/{context-XNHL75JV.js → context-VNCR7KAG.js} +93 -65
  123. package/dist/{context-clear-N545L53A.js → context-clear-BW4O37TG.js} +64 -60
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-QHKXSV2F.js → context-working-set-VDS25HXZ.js} +19 -18
  126. package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-5AHT53RF.js} +93 -82
  127. package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
  128. package/dist/{doctor-ZGPEGHIP.js → doctor-WNNVO6FY.js} +48 -47
  129. package/dist/{eval-GXLL44RD.js → eval-7G7SGAYO.js} +287 -115
  130. package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-Y6QRFOH5.js} +4 -4
  131. package/dist/{evidence-HWLBRH3Q.js → evidence-VD6736FQ.js} +67 -64
  132. package/dist/{evolve-FTZBMNVW.js → evolve-AL3NGVRL.js} +65 -62
  133. package/dist/{extensions-VHRBEID7.js → extensions-MOVJ32NM.js} +9 -7
  134. package/dist/{fleet-CKZHJWZJ.js → fleet-QZHUMAGI.js} +114 -111
  135. package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-BAYT5FJZ.js} +10 -10
  136. package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-IREVMRU4.js} +7 -6
  137. package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-YCTT3HTI.js} +22 -19
  138. package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-QVJTDAVB.js} +58 -55
  139. package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-25QAFPK4.js} +4 -4
  140. package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-5O57AAJ7.js} +26 -23
  141. package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-CPH2W2T6.js} +59 -56
  142. package/dist/{fleet-view-WAMJYNDT.js → fleet-view-SWBR3VGQ.js} +58 -55
  143. package/dist/{init-5XQRBOFV.js → init-J477LKZH.js} +82 -79
  144. package/dist/{interop-34TVO25M.js → interop-3FCM6XLG.js} +11 -11
  145. package/dist/{library-3QY6KF57.js → library-QUQEIUG6.js} +30 -27
  146. package/dist/{memory-L4UTIIIW.js → memory-SGGSEP65.js} +67 -64
  147. package/dist/{models-ZVX3QOWE.js → models-HEKUAXXK.js} +53 -46
  148. package/dist/{monitor-CEKVSYTS.js → monitor-HKU57TYQ.js} +63 -60
  149. package/dist/{orchestrator-77BAP6BC.js → orchestrator-VDFAEFAI.js} +1831 -1057
  150. package/dist/{panes-7STHOAUJ.js → panes-DN2SSFOH.js} +5 -5
  151. package/dist/{panes-SHAUIRXY.js → panes-TALGNPZT.js} +29 -14
  152. package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
  153. package/dist/reset-EAJFFJVB.js +344 -0
  154. package/dist/{resources-74GKTLSF.js → resources-OVKSEFVE.js} +29 -20
  155. package/dist/{run-HBAUJNNZ.js → run-7DP7ZF2J.js} +120 -115
  156. package/dist/{share-G3APVLVP.js → share-WML67FT3.js} +32 -27
  157. package/dist/{skills-35HHUKCR.js → skills-SG662R2K.js} +41 -31
  158. package/dist/{skills-eval-QN4HSHDC.js → skills-eval-VVZEUU46.js} +78 -77
  159. package/dist/{skills-inventory-J357J34F.js → skills-inventory-I2E23GET.js} +23 -20
  160. package/dist/{slash-commands-JZZCQA32.js → slash-commands-S7MBJDQK.js} +40 -36
  161. package/dist/{steer-XAVHJM22.js → steer-2LQOMCPB.js} +3 -3
  162. package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
  163. package/dist/{targets-DSM6CY3M.js → targets-4QC3HIEW.js} +54 -54
  164. package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-TUHIJ6Y2.js} +5 -5
  165. package/dist/{tools-MKNWVPBH.js → tools-TFGJICCU.js} +10 -10
  166. package/dist/{trace-ECQ7TIYZ.js → trace-FXMXUZUF.js} +55 -7
  167. package/dist/uninstall-5PEVOE5B.js +408 -0
  168. package/dist/upgrade-M4WXY6KN.js +303 -0
  169. package/dist/{usage-X52N3IDJ.js → usage-N7ZNVLEM.js} +151 -104
  170. package/dist/{verifiers-EJTVVSMA.js → verifiers-DJTP4XX6.js} +15 -15
  171. package/dist/{verify-YJL6XET2.js → verify-RWE4PPEK.js} +9 -9
  172. package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
  173. package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-C7IQOXSP.js} +89 -86
  174. package/dist/{with-panes-OBOBFIIR.js → with-panes-4GCGSL7J.js} +53 -257
  175. package/dist/worker/entry.js +90 -74
  176. package/docs/README.md +176 -81
  177. package/docs/{acp.md → architecture/acp.md} +36 -20
  178. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  179. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  180. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +27 -23
  181. package/docs/architecture/artifact-versions.md +90 -0
  182. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  183. package/docs/{context-engine.md → architecture/context-engine.md} +29 -25
  184. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  185. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  186. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  187. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  188. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  189. package/docs/{model-catalog.md → architecture/model-catalog.md} +61 -27
  190. package/docs/{observability.md → architecture/observability.md} +38 -14
  191. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  192. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +57 -20
  193. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +99 -25
  194. package/docs/{safety-model.md → architecture/safety-model.md} +35 -20
  195. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  196. package/docs/architecture/time-conventions.md +125 -0
  197. package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
  198. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  199. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  200. package/docs/{built-in-agents.md → guide/built-in-agents.md} +65 -35
  201. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +66 -61
  202. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -297
  203. package/docs/guide/configuration-reference.md +1163 -0
  204. package/docs/{environment-variables.md → guide/environment-variables.md} +33 -28
  205. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
  206. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  207. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
  208. package/docs/{glossary.md → guide/glossary.md} +14 -11
  209. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +81 -17
  210. package/docs/guide/panes-and-files.md +290 -0
  211. package/docs/{proactive-memory.md → guide/proactive-memory.md} +131 -107
  212. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  213. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +25 -3
  214. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  215. package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
  216. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
  217. package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
  218. package/docs/process/development-pipeline.md +152 -0
  219. package/docs/process/documentation-coverage.md +100 -0
  220. package/docs/process/documentation-guide.md +187 -0
  221. package/docs/{eval-runner.md → process/eval-runner.md} +108 -53
  222. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  223. package/docs/{evolution.md → process/evolution.md} +2 -2
  224. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
  225. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  226. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  227. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  228. package/evals/README.md +2 -2
  229. package/evals/behavioral-model.yaml +3 -2
  230. package/package.json +10 -8
  231. package/skills/README.md +52 -41
  232. package/skills/coding/ast-grep/SKILL.md +102 -31
  233. package/skills/coding/ast-grep/evals.md +26 -0
  234. package/skills/coding/coding-standards/SKILL.md +41 -6
  235. package/skills/coding/coding-standards/evals.md +23 -0
  236. package/skills/coding/prototype/SKILL.md +88 -29
  237. package/skills/coding/prototype/evals.md +19 -0
  238. package/skills/coding/tdd/SKILL.md +81 -54
  239. package/skills/coding/tdd/evals.md +20 -0
  240. package/skills/context/context-handoff/SKILL.md +44 -3
  241. package/skills/context/context-handoff/evals.md +44 -0
  242. package/skills/context/context-prime/SKILL.md +46 -16
  243. package/skills/context/context-prime/evals.md +45 -0
  244. package/skills/git/branch-closeout/SKILL.md +132 -0
  245. package/skills/git/branch-closeout/evals.md +133 -0
  246. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  247. package/skills/git/file-ticket/SKILL.md +78 -64
  248. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  249. package/skills/git/file-ticket/evals.md +31 -26
  250. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  251. package/skills/git/fix-issue/SKILL.md +88 -65
  252. package/skills/git/fix-issue/evals.md +35 -31
  253. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  254. package/skills/git/resolve-merge-conflicts/SKILL.md +101 -52
  255. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  256. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  257. package/skills/git/ship/SKILL.md +103 -67
  258. package/skills/git/ship/assets/pr-template.md +21 -0
  259. package/skills/git/ship/evals.md +44 -28
  260. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  261. package/skills/git/worktree-create/SKILL.md +80 -50
  262. package/skills/git/worktree-create/evals.md +40 -33
  263. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  264. package/skills/git/worktree-merge/SKILL.md +112 -65
  265. package/skills/git/worktree-merge/evals.md +42 -34
  266. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  267. package/skills/meta/clio-coder-dev/SKILL.md +9 -5
  268. package/skills/meta/clio-coder-dev/evals.md +3 -2
  269. package/skills/meta/clio-coder-test/SKILL.md +102 -95
  270. package/skills/meta/clio-coder-test/evals.md +9 -4
  271. package/skills/meta/clio-coder-test/references/harness.md +100 -124
  272. package/skills/meta/clio-coder-test/references/test-map.md +77 -50
  273. package/skills/meta/credentials/SKILL.md +2 -2
  274. package/skills/meta/find-skills/SKILL.md +2 -2
  275. package/skills/meta/herdr/SKILL.md +2 -2
  276. package/skills/meta/skill-craft/SKILL.md +22 -16
  277. package/skills/planning/archify/SKILL.md +196 -0
  278. package/skills/planning/archify/evals.md +65 -0
  279. package/skills/planning/architecture/SKILL.md +62 -13
  280. package/skills/planning/architecture/evals.md +65 -0
  281. package/skills/planning/backlog/SKILL.md +131 -15
  282. package/skills/planning/backlog/evals.md +142 -0
  283. package/skills/planning/prd/SKILL.md +47 -7
  284. package/skills/planning/prd/evals.md +54 -0
  285. package/skills/planning/product-intent/SKILL.md +58 -3
  286. package/skills/planning/product-intent/evals.md +70 -0
  287. package/skills/planning/tech-spec/SKILL.md +54 -3
  288. package/skills/planning/tech-spec/evals.md +73 -0
  289. package/skills/registry.yaml +70 -62
  290. package/skills/remote.yaml +13 -0
  291. package/skills/research/arxiv-literature/SKILL.md +77 -19
  292. package/skills/research/arxiv-literature/evals.md +50 -0
  293. package/skills/research/experiment-protocol/SKILL.md +21 -2
  294. package/skills/research/experiment-protocol/evals.md +23 -0
  295. package/skills/research/scientific-debugging/SKILL.md +24 -2
  296. package/skills/research/scientific-debugging/evals.md +18 -0
  297. package/skills/research/scientific-modernization/SKILL.md +27 -2
  298. package/skills/research/scientific-modernization/evals.md +27 -0
  299. package/skills/skill-marketplace.json +97 -62
  300. package/skills/workflow/cut-it/SKILL.md +66 -6
  301. package/skills/workflow/cut-it/evals.md +101 -0
  302. package/skills/workflow/design-council/SKILL.md +118 -28
  303. package/skills/workflow/design-council/evals.md +161 -0
  304. package/skills/workflow/grill-me/SKILL.md +87 -11
  305. package/skills/workflow/grill-me/evals.md +153 -0
  306. package/skills/workflow/workflow-distiller/SKILL.md +77 -18
  307. package/skills/workflow/workflow-distiller/evals.md +118 -0
  308. package/src/cli/args.ts +2 -2
  309. package/src/cli/bootstrap-generate.ts +1 -1
  310. package/src/cli/config-inspect.ts +65 -12
  311. package/src/cli/configure-interop.ts +105 -13
  312. package/src/cli/configure-oauth.ts +57 -0
  313. package/src/cli/configure-onboarding.ts +980 -0
  314. package/src/cli/configure-target.ts +594 -0
  315. package/src/cli/configure.ts +1082 -532
  316. package/src/cli/context-map.ts +114 -0
  317. package/src/cli/context.ts +4 -0
  318. package/src/cli/docs.ts +22 -14
  319. package/src/cli/doctor-naming.ts +5 -5
  320. package/src/cli/doctor-toolchain.ts +3 -3
  321. package/src/cli/eval.ts +1 -2
  322. package/src/cli/extensions.ts +2 -1
  323. package/src/cli/fleet.ts +1 -1
  324. package/src/cli/index.ts +3 -1
  325. package/src/cli/internal-dispatch.ts +3 -4
  326. package/src/cli/lifecycle-presenter.ts +436 -0
  327. package/src/cli/models.ts +10 -2
  328. package/src/cli/modes/print.ts +5 -1
  329. package/src/cli/panes.ts +19 -5
  330. package/src/cli/reset.ts +228 -106
  331. package/src/cli/run.ts +9 -4
  332. package/src/cli/select.ts +664 -0
  333. package/src/cli/share.ts +5 -1
  334. package/src/cli/skills-eval.ts +3 -3
  335. package/src/cli/skills.ts +9 -2
  336. package/src/cli/targets.ts +5 -6
  337. package/src/cli/trace.ts +55 -4
  338. package/src/cli/uninstall.ts +233 -165
  339. package/src/cli/upgrade.ts +204 -149
  340. package/src/cli/usage.ts +86 -27
  341. package/src/cli/validate-model.ts +3 -3
  342. package/src/cli/wiki-generate.ts +1 -1
  343. package/src/core/artifact-paths.ts +1 -1
  344. package/src/core/bash-exec.ts +131 -86
  345. package/src/core/bus-events.ts +51 -6
  346. package/src/core/config.ts +61 -1
  347. package/src/core/defaults.ts +7 -4
  348. package/src/core/dispatch-outcome.ts +16 -0
  349. package/src/core/external-diagnostic.ts +44 -0
  350. package/src/core/gateway-routing.ts +157 -0
  351. package/src/core/guardrails.ts +10 -49
  352. package/src/core/prompt-hint.ts +9 -0
  353. package/src/core/safe-exec.ts +17 -2
  354. package/src/core/skill-activation.ts +89 -2
  355. package/src/domains/agents/builtins/architect.md +2 -3
  356. package/src/domains/agents/builtins/coder.md +3 -2
  357. package/src/domains/agents/builtins/debugger.md +2 -2
  358. package/src/domains/agents/builtins/documenter.md +2 -2
  359. package/src/domains/agents/builtins/git-master.md +1 -1
  360. package/src/domains/agents/builtins/oracle.md +1 -1
  361. package/src/domains/agents/builtins/provenance.md +1 -1
  362. package/src/domains/agents/builtins/researcher.md +1 -1
  363. package/src/domains/agents/builtins/scout.md +1 -1
  364. package/src/domains/agents/builtins/tester.md +2 -2
  365. package/src/domains/agents/builtins/verifier.md +2 -2
  366. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  367. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  368. package/src/domains/agents/catalog.ts +13 -15
  369. package/src/domains/agents/contract.ts +2 -0
  370. package/src/domains/agents/extension.ts +23 -1
  371. package/src/domains/agents/result-contract.ts +70 -0
  372. package/src/domains/config/keybindings.ts +8 -0
  373. package/src/domains/context/extension.ts +0 -3
  374. package/src/domains/context/wiki/map-seed.ts +589 -0
  375. package/src/domains/context/wiki/plan.ts +2 -2
  376. package/src/domains/context/working-set/path-index.ts +1 -0
  377. package/src/domains/dispatch/admission.ts +29 -0
  378. package/src/domains/dispatch/agent-candidates.ts +10 -0
  379. package/src/domains/dispatch/budget-envelope.ts +86 -1
  380. package/src/domains/dispatch/capability-match.ts +11 -0
  381. package/src/domains/dispatch/capacity-lease.ts +17 -0
  382. package/src/domains/dispatch/contract.ts +11 -1
  383. package/src/domains/dispatch/extension.ts +237 -49
  384. package/src/domains/dispatch/host-verification.ts +435 -39
  385. package/src/domains/dispatch/intent-requirements.ts +10 -0
  386. package/src/domains/dispatch/intent.ts +18 -1
  387. package/src/domains/dispatch/path-scope.ts +235 -24
  388. package/src/domains/dispatch/run-event-journal.ts +4 -15
  389. package/src/domains/dispatch/state.ts +2 -3
  390. package/src/domains/dispatch/transport.ts +45 -21
  391. package/src/domains/dispatch/types.ts +58 -3
  392. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  393. package/src/domains/eval/artifacts/store.ts +5 -0
  394. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  395. package/src/domains/eval/metrics/token-stream.ts +201 -31
  396. package/src/domains/eval/metrics/tracked.ts +40 -4
  397. package/src/domains/eval/runners/clio-run.ts +5 -2
  398. package/src/domains/eval/schema/suite.ts +28 -0
  399. package/src/domains/eval/schema/verdict.ts +2 -2
  400. package/src/domains/eval/store.ts +8 -1
  401. package/src/domains/eval/suites/resolve.ts +13 -1
  402. package/src/domains/eval/suites/run.ts +24 -3
  403. package/src/domains/evidence/trust-status.ts +10 -1
  404. package/src/domains/extensions/contract.ts +15 -1
  405. package/src/domains/extensions/discovery.ts +238 -41
  406. package/src/domains/extensions/extension.ts +105 -6
  407. package/src/domains/extensions/index.ts +24 -0
  408. package/src/domains/extensions/integrity.ts +189 -0
  409. package/src/domains/extensions/manager.ts +17 -1
  410. package/src/domains/extensions/resource-path.ts +27 -0
  411. package/src/domains/extensions/resources.ts +18 -38
  412. package/src/domains/extensions/snapshot-store.ts +39 -0
  413. package/src/domains/extensions/snapshot.ts +180 -0
  414. package/src/domains/extensions/state.ts +385 -57
  415. package/src/domains/extensions/types.ts +118 -1
  416. package/src/domains/interop/registry.ts +6 -2
  417. package/src/domains/interop/types.ts +4 -0
  418. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  419. package/src/domains/lifecycle/migrations/index.ts +6 -0
  420. package/src/domains/lifecycle/naming-resources.ts +19 -4
  421. package/src/domains/lifecycle/naming-yazi.ts +10 -5
  422. package/src/domains/memory/task-memory-policy.ts +70 -26
  423. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  424. package/src/domains/middleware/contract.ts +26 -0
  425. package/src/domains/middleware/extension.ts +24 -24
  426. package/src/domains/middleware/hook-receipts.ts +27 -4
  427. package/src/domains/middleware/hooks-io.ts +65 -32
  428. package/src/domains/middleware/hooks.ts +64 -0
  429. package/src/domains/middleware/index.ts +28 -5
  430. package/src/domains/middleware/marketplace-offer.ts +3 -35
  431. package/src/domains/middleware/memory-intervention.ts +127 -32
  432. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  433. package/src/domains/middleware/registrations.ts +326 -0
  434. package/src/domains/middleware/runtime.ts +28 -0
  435. package/src/domains/middleware/skills-reminder.ts +31 -2
  436. package/src/domains/middleware/snapshot.ts +20 -7
  437. package/src/domains/mux/contract.ts +38 -0
  438. package/src/domains/mux/detect.ts +6 -13
  439. package/src/domains/mux/index.ts +1 -1
  440. package/src/domains/mux/operations.ts +44 -5
  441. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  442. package/src/domains/mux/yazi/session.ts +53 -4
  443. package/src/domains/mux/yazi/theme.ts +117 -17
  444. package/src/domains/observability/compaction-usage.ts +118 -0
  445. package/src/domains/observability/contract.ts +10 -11
  446. package/src/domains/observability/cost.ts +1 -1
  447. package/src/domains/observability/extension.ts +17 -4
  448. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  449. package/src/domains/observability/projection.ts +14 -90
  450. package/src/domains/observability/trace-store.ts +43 -7
  451. package/src/domains/prompts/compiler.ts +73 -53
  452. package/src/domains/prompts/contract.ts +15 -3
  453. package/src/domains/prompts/extension.ts +97 -9
  454. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
  455. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  456. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  457. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  458. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  459. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  460. package/src/domains/prompts/fragments/operating/skills.md +10 -24
  461. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  462. package/src/domains/providers/contract.ts +4 -1
  463. package/src/domains/providers/extension.ts +40 -9
  464. package/src/domains/providers/index.ts +1 -1
  465. package/src/domains/providers/model-capabilities.ts +9 -0
  466. package/src/domains/providers/model-discovery.ts +2 -0
  467. package/src/domains/providers/model-runtime-capabilities.ts +99 -25
  468. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +699 -114
  469. package/src/domains/providers/runtime-resolution.ts +31 -0
  470. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  471. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  472. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  473. package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
  474. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  475. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  476. package/src/domains/providers/support.ts +11 -5
  477. package/src/domains/providers/target-model-cache.ts +25 -2
  478. package/src/domains/providers/types/capability-flags.ts +2 -0
  479. package/src/domains/providers/types/cost-provenance.ts +19 -0
  480. package/src/domains/providers/types/local-model-quirks.ts +85 -37
  481. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  482. package/src/domains/providers/types/target-descriptor.ts +19 -0
  483. package/src/domains/resources/index.ts +3 -0
  484. package/src/domains/resources/skills/install.ts +72 -7
  485. package/src/domains/resources/skills/loader.ts +23 -19
  486. package/src/domains/resources/skills/marketplace.ts +63 -11
  487. package/src/domains/safety/autonomy.ts +15 -0
  488. package/src/domains/safety/call-target.ts +1 -1
  489. package/src/domains/safety/index.ts +1 -0
  490. package/src/domains/safety/loop-detector.ts +7 -4
  491. package/src/domains/safety/path-policy.ts +1 -1
  492. package/src/domains/safety/policy-engine.ts +34 -11
  493. package/src/domains/safety/protected-artifacts.ts +191 -88
  494. package/src/domains/safety/run-effects.ts +2 -22
  495. package/src/domains/safety/skill-authority.ts +55 -0
  496. package/src/domains/session/compaction/compact.ts +72 -22
  497. package/src/domains/session/entries.ts +6 -0
  498. package/src/domains/session/task-board.ts +10 -9
  499. package/src/domains/session/usage.ts +3 -3
  500. package/src/domains/share/archive.ts +164 -7
  501. package/src/engine/acp/server.ts +62 -9
  502. package/src/engine/agent.ts +13 -3
  503. package/src/engine/ai.ts +26 -8
  504. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  505. package/src/engine/api-registry.ts +3 -0
  506. package/src/engine/apis/llamacpp-residency.ts +3 -4
  507. package/src/engine/apis/lmstudio.ts +3 -3
  508. package/src/engine/apis/ollama-native.ts +6 -6
  509. package/src/engine/apis/openai-completions.ts +145 -39
  510. package/src/engine/apis/output-budget.ts +8 -18
  511. package/src/engine/apis/residency.ts +8 -27
  512. package/src/engine/external-subprocess.ts +114 -6
  513. package/src/engine/gemma-channel-filter.ts +19 -0
  514. package/src/engine/loop-guard.ts +92 -12
  515. package/src/engine/worker-runtime.ts +40 -11
  516. package/src/engine/worker-tools.ts +3 -1
  517. package/src/entry/background-model-metadata.ts +18 -0
  518. package/src/entry/compaction-prompt.ts +57 -0
  519. package/src/entry/extension-hook-sources.ts +28 -0
  520. package/src/entry/extension-reload.ts +309 -0
  521. package/src/entry/orchestrator.ts +464 -251
  522. package/src/entry/task-memory-lifecycle.ts +35 -0
  523. package/src/interactive/application-controller.ts +2 -1
  524. package/src/interactive/bus-notices.ts +8 -1
  525. package/src/interactive/chat-loop-messages.ts +16 -17
  526. package/src/interactive/chat-loop.ts +75 -3
  527. package/src/interactive/chat-panel.ts +36 -13
  528. package/src/interactive/chat-renderer.ts +72 -7
  529. package/src/interactive/cost-overlay.ts +26 -2
  530. package/src/interactive/dispatch-board.ts +6 -11
  531. package/src/interactive/footer/widgets.ts +13 -0
  532. package/src/interactive/interactive-application.ts +39 -4
  533. package/src/interactive/interactive-input-runtime.ts +4 -0
  534. package/src/interactive/interactive-presentation.ts +2 -2
  535. package/src/interactive/interactive-slash-runtime.ts +4 -1
  536. package/src/interactive/overlays/extensions.ts +9 -1
  537. package/src/interactive/overlays/help-reference.ts +13 -0
  538. package/src/interactive/overlays/settings.ts +27 -16
  539. package/src/interactive/panes-runtime.ts +111 -35
  540. package/src/interactive/prompt-cache-identity.ts +88 -0
  541. package/src/interactive/renderers/worker-entry.ts +32 -0
  542. package/src/interactive/slash-commands.ts +153 -20
  543. package/src/interactive/stream-pacing-policy.ts +0 -23
  544. package/src/interactive/theme/labels.ts +19 -13
  545. package/src/interactive/turn-context.ts +39 -20
  546. package/src/interactive/turn-recovery.ts +8 -0
  547. package/src/interactive/turn-runtime.ts +27 -11
  548. package/src/interactive/turn-state.ts +7 -0
  549. package/src/interactive/worker-receipts.ts +1 -0
  550. package/src/interactive/worker-stream.ts +6 -1
  551. package/src/interactive/yazi-bridge.ts +60 -6
  552. package/src/tools/agent-tools.ts +30 -1
  553. package/src/tools/artifact.ts +2 -2
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/bootstrap.ts +4 -0
  557. package/src/tools/builtin-tool-catalog.ts +52 -22
  558. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  559. package/src/tools/codewiki/code-nav.ts +99 -13
  560. package/src/tools/context/docs-engine.ts +20 -7
  561. package/src/tools/context/index.ts +59 -21
  562. package/src/tools/core-bootstrap.ts +28 -6
  563. package/src/tools/credential-present.ts +1 -2
  564. package/src/tools/dispatch-arguments.ts +6 -1
  565. package/src/tools/dispatch-event-text.ts +10 -0
  566. package/src/tools/dispatch-plan.ts +49 -4
  567. package/src/tools/dispatch-run-events.ts +1 -1
  568. package/src/tools/dispatch-runner.ts +12 -0
  569. package/src/tools/dispatch-schema.ts +338 -0
  570. package/src/tools/dispatch-types.ts +3 -0
  571. package/src/tools/dispatch.ts +9 -254
  572. package/src/tools/ledger.ts +3 -5
  573. package/src/tools/monitor-surface.ts +5 -13
  574. package/src/tools/observation.ts +4 -5
  575. package/src/tools/panes-surface.ts +4 -11
  576. package/src/tools/panes.ts +4 -2
  577. package/src/tools/policy.ts +15 -2
  578. package/src/tools/read.ts +5 -6
  579. package/src/tools/registry.ts +41 -12
  580. package/src/tools/result-shaping.ts +18 -14
  581. package/src/tools/steer-surface.ts +1 -1
  582. package/src/tools/tasks.ts +1 -1
  583. package/src/tools/truncate.ts +6 -5
  584. package/src/tools/verify/surface.ts +6 -12
  585. package/src/tools/web-fetch-surface.ts +1 -3
  586. package/src/tools/worker-evidence.ts +3 -1
  587. package/src/worker/spec-contract.ts +4 -0
  588. package/dist/builtins-UJLMOVOV.js +0 -17
  589. package/dist/chunk-5QIAJV2D.js +0 -48
  590. package/dist/chunk-JZWT5J3Y.js +0 -814
  591. package/dist/chunk-K7VKOLQQ.js +0 -15
  592. package/dist/chunk-PMZCIOCJ.js +0 -25
  593. package/dist/chunk-SUW5DORT.js +0 -819
  594. package/dist/chunk-UOV2BYIW.js +0 -107
  595. package/dist/chunk-WR6U3OVP.js +0 -45
  596. package/dist/chunk-Y45G3AXC.js +0 -1558
  597. package/dist/reset-EOLM7GVE.js +0 -230
  598. package/dist/uninstall-N34PCTGJ.js +0 -331
  599. package/dist/upgrade-H7TOM7YL.js +0 -323
  600. package/docs/artifact-versions.md +0 -67
  601. package/docs/development-pipeline.md +0 -121
  602. package/docs/documentation-coverage.md +0 -46
  603. package/docs/documentation-guide.md +0 -167
  604. package/docs/time-conventions.md +0 -101
@@ -16,6 +16,7 @@ import { performance } from "node:perf_hooks";
16
16
  import { BusChannels, type DispatchCompletedPayload, type DispatchRunIdentity } from "../../core/bus-events.js";
17
17
  import { DEFAULT_SETTINGS, type DelegationToolGovernance } from "../../core/defaults.js";
18
18
  import type { DomainBundle, DomainContext, DomainExtension } from "../../core/domain-loader.js";
19
+ import { gatewayRoutingObservationFromRecord } from "../../core/gateway-routing.js";
19
20
  import { GUARDRAIL_DEFAULTS } from "../../core/guardrails.js";
20
21
  import { readClioVersion, readPiMonoVersion } from "../../core/package-root.js";
21
22
  import { canonicalizeExistingPath } from "../../core/path-canonical.js";
@@ -77,6 +78,7 @@ import type { PromptsContract } from "../prompts/contract.js";
77
78
  import { type EffectivePricing, resolveEffectivePricing } from "../providers/catalog.js";
78
79
  import {
79
80
  type CapabilityFlags,
81
+ canonicalEndpointKey,
80
82
  canonicalizeWireModelId,
81
83
  type EndpointCapacity,
82
84
  endpointCapacityFor,
@@ -157,6 +159,7 @@ import type {
157
159
  DispatchAdmissionObserver,
158
160
  DispatchContract,
159
161
  DispatchPlanTaskResolution,
162
+ DispatchPreparationOptions,
160
163
  DispatchRequest,
161
164
  DispatchSnapshot,
162
165
  } from "./contract.js";
@@ -181,7 +184,12 @@ import {
181
184
  type HeartbeatStatus,
182
185
  heartbeatMonotonicAt,
183
186
  } from "./heartbeat.js";
184
- import { hostVerificationRejection, runHostVerification } from "./host-verification.js";
187
+ import {
188
+ type BatchVerificationGate,
189
+ createBatchVerificationGate,
190
+ hostVerificationRejection,
191
+ runHostVerification,
192
+ } from "./host-verification.js";
185
193
  import { renderDispatchIntentRequirements } from "./intent-requirements.js";
186
194
  import { adaptJointRouteInput } from "./joint-route-adapter.js";
187
195
  import {
@@ -201,6 +209,8 @@ import {
201
209
  type DispatchPathScope,
202
210
  declaredScopeReplacementDiagnostic,
203
211
  declaredScopeReplacementNotice,
212
+ inferredScopeParentTokenDiagnostic,
213
+ inferredScopeParentTokenNotice,
204
214
  resolveDispatchPathScope,
205
215
  } from "./path-scope.js";
206
216
  import { deriveEnvelopePhaseDurations, deriveRunPhaseDurations, recordRunTimingBestEffort } from "./phase-timing.js";
@@ -289,6 +299,7 @@ import {
289
299
  validateJobSpec,
290
300
  } from "./validation.js";
291
301
  import { describeUngroundedValidations, groundClaimedValidations, invalidatesQuality } from "./validation-grounding.js";
302
+ import { prepareWorkerModelMetadata } from "./worker-model-metadata.js";
292
303
  import {
293
304
  type AgentLedgerBody,
294
305
  computeSettingsFingerprint,
@@ -1431,6 +1442,13 @@ function runtimeLimitations(runtimeKind: RunKind, runtimeId: string): string[] {
1431
1442
  "Claude CLI subprocess executes Claude Code tools; Clio constrains permission mode and forbids dangerous bypass unless explicitly gated",
1432
1443
  ];
1433
1444
  }
1445
+ if (runtimeKind === "subprocess" && runtimeId === "antigravity-code") {
1446
+ return [
1447
+ "Antigravity CLI owns its internal tools, network activity, prompts, and approvals; Clio observes only structured stream output and does not provide per-tool mediation or complete tool telemetry",
1448
+ "Antigravity conversation ids are recorded only as opaque provider observations; Clio does not resume them",
1449
+ "Antigravity runs are one-shot and never retried automatically",
1450
+ ];
1451
+ }
1434
1452
  // HTTP/native runtimes run through pi-agent-core, which Clio observes and
1435
1453
  // controls directly, so there are no runtime-imposed dispatch limitations.
1436
1454
  return [];
@@ -1471,13 +1489,6 @@ function assertWriteRootsEnforceable(runtime: RuntimeDescriptor, writeRoots: Rea
1471
1489
  );
1472
1490
  }
1473
1491
 
1474
- function assertWorkerBudgetEnforceable(runtime: RuntimeDescriptor, hasDeclaredBudget: boolean): void {
1475
- if (!hasDeclaredBudget || runtime.kind !== "subprocess") return;
1476
- throw new Error(
1477
- `dispatch: runtime '${runtime.id}' cannot enforce an explicit dispatch budget because subprocess workers do not expose per-tool mediation; choose a native or claude-sdk worker`,
1478
- );
1479
- }
1480
-
1481
1492
  /**
1482
1493
  * API families whose wire protocol carries tool calls. Membership is a property
1483
1494
  * of the protocol, not of any one model: every server speaking one of these can
@@ -1603,11 +1614,30 @@ function assertPostRuntimeToolCompatibility(
1603
1614
  }
1604
1615
 
1605
1616
  function workerToolCallHardCap(settings: EffectiveSettings): number {
1606
- const rawEnvCap = process.env.CLIO_CODER_WORKER_TOOL_CALL_CAP?.trim();
1607
- const parsedEnvCap = rawEnvCap && /^[1-9]\d*$/.test(rawEnvCap) ? Number(rawEnvCap) : Number.NaN;
1608
- return Number.isSafeInteger(parsedEnvCap)
1609
- ? parsedEnvCap
1610
- : (settings?.fleet.limits.toolCallsPerRun ?? GUARDRAIL_DEFAULTS.workerToolCallCap);
1617
+ return settings?.fleet.limits.toolCallsPerRun ?? GUARDRAIL_DEFAULTS.workerToolCallCap;
1618
+ }
1619
+
1620
+ /**
1621
+ * Only a runtime that declares its external agent loop may accept a declared
1622
+ * per-tool budget: Clio records that budget as unobserved rather than enforced.
1623
+ * Any other subprocess runtime cannot mediate tool calls, so a declared budget
1624
+ * would be a claim nobody enforces.
1625
+ */
1626
+ export function assertWorkerBudgetEnforceable(
1627
+ runtime: Pick<RuntimeDescriptor, "id" | "kind" | "externalAgentLoop">,
1628
+ hasDeclaredBudget: boolean,
1629
+ ): void {
1630
+ if (!hasDeclaredBudget || runtime.kind !== "subprocess" || runtime.externalAgentLoop !== undefined) return;
1631
+ throw new Error(
1632
+ `dispatch: runtime '${runtime.id}' cannot enforce an explicit dispatch budget because subprocess workers do not expose per-tool mediation; choose a native or claude-sdk worker`,
1633
+ );
1634
+ }
1635
+
1636
+ /** Per-tool budget enforcement is real only where Clio observes each tool call. */
1637
+ export function budgetEnforcementForRuntime(
1638
+ runtime: Pick<RuntimeDescriptor, "kind">,
1639
+ ): "native-per-tool" | "external-one-shot" {
1640
+ return runtime.kind === "subprocess" ? "external-one-shot" : "native-per-tool";
1611
1641
  }
1612
1642
 
1613
1643
  function resolveEffectiveWorkerBudget(input: {
@@ -1616,7 +1646,9 @@ function resolveEffectiveWorkerBudget(input: {
1616
1646
  declared: ReturnType<typeof normalizeAgentSpec>["budget"];
1617
1647
  allowedTools: ReadonlyArray<ToolName>;
1618
1648
  settings: EffectiveSettings;
1649
+ runtime: RuntimeDescriptor;
1619
1650
  }): RunToolBudgetEnvelope {
1651
+ assertWorkerBudgetEnforceable(input.runtime, input.declared !== null || input.req.budget !== undefined);
1620
1652
  const hardCap = workerToolCallHardCap(input.settings);
1621
1653
  const declared = input.declared ?? {
1622
1654
  toolCalls: hardCap,
@@ -1631,6 +1663,7 @@ function resolveEffectiveWorkerBudget(input: {
1631
1663
  hasReadTool: input.allowedTools.includes(ToolNames.Read),
1632
1664
  retry: (input.req.lineage?.attempt ?? 0) > 0,
1633
1665
  revision: input.req.gate?.role === "builder" && input.req.gate.cycle > 1 && input.req.gate.verdict === "revise",
1666
+ enforcement: budgetEnforcementForRuntime(input.runtime),
1634
1667
  });
1635
1668
  }
1636
1669
 
@@ -1971,6 +2004,15 @@ function clampWorkerAutonomy(session: AutonomyLevel, requested: AutonomyLevel |
1971
2004
  return AUTONOMY_ORDER[requested] < AUTONOMY_ORDER[session] ? requested : session;
1972
2005
  }
1973
2006
 
2007
+ /** Read-only recipes are an authority boundary, including on opaque external loops. */
2008
+ export function effectiveWorkerAutonomy(
2009
+ session: AutonomyLevel,
2010
+ requested: AutonomyLevel | undefined,
2011
+ capabilityClass: AgentCapabilityClass,
2012
+ ): AutonomyLevel {
2013
+ return clampWorkerAutonomy(session, capabilityClass === "read-only" ? "read-only" : requested);
2014
+ }
2015
+
1974
2016
  function requestedAutonomyEvidence(
1975
2017
  sessionAutonomy: AutonomyLevel,
1976
2018
  requestedAutonomy: AutonomyLevel | undefined,
@@ -2500,6 +2542,29 @@ export function createDispatchBundle(
2500
2542
  return Object.fromEntries(Object.entries(configuredEndpointCapacities()).map(([key, value]) => [key, value.limit]));
2501
2543
  }
2502
2544
 
2545
+ /**
2546
+ * Endpoints still bound by the blind one-slot default have never been
2547
+ * probed by any process, or their record expired. A fresh home carried that
2548
+ * bound into its first batch and refused two tasks on a server running
2549
+ * four, until the operator happened to run `targets --probe`. Probe each
2550
+ * such endpoint once per process, in the background and without the
2551
+ * inference-based reasoning check: the slot count is a header read, and the
2552
+ * model's first dispatch call is seconds away at the earliest. The probe
2553
+ * lands in the provider statuses and the durable slot store, which is where
2554
+ * admission already looks.
2555
+ */
2556
+ const probedDefaultBoundEndpoints = new Set<string>();
2557
+ function probeEndpointsAtDefaultBound(): void {
2558
+ const capacities = configuredEndpointCapacities();
2559
+ for (const target of getEffectiveSettings()?.targets ?? []) {
2560
+ const key = canonicalEndpointKey(target);
2561
+ if (key === null || capacities[key]?.source !== "local-native-default") continue;
2562
+ if (probedDefaultBoundEndpoints.has(key)) continue;
2563
+ probedDefaultBoundEndpoints.add(key);
2564
+ void providers.probeTarget(target.id, { reasoning: false }).catch(() => undefined);
2565
+ }
2566
+ }
2567
+
2503
2568
  function endpointCapacityForTarget(targetId: string): EndpointCapacity | null {
2504
2569
  const status = providers.list().find((entry) => entry.target.id === targetId);
2505
2570
  const target = status?.target ?? providers.getTarget(targetId);
@@ -2635,6 +2700,7 @@ export function createDispatchBundle(
2635
2700
  nodeId: string,
2636
2701
  timing: RunPhaseMarks,
2637
2702
  endpoint?: EndpointCapacity | null,
2703
+ signal?: AbortSignal,
2638
2704
  ) {
2639
2705
  const queuedAt = now();
2640
2706
  timing.queuedAt = new Date(queuedAt).toISOString();
@@ -2650,7 +2716,12 @@ export function createDispatchBundle(
2650
2716
  : planQueueSlot(req.reservation.ownerId, req.reservation.memberId, (error) =>
2651
2717
  reportDispatchDiagnostic("read plan queue identity", error),
2652
2718
  );
2719
+ const cancel = (): void => {
2720
+ capacityAdmission.cancel(assignmentId);
2721
+ };
2722
+ signal?.addEventListener("abort", cancel, { once: true });
2653
2723
  try {
2724
+ signal?.throwIfAborted();
2654
2725
  const admitted = await capacityAdmission.admit({
2655
2726
  assignmentId,
2656
2727
  nodeId,
@@ -2673,6 +2744,8 @@ export function createDispatchBundle(
2673
2744
  else await failQueuedAssignment(assignmentId);
2674
2745
  }
2675
2746
  throw error;
2747
+ } finally {
2748
+ signal?.removeEventListener("abort", cancel);
2676
2749
  }
2677
2750
  }
2678
2751
 
@@ -2822,6 +2895,14 @@ export function createDispatchBundle(
2822
2895
  if (draining) return { scheduled: false };
2823
2896
  const rootRunId = run.lineage.rootRunId;
2824
2897
  if (!retryChainIsLive(run)) return { scheduled: false };
2898
+ if (providers.getRuntime(run.runtimeId)?.externalAgentLoop?.generatingRetry === "forbidden") {
2899
+ retryBackoff.delete(rootRunId);
2900
+ return {
2901
+ scheduled: false,
2902
+ settlementDetail:
2903
+ "automatic retry suppressed because this external agent loop is one-shot and Clio cannot prove replay is side-effect-free",
2904
+ };
2905
+ }
2825
2906
  if (!RETRYABLE_OUTCOMES.has(outcome)) {
2826
2907
  retryBackoff.delete(rootRunId);
2827
2908
  return { scheduled: false };
@@ -3197,6 +3278,9 @@ export function createDispatchBundle(
3197
3278
  const tickMonotonic = monotonicNow();
3198
3279
  for (const run of active.values()) {
3199
3280
  if (run.aborted || run.stallKilled || !run.heartbeatAt) continue;
3281
+ // Finalizers retain active entries while awaiting ledger persistence.
3282
+ // Their terminal status is already sealed into the receipt digest.
3283
+ if (ledger.get(run.runId)?.endedAt !== null) continue;
3200
3284
  const heartbeatMonotonic = heartbeatMonotonicAt(run.heartbeatAt);
3201
3285
  if (!Number.isFinite(heartbeatMonotonic) || !Number.isFinite(run.heartbeatAt.current)) continue;
3202
3286
  if (run.runtimeKind === "acp-delegation") {
@@ -3369,9 +3453,31 @@ export function createDispatchBundle(
3369
3453
  agentId: req.agentId,
3370
3454
  });
3371
3455
  }
3456
+ // A reinterpreted "../" token is the one legacy-mode scope fact that earns
3457
+ // the channel: it fires only where the dispatch used to fail outright, so
3458
+ // it cannot warn on the ordinary intent-less dispatch the comment above
3459
+ // keeps quiet. Anchoring is reported alongside dropping because it is the
3460
+ // half that adds to scope, putting a path in working context that the
3461
+ // prose never literally spelled.
3462
+ const parentTokenDiagnostic = inferredScopeParentTokenDiagnostic(pathScope);
3463
+ if (parentTokenDiagnostic !== null) {
3464
+ reportDispatchDiagnostic("inferred scope parent tokens", new Error(parentTokenDiagnostic));
3465
+ }
3466
+ const parentTokenNotice = inferredScopeParentTokenNotice(pathScope);
3467
+ if (parentTokenNotice !== null) {
3468
+ context.bus.emit(BusChannels.DispatchScopeNotice, {
3469
+ ...parentTokenNotice,
3470
+ agentId: req.agentId,
3471
+ });
3472
+ }
3372
3473
  }
3373
3474
 
3374
- async function resolveLifecycle(req: DispatchRequest, settings: EffectiveSettings): Promise<DispatchLifecycleStage> {
3475
+ async function resolveLifecycle(
3476
+ req: DispatchRequest,
3477
+ settings: EffectiveSettings,
3478
+ metadataDeadlineAt: number,
3479
+ signal?: AbortSignal,
3480
+ ): Promise<DispatchLifecycleStage> {
3375
3481
  const recipe = agents.get(req.agentId);
3376
3482
  if (!recipe) {
3377
3483
  throw new Error(`dispatch: unknown agent recipe: ${req.agentId}`);
@@ -3402,28 +3508,42 @@ export function createDispatchBundle(
3402
3508
  autoSelected: req.agentSelection?.mode === "auto",
3403
3509
  resultContractKind: spec.resultContract.kind,
3404
3510
  specs: agents.listSpecs(),
3511
+ intent: req.intent ?? null,
3405
3512
  });
3406
3513
  if (capabilityMismatch?.verdict === "refuse") throw new Error(capabilityMismatch.detail);
3407
3514
  const pathScope = resolveDispatchPathScope(req);
3408
3515
  publishDispatchPathScope(req, pathScope);
3409
3516
  const admission = resolveDispatchAdmissionStage(req, recipe, safety, pathScope);
3410
3517
  const targets = readWorkerTargets(settings);
3411
- const target = resolveDispatchTarget(
3412
- req,
3413
- recipe,
3414
- targets.workerDefault,
3415
- targets.workerProfiles,
3416
- targets.agentBindings,
3417
- targets.targetOrder,
3418
- providers,
3419
- );
3518
+ const resolveTarget = () =>
3519
+ resolveDispatchTarget(
3520
+ req,
3521
+ recipe,
3522
+ targets.workerDefault,
3523
+ targets.workerProfiles,
3524
+ targets.agentBindings,
3525
+ targets.targetOrder,
3526
+ providers,
3527
+ );
3528
+ let target = resolveTarget();
3529
+ const identity = (resolved: ResolvedTarget): string =>
3530
+ JSON.stringify([
3531
+ resolved.target.id,
3532
+ resolved.runtime.id,
3533
+ resolved.wireModelId,
3534
+ endpointIdentityHash(resolved.target.url),
3535
+ ]);
3536
+ const selectedIdentity = identity(target);
3537
+ await prepareWorkerModelMetadata(providers, target.target.id, metadataDeadlineAt, signal, now);
3538
+ target = resolveTarget();
3539
+ if (identity(target) !== selectedIdentity) {
3540
+ throw new Error("dispatch: worker route changed during model metadata preparation; request a fresh admission");
3541
+ }
3420
3542
  enforceCapabilityGate(target.target.id, target.modelCapabilities, req.requiredCapabilities);
3421
3543
  assertRuntimeCanHonorWorkerPermissionMode(target.runtime, settings?.fleet.permissions.mode ?? "deny");
3422
- assertWorkerBudgetEnforceable(target.runtime, spec.budget !== null || req.budget !== undefined);
3423
-
3424
3544
  const cwd = req.cwd ?? process.cwd();
3425
3545
  const sessionAutonomy = settings?.safety.autonomy ?? "auto-edit";
3426
- const effectiveAutonomy = clampWorkerAutonomy(sessionAutonomy, req.autonomy);
3546
+ const effectiveAutonomy = effectiveWorkerAutonomy(sessionAutonomy, req.autonomy, spec.capabilityClass);
3427
3547
  const effectiveTools = withLedgerToolNarrowing(
3428
3548
  effectiveToolNames(admission.allowedTools, target, pathScope.writeBoundaries.length > 0, deniedToolNames(req)),
3429
3549
  req,
@@ -3434,17 +3554,16 @@ export function createDispatchBundle(
3434
3554
  allowedTools: effectiveTools,
3435
3555
  };
3436
3556
  const personaBody = workerPersonaBody(req, recipe, effectiveTools);
3557
+ const hasCanonicalContext = effectiveTools.includes(ToolNames.Context);
3558
+ const hasBoundSkills =
3559
+ hasCanonicalContext && recipe.skills !== undefined && recipe.skills.length > 0 && req.noSkills !== true;
3437
3560
  const compiledWorkerPrompt = await prompts.compileWorkerPrompt({
3438
3561
  autonomy: effectiveAutonomy,
3439
3562
  providerSupportsTools: target.runtime.kind === "subprocess" ? null : targetToolCapability(target),
3440
3563
  toolNames: effectiveTools,
3441
- toolPromptHints: toolPromptHintsForNames(effectiveTools),
3442
- hasCanonicalContext: effectiveTools.includes(ToolNames.Context),
3443
- hasBoundSkills:
3444
- effectiveTools.includes(ToolNames.Context) &&
3445
- recipe.skills !== undefined &&
3446
- recipe.skills.length > 0 &&
3447
- req.noSkills !== true,
3564
+ toolPromptHints: toolPromptHintsForNames(effectiveTools, hasBoundSkills ? "bound-worker" : "worker"),
3565
+ hasCanonicalContext,
3566
+ hasBoundSkills,
3448
3567
  onPermission: settings?.fleet.permissions.mode ?? "deny",
3449
3568
  persona: {
3450
3569
  id: `persona.${recipe.id}`,
@@ -3463,6 +3582,7 @@ export function createDispatchBundle(
3463
3582
  declared: spec.budget,
3464
3583
  allowedTools: effectiveTools,
3465
3584
  settings,
3585
+ runtime: target.runtime,
3466
3586
  });
3467
3587
  // Fetch structured project context only for tiers that receive it, so
3468
3588
  // read-only scouts never pay the CLIO-CODER.md read. The tier is spec policy
@@ -3783,11 +3903,13 @@ export function createDispatchBundle(
3783
3903
  const responseModelIdObservation = responseModelIdObservationFromRecord(event.message, "not-observed");
3784
3904
  const differingResponseModelId = readStringOrNull(event.message.responseModel);
3785
3905
  const providerResponseId = readStringOrNull(event.message.responseId);
3906
+ const gatewayRouting = gatewayRoutingObservationFromRecord(event.message);
3786
3907
  upstreamResponses.push({
3787
3908
  requestedModelId,
3788
3909
  responseModelIdObservation,
3789
3910
  differingResponseModelId,
3790
3911
  providerResponseId,
3912
+ ...(gatewayRouting !== null ? { gatewayRouting } : {}),
3791
3913
  });
3792
3914
  if (event.message.stopReason === "error") {
3793
3915
  const message = readStringOrNull(event.message.errorMessage);
@@ -4345,6 +4467,8 @@ export function createDispatchBundle(
4345
4467
  async function dispatchAttempt(
4346
4468
  req: DispatchRequest,
4347
4469
  observer?: DispatchAdmissionObserver,
4470
+ preparation?: DispatchPreparationOptions,
4471
+ settlement?: BatchVerificationGate,
4348
4472
  ): Promise<{
4349
4473
  runId: string;
4350
4474
  events: AsyncIterableIterator<unknown>;
@@ -4440,14 +4564,19 @@ export function createDispatchBundle(
4440
4564
  }
4441
4565
  rebindReservationSlot(req, "local", null, UNKNOWN_PRICING_ADMISSION_ESTIMATE_USD, settings);
4442
4566
  routeObservation = observeShadowRoute(req, undefined, settings);
4443
- return attachRouteObservation({
4444
- ...(await dispatchAcpDelegation(req, settings, timing, routeObservation.decision, observer)),
4445
- effectiveRequest: req,
4446
- });
4567
+ const delegated = await dispatchAcpDelegation(req, settings, timing, routeObservation.decision, observer);
4568
+ // An ACP member never runs host verification, so it can only ever leave
4569
+ // the barrier. It still edits the checkout, so the barrier has to wait
4570
+ // for it; dispatch() releases it when its finalPromise settles.
4571
+ settlement?.live(delegated.runId);
4572
+ return attachRouteObservation({ ...delegated, effectiveRequest: req });
4447
4573
  }
4448
4574
 
4449
4575
  req = routeAroundCoolingTarget(req, settings) ?? req;
4450
- const lifecycle = await resolveLifecycle(req, settings);
4576
+ const metadataDeadlineAt =
4577
+ req.assignmentDeadlineAt ?? Date.parse(requestedAt) + (req.routingIntent?.deadlineMs ?? 60_000);
4578
+ const lifecycle = await resolveLifecycle(req, settings, metadataDeadlineAt, preparation?.signal);
4579
+ preparation?.signal?.throwIfAborted();
4451
4580
  timing.decisionCompletedAt = new Date(now()).toISOString();
4452
4581
  assertResponseSchemaEnforceable(
4453
4582
  lifecycle.target.runtime,
@@ -4524,7 +4653,13 @@ export function createDispatchBundle(
4524
4653
  if (queuedIdentity !== null) publishCapacityQueued(queuedIdentity, timing, placement?.node ?? null);
4525
4654
  let capacityLease: Awaited<ReturnType<typeof admitAssignmentCapacity>>;
4526
4655
  try {
4527
- capacityLease = await admitAssignmentCapacity(req, placement?.node.id ?? "local", timing, endpoint);
4656
+ capacityLease = await admitAssignmentCapacity(
4657
+ req,
4658
+ placement?.node.id ?? "local",
4659
+ timing,
4660
+ endpoint,
4661
+ preparation?.signal,
4662
+ );
4528
4663
  } catch (error) {
4529
4664
  if (queuedIdentity !== null) publishCapacityAdmissionFailure(queuedIdentity, error);
4530
4665
  throw error;
@@ -4535,6 +4670,7 @@ export function createDispatchBundle(
4535
4670
 
4536
4671
  const ledgerRef = (() => {
4537
4672
  try {
4673
+ preparation?.signal?.throwIfAborted();
4538
4674
  return requireLedger();
4539
4675
  } catch (error) {
4540
4676
  leaseSlot.release();
@@ -4597,6 +4733,7 @@ export function createDispatchBundle(
4597
4733
  };
4598
4734
  let worker: SpawnedWorker;
4599
4735
  try {
4736
+ preparation?.signal?.throwIfAborted();
4600
4737
  worker = (placement?.spawn ?? spawnWorker)(spec, {
4601
4738
  cwd: lifecycle.cwd,
4602
4739
  now,
@@ -4818,11 +4955,13 @@ export function createDispatchBundle(
4818
4955
  const responseModelIdObservation = responseModelIdObservationFromRecord(event.message, "not-observed");
4819
4956
  const differingResponseModelId = readStringOrNull(event.message.responseModel);
4820
4957
  const providerResponseId = readStringOrNull(event.message.responseId);
4958
+ const gatewayRouting = gatewayRoutingObservationFromRecord(event.message);
4821
4959
  upstreamResponses.push({
4822
4960
  requestedModelId,
4823
4961
  responseModelIdObservation,
4824
4962
  differingResponseModelId,
4825
4963
  providerResponseId,
4964
+ ...(gatewayRouting !== null ? { gatewayRouting } : {}),
4826
4965
  });
4827
4966
  if (event.message.stopReason === "error") {
4828
4967
  const message = readStringOrNull(event.message.errorMessage);
@@ -5368,6 +5507,14 @@ export function createDispatchBundle(
5368
5507
  return { assessment, rigor };
5369
5508
  };
5370
5509
 
5510
+ // The worker is spawned and its ledger row exists, so from here it can
5511
+ // write and the batch barrier has to wait for it. Registered after the
5512
+ // try/catch at 4939-5068, which aborts the worker and releases the lease on
5513
+ // failure, so a run that never reaches the barrier is never made live.
5514
+ // Paired with the abandon in dispatch(), which fires the moment
5515
+ // finalPromise settles.
5516
+ settlement?.live(envelope.id);
5517
+
5371
5518
  const finalPromise = (async (): Promise<RunReceipt> => {
5372
5519
  try {
5373
5520
  const result = await workerDone;
@@ -5438,7 +5585,9 @@ export function createDispatchBundle(
5438
5585
  reachedTerminalResult: resultContractWasDue(finalOutcome, outcomeCode),
5439
5586
  output: capturedOutput?.state === "final" ? capturedOutput.text : null,
5440
5587
  cwd: lifecycle.cwd,
5441
- networkAllowed: lifecycle.admission.allowedTools.includes(ToolNames.WebFetch),
5588
+ networkAllowed:
5589
+ lifecycle.admission.allowedTools.includes(ToolNames.WebFetch) ||
5590
+ lifecycle.target.runtime.externalAgentLoop?.network === "externally-governed-unobserved",
5442
5591
  observedRunEffects,
5443
5592
  filesystem: nodeResultContractFilesystem(),
5444
5593
  });
@@ -5492,12 +5641,21 @@ export function createDispatchBundle(
5492
5641
  finalDetail = WORKER_FINAL_OUTPUT_MISSING_DETAIL;
5493
5642
  failureMessage = finalDetail;
5494
5643
  }
5495
- const hostVerification = await runHostVerification({
5644
+ const hostVerificationInput = {
5496
5645
  runId: envelope.id,
5497
5646
  request: req,
5498
5647
  workerSuccessful: finalOutcome === "succeeded",
5499
- onDiagnostic: (error) => reportDispatchDiagnostic(`write host verification memo for ${envelope.id}`, error),
5500
- });
5648
+ onDiagnostic: (error: unknown) =>
5649
+ reportDispatchDiagnostic(`write host verification memo for ${envelope.id}`, error),
5650
+ };
5651
+ // This await is the batch barrier. It already sits before
5652
+ // buildReceiptDraft below, which is why batch settlement needs no
5653
+ // receipt restructuring: every member parks here with its outcome
5654
+ // resolved and nothing sealed.
5655
+ const hostVerification =
5656
+ settlement === undefined
5657
+ ? await runHostVerification(hostVerificationInput)
5658
+ : await settlement.arrive(hostVerificationInput);
5501
5659
  const hostRejection = hostVerificationRejection(hostVerification);
5502
5660
  if (hostRejection !== null && finalOutcome === "succeeded") {
5503
5661
  finalOutcome = "failed";
@@ -5690,12 +5848,20 @@ export function createDispatchBundle(
5690
5848
  async function dispatch(
5691
5849
  req: DispatchRequest,
5692
5850
  observer?: DispatchAdmissionObserver,
5851
+ preparation?: DispatchPreparationOptions,
5852
+ settlement?: BatchVerificationGate,
5693
5853
  ): Promise<{
5694
5854
  runId: string;
5695
5855
  events: AsyncIterableIterator<unknown>;
5696
5856
  finalPromise: Promise<RunReceipt>;
5697
5857
  }> {
5698
- let prepared = req;
5858
+ let prepared =
5859
+ preparation?.deadlineAt === undefined
5860
+ ? req
5861
+ : {
5862
+ ...req,
5863
+ assignmentDeadlineAt: Math.min(req.assignmentDeadlineAt ?? Number.POSITIVE_INFINITY, preparation.deadlineAt),
5864
+ };
5699
5865
  let createdWorktree: DispatchRequest["taskWorktree"];
5700
5866
  let writerLease: CheckoutWriterLease | undefined;
5701
5867
  const writerRecipe = agents.get(req.agentId);
@@ -5727,7 +5893,7 @@ export function createDispatchBundle(
5727
5893
  return rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel) ? entry : resolvePath(taskWorktree.path, rel);
5728
5894
  });
5729
5895
  prepared = {
5730
- ...req,
5896
+ ...prepared,
5731
5897
  runIdHint: runId,
5732
5898
  taskWorktree,
5733
5899
  cwd: workerCwd,
@@ -5737,7 +5903,8 @@ export function createDispatchBundle(
5737
5903
  }
5738
5904
  let handle: Awaited<ReturnType<typeof dispatchAttempt>>;
5739
5905
  try {
5740
- handle = await dispatchAttempt(prepared, observer);
5906
+ preparation?.signal?.throwIfAborted();
5907
+ handle = await dispatchAttempt(prepared, observer, preparation, settlement);
5741
5908
  } catch (error) {
5742
5909
  writerLease?.release();
5743
5910
  if (createdWorktree !== undefined) {
@@ -5752,6 +5919,14 @@ export function createDispatchBundle(
5752
5919
  }
5753
5920
  throw error;
5754
5921
  }
5922
+ // A finalization that throws before the barrier, and an ACP handle that
5923
+ // never reaches it at all, must not park their siblings forever. A member
5924
+ // that already arrived is parked and abandon() is a no-op for it, so this
5925
+ // fires harmlessly on the normal path.
5926
+ if (settlement !== undefined) {
5927
+ const release = (): void => settlement.abandon(handle.runId);
5928
+ handle.finalPromise.then(release, release);
5929
+ }
5755
5930
  // Requests carrying lineage are internal attempts (retry or nested
5756
5931
  // orchestration) and retain the per-attempt handle contract.
5757
5932
  if (req.lineage) return { ...handle, finalPromise: handle.finalPromise.finally(() => writerLease?.release()) };
@@ -5856,7 +6031,6 @@ export function createDispatchBundle(
5856
6031
  );
5857
6032
  assertPostRuntimeToolCompatibility(req.agentId, agentSpec, effectiveTools, target);
5858
6033
  assertRuntimeCanHonorWorkerPermissionMode(target.runtime, settings?.fleet.permissions.mode ?? "deny");
5859
- assertWorkerBudgetEnforceable(target.runtime, agentSpec.budget !== null || req.budget !== undefined);
5860
6034
  assertResponseSchemaEnforceable(target.runtime, target.modelCapabilities, req.responseSchema, effectiveTools.length);
5861
6035
  assertWriteRootsEnforceable(target.runtime, pathScope.writeBoundaries);
5862
6036
  assertProtectedArtifactsEnforceable(
@@ -5870,6 +6044,7 @@ export function createDispatchBundle(
5870
6044
  declared: agentSpec.budget,
5871
6045
  allowedTools: effectiveTools,
5872
6046
  settings,
6047
+ runtime: target.runtime,
5873
6048
  });
5874
6049
  const endpoint = endpointCapacityForTarget(target.target.id);
5875
6050
  return {
@@ -6118,17 +6293,29 @@ export function createDispatchBundle(
6118
6293
  })();
6119
6294
  }
6120
6295
 
6121
- async function dispatchBatch(reqs: ReadonlyArray<DispatchRequest>): Promise<{
6296
+ async function dispatchBatch(
6297
+ reqs: ReadonlyArray<DispatchRequest>,
6298
+ preparation?: DispatchPreparationOptions,
6299
+ ): Promise<{
6122
6300
  batchId: string;
6123
6301
  assignmentIds: ReadonlyArray<string>;
6124
6302
  events: AsyncIterableIterator<unknown>;
6125
6303
  finalPromise: Promise<ReadonlyArray<RunReceipt>>;
6126
6304
  }> {
6127
6305
  if (reqs.length === 0) throw new Error("dispatch: batch requires at least one request");
6306
+ // Two or more concurrent workers share one checkout, so a declared check
6307
+ // run while a sibling is still editing judges a tree neither worker
6308
+ // authored. The barrier only exists when there is both something to verify
6309
+ // and something that could race it; a one-request batch and a batch with no
6310
+ // declared check keep today's per-run path exactly.
6311
+ const settlement =
6312
+ reqs.length > 1 && reqs.some((req) => (req.resolvedVerification?.length ?? 0) > 0)
6313
+ ? createBatchVerificationGate()
6314
+ : undefined;
6128
6315
  const handles: Array<Awaited<ReturnType<typeof dispatch>> & { agentId: string }> = [];
6129
6316
  try {
6130
6317
  for (const req of reqs) {
6131
- const handle = await dispatch(req);
6318
+ const handle = await dispatch(req, undefined, preparation, settlement);
6132
6319
  handles.push({ ...handle, agentId: req.agentId });
6133
6320
  }
6134
6321
  } catch (err) {
@@ -6347,6 +6534,7 @@ export function createDispatchBundle(
6347
6534
  // Reconciliation is best-effort; a failure never blocks startup.
6348
6535
  }
6349
6536
  startHeartbeatWatchdog();
6537
+ probeEndpointsAtDefaultBound();
6350
6538
  },
6351
6539
  async stop() {
6352
6540
  // Shutdown is process-local. The durable machine-wide drain belongs to