@iowarp/clio-coder 0.3.8 → 0.4.0

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 (552) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/NOTICE +33 -0
  3. package/README.md +12 -3
  4. package/dist/{acp-U67UHUK2.js → acp-G5WJBNCT.js} +13 -12
  5. package/dist/{agents-YU6SGALZ.js → agents-FMV2Q5G4.js} +41 -36
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-5ZPJOIVG.js → auth-3IDSJEIK.js} +18 -18
  8. package/dist/{builtins-C6JMZVV6.js → builtins-XCZWXSC7.js} +5 -5
  9. package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
  10. package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
  11. package/dist/{chunk-XWSF374K.js → chunk-2OQE55CK.js} +3 -3
  12. package/dist/{chunk-5H3GB5BO.js → chunk-32KWKNSF.js} +8 -384
  13. package/dist/{chunk-KTYTFRMB.js → chunk-36EJLSQQ.js} +34 -36
  14. package/dist/{chunk-FHJEP5SW.js → chunk-3BT2XMV4.js} +19 -13
  15. package/dist/chunk-3DPEIQKN.js +113 -0
  16. package/dist/{chunk-GU2UIAFZ.js → chunk-3URVFKWK.js} +7 -7
  17. package/dist/{chunk-WEH5XRJQ.js → chunk-3XML7CDN.js} +3 -3
  18. package/dist/chunk-42FMPA75.js +101 -0
  19. package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
  20. package/dist/{chunk-VCBR6CU7.js → chunk-5PSMVOLM.js} +2 -2
  21. package/dist/{chunk-NMPKI6XL.js → chunk-6DB53AJS.js} +203 -25
  22. package/dist/{chunk-3BINW3FP.js → chunk-76ONBSIA.js} +2 -2
  23. package/dist/{chunk-26LEYJZH.js → chunk-7MCTRUCE.js} +2 -2
  24. package/dist/{chunk-TYPGUK6W.js → chunk-AB44T6BB.js} +111 -5
  25. package/dist/{chunk-K4XHGFR5.js → chunk-B7OBL7PK.js} +317 -721
  26. package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
  27. package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
  28. package/dist/{chunk-ZVJ5BLO2.js → chunk-BKFJHQCA.js} +154 -16
  29. package/dist/chunk-BKFM6EJV.js +462 -0
  30. package/dist/chunk-BMS5RKQY.js +27 -0
  31. package/dist/{chunk-ZNLWCMVZ.js → chunk-BPKCPIL7.js} +2 -2
  32. package/dist/{chunk-TLQJPP24.js → chunk-BUMFYQFY.js} +1394 -1349
  33. package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
  34. package/dist/chunk-C2LTL2W6.js +2447 -0
  35. package/dist/{chunk-ME6CCNFO.js → chunk-CODPRO7Q.js} +8 -8
  36. package/dist/{chunk-E77JEWSD.js → chunk-CTJ4RNAA.js} +7 -37
  37. package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
  38. package/dist/{chunk-7RFXX52T.js → chunk-DQITNCXG.js} +642 -172
  39. package/dist/{chunk-TTHACPOM.js → chunk-DYJP44XW.js} +578 -117
  40. package/dist/{chunk-2HFZQUHL.js → chunk-F4CKPOEQ.js} +18 -8
  41. package/dist/{chunk-DGSYXYMX.js → chunk-FEFIFZTL.js} +3 -3
  42. package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
  43. package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
  44. package/dist/chunk-GKF55TAZ.js +391 -0
  45. package/dist/{chunk-VWZOAB7K.js → chunk-GR5G2PVF.js} +9 -8
  46. package/dist/{chunk-4DGYLA73.js → chunk-GXNLGKAB.js} +80 -9
  47. package/dist/chunk-HHV2GANA.js +88 -0
  48. package/dist/{chunk-IIZWH4XA.js → chunk-HI63TFOG.js} +5 -4
  49. package/dist/{chunk-WLFILSD5.js → chunk-HJJTYUHX.js} +113 -83
  50. package/dist/{chunk-TT36MB5S.js → chunk-HLW2MRKE.js} +3 -1
  51. package/dist/{chunk-PMDBGQSJ.js → chunk-HWHKMHUA.js} +7 -7
  52. package/dist/chunk-HZHHCK24.js +1631 -0
  53. package/dist/{chunk-WSB3FPX7.js → chunk-I5VEOC6I.js} +39 -143
  54. package/dist/chunk-IBEBSCYA.js +564 -0
  55. package/dist/chunk-IQ7KR472.js +362 -0
  56. package/dist/{chunk-A3WNZD3P.js → chunk-J4W7KFM7.js} +949 -972
  57. package/dist/{chunk-TB5666IT.js → chunk-JDG2WCRO.js} +5 -5
  58. package/dist/{chunk-N22QMJKY.js → chunk-K5C3NCBD.js} +4 -4
  59. package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
  60. package/dist/{chunk-5C3AQNDW.js → chunk-KFZI4NIL.js} +216 -38
  61. package/dist/chunk-KMVISBZR.js +132 -0
  62. package/dist/{chunk-WXY7KU3G.js → chunk-LDQ2ZF2M.js} +2 -2
  63. package/dist/{chunk-XN3L4EYL.js → chunk-LQ3DZAMX.js} +3 -3
  64. package/dist/{chunk-U6MBIEMB.js → chunk-LY4S7GJC.js} +173 -144
  65. package/dist/{chunk-4SPRNWDE.js → chunk-MLKNTWH2.js} +19 -19
  66. package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
  67. package/dist/chunk-NEKRRTYW.js +56 -0
  68. package/dist/{chunk-SPULKLCF.js → chunk-NHCZP4K7.js} +3 -3
  69. package/dist/chunk-NHLBIGRH.js +1506 -0
  70. package/dist/chunk-NQQH3YT7.js +302 -0
  71. package/dist/chunk-NYS75XW5.js +15 -0
  72. package/dist/{chunk-GN57SG4G.js → chunk-O4XIVISU.js} +10 -8
  73. package/dist/{chunk-EMYUUSFG.js → chunk-O6TL7WWY.js} +6 -6
  74. package/dist/chunk-OQBA45DZ.js +97 -0
  75. package/dist/{chunk-LU7P4LHA.js → chunk-P3FOHJT4.js} +2 -2
  76. package/dist/chunk-PMZCIOCJ.js +25 -0
  77. package/dist/{chunk-I4HZDVNP.js → chunk-PQEFIJ36.js} +2 -2
  78. package/dist/{chunk-J3YUBZWY.js → chunk-QBJA7R7N.js} +62 -6
  79. package/dist/chunk-QDC3K2U3.js +262 -0
  80. package/dist/{chunk-2HEJ2F35.js → chunk-QLFS5GO2.js} +22 -10
  81. package/dist/{chunk-7RGZWPB6.js → chunk-QLL7ILRG.js} +95 -32
  82. package/dist/{chunk-YS5VLNH5.js → chunk-QREDIESB.js} +6 -6
  83. package/dist/chunk-QSNYB6ZV.js +195 -0
  84. package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
  85. package/dist/chunk-RKKLTLYB.js +45 -0
  86. package/dist/{chunk-P43ETTHK.js → chunk-SJ5ZKQ4S.js} +2 -2
  87. package/dist/{chunk-GPIEI3LY.js → chunk-SP2RXXYO.js} +6 -54
  88. package/dist/chunk-SUCTJL45.js +45 -0
  89. package/dist/{chunk-DYIM5TJT.js → chunk-SUW5DORT.js} +263 -7
  90. package/dist/chunk-T56WDKA5.js +183 -0
  91. package/dist/chunk-TVHHYFHE.js +255 -0
  92. package/dist/{chunk-FJ3H4MN5.js → chunk-TZ3SGWZZ.js} +3 -3
  93. package/dist/{chunk-MXKJU4JB.js → chunk-U77AMWDL.js} +91 -10
  94. package/dist/{chunk-5DHKRSMQ.js → chunk-ULC6OTWO.js} +11 -7
  95. package/dist/{chunk-RWSI4YD7.js → chunk-UM7N4G5A.js} +33 -12
  96. package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
  97. package/dist/{chunk-IGWKHNIQ.js → chunk-UXMFQ54G.js} +44 -37
  98. package/dist/{chunk-HFSBBKSQ.js → chunk-V5DHCITQ.js} +171 -3
  99. package/dist/{chunk-5WIGXA4T.js → chunk-VAZSBTKF.js} +111 -4
  100. package/dist/{chunk-VHN4MY6O.js → chunk-VEO4AP2K.js} +2 -2
  101. package/dist/{chunk-IJ7RPIYJ.js → chunk-VFA6GDY5.js} +65 -4
  102. package/dist/{chunk-PT7HYKEM.js → chunk-VO2LKSTM.js} +2 -2
  103. package/dist/chunk-VO67MWHC.js +75 -0
  104. package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
  105. package/dist/{chunk-TANS5ZJS.js → chunk-VYMXRQI6.js} +36 -22
  106. package/dist/{chunk-WWCZ5F23.js → chunk-W5VSYASO.js} +77 -16
  107. package/dist/{chunk-WNIJTQQK.js → chunk-WZR7K7ZX.js} +72 -116
  108. package/dist/{chunk-5Q2VVUKB.js → chunk-X3YGUTOB.js} +4 -4
  109. package/dist/chunk-X75E3D2N.js +686 -0
  110. package/dist/{chunk-VAWNZU7Z.js → chunk-YDFRH54B.js} +4 -4
  111. package/dist/chunk-YJX4SHTD.js +40 -0
  112. package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
  113. package/dist/chunk-Z2RR6MAK.js +127 -0
  114. package/dist/{chunk-FBVTI2TJ.js → chunk-Z4TXYIEG.js} +12 -131
  115. package/dist/cli/index.js +47 -36
  116. package/dist/{clio-QVTYJ57A.js → clio-2JXHBBY5.js} +7 -7
  117. package/dist/{code-nav-FGGFIE7L.js → code-nav-3YYRMYNF.js} +8 -8
  118. package/dist/{compile-cache-CVJMMODC.js → compile-cache-7FPE6PS3.js} +3 -3
  119. package/dist/{components-ZFA3SAER.js → components-RYZV4JGP.js} +5 -5
  120. package/dist/{config-LW5IJFQN.js → config-QZPCMYSO.js} +99 -63
  121. package/dist/{configure-7XIZCOU4.js → configure-TEGEBYCA.js} +23 -22
  122. package/dist/{context-Y6Y7QPR6.js → context-AV7OEZ4D.js} +12 -12
  123. package/dist/{context-L3WL3X7K.js → context-E6H5RNMC.js} +56 -47
  124. package/dist/{context-N52ZA626.js → context-GSXUE4CT.js} +29 -27
  125. package/dist/{context-clear-MBQRLSDQ.js → context-clear-SHIBYK6T.js} +55 -46
  126. package/dist/{context-index-HVMFQHK3.js → context-index-HNG3MOME.js} +2 -2
  127. package/dist/{context-working-set-GS6DSO7F.js → context-working-set-5ZGKPGZQ.js} +13 -13
  128. package/dist/{dispatch-runner-22ZCNOM3.js → dispatch-runner-EFMJT4LD.js} +93 -64
  129. package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
  130. package/dist/doctor-QOA5FNY5.js +313 -0
  131. package/dist/{eval-BEC2WHDA.js → eval-TFBYQH4H.js} +2032 -156
  132. package/dist/eval-inventory-SXH7PDKX.js +316 -0
  133. package/dist/{evidence-REJUMSKM.js → evidence-ERGESKGN.js} +203 -48
  134. package/dist/{evolve-PY5ZBA5K.js → evolve-VDXTSYCJ.js} +52 -43
  135. package/dist/{extensions-HVKU65YU.js → extensions-7BGBHN57.js} +13 -7
  136. package/dist/{fleet-7WZEWRFA.js → fleet-2RRVDF2V.js} +228 -108
  137. package/dist/{fleet-commands-UVHWM76J.js → fleet-commands-VJ726XIA.js} +11 -11
  138. package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
  139. package/dist/{fleet-graph-6ULH7PES.js → fleet-graph-JF5QOATM.js} +18 -15
  140. package/dist/fleet-inspect-VLY4S7QM.js +442 -0
  141. package/dist/{fleet-preflight-J53T6CCE.js → fleet-preflight-AIZUEJOY.js} +5 -5
  142. package/dist/{fleet-validate-72PC4SLA.js → fleet-validate-AJRPDMDV.js} +22 -19
  143. package/dist/fleet-verify-JFEL2L3H.js +175 -0
  144. package/dist/fleet-view-ZCON35AG.js +102 -0
  145. package/dist/{init-OG3TPGQG.js → init-DN2WWLFE.js} +72 -62
  146. package/dist/install-XGLBQY5E.js +13 -0
  147. package/dist/interop-OZBKXAYL.js +114 -0
  148. package/dist/{library-CNTMPLRF.js → library-YWZG7IMW.js} +21 -18
  149. package/dist/{memory-6IS7F275.js → memory-I4C4HMLW.js} +54 -45
  150. package/dist/{models-ENRJDA5W.js → models-CEYXJBO6.js} +33 -30
  151. package/dist/{monitor-XLDVO7TN.js → monitor-NZ6GCI3P.js} +59 -52
  152. package/dist/{orchestrator-6KSPYRHA.js → orchestrator-GCGQ4N5I.js} +7827 -7328
  153. package/dist/panes-HMABYVO4.js +58 -0
  154. package/dist/panes-KY6W3V2E.js +103 -0
  155. package/dist/{paths-DBXMZMDU.js → paths-II4K7DNR.js} +5 -5
  156. package/dist/{reset-RZ4ER727.js → reset-DQ6FGCSH.js} +13 -11
  157. package/dist/resources-BB3MVJMD.js +111 -0
  158. package/dist/{run-Y2CNK5RU.js → run-H2GQDUER.js} +119 -87
  159. package/dist/{share-A55GYP6Z.js → share-GTJN6A5O.js} +20 -17
  160. package/dist/{skills-ALC5J6AT.js → skills-L55TEW6R.js} +33 -24
  161. package/dist/{skills-eval-JPBEBYQU.js → skills-eval-XVXPH2JI.js} +67 -56
  162. package/dist/skills-inventory-S4MXPJFV.js +126 -0
  163. package/dist/slash-commands-ZSGASKJC.js +77 -0
  164. package/dist/{steer-GGWFUJUD.js → steer-RZGSCY4R.js} +4 -4
  165. package/dist/{support-MIETYA5E.js → support-PKEUNNQL.js} +6 -6
  166. package/dist/{targets-VGNXIR3S.js → targets-NCPZ644J.js} +68 -40
  167. package/dist/{terminal-lease-WOBR64YA.js → terminal-lease-44SV3YCN.js} +6 -4
  168. package/dist/tools-DAF3DI3C.js +27 -0
  169. package/dist/{trace-PNCASAXC.js → trace-FYVW2MQA.js} +207 -10
  170. package/dist/tui-primitives-2AKXQNZK.js +13 -0
  171. package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
  172. package/dist/{upgrade-FUSUAGHR.js → upgrade-3XPP6OQL.js} +27 -24
  173. package/dist/{usage-N4MKVHKD.js → usage-3NLHGTU2.js} +114 -62
  174. package/dist/{verifiers-YAWOJ3H2.js → verifiers-SSQONKRT.js} +172 -13
  175. package/dist/{verify-LTDHYBGY.js → verify-3U6J7FZI.js} +10 -10
  176. package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
  177. package/dist/{wiki-generate-6M7GHTBJ.js → wiki-generate-CEHYGPGQ.js} +75 -65
  178. package/dist/with-panes-MKB46MPQ.js +782 -0
  179. package/dist/worker/entry.js +106 -75
  180. package/docs/README.md +3 -2
  181. package/docs/acp.md +24 -3
  182. package/docs/alcf-provider.md +1 -1
  183. package/docs/architecture.md +2 -2
  184. package/docs/artifact-versions.md +9 -1
  185. package/docs/built-in-agents.md +1 -1
  186. package/docs/capacity-and-scheduling.md +62 -3
  187. package/docs/commands-and-modes.md +31 -2
  188. package/docs/configuration-and-targets.md +69 -12
  189. package/docs/context-engine.md +63 -4
  190. package/docs/development-pipeline.md +19 -0
  191. package/docs/dispatch-typed-intent.md +385 -0
  192. package/docs/documentation-coverage.md +5 -5
  193. package/docs/documentation-guide.md +1 -1
  194. package/docs/environment-variables.md +3 -0
  195. package/docs/eval-runner.md +262 -11
  196. package/docs/evals-internal.md +72 -2
  197. package/docs/evidence-and-memory.md +12 -11
  198. package/docs/evolution.md +1 -1
  199. package/docs/exit-codes-and-output.md +1 -1
  200. package/docs/extensions-and-sharing.md +27 -1
  201. package/docs/fleet-dispatch.md +25 -4
  202. package/docs/installation-and-lifecycle.md +15 -2
  203. package/docs/middleware-and-components.md +1 -1
  204. package/docs/model-catalog.md +10 -1
  205. package/docs/observability.md +55 -4
  206. package/docs/proactive-memory.md +127 -14
  207. package/docs/prompt-envelope-and-tools.md +19 -1
  208. package/docs/provider-adapter-cookbook.md +1 -1
  209. package/docs/release-cut-checklist.md +19 -3
  210. package/docs/safety-model.md +2 -2
  211. package/docs/scientific-validation.md +3 -3
  212. package/docs/session-lifecycle.md +1 -1
  213. package/docs/skills-marketplace.md +1 -1
  214. package/docs/tool-usage.md +18 -8
  215. package/docs/trace-store.md +1 -1
  216. package/docs/troubleshooting.md +88 -1
  217. package/docs/tui-design.md +1 -1
  218. package/docs/worker-dispatch-mechanics.md +1 -1
  219. package/package.json +5 -2
  220. package/src/cli/acp.ts +6 -2
  221. package/src/cli/agents.ts +1 -1
  222. package/src/cli/argv.ts +25 -0
  223. package/src/cli/config-inspect.ts +33 -6
  224. package/src/cli/config.ts +1 -1
  225. package/src/cli/configure.ts +23 -21
  226. package/src/cli/doctor-panes.ts +124 -0
  227. package/src/cli/doctor-state-size.ts +82 -0
  228. package/src/cli/doctor-toolchain.ts +57 -0
  229. package/src/cli/doctor.ts +22 -1
  230. package/src/cli/eval-inventory.ts +436 -0
  231. package/src/cli/eval.ts +93 -16
  232. package/src/cli/evidence-detail.ts +88 -0
  233. package/src/cli/evidence-inventory.ts +183 -0
  234. package/src/cli/evidence.ts +30 -5
  235. package/src/cli/extensions.ts +5 -1
  236. package/src/cli/fleet-decisions.ts +69 -0
  237. package/src/cli/fleet-inspect.ts +334 -0
  238. package/src/cli/fleet-verify.ts +133 -0
  239. package/src/cli/fleet-view.ts +810 -0
  240. package/src/cli/fleet.ts +179 -39
  241. package/src/cli/index.ts +14 -2
  242. package/src/cli/interop-inspect.ts +128 -0
  243. package/src/cli/interop.ts +34 -0
  244. package/src/cli/panes.ts +35 -0
  245. package/src/cli/reset.ts +5 -2
  246. package/src/cli/run.ts +58 -0
  247. package/src/cli/skills-inventory.ts +185 -0
  248. package/src/cli/skills.ts +16 -13
  249. package/src/cli/targets.ts +44 -13
  250. package/src/cli/tools.ts +321 -0
  251. package/src/cli/trace-inspect.ts +252 -0
  252. package/src/cli/trace.ts +85 -5
  253. package/src/cli/usage.ts +63 -14
  254. package/src/cli/verifiers-inspect.ts +347 -0
  255. package/src/cli/verifiers.ts +9 -0
  256. package/src/core/bus-events.ts +33 -1
  257. package/src/core/cache-telemetry.ts +42 -0
  258. package/src/core/config.ts +67 -0
  259. package/src/core/defaults.ts +124 -8
  260. package/src/core/endpoint-key.ts +27 -0
  261. package/src/core/residency-target-key.ts +25 -0
  262. package/src/core/response-schema.ts +80 -6
  263. package/src/core/theme-token-hex.ts +43 -0
  264. package/src/core/tool-names.ts +2 -1
  265. package/src/core/xdg.ts +1 -1
  266. package/src/domains/agents/fleets/build-review.md +0 -3
  267. package/src/domains/agents/fleets/build-test.md +0 -3
  268. package/src/domains/agents/result-contract-filesystem.ts +32 -0
  269. package/src/domains/agents/result-contract.ts +164 -35
  270. package/src/domains/config/classify.ts +6 -0
  271. package/src/domains/context/codewiki/coordinator.ts +12 -4
  272. package/src/domains/dispatch/admission-error.ts +9 -0
  273. package/src/domains/dispatch/admission.ts +52 -14
  274. package/src/domains/dispatch/capacity-lease.ts +118 -9
  275. package/src/domains/dispatch/contract.ts +11 -0
  276. package/src/domains/dispatch/council-topology.ts +398 -0
  277. package/src/domains/dispatch/execution-plan.ts +44 -4
  278. package/src/domains/dispatch/extension.ts +378 -82
  279. package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
  280. package/src/domains/dispatch/fleet-plan.ts +7 -2
  281. package/src/domains/dispatch/fleet-run.ts +87 -4
  282. package/src/domains/dispatch/gate-decisions.ts +11 -1
  283. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  284. package/src/domains/dispatch/gate-topology.ts +289 -0
  285. package/src/domains/dispatch/heartbeat.ts +32 -8
  286. package/src/domains/dispatch/index.ts +22 -0
  287. package/src/domains/dispatch/intent-compatibility.ts +330 -0
  288. package/src/domains/dispatch/intent.ts +85 -1
  289. package/src/domains/dispatch/orphan-recovery.ts +5 -0
  290. package/src/domains/dispatch/reservation-store.ts +139 -11
  291. package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
  292. package/src/domains/dispatch/run-event-journal.ts +598 -0
  293. package/src/domains/dispatch/state.ts +49 -1
  294. package/src/domains/dispatch/types.ts +13 -0
  295. package/src/domains/dispatch/validation.ts +33 -8
  296. package/src/domains/dispatch/worker-spawn.ts +25 -11
  297. package/src/domains/dispatch/write-boundary-enforcer.ts +20 -3
  298. package/src/domains/dispatch/write-boundary.ts +62 -1
  299. package/src/domains/eval/artifacts/store.ts +62 -0
  300. package/src/domains/eval/compare/behavioral.ts +224 -0
  301. package/src/domains/eval/compare/compare.ts +342 -2
  302. package/src/domains/eval/compare/envelope.ts +128 -0
  303. package/src/domains/eval/compare/gates.ts +24 -6
  304. package/src/domains/eval/compare/thresholds.ts +30 -3
  305. package/src/domains/eval/execution-provenance.ts +240 -0
  306. package/src/domains/eval/inventory.ts +113 -0
  307. package/src/domains/eval/metrics/aggregate.ts +136 -0
  308. package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
  309. package/src/domains/eval/metrics/tracked.ts +413 -0
  310. package/src/domains/eval/provenance.ts +117 -0
  311. package/src/domains/eval/reports/comparison.ts +128 -0
  312. package/src/domains/eval/reports/junit.ts +17 -3
  313. package/src/domains/eval/reports/markdown.ts +3 -3
  314. package/src/domains/eval/reports/text.ts +14 -0
  315. package/src/domains/eval/run-compare.ts +20 -0
  316. package/src/domains/eval/runners/clio-run.ts +127 -0
  317. package/src/domains/eval/runners/external-command.ts +28 -3
  318. package/src/domains/eval/schema/adapter.ts +111 -0
  319. package/src/domains/eval/schema/artifact.ts +20 -0
  320. package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
  321. package/src/domains/eval/schema/behavioral.ts +520 -0
  322. package/src/domains/eval/schema/execution-envelope.ts +194 -0
  323. package/src/domains/eval/schema/serving.ts +105 -0
  324. package/src/domains/eval/schema/suite.ts +38 -8
  325. package/src/domains/eval/schema/validate.ts +58 -3
  326. package/src/domains/eval/schema/verdict.ts +237 -0
  327. package/src/domains/eval/suites/resolve.ts +2 -0
  328. package/src/domains/eval/suites/run.ts +264 -33
  329. package/src/domains/eval/verifiers/command.ts +2 -1
  330. package/src/domains/eval/workspaces/temp-copy.ts +145 -13
  331. package/src/domains/evidence/build.ts +2 -13
  332. package/src/domains/evidence/eval.ts +2 -12
  333. package/src/domains/evidence/findings-markdown.ts +33 -0
  334. package/src/domains/evidence/run-trust.ts +7 -113
  335. package/src/domains/evidence/store.ts +6 -0
  336. package/src/domains/evidence/trust-projection.ts +2 -2
  337. package/src/domains/extensions/compatibility.ts +285 -0
  338. package/src/domains/extensions/discovery.ts +38 -3
  339. package/src/domains/extensions/resources.ts +1 -1
  340. package/src/domains/extensions/state.ts +12 -3
  341. package/src/domains/extensions/types.ts +2 -0
  342. package/src/domains/lifecycle/doctor.ts +69 -1
  343. package/src/domains/memory/index.ts +14 -1
  344. package/src/domains/memory/task-bank-promotion.ts +64 -0
  345. package/src/domains/memory/task-memory-policy.ts +82 -17
  346. package/src/domains/memory/task-memory-spend.ts +131 -0
  347. package/src/domains/memory/task-memory-status.ts +7 -0
  348. package/src/domains/memory/task-memory-telemetry.ts +3 -0
  349. package/src/domains/middleware/index.ts +1 -0
  350. package/src/domains/middleware/memory-intervention.ts +97 -21
  351. package/src/domains/middleware/memory-step-endpoint.ts +71 -0
  352. package/src/domains/mux/contract.ts +434 -0
  353. package/src/domains/mux/detect.ts +158 -0
  354. package/src/domains/mux/extension.ts +47 -0
  355. package/src/domains/mux/index.ts +96 -0
  356. package/src/domains/mux/manifest.ts +6 -0
  357. package/src/domains/mux/operations.ts +164 -0
  358. package/src/domains/mux/pane-registry.ts +90 -0
  359. package/src/domains/mux/protocol.ts +49 -0
  360. package/src/domains/mux/socket-client.ts +816 -0
  361. package/src/domains/mux/types.ts +222 -0
  362. package/src/domains/mux/viewer-command.ts +59 -0
  363. package/src/domains/mux/yazi/assets/init.lua +2 -0
  364. package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
  365. package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
  366. package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
  367. package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
  368. package/src/domains/mux/yazi/assets/yazi.toml +17 -0
  369. package/src/domains/mux/yazi/event-stream.ts +180 -0
  370. package/src/domains/mux/yazi/profile.ts +299 -0
  371. package/src/domains/mux/yazi/session.ts +228 -0
  372. package/src/domains/mux/yazi/theme.ts +30 -0
  373. package/src/domains/observability/background-memory-usage.ts +140 -0
  374. package/src/domains/observability/cost.ts +22 -1
  375. package/src/domains/observability/index.ts +9 -0
  376. package/src/domains/observability/out-of-turn-usage.ts +51 -2
  377. package/src/domains/observability/trace-store.ts +234 -2
  378. package/src/domains/prompts/compiler.ts +100 -13
  379. package/src/domains/providers/endpoint-capacity.ts +228 -0
  380. package/src/domains/providers/endpoint-slots-store.ts +189 -0
  381. package/src/domains/providers/extension.ts +20 -3
  382. package/src/domains/providers/index.ts +32 -0
  383. package/src/domains/providers/model-runtime-capabilities.ts +32 -0
  384. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
  385. package/src/domains/providers/runtime-resolution.ts +8 -1
  386. package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
  387. package/src/domains/providers/runtimes/builtins.ts +2 -0
  388. package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
  389. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
  390. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  391. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
  392. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
  393. package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
  394. package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
  395. package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
  396. package/src/domains/providers/runtimes/protocol/litellm.ts +375 -0
  397. package/src/domains/providers/support.ts +1 -0
  398. package/src/domains/providers/target-model-cache.ts +124 -0
  399. package/src/domains/providers/types/capability-flags.ts +2 -0
  400. package/src/domains/providers/types/target-descriptor.ts +2 -0
  401. package/src/domains/resources/index.ts +3 -0
  402. package/src/domains/resources/prompts/loader.ts +95 -33
  403. package/src/domains/resources/skills/loader.ts +33 -0
  404. package/src/domains/safety/action-classifier.ts +6 -0
  405. package/src/domains/safety/call-target.ts +52 -0
  406. package/src/domains/safety/run-effects.ts +35 -4
  407. package/src/domains/session/context-accounting.ts +52 -1
  408. package/src/domains/session/context-ledger.ts +37 -13
  409. package/src/domains/session/index.ts +6 -0
  410. package/src/domains/session/prompt-cache.ts +140 -0
  411. package/src/domains/session/prompt-manifest.ts +42 -0
  412. package/src/domains/toolchain/archive.ts +175 -0
  413. package/src/domains/toolchain/contract.ts +28 -0
  414. package/src/domains/toolchain/extension.ts +47 -0
  415. package/src/domains/toolchain/index.ts +39 -0
  416. package/src/domains/toolchain/install.ts +327 -0
  417. package/src/domains/toolchain/manifest.ts +8 -0
  418. package/src/domains/toolchain/paths.ts +34 -0
  419. package/src/domains/toolchain/registry.ts +265 -0
  420. package/src/domains/toolchain/remove.ts +218 -0
  421. package/src/domains/toolchain/resolve.ts +182 -0
  422. package/src/domains/toolchain/types.ts +113 -0
  423. package/src/domains/toolchain/version.ts +88 -0
  424. package/src/engine/acp/adapter.ts +18 -3
  425. package/src/engine/acp/server.ts +413 -70
  426. package/src/engine/acp/types.ts +19 -1
  427. package/src/engine/ai.ts +35 -0
  428. package/src/engine/apis/llamacpp-residency.ts +55 -3
  429. package/src/engine/apis/lmstudio.ts +25 -5
  430. package/src/engine/apis/ollama-native.ts +2 -1
  431. package/src/engine/apis/openai-completions.ts +80 -17
  432. package/src/engine/apis/residency-lock.ts +3 -1
  433. package/src/engine/apis/residency.ts +34 -1
  434. package/src/engine/claude/sdk-module.ts +98 -0
  435. package/src/engine/claude/sdk-runtime.ts +19 -11
  436. package/src/engine/provider-payload.ts +29 -1
  437. package/src/engine/tui-primitives.ts +21 -0
  438. package/src/engine/tui.ts +1 -0
  439. package/src/engine/worker-runtime.ts +2 -13
  440. package/src/entry/boot-options.ts +2 -0
  441. package/src/entry/orchestrator.ts +279 -35
  442. package/src/entry/panes-activation.ts +31 -0
  443. package/src/entry/with-panes.ts +20 -0
  444. package/src/interactive/chat-loop-messages.ts +26 -7
  445. package/src/interactive/chat-loop.ts +318 -41
  446. package/src/interactive/chat-panel.ts +62 -8
  447. package/src/interactive/clio-editor.ts +45 -8
  448. package/src/interactive/context-activity.ts +5 -1
  449. package/src/interactive/context-meter.ts +1 -1
  450. package/src/interactive/context-overlay.ts +41 -10
  451. package/src/interactive/cost-overlay.ts +66 -6
  452. package/src/interactive/council-grid.ts +1 -3
  453. package/src/interactive/council.ts +11 -0
  454. package/src/interactive/dispatch-board.ts +102 -20
  455. package/src/interactive/fleet-run-preview.ts +41 -15
  456. package/src/interactive/handoff-round.ts +41 -2
  457. package/src/interactive/interactive-application.ts +177 -7
  458. package/src/interactive/interactive-input-runtime.ts +15 -0
  459. package/src/interactive/interactive-presentation.ts +4 -0
  460. package/src/interactive/interactive-shell.ts +20 -17
  461. package/src/interactive/interactive-slash-runtime.ts +63 -10
  462. package/src/interactive/memory-overlay.ts +9 -0
  463. package/src/interactive/modal-marker.ts +170 -0
  464. package/src/interactive/mutation-preview.ts +295 -0
  465. package/src/interactive/mux-bridge.ts +214 -0
  466. package/src/interactive/overlay-frame.ts +58 -2
  467. package/src/interactive/overlay-general-openers.ts +17 -0
  468. package/src/interactive/overlay-key-routing.ts +52 -3
  469. package/src/interactive/overlay-lifecycle.ts +56 -7
  470. package/src/interactive/overlay-model-selectors.ts +40 -3
  471. package/src/interactive/overlay-permission-lifecycle.ts +112 -24
  472. package/src/interactive/overlay-session-lifecycle.ts +73 -9
  473. package/src/interactive/overlay-transitions.ts +18 -4
  474. package/src/interactive/overlays/agents.ts +1 -0
  475. package/src/interactive/overlays/ask-user.ts +227 -49
  476. package/src/interactive/overlays/auth-dialog.ts +1 -0
  477. package/src/interactive/overlays/context-reset.ts +1 -0
  478. package/src/interactive/overlays/cwd-fallback.ts +1 -0
  479. package/src/interactive/overlays/decisions.ts +11 -11
  480. package/src/interactive/overlays/extensions.ts +1 -0
  481. package/src/interactive/overlays/fleet-run-approval.ts +1 -0
  482. package/src/interactive/overlays/handoff-review.ts +1 -0
  483. package/src/interactive/overlays/help-reference.ts +6 -0
  484. package/src/interactive/overlays/interop.ts +1 -0
  485. package/src/interactive/overlays/library-install-confirm.ts +1 -0
  486. package/src/interactive/overlays/library-tabs.ts +28 -0
  487. package/src/interactive/overlays/list-overlay.ts +10 -1
  488. package/src/interactive/overlays/message-picker.ts +1 -0
  489. package/src/interactive/overlays/model-scope.ts +86 -0
  490. package/src/interactive/overlays/model-selector.ts +1 -0
  491. package/src/interactive/overlays/prompts.ts +12 -1
  492. package/src/interactive/overlays/session-selector.ts +1 -0
  493. package/src/interactive/overlays/settings-sections.ts +30 -0
  494. package/src/interactive/overlays/settings.ts +614 -45
  495. package/src/interactive/overlays/side-question.ts +1 -0
  496. package/src/interactive/overlays/skills-hub.ts +3 -11
  497. package/src/interactive/overlays/tree-selector.ts +1 -0
  498. package/src/interactive/pane-policy.ts +46 -0
  499. package/src/interactive/panes-runtime.ts +292 -0
  500. package/src/interactive/permission-hint.ts +34 -2
  501. package/src/interactive/permission-overlay.ts +159 -9
  502. package/src/interactive/prewarm.ts +197 -0
  503. package/src/interactive/render-trace.ts +162 -15
  504. package/src/interactive/renderers/compaction-summary.ts +29 -0
  505. package/src/interactive/renderers/tool-execution.ts +4 -0
  506. package/src/interactive/renderers/worker-entry.ts +122 -14
  507. package/src/interactive/side-question.ts +58 -1
  508. package/src/interactive/slash-commands.ts +251 -15
  509. package/src/interactive/status/controller.ts +11 -0
  510. package/src/interactive/status/state-machine.ts +54 -2
  511. package/src/interactive/status/types.ts +7 -0
  512. package/src/interactive/tasks-overlay.ts +1 -0
  513. package/src/interactive/terminal-lease.ts +2 -0
  514. package/src/interactive/theme/tokens.ts +3 -14
  515. package/src/interactive/turn-context.ts +346 -33
  516. package/src/interactive/turn-persistence.ts +14 -4
  517. package/src/interactive/turn-prewarm.ts +364 -0
  518. package/src/interactive/turn-queues.ts +7 -4
  519. package/src/interactive/turn-runtime.ts +8 -1
  520. package/src/interactive/turn-state.ts +23 -0
  521. package/src/interactive/view/artifacts.ts +109 -1
  522. package/src/interactive/view/view-overlay.ts +29 -3
  523. package/src/interactive/watch-pane.ts +152 -0
  524. package/src/interactive/worker-progress.ts +7 -1
  525. package/src/interactive/worker-receipts.ts +19 -1
  526. package/src/interactive/worker-stream.ts +5 -0
  527. package/src/interactive/yazi-bridge.ts +444 -0
  528. package/src/tools/ask-user.ts +43 -2
  529. package/src/tools/bootstrap.ts +26 -2
  530. package/src/tools/builtin-tool-catalog.ts +15 -0
  531. package/src/tools/compete-worktrees.ts +83 -2
  532. package/src/tools/core-bootstrap.ts +2 -1
  533. package/src/tools/dispatch-admission.ts +14 -3
  534. package/src/tools/dispatch-arguments.ts +20 -20
  535. package/src/tools/dispatch-plan.ts +17 -9
  536. package/src/tools/dispatch-run-events.ts +134 -19
  537. package/src/tools/dispatch-runner.ts +29 -7
  538. package/src/tools/dispatch-scout.ts +1 -1
  539. package/src/tools/dispatch-types.ts +15 -3
  540. package/src/tools/dispatch.ts +1 -1
  541. package/src/tools/executables.ts +17 -14
  542. package/src/tools/observation.ts +54 -4
  543. package/src/tools/panes-surface.ts +38 -0
  544. package/src/tools/panes.ts +112 -0
  545. package/src/tools/policy.ts +10 -1
  546. package/src/tools/presentation.ts +1 -0
  547. package/src/tools/registry.ts +16 -0
  548. package/dist/chunk-AOCYTWAV.js +0 -449
  549. package/dist/chunk-HLE42MG7.js +0 -37
  550. package/dist/chunk-HWUFFB6L.js +0 -83
  551. package/dist/chunk-JOZYP4GM.js +0 -279
  552. package/dist/doctor-M7YEDGAE.js +0 -91
