@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
@@ -118,6 +118,11 @@ export function createSafetyBundle(context: DomainContext): DomainBundle<SafetyC
118
118
  let unsubscribeDispatchFailed: (() => void) | null = null;
119
119
  const recordedRequestedPermissionIds = new Set<string>();
120
120
 
121
+ function activePolicyEngine(): SafetyPolicyEngine {
122
+ policyEngine ??= createSafetyPolicyEngine();
123
+ return policyEngine;
124
+ }
125
+
121
126
  function writeAudit(rec: AuditRecord): void {
122
127
  if (writer === null) return;
123
128
  writer.write(rec);
@@ -274,7 +279,7 @@ export function createSafetyBundle(context: DomainContext): DomainBundle<SafetyC
274
279
  return classifyCall(call);
275
280
  },
276
281
  evaluate(call, posture) {
277
- const policy = (policyEngine ?? createSafetyPolicyEngine()).evaluate(call, posture);
282
+ const policy = activePolicyEngine().evaluate(call, posture);
278
283
  const classification = policy.classification;
279
284
 
280
285
  context.bus.emit(BusChannels.SafetyClassified, {
@@ -363,7 +368,11 @@ export function createSafetyBundle(context: DomainContext): DomainBundle<SafetyC
363
368
  },
364
369
  scopes: { readonly: READONLY_SCOPE, workspace: WORKSPACE_SCOPE, confirmed: CONFIRMED_SCOPE },
365
370
  isSubset,
366
- policy: { metadata: (posture) => (policyEngine ?? createSafetyPolicyEngine()).metadata(posture) },
371
+ policy: {
372
+ metadata: (posture) => activePolicyEngine().metadata(posture),
373
+ allowsObservationPath: (path) =>
374
+ activePolicyEngine().evaluate({ tool: "read", args: { path } }).reasonCode !== "path-policy:zeroAccessPaths",
375
+ },
367
376
  audit: {
368
377
  recordCount: () => recordCount,
369
378
  recordToolCall: recordToolCallAudit,
@@ -4,16 +4,22 @@
4
4
  * The chat-loop fires `turn_end` with the final assistant text and this
5
5
  * registration emits an advisory `inject_reminder` (severity "warn") when the
6
6
  * turn mutated workspace state but recorded no validation evidence and no
7
- * explicit limitation. The trigger is the observed mutation, not the wording of
8
- * the assistant's text. The chat-loop's generic effect application renders the
7
+ * `limitation` receipt. The trigger is the observed mutation, not the wording
8
+ * of the assistant's text, and the text never enters the assessment. The chat-loop's generic effect application renders the
9
9
  * notice, persists the session entry, and flushes the reminder into the next
10
10
  * model request. Every decision is also written to the audit ledger.
11
11
  */
12
12
 
13
13
  import { VERIFICATION_SCRIPT_FAMILY_HINT } from "../../core/verification-scripts.js";
14
14
  import type { MiddlewareEffect, MiddlewareHookInput, MiddlewareHookRegistration } from "../middleware/index.js";
15
+ import type { UserTaskAcceptance } from "../user-tasks/acceptance.js";
15
16
  import type { CompletionContractAuditInput } from "./audit.js";
16
- import { assessFinishContract, type FinishContractAssessment } from "./finish-contract.js";
17
+ import {
18
+ assessFinishContract,
19
+ DEFAULT_RECENT_ENTRY_LIMIT,
20
+ type FinishContractAssessment,
21
+ recentEntries,
22
+ } from "./finish-contract.js";
17
23
  import type { Rigor } from "./rigor.js";
18
24
 
19
25
  export const FINISH_CONTRACT_REGISTRATION_ID = "assessor.finish-contract";
@@ -21,15 +27,15 @@ export const FINISH_CONTRACT_REGISTRATION_ID = "assessor.finish-contract";
21
27
  /**
22
28
  * High-rigor re-prompt directive. Injected dynamically via effects (never added
23
29
  * to the static system prompt) so the prompt prefix stays byte-stable. It tells
24
- * the model to validate with a verification-family command or to state what
25
- * could not be verified before claiming done. The command hint mirrors the
30
+ * the model to validate with a verification-family command or to record a
31
+ * `limitation` receipt before claiming done. The command hint mirrors the
26
32
  * vocabulary `detectValidationCommand` and `isVerificationScriptName` accept.
27
33
  */
28
34
  export const HIGH_RIGOR_REVALIDATION_MESSAGE =
29
35
  `[Clio Coder] high-rigor finish gate: this completion claim has no validation evidence. ` +
30
36
  `Before claiming done, run a verification command (the ${VERIFICATION_SCRIPT_FAMILY_HINT} family, ` +
31
- `e.g. "npm run test", "npm run lint", "npm run build") or explicitly state what could not be verified ` +
32
- `and why. Do not end the turn until you have validated or recorded the limitation.`;
37
+ `e.g. "npm run test", "npm run lint", "npm run build") or call the limitation tool with the scope ` +
38
+ `and reason of what could not be verified. Do not end the turn until you have validated or recorded the limitation.`;
33
39
 
34
40
  export interface CreateFinishContractRegistrationOptions {
35
41
  /**
@@ -45,6 +51,7 @@ export interface CreateFinishContractRegistrationOptions {
45
51
  * limitation instead of merely warning.
46
52
  */
47
53
  resolveRigor?: () => Rigor;
54
+ readActiveAcceptance?: (window: ReadonlyArray<unknown>) => UserTaskAcceptance | undefined;
48
55
  /**
49
56
  * Record the contract's decision to the audit ledger. Optional; when wired
50
57
  * (production passes the safety audit sink), every turn_end decision — each
@@ -59,7 +66,7 @@ export function createFinishContractRegistration(
59
66
  ): MiddlewareHookRegistration {
60
67
  return {
61
68
  id: FINISH_CONTRACT_REGISTRATION_ID,
62
- description: "advise when a turn mutated files without validation evidence or an explicit limitation",
69
+ description: "advise when a turn mutated files without validation evidence or a limitation receipt",
63
70
  hooks: ["turn_end"],
64
71
  evaluate(input: MiddlewareHookInput, context): ReadonlyArray<MiddlewareEffect> {
65
72
  if (input.hook !== "turn_end") return [];
@@ -70,8 +77,9 @@ export function createFinishContractRegistration(
70
77
  // finalAssistantStopMessage.
71
78
  const stopReason = input.metadata?.stopReason;
72
79
  if (stopReason !== undefined && stopReason !== "stop") return [];
73
- const assistantText = input.text?.trim() ?? "";
74
- if (assistantText.length === 0) return [];
80
+ // An empty final text is not a completion claim. The assessor reads
81
+ // only ledger receipts, so the text is otherwise unused here.
82
+ if ((input.text?.trim() ?? "").length === 0) return [];
75
83
  let entries: ReadonlyArray<unknown> | null;
76
84
  try {
77
85
  entries = options.readSessionEntries();
@@ -79,21 +87,28 @@ export function createFinishContractRegistration(
79
87
  return [];
80
88
  }
81
89
  if (entries === null) return [];
90
+ const rigor = options.resolveRigor?.() ?? "normal";
91
+ const activeAcceptance =
92
+ rigor === "high"
93
+ ? options.readActiveAcceptance?.(recentEntries(entries, input.turnId ?? null, DEFAULT_RECENT_ENTRY_LIMIT))
94
+ : undefined;
82
95
  const assessment = assessFinishContract({
83
- assistantText,
84
96
  sessionEntries: entries,
97
+ workspaceRoot: process.cwd(),
98
+ rigor,
99
+ ...(activeAcceptance ? { activeAcceptance } : {}),
85
100
  assistantTurnId: input.turnId ?? null,
86
101
  });
87
- const rigor = options.resolveRigor?.() ?? "normal";
88
102
  recordDecision(options, input.turnId ?? null, assessment, rigor);
89
103
  if (assessment.kind !== "engage") return [];
90
104
  if (rigor === "high") {
91
105
  // Withhold the completion and force a re-prompt: a continuation
92
106
  // request carries the turn onward, and the paired reminder gives
93
107
  // the directive its own visible system-reminder line.
108
+ const message = activeAcceptance?.verification.length ? assessment.message : HIGH_RIGOR_REVALIDATION_MESSAGE;
94
109
  return [
95
- { kind: "request_continuation", message: HIGH_RIGOR_REVALIDATION_MESSAGE },
96
- { kind: "inject_reminder", message: HIGH_RIGOR_REVALIDATION_MESSAGE, severity: "warn" },
110
+ { kind: "request_continuation", message },
111
+ { kind: "inject_reminder", message, severity: "warn" },
97
112
  ];
98
113
  }
99
114
  return [{ kind: "inject_reminder", message: assessment.message, severity: "warn" }];
@@ -1,14 +1,18 @@
1
+ import { resolve } from "node:path";
1
2
  import { ToolNames } from "../../core/tool-names.js";
2
3
  import { isProjectVerifierCheckId, isVerificationScriptName } from "../../core/verification-scripts.js";
4
+ import { type DeclaredCheckSourceRef, PROJECT_VERIFIER_CATALOG_RELATIVE_PATH } from "../../tools/verify/catalog.js";
5
+ import type { UserTaskAcceptance } from "../user-tasks/acceptance.js";
3
6
  import {
4
7
  detectValidationCommand,
5
8
  extractCommandDeleteTargets,
6
9
  extractCommandWriteTargets,
7
10
  toolMutationPaths,
8
11
  } from "./protected-artifacts.js";
12
+ import type { Rigor } from "./rigor.js";
9
13
 
10
14
  export const FINISH_CONTRACT_ADVISORY_MESSAGE =
11
- "[Clio Coder] finish-contract advisory: you changed files this turn without recording validation evidence or an explicit limitation. Run a verification command or state what could not be verified.";
15
+ "[Clio Coder] finish-contract advisory: you changed files this turn without recording validation evidence or a limitation receipt. Run a verification command or call limitation with the scope and reason.";
12
16
 
13
17
  /**
14
18
  * The recent-window cap (entries since the last user message). Exported so a
@@ -17,11 +21,24 @@ export const FINISH_CONTRACT_ADVISORY_MESSAGE =
17
21
  */
18
22
  export const DEFAULT_RECENT_ENTRY_LIMIT = 80;
19
23
 
20
- export type FinishContractEvidenceKind = "validation_command" | "protected_artifact" | "dispatch_receipt";
24
+ export type FinishContractEvidenceKind =
25
+ | "validation_command"
26
+ | "protected_artifact"
27
+ | "dispatch_receipt"
28
+ | "limitation";
29
+
30
+ interface ValidationExecutionEvidence {
31
+ source?: DeclaredCheckSourceRef;
32
+ cwd?: string;
33
+ argv?: ReadonlyArray<string>;
34
+ durationMs?: number;
35
+ }
21
36
 
22
- export interface FinishContractEvidence {
37
+ export interface FinishContractEvidence extends ValidationExecutionEvidence {
23
38
  kind: FinishContractEvidenceKind;
24
39
  summary: string;
40
+ check?: string;
41
+ paths?: ReadonlyArray<string>;
25
42
  turnId?: string;
26
43
  }
27
44
 
@@ -48,16 +65,22 @@ export type FinishContractAssessment =
48
65
  };
49
66
 
50
67
  export interface FinishContractInput {
51
- assistantText: string;
52
68
  sessionEntries?: ReadonlyArray<unknown>;
53
69
  assistantTurnId?: string | null;
54
70
  recentEntryLimit?: number;
71
+ rigor?: Rigor;
72
+ activeAcceptance?: UserTaskAcceptance;
73
+ /** Owning session workspace, supplied by the finish registration. */
74
+ workspaceRoot?: string;
55
75
  }
56
76
 
57
77
  interface ToolCallEvidenceCandidate {
58
78
  turnId?: string;
59
79
  toolCallId: string;
60
80
  command: string;
81
+ check?: string;
82
+ paths?: string[];
83
+ execution?: ValidationExecutionEvidence;
61
84
  }
62
85
 
63
86
  interface MutationCandidate {
@@ -65,32 +88,26 @@ interface MutationCandidate {
65
88
  paths: string[];
66
89
  }
67
90
 
68
- const LIMITATION_PATTERNS: ReadonlyArray<RegExp> = [
69
- /\b(?:blocked by|blocker|blockers|unable to|not able to|could not|couldn't|cannot|can't)\b/i,
70
- /\b(?:did not|didn't|have not|haven't|has not|hasn't|was not able|wasn't able)\b/i,
71
- /\b(?:not complete|incomplete)\b/i,
72
- /\b(?:not|un)(?:\s|-)?(?:validated|verified|tested)\b/i,
73
- /^\s*Tests\s*:\s*(?:not run|not executed|not available|failed|blocked|skipped)\b/im,
74
- /^\s*Known gaps?\s*:\s*(?!\s*(?:none|no\b|n\/a|not applicable)\b).+/im,
75
- /\bremaining(?:\s+\w+){0,3}\s+(?:work|issue|issues|gap|gaps|blocker|blockers)\b/i,
76
- ];
77
-
78
91
  /**
79
92
  * Action-scoped completion contract. The engine keys off what the turn actually
80
93
  * DID, not how the prompt was phrased: it engages only when the recent window
81
94
  * mutated workspace state and then settled (turn_end) without recording
82
- * validation evidence or an explicit limitation. The turn settling is itself
95
+ * validation evidence or a limitation receipt. The turn settling is itself
83
96
  * the completion signal, so the model never has to type "done" to be gated, and
84
97
  * a work request phrased as a question cannot bypass the gate.
85
98
  *
86
99
  * Decision order (pure function of ledger receipts):
87
100
  * 1. no mutating receipt in the window -> ok/no_mutation
88
101
  * 2. validation evidence present -> ok/validation_evidence
89
- * 3. explicit limitation stated in the text -> ok/explicit_limitation
102
+ * 3. successful `limitation` receipt present -> ok/explicit_limitation
90
103
  * 4. otherwise -> engage/unvalidated_mutation
104
+ *
105
+ * The assistant's prose never enters the decision. A limitation counts only
106
+ * as a `limitation` tool_call paired with a non-error tool_result inside the
107
+ * same window the mutation scan uses, so a run cannot satisfy the contract by
108
+ * wording alone and a real limitation is never missed for its phrasing.
91
109
  */
92
110
  export function assessFinishContract(input: FinishContractInput): FinishContractAssessment {
93
- const assistantText = input.assistantText.trim();
94
111
  const sessionEntries = input.sessionEntries ?? [];
95
112
  const assistantTurnId = input.assistantTurnId ?? null;
96
113
  const window = recentEntries(sessionEntries, assistantTurnId, input.recentEntryLimit ?? DEFAULT_RECENT_ENTRY_LIMIT);
@@ -100,13 +117,39 @@ export function assessFinishContract(input: FinishContractInput): FinishContract
100
117
  return { kind: "ok", reason: "no_mutation", evidence: [], mutatedPaths };
101
118
  }
102
119
 
103
- const evidence = collectValidationEvidence(window);
120
+ const acceptanceChecks = new Set(input.activeAcceptance?.verification.map((item) => item.check) ?? []);
121
+ const evidence = collectValidationEvidence(window, acceptanceChecks, input.workspaceRoot);
122
+ const limitations = collectLimitationEvidence(window);
123
+ const required = input.rigor === "high" ? (input.activeAcceptance?.verification ?? []) : [];
124
+ if (required.length > 0) {
125
+ const passes = new Set(
126
+ required.filter((check) => evidence.some((item) => acceptanceCheckPassed(item, check, input.workspaceRoot))),
127
+ );
128
+ const limited = new Set(limitations.flatMap((item) => item.paths ?? []));
129
+ const missing = [
130
+ ...new Set(required.filter((check) => !passes.has(check) && !limited.has(check.check)).map((item) => item.check)),
131
+ ];
132
+ if (missing.length > 0)
133
+ return {
134
+ kind: "engage",
135
+ reason: "unvalidated_mutation",
136
+ message: `[Clio Coder] high-rigor finish gate: operator acceptance still requires passing validation for: ${missing.join(", ")}. Run each named check or include its exact id in limitation.paths.`,
137
+ evidence: [...evidence, ...limitations],
138
+ mutatedPaths,
139
+ };
140
+ return {
141
+ kind: "ok",
142
+ reason: passes.size === required.length ? "validation_evidence" : "explicit_limitation",
143
+ evidence: [...evidence, ...limitations],
144
+ mutatedPaths,
145
+ };
146
+ }
104
147
  if (evidence.length > 0) {
105
148
  return { kind: "ok", reason: "validation_evidence", evidence, mutatedPaths };
106
149
  }
107
150
 
108
- if (hasExplicitLimitation(assistantText)) {
109
- return { kind: "ok", reason: "explicit_limitation", evidence: [], mutatedPaths };
151
+ if (limitations.length > 0) {
152
+ return { kind: "ok", reason: "explicit_limitation", evidence: limitations, mutatedPaths };
110
153
  }
111
154
 
112
155
  return {
@@ -118,16 +161,80 @@ export function assessFinishContract(input: FinishContractInput): FinishContract
118
161
  };
119
162
  }
120
163
 
164
+ function acceptanceCheckPassed(
165
+ evidence: FinishContractEvidence,
166
+ required: UserTaskAcceptance["verification"][number],
167
+ workspaceRoot: string | undefined,
168
+ ): boolean {
169
+ if (evidence.kind !== "validation_command" || evidence.check !== required.check || !workspaceRoot || !evidence.source)
170
+ return false;
171
+ if (evidence.durationMs !== undefined && evidence.durationMs > required.timeoutMs) return false;
172
+ const root = resolve(workspaceRoot);
173
+ if (evidence.source.kind === "project-catalog")
174
+ return evidence.source.path === resolve(root, PROJECT_VERIFIER_CATALOG_RELATIVE_PATH);
175
+ return (
176
+ evidence.source.path === resolve(root, "package.json") &&
177
+ evidence.cwd === root &&
178
+ validationCheckId(evidence.argv?.join(" ") ?? "") === required.check
179
+ );
180
+ }
181
+
121
182
  /**
122
- * The single retained text escape valve: the assistant explicitly states what
123
- * it could not verify. Everything else about the contract is receipt-grounded;
124
- * this is the one place prose still drives the decision. Candidate for a future
125
- * structured "limitation" signal so the whole gate becomes text-independent.
183
+ * Successful `limitation` receipts over the recent window. A receipt is a
184
+ * `limitation` tool_call whose tool_result in the same window is not an
185
+ * error, judged by the same `successfulToolResultId` rule the mutation and
186
+ * validation scans use. A call the tool rejected (bad reason, empty scope)
187
+ * leaves no receipt, so it cannot settle the contract.
126
188
  */
127
- function hasExplicitLimitation(text: string): boolean {
128
- const normalized = text.trim();
129
- if (normalized.length === 0) return false;
130
- return LIMITATION_PATTERNS.some((pattern) => pattern.test(normalized));
189
+ function collectLimitationEvidence(recent: ReadonlyArray<unknown>): FinishContractEvidence[] {
190
+ const evidence: FinishContractEvidence[] = [];
191
+ const calls = new Map<string, ToolCallEvidenceCandidate>();
192
+ const seen = new Set<string>();
193
+
194
+ for (const entry of recent) {
195
+ const call = limitationToolCall(entry);
196
+ if (call !== null) {
197
+ calls.set(call.toolCallId, call);
198
+ continue;
199
+ }
200
+ const resultId = successfulToolResultId(entry);
201
+ if (resultId === null) continue;
202
+ const candidate = calls.get(resultId);
203
+ if (candidate === undefined) continue;
204
+ const item: FinishContractEvidence = {
205
+ kind: "limitation",
206
+ summary: candidate.command,
207
+ ...(candidate.paths ? { paths: candidate.paths } : {}),
208
+ };
209
+ if (candidate.turnId !== undefined) item.turnId = candidate.turnId;
210
+ pushEvidence(evidence, seen, item);
211
+ }
212
+
213
+ return evidence;
214
+ }
215
+
216
+ function limitationToolCall(entry: unknown): ToolCallEvidenceCandidate | null {
217
+ const record = asRecord(entry);
218
+ if (record?.kind !== "message" || record.role !== "tool_call") return null;
219
+ const payload = asRecord(record.payload);
220
+ if (payload === null) return null;
221
+ const toolName = stringFromFirst(payload, ["name", "toolName", "tool"]);
222
+ if (toolName !== ToolNames.Limitation) return null;
223
+ const toolCallId = stringFromFirst(payload, ["toolCallId", "tool_call_id", "id"]) ?? turnIdOf(entry);
224
+ if (toolCallId === null) return null;
225
+ const args = asRecord(payload.args ?? payload.arguments ?? payload.input);
226
+ const scope = typeof args?.scope === "string" ? args.scope.trim() : "";
227
+ const reason = typeof args?.reason === "string" ? args.reason.trim() : "";
228
+ const candidate: ToolCallEvidenceCandidate = {
229
+ toolCallId,
230
+ paths: Array.isArray(args?.paths)
231
+ ? args.paths.filter((item): item is string => typeof item === "string").map((item) => item.trim())
232
+ : [],
233
+ command: `limitation recorded: ${scope.length > 0 ? scope : "unspecified"} (reason=${reason.length > 0 ? reason : "unspecified"})`,
234
+ };
235
+ const turnId = turnIdOf(entry);
236
+ if (turnId !== null) candidate.turnId = turnId;
237
+ return candidate;
131
238
  }
132
239
 
133
240
  /**
@@ -226,7 +333,11 @@ function pushPath(paths: string[], seen: Set<string>, path: string): void {
226
333
  * Inspection was removed because inspecting the repo is never a mutation, so it
227
334
  * can no longer be on the path to engaging the contract.
228
335
  */
229
- function collectValidationEvidence(recent: ReadonlyArray<unknown>): FinishContractEvidence[] {
336
+ function collectValidationEvidence(
337
+ recent: ReadonlyArray<unknown>,
338
+ acceptanceChecks: ReadonlySet<string>,
339
+ workspaceRoot: string | undefined,
340
+ ): FinishContractEvidence[] {
230
341
  const evidence: FinishContractEvidence[] = [];
231
342
  const toolCalls = new Map<string, ToolCallEvidenceCandidate>();
232
343
  const dispatchCalls = new Map<string, ToolCallEvidenceCandidate>();
@@ -239,7 +350,7 @@ function collectValidationEvidence(recent: ReadonlyArray<unknown>): FinishContra
239
350
  continue;
240
351
  }
241
352
 
242
- const call = bashValidationCall(entry);
353
+ const call = bashValidationCall(entry, acceptanceChecks, workspaceRoot);
243
354
  if (call !== null) {
244
355
  toolCalls.set(call.toolCallId, call);
245
356
  continue;
@@ -267,19 +378,19 @@ function collectValidationEvidence(recent: ReadonlyArray<unknown>): FinishContra
267
378
  }
268
379
  const candidate = toolCalls.get(resultId);
269
380
  if (candidate !== undefined) {
270
- pushEvidence(evidence, seen, validationEvidence(candidate));
381
+ pushEvidence(evidence, seen, validationEvidence(candidate, entry));
271
382
  }
272
383
  continue;
273
384
  }
274
385
 
275
- const bashExecution = bashExecutionEvidence(entry);
386
+ const bashExecution = bashExecutionEvidence(entry, acceptanceChecks, workspaceRoot);
276
387
  if (bashExecution !== null) pushEvidence(evidence, seen, bashExecution);
277
388
  }
278
389
 
279
390
  return evidence;
280
391
  }
281
392
 
282
- function recentEntries(
393
+ export function recentEntries(
283
394
  entries: ReadonlyArray<unknown>,
284
395
  assistantTurnId: string | null,
285
396
  recentEntryLimit: number,
@@ -299,7 +410,11 @@ function recentEntries(
299
410
  return entries.slice(startInclusive, endExclusive);
300
411
  }
301
412
 
302
- function bashValidationCall(entry: unknown): ToolCallEvidenceCandidate | null {
413
+ function bashValidationCall(
414
+ entry: unknown,
415
+ acceptanceChecks: ReadonlySet<string>,
416
+ workspaceRoot: string | undefined,
417
+ ): ToolCallEvidenceCandidate | null {
303
418
  const record = asRecord(entry);
304
419
  if (record?.kind !== "message" || record.role !== "tool_call") return null;
305
420
  const payload = asRecord(record.payload);
@@ -309,13 +424,15 @@ function bashValidationCall(entry: unknown): ToolCallEvidenceCandidate | null {
309
424
  const args = asRecord(payload.args ?? payload.arguments ?? payload.input);
310
425
  const command = typeof args?.command === "string" ? args.command : null;
311
426
  if (command === null) return null;
312
- const detected = detectValidationCommand(command);
427
+ const detected = acceptanceValidationCommand(command, acceptanceChecks);
313
428
  if (detected.kind !== "validation") return null;
314
429
  const toolCallId = stringFromFirst(payload, ["toolCallId", "tool_call_id", "id"]) ?? turnIdOf(entry);
315
430
  if (toolCallId === null) return null;
316
431
  const candidate: ToolCallEvidenceCandidate = {
317
432
  toolCallId,
318
433
  command: detected.matched,
434
+ ...validationCheckFields(detected.matched),
435
+ execution: packageCommandExecution(command, args?.cwd, workspaceRoot),
319
436
  };
320
437
  const turnId = turnIdOf(entry);
321
438
  if (turnId !== null) candidate.turnId = turnId;
@@ -380,6 +497,7 @@ function validationToolCall(entry: unknown): ToolCallEvidenceCandidate | null {
380
497
  const candidate: ToolCallEvidenceCandidate = {
381
498
  toolCallId,
382
499
  command: summary,
500
+ ...validationCheckFields(summary),
383
501
  };
384
502
  const turnId = turnIdOf(entry);
385
503
  if (turnId !== null) candidate.turnId = turnId;
@@ -414,7 +532,8 @@ function successfulToolResultId(entry: unknown): string | null {
414
532
  if (payload.isError === true || payload.error === true) return null;
415
533
  const result = asRecord(payload.result);
416
534
  const details = asRecord(result?.details);
417
- if (details?.kind === "error") return null;
535
+ if (result?.kind === "error" || details?.kind === "error") return null;
536
+ if (typeof details?.exitCode === "number" && details.exitCode !== 0) return null;
418
537
  return stringFromFirst(payload, ["toolCallId", "tool_call_id", "id"]);
419
538
  }
420
539
 
@@ -482,18 +601,24 @@ function dispatchReceiptAgentId(
482
601
  return candidate?.command.match(/^agent=([^\s]+)/)?.[1] ?? "unknown";
483
602
  }
484
603
 
485
- function bashExecutionEvidence(entry: unknown): FinishContractEvidence | null {
604
+ function bashExecutionEvidence(
605
+ entry: unknown,
606
+ acceptanceChecks: ReadonlySet<string>,
607
+ workspaceRoot: string | undefined,
608
+ ): FinishContractEvidence | null {
486
609
  const record = asRecord(entry);
487
610
  if (record?.kind !== "bashExecution") return null;
488
611
  if (typeof record.command !== "string") return null;
489
612
  if (record.cancelled === true) return null;
490
613
  if (record.exitCode !== 0) return null;
491
- const detected = detectValidationCommand(record.command);
614
+ const detected = acceptanceValidationCommand(record.command, acceptanceChecks);
492
615
  if (detected.kind !== "validation") return null;
493
616
  const contextMarker = record.excludeFromContext === true ? " [not sent to model]" : "";
494
617
  const evidence: FinishContractEvidence = {
495
618
  kind: "validation_command",
496
619
  summary: `validation command passed: ${detected.matched}${contextMarker}`,
620
+ ...validationCheckFields(detected.matched),
621
+ ...packageCommandExecution(record.command, record.cwd, workspaceRoot),
497
622
  };
498
623
  const turnId = turnIdOf(entry);
499
624
  if (turnId !== null) evidence.turnId = turnId;
@@ -515,17 +640,80 @@ function protectedArtifactEvidence(entry: unknown): FinishContractEvidence | nul
515
640
  return evidence;
516
641
  }
517
642
 
518
- function validationEvidence(candidate: ToolCallEvidenceCandidate): FinishContractEvidence {
643
+ function validationEvidence(candidate: ToolCallEvidenceCandidate, entry: unknown): FinishContractEvidence {
519
644
  const evidence: FinishContractEvidence = {
520
645
  kind: "validation_command",
521
646
  summary: `validation command passed: ${candidate.command}`,
647
+ ...(candidate.check ? { check: candidate.check } : {}),
648
+ ...(candidate.execution ?? declaredCheckExecution(entry, candidate.check)),
522
649
  };
523
650
  if (candidate.turnId !== undefined) evidence.turnId = candidate.turnId;
524
651
  return evidence;
525
652
  }
526
653
 
654
+ /** Preserve the verifier's execution facts only when they identify the declared check. */
655
+ function declaredCheckExecution(entry: unknown, check: string | undefined): ValidationExecutionEvidence {
656
+ const payload = asRecord(asRecord(entry)?.payload);
657
+ const details = asRecord(asRecord(payload?.result)?.details);
658
+ const source = asRecord(details?.source);
659
+ if (
660
+ !details ||
661
+ details.check !== check ||
662
+ details.exitCode !== 0 ||
663
+ details.aborted === true ||
664
+ details.timedOut === true ||
665
+ details.outputCapped === true ||
666
+ (source?.kind !== "package.json" && source?.kind !== "project-catalog") ||
667
+ typeof source.path !== "string" ||
668
+ typeof details.cwd !== "string" ||
669
+ !Array.isArray(details.argv) ||
670
+ !details.argv.every((arg): arg is string => typeof arg === "string")
671
+ )
672
+ return {};
673
+ if (source.kind === "project-catalog") {
674
+ const argv = details.argv;
675
+ if (
676
+ !Array.isArray(details.declaredCommand) ||
677
+ details.declaredCommand.length !== details.argv.length ||
678
+ !details.declaredCommand.every((arg, index) => arg === argv[index]) ||
679
+ typeof details.declaredCwd !== "string" ||
680
+ typeof details.declaredTimeoutMs !== "number" ||
681
+ typeof details.durationMs !== "number" ||
682
+ details.durationMs > details.declaredTimeoutMs ||
683
+ resolve(source.path, "../..", details.declaredCwd) !== details.cwd
684
+ )
685
+ return {};
686
+ }
687
+ return {
688
+ source: { kind: source.kind, path: source.path },
689
+ cwd: details.cwd,
690
+ argv: details.argv,
691
+ ...(typeof details.durationMs === "number" ? { durationMs: details.durationMs } : {}),
692
+ };
693
+ }
694
+
695
+ /** Exact package commands retain their execution cwd; a matched substring proves no project identity. */
696
+ function packageCommandExecution(
697
+ command: string,
698
+ cwd: unknown,
699
+ workspaceRoot: string | undefined,
700
+ ): ValidationExecutionEvidence {
701
+ if (
702
+ !workspaceRoot ||
703
+ !/^(?:npm|pnpm|yarn|bun) /u.test(command.trim()) ||
704
+ validationCheckId(command.trim()) === undefined
705
+ )
706
+ return {};
707
+ const executionCwd = resolve(workspaceRoot, typeof cwd === "string" ? cwd : ".");
708
+ return {
709
+ source: { kind: "package.json", path: resolve(executionCwd, "package.json") },
710
+ cwd: executionCwd,
711
+ argv: command.trim().split(/\s+/u),
712
+ };
713
+ }
714
+
527
715
  function pushEvidence(evidence: FinishContractEvidence[], seen: Set<string>, item: FinishContractEvidence): void {
528
- const key = `${item.kind}\0${item.summary}\0${item.turnId ?? ""}`;
716
+ const key = JSON.stringify(item);
529
717
  if (seen.has(key)) return;
530
718
  seen.add(key);
531
719
  evidence.push(item);
@@ -554,3 +742,27 @@ function stringFromFirst(record: Record<string, unknown>, keys: ReadonlyArray<st
554
742
  function asRecord(value: unknown): Record<string, unknown> | null {
555
743
  return value !== null && typeof value === "object" ? (value as Record<string, unknown>) : null;
556
744
  }
745
+
746
+ /** Exact check ids, never substring matches against rendered evidence summaries. */
747
+ function validationCheckId(command: string): string | undefined {
748
+ return (
749
+ /^(?:npm|pnpm|yarn|bun) (?:run )?([a-z0-9][a-z0-9._:-]*)$/.exec(command)?.[1] ??
750
+ /^verify ([a-z0-9][a-z0-9._:-]*)$/.exec(command)?.[1]
751
+ );
752
+ }
753
+
754
+ function validationCheckFields(command: string): { check?: string } {
755
+ const check = validationCheckId(command);
756
+ return check ? { check } : {};
757
+ }
758
+
759
+ /** Additional package scripts are admitted only by the operator's typed acceptance. */
760
+ function acceptanceValidationCommand(
761
+ command: string,
762
+ checks: ReadonlySet<string>,
763
+ ): ReturnType<typeof detectValidationCommand> {
764
+ const exact = command.trim();
765
+ const check = /^npm run ([a-z0-9][a-z0-9._:-]*)$/.exec(exact)?.[1];
766
+ if (check && checks.has(check)) return { kind: "validation", matched: exact };
767
+ return detectValidationCommand(command);
768
+ }
@@ -42,4 +42,23 @@ export {
42
42
  type PathPolicyKind,
43
43
  type PathPolicyOperation,
44
44
  } from "./path-policy.js";
45
- export { parseRigorOverride, type Rigor, resolveRigor } from "./rigor.js";
45
+ export {
46
+ parseRigorOverride,
47
+ type Rigor,
48
+ type RigorResolution,
49
+ type RigorSource,
50
+ resolveRigor,
51
+ rigorResolution,
52
+ } from "./rigor.js";
53
+ export {
54
+ describeValidationContract,
55
+ loadValidationContract,
56
+ parseValidationContractText,
57
+ VALIDATION_CONTRACT_CAPS,
58
+ VALIDATION_CONTRACT_MARKDOWN_PATH,
59
+ VALIDATION_CONTRACT_YAML_PATHS,
60
+ type ValidationContract,
61
+ type ValidationContractArtifact,
62
+ type ValidationContractLoadResult,
63
+ type ValidationContractRuntime,
64
+ } from "./validation-contract.js";