@iowarp/clio-coder 0.4.3 → 0.4.5

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 (670) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/CONTRIBUTING.md +25 -15
  3. package/README.md +340 -27
  4. package/dist/{acp-H2NGRPWO.js → acp-H3CU2HBQ.js} +25 -25
  5. package/dist/{agents-TL5LLUQP.js → agents-IXQQZ7BD.js} +77 -75
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-E5SW4HMS.js → auth-R7KYF7N3.js} +38 -39
  8. package/dist/builtins-CRFDQUVP.js +22 -0
  9. package/dist/{chunk-7DRAWPTZ.js → chunk-22PQ4TX4.js} +4 -4
  10. package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
  11. package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
  12. package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
  13. package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
  14. package/dist/{chunk-5TSRNF4G.js → chunk-3T4DXWP6.js} +170 -12
  15. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  16. package/dist/{chunk-XIVNBFZS.js → chunk-4SVIVOMC.js} +208 -39
  17. package/dist/{chunk-NMJXSHBJ.js → chunk-5A6XR3RJ.js} +44 -19
  18. package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
  19. package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
  20. package/dist/chunk-5DDOTTG4.js +402 -0
  21. package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
  22. package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
  23. package/dist/{chunk-PUVDKJ2Y.js → chunk-5VTJP36Q.js} +5 -7
  24. package/dist/{chunk-JGRC33J2.js → chunk-5ZMXGW7P.js} +90 -9
  25. package/dist/chunk-5ZSZEYJK.js +119 -0
  26. package/dist/chunk-633EXGZA.js +44 -0
  27. package/dist/{chunk-IWT4SF4R.js → chunk-6CDNRHWH.js} +361 -89
  28. package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
  29. package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
  30. package/dist/{chunk-INY6HTFL.js → chunk-6SYEGZI3.js} +12 -12
  31. package/dist/{chunk-SKHCAU7K.js → chunk-6YA46L5A.js} +5 -4
  32. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  33. package/dist/{chunk-L47TF46W.js → chunk-7HBHHVCK.js} +24 -3
  34. package/dist/{chunk-DWUOQKRU.js → chunk-7TKWWPD7.js} +5 -4
  35. package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
  36. package/dist/chunk-7WUZEB2M.js +165 -0
  37. package/dist/{chunk-6PTFB5VS.js → chunk-7YJWEF2L.js} +59 -28
  38. package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
  39. package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
  40. package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
  41. package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
  42. package/dist/chunk-B6UM3OZC.js +15 -0
  43. package/dist/{chunk-MCEPRMZW.js → chunk-BBV5TKE6.js} +5 -5
  44. package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
  45. package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
  46. package/dist/{chunk-42FMPA75.js → chunk-CBSKDFWL.js} +3 -3
  47. package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
  48. package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
  49. package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
  50. package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
  51. package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
  52. package/dist/{chunk-WCXUNS7U.js → chunk-DIMRLNIC.js} +35 -66
  53. package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
  54. package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
  55. package/dist/{chunk-2UG5F4C5.js → chunk-DRD2A54W.js} +116 -52
  56. package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
  57. package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
  58. package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
  59. package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
  60. package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
  61. package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
  62. package/dist/chunk-ECOMVOHP.js +139 -0
  63. package/dist/chunk-EFSEIZE6.js +56 -0
  64. package/dist/{chunk-IJNZMHLA.js → chunk-EHCPSZJF.js} +4 -4
  65. package/dist/{chunk-K6BSR66V.js → chunk-EHOSNVVM.js} +6 -2
  66. package/dist/{chunk-RRNP2ANY.js → chunk-EQEJJ53P.js} +10 -10
  67. package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
  68. package/dist/{chunk-JKKCYP3C.js → chunk-F34AR6O3.js} +21 -15
  69. package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
  70. package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
  71. package/dist/{chunk-MWUZBSAQ.js → chunk-FSTIBAGM.js} +358 -63
  72. package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
  73. package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
  74. package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
  75. package/dist/{chunk-JSC3U7TI.js → chunk-GJ24ODAX.js} +5 -5
  76. package/dist/{chunk-B4VEBZKF.js → chunk-GNQRWTMY.js} +139 -52
  77. package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
  78. package/dist/chunk-GXCCHKN6.js +59 -0
  79. package/dist/{chunk-V2ANDPVT.js → chunk-HGSLRG33.js} +170 -8
  80. package/dist/{chunk-LLDJM5XK.js → chunk-HHVJNVUJ.js} +6 -6
  81. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  82. package/dist/{chunk-VA5FNYMT.js → chunk-HR3HPQ76.js} +42 -5
  83. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  84. package/dist/{chunk-OML5D5V5.js → chunk-I7VLWRK2.js} +8 -8
  85. package/dist/{chunk-VW6DOEDG.js → chunk-ICO4TQ2F.js} +16 -5
  86. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  87. package/dist/{chunk-WBKFA554.js → chunk-ILJ7DWGE.js} +9 -9
  88. package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
  89. package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
  90. package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
  91. package/dist/{chunk-EKCHAPYA.js → chunk-K2HL3GBL.js} +4 -4
  92. package/dist/{chunk-N2Z7HLVY.js → chunk-K6RDB7IA.js} +28 -28
  93. package/dist/{chunk-TM6LQDI3.js → chunk-KDWLXVMN.js} +85 -335
  94. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  95. package/dist/{chunk-RSJ25QSL.js → chunk-KF6GFW6O.js} +217 -50
  96. package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
  97. package/dist/chunk-KPRLAMP4.js +32 -0
  98. package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
  99. package/dist/{chunk-IUE3Y34X.js → chunk-KTFSFCVN.js} +20 -9
  100. package/dist/{chunk-7E7I3WLS.js → chunk-KYKNBD4Y.js} +36 -34
  101. package/dist/chunk-L4N3DWNW.js +539 -0
  102. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  103. package/dist/{chunk-JIEGK6UF.js → chunk-LTR5QCLS.js} +51 -7
  104. package/dist/chunk-LUL5Z66S.js +221 -0
  105. package/dist/chunk-LVFANMOH.js +466 -0
  106. package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
  107. package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
  108. package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
  109. package/dist/{chunk-I7ZPNEJM.js → chunk-M6TAYK66.js} +8 -8
  110. package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
  111. package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
  112. package/dist/chunk-MDU3C27C.js +674 -0
  113. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  114. package/dist/{chunk-4UVU7BJ5.js → chunk-NC4KV7EL.js} +6 -6
  115. package/dist/{chunk-JEQ3XTHC.js → chunk-NF3BK5WR.js} +5 -5
  116. package/dist/chunk-NTK3WTHM.js +141 -0
  117. package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
  118. package/dist/{chunk-UPZU6GE4.js → chunk-NY6IWDVU.js} +6 -6
  119. package/dist/chunk-O2RQ7LCK.js +283 -0
  120. package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
  121. package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
  122. package/dist/{chunk-WRBAGUNF.js → chunk-ODUTYZIU.js} +5 -5
  123. package/dist/{chunk-E3TPLWFX.js → chunk-ONRTXOZY.js} +4 -4
  124. package/dist/{chunk-B4OAX3SI.js → chunk-OQM5IVJY.js} +118 -225
  125. package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
  126. package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
  127. package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
  128. package/dist/{chunk-64I3JVYM.js → chunk-PWWSIB2A.js} +5 -5
  129. package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
  130. package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
  131. package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
  132. package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
  133. package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
  134. package/dist/chunk-R6MAYTMS.js +108 -0
  135. package/dist/{chunk-MUW2BDDH.js → chunk-R6MICQYU.js} +6 -6
  136. package/dist/{chunk-JDAY6FIL.js → chunk-RLTT5GVY.js} +132 -17
  137. package/dist/{chunk-ZWPRK62N.js → chunk-RXIOCVBZ.js} +24 -6
  138. package/dist/{chunk-NIQJ66N4.js → chunk-S32UQ5GL.js} +62 -35
  139. package/dist/{chunk-AX2THNSA.js → chunk-SBZX6ARC.js} +12 -12
  140. package/dist/{chunk-TXOTCRLG.js → chunk-SD7SHNDW.js} +2 -2
  141. package/dist/{chunk-AF4YM7Z4.js → chunk-SDWNDICN.js} +10284 -3756
  142. package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
  143. package/dist/chunk-SL2RDHKO.js +19 -0
  144. package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
  145. package/dist/{chunk-KKOJXO6R.js → chunk-SRZOW5L2.js} +46 -14
  146. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  147. package/dist/chunk-T52TPHYC.js +318 -0
  148. package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
  149. package/dist/{chunk-LDJG7DW3.js → chunk-T7FDXNRU.js} +13 -13
  150. package/dist/{chunk-XPWWI35G.js → chunk-TEG3RYVZ.js} +59 -41
  151. package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
  152. package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
  153. package/dist/{chunk-PAJQJ7BS.js → chunk-TZ7MFRG4.js} +1263 -835
  154. package/dist/{chunk-GI7YYQ3F.js → chunk-U2JOLB7O.js} +415 -83
  155. package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
  156. package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
  157. package/dist/{chunk-CE5AX47J.js → chunk-U7H5WRG5.js} +5 -5
  158. package/dist/{chunk-G76U63X4.js → chunk-U7VQ4NI4.js} +22 -22
  159. package/dist/{chunk-7ZYNNDKC.js → chunk-UFYNOQK4.js} +7 -7
  160. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  161. package/dist/{chunk-QWGDJJYJ.js → chunk-UL36QJX6.js} +14 -14
  162. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  163. package/dist/{chunk-HEQY7ZFI.js → chunk-URBGEOH3.js} +5 -5
  164. package/dist/chunk-USZA7GWL.js +341 -0
  165. package/dist/{chunk-W6RRQCPQ.js → chunk-UTUNT5QL.js} +48 -579
  166. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  167. package/dist/{chunk-F5JHEYZM.js → chunk-UXAC2FX4.js} +73 -41
  168. package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
  169. package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
  170. package/dist/chunk-VLPTKCKT.js +396 -0
  171. package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
  172. package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
  173. package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
  174. package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
  175. package/dist/{chunk-2UH2KFUP.js → chunk-WFKDPU7U.js} +4 -4
  176. package/dist/{chunk-ZDN3Y73Y.js → chunk-WJIMKGD6.js} +9 -51
  177. package/dist/{chunk-YQWYVTMC.js → chunk-WLMSOT73.js} +59 -12
  178. package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
  179. package/dist/chunk-WXA2CFJO.js +23 -0
  180. package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
  181. package/dist/{chunk-2APPQIER.js → chunk-XXBQKW32.js} +11 -11
  182. package/dist/{chunk-2VIKGWFZ.js → chunk-YEJIG7LN.js} +332 -332
  183. package/dist/chunk-YGDMBK7O.js +567 -0
  184. package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
  185. package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
  186. package/dist/{chunk-54CBCGIR.js → chunk-ZMZQEBKI.js} +136 -81
  187. package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
  188. package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
  189. package/dist/cli/index.js +45 -44
  190. package/dist/clio-5I2IBFYL.js +26 -0
  191. package/dist/{code-nav-MDZNQS33.js → code-nav-YXIAEZVS.js} +48 -32
  192. package/dist/codewiki/build-worker.js +76 -29
  193. package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
  194. package/dist/{components-UCUQ4QXW.js → components-TNIKXCBH.js} +13 -14
  195. package/dist/{config-SVM5P5YI.js → config-Y2JDJ3JJ.js} +210 -119
  196. package/dist/configure-SML6UBZ5.js +55 -0
  197. package/dist/{context-2OHRKS42.js → context-P5YSEO55.js} +125 -115
  198. package/dist/{context-VNCR7KAG.js → context-QQ53HSGJ.js} +91 -62
  199. package/dist/{context-E3VC7RX5.js → context-S2EEC3EJ.js} +62 -31
  200. package/dist/context-clear-TMEQCOTH.js +183 -0
  201. package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
  202. package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
  203. package/dist/{context-working-set-VDS25HXZ.js → context-working-set-CNLSQN5K.js} +31 -31
  204. package/dist/detail-5572VLBO.js +114 -0
  205. package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-FRHD6P2O.js} +214 -126
  206. package/dist/{docs-PD3EXDKU.js → docs-BL7ROUFN.js} +5 -7
  207. package/dist/{doctor-WNNVO6FY.js → doctor-N3LCM2LG.js} +89 -66
  208. package/dist/{eval-7G7SGAYO.js → eval-BUU3ZOUZ.js} +493 -197
  209. package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
  210. package/dist/evidence-DTGEN456.js +224 -0
  211. package/dist/{evidence-VD6736FQ.js → evidence-SQ5DNFEN.js} +114 -195
  212. package/dist/{evolve-AL3NGVRL.js → evolve-IJNUFZDS.js} +107 -88
  213. package/dist/{extensions-MOVJ32NM.js → extensions-YVRHX6ZI.js} +16 -17
  214. package/dist/{fleet-QZHUMAGI.js → fleet-ZNNVSYFO.js} +147 -141
  215. package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-5YE7NPJL.js} +27 -23
  216. package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-3SBSCTCW.js} +16 -15
  217. package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-6HHPWF5T.js} +39 -38
  218. package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-JEYMGCGC.js} +107 -87
  219. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  220. package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-QRSHIIDE.js} +10 -10
  221. package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-4PM4GDDL.js} +46 -42
  222. package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-NJDTHTO3.js} +105 -85
  223. package/dist/fleet-view-UP2BWQQY.js +117 -0
  224. package/dist/{init-J477LKZH.js → init-S3GZQ5ZF.js} +123 -117
  225. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  226. package/dist/{interop-3FCM6XLG.js → interop-YOTGXFJM.js} +25 -26
  227. package/dist/inventory-K2OZ36YJ.js +117 -0
  228. package/dist/{library-QUQEIUG6.js → library-GJI6W6OK.js} +45 -45
  229. package/dist/{memory-SGGSEP65.js → memory-OQOXQGYD.js} +107 -90
  230. package/dist/{models-HEKUAXXK.js → models-3IK2Y5WE.js} +64 -65
  231. package/dist/{monitor-HKU57TYQ.js → monitor-FTJLTKCQ.js} +136 -101
  232. package/dist/{orchestrator-VDFAEFAI.js → orchestrator-N47O7SFD.js} +1442 -1671
  233. package/dist/{panes-DN2SSFOH.js → panes-7BTYH3XQ.js} +8 -8
  234. package/dist/{panes-TALGNPZT.js → panes-WPOMEMRH.js} +22 -23
  235. package/dist/{paths-NBMFAIEZ.js → paths-J3KN7UAO.js} +12 -13
  236. package/dist/preload-65U34NG6.js +115 -0
  237. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  238. package/dist/{reset-EAJFFJVB.js → reset-MUVQDLNL.js} +20 -21
  239. package/dist/{resources-OVKSEFVE.js → resources-LM76COAO.js} +41 -40
  240. package/dist/{run-7DP7ZF2J.js → run-3VFZQ33N.js} +168 -166
  241. package/dist/{share-WML67FT3.js → share-4JUB4BL7.js} +43 -43
  242. package/dist/{skills-SG662R2K.js → skills-S36AAJHU.js} +47 -47
  243. package/dist/{skills-eval-VVZEUU46.js → skills-eval-G6T57L7M.js} +127 -104
  244. package/dist/{skills-inventory-I2E23GET.js → skills-inventory-WLM46PJH.js} +41 -40
  245. package/dist/slash-commands-GBARG3Y7.js +91 -0
  246. package/dist/{steer-2LQOMCPB.js → steer-S7D7IKPU.js} +7 -7
  247. package/dist/{support-CC2UJBJ6.js → support-5VAEC32W.js} +14 -14
  248. package/dist/{targets-4QC3HIEW.js → targets-N5REUETU.js} +147 -98
  249. package/dist/tasks-6BVY5YZF.js +36 -0
  250. package/dist/{terminal-lease-TUHIJ6Y2.js → terminal-lease-57UEOJKS.js} +12 -11
  251. package/dist/tools-6OCQ6SVB.js +28 -0
  252. package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
  253. package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
  254. package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
  255. package/dist/{uninstall-5PEVOE5B.js → uninstall-FXYMFFRT.js} +19 -20
  256. package/dist/{upgrade-M4WXY6KN.js → upgrade-4HD5HAIV.js} +49 -45
  257. package/dist/{usage-N7ZNVLEM.js → usage-4GWM2WWP.js} +143 -103
  258. package/dist/{verifiers-DJTP4XX6.js → verifiers-GSKWKWVG.js} +162 -28
  259. package/dist/verify-3AS3ULCY.js +30 -0
  260. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  261. package/dist/{web-fetch-MPARV2K7.js → web-fetch-MQN4FH3X.js} +169 -18
  262. package/dist/wiki-generate-7BV7XWIY.js +614 -0
  263. package/dist/{with-panes-4GCGSL7J.js → with-panes-OFTNAR4Y.js} +34 -20
  264. package/dist/worker/entry.js +99 -85
  265. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  266. package/docs/README.md +10 -8
  267. package/docs/architecture/acp.md +27 -0
  268. package/docs/architecture/architecture.md +5 -5
  269. package/docs/architecture/artifact-versions.md +1 -1
  270. package/docs/architecture/context-engine.md +44 -59
  271. package/docs/architecture/context-working-set.md +7 -9
  272. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  273. package/docs/architecture/dispatch-typed-intent.md +1 -1
  274. package/docs/architecture/evidence-and-memory.md +11 -1
  275. package/docs/architecture/observability.md +7 -1
  276. package/docs/architecture/pi-boundary.md +37 -7
  277. package/docs/architecture/prompt-envelope-and-tools.md +22 -12
  278. package/docs/architecture/safety-model.md +10 -17
  279. package/docs/architecture/session-lifecycle.md +4 -4
  280. package/docs/architecture/tui-design.md +1 -1
  281. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  282. package/docs/guide/built-in-agents.md +8 -8
  283. package/docs/guide/commands-and-modes.md +66 -38
  284. package/docs/guide/configuration-and-targets.md +10 -3
  285. package/docs/guide/configuration-reference.md +23 -8
  286. package/docs/guide/environment-variables.md +8 -4
  287. package/docs/guide/fleet-dispatch.md +12 -0
  288. package/docs/guide/installation-and-lifecycle.md +35 -9
  289. package/docs/guide/proactive-memory.md +1 -1
  290. package/docs/guide/skills-marketplace.md +11 -3
  291. package/docs/guide/tool-usage.md +87 -5
  292. package/docs/history/config-knobs-audit.md +2 -2
  293. package/docs/process/development-pipeline.md +15 -10
  294. package/docs/process/documentation-guide.md +2 -2
  295. package/docs/process/eval-runner.md +15 -0
  296. package/docs/process/evals-internal.md +1 -1
  297. package/docs/process/git-commit-provenance.md +15 -0
  298. package/docs/process/release-cut-checklist.md +207 -0
  299. package/docs/process/scientific-validation.md +18 -17
  300. package/evals/README.md +4 -0
  301. package/evals/behavioral-corpus-grader.mjs +147 -14
  302. package/evals/behavioral-machinery-support.ts +1 -0
  303. package/evals/behavioral-machinery.yaml +1 -1
  304. package/evals/behavioral-model-negative-control.yaml +1 -0
  305. package/evals/behavioral-model.yaml +266 -1
  306. package/evals/fixtures/docs-retrieval.json +102 -0
  307. package/evals/fixtures/scalar-decision.json +17 -0
  308. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  309. package/evals/fixtures/source-explanation.json +74 -0
  310. package/evals/fixtures/tool-arguments.json +18 -0
  311. package/evals/fixtures/tool-surface/read.txt +4 -0
  312. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  313. package/evals/no-edit-memory-grader.mjs +149 -0
  314. package/evals/scalar-decision-grader.py +41 -0
  315. package/evals/scalar-decision-machinery.ts +145 -0
  316. package/evals/source-explanation-grader.mjs +118 -0
  317. package/evals/tool-surface-grader.mjs +53 -0
  318. package/evals/tool-surface-model.yaml +274 -0
  319. package/package.json +14 -14
  320. package/skills/README.md +6 -6
  321. package/skills/coding/coding-standards/SKILL.md +14 -4
  322. package/skills/context/context-handoff/SKILL.md +3 -3
  323. package/skills/context/context-prime/SKILL.md +3 -3
  324. package/skills/planning/architecture/SKILL.md +5 -5
  325. package/skills/planning/backlog/SKILL.md +4 -4
  326. package/skills/planning/prd/SKILL.md +4 -3
  327. package/skills/planning/product-intent/SKILL.md +8 -8
  328. package/skills/planning/tech-spec/SKILL.md +4 -4
  329. package/skills/registry.yaml +33 -33
  330. package/skills/research/arxiv-literature/SKILL.md +3 -3
  331. package/skills/research/experiment-protocol/SKILL.md +3 -3
  332. package/skills/research/scientific-debugging/SKILL.md +3 -2
  333. package/skills/research/scientific-modernization/SKILL.md +3 -3
  334. package/skills/skill-marketplace.json +17 -17
  335. package/skills/workflow/cut-it/SKILL.md +3 -4
  336. package/skills/workflow/design-council/SKILL.md +5 -10
  337. package/skills/workflow/grill-me/SKILL.md +14 -15
  338. package/skills/workflow/workflow-distiller/SKILL.md +4 -4
  339. package/src/cli/args.ts +0 -8
  340. package/src/cli/bootstrap-generate.ts +6 -0
  341. package/src/cli/config-inspect.ts +24 -7
  342. package/src/cli/config-trust.ts +62 -0
  343. package/src/cli/config.ts +8 -0
  344. package/src/cli/configure.ts +2 -1
  345. package/src/cli/context-map.ts +75 -14
  346. package/src/cli/context.ts +46 -17
  347. package/src/cli/doctor-state-size.ts +1 -12
  348. package/src/cli/doctor-validation-contract.ts +28 -0
  349. package/src/cli/doctor.ts +5 -0
  350. package/src/cli/eval.ts +17 -3
  351. package/src/cli/evidence-detail.ts +1 -75
  352. package/src/cli/evidence-inventory.ts +1 -167
  353. package/src/cli/index.ts +2 -0
  354. package/src/cli/modes/print.ts +32 -4
  355. package/src/cli/run.ts +16 -16
  356. package/src/cli/skills-eval.ts +10 -8
  357. package/src/cli/steer-channel.ts +31 -18
  358. package/src/cli/targets.ts +84 -32
  359. package/src/cli/tasks.ts +93 -0
  360. package/src/cli/upgrade.ts +19 -11
  361. package/src/cli/usage.ts +30 -0
  362. package/src/cli/verifiers.ts +147 -1
  363. package/src/cli/wiki-generate.ts +240 -96
  364. package/src/core/bash-exec.ts +43 -15
  365. package/src/core/bus-events.ts +15 -0
  366. package/src/core/commit-attribution.ts +41 -1
  367. package/src/core/config.ts +33 -14
  368. package/src/core/defaults.ts +5 -4
  369. package/src/core/file-references.ts +11 -1
  370. package/src/core/git-commit-attribution.ts +46 -3
  371. package/src/core/incomplete-installation.ts +3 -1
  372. package/src/core/run-overrides.ts +0 -5
  373. package/src/core/settings-layers.ts +21 -5
  374. package/src/core/skill-activation.ts +3 -0
  375. package/src/core/termination.ts +26 -9
  376. package/src/core/tool-names.ts +5 -2
  377. package/src/core/untrusted-content.ts +16 -0
  378. package/src/core/workspace-trust.ts +179 -0
  379. package/src/domains/agents/builtins/architect.md +1 -1
  380. package/src/domains/agents/builtins/coder.md +5 -3
  381. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  382. package/src/domains/agents/builtins/documenter.md +8 -5
  383. package/src/domains/agents/builtins/git-master.md +1 -1
  384. package/src/domains/agents/builtins/provenance.md +7 -7
  385. package/src/domains/agents/builtins/researcher.md +1 -0
  386. package/src/domains/agents/builtins/scout.md +7 -1
  387. package/src/domains/agents/builtins/tester.md +1 -1
  388. package/src/domains/agents/builtins/verifier.md +2 -2
  389. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  390. package/src/domains/agents/result-contract.ts +199 -26
  391. package/src/domains/context/bootstrap-prompt.ts +11 -9
  392. package/src/domains/context/bootstrap.ts +74 -39
  393. package/src/domains/context/clio-md.ts +88 -26
  394. package/src/domains/context/codewiki/build-operation.ts +121 -0
  395. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  396. package/src/domains/context/codewiki/build-worker.ts +3 -35
  397. package/src/domains/context/codewiki/coordinator.ts +36 -6
  398. package/src/domains/context/codewiki/indexer.ts +59 -19
  399. package/src/domains/context/contract.ts +6 -2
  400. package/src/domains/context/extension.ts +97 -11
  401. package/src/domains/context/fingerprint.ts +39 -34
  402. package/src/domains/context/index.ts +7 -1
  403. package/src/domains/context/prompt-context.ts +55 -14
  404. package/src/domains/context/refresh.ts +12 -57
  405. package/src/domains/context/wiki/assemble.ts +14 -10
  406. package/src/domains/context/wiki/evidence.ts +209 -0
  407. package/src/domains/context/wiki/frontmatter.ts +5 -2
  408. package/src/domains/context/wiki/generate.ts +207 -67
  409. package/src/domains/context/wiki/meta.ts +10 -2
  410. package/src/domains/context/wiki/plan-store.ts +70 -14
  411. package/src/domains/context/wiki/plan.ts +71 -14
  412. package/src/domains/context/wiki/prompts.ts +85 -1
  413. package/src/domains/context/wiki/source-content.ts +106 -0
  414. package/src/domains/context/wiki/staleness.ts +33 -22
  415. package/src/domains/context/working-set/contract.ts +8 -2
  416. package/src/domains/context/working-set/engine.ts +17 -4
  417. package/src/domains/context/working-set/fold.ts +15 -2
  418. package/src/domains/context/working-set/marker.ts +2 -1
  419. package/src/domains/context/working-set/project.ts +18 -7
  420. package/src/domains/context/working-set/recall.ts +82 -56
  421. package/src/domains/dispatch/active-route-planner.ts +10 -3
  422. package/src/domains/dispatch/admission-queue.ts +19 -7
  423. package/src/domains/dispatch/admission.ts +3 -3
  424. package/src/domains/dispatch/budget-envelope.ts +47 -82
  425. package/src/domains/dispatch/capacity-lease.ts +57 -19
  426. package/src/domains/dispatch/code-step.ts +11 -4
  427. package/src/domains/dispatch/contract.ts +41 -9
  428. package/src/domains/dispatch/event-pump.ts +28 -7
  429. package/src/domains/dispatch/execution-role.ts +49 -2
  430. package/src/domains/dispatch/execution-scheduler.ts +4 -0
  431. package/src/domains/dispatch/extension.ts +240 -132
  432. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  433. package/src/domains/dispatch/fleet-run.ts +21 -0
  434. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  435. package/src/domains/dispatch/host-verification.ts +114 -13
  436. package/src/domains/dispatch/intent.ts +28 -18
  437. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  438. package/src/domains/dispatch/parallel-writers.ts +34 -0
  439. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  440. package/src/domains/dispatch/reservation-store.ts +13 -37
  441. package/src/domains/dispatch/route-approval.ts +3 -3
  442. package/src/domains/dispatch/route-observer.ts +4 -2
  443. package/src/domains/dispatch/route-quality.ts +6 -1
  444. package/src/domains/dispatch/state.ts +15 -2
  445. package/src/domains/dispatch/types.ts +21 -5
  446. package/src/domains/dispatch/worker-spawn.ts +58 -21
  447. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  448. package/src/domains/eval/compare/behavioral.ts +81 -14
  449. package/src/domains/eval/compare/compare.ts +15 -5
  450. package/src/domains/eval/compare/envelope.ts +12 -5
  451. package/src/domains/eval/metrics/context.ts +24 -1
  452. package/src/domains/eval/metrics/tracked.ts +4 -28
  453. package/src/domains/eval/reports/comparison.ts +9 -9
  454. package/src/domains/eval/runners/clio-run.ts +17 -10
  455. package/src/domains/eval/runners/context-index.ts +2 -7
  456. package/src/domains/eval/runners/context-init.ts +3 -6
  457. package/src/domains/eval/runners/external-command.ts +29 -11
  458. package/src/domains/eval/schema/suite.ts +2 -0
  459. package/src/domains/eval/schema/validate.ts +1 -0
  460. package/src/domains/eval/suites/run.ts +189 -13
  461. package/src/domains/eval/verifiers/integrity.ts +39 -0
  462. package/src/domains/eval/verifiers/patch.ts +58 -2
  463. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  464. package/src/domains/evidence/build.ts +106 -17
  465. package/src/domains/evidence/detail.ts +69 -0
  466. package/src/domains/evidence/eval.ts +13 -1
  467. package/src/domains/evidence/finish-contract-map.ts +5 -1
  468. package/src/domains/evidence/inventory.ts +167 -0
  469. package/src/domains/evidence/store.ts +16 -0
  470. package/src/domains/evidence/types.ts +12 -0
  471. package/src/domains/extensions/resources.ts +7 -0
  472. package/src/domains/interop/registry.ts +2 -2
  473. package/src/domains/middleware/hooks-io.ts +45 -26
  474. package/src/domains/middleware/hooks.ts +6 -0
  475. package/src/domains/middleware/injection-screen.ts +23 -0
  476. package/src/domains/middleware/marketplace-offer.ts +20 -1
  477. package/src/domains/middleware/rules.ts +5 -1
  478. package/src/domains/middleware/runtime.ts +7 -3
  479. package/src/domains/middleware/stalled-turn.ts +18 -3
  480. package/src/domains/middleware/task-board-reminder.ts +4 -2
  481. package/src/domains/middleware/task-nudge.ts +4 -1
  482. package/src/domains/mux/contract.ts +34 -1
  483. package/src/domains/mux/detect.ts +3 -6
  484. package/src/domains/mux/dock-controller.ts +8 -1
  485. package/src/domains/mux/index.ts +1 -0
  486. package/src/domains/mux/socket-client.ts +13 -3
  487. package/src/domains/observability/accountability.ts +15 -1
  488. package/src/domains/observability/contract.ts +54 -9
  489. package/src/domains/observability/evidence-index.ts +10 -0
  490. package/src/domains/observability/extension.ts +9 -5
  491. package/src/domains/observability/projection.ts +423 -53
  492. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  493. package/src/domains/prompts/compiler.ts +10 -2
  494. package/src/domains/prompts/contract.ts +7 -4
  495. package/src/domains/prompts/extension.ts +28 -64
  496. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  497. package/src/domains/prompts/fragments/operating/contract.md +12 -0
  498. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  499. package/src/domains/prompts/fragments/wiki/page.md +36 -15
  500. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  501. package/src/domains/prompts/preload-prefix.ts +31 -0
  502. package/src/domains/prompts/preload.ts +135 -61
  503. package/src/domains/providers/auth/backend-file.ts +15 -11
  504. package/src/domains/providers/auth/storage.ts +3 -5
  505. package/src/domains/providers/catalog.ts +18 -3
  506. package/src/domains/providers/model-discovery.ts +1 -4
  507. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
  508. package/src/domains/providers/runtime-resolution.ts +11 -9
  509. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  510. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  511. package/src/domains/providers/support.ts +1 -1
  512. package/src/domains/providers/types/runtime-descriptor.ts +1 -1
  513. package/src/domains/resources/skills/promotion.ts +8 -1
  514. package/src/domains/safety/action-classifier.ts +16 -0
  515. package/src/domains/safety/autonomy.ts +10 -1
  516. package/src/domains/safety/contract.ts +5 -1
  517. package/src/domains/safety/default-path-policy.ts +13 -0
  518. package/src/domains/safety/extension.ts +11 -2
  519. package/src/domains/safety/finish-contract-registration.ts +29 -14
  520. package/src/domains/safety/finish-contract.ts +252 -40
  521. package/src/domains/safety/index.ts +20 -1
  522. package/src/domains/safety/policy-engine.ts +211 -34
  523. package/src/domains/safety/project-policy.ts +7 -2
  524. package/src/domains/safety/rigor.ts +53 -39
  525. package/src/domains/safety/validation-contract.ts +388 -0
  526. package/src/domains/safety/workspace-trust.ts +43 -0
  527. package/src/domains/session/archive-readers.ts +10 -1
  528. package/src/domains/session/compaction/compact.ts +384 -21
  529. package/src/domains/session/compaction/cut-point.ts +42 -5
  530. package/src/domains/session/compaction/tokens.ts +9 -1
  531. package/src/domains/session/decision-board.ts +137 -28
  532. package/src/domains/session/entries.ts +213 -11
  533. package/src/domains/session/extension.ts +4 -4
  534. package/src/domains/session/handoff.ts +2 -1
  535. package/src/domains/session/manager.ts +2 -3
  536. package/src/domains/session/prompt-manifest.ts +47 -8
  537. package/src/domains/session/task-board.ts +32 -1
  538. package/src/domains/session/tree/fork.ts +1 -2
  539. package/src/domains/session/tree/navigator.ts +1 -1
  540. package/src/domains/user-tasks/acceptance.ts +56 -0
  541. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  542. package/src/domains/user-tasks/handoff.ts +16 -0
  543. package/src/domains/user-tasks/store.ts +34 -3
  544. package/src/engine/acp/adapter.ts +60 -10
  545. package/src/engine/acp/server.ts +22 -4
  546. package/src/engine/acp/transport.ts +55 -9
  547. package/src/engine/acp/types.ts +9 -0
  548. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  549. package/src/engine/api-registry.ts +19 -2
  550. package/src/engine/apis/ollama-native.ts +15 -0
  551. package/src/engine/apis/openai-completions.ts +13 -6
  552. package/src/engine/apis/output-budget.ts +26 -10
  553. package/src/engine/claude/sdk-runtime.ts +4 -3
  554. package/src/engine/claude/subprocess-runtime.ts +107 -60
  555. package/src/engine/env-api-keys.ts +2 -1
  556. package/src/engine/external-subprocess.ts +26 -7
  557. package/src/engine/loop-guard.ts +19 -2
  558. package/src/engine/provider-diagnostics.ts +129 -0
  559. package/src/engine/provider-payload.ts +3 -1
  560. package/src/engine/worker-runtime.ts +13 -2
  561. package/src/engine/worker-tools.ts +5 -1
  562. package/src/entry/extension-reload.ts +1 -0
  563. package/src/entry/orchestrator.ts +64 -17
  564. package/src/interactive/chat-loop-messages.ts +12 -4
  565. package/src/interactive/chat-loop.ts +115 -45
  566. package/src/interactive/chat-renderer.ts +60 -0
  567. package/src/interactive/context-recall-command.ts +2 -1
  568. package/src/interactive/dispatch-board.ts +58 -714
  569. package/src/interactive/editor-submit.ts +13 -0
  570. package/src/interactive/fleet-run-preview.ts +2 -1
  571. package/src/interactive/interactive-application.ts +11 -4
  572. package/src/interactive/interactive-event-projection.ts +7 -1
  573. package/src/interactive/interactive-presentation.ts +63 -12
  574. package/src/interactive/interactive-slash-runtime.ts +4 -1
  575. package/src/interactive/layout.ts +2 -1
  576. package/src/interactive/model-session-replay.ts +2 -2
  577. package/src/interactive/oracle.ts +5 -2
  578. package/src/interactive/overlay-frame.ts +1 -0
  579. package/src/interactive/overlay-general-openers.ts +3 -1
  580. package/src/interactive/overlay-session-lifecycle.ts +6 -0
  581. package/src/interactive/overlays/ask-user.ts +1 -0
  582. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  583. package/src/interactive/overlays/message-picker.ts +3 -3
  584. package/src/interactive/overlays/settings.ts +2 -2
  585. package/src/interactive/overlays/tree-selector.ts +2 -2
  586. package/src/interactive/renderers/branch-summary.ts +1 -1
  587. package/src/interactive/renderers/tool-execution.ts +17 -1
  588. package/src/interactive/renderers/worker-entry.ts +25 -10
  589. package/src/interactive/slash-autocomplete.ts +4 -6
  590. package/src/interactive/slash-commands.ts +31 -43
  591. package/src/interactive/slash-spec.ts +28 -0
  592. package/src/interactive/turn-context.ts +221 -53
  593. package/src/interactive/turn-middleware.ts +3 -1
  594. package/src/interactive/turn-persistence.ts +3 -0
  595. package/src/interactive/turn-runtime.ts +11 -2
  596. package/src/interactive/turn-state.ts +10 -9
  597. package/src/interactive/view/artifacts.ts +2 -0
  598. package/src/interactive/watch-pane.ts +18 -4
  599. package/src/interactive/worker-stream.ts +14 -10
  600. package/src/tools/agent-tools.ts +6 -3
  601. package/src/tools/bash.ts +1 -1
  602. package/src/tools/bootstrap.ts +4 -0
  603. package/src/tools/builtin-tool-catalog.ts +40 -2
  604. package/src/tools/codewiki/code-nav.ts +4 -10
  605. package/src/tools/compete-judge-task.ts +71 -0
  606. package/src/tools/compete-worktrees.ts +41 -1
  607. package/src/tools/context/index.ts +32 -7
  608. package/src/tools/context/surface.ts +15 -4
  609. package/src/tools/core-bootstrap.ts +16 -0
  610. package/src/tools/decide.ts +136 -0
  611. package/src/tools/dispatch-admission.ts +33 -1
  612. package/src/tools/dispatch-arguments.ts +38 -1
  613. package/src/tools/dispatch-plan.ts +12 -9
  614. package/src/tools/dispatch-runner.ts +63 -33
  615. package/src/tools/dispatch-schema.ts +30 -23
  616. package/src/tools/dispatch-scout-admission.ts +10 -44
  617. package/src/tools/dispatch-scout.ts +2 -3
  618. package/src/tools/dispatch-types.ts +6 -0
  619. package/src/tools/evidence.ts +96 -0
  620. package/src/tools/find.ts +13 -4
  621. package/src/tools/grep.ts +13 -1
  622. package/src/tools/limitation.ts +76 -0
  623. package/src/tools/ls.ts +7 -1
  624. package/src/tools/monitor.ts +26 -11
  625. package/src/tools/network-policy.ts +11 -24
  626. package/src/tools/observation.ts +39 -2
  627. package/src/tools/policy.ts +9 -0
  628. package/src/tools/presentation.ts +3 -0
  629. package/src/tools/read.ts +112 -15
  630. package/src/tools/registry.ts +55 -18
  631. package/src/tools/result-shaping.ts +127 -7
  632. package/src/tools/task-worktree.ts +13 -3
  633. package/src/tools/tasks.ts +40 -5
  634. package/src/tools/verify/authoring.ts +170 -83
  635. package/src/tools/verify/catalog.ts +122 -5
  636. package/src/tools/verify/frontend.ts +67 -30
  637. package/src/tools/verify/index.ts +2 -1
  638. package/src/tools/verify/numeric.ts +303 -0
  639. package/src/tools/verify/perf.ts +143 -0
  640. package/src/tools/verify/scripts.ts +229 -2
  641. package/src/tools/web-fetch-network.ts +179 -0
  642. package/src/tools/web-fetch-surface.ts +2 -1
  643. package/src/tools/web-fetch.ts +15 -13
  644. package/src/tools/worker-evidence.ts +27 -0
  645. package/src/worker/spec-contract.ts +12 -8
  646. package/dist/builtins-IA7V7FUC.js +0 -22
  647. package/dist/chunk-2WZ546HR.js +0 -792
  648. package/dist/chunk-5PSMVOLM.js +0 -56
  649. package/dist/chunk-7DICMOS6.js +0 -313
  650. package/dist/chunk-BEPZRGGU.js +0 -1560
  651. package/dist/chunk-JVCV3ICN.js +0 -47
  652. package/dist/chunk-KK4JZPBQ.js +0 -3982
  653. package/dist/chunk-MNJGS2IN.js +0 -33
  654. package/dist/chunk-NDINPTJ4.js +0 -641
  655. package/dist/chunk-O5CVSAG5.js +0 -122
  656. package/dist/chunk-OQE5J4C6.js +0 -73
  657. package/dist/chunk-RVG5JXAL.js +0 -41
  658. package/dist/chunk-T56WDKA5.js +0 -183
  659. package/dist/chunk-UUVG37B4.js +0 -244
  660. package/dist/chunk-VPKWYKEY.js +0 -169
  661. package/dist/chunk-Y3CBHOR6.js +0 -228
  662. package/dist/clio-CMMK4KRR.js +0 -25
  663. package/dist/configure-LE3IK2TJ.js +0 -56
  664. package/dist/context-clear-BW4O37TG.js +0 -176
  665. package/dist/fleet-view-SWBR3VGQ.js +0 -97
  666. package/dist/preload-P6DGH2PZ.js +0 -13
  667. package/dist/slash-commands-S7MBJDQK.js +0 -83
  668. package/dist/tools-TFGJICCU.js +0 -29
  669. package/dist/verify-RWE4PPEK.js +0 -27
  670. package/dist/wiki-generate-C7IQOXSP.js +0 -469
