@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
@@ -0,0 +1,136 @@
1
+ import { Type } from "typebox";
2
+ import { ToolNames } from "../core/tool-names.js";
3
+ import type { DecisionBoardStore } from "../domains/session/decision-board.js";
4
+ import { decisionRef } from "../domains/session/entries.js";
5
+ import type { ToolResult, ToolSpec } from "./registry.js";
6
+ import { byteLength } from "./truncate-utf8.js";
7
+
8
+ /**
9
+ * The model's own design decisions, recorded on the session decision board
10
+ * beside the operator's `ask_user` answers. A `decide` call appends one
11
+ * `decisionLedger` entry with `origin: "agent"` and one `DecisionRecord` with
12
+ * `source: "agent"`, the alternatives the model rejected, and why. Dispatch
13
+ * seals every active decision's ref onto the run envelope and receipt, and
14
+ * the commit seams turn the same refs into `Clio-Decision:` trailers, so a
15
+ * receipt or a commit names the choices it was made under.
16
+ */
17
+
18
+ export const DECIDE_CAPS = Object.freeze({
19
+ keyBytes: 64,
20
+ valueBytes: 512,
21
+ alternatives: 6,
22
+ alternativeBytes: 256,
23
+ rationaleBytes: 1024,
24
+ labelBytes: 128,
25
+ });
26
+
27
+ const KEBAB_KEY = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u;
28
+
29
+ export interface DecideToolDeps {
30
+ decisionBoard?: DecisionBoardStore;
31
+ }
32
+
33
+ function boundedText(value: unknown, field: string, cap: number): string | Error {
34
+ if (typeof value !== "string") return new Error(`decide: ${field} must be a string`);
35
+ const trimmed = value.trim();
36
+ if (trimmed.length === 0) return new Error(`decide: ${field} is required`);
37
+ if (byteLength(trimmed) > cap) return new Error(`decide: ${field} exceeds the ${cap}-byte cap`);
38
+ return trimmed;
39
+ }
40
+
41
+ function boundedAlternatives(value: unknown): string[] | Error {
42
+ if (!Array.isArray(value) || value.length === 0) {
43
+ return new Error("decide: alternatives must list at least one option you rejected");
44
+ }
45
+ if (value.length > DECIDE_CAPS.alternatives) {
46
+ return new Error(`decide: alternatives exceeds the ${DECIDE_CAPS.alternatives}-entry cap`);
47
+ }
48
+ const alternatives: string[] = [];
49
+ for (const [index, entry] of value.entries()) {
50
+ const text = boundedText(entry, `alternatives[${index}]`, DECIDE_CAPS.alternativeBytes);
51
+ if (text instanceof Error) return text;
52
+ alternatives.push(text);
53
+ }
54
+ return alternatives;
55
+ }
56
+
57
+ export function createDecideTool(deps: DecideToolDeps = {}): ToolSpec {
58
+ return {
59
+ name: ToolNames.Decide,
60
+ description:
61
+ "Record a design decision between viable options, with rejected alternatives and rationale, before implementing. Verify implementation against the active choice before commit; decision trailers do not prove adherence. If policy changes, a call with the same key revises your earlier agent choice; operator choices require operator revision through ask_user. Record the revision before commit.",
62
+ parameters: Type.Object({
63
+ key: Type.String({
64
+ description: `Stable kebab-case name for the decision, e.g. "cache-key-shape" (at most ${DECIDE_CAPS.keyBytes} bytes).`,
65
+ }),
66
+ value: Type.String({ description: `The option you chose (at most ${DECIDE_CAPS.valueBytes} bytes).` }),
67
+ alternatives: Type.Array(Type.String(), {
68
+ description: `Options you considered and rejected, 1 to ${DECIDE_CAPS.alternatives} entries.`,
69
+ }),
70
+ rationale: Type.String({
71
+ description: `Why the chosen option won over the alternatives (at most ${DECIDE_CAPS.rationaleBytes} bytes).`,
72
+ }),
73
+ label: Type.Optional(Type.String({ description: "Short human-readable title for the decision." })),
74
+ }),
75
+ // Read class on purpose: the only effect is one session-ledger append,
76
+ // so it must stay available at every autonomy level without a prompt.
77
+ baseActionClass: "read",
78
+ executionMode: "sequential",
79
+ async run(args): Promise<ToolResult> {
80
+ const key = boundedText(args.key, "key", DECIDE_CAPS.keyBytes);
81
+ if (key instanceof Error) return { kind: "error", message: key.message };
82
+ if (!KEBAB_KEY.test(key)) {
83
+ return { kind: "error", message: "decide: key must be kebab-case (lowercase letters, digits, single hyphens)" };
84
+ }
85
+ const value = boundedText(args.value, "value", DECIDE_CAPS.valueBytes);
86
+ if (value instanceof Error) return { kind: "error", message: value.message };
87
+ const alternatives = boundedAlternatives(args.alternatives);
88
+ if (alternatives instanceof Error) return { kind: "error", message: alternatives.message };
89
+ const rationale = boundedText(args.rationale, "rationale", DECIDE_CAPS.rationaleBytes);
90
+ if (rationale instanceof Error) return { kind: "error", message: rationale.message };
91
+ let label: string | undefined;
92
+ if (args.label !== undefined && args.label !== null) {
93
+ const bounded = boundedText(args.label, "label", DECIDE_CAPS.labelBytes);
94
+ if (bounded instanceof Error) return { kind: "error", message: bounded.message };
95
+ label = bounded;
96
+ }
97
+ if (deps.decisionBoard === undefined) {
98
+ return { kind: "error", message: "decide: no session decision board is available in this context" };
99
+ }
100
+ let outcome: ReturnType<DecisionBoardStore["recordAgentDecision"]>;
101
+ try {
102
+ outcome = deps.decisionBoard.recordAgentDecision({
103
+ key,
104
+ value,
105
+ alternatives,
106
+ rationale,
107
+ ...(label !== undefined ? { label } : {}),
108
+ });
109
+ } catch (error) {
110
+ return { kind: "error", message: error instanceof Error ? error.message : String(error) };
111
+ }
112
+ const ref = decisionRef(outcome.entry.interviewId, key);
113
+ const supersededNote =
114
+ outcome.superseded === null
115
+ ? ""
116
+ : ` (supersedes ${decisionRef(outcome.superseded.interviewId, outcome.superseded.key)})`;
117
+ return {
118
+ kind: "ok",
119
+ output: `decision recorded: ${key} = ${value} [${ref}]${supersededNote}\n`,
120
+ details: {
121
+ decision: {
122
+ ref,
123
+ key,
124
+ value,
125
+ alternatives,
126
+ rationale,
127
+ ...(label !== undefined ? { label } : {}),
128
+ ...(outcome.superseded !== null
129
+ ? { superseded: decisionRef(outcome.superseded.interviewId, outcome.superseded.key) }
130
+ : {}),
131
+ },
132
+ },
133
+ };
134
+ },
135
+ };
136
+ }
@@ -12,6 +12,7 @@ import {
12
12
  } from "../domains/dispatch/gate-role-prompts.js";
