@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
@@ -0,0 +1,194 @@
1
+ export const EVAL_EXECUTION_ENVELOPE_SCHEMA_V1 = "clio.eval.execution-envelope.v1" as const;
2
+
3
+ export const EVAL_EXECUTION_MATRIX_DIMENSIONS_V1 = [
4
+ "prompt",
5
+ "recipe",
6
+ "target",
7
+ "wireModel",
8
+ "runtime",
9
+ "thinkingLevel",
10
+ "toolSignature",
11
+ "autonomy",
12
+ "policy",
13
+ "projectContext",
14
+ "corpus",
15
+ ] as const;
16
+
17
+ export type EvalExecutionMatrixDimensionV1 = (typeof EVAL_EXECUTION_MATRIX_DIMENSIONS_V1)[number];
18
+ export type EvalPromptFragmentVersionV1 = number | "unversioned";
19
+
20
+ export interface EvalPromptFragmentIdentityV1 {
21
+ id: string;
22
+ version: EvalPromptFragmentVersionV1;
23
+ contentHash: string;
24
+ }
25
+
26
+ export interface EvalExecutionEnvelopeV1 {
27
+ schema: typeof EVAL_EXECUTION_ENVELOPE_SCHEMA_V1;
28
+ prompt: {
29
+ fragments: EvalPromptFragmentIdentityV1[];
30
+ /** Null means the machinery-only scenario made no model request. */
31
+ compositionHash: string | null;
32
+ };
33
+ /** Null for a main-agent or machinery runner that does not execute an agent recipe. */
34
+ recipe: { id: string; version: number; contentHash: string } | null;
35
+ target: string;
36
+ wireModel: string | null;
37
+ runtime: string | null;
38
+ thinkingLevel: string | null;
39
+ toolSignature: string | null;
40
+ autonomy: string | null;
41
+ policyHashes: {
42
+ rulePack: string | null;
43
+ project: string | null;
44
+ };
45
+ projectContext: {
46
+ kind: "none" | "session" | "worker";
47
+ tier: string | null;
48
+ contentHash: string | null;
49
+ chars: number | null;
50
+ sections: string[];
51
+ rulesApplied: string[];
52
+ operatorProfileApplied: boolean | null;
53
+ };
54
+ corpus: { id: string; version: string };
55
+ }
56
+
57
+ export function parseEvalExecutionEnvelopeV1(value: unknown, source = "execution envelope"): EvalExecutionEnvelopeV1 {
58
+ const record = asRecord(value, source);
59
+ if (record.schema !== EVAL_EXECUTION_ENVELOPE_SCHEMA_V1) {
60
+ throw new Error(`${source}.schema: expected ${EVAL_EXECUTION_ENVELOPE_SCHEMA_V1}`);
61
+ }
62
+ const prompt = asRecord(record.prompt, `${source}.prompt`);
63
+ if (!Array.isArray(prompt.fragments)) throw new Error(`${source}.prompt.fragments: expected array`);
64
+ const fragments = prompt.fragments.map((entry, index) => {
65
+ const fragment = asRecord(entry, `${source}.prompt.fragments[${index}]`);
66
+ const version = fragment.version;
67
+ if (version !== "unversioned" && (!Number.isInteger(version) || typeof version !== "number" || version <= 0)) {
68
+ throw new Error(`${source}.prompt.fragments[${index}].version: expected positive integer or unversioned`);
69
+ }
70
+ return {
71
+ id: readString(fragment.id, `${source}.prompt.fragments[${index}].id`),
72
+ version: version as EvalPromptFragmentVersionV1,
73
+ contentHash: readDigest(fragment.contentHash, `${source}.prompt.fragments[${index}].contentHash`),
74
+ };
75
+ });
76
+ const fragmentIds = fragments.map((fragment) => fragment.id);
77
+ if (new Set(fragmentIds).size !== fragmentIds.length) {
78
+ throw new Error(`${source}.prompt.fragments: duplicate fragment id`);
79
+ }
80
+ const recipe =
81
+ record.recipe === null
82
+ ? null
83
+ : (() => {
84
+ const value = asRecord(record.recipe, `${source}.recipe`);
85
+ const version = value.version;
86
+ if (!Number.isInteger(version) || typeof version !== "number" || version <= 0) {
87
+ throw new Error(`${source}.recipe.version: expected positive integer`);
88
+ }
89
+ return {
90
+ id: readString(value.id, `${source}.recipe.id`),
91
+ version,
92
+ contentHash: readDigest(value.contentHash, `${source}.recipe.contentHash`),
93
+ };
94
+ })();
95
+ const policyHashes = asRecord(record.policyHashes, `${source}.policyHashes`);
96
+ const projectContext = asRecord(record.projectContext, `${source}.projectContext`);
97
+ const projectKind = projectContext.kind;
98
+ if (projectKind !== "none" && projectKind !== "session" && projectKind !== "worker") {
99
+ throw new Error(`${source}.projectContext.kind: expected none, session, or worker`);
100
+ }
101
+ const corpus = asRecord(record.corpus, `${source}.corpus`);
102
+ return {
103
+ schema: EVAL_EXECUTION_ENVELOPE_SCHEMA_V1,
104
+ prompt: {
105
+ fragments,
106
+ compositionHash: readNullableDigest(prompt.compositionHash, `${source}.prompt.compositionHash`),
107
+ },
108
+ recipe,
109
+ target: readString(record.target, `${source}.target`),
110
+ wireModel: readNullableString(record.wireModel, `${source}.wireModel`),
111
+ runtime: readNullableString(record.runtime, `${source}.runtime`),
112
+ thinkingLevel: readNullableString(record.thinkingLevel, `${source}.thinkingLevel`),
113
+ toolSignature: readNullableDigest(record.toolSignature, `${source}.toolSignature`),
114
+ autonomy: readNullableString(record.autonomy, `${source}.autonomy`),
115
+ policyHashes: {
116
+ rulePack: readNullableDigest(policyHashes.rulePack, `${source}.policyHashes.rulePack`),
117
+ project: readNullableDigest(policyHashes.project, `${source}.policyHashes.project`),
118
+ },
119
+ projectContext: {
120
+ kind: projectKind,
121
+ tier: readNullableString(projectContext.tier, `${source}.projectContext.tier`),
122
+ contentHash: readNullableDigest(projectContext.contentHash, `${source}.projectContext.contentHash`),
123
+ chars: readNullableNonNegativeInteger(projectContext.chars, `${source}.projectContext.chars`),
124
+ sections: readStringArray(projectContext.sections, `${source}.projectContext.sections`),
125
+ rulesApplied: readStringArray(projectContext.rulesApplied, `${source}.projectContext.rulesApplied`),
126
+ operatorProfileApplied: readNullableBoolean(
127
+ projectContext.operatorProfileApplied,
128
+ `${source}.projectContext.operatorProfileApplied`,
129
+ ),
130
+ },
131
+ corpus: {
132
+ id: readString(corpus.id, `${source}.corpus.id`),
133
+ version: readString(corpus.version, `${source}.corpus.version`),
134
+ },
135
+ };
136
+ }
137
+
138
+ export function parseEvalExecutionMatrixDimensionsV1(value: unknown, source: string): EvalExecutionMatrixDimensionV1[] {
139
+ if (!Array.isArray(value)) throw new Error(`${source}: expected array`);
140
+ const allowed = new Set<string>(EVAL_EXECUTION_MATRIX_DIMENSIONS_V1);
141
+ const dimensions = value.map((entry, index) => {
142
+ if (typeof entry !== "string" || !allowed.has(entry)) {
143
+ throw new Error(`${source}[${index}]: expected a declared execution-envelope dimension`);
144
+ }
145
+ return entry as EvalExecutionMatrixDimensionV1;
146
+ });
147
+ if (new Set(dimensions).size !== dimensions.length) throw new Error(`${source}: duplicate matrix dimension`);
148
+ return dimensions;
149
+ }
150
+
151
+ function readString(value: unknown, source: string): string {
152
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${source}: expected non-empty string`);
153
+ return value;
154
+ }
155
+
156
+ function readNullableString(value: unknown, source: string): string | null {
157
+ if (value === null) return null;
158
+ return readString(value, source);
159
+ }
160
+
161
+ function readDigest(value: unknown, source: string): string {
162
+ const digest = readString(value, source);
163
+ if (!/^[a-f0-9]{64}$/u.test(digest)) throw new Error(`${source}: expected sha256 digest`);
164
+ return digest;
165
+ }
166
+
167
+ function readNullableDigest(value: unknown, source: string): string | null {
168
+ return value === null ? null : readDigest(value, source);
169
+ }
170
+
171
+ function readNullableNonNegativeInteger(value: unknown, source: string): number | null {
172
+ if (value === null) return null;
173
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 0) {
174
+ throw new Error(`${source}: expected non-negative integer or null`);
175
+ }
176
+ return value;
177
+ }
178
+
179
+ function readNullableBoolean(value: unknown, source: string): boolean | null {
180
+ if (value === null || typeof value === "boolean") return value;
181
+ throw new Error(`${source}: expected boolean or null`);
182
+ }
183
+
184
+ function readStringArray(value: unknown, source: string): string[] {
185
+ if (!Array.isArray(value)) throw new Error(`${source}: expected array`);
186
+ const entries = value.map((entry, index) => readString(entry, `${source}[${index}]`));
187
+ if (new Set(entries).size !== entries.length) throw new Error(`${source}: duplicate value`);
188
+ return entries;
189
+ }
190
+
191
+ function asRecord(value: unknown, source: string): Record<string, unknown> {
192
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) return value as Record<string, unknown>;
193
+ throw new Error(`${source}: expected object`);
194
+ }
@@ -0,0 +1,105 @@
1
+ export interface EvalServingConfigurationV1 {
2
+ targetId: string;
3
+ runtimeId: string | null;
4
+ modelId: string | null;
5
+ serverBuild: string | null;
6
+ total_slots: number | null;
7
+ thinkingLevel: string | null;
8
+ compiledPromptHash: string | null;
9
+ }
10
+
11
+ export function parseEvalServingConfigurationV1(value: unknown, source: string): EvalServingConfigurationV1 {
12
+ const record = asRecord(value, source);
13
+ const targetId = readString(record.targetId, `${source}.targetId`);
14
+ const totalSlots = record.total_slots;
15
+ if (totalSlots !== null && (typeof totalSlots !== "number" || !Number.isInteger(totalSlots) || totalSlots <= 0)) {
16
+ throw new Error(`${source}.total_slots: expected positive integer or null`);
17
+ }
18
+ const compiledPromptHash = readNullableString(record.compiledPromptHash, `${source}.compiledPromptHash`);
19
+ if (compiledPromptHash !== null && !/^[a-f0-9]{64}$/u.test(compiledPromptHash)) {
20
+ throw new Error(`${source}.compiledPromptHash: expected sha256 digest or null`);
21
+ }
22
+ return {
23
+ targetId,
24
+ runtimeId: readNullableString(record.runtimeId, `${source}.runtimeId`),
25
+ modelId: readNullableString(record.modelId, `${source}.modelId`),
26
+ serverBuild: readNullableString(record.serverBuild, `${source}.serverBuild`),
27
+ total_slots: totalSlots as number | null,
28
+ thinkingLevel: readNullableString(record.thinkingLevel, `${source}.thinkingLevel`),
29
+ compiledPromptHash,
30
+ };
31
+ }
32
+
33
+ /**
34
+ * The serving facts an artifact was produced under.
35
+ *
36
+ * An artifact written before the observation existed has no record of its own,
37
+ * so the matrix it declared is the best available reading and the missing
38
+ * fields stay null rather than being invented. This lives beside
39
+ * `sameEvalServingConfiguration` because the two are one rule: what a
40
+ * comparison reads, and when it decides two readings agree. Anything asking
41
+ * whether two eval runs are comparable must go through both, or it is answering
42
+ * a different question from the one `eval compare` answers.
43
+ *
44
+ * The parameter is structural rather than `EvalArtifactV4` so this module stays
45
+ * free of an import cycle through `schema/artifact.ts`.
46
+ */
47
+ export function evalServingConfigurationOf(artifact: {
48
+ readonly servingConfiguration?: EvalServingConfigurationV1;
49
+ readonly matrix: { readonly target: string; readonly model: string | null; readonly thinking: string | null };
50
+ }): EvalServingConfigurationV1 {
51
+ return (
52
+ artifact.servingConfiguration ?? {
53
+ targetId: artifact.matrix.target,
54
+ runtimeId: null,
55
+ modelId: artifact.matrix.model,
56
+ serverBuild: null,
57
+ total_slots: null,
58
+ thinkingLevel: artifact.matrix.thinking,
59
+ compiledPromptHash: null,
60
+ }
61
+ );
62
+ }
63
+
64
+ export function sameEvalServingConfiguration(
65
+ left: EvalServingConfigurationV1,
66
+ right: EvalServingConfigurationV1,
67
+ ): boolean {
68
+ return (
69
+ left.targetId === right.targetId &&
70
+ left.runtimeId === right.runtimeId &&
71
+ left.modelId === right.modelId &&
72
+ left.serverBuild === right.serverBuild &&
73
+ left.total_slots === right.total_slots &&
74
+ left.thinkingLevel === right.thinkingLevel &&
75
+ left.compiledPromptHash === right.compiledPromptHash
76
+ );
77
+ }
78
+
79
+ export function renderEvalServingConfiguration(config: EvalServingConfigurationV1): string {
80
+ return [
81
+ `target=${config.targetId}`,
82
+ `runtime=${config.runtimeId ?? "unknown"}`,
83
+ `model=${config.modelId ?? "unknown"}`,
84
+ `server_build=${config.serverBuild ?? "unknown"}`,
85
+ `total_slots=${config.total_slots ?? "unknown"}`,
86
+ `thinking=${config.thinkingLevel ?? "unknown"}`,
87
+ `compiled_prompt_hash=${config.compiledPromptHash ?? "unknown"}`,
88
+ ].join(" ");
89
+ }
90
+
91
+ function readString(value: unknown, source: string): string {
92
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${source}: expected string`);
93
+ return value;
94
+ }
95
+
96
+ function readNullableString(value: unknown, source: string): string | null {
97
+ if (value === null) return null;
98
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${source}: expected string or null`);
99
+ return value;
100
+ }
101
+
102
+ function asRecord(value: unknown, source: string): Record<string, unknown> {
103
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) return value as Record<string, unknown>;
104
+ throw new Error(`${source}: expected object`);
105
+ }
@@ -1,3 +1,6 @@
1
+ import type { EvalBehaviorScenarioV1 } from "./behavioral.js";
2
+ import type { EvalExecutionMatrixDimensionV1 } from "./execution-envelope.js";
3
+
1
4
  export const EVAL_SUITE_V2_VERSION = 2;
2
5
 
3
6
  export const CANONICAL_METRICS = [
@@ -15,6 +18,13 @@ export const CANONICAL_METRICS = [
15
18
  "tools.totalCalls",
16
19
  "tools.failed",
17
20
  "tools.blocked",
21
+ "tools.read.distinctPaths",
22
+ "tools.read.outsideAllowed",
23
+ "tools.read.decoyHits",
24
+ "tools.calls.dispatch",
25
+ "tools.blocked.bash",
26
+ "claims.unsupported",
27
+ "completion.reported",
18
28
  "context.indexedFiles",
19
29
  "context.coverage",
20
30
  "context.structuralHash",
@@ -103,13 +113,20 @@ export const CANONICAL_METRICS = [
103
113
  "stream.messageUpdateCount",
104
114
  "stream.usageDoubleCounted",
105
115
  "stream.segmentUsageMatchesMessages",
106
- // The task outcome, measured and never gated: whether the model solved the
107
- // workload. Reported beside the invariants above so a report can say "the
108
- // model failed and Clio behaved" instead of one number for both.
116
+ // The task outcome: whether the model solved the workload. Its exit code is
117
+ // recorded beside the machinery invariants so a failed final result can still
118
+ // say "the grader failed and Clio behaved" rather than conflating the two.
109
119
  "task.exitCode",
110
120
  "task.solved",
111
121
  ] as const;
112
122
 
123
+ /**
124
+ * Per-tool call and block counters use a dynamic suffix because extension tool
125
+ * ids are not closed at build time. They otherwise have the same scalar,
126
+ * observable-event semantics as the fixed canonical metrics above.
127
+ */
128
+ export const CANONICAL_METRIC_PREFIXES = ["tools.calls.", "tools.blocked."] as const;
129
+
113
130
  export type EvalMetricName = (typeof CANONICAL_METRICS)[number];
114
131
  export type EvalAssertionOp = "lt" | "lte" | "gt" | "gte" | "eq" | "neq";
115
132
  export type EvalRunnerKind = "clio-run" | "context-index" | "context-init" | "external-command";
@@ -138,6 +155,8 @@ export interface EvalSuiteTargetV2 {
138
155
  export interface EvalSuiteMatrixV2 {
139
156
  targets: EvalSuiteTargetV2[];
140
157
  repeats: number;
158
+ /** Execution-envelope fields this suite intentionally varies. All other fields must match for comparison. */
159
+ dimensions?: EvalExecutionMatrixDimensionV1[];
141
160
  /**
142
161
  * Cumulative receipt-cost ceiling in USD for the whole matrix. Once the
143
162
  * summed `cost.usd` of finished items exceeds it, remaining items fail
@@ -167,6 +186,8 @@ export interface EvalWorkspaceV2 {
167
186
  export interface EvalRunnerV2 {
168
187
  kind: EvalRunnerKind;
169
188
  prompt?: string;
189
+ /** One-run headless authority used to exercise allow and deny recovery. */
190
+ autonomy?: "read-only" | "suggest" | "auto-edit" | "full-auto";
170
191
  /**
171
192
  * Fleet agent recipe id for the clio-run runner. When set the runner
172
193
  * invokes `clio-coder run --agent <id> --json`, whose stream ends with the full
@@ -183,11 +204,10 @@ export interface EvalRunnerV2 {
183
204
  export interface EvalVerifyV2 {
184
205
  commands?: string[];
185
206
  /**
186
- * Commands that measure the task outcome without gating on it. They run in
187
- * the workspace before the gating verifiers and record `task.exitCode` and
188
- * `task.solved`; a nonzero exit is data, never a failure. This is what keeps
189
- * "the model did not solve it" from being reported as "Clio broke", which
190
- * `commands` above cannot express because a failing verifier fails the item.
207
+ * Commands that grade the task outcome. They run in the workspace before the
208
+ * machinery verifiers and record `task.exitCode` and `task.solved`; a nonzero
209
+ * exit fails the final result while the verdict keeps machinery `ok`. This is
210
+ * what keeps "the model did not solve it" distinct from "Clio broke".
191
211
  */
192
212
  measure?: string[];
193
213
  assertions?: EvalMetricAssertion[];
@@ -196,11 +216,19 @@ export interface EvalVerifyV2 {
196
216
 
197
217
  export interface EvalMetricsSpecV2 {
198
218
  collect: string[];
219
+ /**
220
+ * Public fixture paths used to reduce read events to bounded counters. Raw
221
+ * paths stay out of behavioral fact values and evidence excerpts; the metric
222
+ * map records only distinct, outside-allowlist, and declared-decoy counts.
223
+ */
224
+ readObservation?: { allowedPaths: string[]; decoyPaths: string[] };
199
225
  }
200
226
 
201
227
  export interface EvalSuiteTaskV2 {
202
228
  id: string;
203
229
  tags: string[];
230
+ /** Additive behavioral contract evaluated against observable run facts. */
231
+ behavioral?: EvalBehaviorScenarioV1;
204
232
  workspace: EvalWorkspaceV2;
205
233
  runner: EvalRunnerV2;
206
234
  verify: EvalVerifyV2;
@@ -210,6 +238,8 @@ export interface EvalSuiteTaskV2 {
210
238
 
211
239
  export interface EvalSuiteThresholdsV2 {
212
240
  fail: EvalMetricAssertion[];
241
+ /** Budget notices are reported but never change the command exit status. */
242
+ informational?: EvalMetricAssertion[];
213
243
  }
214
244
 
215
245
  export interface EvalSuiteV2 {
@@ -1,3 +1,5 @@
1
+ import { parseEvalBehaviorScenarioV1 } from "./behavioral.js";
2
+ import { parseEvalExecutionMatrixDimensionsV1 } from "./execution-envelope.js";
1
3
  import {
2
4
  EVAL_SUITE_V2_VERSION,
3
5
  type EvalAssertionOp,
@@ -87,12 +89,26 @@ function readMatrix(value: unknown, path: string, issues: EvalValidationIssue[])
87
89
  ];
88
90
  });
89
91
  if (repeats === null || targets.length === 0) return null;
92
+ let dimensions: EvalSuiteV2["matrix"]["dimensions"];
93
+ if (value.dimensions !== undefined) {
94
+ try {
95
+ dimensions = parseEvalExecutionMatrixDimensionsV1(value.dimensions, `${path}.dimensions`);
96
+ } catch (error) {
97
+ issues.push({ path: `${path}.dimensions`, message: error instanceof Error ? error.message : String(error) });
98
+ return null;
99
+ }
100
+ }
90
101
  const maxCostUsd = value.maxCostUsd;
91
102
  if (maxCostUsd !== undefined && (typeof maxCostUsd !== "number" || !Number.isFinite(maxCostUsd) || maxCostUsd < 0)) {
92
103
  issues.push({ path: `${path}.maxCostUsd`, message: "expected non-negative number" });
93
104
  return null;
94
105
  }
95
- return { targets, repeats, ...(maxCostUsd === undefined ? {} : { maxCostUsd }) };
106
+ return {
107
+ targets,
108
+ repeats,
109
+ ...(dimensions === undefined ? {} : { dimensions }),
110
+ ...(maxCostUsd === undefined ? {} : { maxCostUsd }),
111
+ };
96
112
  }
97
113
 
98
114
  function readTasks(value: unknown, path: string, issues: EvalValidationIssue[]): EvalSuiteTaskV2[] | null {
@@ -121,10 +137,12 @@ function readTask(value: unknown, path: string, issues: EvalValidationIssue[]):
121
137
  const workspace = readWorkspace(value.workspace, `${path}.workspace`, issues);
122
138
  const runner = readRunner(value.runner, `${path}.runner`, issues);
123
139
  const timeoutMs = readPositiveInteger(value, path, "timeoutMs", issues);
140
+ const behavioral = readBehavioral(value.behavioral, `${path}.behavioral`, issues);
124
141
  if (id === null || workspace === null || runner === null || timeoutMs === null) return null;
125
142
  return {
126
143
  id,
127
144
  tags: readOptionalStringArray(value, "tags", `${path}.tags`, issues),
145
+ ...(behavioral === undefined ? {} : { behavioral }),
128
146
  workspace,
129
147
  runner,
130
148
  verify: readVerify(value.verify, `${path}.verify`, issues),
@@ -133,6 +151,20 @@ function readTask(value: unknown, path: string, issues: EvalValidationIssue[]):
133
151
  };
134
152
  }
135
153
 
154
+ function readBehavioral(
155
+ value: unknown,
156
+ path: string,
157
+ issues: EvalValidationIssue[],
158
+ ): EvalSuiteTaskV2["behavioral"] | undefined {
159
+ if (value === undefined) return undefined;
160
+ try {
161
+ return parseEvalBehaviorScenarioV1(value, path);
162
+ } catch (error) {
163
+ issues.push({ path, message: error instanceof Error ? error.message : String(error) });
164
+ return undefined;
165
+ }
166
+ }
167
+
136
168
  function readWorkspace(
137
169
  value: unknown,
138
170
  path: string,
@@ -178,6 +210,10 @@ function readRunner(
178
210
  }
179
211
  const prompt = optionalString(value, "prompt");
180
212
  const agent = optionalString(value, "agent");
213
+ const autonomy = optionalString(value, "autonomy");
214
+ if (autonomy !== undefined && !["read-only", "suggest", "auto-edit", "full-auto"].includes(autonomy)) {
215
+ issues.push({ path: `${path}.autonomy`, message: "expected read-only, suggest, auto-edit, or full-auto" });
216
+ }
181
217
  if (agent !== undefined && kind !== "clio-run") {
182
218
  issues.push({ path: `${path}.agent`, message: "agent is only valid on the clio-run runner" });
183
219
  }
@@ -185,6 +221,7 @@ function readRunner(
185
221
  return {
186
222
  kind: kind as EvalRunnerKind,
187
223
  ...(prompt === undefined ? {} : { prompt }),
224
+ ...(autonomy === undefined ? {} : { autonomy: autonomy as NonNullable<EvalSuiteTaskV2["runner"]["autonomy"]> }),
188
225
  ...(agent === undefined ? {} : { agent }),
189
226
  ...(command === undefined ? {} : { command }),
190
227
  commands: readOptionalStringArray(value, "commands", `${path}.commands`, issues),
@@ -221,7 +258,22 @@ function readMetrics(
221
258
  issues.push({ path, message: "expected object" });
222
259
  return { collect: [] };
223
260
  }
224
- return { collect: readOptionalStringArray(value, "collect", `${path}.collect`, issues) };
261
+ const observation = value.readObservation;
262
+ let readObservation: EvalSuiteV2["tasks"][number]["metrics"]["readObservation"];
263
+ if (observation !== undefined) {
264
+ if (!isRecord(observation)) {
265
+ issues.push({ path: `${path}.readObservation`, message: "expected object" });
266
+ } else {
267
+ readObservation = {
268
+ allowedPaths: readOptionalStringArray(observation, "allowedPaths", `${path}.readObservation.allowedPaths`, issues),
269
+ decoyPaths: readOptionalStringArray(observation, "decoyPaths", `${path}.readObservation.decoyPaths`, issues),
270
+ };
271
+ }
272
+ }
273
+ return {
274
+ collect: readOptionalStringArray(value, "collect", `${path}.collect`, issues),
275
+ ...(readObservation === undefined ? {} : { readObservation }),
276
+ };
225
277
  }
226
278
 
227
279
  function readThresholds(
@@ -234,7 +286,10 @@ function readThresholds(
234
286
  issues.push({ path, message: "expected object" });
235
287
  return undefined;
236
288
  }
237
- return { fail: readAssertions(value.fail, `${path}.fail`, issues) };
289
+ return {
290
+ fail: readAssertions(value.fail, `${path}.fail`, issues),
291
+ informational: readAssertions(value.informational, `${path}.informational`, issues),
292
+ };
238
293
  }
239
294
 
240
295
  function readAssertions(value: unknown, path: string, issues: EvalValidationIssue[]): EvalMetricAssertion[] {