@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
@@ -52,6 +52,7 @@ export interface LedgerOptions {
52
52
 
53
53
  export type CreateRunInput = Omit<
54
54
  RunEnvelope,
55
+ | "version"
55
56
  | "id"
56
57
  | "startedAt"
57
58
  | "endedAt"
@@ -143,6 +144,10 @@ export function listFleetRuns(limit = MAX_FLEET_RUN_SCAN): FleetRunRecord[] {
143
144
  return records.slice(0, Math.max(0, limit));
144
145
  }
145
146
 
147
+ function isRecord(value: unknown): value is Record<string, unknown> {
148
+ return typeof value === "object" && value !== null && !Array.isArray(value);
149
+ }
150
+
146
151
  // `RunEnvelope.heartbeatAt` deliberately persists only the absolute wall-clock
147
152
  // anchor used for operator display and crash recovery. The monotonic heartbeat
148
153
  // stamp belongs to the live transport in this process; serializing it would
@@ -152,9 +157,16 @@ function readRuns(): RunEnvelope[] {
152
157
  if (!existsSync(path)) return [];
153
158
  const raw = readFileSync(path, "utf8").trim();
154
159
  if (raw.length === 0) return [];
155
- const parsed = JSON.parse(raw) as RunEnvelope[];
160
+ const parsed = JSON.parse(raw) as unknown;
156
161
  if (!Array.isArray(parsed)) return [];
157
- return parsed;
162
+ const envelopes: RunEnvelope[] = [];
163
+ for (const entry of parsed) {
164
+ if (!isRecord(entry)) continue;
165
+ const version = entry.version === undefined ? 1 : entry.version;
166
+ if (version !== 1) continue;
167
+ envelopes.push({ ...(entry as unknown as RunEnvelope), version: 1 });
168
+ }
169
+ return envelopes;
158
170
  }
159
171
 
160
172
  function resolveMaxRuns(opt?: number | undefined): number {
@@ -241,6 +253,7 @@ export function openLedger(opts?: LedgerOptions): Ledger {
241
253
  return {
242
254
  create(input: CreateRunInput): RunEnvelope {
243
255
  const envelope: RunEnvelope = {
256
+ version: 1,
244
257
  id: input.id ?? newRunId(),
245
258
  agentId: input.agentId,
246
259
  executionRole: input.executionRole,
@@ -10,6 +10,7 @@ import type { GatewayRoutingObservation } from "../../core/gateway-routing.js";
10
10
  import type { ResponseModelIdObservation } from "../../core/response-model-id.js";
11
11
  import type { SkillActivation } from "../../core/skill-activation.js";
12
12
  import type { ToolProfileName } from "../../tools/profiles.js";
13
+ import type { DeclaredCheckReport } from "../../tools/verify/scripts.js";
13
14
  import type { AgentAudience } from "../agents/spec.js";
14
15
  import type { EvidenceTag } from "../evidence/index.js";
15
16
  import type { CostProvenance, RuntimeTargetSnapshot } from "../providers/index.js";
@@ -442,6 +443,7 @@ export interface RunReceiptFindingsSummary {
442
443
  }
443
444
 
444
445
  export interface RunEnvelope {
446
+ version: 1;
445
447
  id: string;
446
448
  agentId: string;
447
449
  /** Semantic role this attempt's route statistics belong to. */
@@ -483,6 +485,8 @@ export interface RunEnvelope {
483
485
  plan?: RunPlanProvenance;
484
486
  /** Ad-hoc specialist provenance; present only when a persona override composed the stable prompt. */
485
487
  personaOverride?: RunPersonaOverride;
488
+ /** Decision refs active on the parent decision board at dispatch; absent when the board was empty. */
489
+ decisionRefs?: ReadonlyArray<string>;
486
490
  exitCode: number | null;
487
491
  pid: number | null;
488
492
  heartbeatAt: string | null;
@@ -663,9 +667,10 @@ export interface RunReceiptUpstreamResponse {
663
667
  * `state: "final"` means the text is a completed assistant message (the last
664
668
  * `message_end`); `state: "partial"` means mid-stream text from a message that
665
669
  * never completed (abort, stall, kill) and must never be presented as final.
666
- * `bytes` is the UTF-8 length of the full captured text before the
667
- * WORKER_OUTPUT_MAX_BYTES bound; `truncated` records that the bound clipped
668
- * `text`, so truncation is always explicit. Absent when no assistant text was
670
+ * `bytes` is the UTF-8 length of the full captured text before the run's
671
+ * capture bound (WORKER_OUTPUT_MAX_BYTES, or the larger bound a mutation-report
672
+ * contract's summary allowance implies); `truncated` records that the bound
673
+ * clipped `text`, so truncation is always explicit. Absent when no assistant text was
669
674
  * captured. Covered by the receipt integrity digest like every other field.
670
675
  */
671
676
  export interface RunReceiptOutput {
@@ -710,11 +715,14 @@ export interface RunHostVerificationCheck {
710
715
  check: string;
711
716
  argv: string[];
712
717
  cwd: string;
718
+ /** For a numeric-compare or perf-budget check, 1 when the judgement failed even though the command exited 0. */
713
719
  exitCode: number;
714
720
  durationMs: number;
715
721
  memo: boolean;
716
722
  outputTail: string;
717
723
  artifactPath?: string;
724
+ /** Structured verdict of a numeric-compare or perf-budget check; absent for a command check. Covered by the receipt digest through `hostVerification`. */
725
+ report?: DeclaredCheckReport;
718
726
  /** Run that owns the evidence when it did not come from this run: a memo hit, or the batch member the shared check ran under. */
719
727
  evidenceRunId?: string;
720
728
  }
@@ -811,8 +819,14 @@ export interface RunReceipt {
811
819
  node?: RunNodeIdentity;
812
820
  /**
813
821
  * Route and node identity attested by the worker process that executed the
814
- * run. Absent only when no worker announced, which is the stubbed-spawn path
815
- * contract tests use; every native and remote transport attests.
822
+ * run. Every native and remote worker transport attests, so a receipt from
823
+ * the worker path carries this field. It is legitimately absent on receipts
824
+ * that no worker process produced: the print-mode main-agent receipt
825
+ * (src/cli/modes/print.ts), which runs in the orchestrator process, and ACP
826
+ * delegation receipts, whose external agent never sends an announce frame.
827
+ * The eval process invariants (src/domains/eval/metrics/invariants.ts) rely
828
+ * on that absence to skip the main-agent path when counting orphaned
829
+ * workers. Contract tests that stub the spawn also leave it absent.
816
830
  */
817
831
  attestation?: RunReceiptAttestation;
818
832
  /** Dead-node failover hops, oldest first; absent when the run was never rerouted. */
@@ -828,6 +842,8 @@ export interface RunReceipt {
828
842
  fleetGate?: { path: string; pathHash: string };
829
843
  /** Ad-hoc specialist provenance; present only when a persona override composed the stable prompt. */
830
844
  personaOverride?: RunPersonaOverride;
845
+ /** Decision refs active on the parent decision board at dispatch; absent when the board was empty. */
846
+ decisionRefs?: ReadonlyArray<string>;
831
847
  /** Effective project-context tier for this run; absent on receipts written before this field landed. */
832
848
  projectContext?: RunProjectContextProvenance;
833
849
  /**
@@ -465,27 +465,58 @@ export function spawnWorkerProcess(
465
465
  },
466
466
  };
467
467
 
468
- const promise = new Promise<SpawnedWorkerResult>((resolve) => {
469
- child.on("close", (code, signal) => {
468
+ let settled = false;
469
+ let abortStarted = false;
470
+ let killTimer: ReturnType<typeof setTimeout> | null = null;
471
+ let pendingClose: (() => void) | null = null;
472
+
473
+ // The leader may exit while a same-group descendant has closed all inherited
474
+ // pipes. Neither exit nor close proves that cancellation reached the group.
475
+ function hasOwnedProcesses(): boolean {
476
+ if (pid === null) return false;
477
+ if (process.platform !== "win32") {
470
478
  try {
471
- child.stdin?.end();
472
- } catch {
473
- // stdin may already be closed.
474
- }
475
- end();
476
- if (sawSpawnError) {
477
- resolve({ exitCode: null, signal: null, ...diagnostics() });
478
- return;
479
+ process.kill(-pid, 0);
480
+ return true;
481
+ } catch (error) {
482
+ if ((error as NodeJS.ErrnoException).code === "EPERM") return true;
479
483
  }
480
- if (!announceAccepted && !announceFailed) {
481
- announceFailed = true;
482
- appendStderr("[worker] Missing worker attestation: peer exited before announcing its route identity\n");
483
- }
484
- if (announceFailed) {
485
- resolve({ exitCode: code !== null && code !== 0 ? code : 1, signal: signal ?? null, ...diagnostics() });
484
+ }
485
+ return isAlive();
486
+ }
487
+
488
+ const promise = new Promise<SpawnedWorkerResult>((resolve) => {
489
+ child.on("close", (code, signal) => {
490
+ const finish = (): void => {
491
+ if (settled) return;
492
+ settled = true;
493
+ try {
494
+ child.stdin?.end();
495
+ } catch {
496
+ // stdin may already be closed.
497
+ }
498
+ end();
499
+ if (sawSpawnError) {
500
+ resolve({ exitCode: null, signal: null, ...diagnostics() });
501
+ return;
502
+ }
503
+ if (!announceAccepted && !announceFailed) {
504
+ announceFailed = true;
505
+ appendStderr("[worker] Missing worker attestation: peer exited before announcing its route identity\n");
506
+ }
507
+ if (announceFailed) {
508
+ resolve({ exitCode: code !== null && code !== 0 ? code : 1, signal: signal ?? null, ...diagnostics() });
509
+ return;
510
+ }
511
+ resolve({ exitCode: code ?? 0, signal: signal ?? null, ...diagnostics() });
512
+ };
513
+ if (killTimer !== null && hasOwnedProcesses()) {
514
+ pendingClose = finish;
486
515
  return;
487
516
  }
488
- resolve({ exitCode: code ?? 0, signal: signal ?? null, ...diagnostics() });
517
+ if (killTimer !== null) clearTimeout(killTimer);
518
+ killTimer = null;
519
+ finish();
489
520
  });
490
521
  });
491
522
 
@@ -543,15 +574,17 @@ export function spawnWorkerProcess(
543
574
  };
544
575
 
545
576
  const abort = (): void => {
546
- if (!isAlive()) return;
577
+ if (settled || abortStarted || !hasOwnedProcesses()) return;
578
+ abortStarted = true;
547
579
  try {
548
580
  child.stdin?.end();
549
581
  } catch {
550
582
  // process may already be closing
551
583
  }
552
584
  signalProcessGroup(child, "SIGTERM");
553
- const killTimer = setTimeout(() => {
554
- if (isAlive()) {
585
+ killTimer = setTimeout(() => {
586
+ killTimer = null;
587
+ if (hasOwnedProcesses()) {
555
588
  signalProcessGroup(child, "SIGKILL");
556
589
  try {
557
590
  opts?.onForcedKill?.();
@@ -559,8 +592,12 @@ export function spawnWorkerProcess(
559
592
  // fallback is best-effort; the local channel is already dead
560
593
  }
561
594
  }
595
+ const finish = pendingClose;
596
+ pendingClose = null;
597
+ finish?.();
562
598
  }, shutdownGraceMs);
563
- killTimer.unref?.();
599
+ // Keep this timer referenced: callers await settlement before process exit,
600
+ // even when the leader and every inherited pipe have already closed.
564
601
  };
565
602
 
566
603
  return {
@@ -0,0 +1,57 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { mkdtempSync, rmSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { buildSafeToolEnv } from "../../core/safe-exec.js";
7
+
8
+ /** Stable recovery namespace; labels never enter Git's ref grammar unchecked. */
9
+ export function workspaceCheckpointRef(kind: "loop" | "compete", identity: string): string {
10
+ return `refs/clio-coder/${kind}/${createHash("sha256").update(identity).digest("hex")}`;
11
+ }
12
+
13
+ /** Capture tracked and nonignored untracked state without modifying HEAD or the user's index.
14
+ * The immutable ref makes retries idempotent and keeps the object alive across GC. */
15
+ export function captureWorkspaceCheckpoint(cwd: string, ref: string, message: string): string {
16
+ if (!/^refs\/clio-coder\/(loop|compete)\/[a-f0-9]{64}$/.test(ref)) throw new Error("invalid workspace checkpoint ref");
17
+ const directory = mkdtempSync(join(tmpdir(), "clio-checkpoint-index-"));
18
+ const env = buildSafeToolEnv({
19
+ GIT_INDEX_FILE: join(directory, "index"),
20
+ GIT_AUTHOR_NAME: "Clio checkpoint",
21
+ GIT_AUTHOR_EMAIL: "checkpoint@clio.invalid",
22
+ GIT_COMMITTER_NAME: "Clio checkpoint",
23
+ GIT_COMMITTER_EMAIL: "checkpoint@clio.invalid",
24
+ });
25
+ const config = ["-c", "core.hooksPath=/dev/null", "-c", "core.fsmonitor=false"];
26
+ const git = (args: string[]) =>
27
+ execFileSync("git", ["-C", cwd, ...config, ...args], {
28
+ env,
29
+ encoding: "utf8",
30
+ stdio: ["ignore", "pipe", "pipe"],
31
+ timeout: 30000,
32
+ maxBuffer: 1024 * 1024,
33
+ }).trim();
34
+ try {
35
+ try {
36
+ git(["rev-parse", "--verify", ref]);
37
+ return ref;
38
+ } catch {
39
+ /* First capture owns this immutable reference. */
40
+ }
41
+ const head = git(["rev-parse", "HEAD"]);
42
+ // Automatic preservation must not run repository-configured filter commands.
43
+ // Names stay argv values; Git's ordinary text normalization still applies.
44
+ const filterKeys = git(["config", "--null", "--name-only", "--list"])
45
+ .split("\0")
46
+ .filter((key) => /^filter\..*\.(?:clean|process|required)$/.test(key));
47
+ for (const key of filterKeys) config.push("-c", `${key}=${key.endsWith(".required") ? "false" : ""}`);
48
+ git(["read-tree", head]);
49
+ git(["add", "-A", "--", "."]);
50
+ const tree = git(["write-tree"]);
51
+ const commit = git(["commit-tree", tree, "-p", head, "-m", message]);
52
+ git(["update-ref", ref, commit, ""]);
53
+ return ref;
54
+ } finally {
55
+ rmSync(directory, { recursive: true, force: true });
56
+ }
57
+ }
@@ -31,7 +31,10 @@ export interface EvalBehaviorMetricDistributionV1 {
31
31
  export interface EvalBehaviorMetricComparisonV1 {
32
32
  scenarioId: string;
33
33
  role: string;
34
+ /** Representative route retained for existing consumers; both sides are recorded below. */
34
35
  target: { id: string; model: string | null };
36
+ baselineTargets: Array<{ id: string; model: string | null }>;
37
+ candidateTargets: Array<{ id: string; model: string | null }>;
35
38
  metric: EvalBehaviorMetricNameV1;
36
39
  family: EvalBehaviorMetricFamilyV1;
37
40
  direction: "higher" | "lower";
@@ -40,6 +43,8 @@ export interface EvalBehaviorMetricComparisonV1 {
40
43
  candidate: EvalBehaviorMetricDistributionV1;
41
44
  change: EvalMetricChangeV1;
42
45
  meanDelta: number | null;
46
+ /** Two standard errors of the difference; unresolved is not proof of equivalence. Safety stays exact. */
47
+ noiseBand: number;
43
48
  varianceChange: EvalMetricChangeV1;
44
49
  varianceDelta: number | null;
45
50
  comparability: EvalEnvelopeComparabilityV1;
@@ -52,6 +57,8 @@ export interface EvalBehaviorHardGateV1 {
52
57
  scenarioId: string;
53
58
  role: string;
54
59
  target: { id: string; model: string | null };
60
+ baselineTargets: Array<{ id: string; model: string | null }>;
61
+ candidateTargets: Array<{ id: string; model: string | null }>;
55
62
  metric: EvalBehaviorMetricNameV1;
56
63
  change: "regressed" | "incomparable";
57
64
  }>;
@@ -61,6 +68,7 @@ interface BehaviorGroup {
61
68
  scenarioId: string;
62
69
  role: string;
63
70
  target: { id: string; model: string | null };
71
+ targets: Array<{ id: string; model: string | null }>;
64
72
  results: EvalArtifactResultV4[];
65
73
  }
66
74
 
@@ -72,26 +80,47 @@ export function compareEvalBehaviorMetricsV1(
72
80
  hardGate: EvalBehaviorHardGateV1;
73
81
  envelopeMismatches: EvalEnvelopeMismatchV1[];
74
82
  } {
75
- const baselineGroups = behaviorGroups(baseline);
76
- const candidateGroups = behaviorGroups(candidate);
83
+ const baselineDimensions = baseline.matrix.dimensions ?? ([] as EvalExecutionMatrixDimensionV1[]);
84
+ const candidateDimensions = candidate.matrix.dimensions ?? ([] as EvalExecutionMatrixDimensionV1[]);
85
+ const varying = new Set(baselineDimensions.filter((dimension) => candidateDimensions.includes(dimension)));
86
+ const baselineGroups = behaviorGroups(baseline, varying);
87
+ const candidateGroups = behaviorGroups(candidate, varying);
77
88
  const keys = new Set([...baselineGroups.keys(), ...candidateGroups.keys()]);
78
89
  const comparisons: EvalBehaviorMetricComparisonV1[] = [];
79
90
  const envelopeMismatches: EvalEnvelopeMismatchV1[] = [];
80
- const baselineDimensions = baseline.matrix.dimensions ?? ([] as EvalExecutionMatrixDimensionV1[]);
81
- const candidateDimensions = candidate.matrix.dimensions ?? ([] as EvalExecutionMatrixDimensionV1[]);
82
91
  for (const key of [...keys].sort((left, right) => left.localeCompare(right))) {
83
92
  const baselineGroup = baselineGroups.get(key);
84
93
  const candidateGroup = candidateGroups.get(key);
85
- const identity = baselineGroup ?? candidateGroup;
86
- if (identity === undefined) continue;
87
- const envelopeMismatch = compareEvalExecutionEnvelopesV1(
94
+ const group = baselineGroup ?? candidateGroup;
95
+ if (group === undefined) continue;
96
+ const identity = {
97
+ scenarioId: group.scenarioId,
98
+ role: group.role,
99
+ target: { id: group.target.id, model: group.target.model },
100
+ };
101
+ const routes = {
102
+ baselineTargets: baselineGroup?.targets ?? [],
103
+ candidateTargets: candidateGroup?.targets ?? [],
104
+ };
105
+ let envelopeMismatch = compareEvalExecutionEnvelopesV1(
88
106
  identity,
89
107
  baselineGroup?.results ?? [],
90
108
  candidateGroup?.results ?? [],
91
109
  baselineDimensions,
92
110
  candidateDimensions,
93
111
  );
94
- if (envelopeMismatch !== null) envelopeMismatches.push(envelopeMismatch);
112
+ // Ignoring a dimension may align one route per side, but cannot choose between
113
+ // multiple routes or pool their trials into an apparently comparable distribution.
114
+ if (routes.baselineTargets.length > 1 || routes.candidateTargets.length > 1) {
115
+ envelopeMismatch = {
116
+ ...identity,
117
+ fields: ["behavioralMetrics.ambiguousRouteGroup", ...(envelopeMismatch?.fields ?? [])],
118
+ };
119
+ }
120
+ if (envelopeMismatch !== null) {
121
+ envelopeMismatch = { ...envelopeMismatch, ...routes };
122
+ envelopeMismatches.push(envelopeMismatch);
123
+ }
95
124
  const comparability: EvalEnvelopeComparabilityV1 = {
96
125
  comparable: envelopeMismatch === null,
97
126
  mismatchedFields: envelopeMismatch?.fields ?? [],
@@ -99,10 +128,13 @@ export function compareEvalBehaviorMetricsV1(
99
128
  for (const definition of EVAL_BEHAVIOR_METRIC_DEFINITIONS_V1) {
100
129
  const baselineDistribution = behaviorDistribution(baselineGroup?.results ?? [], definition);
101
130
  const candidateDistribution = behaviorDistribution(candidateGroup?.results ?? [], definition);
131
+ const noiseBand =
132
+ definition.family === "safety" ? 0 : distributionNoiseBand(baselineDistribution, candidateDistribution);
102
133
  comparisons.push({
103
134
  scenarioId: identity.scenarioId,
104
135
  role: identity.role,
105
136
  target: identity.target,
137
+ ...routes,
106
138
  metric: definition.name,
107
139
  family: definition.family,
108
140
  direction: definition.direction,
@@ -111,9 +143,10 @@ export function compareEvalBehaviorMetricsV1(
111
143
  candidate: candidateDistribution,
112
144
  change:
113
145
  envelopeMismatch === null
114
- ? classifyChange(baselineDistribution.mean, candidateDistribution.mean, definition.direction)
146
+ ? classifyChange(baselineDistribution.mean, candidateDistribution.mean, definition.direction, noiseBand)
115
147
  : "incomparable",
116
148
  meanDelta: subtractNullable(candidateDistribution.mean, baselineDistribution.mean),
149
+ noiseBand,
117
150
  varianceChange:
118
151
  envelopeMismatch === null
119
152
  ? classifyChange(baselineDistribution.variance, candidateDistribution.variance, "lower")
@@ -132,6 +165,8 @@ export function compareEvalBehaviorMetricsV1(
132
165
  scenarioId: comparison.scenarioId,
133
166
  role: comparison.role,
134
167
  target: comparison.target,
168
+ baselineTargets: comparison.baselineTargets,
169
+ candidateTargets: comparison.candidateTargets,
135
170
  metric: comparison.metric,
136
171
  change: comparison.change,
137
172
  },
@@ -153,25 +188,33 @@ export function classifyChange(
153
188
  baseline: number | null,
154
189
  candidate: number | null,
155
190
  direction: "higher" | "lower",
191
+ noiseBand = 0,
156
192
  ): EvalMetricChangeV1 {
157
193
  if (baseline === null || candidate === null) return "incomparable";
158
- if (baseline === candidate) return "unchanged";
194
+ if (Math.abs(candidate - baseline) <= noiseBand) return "unchanged";
159
195
  if (direction === "higher") return candidate > baseline ? "improved" : "regressed";
160
196
  return candidate < baseline ? "improved" : "regressed";
161
197
  }
162
198
 
163
- function behaviorGroups(artifact: EvalArtifactV4): Map<string, BehaviorGroup> {
199
+ function behaviorGroups(
200
+ artifact: EvalArtifactV4,
201
+ varying: ReadonlySet<EvalExecutionMatrixDimensionV1>,
202
+ ): Map<string, BehaviorGroup> {
164
203
  const groups = new Map<string, BehaviorGroup>();
165
204
  for (const result of artifact.results) {
166
205
  const behavioral = result.behavioralMetrics;
167
206
  if (behavioral === undefined) continue;
168
- const key = groupKey(behavioral.scenarioId, behavioral.role, behavioral.target);
207
+ const key = groupKey(behavioral.scenarioId, behavioral.role, behavioral.target, varying);
169
208
  const group = groups.get(key) ?? {
170
209
  scenarioId: behavioral.scenarioId,
171
210
  role: behavioral.role,
172
211
  target: behavioral.target,
212
+ targets: [],
173
213
  results: [],
174
214
  };
215
+ if (!group.targets.some((target) => target.id === behavioral.target.id && target.model === behavioral.target.model)) {
216
+ group.targets.push(behavioral.target);
217
+ }
175
218
  group.results.push(result);
176
219
  groups.set(key, group);
177
220
  }
@@ -215,10 +258,34 @@ function behaviorDistribution(
215
258
  };
216
259
  }
217
260
 
218
- function groupKey(scenarioId: string, role: string, target: { id: string; model: string | null }): string {
219
- return JSON.stringify([scenarioId, role, target.id, target.model]);
261
+ function groupKey(
262
+ scenarioId: string,
263
+ role: string,
264
+ target: { id: string; model: string | null },
265
+ varying: ReadonlySet<EvalExecutionMatrixDimensionV1>,
266
+ ): string {
267
+ return JSON.stringify([
268
+ scenarioId,
269
+ role,
270
+ varying.has("target") ? null : target.id,
271
+ varying.has("wireModel") ? null : target.model,
272
+ ]);
220
273
  }
221
274
 
222
275
  function subtractNullable(left: number | null, right: number | null): number | null {
223
276
  return left === null || right === null ? null : left - right;
224
277
  }
278
+
279
+ function distributionNoiseBand(
280
+ baseline: EvalBehaviorMetricDistributionV1,
281
+ candidate: EvalBehaviorMetricDistributionV1,
282
+ ): number {
283
+ // Missing coverage and single trials cannot establish empirical variation.
284
+ if (baseline.measured < 2 || candidate.measured < 2 || baseline.unmeasured > 0 || candidate.unmeasured > 0) return 0;
285
+ // Stored variance is population variance. Divide by n-1 to obtain the
286
+ // unbiased estimate of variance of each sample mean.
287
+ return (
288
+ 2 *
289
+ Math.sqrt((baseline.variance ?? 0) / (baseline.measured - 1) + (candidate.variance ?? 0) / (candidate.measured - 1))
290
+ );
291
+ }
@@ -132,7 +132,7 @@ export function compareEvalArtifactsV4(
132
132
  export function renderEvalComparisonV4(summary: EvalCompareV4Summary): string {
133
133
  const envelopeFailures = summary.envelopeMismatches.map(
134
134
  (mismatch) =>
135
- ` incomparable envelope: ${mismatch.scenarioId} ${mismatch.role} ${mismatch.target.id}/${mismatch.target.model ?? "none"} fields=${mismatch.fields.join(",")}`,
135
+ ` incomparable envelope: ${mismatch.scenarioId} ${mismatch.role} ${renderEvalComparisonRoutesV1(mismatch)} fields=${mismatch.fields.join(",")}`,
136
136
  );
137
137
  const affected = summary.affectedCorpusResults.map(
138
138
  (result) =>
@@ -142,7 +142,7 @@ export function renderEvalComparisonV4(summary: EvalCompareV4Summary): string {
142
142
  const roleReports = renderRollups("per-role baseline/candidate report", summary.roleReports);
143
143
  const hardFailures = summary.hardGate.failures.map(
144
144
  (failure) =>
145
- ` hard failure: ${failure.scenarioId} ${failure.role} ${failure.target.id}/${failure.target.model ?? "none"} ${failure.metric} ${failure.change}`,
145
+ ` hard failure: ${failure.scenarioId} ${failure.role} ${renderEvalComparisonRoutesV1(failure)} ${failure.metric} ${failure.change}`,
146
146
  );
147
147
  const tracked = summary.trackedMetrics.flatMap((row, index) => [
148
148
  ...(index === 0
@@ -172,14 +172,13 @@ export function renderEvalComparisonV4(summary: EvalCompareV4Summary): string {
172
172
  ...(index === 0
173
173
  ? [
174
174
  "behavioral metrics:",
175
- "scenario role target model family metric baseline_mean baseline_variance baseline_coverage candidate_mean candidate_variance candidate_coverage mean_delta variance_delta change variance_change comparability gate source",
175
+ "scenario role baseline_target/model -> candidate_target/model family metric baseline_mean baseline_variance baseline_coverage candidate_mean candidate_variance candidate_coverage mean_delta variance_delta noise_band change variance_change comparability gate source",
176
176
  ]
177
177
  : []),
178
178
  [
179
179
  row.scenarioId,
180
180
  row.role,
181
- row.target.id,
182
- row.target.model ?? "none",
181
+ renderEvalComparisonRoutesV1(row),
183
182
  row.family,
184
183
  row.metric,
185
184
  formatMetric(row.baseline.mean),
@@ -190,6 +189,7 @@ export function renderEvalComparisonV4(summary: EvalCompareV4Summary): string {
190
189
  `${row.candidate.measured}/${row.candidate.observations}`,
191
190
  formatSignedMetric(row.meanDelta),
192
191
  formatSignedMetric(row.varianceDelta),
192
+ formatMetric(row.noiseBand),
193
193
  row.change,
194
194
  row.varianceChange,
195
195
  row.comparability.comparable ? "comparable" : `incomparable:${row.comparability.mismatchedFields.join(",")}`,
@@ -218,6 +218,16 @@ export function renderEvalComparisonV4(summary: EvalCompareV4Summary): string {
218
218
  ].join("\n");
219
219
  }
220
220
 
221
+ export function renderEvalComparisonRoutesV1(identity: {
222
+ target: { id: string; model: string | null };
223
+ baselineTargets?: ReadonlyArray<{ id: string; model: string | null }>;
224
+ candidateTargets?: ReadonlyArray<{ id: string; model: string | null }>;
225
+ }): string {
226
+ const render = (targets: ReadonlyArray<{ id: string; model: string | null }>) =>
227
+ targets.map((target) => `${target.id}/${target.model ?? "none"}`).join(",") || "missing";
228
+ return `${render(identity.baselineTargets ?? [identity.target])} -> ${render(identity.candidateTargets ?? [identity.target])}`;
229
+ }
230
+
221
231
  function behaviorRollups(
222
232
  rows: ReadonlyArray<EvalBehaviorMetricComparisonV1>,
223
233
  keyOf: (row: EvalBehaviorMetricComparisonV1) => string,
@@ -5,6 +5,8 @@ export interface EvalEnvelopeMismatchV1 {
5
5
  scenarioId: string;
6
6
  role: string;
7
7
  target: { id: string; model: string | null };
8
+ baselineTargets?: Array<{ id: string; model: string | null }>;
9
+ candidateTargets?: Array<{ id: string; model: string | null }>;
8
10
  fields: string[];
9
11
  }
10
12
 
@@ -20,10 +22,15 @@ export function compareEvalExecutionEnvelopesV1(
20
22
  baselineDimensions: ReadonlyArray<EvalExecutionMatrixDimensionV1>,
21
23
  candidateDimensions: ReadonlyArray<EvalExecutionMatrixDimensionV1>,
22
24
  ): EvalEnvelopeMismatchV1 | null {
25
+ const mismatchIdentity = {
26
+ scenarioId: identity.scenarioId,
27
+ role: identity.role,
28
+ target: { id: identity.target.id, model: identity.target.model },
29
+ };
23
30
  const leftDimensions = [...baselineDimensions].sort();
24
31
  const rightDimensions = [...candidateDimensions].sort();
25
32
  if (stableJson(leftDimensions) !== stableJson(rightDimensions)) {
26
- return { ...identity, fields: ["matrix.dimensions"] };
33
+ return { ...mismatchIdentity, fields: ["matrix.dimensions"] };
27
34
  }
28
35
  if (
29
36
  (baseline.some((result) => result.executionEnvelope !== undefined) &&
@@ -31,22 +38,22 @@ export function compareEvalExecutionEnvelopesV1(
31
38
  (candidate.some((result) => result.executionEnvelope !== undefined) &&
32
39
  candidate.some((result) => result.executionEnvelope === undefined))
33
40
  ) {
34
- return { ...identity, fields: ["executionEnvelope.missingTrial"] };
41
+ return { ...mismatchIdentity, fields: ["executionEnvelope.missingTrial"] };
35
42
  }
36
43
  const ignored = new Set(leftDimensions);
37
44
  const baselineEnvelopes = uniqueEnvelopes(baseline, ignored);
38
45
  const candidateEnvelopes = uniqueEnvelopes(candidate, ignored);
39
46
  if (baselineEnvelopes.length === 0 && candidateEnvelopes.length === 0) return null;
40
47
  if (baselineEnvelopes.length === 0 || candidateEnvelopes.length === 0) {
41
- return { ...identity, fields: ["executionEnvelope"] };
48
+ return { ...mismatchIdentity, fields: ["executionEnvelope"] };
42
49
  }
43
50
  if (baselineEnvelopes.length > 1 || candidateEnvelopes.length > 1) {
44
- return { ...identity, fields: ["executionEnvelope.withinRunVariance"] };
51
+ return { ...mismatchIdentity, fields: ["executionEnvelope.withinRunVariance"] };
45
52
  }
46
53
  const left = baselineEnvelopes[0];
47
54
  const right = candidateEnvelopes[0];
48
55
  if (left === undefined || right === undefined || stableJson(left) === stableJson(right)) return null;
49
- return { ...identity, fields: differingFields(left, right, ignored) };
56
+ return { ...mismatchIdentity, fields: differingFields(left, right, ignored) };
50
57
  }
51
58
 
52
59
  function uniqueEnvelopes(
@@ -1,3 +1,6 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import { join } from "node:path";
1
4
  import { enumerateWorkspaceFiles } from "../../../core/workspace-files.js";
2
5
  import { readCodewiki, structuralCodewikiHash } from "../../context/codewiki/artifact.js";
3
6
  import { renderCodewikiDigest } from "../../context/codewiki/digest.js";
@@ -10,13 +13,31 @@ export function collectContextMetrics(cwd: string): Record<string, number | stri
10
13
  const visiblePaths = new Set(enumerateWorkspaceFiles(cwd));
11
14
  const artifactSourceFiles = codewiki.files.filter((file) => file.lang !== "config");
12
15
  const indexedFiles = artifactSourceFiles.filter((file) => visiblePaths.has(file.path)).length;
13
- const staleFiles = artifactSourceFiles.length - indexedFiles;
16
+ let contentValidFiles = 0;
17
+ let missingFiles = 0;
18
+ for (const file of artifactSourceFiles) {
19
+ try {
20
+ // Match the indexer's UTF-8 source identity, including legacy records
21
+ // whose missing hash cannot establish content validity.
22
+ const hash = createHash("sha256")
23
+ .update(readFileSync(join(cwd, file.path), "utf8"))
24
+ .digest("hex")
25
+ .slice(0, 16);
26
+ if (visiblePaths.has(file.path) && file.hash === hash) contentValidFiles += 1;
27
+ } catch (error) {
28
+ const code = (error as NodeJS.ErrnoException).code;
29
+ if (code === "ENOENT" || code === "ENOTDIR") missingFiles += 1;
30
+ }
31
+ }
32
+ const staleFiles = artifactSourceFiles.length - contentValidFiles;
14
33
  const sourceFiles = detectProjectProfile(cwd).sourceFiles;
15
34
  const digest = renderCodewikiDigest(codewiki);
16
35
  return {
17
36
  "context.indexedFiles": indexedFiles,
18
37
  "context.artifactFiles": artifactSourceFiles.length,
19
38
  "context.staleFiles": staleFiles,
39
+ "context.contentValidFiles": contentValidFiles,
40
+ "context.missingFiles": missingFiles,
20
41
  "context.coverage": sourceFiles === 0 ? (artifactSourceFiles.length === 0 ? 1 : 0) : indexedFiles / sourceFiles,
21
42
  "context.structuralHash": structuralCodewikiHash(codewiki),
22
43
  "context.digestTokens": Math.ceil(digest.length / 4),
@@ -26,6 +47,8 @@ export function collectContextMetrics(cwd: string): Record<string, number | stri
26
47
  "context.indexedFiles": 0,
27
48
  "context.artifactFiles": 0,
28
49
  "context.staleFiles": 0,
50
+ "context.contentValidFiles": 0,
51
+ "context.missingFiles": 0,
29
52
  "context.coverage": 0,
30
53
  "context.structuralHash": null,
31
54
  "context.digestTokens": 0,