@@ -1,17 +1,31 @@
1
1
  import type { EvalArtifactV4 } from "../schema/artifact.js";
2
2
 
3
3
  export function renderEvalJunitReportV4(artifact: EvalArtifactV4): string {
4
+ let failures = 0;
5
+ let skipped = 0;
4
6
  const cases = artifact.results
5
7
  .map((result) => {
6
8
  const name = escapeXml(
7
9
  `${result.taskId}[${result.target.id}:${result.target.model ?? "default"}:${result.repeatIndex}]`,
8
10
  );
9
- if (result.pass) return ` <testcase name="${name}" />`;
10
- return ` <testcase name="${name}"><failure message="${escapeXml(result.failureClass ?? "failed")}" /></testcase>`;
11
+ if (!result.pass) {
12
+ failures += 1;
13
+ return ` <testcase name="${name}"><failure message="${escapeXml(result.failureClass ?? "failed")}" /></testcase>`;
14
+ }
15
+ const outcome = result.behavioral?.outcome;
16
+ if (outcome === "behavioral_failure" || outcome === "infrastructure_failure") {
17
+ failures += 1;
18
+ return ` <testcase name="${name}"><failure message="${escapeXml(outcome)}" /></testcase>`;
19
+ }
20
+ if (outcome === "unknown" || outcome === "unmeasured") {
21
+ skipped += 1;
22
+ return ` <testcase name="${name}"><skipped message="behavioral ${escapeXml(outcome)}" /></testcase>`;
23
+ }
24
+ return ` <testcase name="${name}" />`;
11
25
  })
12
26
  .join("\n");
13
27
  return [
14
- `<testsuite name="${escapeXml(artifact.suite.id)}" tests="${artifact.summary.runs}" failures="${artifact.summary.failed}">`,
28
+ `<testsuite name="${escapeXml(artifact.suite.id)}" tests="${artifact.summary.runs}" failures="${failures}" skipped="${skipped}">`,
15
29
  cases,
16
30
  "</testsuite>",
17
31
  "",
@@ -8,11 +8,11 @@ export function renderEvalMarkdownReportV4(artifact: EvalArtifactV4): string {
8
8
  `Target: ${artifact.matrix.target}`,
9
9
  `Pass rate: ${(artifact.summary.passRate * 100).toFixed(2)}%`,
10
10
  "",
11
- "| Task | Target | Model | Repeat | Pass | Failure |",
12
- "|---|---|---|---:|---|---|",
11
+ "| Task | Role | Target | Model | Repeat | Result | Behavioral | Failure |",
12
+ "|---|---|---|---|---:|---|---|---|",
13
13
  ...artifact.results.map(
14
14
  (result) =>
15
- `| ${result.taskId} | ${result.target.id} | ${result.target.model ?? ""} | ${result.repeatIndex} | ${result.pass ? "pass" : "fail"} | ${result.failureClass ?? ""} |`,
15
+ `| ${result.taskId} | ${result.behavioralMetrics?.role ?? ""} | ${result.target.id} | ${result.target.model ?? ""} | ${result.repeatIndex} | ${result.pass ? "pass" : "fail"} | ${result.behavioral?.outcome ?? "unmeasured"} | ${result.failureClass ?? ""} |`,
16
16
  ),
17
17
  "",
18
18
  ];
@@ -2,6 +2,15 @@ import type { EvalArtifactV4 } from "../schema/artifact.js";
2
2
 
3
3
  export function renderEvalTextReportV4(artifact: EvalArtifactV4): string {
4
4
  const tokens = artifact.summary.tokens;
5
+ const behavioral = artifact.results.flatMap((result) =>
6
+ result.behavioral === undefined ? [] : [result.behavioral.outcome],
7
+ );
8
+ const behavioralSummary =
9
+ behavioral.length === 0
10
+ ? []
11
+ : [
12
+ `behavioral: pass=${count(behavioral, "pass")} failure=${count(behavioral, "behavioral_failure")} unknown=${count(behavioral, "unknown")} unmeasured=${count(behavioral, "unmeasured")} infrastructure=${count(behavioral, "infrastructure_failure")}`,
13
+ ];
5
14
  return [
6
15
  `eval: ${artifact.evalId}`,
7
16
  `suite: ${artifact.suite.id}`,
@@ -20,6 +29,11 @@ export function renderEvalTextReportV4(artifact: EvalArtifactV4): string {
20
29
  ? `tokens total: ${tokens.total}`
21
30
  : `tokens total: ${tokens.total} (measured in ${tokens.measuredRuns} of ${tokens.runs} runs)`,
22
31
  `wall time ms: ${artifact.summary.wallTimeMs}`,
32
+ ...behavioralSummary,
23
33
  "",
24
34
  ].join("\n");
25
35
  }
36
+
37
+ function count(values: ReadonlyArray<string>, wanted: string): number {
38
+ return values.filter((value) => value === wanted).length;
39
+ }
@@ -1,8 +1,28 @@
1
1
  import { subtractEvalHarnessMetrics } from "./harness-metrics.js";
2
+ import type { EvalMetricSource } from "./schema/verdict.js";
2
3
  import type { EvalFailureClass, EvalHarnessMetrics, EvalRunArtifact, EvalRunRecord, EvalSummary } from "./types.js";
3
4
 
4
5
  export const EVAL_COMPARE_MATCHING_RULE = "taskId+repeatIndex";
5
6
 
7
+ export class EvalTrackedMetricSourceMismatchError extends Error {
8
+ constructor(metric: string, baseline: ReadonlyArray<EvalMetricSource>, candidate: ReadonlyArray<EvalMetricSource>) {
9
+ super(
10
+ `tracked metric ${metric} cannot compare estimated and measured values (baseline=${baseline.join(",") || "none"}, candidate=${candidate.join(",") || "none"})`,
11
+ );
12
+ this.name = "EvalTrackedMetricSourceMismatchError";
13
+ }
14
+ }
15
+
16
+ /** Refuse a delta when exactly one side contains estimated observations. */
17
+ export function assertComparableTrackedMetricSources(
18
+ metric: string,
19
+ baseline: ReadonlyArray<EvalMetricSource>,
20
+ candidate: ReadonlyArray<EvalMetricSource>,
21
+ ): void {
22
+ if (baseline.includes("estimated") === candidate.includes("estimated")) return;
23
+ throw new EvalTrackedMetricSourceMismatchError(metric, baseline, candidate);
24
+ }
25
+
6
26
  export interface EvalCompareTotals {
7
27
  passed: number;
8
28
  failed: number;
@@ -1,3 +1,4 @@
1
+ import { isAbsolute, relative, resolve, sep } from "node:path";
1
2
  import { shellQuote } from "../../../core/shell-quote.js";
2
3
  import { clioStateDir } from "../../../core/xdg.js";
3
4
  import {
@@ -17,6 +18,7 @@ export async function runClioRunRunner(
17
18
  timeoutMs: number,
18
19
  target: EvalSuiteTargetV2,
19
20
  env?: NodeJS.ProcessEnv,
21
+ readObservation?: { allowedPaths: string[]; decoyPaths: string[] },
20
22
  ): Promise<EvalRunnerOutput> {
21
23
  const prompt = runner.prompt ?? "";
22
24
  const args = [
@@ -28,6 +30,7 @@ export async function runClioRunRunner(
28
30
  shellQuote(target.id),
29
31
  ...(target.model === undefined ? [] : ["--model", shellQuote(target.model)]),
30
32
  ...(target.thinking === undefined ? [] : ["--thinking", shellQuote(target.thinking)]),
33
+ ...(runner.autonomy === undefined ? [] : ["--autonomy", runner.autonomy]),
31
34
  shellQuote(prompt),
32
35
  ];
33
36
  const result = await runShellCommand(`${process.execPath} ${args.join(" ")}`, cwd, runner.timeoutMs ?? timeoutMs, env);
@@ -36,6 +39,7 @@ export async function runClioRunRunner(
36
39
  const tokens = result.usage;
37
40
  const toolMetricStream = result.metricJsonl.length > 0 ? result.metricJsonl : result.stdout;
38
41
  const tools = toolCallMetricsFromJsonl(toolMetricStream);
42
+ const behavioralTools = toolBehaviorMetricEntriesFromJsonl(toolMetricStream, cwd, readObservation);
39
43
  // Evidence metrics resolve only from the sealed receipt the --agent path
40
44
  // prints; a runner without a receipt leaves them absent so any gate on
41
45
  // them fails closed instead of reading prose labels.
@@ -61,6 +65,7 @@ export async function runClioRunRunner(
61
65
  "tools.totalCalls": tools.totalCalls,
62
66
  "tools.failed": tools.failed,
63
67
  "tools.blocked": tools.blocked,
68
+ ...behavioralTools,
64
69
  "verifier.exitCode": result.exitCode,
65
70
  ...(receipt === null ? {} : evidenceMetricsFromReceipt(receipt, { envelope })),
66
71
  ...(receipt === null
@@ -70,8 +75,11 @@ export async function runClioRunRunner(
70
75
  artifacts: {
71
76
  stdout: result.stdout,
72
77
  stderr: result.stderr,
78
+ callLedger: JSON.stringify(result.ledgerEntries),
73
79
  ...(receipt === null ? {} : { receipt: JSON.stringify(receipt) }),
74
80
  },
81
+ receipt,
82
+ ledgerEntries: result.ledgerEntries,
75
83
  };
76
84
  }
77
85
 
@@ -128,6 +136,125 @@ export function toolCallMetricsFromJsonl(stdout: string): ToolCallMetrics {
128
136
  return canonicalFinishes.totalCalls > 0 ? canonicalFinishes : executionEnds;
129
137
  }
130
138
 
139
+ interface BehavioralToolTerminal {
140
+ callId: string | null;
141
+ tool: string;
142
+ outcome: ToolOutcome;
143
+ }
144
+
145
+ /**
146
+ * Reduce the same terminal stream to bounded behavioral facts. Tool names are
147
+ * a dynamic metric suffix because extensions may add tools. Read paths become
148
+ * bounded counters against the suite's explicit public allowlist and decoy
149
+ * list; they never become behavioral fact values or evidence excerpts.
150
+ */
151
+ export function toolBehaviorMetricEntriesFromJsonl(
152
+ stdout: string,
153
+ cwd: string,
154
+ readObservation?: { allowedPaths: string[]; decoyPaths: string[] },
155
+ ): Record<string, number> {
156
+ const starts = new Map<string, { tool: string; path: string | null }>();
157
+ const readPaths = new Set<string>();
158
+ const executionEnds: BehavioralToolTerminal[] = [];
159
+ const canonicalFinishes: BehavioralToolTerminal[] = [];
160
+ const seenExecution = new Set<string>();
161
+ const seenCanonical = new Set<string>();
162
+
163
+ for (const line of stdout.split(/\r?\n/)) {
164
+ if (line.trim().length === 0) continue;
165
+ let event: Record<string, unknown>;
166
+ try {
167
+ const parsed: unknown = JSON.parse(line);
168
+ if (!isRecord(parsed)) continue;
169
+ event = parsed;
170
+ } catch {
171
+ continue;
172
+ }
173
+ if (event.type === "tool_execution_start") {
174
+ const callId = stringField(event, "toolCallId");
175
+ const tool = stringField(event, "toolName");
176
+ if (callId === undefined || tool === undefined) continue;
177
+ const path = tool === "read" && isRecord(event.args) ? toolPath(event.args) : null;
178
+ starts.set(callId, { tool, path });
179
+ if (path !== null) readPaths.add(normalizeObservedPath(cwd, path));
180
+ continue;
181
+ }
182
+ if (event.type === "tool_execution_end") {
183
+ const callId = stringField(event, "toolCallId") ?? null;
184
+ if (callId !== null && seenExecution.has(callId)) continue;
185
+ if (callId !== null) seenExecution.add(callId);
186
+ const tool = stringField(event, "toolName") ?? (callId === null ? undefined : starts.get(callId)?.tool);
187
+ if (tool === undefined) continue;
188
+ executionEnds.push({ callId, tool, outcome: toolOutcome(event) ?? (event.isError === true ? "error" : "ok") });
189
+ continue;
190
+ }
191
+ if (event.type !== "clio_tool_finish" || !isRecord(event.payload)) continue;
192
+ const outcome = toolOutcome(event.payload);
193
+ const tool = stringField(event.payload, "tool");
194
+ if (outcome === undefined || tool === undefined) continue;
195
+ const callId = stringField(event.payload, "toolCallId") ?? stringField(event, "toolCallId") ?? null;
196
+ if (callId !== null && seenCanonical.has(callId)) continue;
197
+ if (callId !== null) seenCanonical.add(callId);
198
+ canonicalFinishes.push({ callId, tool, outcome });
199
+ }
200
+
201
+ const terminals = canonicalFinishes.length > 0 ? canonicalFinishes : executionEnds;
202
+ const calls = new Map<string, number>();
203
+ const blocked = new Map<string, number>();
204
+ for (const terminal of terminals) {
205
+ const tool = metricToolName(terminal.tool);
206
+ calls.set(tool, (calls.get(tool) ?? 0) + 1);
207
+ if (terminal.outcome === "blocked") blocked.set(tool, (blocked.get(tool) ?? 0) + 1);
208
+ }
209
+ const namedTools = new Set(["bash", "dispatch", "read", ...calls.keys(), ...blocked.keys()]);
210
+ const entries: Record<string, number> = { "tools.read.distinctPaths": readPaths.size };
211
+ for (const tool of [...namedTools].sort()) {
212
+ entries[`tools.calls.${tool}`] = calls.get(tool) ?? 0;
213
+ entries[`tools.blocked.${tool}`] = blocked.get(tool) ?? 0;
214
+ }
215
+ if (readObservation !== undefined) {
216
+ const allowed = readObservation.allowedPaths.map((path) => normalizeObservedPath(cwd, path));
217
+ const decoys = readObservation.decoyPaths.map((path) => normalizeObservedPath(cwd, path));
218
+ entries["tools.read.outsideAllowed"] = [...readPaths].filter(
219
+ (path) => !allowed.some((root) => pathWithin(path, root)),
220
+ ).length;
221
+ entries["tools.read.decoyHits"] = [...readPaths].filter((path) =>
222
+ decoys.some((root) => pathWithin(path, root)),
223
+ ).length;
224
+ }
225
+ return entries;
226
+ }
227
+
228
+ function toolPath(args: Record<string, unknown>): string | null {
229
+ for (const field of ["path", "filePath", "file_path"]) {
230
+ const value = args[field];
231
+ if (typeof value === "string" && value.length > 0 && value.length <= 4_096) return value;
232
+ }
233
+ return null;
234
+ }
235
+
236
+ function normalizeObservedPath(cwd: string, path: string): string {
237
+ const absolute = resolve(cwd, path);
238
+ const local = relative(cwd, absolute);
239
+ return (isAbsolute(path) && (local.startsWith("..") || isAbsolute(local)) ? absolute : local || ".")
240
+ .split(sep)
241
+ .join("/");
242
+ }
243
+
244
+ function pathWithin(path: string, root: string): boolean {
245
+ if (root === ".") return !isAbsolute(path) && path !== ".." && !path.startsWith("../");
246
+ return path === root || path.startsWith(`${root}/`);
247
+ }
248
+
249
+ function metricToolName(tool: string): string {
250
+ return (
251
+ tool
252
+ .toLowerCase()
253
+ .replaceAll(/[^a-z0-9_-]/gu, "_")
254
+ .slice(0, 64) || "unknown"
255
+ );
256
+ }
257
+
131
258
  function recordToolOutcome(metrics: ToolCallMetrics, outcome: ToolOutcome): void {
132
259
  metrics.totalCalls += 1;
133
260
  if (outcome === "error") metrics.failed += 1;
@@ -1,5 +1,8 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { performance } from "node:perf_hooks";
3
+ import type { RunReceipt } from "../../dispatch/types.js";
4
+ import type { SessionEntry } from "../../session/entries.js";
5
+ import { createEvalCallLedgerFold } from "../metrics/call-ledger-stream.js";
3
6
  import {
4
7
  addFleetLoopObservations,
5
8
  createFleetLoopFold,
@@ -33,6 +36,10 @@ export interface EvalRunnerOutput {
33
36
  wallTimeMs: number;
34
37
  metrics: Record<string, number | string | boolean | null>;
35
38
  artifacts: Record<string, string | string[] | null>;
39
+ /** Parsed sealed receipt when this runner exposes one. */
40
+ receipt?: RunReceipt | null;
41
+ /** Structured per-call facts folded before bounded stdout truncation. */
42
+ ledgerEntries?: SessionEntry[];
36
43
  }
37
44
 
38
45
  export interface ShellCommandResult {
@@ -46,6 +53,7 @@ export interface ShellCommandResult {
46
53
  /** Wire-stream structural invariants folded live, for the same reason. */
47
54
  streamInvariants: EvalStreamInvariants;
48
55
  fleetLoops: EvalFleetLoopObservation;
56
+ ledgerEntries: SessionEntry[];
49
57
  stderr: string;
50
58
  wallTimeMs: number;
51
59
  timedOut: boolean;
@@ -75,6 +83,7 @@ export async function runExternalCommandRunner(
75
83
  let usage = UNMEASURED_TOKEN_USAGE;
76
84
  let streamInvariants = EMPTY_STREAM_INVARIANTS;
77
85
  let fleetLoops = EMPTY_FLEET_LOOP_OBSERVATION;
86
+ const ledgerEntries: SessionEntry[] = [];
78
87
  for (const command of commands) {
79
88
  const result = await runShellCommand(command, cwd, runner.timeoutMs ?? timeoutMs, env);
80
89
  stdout = appendLimited(stdout, result.stdout);
@@ -83,6 +92,7 @@ export async function runExternalCommandRunner(
83
92
  usage = addTokenStreamUsage(usage, result.usage);
84
93
  streamInvariants = addStreamInvariants(streamInvariants, result.streamInvariants);
85
94
  fleetLoops = addFleetLoopObservations(fleetLoops, result.fleetLoops);
95
+ ledgerEntries.push(...result.ledgerEntries);
86
96
  if (result.exitCode !== 0) {
87
97
  return {
88
98
  assignmentId: null,
@@ -99,6 +109,7 @@ export async function runExternalCommandRunner(
99
109
  "verifier.exitCode": result.exitCode,
100
110
  },
101
111
  artifacts: {},
112
+ ledgerEntries,
102
113
  };
103
114
  }
104
115
  }
@@ -117,6 +128,7 @@ export async function runExternalCommandRunner(
117
128
  "verifier.exitCode": 0,
118
129
  },
119
130
  artifacts: {},
131
+ ledgerEntries,
120
132
  };
121
133
  }
122
134
 
@@ -137,6 +149,7 @@ export function runShellCommand(
137
149
  const usageFold = createTokenUsageFold();
138
150
  const streamFold = createStreamInvariantFold();
139
151
  const fleetLoopFold = createFleetLoopFold();
152
+ const callLedgerFold = createEvalCallLedgerFold();
140
153
  let timedOut = false;
141
154
  let settled = false;
142
155
  const child = spawn(command, {
@@ -155,6 +168,7 @@ export function runShellCommand(
155
168
  usageFold.push(chunk);
156
169
  streamFold.push(chunk);
157
170
  fleetLoopFold.push(chunk);
171
+ callLedgerFold.push(chunk);
158
172
  });
159
173
  child.stderr.on("data", (chunk: string) => {
160
174
  stderr = appendLimited(stderr, chunk);
@@ -176,6 +190,7 @@ export function runShellCommand(
176
190
  usage: usageFold.usage(),
177
191
  streamInvariants: streamFold.invariants(),
178
192
  fleetLoops: fleetLoopFold.observation(),
193
+ ledgerEntries: callLedgerFold.entries(),
179
194
  stderr,
180
195
  wallTimeMs: Math.round(performance.now() - started),
181
196
  timedOut,
@@ -284,9 +299,11 @@ function compactMetricEvent(event: Record<string, unknown>): Record<string, unkn
284
299
  toolName,
285
300
  ...(toolName === "dispatch" && isRecord(event.args)
286
301
  ? { args: event.args }
287
- : toolName === "code_nav" && isRecord(event.args)
288
- ? { args: { mode: event.args.mode } }
289
- : {}),
302
+ : toolName === "read" && isRecord(event.args)
303
+ ? { args: boundedReadArgs(event.args) }
304
+ : toolName === "code_nav" && isRecord(event.args)
305
+ ? { args: { mode: event.args.mode } }
306
+ : {}),
290
307
  };
291
308
  }
292
309
  if (type === "tool_execution_end") {
@@ -313,6 +330,14 @@ function compactMetricEvent(event: Record<string, unknown>): Record<string, unkn
313
330
  };
314
331
  }
315
332
 
333
+ function boundedReadArgs(args: Record<string, unknown>): Record<string, string> {
334
+ for (const field of ["path", "filePath", "file_path"]) {
335
+ const value = args[field];
336
+ if (typeof value === "string" && value.length > 0) return { [field]: value.slice(0, 4_096) };
337
+ }
338
+ return {};
339
+ }
340
+
316
341
  function isRecord(value: unknown): value is Record<string, unknown> {
317
342
  return typeof value === "object" && value !== null && !Array.isArray(value);
318
343
  }
@@ -0,0 +1,111 @@
1
+ import { createHash } from "node:crypto";
2
+ import type { EvalArtifactResultV4 } from "./artifact.js";
3
+ import {
4
+ assertEvalBehaviorReferencesVerdictV1,
5
+ type EvalBehaviorFactSourceV1,
6
+ type EvalBehaviorJudgeFactV1,
7
+ type EvalBehaviorScenarioV1,
8
+ type EvalBehaviorVerdictV1,
9
+ judgeEvalBehaviorV1,
10
+ } from "./behavioral.js";
11
+ import {
12
+ EVAL_VERDICT_SCHEMA_V1,
13
+ type EvalTrackedMetricsV1,
14
+ type EvalVerdictEnvelopeV1,
15
+ parseEvalVerdictEnvelopeV1,
16
+ } from "./verdict.js";
17
+
18
+ type AdaptableSuiteResult = Pick<
19
+ EvalArtifactResultV4,
20
+ "assignmentId" | "terminalReceiptDigest" | "taskId" | "repeatIndex" | "pass" | "failureClass" | "metrics"
21
+ >;
22
+
23
+ /** Adapt one Suite v2 matrix result into the versioned verdict carried by Artifact v4. */
24
+ export function adaptSuiteV2ResultToVerdictV1(
25
+ result: AdaptableSuiteResult,
26
+ trackedMetrics: EvalTrackedMetricsV1,
27
+ ): EvalVerdictEnvelopeV1 {
28
+ // The suite runner owns the one final pass decision. In particular, a
29
+ // declared grader failure changes `pass` without pretending the runner or
30
+ // its invariants broke; every other failed result is a machinery failure.
31
+ const machinery = result.pass || result.failureClass === "grader_failed" ? "ok" : "infrastructure_failure";
32
+ const outcome = result.pass ? "pass" : "fail";
33
+ const graderExitCode = result.metrics["task.exitCode"];
34
+ return parseEvalVerdictEnvelopeV1({
35
+ schema: EVAL_VERDICT_SCHEMA_V1,
36
+ scenarioId: result.taskId,
37
+ trialIndex: result.repeatIndex,
38
+ outcome,
39
+ machinery,
40
+ reason: result.pass ? null : (result.failureClass ?? "result_failed"),
41
+ trackedMetrics,
42
+ behavioral: null,
43
+ evidence: {
44
+ assignmentId: result.assignmentId,
45
+ terminalReceiptDigest: result.terminalReceiptDigest,
46
+ graderExitCode: typeof graderExitCode === "number" && Number.isInteger(graderExitCode) ? graderExitCode : null,
47
+ },
48
+ });
49
+ }
50
+
51
+ /** Adapt Suite v2 metrics into deterministic, bounded facts for a behavioral scenario. */
52
+ export function adaptSuiteV2ResultToBehaviorV1(
53
+ result: AdaptableSuiteResult,
54
+ verdict: EvalVerdictEnvelopeV1,
55
+ scenario: EvalBehaviorScenarioV1,
56
+ ): EvalBehaviorVerdictV1 {
57
+ const requestedFacts = new Set(
58
+ [...scenario.expectedBehavior, ...scenario.forbiddenBehavior].map(
59
+ (rule) => `${rule.fact.source}\u0000${rule.fact.key}`,
60
+ ),
61
+ );
62
+ const observedSources = new Set<EvalBehaviorFactSourceV1>();
63
+ const facts = Object.entries(result.metrics).flatMap(([key, value]) => {
64
+ if (value === null) return [];
65
+ const source = metricFactSource(key);
66
+ observedSources.add(source);
67
+ if (!requestedFacts.has(`${source}\u0000${key}`)) return [];
68
+ const serialized = JSON.stringify({ source, key, value });
69
+ const digest = createHash("sha256").update(serialized, "utf8").digest("hex");
70
+ const fact: EvalBehaviorJudgeFactV1 = {
71
+ id: `metric-${digest.slice(0, 16)}`,
72
+ source,
73
+ key,
74
+ value,
75
+ evidence: { locator: `artifact.metrics.${key}`, digest, excerpt: serialized.slice(0, 1_000) },
76
+ };
77
+ return [fact];
78
+ });
79
+ const allSources: EvalBehaviorFactSourceV1[] = ["transcript", "tool", "receipt", "grader"];
80
+ const unavailableSources = allSources.filter(
81
+ (source) => !observedSources.has(source) || (source === "tool" && scenario.execution.toolTarget === "none"),
82
+ );
83
+ const behavior = judgeEvalBehaviorV1(scenario, verdict, {
84
+ facts,
85
+ unavailableSources,
86
+ infrastructureFailure: verdict.machinery === "infrastructure_failure",
87
+ });
88
+ assertEvalBehaviorReferencesVerdictV1(behavior, verdict);
89
+ return behavior;
90
+ }
91
+
92
+ function metricFactSource(key: string): EvalBehaviorFactSourceV1 {
93
+ if (key.startsWith("tools.")) return "tool";
94
+ if (
95
+ key.startsWith("task.") ||
96
+ key.startsWith("claims.") ||
97
+ key.startsWith("completion.") ||
98
+ key === "result.pass" ||
99
+ key === "verifier.exitCode"
100
+ )
101
+ return "grader";
102
+ if (
103
+ key.startsWith("receipt.") ||
104
+ key.startsWith("evidence.") ||
105
+ key.startsWith("boundary.") ||
106
+ key.startsWith("loop.") ||
107
+ key.startsWith("cost.")
108
+ )
109
+ return "receipt";
110
+ return "transcript";
111
+ }
@@ -1,4 +1,10 @@
1
+ import type { EvalScenarioAggregateV1 } from "../metrics/aggregate.js";
1
2
  import type { EvalClioProvenance, EvalEnvironmentProvenance } from "../types.js";
3
+ import type { EvalBehaviorVerdictV1 } from "./behavioral.js";
4
+ import type { EvalBehaviorMetricsV1 } from "./behavioral-metrics.js";
5
+ import type { EvalExecutionEnvelopeV1, EvalExecutionMatrixDimensionV1 } from "./execution-envelope.js";
6
+ import type { EvalServingConfigurationV1 } from "./serving.js";
7
+ import type { EvalVerdictEnvelopeV1 } from "./verdict.js";
2
8
 
3
9
  export interface EvalTokenMetricsV4 {
4
10
  input: number;
@@ -45,6 +51,14 @@ export interface EvalArtifactResultV4 extends EvalArtifactAssignmentReference {
45
51
  failureClass: string | null;
46
52
  metrics: Record<string, number | string | boolean | null>;
47
53
  artifacts: Record<string, string | string[] | null>;
54
+ /** Additive Suite v2 adapter output. Current runners always populate it. */
55
+ verdict?: EvalVerdictEnvelopeV1;
56
+ /** Optional sibling document that references the unchanged verdict v1 identity. */
57
+ behavioral?: EvalBehaviorVerdictV1;
58
+ /** Additive, typed multi-metric projection for behavioral comparison. */
59
+ behavioralMetrics?: EvalBehaviorMetricsV1;
60
+ /** Exact prompt, route, policy, and project-context identity for a behavioral result. */
61
+ executionEnvelope?: EvalExecutionEnvelopeV1;
48
62
  }
49
63
 
50
64
  /** The only current eval artifact format. Routing accepts this version only. */
@@ -61,8 +75,14 @@ export interface EvalArtifactV4 {
61
75
  target: string;
62
76
  model: string | null;
63
77
  thinking: string | null;
78
+ /** Envelope fields intentionally varied by this matrix. */
79
+ dimensions?: EvalExecutionMatrixDimensionV1[];
64
80
  };
81
+ /** Exact serving facts used to decide whether two eval runs are comparable. */
82
+ servingConfiguration?: EvalServingConfigurationV1;
65
83
  summary: EvalArtifactSummaryV4;
84
+ /** Scenario reductions over the versioned per-trial verdicts. */
85
+ aggregates?: EvalScenarioAggregateV1[];
66
86
  results: EvalArtifactResultV4[];
67
87
  }
68
88