13
13
  import { narrowDispatchIntentToReadOnly, normalizeDispatchIntent } from "../domains/dispatch/intent.js";
14
14
  import { renderDispatchReviewerTask } from "../domains/dispatch/intent-requirements.js";
15
+ import { parallelWriterConflict } from "../domains/dispatch/parallel-writers.js";
15
16
  import { approvedRouteCandidates } from "../domains/dispatch/route-approval.js";
16
17
  import { defaultRoutingIntent } from "../domains/dispatch/routing-intent.js";
17
18
  import type { DispatchFailoverMode } from "../domains/dispatch/validation.js";
@@ -26,6 +27,7 @@ import {
26
27
  DISPATCH_PLAN_PREPARATION_ERROR_ARGUMENT,
27
28
  type DispatchPlanView,
28
29
  describeDispatchPlan,
30
+ dispatchPlanTopology,
29
31
  RESOLVED_DISPATCH_PLAN_ARGUMENT,
30
32
  type ResolvedDispatchPlanArtifact,
31
33
  resolvedDispatchPlanFromArgs,
@@ -246,6 +248,27 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
246
248
  argv: [...check.command],
247
249
  cwd: resolve(process.cwd(), check.cwd),
248
250
  timeoutMs: entry.timeoutMs,
251
+ // A judged check seals its kind and absolute file paths here, so
252
+ // host verification judges against what the catalog declared at
253
+ // admission rather than whatever the file says at run time.
254
+ ...(check.kind !== "command" ? { kind: check.kind } : {}),
255
+ ...(check.numeric !== undefined
256
+ ? {
257
+ numeric: {
258
+ reference: resolve(process.cwd(), check.numeric.reference),
259
+ tolerance: { ...check.numeric.tolerance },
260
+ },
261
+ }
262
+ : {}),
263
+ ...(check.perf !== undefined
264
+ ? {
265
+ perf: {
266
+ ...(check.perf.budget !== undefined ? { budget: structuredClone(check.perf.budget) } : {}),
267
+ ...(check.perf.baseline !== undefined ? { baseline: resolve(process.cwd(), check.perf.baseline) } : {}),
268
+ ...(check.perf.tolerance !== undefined ? { tolerance: { ...check.perf.tolerance } } : {}),
269
+ },
270
+ }
271
+ : {}),
249
272
  };
250
273
  }),
251
274
  };
@@ -512,6 +535,10 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
512
535
  if (args.writers === 1 && mode !== "parallel") {
513
536
  return shapeRejection(args, "dispatch: writers is supported only for parallel dispatch");
514
537
  }