@@ -71,10 +71,11 @@ import {
71
71
  resolveAgentToolCompatibility,
72
72
  } from "../agents/spec.js";
73
73
  import type { ConfigContract } from "../config/contract.js";
74
- import type { ContextContract, ProjectStructuredContext } from "../context/contract.js";
74
+ import type { ContextContract, ProjectPromptContext, ProjectStructuredContext } from "../context/contract.js";
75
75
  import type { MiddlewareContract } from "../middleware/contract.js";
76
76
  import { workerSafetyOneLiner } from "../prompts/compiler.js";
77
77
  import type { PromptsContract } from "../prompts/contract.js";
78
+ import { selectProjectPreload } from "../prompts/preload.js";
78
79
  import { type EffectivePricing, resolveEffectivePricing } from "../providers/catalog.js";
79
80
  import {
80
81
  type CapabilityFlags,
@@ -153,7 +154,7 @@ import {
153
154
  import { type BatchState, createBatch, onRunComplete, snapshotBatch } from "./batch-tracker.js";
154
155
  import { type RunToolBudgetEnvelope, resolveToolBudgetEnvelope } from "./budget-envelope.js";
155
156
  import { assessCapabilityMismatch, type CapabilityMismatch } from "./capability-match.js";
156
- import { capacityLeaseUsage, createNodeLeaseUsageReader } from "./capacity-lease.js";
157
+ import { capacityLeaseUsage, capacityLeaseUsageAsync, createNodeLeaseUsageReader } from "./capacity-lease.js";
157
158
  import { acquireCheckoutWriterLease, type CheckoutWriterLease } from "./checkout-writer-lease.js";
158
159
  import type {
159
160
  DispatchAdmissionObserver,
@@ -163,9 +164,9 @@ import type {
163
164
  DispatchRequest,
164
165
  DispatchSnapshot,
165
166
  } from "./contract.js";
166
- import { createWorkerOutputCapture, startDispatchEventPump } from "./event-pump.js";
167
+ import { createWorkerOutputCapture, startDispatchEventPump, workerOutputCaptureBytes } from "./event-pump.js";
167
168
  import type { ExecutionHandoff } from "./execution-handoff.js";
168
- import { appliesRecipeResultContract, routeCorrelationFactsForRun, withAttemptRole } from "./execution-role.js";
169
+ import { dispatchResultContract, routeCorrelationFactsForRun, withAttemptRole } from "./execution-role.js";
169
170
  import {
170
171
  affectsTargetBreaker,
171
172
  classifyFailure,
@@ -231,7 +232,6 @@ import {
231
232
  rebindDispatchReservationMember,
232
233
  releaseDispatchReservation,
233
234
  releaseDispatchReservationMember,
234
- reservedBudgetUsd,
235
235
  reservedPlanPeakSlots,
236
236
  rollbackDispatchReservation,
237
237
  rollbackUnconsumedDispatchReservation,
@@ -364,7 +364,9 @@ interface ActiveRun {
364
364
  stallKilled: boolean;
365
365
  /** ACP event-inactivity window; null for native runs (heartbeat spec governs those). */
366
366
  stallTimeoutMs: number | null;
367
+ /** Internal logical assignment/retry lineage, independent of published host ancestry. */
367
368
  lineage: RunLineage;
369
+ hostRun?: DispatchPreparationOptions["hostRun"];
368
370
  heartbeatAt: HeartbeatStamp | null;
369
371
  heartbeatStatus: HeartbeatStatus;
370
372
  meter: RunTokenMeter;
@@ -777,6 +779,11 @@ function workerDiagnosticsText(result: SpawnedWorkerResult, maxChars: number): s
777
779
  if (malformedStdoutLines > 0) {
778
780
  parts.push(`malformed stdout lines: ${malformedStdoutLines}`);
779
781
  }
782
+ if (result.signal) {
783
+ // Keep the observed close signal beside contract failures, and at the
784
+ // tail so bounded stderr diagnostics cannot truncate it away.
785
+ parts.push(`worker process signal: ${result.signal}`);
786
+ }
780
787
  if (parts.length === 0) return null;
781
788
  return truncateDiagnosticText(parts.join("; "), maxChars);
782
789
  }
@@ -844,14 +851,19 @@ function renderBoundSkillBlock(recipe: AgentRecipe): string {
844
851
  ].join("\n");
845
852
  }
846
853
 
847
- function workerPersonaBody(
848
- req: DispatchRequest,
849
- recipe: AgentRecipe | null,
850
- allowedTools: ReadonlyArray<ToolName>,
851
- ): string {
854
+ /**
855
+ * Whether Clio's canonical `context` tool is attached to this worker. A
856
+ * subprocess runtime runs its own tool loop and never receives Clio's tool
857
+ * surface, so the recipe's `context` entry does not make the tool available
858
+ * there, and bound skills must not be promised through it.
859
+ */
860
+ function canonicalContextAttached(runtime: Pick<RuntimeDescriptor, "kind">, tools: ReadonlyArray<ToolName>): boolean {
861
+ return runtime.kind !== "subprocess" && tools.includes(ToolNames.Context);
862
+ }
863
+
864
+ function workerPersonaBody(req: DispatchRequest, recipe: AgentRecipe | null, contextAttached: boolean): string {
852
865
  const base = req.systemPrompt && req.systemPrompt.length > 0 ? req.systemPrompt : (recipe?.body ?? "");
853
- const skillBlock =
854
- recipe && req.noSkills !== true && allowedTools.includes(ToolNames.Context) ? renderBoundSkillBlock(recipe) : "";
866
+ const skillBlock = recipe && req.noSkills !== true && contextAttached ? renderBoundSkillBlock(recipe) : "";
855
867
  return [base, skillBlock].filter((part) => part.trim().length > 0).join("\n\n");
856
868
  }
857
869
 
@@ -1102,6 +1114,12 @@ export interface WorkerDynamicContext {
1102
1114
  autonomy?: AutonomyLevel | null;
1103
1115
  /** Effective approval routing; defaults to deny for legacy direct callers. */
1104
1116
  onPermission?: WorkerPermissionMode | null;
1117
+ /** Captured authored handbooks; preferred over the legacy structured projection. */
1118
+ projectPrompt?: ProjectPromptContext | null;
1119
+ /** Admitted native read capability; null for an unknown external inventory. */
1120
+ projectReadTools?: boolean | null;
1121
+ /** External runtimes do not promise the native read schema. */
1122
+ projectExternalReadTools?: boolean;
1105
1123
  /** Structured CLIO-CODER.md fields; null when CLIO-CODER.md is absent or malformed. */
1106
1124
  project?: ProjectStructuredContext | null;
1107
1125
  /** The run's own working directory and top-level layout; sent at every tier. */
@@ -1155,10 +1173,10 @@ function renderWorkerProjectContext(
1155
1173
 
1156
1174
  /** True when the rendered project message body includes the verification block. */
1157
1175
  function workerProjectContextIncludesVerification(body: string): boolean {
1158
- return body.includes("\nVerification expectations:\n");
1176
+ return body.startsWith("# Project Context\n") && body.includes("\nVerification expectations:\n");
1159
1177
  }
1160
1178
 
1161
- function buildDynamicPromptMessages(
1179
+ export function buildDynamicPromptMessages(
1162
1180
  req: DispatchRequest,
1163
1181
  dynamicContext: WorkerDynamicContext = {},
1164
1182
  ): WorkerPromptMessage[] {
@@ -1167,10 +1185,22 @@ function buildDynamicPromptMessages(
1167
1185
  const body = renderWorkerWorkspaceContext(dynamicContext.workspace);
1168
1186
  messages.push({ id: "dispatch-workspace", body, contentHash: sha256(body) });
1169
1187
  }
1170
- if (dynamicContext.project && dynamicContext.projectContextTier === "bounded") {
1171
- const body = renderWorkerProjectContext(dynamicContext.project, {
1172
- includeVerification: dynamicContext.capabilityClass === "verification",
1173
- });
1188
+ if (dynamicContext.projectContextTier === "bounded") {
1189
+ const authored = dynamicContext.projectPrompt;
1190
+ // Authored instructions remain verbatim, including test guidance. Never
1191
+ // duplicate them with a second projection of conventions or verification.
1192
+ const body = authored
1193
+ ? authored.handbookSources.length > 0
1194
+ ? selectProjectPreload(authored, dynamicContext.projectReadTools ?? null, {
1195
+ maxChars: WORKER_PROJECT_CONTEXT_MAX_CHARS,
1196
+ externalReadTools: dynamicContext.projectExternalReadTools === true,
1197
+ }).text
1198
+ : ""
1199
+ : dynamicContext.project
1200
+ ? renderWorkerProjectContext(dynamicContext.project, {
1201
+ includeVerification: dynamicContext.capabilityClass === "verification",
1202
+ })
1203
+ : "";
1174
1204
  if (body.length > 0) {
1175
1205
  messages.push({ id: "dispatch-project-context", body, contentHash: sha256(body) });
1176
1206
  }
@@ -1350,6 +1380,8 @@ interface DispatchLifecycleStage {
1350
1380
  pipeline: RunPipelineProvenance | null;
1351
1381
  briefing: RunBriefingProvenance | null;
1352
1382
  personaOverride: RunPersonaOverride | null;
1383
+ /** Decision refs sealed on the request by the dispatch tool; null when the parent board was empty. */
1384
+ decisionRefs: ReadonlyArray<string> | null;
1353
1385
  projectContext: RunProjectContextProvenance;
1354
1386
  /** Rule ids the worker prompt compiler selected into this run's system prompt; [] when none matched. */
1355
1387
  rulesApplied: string[];
@@ -1382,6 +1414,8 @@ interface AcpDelegationLifecycleStage {
1382
1414
  pipeline: RunPipelineProvenance | null;
1383
1415
  briefing: RunBriefingProvenance | null;
1384
1416
  personaOverride: RunPersonaOverride | null;
1417
+ /** Decision refs sealed on the request by the dispatch tool; null when the parent board was empty. */
1418
+ decisionRefs: ReadonlyArray<string> | null;
1385
1419
  projectContext: RunProjectContextProvenance;
1386
1420
  /** ACP delegation bypasses the worker prompt compiler entirely, so this is always []. */
1387
1421
  rulesApplied: string[];
@@ -1445,7 +1479,7 @@ function runtimeLimitations(runtimeKind: RunKind, runtimeId: string): string[] {
1445
1479
  if (runtimeKind === "subprocess" && runtimeId === "antigravity-code") {
1446
1480
  return [
1447
1481
  "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",
1482
+ "Antigravity resumes a conversation only when the caller supplies its id explicitly",
1449
1483
  "Antigravity runs are one-shot and never retried automatically",
1450
1484
  ];
1451
1485
  }
@@ -1617,22 +1651,6 @@ function workerToolCallHardCap(settings: EffectiveSettings): number {
1617
1651
  return settings?.fleet.limits.toolCallsPerRun ?? GUARDRAIL_DEFAULTS.workerToolCallCap;
1618
1652
  }
1619
1653
 
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
1654
  /** Per-tool budget enforcement is real only where Clio observes each tool call. */
1637
1655
  export function budgetEnforcementForRuntime(
1638
1656
  runtime: Pick<RuntimeDescriptor, "kind">,
@@ -1648,7 +1666,6 @@ function resolveEffectiveWorkerBudget(input: {
1648
1666
  settings: EffectiveSettings;
1649
1667
  runtime: RuntimeDescriptor;
1650
1668
  }): RunToolBudgetEnvelope {
1651
- assertWorkerBudgetEnforceable(input.runtime, input.declared !== null || input.req.budget !== undefined);
1652
1669
  const hardCap = workerToolCallHardCap(input.settings);
1653
1670
  const declared = input.declared ?? {
1654
1671
  toolCalls: hardCap,
@@ -1728,15 +1745,6 @@ function assertPlannedNodeIdentity(req: DispatchRequest, actual: RunNodeIdentity
1728
1745
  );
1729
1746
  }
1730
1747
 
1731
- function assertApprovedCostCeiling(req: DispatchRequest, liveCeilingUsd: number): void {
1732
- const approved = req.plan?.costCeilingUsd;
1733
- if (approved === undefined) return;
1734
- if (Object.is(approved, liveCeilingUsd)) return;
1735
- throw new Error(
1736
- `dispatch: scheduling cost ceiling drifted after plan approval (approved $${approved.toFixed(4)}, current $${liveCeilingUsd.toFixed(4)}); re-plan before launch`,
1737
- );
1738
- }
1739
-
1740
1748
  /** Fail closed until another runtime has an explicitly tested JSON-schema wire contract. */
1741
1749
  function assertResponseSchemaEnforceable(
1742
1750
  runtime: RuntimeDescriptor,
@@ -1920,10 +1928,9 @@ function buildDispatchWorkerSpec(input: DispatchWorkerSpecInput, config?: Config
1920
1928
  // Requiring a recipe contract here meant a caller-supplied override against a
1921
1929
  // recipe with none was sealed but never sent, so the worker spent no repair
1922
1930
  // round on a contract it was never told about and the run failed on a shape
1923
- // nothing had asked it for.
1924
- const workerResultContract = appliesRecipeResultContract(input.req.gate?.role)
1925
- ? (input.req.resultContractOverride ?? input.recipe?.resultContract)
1926
- : undefined;
1931
+ // nothing had asked it for. A caller's summary allowance is folded in by
1932
+ // the same resolver the seal uses, so the two never disagree.
1933
+ const workerResultContract = dispatchResultContract(input.req, input.recipe);
1927
1934
  if (workerResultContract) spec.resultContract = workerResultContract;
1928
1935
  const product = input.req.product ?? input.recipe?.product;
1929
1936
  if (product) spec.product = product;
@@ -1954,7 +1961,7 @@ function buildDispatchWorkerSpec(input: DispatchWorkerSpecInput, config?: Config
1954
1961
  if (
1955
1962
  input.req.noSkills !== true &&
1956
1963
  recipeSkills.length > 0 &&
1957
- input.admission.allowedTools.includes(ToolNames.Context)
1964
+ canonicalContextAttached(input.target.runtime, input.admission.allowedTools)
1958
1965
  ) {
1959
1966
  spec.agentSkills = [...new Set(recipeSkills)];
1960
1967
  }
@@ -2577,10 +2584,17 @@ export function createDispatchBundle(
2577
2584
  return configuredEndpointCapacities()[endpoint.key] ?? endpoint;
2578
2585
  }
2579
2586
 
2580
- function reservationCapacitySnapshot(settings: EffectiveSettings): ReservationCapacitySnapshot {
2587
+ /** Initial plan preparation has a synchronous host contract. */
2588
+ function reservationCapacitySnapshotSync(settings: EffectiveSettings): ReservationCapacitySnapshot {
2589
+ return reservationCapacitySnapshot(settings, capacityLeaseUsage());
2590
+ }
2591
+
2592
+ function reservationCapacitySnapshot(
2593
+ settings: EffectiveSettings,
2594
+ usage: ReturnType<typeof capacityLeaseUsage>,
2595
+ ): ReservationCapacitySnapshot {
2596
+ // Read budget after the capacity lock wait too; concurrent callbacks may spend.
2581
2597
  const preflight = scheduling.preflight();
2582
- // Reservation planning compares against a fresh read, never the display cache.
2583
- const usage = capacityLeaseUsage();
2584
2598
  const nodes: Record<string, { active: number; limit: number }> = {
2585
2599
  local: { active: usage.nodes.local ?? 0, limit: configuredGlobalCapacity(settings) },
2586
2600
  };
@@ -2615,7 +2629,7 @@ export function createDispatchBundle(
2615
2629
  ...(task.resolution.endpoint !== undefined ? { endpointKey: task.resolution.endpoint.key } : {}),
2616
2630
  costUpperBoundUsd: task.resolution.routeApproval?.totalCostUpperBoundUsd ?? task.resolution.costUpperBoundUsd,
2617
2631
  })),
2618
- capacity: reservationCapacitySnapshot(getEffectiveSettings()),
2632
+ capacity: reservationCapacitySnapshotSync(getEffectiveSettings()),
2619
2633
  nowMs: now(),
2620
2634
  });
2621
2635
  ownedReservations.add(record.ownerId);
@@ -2646,20 +2660,10 @@ export function createDispatchBundle(
2646
2660
  }
2647
2661
 
2648
2662
  function assertBudgetAdmitsRoute(req: DispatchRequest, pricing: EffectivePricing, settings: EffectiveSettings): void {
2649
- const preflight = scheduling.preflight();
2650
- assertApprovedCostCeiling(req, preflight.ceilingUsd);
2651
- if (preflight.verdict === "over" || preflight.verdict === "at") {
2652
- denyDispatchForBudget(preflight, req.agentId);
2653
- }
2654
2663
  const estimateUsd = conservativeRouteAdmissionEstimateUsd(pricing, admissionMaxOutputTokens(settings));
2655
2664
  const intentCeiling = req.routingIntent?.maxCostUsd;
2656
2665
  if (intentCeiling !== null && intentCeiling !== undefined && estimateUsd > intentCeiling)
2657
2666
  denyDispatchForBudget({ currentUsd: estimateUsd, ceilingUsd: intentCeiling }, req.agentId, estimateUsd);
2658
- const heldUsd = reservedBudgetUsd();
2659
- const projectedUsd = preflight.currentUsd + heldUsd + (req.reservation === undefined ? estimateUsd : 0);
2660
- if (scheduling.checkCeiling(projectedUsd) !== "under") {
2661
- denyDispatchForBudget({ currentUsd: projectedUsd, ceilingUsd: preflight.ceilingUsd }, req.agentId, estimateUsd);
2662
- }
2663
2667
  }
2664
2668
 
2665
2669
  function configuredGlobalCapacity(settings: EffectiveSettings): number {
@@ -2707,7 +2711,12 @@ export function createDispatchBundle(
2707
2711
  const assignmentId =
2708
2712
  req.lineage?.rootRunId ?? req.runIdHint ?? `pending-${queuedAt.toString(36)}-${randomBytes(6).toString("hex")}`;
2709
2713
  const requestedAt = Date.parse(timing.requestedAt ?? timing.queuedAt);
2710
- const deadlineAt = req.assignmentDeadlineAt ?? requestedAt + (req.routingIntent?.deadlineMs ?? 60_000);
2714
+ const deadlineAt =
2715
+ req.assignmentDeadlineAt ??
2716
+ (req.routingIntent?.deadlineMs === undefined || req.routingIntent.deadlineMs === null
2717
+ ? undefined
2718
+ : requestedAt + req.routingIntent.deadlineMs);
2719
+ if (deadlineAt !== undefined) req.assignmentDeadlineAt = deadlineAt;
2711
2720
  if (req.lineage === undefined) await registerAssignment(assignmentId);
2712
2721
  // A plan's queued members keep their wave order and their reserved peak.
2713
2722
  const plan =
@@ -2726,7 +2735,7 @@ export function createDispatchBundle(
2726
2735
  assignmentId,
2727
2736
  nodeId,
2728
2737
  ...(endpoint !== null && endpoint !== undefined ? { endpointKey: endpoint.key } : {}),
2729
- deadlineAt,
2738
+ ...(deadlineAt === undefined ? {} : { deadlineAt }),
2730
2739
  ...plan,
2731
2740
  // A fleet's first attempt carries lineage and still owns the held
2732
2741
  // reservation member that admission must transfer into its lease.
@@ -2750,15 +2759,16 @@ export function createDispatchBundle(
2750
2759
  }
2751
2760
 
2752
2761
  /** Retries only: the first attempt's member was consumed with the planned bound. */
2753
- function rebindReservationSlot(
2762
+ async function rebindReservationSlot(
2754
2763
  req: DispatchRequest,
2755
2764
  nodeId: string,
2756
2765
  endpoint: EndpointCapacity | null,
2757
2766
  costUsd: number,
2758
2767
  settings: EffectiveSettings,
2759
- ): void {
2768
+ ): Promise<void> {
2760
2769
  if (req.reservation === undefined || req.lineage === undefined) return;
2761
- const capacity = reservationCapacitySnapshot(settings);
2770
+ // Retries can await fresh capacity; the advisory display cache is never admission data.
2771
+ const capacity = reservationCapacitySnapshot(settings, await capacityLeaseUsageAsync());
2762
2772
  const rebind = {
2763
2773
  ...req.reservation,
2764
2774
  nodeId,
@@ -2767,7 +2777,7 @@ export function createDispatchBundle(
2767
2777
  capacity,
2768
2778
  nowMs: now(),
2769
2779
  };
2770
- rebindDispatchReservationMember(rebind);
2780
+ await rebindDispatchReservationMember(rebind);
2771
2781
  }
2772
2782
 
2773
2783
  /** Process-local retry queue keyed by finished run; backoff is keyed by assignment root. */
@@ -2786,6 +2796,7 @@ export function createDispatchBundle(
2786
2796
  const retryQueue = new Map<string, RetryQueueEntry>();
2787
2797
  const retryBackoff = new Map<string, BackoffState>();
2788
2798
  const retryReasons = new Map<string, string>();
2799
+ const assignmentRootsByAttempt = new Map<string, string>();
2789
2800
  const assignments = new AssignmentRegistry({
2790
2801
  onStreamError: (error) => reportDispatchDiagnostic("assignment event stream", error),
2791
2802
  });
@@ -2815,8 +2826,19 @@ export function createDispatchBundle(
2815
2826
  }
2816
2827
 
2817
2828
  function lineageFor(req: DispatchRequest, runId: string): RunLineage {
2818
- if (req.lineage) return { ...req.lineage };
2819
- return { parentRunId: null, rootRunId: runId, attempt: 0, depth: 0 };
2829
+ const lineage = req.lineage ? { ...req.lineage } : { parentRunId: null, rootRunId: runId, attempt: 0, depth: 0 };
2830
+ assignmentRootsByAttempt.set(runId, lineage.rootRunId);
2831
+ return lineage;
2832
+ }
2833
+
2834
+ function publishedLineage(lineage: RunLineage, hostRun: DispatchPreparationOptions["hostRun"]): RunLineage {
2835
+ if (hostRun === undefined) return { ...lineage };
2836
+ return {
2837
+ parentRunId: lineage.attempt === 0 ? hostRun.runId : lineage.parentRunId,
2838
+ rootRunId: hostRun.lineage.rootRunId,
2839
+ depth: hostRun.lineage.depth + 1,
2840
+ attempt: lineage.attempt,
2841
+ };
2820
2842
  }
2821
2843
 
2822
2844
  function accumulateFinalizedTotals(receipt: RunReceipt): void {
@@ -3135,7 +3157,7 @@ export function createDispatchBundle(
3135
3157
  if (decision.excludedRouteParts.includes("model")) delete retryReq.model;
3136
3158
  if (decision.excludedRouteParts.includes("runtime")) delete retryReq.workerRuntime;
3137
3159
  }
3138
- const handle = await dispatch(retryReq);
3160
+ const handle = await dispatch(retryReq, undefined, run.hostRun === undefined ? undefined : { hostRun: run.hostRun });
3139
3161
  // The assignment folds every attempt into one stream with a reset marker.
3140
3162
  const marker: AssignmentAttemptStartEvent = {
3141
3163
  type: "attempt_start",
@@ -3321,6 +3343,27 @@ export function createDispatchBundle(
3321
3343
  }
3322
3344
  }
3323
3345
 
3346
+ /** Explicit deadlines outlive queue admission and use the ordinary truthful abort path. */
3347
+ function watchAssignmentDeadline(run: ActiveRun, callerDeadlineAt?: number): void {
3348
+ const deadlineAt = run.req.assignmentDeadlineAt;
3349
+ if (deadlineAt === undefined || (callerDeadlineAt !== undefined && deadlineAt >= callerDeadlineAt)) return;
3350
+ let timer: ReturnType<typeof setTimeout> | undefined;
3351
+ let settled = false;
3352
+ const check = (): void => {
3353
+ if (settled || run.aborted || run.stallKilled) return;
3354
+ const remaining = deadlineAt - now();
3355
+ if (remaining <= 0) {
3356
+ contract.abort(run.runId, { cause: "timeout", detail: "timed out: explicit assignment deadline reached" });
3357
+ } else timer = setTimeout(check, Math.min(2_147_483_647, remaining));
3358
+ };
3359
+ const close = (): void => {
3360
+ settled = true;
3361
+ clearTimeout(timer);
3362
+ };
3363
+ void run.promise.then(close, close);
3364
+ check();
3365
+ }
3366
+
3324
3367
  function startHeartbeatWatchdog(): void {
3325
3368
  if (heartbeatTimer || heartbeatIntervalMs <= 0) return;
3326
3369
  heartbeatTimer = setInterval(checkActiveHeartbeats, heartbeatIntervalMs);
@@ -3482,6 +3525,9 @@ export function createDispatchBundle(
3482
3525
  if (!recipe) {
3483
3526
  throw new Error(`dispatch: unknown agent recipe: ${req.agentId}`);
3484
3527
  }
3528
+ // Resolve the applied contract once here so a caller's summary allowance
3529
+ // on a recipe that carries no summary fails before any model boots.
3530
+ dispatchResultContract(req, recipe);
3485
3531
  const spec = normalizeAgentSpec(recipe);
3486
3532
  if (req.requestOrigin === "user" && !isUserVisibleAgent(spec)) {
3487
3533
  throw new Error(
@@ -3553,8 +3599,8 @@ export function createDispatchBundle(
3553
3599
  ...admission,
3554
3600
  allowedTools: effectiveTools,
3555
3601
  };
3556
- const personaBody = workerPersonaBody(req, recipe, effectiveTools);
3557
- const hasCanonicalContext = effectiveTools.includes(ToolNames.Context);
3602
+ const hasCanonicalContext = canonicalContextAttached(target.runtime, effectiveTools);
3603
+ const personaBody = workerPersonaBody(req, recipe, hasCanonicalContext);
3558
3604
  const hasBoundSkills =
3559
3605
  hasCanonicalContext && recipe.skills !== undefined && recipe.skills.length > 0 && req.noSkills !== true;
3560
3606
  const compiledWorkerPrompt = await prompts.compileWorkerPrompt({
@@ -3584,17 +3630,24 @@ export function createDispatchBundle(
3584
3630
  settings,
3585
3631
  runtime: target.runtime,
3586
3632
  });
3587
- // Fetch structured project context only for tiers that receive it, so
3633
+ // Fetch captured project context only for tiers that receive it, so
3588
3634
  // read-only scouts never pay the CLIO-CODER.md read. The tier is spec policy
3589
3635
  // (capability-class default, recipe frontmatter override).
3590
3636
  const tier = spec.projectContextTier;
3591
- const project = projectContext && tier === "bounded" ? projectContext.projectStructuredContext(cwd) : null;
3637
+ const projectPrompt = projectContext && tier === "bounded" ? projectContext.renderPromptContext(cwd) : null;
3592
3638
  const dynamicPromptMessages = buildDynamicPromptMessages(req, {
3593
3639
  capabilityClass: spec.capabilityClass,
3594
3640
  projectContextTier: tier,
3595
3641
  autonomy: effectiveAutonomy,
3596
3642
  onPermission: settings?.fleet.permissions.mode ?? "deny",
3597
- project,
3643
+ projectPrompt,
3644
+ projectReadTools:
3645
+ target.runtime.kind === "subprocess"
3646
+ ? null
3647
+ : effectiveTools.includes(ToolNames.Read)
3648
+ ? targetToolCapability(target)
3649
+ : false,
3650
+ projectExternalReadTools: target.runtime.kind === "subprocess",
3598
3651
  workspace: readWorkspaceRootFacts(cwd),
3599
3652
  });
3600
3653
  const projectContextProvenance = projectContextProvenanceFor(tier, dynamicPromptMessages);
@@ -3639,6 +3692,7 @@ export function createDispatchBundle(
3639
3692
  pipeline: pipelineProvenanceFor(req),
3640
3693
  briefing: briefingProvenanceFor(req),
3641
3694
  personaOverride,
3695
+ decisionRefs: req.decisionRefs ?? null,
3642
3696
  projectContext: projectContextProvenance,
3643
3697
  rulesApplied: compiledWorkerPrompt.rulesApplied ?? [],
3644
3698
  operatorProfileApplied: compiledWorkerPrompt.operatorProfileApplied ?? false,
@@ -3666,6 +3720,9 @@ export function createDispatchBundle(
3666
3720
  `dispatch: shadow or internal agent '${req.agentId}' cannot run on external ACP agent '${agentId}'`,
3667
3721
  );
3668
3722
  }
3723
+ // A summary allowance on a recipe with no summary field fails here,
3724
+ // before the external agent is started.
3725
+ dispatchResultContract(req, spec);
3669
3726
  }
3670
3727
  if (!settings) throw new Error("dispatch: effective settings required for ACP delegation");
3671
3728
  const configured = settings.integrations.externalAgents.entries.find((entry) => entry.id === agentId);
@@ -3686,21 +3743,24 @@ export function createDispatchBundle(
3686
3743
  }
3687
3744
  const cwd = req.cwd ?? process.cwd();
3688
3745
  const pathScope = resolveDispatchPathScope(req);
3689
- const personaBody = workerPersonaBody(req, null, []);
3746
+ const personaBody = workerPersonaBody(req, null, false);
3690
3747
  // ACP owns an unknown external tool inventory, so it receives the raw
3691
3748
  // bounded persona rather than a native Clio schema-harness claim.
3692
3749
  const systemPrompt = personaBody;
3693
3750
  // ACP delegation defaults to no project context: repo conventions and
3694
3751
  // invariants never leave the machine unless this agent's config opts in
3695
3752
  // with projectContext: "bounded". No recipe means no capability class,
3696
- // so the verification section can never ride along. The safety posture
3753
+ // so no derived verification supplement is added. Authored test guidance
3754
+ // stays intact within the opted-in source budget. The safety posture
3697
3755
  // line still rides along for every worker run.
3698
3756
  const tier: AgentProjectContextTier = configured.projectContext ?? "none";
3699
- const project = projectContext && tier === "bounded" ? projectContext.projectStructuredContext(cwd) : null;
3757
+ const projectPrompt = projectContext && tier === "bounded" ? projectContext.renderPromptContext(cwd) : null;
3700
3758
  const dynamicPromptMessages = buildDynamicPromptMessages(req, {
3701
3759
  projectContextTier: tier,
3702
3760
  autonomy,
3703
- project,
3761
+ projectPrompt,
3762
+ projectReadTools: null,
3763
+ projectExternalReadTools: true,
3704
3764
  workspace: readWorkspaceRootFacts(cwd),
3705
3765
  });
3706
3766
  const projectContextProvenance = projectContextProvenanceFor(tier, dynamicPromptMessages);
@@ -3728,6 +3788,7 @@ export function createDispatchBundle(
3728
3788
  pipeline: pipelineProvenanceFor(req),
3729
3789
  briefing: briefingProvenanceFor(req),
3730
3790
  personaOverride,
3791
+ decisionRefs: req.decisionRefs ?? null,
3731
3792
  projectContext: projectContextProvenance,
3732
3793
  rulesApplied: [],
3733
3794
  operatorProfileApplied: false,
@@ -3742,12 +3803,25 @@ export function createDispatchBundle(
3742
3803
  timing: RunPhaseMarks,
3743
3804
  routeDecision: RouteDecisionV1,
3744
3805
  observer?: DispatchAdmissionObserver,
3806
+ callerDeadlineAt?: number,
3807
+ hostRun?: DispatchPreparationOptions["hostRun"],
3745
3808
  ): Promise<{
3746
3809
  runId: string;
3747
3810
  events: AsyncIterableIterator<unknown>;
3748
3811
  finalPromise: Promise<RunReceipt>;
3749
3812
  }> {
3750
3813
  const lifecycle = resolveAcpDelegationLifecycle(req, settings);
3814
+ const estimate = workerToolCallHardCap(settings);
3815
+ const budgetEnvelope = resolveToolBudgetEnvelope({
3816
+ recipeId: req.agentId,
3817
+ policy: { toolCalls: estimate, readReserve: 0, synthesis: true },
3818
+ ...(req.budget === undefined ? {} : { request: req.budget }),
3819
+ hardCap: estimate,
3820
+ hasReadTool: false,
3821
+ retry: (req.lineage?.attempt ?? 0) > 0,
3822
+ revision: false,
3823
+ enforcement: "external-one-shot",
3824
+ });
3751
3825
  publishDispatchPathScope(req, lifecycle.pathScope);
3752
3826
  timing.decisionCompletedAt = new Date(now()).toISOString();
3753
3827
  const targetId = `delegation:${lifecycle.agentConfig.id}`;
@@ -3829,7 +3903,11 @@ export function createDispatchBundle(
3829
3903
  let outcomeCode: RunOutcomeCode | null = null;
3830
3904
  let reportedSpoofedOutcome = false;
3831
3905
  let runIdForPermissionAudit: string | null = null;
3832
- const outputCapture = createWorkerOutputCapture();
3906
+ const outputCapture = createWorkerOutputCapture({
3907
+ maxBytes: workerOutputCaptureBytes(
3908
+ dispatchResultContract(req, req.agentId && maybeAgents ? maybeAgents.getSpec(req.agentId) : null),
3909
+ ),
3910
+ });
3833
3911
  const markObservedPhase = (field: "firstModelTokenAt" | "firstToolAt"): void => {
3834
3912
  if (timing[field] !== undefined) return;
3835
3913
  timing[field] = new Date(now()).toISOString();
@@ -3997,10 +4075,11 @@ export function createDispatchBundle(
3997
4075
  }
3998
4076
  identity = detectRunIdentity();
3999
4077
  ledgerRef.update(envelope.id, {
4078
+ budget: budgetEnvelope,
4000
4079
  status: "running",
4001
4080
  pid: acp.pid,
4002
4081
  heartbeatAt: heartbeatIso(acp.heartbeatAt),
4003
- lineage,
4082
+ lineage: publishedLineage(lineage, hostRun),
4004
4083
  identity,
4005
4084
  node: LOCAL_RUN_NODE,
4006
4085
  ...(lifecycle.pipeline ? { pipeline: lifecycle.pipeline } : {}),
@@ -4009,6 +4088,7 @@ export function createDispatchBundle(
4009
4088
  ...(req.council !== undefined ? { council: req.council } : {}),
4010
4089
  ...(req.plan !== undefined ? { plan: req.plan } : {}),
4011
4090
  ...(lifecycle.personaOverride ? { personaOverride: lifecycle.personaOverride } : {}),
4091
+ ...(lifecycle.decisionRefs ? { decisionRefs: lifecycle.decisionRefs } : {}),
4012
4092
  });
4013
4093
  observer?.onAdmitted({
4014
4094
  runId: envelope.id,
@@ -4031,6 +4111,7 @@ export function createDispatchBundle(
4031
4111
  });
4032
4112
  }
4033
4113
  context.bus.emit(BusChannels.DispatchStarted, {
4114
+ budget: budgetEnvelope,
4034
4115
  runId: envelope.id,
4035
4116
  agentId: req.agentId,
4036
4117
  task: req.task,
@@ -4081,7 +4162,14 @@ export function createDispatchBundle(
4081
4162
  });
4082
4163
 
4083
4164
  const startedAt = envelope.startedAt;
4165
+ let resolveFinal!: (receipt: RunReceipt) => void;
4166
+ let rejectFinal!: (error: unknown) => void;
4167
+ const finalPromise = new Promise<RunReceipt>((res, rej) => {
4168
+ resolveFinal = res;
4169
+ rejectFinal = rej;
4170
+ });
4084
4171
  const activeRun: ActiveRun = {
4172
+ budget: budgetEnvelope,
4085
4173
  runId: envelope.id,
4086
4174
  req,
4087
4175
  abort: acp.abort,
@@ -4107,12 +4195,13 @@ export function createDispatchBundle(
4107
4195
  stallKilled: false,
4108
4196
  stallTimeoutMs: lifecycle.agentConfig.stallTimeoutMs ?? DEFAULT_ACP_STALL_TIMEOUT_MS,
4109
4197
  lineage,
4198
+ ...(hostRun === undefined ? {} : { hostRun }),
4110
4199
  heartbeatAt: acp.heartbeatAt,
4111
4200
  heartbeatStatus: "alive",
4112
4201
  meter: tokenMeter,
4113
4202
  pricing: null,
4114
4203
  costProvenance: "unknown",
4115
- finalPromise: undefined as unknown as Promise<RunReceipt>,
4204
+ finalPromise,
4116
4205
  };
4117
4206
 
4118
4207
  const buildReceiptDraft = (
@@ -4127,8 +4216,7 @@ export function createDispatchBundle(
4127
4216
  // the same messages, so adding both would double-count. Event-metered
4128
4217
  // values survive only when the adapter reported nothing.
4129
4218
  const usage = result.usage;
4130
- const adapterReportedUsage =
4131
- usage.inputTokens + usage.outputTokens + usage.cacheReadTokens + usage.cacheWriteTokens + usage.reasoningTokens > 0;
4219
+ const adapterReportedUsage = usage.tokensReported;
4132
4220
  if (adapterReportedUsage) {
4133
4221
  tokenMeter.inputTokens = usage.inputTokens;
4134
4222
  tokenMeter.outputTokens = usage.outputTokens;
@@ -4136,8 +4224,9 @@ export function createDispatchBundle(
4136
4224
  tokenMeter.cacheWriteTokens = usage.cacheWriteTokens;
4137
4225
  tokenMeter.reasoningTokens = usage.reasoningTokens;
4138
4226
  }
4139
- const tokenCount =
4140
- tokenMeter.inputTokens + tokenMeter.outputTokens + tokenMeter.cacheReadTokens + tokenMeter.cacheWriteTokens;
4227
+ const tokenCount = adapterReportedUsage
4228
+ ? usage.totalTokens
4229
+ : tokenMeter.inputTokens + tokenMeter.outputTokens + tokenMeter.cacheReadTokens + tokenMeter.cacheWriteTokens;
4141
4230
  const safetyMetadata = safety.policy?.metadata() ?? null;
4142
4231
  const init = result.delegation.initialize;
4143
4232
  const agentInfo = init?.agentInfo;
@@ -4160,7 +4249,7 @@ export function createDispatchBundle(
4160
4249
  outcome,
4161
4250
  outcomeCode,
4162
4251
  outcomeDetail,
4163
- lineage,
4252
+ lineage: publishedLineage(lineage, hostRun),
4164
4253
  identity,
4165
4254
  // An ACP peer is spawned by this process, so the run's node is this host.
4166
4255
  node: LOCAL_RUN_NODE,
@@ -4170,6 +4259,8 @@ export function createDispatchBundle(
4170
4259
  ...(req.council !== undefined ? { council: req.council } : {}),
4171
4260
  ...(req.plan !== undefined ? { plan: req.plan } : {}),
4172
4261
  ...(lifecycle.personaOverride ? { personaOverride: lifecycle.personaOverride } : {}),
4262
+ ...(lifecycle.decisionRefs ? { decisionRefs: lifecycle.decisionRefs } : {}),
4263
+ budget: budgetEnvelope,
4173
4264
  projectContext: lifecycle.projectContext,
4174
4265
  rulesApplied: lifecycle.rulesApplied,
4175
4266
  operatorProfileApplied: lifecycle.operatorProfileApplied,
@@ -4188,8 +4279,8 @@ export function createDispatchBundle(
4188
4279
  reasoningTokenCount: tokenMeter.reasoningTokens,
4189
4280
  ...(upstreamResponses.length > 0 ? { upstreamResponses: [...upstreamResponses] } : {}),
4190
4281
  ...(capturedOutput !== undefined ? { output: capturedOutput } : {}),
4191
- costUsd: 0,
4192
- costProvenance: "unknown",
4282
+ costUsd: usage.costUsd,
4283
+ costProvenance: usage.costProvenance ?? "unknown",
4193
4284
  compiledPromptHash: lifecycle.compiledPromptHash,
4194
4285
  staticCompositionHash: lifecycle.staticCompositionHash,
4195
4286
  staticShellHash: lifecycle.staticCompositionHash,
@@ -4265,7 +4356,7 @@ export function createDispatchBundle(
4265
4356
  outcome,
4266
4357
  outcomeCode: receipt.outcomeCode ?? null,
4267
4358
  outcomeDetail: receipt.outcomeDetail ?? null,
4268
- lineage,
4359
+ lineage: publishedLineage(lineage, hostRun),
4269
4360
  tokenCount: receipt.tokenCount,
4270
4361
  inputTokenCount: receipt.inputTokenCount ?? 0,
4271
4362
  outputTokenCount: receipt.outputTokenCount ?? 0,
@@ -4295,7 +4386,6 @@ export function createDispatchBundle(
4295
4386
  const assessDispatchFinishContract = (): DispatchFinishContractSnapshot | null => {
4296
4387
  if (finishContractAssistantText.trim().length === 0) return null;
4297
4388
  const assessment = assessFinishContract({
4298
- assistantText: finishContractAssistantText,
4299
4389
  sessionEntries: finishContractEntries,
4300
4390
  assistantTurnId: finishContractAssistantTurnId,
4301
4391
  });
@@ -4316,7 +4406,7 @@ export function createDispatchBundle(
4316
4406
  return { assessment, rigor };
4317
4407
  };
4318
4408
 
4319
- const finalPromise = (async (): Promise<RunReceipt> => {
4409
+ (async (): Promise<RunReceipt> => {
4320
4410
  try {
4321
4411
  const result = await acp.promise;
4322
4412
  // The receipt reads meters the domain pump fills. Finalization
@@ -4445,17 +4535,16 @@ export function createDispatchBundle(
4445
4535
  outcome: "failed" satisfies RunOutcome,
4446
4536
  outcomeDetail: detail,
4447
4537
  reason: "failed",
4448
- lineage,
4538
+ lineage: publishedLineage(lineage, hostRun),
4449
4539
  exitCode: 1,
4450
4540
  });
4451
4541
  throw error;
4452
4542
  } finally {
4453
4543
  leaseSlot.release();
4454
4544
  }
4455
- })();
4456
-
4457
- activeRun.finalPromise = finalPromise;
4545
+ })().then(resolveFinal, rejectFinal);
4458
4546
  active.set(envelope.id, activeRun);
4547
+ watchAssignmentDeadline(activeRun, callerDeadlineAt);
4459
4548
 
4460
4549
  return {
4461
4550
  runId: envelope.id,
@@ -4475,6 +4564,7 @@ export function createDispatchBundle(
4475
4564
  finalPromise: Promise<RunReceipt>;
4476
4565
  effectiveRequest: DispatchRequest;
4477
4566
  }> {
4567
+ const hostRun = preparation?.hostRun;
4478
4568
  const requestedAt = new Date(now()).toISOString();
4479
4569
  const timing: RunPhaseMarks = { requestedAt, decisionStartedAt: requestedAt };
4480
4570
  const settings = getEffectiveSettings();
@@ -4520,11 +4610,13 @@ export function createDispatchBundle(
4520
4610
  const phases = envelope ? deriveEnvelopePhaseDurations(envelope) : undefined;
4521
4611
  if (envelope === null || envelope === undefined) return;
4522
4612
  const outcome = receipt.outcome ?? (receipt.exitCode === 0 ? "succeeded" : "failed");
4613
+ const assignmentId = assignmentRootFor(receipt.runId);
4523
4614
  const quality = reduceRouteQuality({
4524
- subject: { receipt, envelope },
4615
+ subject: { receipt, envelope, assignmentId },
4525
4616
  receipts: [{ receipt, envelope }],
4526
4617
  });
4527
4618
  routeObserver.recordOutcome(observation.id, {
4619
+ assignmentId,
4528
4620
  route: observation.decision.executedRoute,
4529
4621
  outcome,
4530
4622
  qualityLabel: quality.label,
@@ -4542,11 +4634,6 @@ export function createDispatchBundle(
4542
4634
  return handle;
4543
4635
  };
4544
4636
  if (req.delegationAgentId) {
4545
- if (req.budget !== undefined) {
4546
- throw new Error(
4547
- "dispatch: budget envelopes cannot be enforced on an ACP delegation target; dispatch to a native or claude-sdk worker",
4548
- );
4549
- }
4550
4637
  assertPlannedNodeIdentity(req, { id: "local", kind: "local" });
4551
4638
  assertProtectedArtifactsEnforceable("acp-delegation", false, protectedArtifactState);
4552
4639
  if (req.responseSchema !== undefined) {
@@ -4562,9 +4649,17 @@ export function createDispatchBundle(
4562
4649
  "dispatch: writeRoots cannot be enforced on an ACP delegation target; the external agent runs its own tool surface. Dispatch to a native or claude-sdk worker.",
4563
4650
  );
4564
4651
  }
4565
- rebindReservationSlot(req, "local", null, UNKNOWN_PRICING_ADMISSION_ESTIMATE_USD, settings);
4652
+ await rebindReservationSlot(req, "local", null, UNKNOWN_PRICING_ADMISSION_ESTIMATE_USD, settings);
4566
4653
  routeObservation = observeShadowRoute(req, undefined, settings);
4567
- const delegated = await dispatchAcpDelegation(req, settings, timing, routeObservation.decision, observer);
4654
+ const delegated = await dispatchAcpDelegation(
4655
+ req,
4656
+ settings,
4657
+ timing,
4658
+ routeObservation.decision,
4659
+ observer,
4660
+ preparation?.deadlineAt,
4661
+ hostRun,
4662
+ );
4568
4663
  // An ACP member never runs host verification, so it can only ever leave
4569
4664
  // the barrier. It still edits the checkout, so the barrier has to wait
4570
4665
  // for it; dispatch() releases it when its finalPromise settles.
@@ -4603,7 +4698,7 @@ export function createDispatchBundle(
4603
4698
  };
4604
4699
  const endpoint = endpointCapacityForTarget(lifecycle.target.target.id);
4605
4700
  assertRouteWithinApprovedEnvelope(req, effectiveRoute);
4606
- rebindReservationSlot(
4701
+ await rebindReservationSlot(
4607
4702
  req,
4608
4703
  effectiveRoute.node,
4609
4704
  endpoint,
@@ -4819,7 +4914,11 @@ export function createDispatchBundle(
4819
4914
  lifecycle.runtimeKind === "http" ||
4820
4915
  (lifecycle.runtimeKind === "sdk" && lifecycle.target.runtime.id === "claude-sdk");
4821
4916
  let workerPolicyPermissionCounter = 0;
4822
- const outputCapture = createWorkerOutputCapture();
4917
+ // The bound the receipt can seal follows the contract this run will be
4918
+ // validated against; a conforming result never arrives clipped.
4919
+ const outputCapture = createWorkerOutputCapture({
4920
+ maxBytes: workerOutputCaptureBytes(dispatchResultContract(req, lifecycle.recipe)),
4921
+ });
4823
4922
  const markObservedPhase = (field: "firstModelTokenAt" | "firstToolAt"): void => {
4824
4923
  if (timing[field] !== undefined) return;
4825
4924
  timing[field] = new Date(now()).toISOString();
@@ -5098,7 +5197,7 @@ export function createDispatchBundle(
5098
5197
  ledgerRef.update(envelope.id, {
5099
5198
  status: "running",
5100
5199
  pid,
5101
- lineage,
5200
+ lineage: publishedLineage(lineage, hostRun),
5102
5201
  identity,
5103
5202
  node: placement?.node ?? LOCAL_RUN_NODE,
5104
5203
  ...(placement?.reroutes !== undefined && placement.reroutes.length > 0
@@ -5110,6 +5209,7 @@ export function createDispatchBundle(
5110
5209
  ...(req.council !== undefined ? { council: req.council } : {}),
5111
5210
  ...(req.plan !== undefined ? { plan: req.plan } : {}),
5112
5211
  ...(lifecycle.personaOverride ? { personaOverride: lifecycle.personaOverride } : {}),
5212
+ ...(lifecycle.decisionRefs ? { decisionRefs: lifecycle.decisionRefs } : {}),
5113
5213
  ...(heartbeatAt ? { heartbeatAt: heartbeatIso(heartbeatAt) } : {}),
5114
5214
  });
5115
5215
  observer?.onAdmitted({
@@ -5213,6 +5313,13 @@ export function createDispatchBundle(
5213
5313
 
5214
5314
  const startedAt = envelope.startedAt;
5215
5315
 
5316
+ let resolveFinal!: (receipt: RunReceipt) => void;
5317
+ let rejectFinal!: (error: unknown) => void;
5318
+ const finalPromise = new Promise<RunReceipt>((res, rej) => {
5319
+ resolveFinal = res;
5320
+ rejectFinal = rej;
5321
+ });
5322
+
5216
5323
  const activeRun: ActiveRun = {
5217
5324
  runId: envelope.id,
5218
5325
  req,
@@ -5243,12 +5350,13 @@ export function createDispatchBundle(
5243
5350
  stallKilled: false,
5244
5351
  stallTimeoutMs: null,
5245
5352
  lineage,
5353
+ ...(hostRun === undefined ? {} : { hostRun }),
5246
5354
  heartbeatAt,
5247
5355
  heartbeatStatus: "alive",
5248
5356
  meter: tokenMeter,
5249
5357
  pricing: lifecycle.target.effectivePricing.rates,
5250
5358
  costProvenance: lifecycle.target.effectivePricing.provenance,
5251
- finalPromise: undefined as unknown as Promise<RunReceipt>,
5359
+ finalPromise,
5252
5360
  };
5253
5361
 
5254
5362
  const buildReceiptDraft = (
@@ -5326,7 +5434,7 @@ export function createDispatchBundle(
5326
5434
  runtimeKind: lifecycle.runtimeKind,
5327
5435
  outcome,
5328
5436
  outcomeCode,
5329
- lineage,
5437
+ lineage: publishedLineage(lineage, hostRun),
5330
5438
  ...(req.intent !== undefined ? { intent: structuredClone(req.intent) } : {}),
5331
5439
  pathScope: structuredClone(lifecycle.pathScope.provenance),
5332
5440
  identity,
@@ -5343,6 +5451,7 @@ export function createDispatchBundle(
5343
5451
  ...(req.plan !== undefined ? { plan: req.plan } : {}),
5344
5452
  ...(fleetGate !== null ? { fleetGate } : {}),
5345
5453
  ...(lifecycle.personaOverride ? { personaOverride: lifecycle.personaOverride } : {}),
5454
+ ...(lifecycle.decisionRefs ? { decisionRefs: lifecycle.decisionRefs } : {}),
5346
5455
  projectContext: lifecycle.projectContext,
5347
5456
  rulesApplied: lifecycle.rulesApplied,
5348
5457
  operatorProfileApplied: lifecycle.operatorProfileApplied,
@@ -5456,7 +5565,7 @@ export function createDispatchBundle(
5456
5565
  outcome,
5457
5566
  outcomeCode: receipt.outcomeCode ?? null,
5458
5567
  outcomeDetail: receipt.outcomeDetail ?? null,
5459
- lineage,
5568
+ lineage: publishedLineage(lineage, hostRun),
5460
5569
  tokenCount: receipt.tokenCount,
5461
5570
  inputTokenCount: receipt.inputTokenCount ?? 0,
5462
5571
  outputTokenCount: receipt.outputTokenCount ?? 0,
@@ -5486,7 +5595,6 @@ export function createDispatchBundle(
5486
5595
  const assessDispatchFinishContract = (): DispatchFinishContractSnapshot | null => {
5487
5596
  if (finishContractAssistantText.trim().length === 0) return null;
5488
5597
  const assessment = assessFinishContract({
5489
- assistantText: finishContractAssistantText,
5490
5598
  sessionEntries: finishContractEntries,
5491
5599
  assistantTurnId: finishContractAssistantTurnId,
5492
5600
  });
@@ -5515,7 +5623,7 @@ export function createDispatchBundle(
5515
5623
  // finalPromise settles.
5516
5624
  settlement?.live(envelope.id);
5517
5625
 
5518
- const finalPromise = (async (): Promise<RunReceipt> => {
5626
+ (async (): Promise<RunReceipt> => {
5519
5627
  try {
5520
5628
  const result = await workerDone;
5521
5629
  // The receipt reads meters the domain pump fills. Finalization
@@ -5577,13 +5685,12 @@ export function createDispatchBundle(
5577
5685
  const steering = snapshotSteeringProvenance();
5578
5686
  const capturedOutput = outputCapture.snapshot();
5579
5687
  const observedRunEffects = runEffects.snapshot();
5580
- const appliedResultContract = appliesRecipeResultContract(req.gate?.role)
5581
- ? (req.resultContractOverride ?? lifecycle.recipe?.resultContract ?? null)
5582
- : null;
5688
+ const appliedResultContract = dispatchResultContract(req, lifecycle.recipe) ?? null;
5583
5689
  const resultContract = validateRecipeResult({
5584
5690
  contract: appliedResultContract,
5585
5691
  reachedTerminalResult: resultContractWasDue(finalOutcome, outcomeCode),
5586
5692
  output: capturedOutput?.state === "final" ? capturedOutput.text : null,
5693
+ outputTruncated: capturedOutput?.truncated === true,
5587
5694
  cwd: lifecycle.cwd,
5588
5695
  networkAllowed:
5589
5696
  lifecycle.admission.allowedTools.includes(ToolNames.WebFetch) ||
@@ -5633,8 +5740,7 @@ export function createDispatchBundle(
5633
5740
  finalDetail = [finalDetail, describeUngroundedValidations(validationGrounding)].filter(Boolean).join("; ");
5634
5741
  }
5635
5742
  const hasTerminalArtifact =
5636
- (req.resultContractOverride ?? lifecycle.recipe?.resultContract)?.kind === "architect-plan" &&
5637
- resultValidation?.conformance === "pass";
5743
+ appliedResultContract?.kind === "architect-plan" && resultValidation?.conformance === "pass";
5638
5744
  if (finalOutcome === "succeeded" && !hasDurableFinalOutput(capturedOutput) && !hasTerminalArtifact) {
5639
5745
  finalOutcome = "failed";
5640
5746
  outcomeCode = "worker_final_output_missing";
@@ -5824,7 +5930,7 @@ export function createDispatchBundle(
5824
5930
  outcome: "failed" satisfies RunOutcome,
5825
5931
  outcomeDetail: detail,
5826
5932
  reason: "failed",
5827
- lineage,
5933
+ lineage: publishedLineage(lineage, hostRun),
5828
5934
  exitCode: 1,
5829
5935
  });
5830
5936
  throw error;
@@ -5832,10 +5938,10 @@ export function createDispatchBundle(
5832
5938
  unsubscribeAgentLedger?.();
5833
5939
  leaseSlot.release();
5834
5940
  }
5835
- })();
5941
+ })().then(resolveFinal, rejectFinal);
5836
5942
 
5837
- activeRun.finalPromise = finalPromise;
5838
5943
  active.set(envelope.id, activeRun);
5944
+ watchAssignmentDeadline(activeRun, preparation?.deadlineAt);
5839
5945
 
5840
5946
  return attachRouteObservation({
5841
5947
  runId: envelope.id,
@@ -5962,11 +6068,6 @@ export function createDispatchBundle(
5962
6068
  req = validation.restore(validated.spec);
5963
6069
 
5964
6070
  if (req.delegationAgentId) {
5965
- if (req.budget !== undefined) {
5966
- throw new Error(
5967
- "dispatch: budget envelopes cannot be enforced on an ACP delegation target; dispatch to a native or claude-sdk worker",
5968
- );
5969
- }
5970
6071
  const protectedArtifactState = getProtectedArtifactState();
5971
6072
  assertProtectedArtifactsEnforceable("acp-delegation", false, protectedArtifactState);
5972
6073
  if (req.responseSchema !== undefined) {
@@ -6382,6 +6483,7 @@ export function createDispatchBundle(
6382
6483
  exitCode: 0,
6383
6484
  gate,
6384
6485
  council,
6486
+ ...(input.template.lineage !== undefined ? { lineage: { ...input.template.lineage } } : {}),
6385
6487
  ...(input.template.plan !== undefined ? { plan: input.template.plan } : {}),
6386
6488
  });
6387
6489
  const receipt = l.recordReceipt(runId, {
@@ -6423,6 +6525,7 @@ export function createDispatchBundle(
6423
6525
  sessionId: input.template.sessionId,
6424
6526
  gate,
6425
6527
  council,
6528
+ ...(input.template.lineage !== undefined ? { lineage: { ...input.template.lineage } } : {}),
6426
6529
  ...(input.template.plan !== undefined ? { plan: input.template.plan } : {}),
6427
6530
  });
6428
6531
  await l.persist();
@@ -6628,7 +6731,7 @@ export function createDispatchBundle(
6628
6731
  runtimeKind: run.runtimeKind,
6629
6732
  outcomePhase: run.stallKilled ? "terminating" : run.aborted ? "aborting" : "running",
6630
6733
  heartbeat,
6631
- lineage: { ...run.lineage },
6734
+ lineage: publishedLineage(run.lineage, run.hostRun),
6632
6735
  startedAt: run.startedAt,
6633
6736
  elapsedMs,
6634
6737
  timing,
@@ -6716,7 +6819,12 @@ export function createDispatchBundle(
6716
6819
  if (assignments.get(id) !== null) return id;
6717
6820
  const live = active.get(id);
6718
6821
  if (live) return live.lineage.rootRunId;
6719
- return ledger?.get(id)?.lineage?.rootRunId ?? id;
6822
+ const local = assignmentRootsByAttempt.get(id);
6823
+ if (local !== undefined) return local;
6824
+ // After restart the immutable attempt history identifies the logical
6825
+ // assignment; a receipt's root may instead name its main host run.
6826
+ const stored = listStoredAssignments().find((record) => record.assignmentId === id || record.attempts.includes(id));
6827
+ return stored?.assignmentId ?? ledger?.get(id)?.lineage?.rootRunId ?? id;
6720
6828
  }
6721
6829
 
6722
6830
  function currentAssignmentRun(id: string): ActiveRun | null {
@@ -6771,8 +6879,8 @@ export function createDispatchBundle(
6771
6879
  };
6772
6880
  },
6773
6881
  assignments: {
6774
- get: (id) => assignments.get(id),
6775
- getStored: (id) => getStoredAssignment(id),
6882
+ get: (id) => assignments.get(assignmentRootFor(id)),
6883
+ getStored: (id) => getStoredAssignment(assignmentRootFor(id)),
6776
6884
  flushWrites: async () => {
6777
6885
  await Promise.allSettled([...assignmentWrites]);
6778
6886
  },