538
+ if (mode === "parallel" && args.writers !== 1) {
539
+ const conflict = parallelWriterConflict(parsed.requests, deps.getAgentSpecs());
540
+ if (conflict !== null) return shapeRejection(args, conflict);
541
+ }
515
542
  const parentCheckout = gitCheckoutRoot(process.cwd());
516
543
  for (const request of parsed.requests) {
517
544
  if (request.worktree !== true) continue;
@@ -584,6 +611,7 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
584
611
  resolveTask(
585
612
  {
586
613
  agentId: gateDeciderAgentId(reviewResult.review.reviewer),
614
+ ...(base.budget === undefined ? {} : { budget: base.budget }),
587
615
  executionRole: "reviewer",
588
616
  task: renderDispatchReviewerTask(base.task, subject.runId, cycle, base.intent),
589
617
  systemPrompt: REVIEWER_GATE_PROMPT,
@@ -619,6 +647,7 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
619
647
  resolveTask(
620
648
  {
621
649
  agentId: gateDeciderAgentId(compete.judge?.agent),
650
+ ...(base.budget === undefined ? {} : { budget: base.budget }),
622
651
  executionRole: "judge",
623
652
  task: `Plan-time capability check for the ${compete.candidates}-candidate judge.`,
624
653
  systemPrompt: JUDGE_GATE_PROMPT,
@@ -691,6 +720,7 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
691
720
  if (council.synthesis === "judge") {
692
721
  const judgeRequest: DispatchRequest = {
693
722
  agentId: council.judge?.agent ?? base.agentId,
723
+ ...(base.budget === undefined ? {} : { budget: base.budget }),
694
724
  executionRole: "judge",
695
725
  task: "Plan-time capability check for council synthesis.",
696
726
  systemPrompt: COUNCIL_JUDGE_PROMPT,
@@ -717,7 +747,9 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
717
747
  for (const [index, request] of parsed.requests.entries()) tasks.push(resolveTask(request, "task", index + 1));
718
748
  }
719
749
 
720
- const topology = describeDispatchPlan(args).topology;
750
+ // Scope has already been resolved on tasks. Rendering the raw call here
751
+ // would discard its typed intent and run legacy prose inference again.
752
+ const topology = dispatchPlanTopology(args);
721
753
  const planScale =
722
754
  tasks.length > 1 ||
723
755
  topology === "compete" ||
@@ -1,5 +1,6 @@
1
1
  /** Pure model-argument parsing; every returned DispatchRequest has a concrete agent id. */
2
2
 
3
+ import { parseResultSummaryMaxBytes } from "../domains/agents/result-contract.js";
3
4
  import type { AgentAutomationAuthority } from "../domains/agents/spec.js";
4
5
  import { type AgentTaskType, classifyAgentTask } from "../domains/dispatch/agent-candidates.js";
5
6
  import { cloneDispatchBudgetRequest } from "../domains/dispatch/budget-envelope.js";
@@ -108,6 +109,29 @@ export function maxOutputBytesArg(args: Record<string, unknown>): number {
108
109
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : DEFAULT_MAX_OUTPUT_BYTES;
109
110
  }
110
111
 
112
+ /**
113
+ * The caller's inline-summary allowance, range-checked here so a bad value is
114
+ * a tool error rather than a sealed run failure. The scope records whether
115
+ * this assignment set it or inherited a batch default (see
116
+ * `dispatchResultContract`).
117
+ */
118
+ function resultSummaryArg(
119
+ args: Record<string, unknown>,
120
+ scope: "task" | "batch",
121
+ ): { ok: true; value: DispatchRequest["resultSummary"] } | { ok: false; message: string } {
122
+ if (!("result_summary_max_bytes" in args) || args.result_summary_max_bytes === undefined) {
123
+ return { ok: true, value: undefined };
124
+ }
125
+ try {
126
+ return {
127
+ ok: true,
128
+ value: { maxBytes: parseResultSummaryMaxBytes(args.result_summary_max_bytes, "result_summary_max_bytes"), scope },
129
+ };
130
+ } catch (error) {
131
+ return { ok: false, message: error instanceof Error ? error.message : String(error) };
132
+ }
133
+ }
134
+
111
135
  export function timeoutMsArg(args: Record<string, unknown>): number | undefined {
112
136
  const value = args.timeout_ms;
113
137
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : undefined;
@@ -116,6 +140,7 @@ export function timeoutMsArg(args: Record<string, unknown>): number | undefined
116
140
  function dispatchRequestFromArgs(
117
141
  args: Record<string, unknown>,
118
142
  options: DispatchArgumentParserOptions,
143
+ resultSummaryScope: "task" | "batch" = "task",
119
144
  ): { ok: true; request: DispatchRequest } | { ok: false; message: string } {
120
145
  const task = stringArg(args, "task");
121
146
  if (!task) return { ok: false, message: "missing task (pass list:true to see available agents)" };
@@ -223,6 +248,9 @@ function dispatchRequestFromArgs(
223
248
  }
224
249
  }
225
250
  }
251
+ const resultSummary = resultSummaryArg(args, resultSummaryScope);
252
+ if (!resultSummary.ok) return resultSummary;
253
+ if (resultSummary.value !== undefined) request.resultSummary = resultSummary.value;
226
254
  if ("persona" in args && args.persona !== undefined) {
227
255
  if (typeof args.persona !== "string") return { ok: false, message: "persona must be a string" };
228
256
  const persona = args.persona.trim();
@@ -278,10 +306,19 @@ export function dispatchRequestsFromArgs(
278
306
  for (let index = 0; index < tasks.length; index += 1) {
279
307
  const item = tasks[index];
280
308
  const itemArgs: Record<string, unknown> = isRecord(item) ? { ...shared, ...item } : { ...shared, task: item };
309
+ // A shared allowance over several members is inherited, not chosen for
310
+ // each of them; a one-task batch is the single-task form the tool
311
+ // normalizes every call into, so its shared value is that task's own.
312
+ const resultSummaryScope =
313
+ tasks.length > 1 &&
314
+ Object.hasOwn(shared, "result_summary_max_bytes") &&
315
+ !(isRecord(item) && Object.hasOwn(item, "result_summary_max_bytes"))
316
+ ? "batch"
317
+ : "task";
281
318
  const sharedIntent = isRecord(shared.intent) ? shared.intent : null;
282
319
  const itemIntent = isRecord(item) && Object.hasOwn(item, "intent") && isRecord(item.intent) ? item.intent : null;
283
320
  if (sharedIntent !== null && itemIntent !== null) itemArgs.intent = { ...sharedIntent, ...itemIntent };
284
- const parsed = dispatchRequestFromArgs(itemArgs, options);
321
+ const parsed = dispatchRequestFromArgs(itemArgs, options, resultSummaryScope);
285
322
  if (!parsed.ok) return { ok: false, message: `dispatch: task ${index + 1}: ${parsed.message}` };
286
323
  if (sharedIntent !== null && itemIntent !== null) {
287
324
  if (options.resolveIntent === undefined) {
@@ -376,7 +376,8 @@ function canonicalCandidates(value: unknown): DispatchFailoverCandidate[] | null
376
376
  return out.length > 0 ? out : null;
377
377
  }
378
378
 
379
- function topologyOf(args: Record<string, unknown>): DispatchPlanTopology {
379
+ /** Select topology without rendering unresolved task scope or consulting provider state. */
380
+ export function dispatchPlanTopology(args: Record<string, unknown>): DispatchPlanTopology {
380
381
  if (isRecord(args.apply_winner)) return "compete";
381
382
  if (args.mode === "compete") return "compete";
382
383
  if (args.mode === "council") return "council";
@@ -400,8 +401,8 @@ function renderPlanText(
400
401
  ): string {
401
402
  const lines = [
402
403
  `dispatch plan: topology=${topology} tasks=${tasks.length}`,
403
- `cost ceiling: ${costCeilingUsd === undefined ? "unavailable" : `$${costCeilingUsd.toFixed(4)}`}`,
404
- `deadline: ${deadlineMs === null ? "per-assignment" : `${deadlineMs}ms whole-plan`}`,
404
+ `advisory session cost baseline: ${costCeilingUsd === undefined ? "unavailable" : `$${costCeilingUsd.toFixed(4)}`}`,
405
+ `deadline: ${deadlineMs === null ? "none (advisory planning)" : `${deadlineMs}ms whole-plan`}`,
405
406
  ];
406
407
  if (confirmation !== undefined) {
407
408
  lines.push(
@@ -450,7 +451,7 @@ function renderPlanText(
450
451
  const approval = task.routeApproval;
451
452
  const selected = approval.decision.selected;
452
453
  lines.push(
453
- ` active policy=${safeField(approval.decision.policyVersion)} decision=${approval.decision.decisionHash} runtime=${safeField(selected.runtimeId)} thinking=${safeField(selected.thinkingLevel ?? "default")} totalCostUpperBoundUsd=${approval.totalCostUpperBoundUsd.toFixed(6)} deadlineMs=${approval.deadlineMs} maxAttempts=${approval.maxAttempts}`,
454
+ ` active policy=${safeField(approval.decision.policyVersion)} decision=${approval.decision.decisionHash} runtime=${safeField(selected.runtimeId)} thinking=${safeField(selected.thinkingLevel ?? "default")} totalCostUpperBoundUsd=${approval.totalCostUpperBoundUsd.toFixed(6)} deadlineMs=${approval.deadlineMs ?? "none"} maxAttempts=${approval.maxAttempts}`,
454
455
  );
455
456
  }
456
457
  if (task.agentSelection !== null) {
@@ -487,7 +488,7 @@ function renderPlanText(
487
488
  lines.push(...renderLegacyPathScope(task, cwd));
488
489
  for (const check of task.resolvedVerification ?? []) {
489
490
  lines.push(
490
- ` verification check=${safeField(check.check)} argv=${JSON.stringify(check.argv)} cwd=${JSON.stringify(check.cwd)} timeout_ms=${check.timeoutMs}`,
491
+ ` verification check=${safeField(check.check)}${check.kind !== undefined ? ` kind=${check.kind}` : ""} argv=${JSON.stringify(check.argv)} cwd=${JSON.stringify(check.cwd)} timeout_ms=${check.timeoutMs}`,
491
492
  );
492
493
  }
493
494
  }
@@ -616,7 +617,10 @@ function isResolvedTask(value: unknown): value is ResolvedDispatchPlanArtifact["
616
617
  Array.isArray(check.argv) &&
617
618
  check.argv.every((arg) => typeof arg === "string") &&
618
619
  typeof check.cwd === "string" &&
619
- typeof check.timeoutMs === "number",
620
+ typeof check.timeoutMs === "number" &&
621
+ (check.kind === undefined || check.kind === "numeric-compare" || check.kind === "perf-budget") &&
622
+ (check.numeric === undefined || (isRecord(check.numeric) && typeof check.numeric.reference === "string")) &&
623
+ (check.perf === undefined || isRecord(check.perf)),
620
624
  ))
621
625
  )
622
626
  return false;
@@ -775,8 +779,7 @@ export function resolvedDispatchPlanFromArgs(args: Record<string, unknown>): Res
775
779
  !Number.isInteger(value.maxWorkers) ||
776
780
  Number(value.maxWorkers) < 1 ||
777
781
  (value.onFailure !== "stop" && value.onFailure !== "continue") ||
778
- !Number.isInteger(value.deadlineMs) ||
779
- Number(value.deadlineMs) < 1
782
+ (value.deadlineMs !== null && (!Number.isInteger(value.deadlineMs) || Number(value.deadlineMs) < 1))
780
783
  )
781
784
  return null;
782
785
  if (
@@ -899,7 +902,7 @@ export function describeDispatchPlan(rawArgs: Record<string, unknown> | undefine
899
902
  const args = prepareDispatchArguments(rawArgs ?? {});
900
903
  const preparationFailed = typeof args[DISPATCH_PLAN_PREPARATION_ERROR_ARGUMENT] === "string";
901
904
  const resolved = resolvedDispatchPlanFromArgs(args);
902
- const topology = resolved?.topology ?? topologyOf(args);
905
+ const topology = resolved?.topology ?? dispatchPlanTopology(args);
903
906
  const tasks = resolved?.tasks ?? taskViews(args);
904
907
  const costCeilingUsd = resolved?.costCeilingUsd;
905
908
  const deadlineMs = resolved?.deadlineMs ?? null;
@@ -50,6 +50,8 @@ import { extractRunProvenance, provenanceCompactSuffix } from "../domains/eviden
50
50
  import { summarizeTrustStatus } from "../domains/evidence/trust-projection.js";
51
51
  import { adaptRunReceiptTrustStatus } from "../domains/evidence/trust-status.js";
52
52
  import type { AutonomyLevel } from "../domains/safety/autonomy.js";
53
+ import { activeDecisionRefs } from "../domains/session/decision-board.js";
54
+ import { renderCompeteJudgeTask } from "./compete-judge-task.js";
53
55
  import {
54
56
  type CandidateWorktree,
55
57
  type CompeteGroupOwnership,
@@ -559,7 +561,12 @@ function dispatchDetails(
559
561
  }
560
562
  return {
561
563
  mode,
562
- assignmentIds: runs.map((run) => run.receipt.lineage?.rootRunId ?? run.receipt.runId),
564
+ assignmentIds: runs.map(
565
+ (run) =>
566
+ deps.dispatch.assignments?.getStored(run.receipt.runId)?.assignmentId ??
567
+ run.receipt.lineage?.rootRunId ??
568
+ run.receipt.runId,
569
+ ),
563
570
  terminalRunIds: runs.map((run) => run.receipt.runId),
564
571
  receiptCount: runs.length,
565
572
  failedCount: failed.length,
@@ -786,6 +793,7 @@ async function runReviewGated(
786
793
  }
787
794
  const reviewerRequest: DispatchRequest = {
788
795
  agentId: gateDeciderAgentId(review.reviewer),
796
+ ...(base.budget === undefined ? {} : { budget: base.budget }),
789
797
  executionRole: "reviewer",
790
798
  task: renderDispatchReviewerTask(base.task, builder.receipt.runId, cycle, base.intent),
791
799
  systemPrompt: REVIEWER_GATE_PROMPT,
@@ -802,6 +810,7 @@ async function runReviewGated(
802
810
  ...(review.target !== undefined ? { target: review.target } : {}),
803
811
  ...(base.plan !== undefined ? { plan: base.plan } : {}),
804
812
  ...(base.parentToolCallId !== undefined ? { parentToolCallId: base.parentToolCallId } : {}),
813
+ ...(base.decisionRefs !== undefined ? { decisionRefs: base.decisionRefs } : {}),
805
814
  ...(base.reservation !== undefined
806
815
  ? { reservation: { ownerId: base.reservation.ownerId, memberId: base.reservation.memberId } }
807
816
  : {}),
@@ -863,20 +872,6 @@ async function runReviewGated(
863
872
  }
864
873
  }
865
874
 
866
- function judgeTask(originalTask: string, candidates: ReadonlyArray<CandidateWorktree>, stats: string[]): string {
867
- const lines = [
868
- `Rank ${candidates.length} candidate implementations of this task and pick the best one.`,
869
- "Original task:",
870
- originalTask,
871
- "Candidates:",
872
- ...candidates.map(
873
- (candidate, index) =>
874
- ` ${candidate.index}. branch=${candidate.branch} worktree=${candidate.path} (${stats[index] ?? "?"})`,
875
- ),
876
- ];
877
- return lines.join("\n\n");
878
- }
879
-
880
875
  function readVerifiedGateReceipt(deps: DispatchToolDeps, runId: string): RunReceipt | null {
881
876
  const envelope = deps.dispatch.getRun(runId);
882
877
  if (envelope === null) return null;
@@ -1171,6 +1166,11 @@ async function runCompete(
1171
1166
  const throwIfStopped = (): void => {
1172
1167
  if (stop !== null) throw new Error(stop.message);
1173
1168
  };
1169
+ // A stopped phase still has terminal receipts worth reporting. Keep the
1170
+ // ordinary error result and no winner, without discarding those identities
1171
+ // through the generic exception path after the settlement barrier.
1172
+ const stoppedOutcome = (): CompeteOutcome | null =>
1173
+ stop === null ? null : { runs, decisions, group, winner: null, needsDecision: stop.message };
1174
1174
  const settleRun = async (
1175
1175
  handle: Awaited<ReturnType<DispatchContract["dispatch"]>>,
1176
1176
  request: DispatchRequest,
@@ -1329,12 +1329,17 @@ async function runCompete(
1329
1329
  });
1330
1330
  const candidateRuns = await settledCompletedRuns(candidateOwned, "candidate settlement");
1331
1331
  runs.push(...candidateRuns);
1332
- throwIfStopped();
1332
+ const stoppedCandidates = stoppedOutcome();
1333
+ if (stoppedCandidates !== null) return stoppedCandidates;
1333
1334
  const stats = worktrees.map((worktree, index) => {
1334
1335
  const receipt = candidateRuns[index]?.receipt;
1335
1336
  const failed = receipt !== undefined && isPipelineStepFailure(receipt);
1336
1337
  if (failed) return "builder failed";
1337
- commitCandidateWork(worktree, `clio-coder compete ${group} candidate ${worktree.index}`);
1338
+ // The receipt records the candidate's effective authority after recipe
1339
+ // and invocation narrowing, independently of the coordinator's autonomy.
1340
+ if (receipt?.autonomyEnforcement?.autonomy !== "read-only") {
1341
+ commitCandidateWork(worktree, `clio-coder compete ${group} candidate ${worktree.index}`);
1342
+ }
1338
1343
  return candidateDiffStat(root, worktree.branch);
1339
1344
  });
1340
1345
  if (candidateRuns.every((run) => isPipelineStepFailure(run.receipt))) {
@@ -1350,8 +1355,22 @@ async function runCompete(
1350
1355
  }
1351
1356
  const judgeRequest: DispatchRequest = {
1352
1357
  agentId: gateDeciderAgentId(compete.judge?.agent),
1358
+ ...(base.budget === undefined ? {} : { budget: base.budget }),
1353
1359
  executionRole: "judge",
1354
- task: judgeTask(base.task, worktrees, stats),
1360
+ task: renderCompeteJudgeTask(base.task, worktrees, stats, candidateRuns),
1361
+ // Candidate prose and receipt locators are evidence, not inferred authority.
1362
+ // Read-only execution is enforced by the role/autonomy, not empty write roots.
1363
+ intent: narrowDispatchIntentToReadOnly(
1364
+ base.intent ?? {
1365
+ version: 2,
1366
+ readRoots: [],
1367
+ writeRoots: [],
1368
+ relevantPaths: [],
1369
+ pathProvenance: [],
1370
+ expectedOutputs: [],
1371
+ verification: [],
1372
+ },
1373
+ ),
1355
1374
  systemPrompt: JUDGE_GATE_PROMPT,
1356
1375
  autonomy: "read-only",
1357
1376
  cwd: root,
@@ -1367,6 +1386,7 @@ async function runCompete(
1367
1386
  ...(compete.judge?.node !== undefined ? { node: compete.judge.node } : {}),
1368
1387
  ...(base.plan !== undefined ? { plan: base.plan } : {}),
1369
1388
  ...(base.parentToolCallId !== undefined ? { parentToolCallId: base.parentToolCallId } : {}),
1389
+ ...(base.decisionRefs !== undefined ? { decisionRefs: base.decisionRefs } : {}),
1370
1390
  ...(base.reservation !== undefined
1371
1391
  ? { reservation: { ownerId: base.reservation.ownerId, memberId: base.reservation.memberId } }
1372
1392
  : {}),
@@ -1383,7 +1403,8 @@ async function runCompete(
1383
1403
  const judgeRun = (await settledCompletedRuns([judgeOwned], "judge settlement"))[0];
1384
1404
  if (judgeRun === undefined) throw new Error("judge produced no completed run");
1385
1405
  runs.push(judgeRun);
1386
- throwIfStopped();
1406
+ const stoppedJudge = stoppedOutcome();
1407
+ if (stoppedJudge !== null) return stoppedJudge;
1387
1408
  const judgeReceipt = judgeRun.receipt;
1388
1409
  const judgeSummary = judgeRun.summary;
1389
1410
  // Every judged outcome names the same subjects, decider, and correlation;
@@ -1525,7 +1546,7 @@ async function runCompete(
1525
1546
 
1526
1547
  // Losers are always cleaned; the winner's worktree and branch survive
1527
1548
  // only while an operator decision is pending (supervised pick or a
1528
- // failed merge). The durable state transition happens after the worker
1549
+ // failed merge). Every removed candidate is archived under a durable recovery ref. The durable state transition happens after the worker
1529
1550
  // barrier and before deletion, defining the safe restart boundary.
1530
1551
  const winnerAtFinalization = currentWinner();
1531
1552
  if (ownership !== null) {
@@ -1581,8 +1602,7 @@ async function runCompete(
1581
1602
  /**
1582
1603
  * Apply a preserved compete winner. Plan-scale by definition, so supervised
1583
1604
  * autonomy levels park this call for operator confirmation; the approval IS
1584
- * the winner confirmation. After a successful merge the whole compete group
1585
- * is cleaned up.
1605
+ * the winner confirmation. After a successful merge scratch worktrees are cleaned up; candidate recovery refs remain.
1586
1606
  */
1587
1607
  function runApplyWinner(
1588
1608
  input: { branch: string; cwd: string },
@@ -1729,7 +1749,7 @@ function runApplyWinner(
1729
1749
  }
1730
1750
  return {
1731
1751
  kind: "ok",
1732
- output: `winner ${branch} merged into the current branch; compete group ${group} cleaned up`,
1752
+ output: `winner ${branch} merged into the current branch; compete group ${group} scratch cleaned up; candidate states remain under refs/clio-coder/compete/ (list with git for-each-ref)`,
1733
1753
  details: {
1734
1754
  mode: "apply_winner",
1735
1755
  branch,
@@ -1794,14 +1814,14 @@ function competeResult(
1794
1814
  if (outcome.winner?.applied === true) {
1795
1815
  return {
1796
1816
  kind: "ok",
1797
- output: `compete winner candidate ${outcome.winner.index} applied (branch ${outcome.winner.branch} merged)\n\n${body}`,
1817
+ output: `compete winner candidate ${outcome.winner.index} applied (branch ${outcome.winner.branch} merged); candidate states remain under refs/clio-coder/compete/ (list with git for-each-ref)\n\n${body}`,
1798
1818
  details,
1799
1819
  };
1800
1820
  }
1801
1821
  if (outcome.winner !== null && outcome.needsDecision === undefined) {
1802
1822
  const lines = [
1803
1823
  `compete winner: candidate ${outcome.winner.index} (branch ${outcome.winner.branch}), preserved for confirmation at autonomy ${autonomy}`,
1804
- `Apply it with dispatch apply_winner={branch: "${outcome.winner.branch}"}; the approval prompt is the winner confirmation. Losing candidates were cleaned up.`,
1824
+ `Apply it with dispatch apply_winner={branch: "${outcome.winner.branch}"}; the approval prompt is the winner confirmation. Losing candidate states remain under refs/clio-coder/compete/; list them with git for-each-ref.`,
1805
1825
  ];
1806
1826
  return { kind: "ok", output: `${lines.join("\n")}\n\n${body}`, details };
1807
1827
  }
@@ -1991,6 +2011,7 @@ async function runCouncil(
1991
2011
  const finalRuns = [...prior.values()];
1992
2012
  const judgeRequest: DispatchRequest = {
1993
2013
  agentId: council.judge?.agent ?? base.agentId,
2014
+ ...(base.budget === undefined ? {} : { budget: base.budget }),
1994
2015
  executionRole: "judge",
1995
2016
  task: `Synthesize the council answers for this task:\n\n${base.task}`,
1996
2017
  briefing: boundedCouncilBriefing(
@@ -2010,6 +2031,7 @@ async function runCouncil(
2010
2031
  ...(council.judge?.node ? { node: council.judge.node } : {}),
2011
2032
  ...(base.plan ? { plan: base.plan } : {}),
2012
2033
  ...(base.parentToolCallId ? { parentToolCallId: base.parentToolCallId } : {}),
2034
+ ...(base.decisionRefs !== undefined ? { decisionRefs: base.decisionRefs } : {}),
2013
2035
  };
2014
2036
  const pinned = council.resolvedTasks?.find((task) => task.role === "synthesis");
2015
2037
  const judgeRun = await runMember(
@@ -2157,6 +2179,7 @@ export async function runDispatchTool(
2157
2179
  // admission bounds. Keep these off the serializable approved request.
2158
2180
  const dispatch = deps.dispatch;
2159
2181
  const preparation = {
2182
+ ...(options?.hostRun === undefined ? {} : { hostRun: structuredClone(options.hostRun) }),
2160
2183
  ...(options?.signal === undefined ? {} : { signal: options.signal }),
2161
2184
  ...(timeoutMs === undefined ? {} : { deadlineAt: Date.now() + timeoutMs }),
2162
2185
  };
@@ -2189,6 +2212,12 @@ export async function runDispatchTool(
2189
2212
  parentToolCallId === undefined || parentToolCallId.length === 0
2190
2213
  ? structuredClone(snapshot.requests)
2191
2214
  : snapshot.requests.map((request) => ({ ...structuredClone(request), parentToolCallId }));
2215
+ // Seal the parent board's active decisions onto every request on the same
2216
+ // terms as the parent id: from the live board here, never from model
2217
+ // arguments (the validation projection strips the field). Derived reviewer,
2218
+ // judge, and synthesis requests copy it from their base explicitly.
2219
+ const decisionRefs = activeDecisionRefs(deps.getDecisionBoard?.() ?? []);
2220
+ if (decisionRefs.length > 0) requests = requests.map((request) => ({ ...request, decisionRefs }));
2192
2221
  if (planView.planScale && deps.dispatch.preview !== undefined && resolvedPlan === null) {
2193
2222
  return { kind: "error", message: "dispatch: resolved plan is missing after admission" };
2194
2223
  }
@@ -2291,12 +2320,7 @@ export async function runDispatchTool(
2291
2320
  try {
2292
2321
  if (resolvedPlan?.topology === "fleet") {
2293
2322
  const executionPlan = admissionState.trustedExecutionPlans.get(args);
2294
- if (
2295
- executionPlan === undefined ||
2296
- resolvedPlan.source === null ||
2297
- resolvedPlan.deadlineMs === null ||
2298
- reservationOwnerId === undefined
2299
- ) {
2323
+ if (executionPlan === undefined || resolvedPlan.source === null || reservationOwnerId === undefined) {
2300
2324
  return { kind: "error", message: "dispatch: trusted Scout dependency plan is unavailable" };
2301
2325
  }
2302
2326
  if (executionPlan.hash !== resolvedPlan.source.executionPlanHash) {
@@ -2597,10 +2621,16 @@ async function runPipeline(
2597
2621
  const { receipt, summary } = await registered.completion;
2598
2622
  activeRunId = null;
2599
2623
  runs.push(completeRun(deps, receipt, summary));
2600
- if (isPipelineStepFailure(receipt)) {
2624
+ // Execution can succeed while a conforming report records a failed
2625
+ // check. Keep that receipt truthful, but do not feed failed quality
2626
+ // into a dependent step. Review/compete use failure to drive their
2627
+ // own repair loops, so this condition belongs only to the pipeline.
2628
+ const failedQuality = receipt.quality.resultContract?.quality === "fail";
2629
+ if (isPipelineStepFailure(receipt) || failedQuality) {
2601
2630
  const skipped = requests.length - (index + 1);
2631
+ const reason = isPipelineStepFailure(receipt) ? pipelineFailureReason(receipt) : "result quality=fail";
2602
2632
  throw new PipelineHaltError(
2603
- `pipeline dispatch halted at step ${index + 1}/${requests.length} (run ${receipt.runId}, ${pipelineFailureReason(receipt)}); skipped ${skipped} later step(s)`,
2633
+ `pipeline dispatch halted at step ${index + 1}/${requests.length} (run ${receipt.runId}, ${reason}); skipped ${skipped} later step(s)`,
2604
2634
  [...runs],
2605
2635
  );
2606
2636
  }