@iowarp/clio-coder 0.3.9 → 0.4.1

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 (733) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/NOTICE +33 -0
  3. package/README.md +121 -16
  4. package/dist/{acp-7LOELQFP.js → acp-ZILU3AUO.js} +19 -18
  5. package/dist/{agents-FIBG2SHA.js → agents-HYWGBGQR.js} +53 -39
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-OI4LIH2I.js → auth-N3QT7CBO.js} +24 -21
  8. package/dist/{builtins-AD25UL3C.js → builtins-UJLMOVOV.js} +6 -6
  9. package/dist/{chunk-I4HZDVNP.js → chunk-2LEAKD4C.js} +2 -3
  10. package/dist/{chunk-465CC7FK.js → chunk-2NM363SV.js} +60 -64
  11. package/dist/{chunk-4H6ULJ3H.js → chunk-2VG7KLYV.js} +1046 -1370
  12. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  13. package/dist/{chunk-NZU6YDNV.js → chunk-3I5NY75V.js} +5 -5
  14. package/dist/{chunk-47CMYGET.js → chunk-3QSOM6PA.js} +2 -2
  15. package/dist/chunk-42FMPA75.js +101 -0
  16. package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
  17. package/dist/{chunk-IHKBWSXF.js → chunk-5QIAJV2D.js} +3 -3
  18. package/dist/chunk-5YHDIDBP.js +97 -0
  19. package/dist/chunk-6CCS4G3W.js +1529 -0
  20. package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
  21. package/dist/{chunk-BVDVID7E.js → chunk-6FN3E6KX.js} +6 -6
  22. package/dist/{chunk-DG4M6ZUE.js → chunk-6HMJX2VU.js} +59 -59
  23. package/dist/{chunk-3MRC2YSQ.js → chunk-6I5ILFOF.js} +3 -2
  24. package/dist/chunk-6NJQITNH.js +1412 -0
  25. package/dist/chunk-6VC4OV3Z.js +365 -0
  26. package/dist/{chunk-LU7P4LHA.js → chunk-72GZI5EV.js} +2 -2
  27. package/dist/{chunk-5T7RBWN2.js → chunk-74YWRRU5.js} +9 -8
  28. package/dist/{chunk-VPTUJU4P.js → chunk-7EPLI7VL.js} +2 -2
  29. package/dist/{chunk-CA42X6KT.js → chunk-7OBGU7UB.js} +7 -7
  30. package/dist/{chunk-56KB5IJP.js → chunk-7PWAODYW.js} +3 -3
  31. package/dist/chunk-7RY5VZPH.js +573 -0
  32. package/dist/{chunk-OEDBCISO.js → chunk-ABLSQ6JX.js} +3 -3
  33. package/dist/{chunk-5HFBWUMU.js → chunk-AFKWHWXF.js} +13 -23
  34. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  35. package/dist/{chunk-WXCJ7VME.js → chunk-AKB4GYDL.js} +7 -7
  36. package/dist/chunk-AP73CFDC.js +308 -0
  37. package/dist/{chunk-4LJX2PUC.js → chunk-BBTJOK6Y.js} +5 -5
  38. package/dist/{chunk-QQ7EKM72.js → chunk-BDPT6GTK.js} +13 -61
  39. package/dist/chunk-BJGUKIG4.js +302 -0
  40. package/dist/chunk-BMS5RKQY.js +27 -0
  41. package/dist/{chunk-TD7UE2L5.js → chunk-BTGG6BG2.js} +81 -40
  42. package/dist/chunk-BTK3SSSK.js +67 -0
  43. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  44. package/dist/chunk-BWW4HLO4.js +301 -0
  45. package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
  46. package/dist/{chunk-HJB5IUKP.js → chunk-C537JADH.js} +18 -18
  47. package/dist/{chunk-774ILSRL.js → chunk-CDNVLKUX.js} +5 -4
  48. package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
  49. package/dist/{chunk-AEYBF3TB.js → chunk-CWVRRIEI.js} +2 -2
  50. package/dist/chunk-D4CJV46V.js +462 -0
  51. package/dist/chunk-D7E7WCDF.js +27 -0
  52. package/dist/{chunk-5PVQ4SRS.js → chunk-E67WX76H.js} +10 -126
  53. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  54. package/dist/chunk-EIMVLWB3.js +1842 -0
  55. package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
  56. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  57. package/dist/{chunk-3DUR4WUA.js → chunk-FYUN5KZ3.js} +25 -25
  58. package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
  59. package/dist/chunk-GIZNH63R.js +40 -0
  60. package/dist/chunk-GPPB3JBE.js +688 -0
  61. package/dist/{chunk-B5XRQOLB.js → chunk-GVQJ5CCZ.js} +17 -11
  62. package/dist/chunk-HHV2GANA.js +88 -0
  63. package/dist/chunk-HJWWJ6IL.js +184 -0
  64. package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
  65. package/dist/chunk-HRQMFLJP.js +75 -0
  66. package/dist/{chunk-AD7Y7STJ.js → chunk-HUAS7ITX.js} +107 -97
  67. package/dist/{chunk-O6I4CIEU.js → chunk-I66EAJFY.js} +6 -6
  68. package/dist/{chunk-S4COXYBG.js → chunk-IG7BCQBA.js} +129 -106
  69. package/dist/{chunk-N3PBVRTZ.js → chunk-IXJT6DCX.js} +9 -7
  70. package/dist/chunk-J4HBWF6Y.js +2635 -0
  71. package/dist/chunk-J5LZHVIT.js +284 -0
  72. package/dist/{chunk-GAYUJ7LE.js → chunk-JA5QWE4Z.js} +544 -227
  73. package/dist/{chunk-B5CSFE7B.js → chunk-JIEGK6UF.js} +6 -174
  74. package/dist/{chunk-VKBMFOYV.js → chunk-JZWT5J3Y.js} +23 -27
  75. package/dist/chunk-K6BF4U2H.js +1785 -0
  76. package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
  77. package/dist/{chunk-YSEHGPCT.js → chunk-MA3H6DM5.js} +6 -6
  78. package/dist/{chunk-EBOC7MT3.js → chunk-MOPSG2X7.js} +9 -9
  79. package/dist/{chunk-KV2AOLDF.js → chunk-MQXIVJ35.js} +18 -29
  80. package/dist/{chunk-P3JGPQFL.js → chunk-N5UK64DP.js} +4 -4
  81. package/dist/chunk-NDDGJUXD.js +81 -0
  82. package/dist/chunk-NEKRRTYW.js +56 -0
  83. package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
  84. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  85. package/dist/{chunk-T3Z6VAAF.js → chunk-OJTRZGR3.js} +53 -92
  86. package/dist/{chunk-5DQRIYDZ.js → chunk-PBP4B7XR.js} +3 -3
  87. package/dist/{chunk-NQ6UCCOD.js → chunk-PJJ6MY27.js} +8 -8
  88. package/dist/chunk-PMZCIOCJ.js +25 -0
  89. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  90. package/dist/{chunk-7C6RYZGQ.js → chunk-PVAMAVBB.js} +5 -4
  91. package/dist/chunk-QDC3K2U3.js +262 -0
  92. package/dist/{chunk-JEQQR47K.js → chunk-QKIFBZKT.js} +173 -14
  93. package/dist/{chunk-R7LNVMCS.js → chunk-QMXC4JB7.js} +70 -78
  94. package/dist/chunk-QSNYB6ZV.js +195 -0
  95. package/dist/chunk-QTFGO774.js +644 -0
  96. package/dist/{chunk-ODFEOB4F.js → chunk-R23Z6K6I.js} +27 -9
  97. package/dist/{chunk-3UUY7R3Z.js → chunk-R32CLGZ6.js} +14 -14
  98. package/dist/chunk-R346GLFC.js +31 -0
  99. package/dist/chunk-RKSR6VSF.js +132 -0
  100. package/dist/{chunk-N5XKWMDW.js → chunk-SCYB3HA4.js} +73 -27
  101. package/dist/{chunk-PZ4I4JE2.js → chunk-SINK3QR6.js} +135 -125
  102. package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
  103. package/dist/chunk-T56WDKA5.js +183 -0
  104. package/dist/{chunk-ECUO3KDP.js → chunk-TD3PGPQA.js} +87 -26
  105. package/dist/{chunk-HKO36JWF.js → chunk-THYWACCR.js} +31 -3
  106. package/dist/{chunk-LXPJXFM5.js → chunk-TVH4ONAM.js} +18 -12
  107. package/dist/chunk-TVHHYFHE.js +255 -0
  108. package/dist/chunk-U2WB7TZS.js +271 -0
  109. package/dist/{chunk-NNNWO6F2.js → chunk-UAPGZHYC.js} +237 -33
  110. package/dist/{chunk-MIX5N5AC.js → chunk-UEDMSP56.js} +415 -160
  111. package/dist/{chunk-WIE7ZOSW.js → chunk-UXN6JT4W.js} +3 -3
  112. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  113. package/dist/{chunk-MV2VUEJC.js → chunk-VEGN6WIQ.js} +2 -2
  114. package/dist/chunk-VKFQTNDV.js +66 -0
  115. package/dist/{chunk-FALJGAWU.js → chunk-VKRH2TCS.js} +2 -2
  116. package/dist/{chunk-A2NJGIB3.js → chunk-VN3SHNBN.js} +2 -2
  117. package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
  118. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  119. package/dist/{chunk-EQ63NRB7.js → chunk-WNP7O5WZ.js} +3 -3
  120. package/dist/chunk-WR6U3OVP.js +45 -0
  121. package/dist/{chunk-TEO2TLVN.js → chunk-XKA2ICR3.js} +1051 -1196
  122. package/dist/{chunk-3V5AYSEQ.js → chunk-Y45G3AXC.js} +72 -65
  123. package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
  124. package/dist/chunk-YAKGTXEV.js +17 -0
  125. package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
  126. package/dist/{chunk-YW7UVM5V.js → chunk-ZAZB4JMW.js} +55 -11
  127. package/dist/{chunk-HCBCAYZU.js → chunk-ZJLUDYFY.js} +11 -11
  128. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  129. package/dist/{chunk-IFBNV6H6.js → chunk-ZW55JB7N.js} +3 -3
  130. package/dist/cli/index.js +48 -37
  131. package/dist/clio-IT3G3VQH.js +25 -0
  132. package/dist/{code-nav-LMW275PA.js → code-nav-RK6S7F6E.js} +8 -8
  133. package/dist/codewiki/build-worker.js +1 -1
  134. package/dist/{compile-cache-CVJMMODC.js → compile-cache-OQAVB7Y5.js} +3 -5
  135. package/dist/{components-ZFA3SAER.js → components-UBWCQSRW.js} +6 -6
  136. package/dist/{config-RXS5T3JT.js → config-3QZRWZJF.js} +73 -61
  137. package/dist/configure-FL7Y3KJF.js +54 -0
  138. package/dist/{context-MVOORGMF.js → context-5HE7ODYK.js} +61 -49
  139. package/dist/{context-I3BTOTCS.js → context-KYQFRVDC.js} +11 -11
  140. package/dist/{context-PALKKQYL.js → context-XNHL75JV.js} +43 -28
  141. package/dist/{context-clear-N2WOYZ2K.js → context-clear-N545L53A.js} +60 -48
  142. package/dist/{context-working-set-MIEVECVZ.js → context-working-set-QHKXSV2F.js} +15 -13
  143. package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-RGIE5PCT.js} +109 -72
  144. package/dist/{docs-7LQ23DLM.js → docs-5NAF6AU7.js} +7 -13
  145. package/dist/doctor-ZGPEGHIP.js +772 -0
  146. package/dist/{eval-IJ5VEZDJ.js → eval-GXLL44RD.js} +106 -86
  147. package/dist/eval-inventory-HBWSWQOK.js +315 -0
  148. package/dist/{evidence-L5APPXNV.js → evidence-HWLBRH3Q.js} +209 -51
  149. package/dist/{evolve-RGNKFJ52.js → evolve-FTZBMNVW.js} +57 -45
  150. package/dist/{extensions-7WYWUX5A.js → extensions-VHRBEID7.js} +7 -7
  151. package/dist/{fleet-6CNVBZZP.js → fleet-CKZHJWZJ.js} +215 -114
  152. package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-EXDXBMV6.js} +13 -12
  153. package/dist/fleet-decisions-OTHB6KRL.js +157 -0
  154. package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-YTEZUCUT.js} +20 -17
  155. package/dist/fleet-inspect-SS6YMDCK.js +445 -0
  156. package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-PBY4VYOM.js} +6 -9
  157. package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-KMEM5L3S.js} +25 -20
  158. package/dist/fleet-verify-QD5M7E7Q.js +178 -0
  159. package/dist/fleet-view-WAMJYNDT.js +94 -0
  160. package/dist/{init-VBN2ACVA.js → init-5XQRBOFV.js} +79 -66
  161. package/dist/install-NKNG7KD4.js +13 -0
  162. package/dist/interop-34TVO25M.js +116 -0
  163. package/dist/{library-JHGUMLY2.js → library-3QY6KF57.js} +25 -21
  164. package/dist/{memory-K4OQIYWG.js → memory-L4UTIIIW.js} +59 -47
  165. package/dist/{models-2NCZUWDD.js → models-ZVX3QOWE.js} +47 -37
  166. package/dist/{monitor-MMVTJABD.js → monitor-CEKVSYTS.js} +67 -57
  167. package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-77BAP6BC.js} +7633 -7699
  168. package/dist/panes-7STHOAUJ.js +103 -0
  169. package/dist/panes-SHAUIRXY.js +60 -0
  170. package/dist/{paths-DBXMZMDU.js → paths-L7LGY6RN.js} +6 -6
  171. package/dist/{reset-DD5JGOY3.js → reset-EOLM7GVE.js} +15 -14
  172. package/dist/resources-74GKTLSF.js +115 -0
  173. package/dist/{run-QEGNX7FL.js → run-HBAUJNNZ.js} +139 -98
  174. package/dist/{share-JKD3BQMW.js → share-G3APVLVP.js} +25 -21
  175. package/dist/{skills-LMQIKDOZ.js → skills-35HHUKCR.js} +37 -27
  176. package/dist/{skills-eval-I7X2774U.js → skills-eval-QN4HSHDC.js} +80 -73
  177. package/dist/skills-inventory-J357J34F.js +129 -0
  178. package/dist/slash-commands-JZZCQA32.js +79 -0
  179. package/dist/{steer-CF5TDANS.js → steer-XAVHJM22.js} +4 -4
  180. package/dist/{support-I7LOJLIF.js → support-U7QOWY26.js} +7 -7
  181. package/dist/{targets-RUSR6B5Z.js → targets-DSM6CY3M.js} +67 -59
  182. package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-JOPFUVEM.js} +15 -10
  183. package/dist/tools-MKNWVPBH.js +29 -0
  184. package/dist/{trace-ODOQIVIW.js → trace-ECQ7TIYZ.js} +194 -7
  185. package/dist/tui-primitives-K5PASC3O.js +17 -0
  186. package/dist/{uninstall-ZJF5H5ZN.js → uninstall-N34PCTGJ.js} +6 -8
  187. package/dist/{upgrade-XANW3FXB.js → upgrade-H7TOM7YL.js} +37 -62
  188. package/dist/{usage-4H7ZRXQT.js → usage-X52N3IDJ.js} +70 -59
  189. package/dist/{verifiers-UZXNBZEB.js → verifiers-EJTVVSMA.js} +174 -14
  190. package/dist/{verify-BVKWTNDL.js → verify-YJL6XET2.js} +12 -11
  191. package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-MPIFL3LL.js} +3 -4
  192. package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-4NDZTQ4B.js} +86 -75
  193. package/dist/with-panes-OBOBFIIR.js +818 -0
  194. package/dist/worker/entry.js +131 -91
  195. package/docs/README.md +3 -2
  196. package/docs/acp.md +25 -4
  197. package/docs/alcf-provider.md +1 -1
  198. package/docs/architecture.md +2 -2
  199. package/docs/artifact-versions.md +4 -1
  200. package/docs/built-in-agents.md +40 -32
  201. package/docs/capacity-and-scheduling.md +43 -5
  202. package/docs/commands-and-modes.md +39 -4
  203. package/docs/config-knobs-audit.md +3 -0
  204. package/docs/configuration-and-targets.md +138 -167
  205. package/docs/context-engine.md +1 -1
  206. package/docs/development-pipeline.md +19 -0
  207. package/docs/dispatch-typed-intent.md +385 -0
  208. package/docs/documentation-coverage.md +2 -2
  209. package/docs/documentation-guide.md +1 -1
  210. package/docs/environment-variables.md +3 -1
  211. package/docs/eval-runner.md +1 -1
  212. package/docs/evals-internal.md +1 -1
  213. package/docs/evidence-and-memory.md +2 -2
  214. package/docs/evolution.md +1 -1
  215. package/docs/exit-codes-and-output.md +3 -1
  216. package/docs/extensions-and-sharing.md +25 -1
  217. package/docs/fleet-demo-runbook.md +6 -3
  218. package/docs/fleet-dispatch.md +30 -7
  219. package/docs/installation-and-lifecycle.md +16 -3
  220. package/docs/middleware-and-components.md +1 -1
  221. package/docs/model-catalog.md +10 -1
  222. package/docs/observability.md +3 -3
  223. package/docs/proactive-memory.md +1 -1
  224. package/docs/prompt-envelope-and-tools.md +1 -1
  225. package/docs/provider-adapter-cookbook.md +1 -1
  226. package/docs/release-cut-checklist.md +164 -177
  227. package/docs/safety-model.md +2 -2
  228. package/docs/scientific-validation.md +3 -3
  229. package/docs/session-lifecycle.md +1 -1
  230. package/docs/skills-marketplace.md +1 -1
  231. package/docs/tool-usage.md +18 -8
  232. package/docs/trace-store.md +16 -11
  233. package/docs/troubleshooting.md +2 -2
  234. package/docs/tui-design.md +1 -1
  235. package/docs/worker-dispatch-mechanics.md +1 -1
  236. package/evals/README.md +5 -0
  237. package/evals/behavioral-corpus-grader.mjs +103 -0
  238. package/evals/behavioral-machinery-baseline.json +2276 -0
  239. package/evals/behavioral-machinery-driver.ts +250 -0
  240. package/evals/behavioral-machinery-support.ts +253 -0
  241. package/evals/behavioral-machinery.yaml +614 -0
  242. package/evals/behavioral-model-negative-control.yaml +68 -0
  243. package/evals/behavioral-model.yaml +216 -0
  244. package/evals/fixtures/behavioral-facts.txt +3 -0
  245. package/evals/fixtures/behavioral-main.ts +7 -0
  246. package/evals/fixtures/decoy/note.txt +2 -0
  247. package/evals/fixtures/private/credentials.txt +1 -0
  248. package/evals/tracked-metrics-baseline.yaml +229 -0
  249. package/evals/tracked-metrics-grader.mjs +129 -0
  250. package/package.json +8 -16
  251. package/skills/README.md +6 -6
  252. package/skills/coding/ast-grep/SKILL.md +8 -2
  253. package/skills/coding/coding-standards/SKILL.md +8 -2
  254. package/skills/coding/prototype/SKILL.md +8 -2
  255. package/skills/coding/tdd/SKILL.md +8 -2
  256. package/skills/context/context-handoff/SKILL.md +12 -3
  257. package/skills/context/context-handoff/evals.md +3 -3
  258. package/skills/context/context-prime/SKILL.md +8 -2
  259. package/skills/context/context-prime/evals.md +2 -2
  260. package/skills/git/file-ticket/SKILL.md +9 -4
  261. package/skills/git/file-ticket/evals.md +2 -2
  262. package/skills/git/fix-issue/SKILL.md +12 -5
  263. package/skills/git/fix-issue/evals.md +4 -4
  264. package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
  265. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  266. package/skills/git/ship/SKILL.md +9 -3
  267. package/skills/git/ship/evals.md +4 -4
  268. package/skills/git/worktree-create/SKILL.md +7 -2
  269. package/skills/git/worktree-create/evals.md +6 -6
  270. package/skills/git/worktree-merge/SKILL.md +7 -2
  271. package/skills/git/worktree-merge/evals.md +6 -6
  272. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
  273. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
  274. package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
  275. package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
  276. package/skills/meta/credentials/SKILL.md +9 -2
  277. package/skills/meta/find-skills/SKILL.md +8 -2
  278. package/skills/meta/herdr/SKILL.md +8 -2
  279. package/skills/meta/skill-craft/SKILL.md +21 -4
  280. package/skills/planning/architecture/SKILL.md +9 -3
  281. package/skills/planning/backlog/SKILL.md +8 -2
  282. package/skills/planning/prd/SKILL.md +8 -2
  283. package/skills/planning/product-intent/SKILL.md +8 -2
  284. package/skills/planning/tech-spec/SKILL.md +9 -3
  285. package/skills/registry.yaml +66 -66
  286. package/skills/research/arxiv-literature/SKILL.md +8 -2
  287. package/skills/research/experiment-protocol/SKILL.md +9 -2
  288. package/skills/research/scientific-debugging/SKILL.md +9 -2
  289. package/skills/research/scientific-debugging/evals.md +2 -2
  290. package/skills/research/scientific-modernization/SKILL.md +9 -2
  291. package/skills/skill-marketplace.json +257 -38
  292. package/skills/workflow/cut-it/SKILL.md +10 -2
  293. package/skills/workflow/design-council/SKILL.md +11 -2
  294. package/skills/workflow/grill-me/SKILL.md +8 -2
  295. package/skills/workflow/workflow-distiller/SKILL.md +8 -2
  296. package/src/cli/acp.ts +8 -4
  297. package/src/cli/argv.ts +25 -0
  298. package/src/cli/auth.ts +2 -2
  299. package/src/cli/bootstrap-generate.ts +5 -5
  300. package/src/cli/clio.ts +6 -1
  301. package/src/cli/config-inspect.ts +3 -3
  302. package/src/cli/configure-interop.ts +1 -1
  303. package/src/cli/configure.ts +50 -48
  304. package/src/cli/default-target.ts +1 -1
  305. package/src/cli/docs.ts +6 -6
  306. package/src/cli/doctor-naming.ts +323 -0
  307. package/src/cli/doctor-panes.ts +156 -0
  308. package/src/cli/doctor-toolchain.ts +78 -0
  309. package/src/cli/doctor.ts +34 -1
  310. package/src/cli/eval-inventory.ts +436 -0
  311. package/src/cli/eval.ts +13 -0
  312. package/src/cli/evidence-detail.ts +88 -0
  313. package/src/cli/evidence-inventory.ts +183 -0
  314. package/src/cli/evidence.ts +30 -5
  315. package/src/cli/fleet-decisions.ts +69 -0
  316. package/src/cli/fleet-inspect.ts +334 -0
  317. package/src/cli/fleet-preflight.ts +1 -1
  318. package/src/cli/fleet-verify.ts +133 -0
  319. package/src/cli/fleet-view.ts +827 -0
  320. package/src/cli/fleet.ts +154 -40
  321. package/src/cli/index.ts +14 -2
  322. package/src/cli/interop-inspect.ts +128 -0
  323. package/src/cli/interop.ts +34 -0
  324. package/src/cli/models.ts +3 -3
  325. package/src/cli/modes/print.ts +1 -1
  326. package/src/cli/panes.ts +35 -0
  327. package/src/cli/reset.ts +6 -3
  328. package/src/cli/run.ts +67 -13
  329. package/src/cli/share.ts +1 -1
  330. package/src/cli/skills-eval.ts +11 -11
  331. package/src/cli/skills-inventory.ts +185 -0
  332. package/src/cli/skills.ts +16 -13
  333. package/src/cli/targets.ts +23 -24
  334. package/src/cli/tools.ts +321 -0
  335. package/src/cli/trace-inspect.ts +252 -0
  336. package/src/cli/trace.ts +64 -2
  337. package/src/cli/uninstall.ts +2 -2
  338. package/src/cli/upgrade.ts +29 -34
  339. package/src/cli/usage.ts +2 -2
  340. package/src/cli/validate-model.ts +1 -1
  341. package/src/cli/verifiers-inspect.ts +347 -0
  342. package/src/cli/verifiers.ts +9 -0
  343. package/src/cli/wiki-generate.ts +5 -5
  344. package/src/core/bash-exec.ts +1 -1
  345. package/src/core/boot-trace.ts +3 -3
  346. package/src/core/bus-events.ts +4 -0
  347. package/src/core/bus-trace.ts +2 -2
  348. package/src/core/compile-cache.ts +1 -1
  349. package/src/core/config.ts +1070 -845
  350. package/src/core/defaults.ts +342 -463
  351. package/src/core/domain-loader.ts +6 -4
  352. package/src/core/event-bus.ts +1 -1
  353. package/src/core/file-references.ts +78 -88
  354. package/src/core/git-commit-attribution.ts +3 -9
  355. package/src/core/guardrails.ts +24 -4
  356. package/src/core/naming-compat.ts +45 -0
  357. package/src/core/naming-events.ts +62 -0
  358. package/src/core/recent-models.ts +1 -7
  359. package/src/core/residency-protection.ts +4 -8
  360. package/src/core/resolve-config-value.ts +1 -1
  361. package/src/core/response-model-id.ts +0 -14
  362. package/src/core/response-schema.ts +44 -4
  363. package/src/core/session-routing.ts +84 -74
  364. package/src/core/skill-activation.ts +18 -0
  365. package/src/core/termination.ts +4 -4
  366. package/src/core/theme-token-hex.ts +43 -0
  367. package/src/core/timers.ts +2 -12
  368. package/src/core/tool-names.ts +2 -1
  369. package/src/core/xdg.ts +1 -1
  370. package/src/domains/agents/catalog.ts +2 -12
  371. package/src/domains/agents/extension.ts +3 -3
  372. package/src/domains/agents/fleets/build-review.md +0 -3
  373. package/src/domains/agents/fleets/build-test.md +0 -3
  374. package/src/domains/agents/registry.ts +7 -7
  375. package/src/domains/agents/result-contract-filesystem.ts +32 -0
  376. package/src/domains/agents/result-contract.ts +165 -36
  377. package/src/domains/agents/spec.ts +0 -11
  378. package/src/domains/config/classify.ts +37 -46
  379. package/src/domains/config/extension.ts +5 -5
  380. package/src/domains/config/keybindings.ts +48 -47
  381. package/src/domains/config/watcher.ts +1 -1
  382. package/src/domains/context/codewiki/indexer.ts +1 -1
  383. package/src/domains/context/extension.ts +3 -3
  384. package/src/domains/context/prompt-context.ts +1 -1
  385. package/src/domains/context/wiki/assemble.ts +2 -2
  386. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  387. package/src/domains/context/working-set/replay/report.ts +1 -1
  388. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  389. package/src/domains/dispatch/active-route-planner.ts +2 -2
  390. package/src/domains/dispatch/admission-error.ts +9 -0
  391. package/src/domains/dispatch/admission.ts +22 -21
  392. package/src/domains/dispatch/agent-candidates.ts +1 -1
  393. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  394. package/src/domains/dispatch/agent-ledger.ts +1 -1
  395. package/src/domains/dispatch/assignment.ts +5 -5
  396. package/src/domains/dispatch/capacity-lease.ts +23 -6
  397. package/src/domains/dispatch/code-step.ts +1 -1
  398. package/src/domains/dispatch/contract.ts +2 -2
  399. package/src/domains/dispatch/council-topology.ts +398 -0
  400. package/src/domains/dispatch/extension.ts +287 -111
  401. package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
  402. package/src/domains/dispatch/fleet-plan.ts +7 -2
  403. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  404. package/src/domains/dispatch/fleet-run.ts +59 -3
  405. package/src/domains/dispatch/gate-decisions.ts +36 -15
  406. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  407. package/src/domains/dispatch/gate-topology.ts +289 -0
  408. package/src/domains/dispatch/index.ts +19 -0
  409. package/src/domains/dispatch/intent-compatibility.ts +330 -0
  410. package/src/domains/dispatch/intent.ts +85 -1
  411. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  412. package/src/domains/dispatch/path-scope.ts +0 -61
  413. package/src/domains/dispatch/placement.ts +2 -2
  414. package/src/domains/dispatch/receipt-findings.ts +1 -1
  415. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  416. package/src/domains/dispatch/reservation-store.ts +24 -27
  417. package/src/domains/dispatch/route-decision.ts +1 -1
  418. package/src/domains/dispatch/route-history.ts +1 -1
  419. package/src/domains/dispatch/route-policy.ts +1 -1
  420. package/src/domains/dispatch/route-readiness.ts +0 -28
  421. package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
  422. package/src/domains/dispatch/run-event-journal.ts +599 -0
  423. package/src/domains/dispatch/state.ts +45 -1
  424. package/src/domains/dispatch/tool-stats.ts +1 -1
  425. package/src/domains/dispatch/transport.ts +2 -19
  426. package/src/domains/dispatch/types.ts +16 -3
  427. package/src/domains/dispatch/validation.ts +33 -8
  428. package/src/domains/dispatch/worker-protocol.ts +2 -2
  429. package/src/domains/eval/artifacts/store.ts +5 -4
  430. package/src/domains/eval/compare/compare.ts +3 -16
  431. package/src/domains/eval/compare/thresholds.ts +0 -8
  432. package/src/domains/eval/execution-provenance.ts +1 -1
  433. package/src/domains/eval/inventory.ts +113 -0
  434. package/src/domains/eval/metrics/token-stream.ts +0 -7
  435. package/src/domains/eval/report.ts +1 -1
  436. package/src/domains/eval/runner.ts +1 -1
  437. package/src/domains/eval/runners/clio-run.ts +7 -6
  438. package/src/domains/eval/runners/external-command.ts +4 -3
  439. package/src/domains/eval/schema/artifact.ts +1 -1
  440. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  441. package/src/domains/eval/schema/behavioral.ts +7 -6
  442. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  443. package/src/domains/eval/schema/naming.ts +10 -0
  444. package/src/domains/eval/schema/serving.ts +31 -0
  445. package/src/domains/eval/schema/suite.ts +2 -2
  446. package/src/domains/eval/schema/validate.ts +9 -5
  447. package/src/domains/eval/schema/verdict.ts +4 -2
  448. package/src/domains/eval/store.ts +12 -2
  449. package/src/domains/eval/suites/run.ts +12 -6
  450. package/src/domains/eval/types.ts +1 -1
  451. package/src/domains/eval/workspaces/git.ts +1 -1
  452. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  453. package/src/domains/evidence/build.ts +13 -5
  454. package/src/domains/evidence/store.ts +6 -0
  455. package/src/domains/interop/consent.ts +7 -7
  456. package/src/domains/interop/extension.ts +1 -1
  457. package/src/domains/lifecycle/doctor.ts +27 -21
  458. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  459. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  460. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  461. package/src/domains/lifecycle/migrations/index.ts +20 -1
  462. package/src/domains/lifecycle/naming-history.ts +153 -0
  463. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  464. package/src/domains/lifecycle/naming-resources.ts +261 -0
  465. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  466. package/src/domains/lifecycle/naming-yazi.ts +81 -0
  467. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  468. package/src/domains/memory/index.ts +0 -1
  469. package/src/domains/memory/task-memory-handoff.ts +6 -3
  470. package/src/domains/memory/task-memory-policy.ts +6 -10
  471. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  472. package/src/domains/middleware/index.ts +7 -0
  473. package/src/domains/middleware/marketplace-offer.ts +339 -0
  474. package/src/domains/middleware/memory-intervention.ts +33 -21
  475. package/src/domains/middleware/runtime.ts +2 -2
  476. package/src/domains/mux/contract.ts +566 -0
  477. package/src/domains/mux/detect.ts +182 -0
  478. package/src/domains/mux/dock-controller.ts +365 -0
  479. package/src/domains/mux/extension.ts +53 -0
  480. package/src/domains/mux/index.ts +116 -0
  481. package/src/domains/mux/manifest.ts +6 -0
  482. package/src/domains/mux/operations.ts +192 -0
  483. package/src/domains/mux/pane-registry.ts +90 -0
  484. package/src/domains/mux/protocol.ts +62 -0
  485. package/src/domains/mux/socket-client.ts +964 -0
  486. package/src/domains/mux/types.ts +265 -0
  487. package/src/domains/mux/viewer-command.ts +59 -0
  488. package/src/domains/mux/yazi/assets/init.lua +2 -0
  489. package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
  490. package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
  491. package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
  492. package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
  493. package/src/domains/mux/yazi/assets/yazi.toml +17 -0
  494. package/src/domains/mux/yazi/event-stream.ts +182 -0
  495. package/src/domains/mux/yazi/profile.ts +299 -0
  496. package/src/domains/mux/yazi/session.ts +251 -0
  497. package/src/domains/mux/yazi/theme.ts +30 -0
  498. package/src/domains/observability/cost.ts +21 -0
  499. package/src/domains/observability/extension.ts +1 -1
  500. package/src/domains/observability/index.ts +2 -0
  501. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  502. package/src/domains/observability/projection.ts +1 -1
  503. package/src/domains/observability/trace-store.ts +63 -11
  504. package/src/domains/prompts/compiler.ts +2 -2
  505. package/src/domains/prompts/extension.ts +3 -3
  506. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
  507. package/src/domains/prompts/fragments/operating/skills.md +25 -18
  508. package/src/domains/providers/endpoint-capacity.ts +154 -22
  509. package/src/domains/providers/endpoint-slots-store.ts +189 -0
  510. package/src/domains/providers/extension.ts +25 -8
  511. package/src/domains/providers/index.ts +22 -0
  512. package/src/domains/providers/knowledge-base-path.ts +1 -1
  513. package/src/domains/providers/model-runtime-capabilities.ts +46 -2
  514. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  515. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
  516. package/src/domains/providers/plugins.ts +1 -1
  517. package/src/domains/providers/resolver.ts +1 -1
  518. package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
  519. package/src/domains/providers/runtimes/builtins.ts +2 -0
  520. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  521. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  522. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  523. package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
  524. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  525. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  526. package/src/domains/providers/runtimes/protocol/litellm.ts +285 -0
  527. package/src/domains/providers/support.ts +1 -0
  528. package/src/domains/providers/target-model-cache.ts +124 -0
  529. package/src/domains/providers/types/knowledge-base.ts +13 -0
  530. package/src/domains/providers/types/local-model-quirks.ts +2 -2
  531. package/src/domains/providers/types/target-descriptor.ts +3 -3
  532. package/src/domains/resources/extension.ts +1 -1
  533. package/src/domains/resources/index.ts +3 -0
  534. package/src/domains/resources/library.ts +6 -6
  535. package/src/domains/resources/prompts/loader.ts +1 -1
  536. package/src/domains/resources/skills/content-hash.ts +7 -6
  537. package/src/domains/resources/skills/evals.ts +1 -1
  538. package/src/domains/resources/skills/install.ts +36 -12
  539. package/src/domains/resources/skills/loader.ts +72 -13
  540. package/src/domains/resources/skills/marketplace.ts +21 -2
  541. package/src/domains/resources/skills/promotion.ts +214 -0
  542. package/src/domains/safety/action-classifier.ts +6 -0
  543. package/src/domains/safety/audit.ts +2 -2
  544. package/src/domains/safety/finish-contract.ts +2 -1
  545. package/src/domains/safety/run-effects.ts +1 -1
  546. package/src/domains/scheduling/extension.ts +4 -4
  547. package/src/domains/session/archive-readers.ts +9 -1
  548. package/src/domains/session/compaction/branch-summary.ts +4 -0
  549. package/src/domains/session/compaction/compact.ts +1 -1
  550. package/src/domains/session/compaction/tokens.ts +4 -0
  551. package/src/domains/session/context-accounting.ts +1 -1
  552. package/src/domains/session/decision-board.ts +1 -1
  553. package/src/domains/session/extension.ts +1 -1
  554. package/src/domains/session/handoff.ts +2 -2
  555. package/src/domains/session/prompt-manifest.ts +0 -5
  556. package/src/domains/session/protected-artifact-journal.ts +12 -6
  557. package/src/domains/session/retry.ts +1 -1
  558. package/src/domains/share/archive.ts +85 -36
  559. package/src/domains/toolchain/archive.ts +175 -0
  560. package/src/domains/toolchain/contract.ts +28 -0
  561. package/src/domains/toolchain/extension.ts +47 -0
  562. package/src/domains/toolchain/index.ts +39 -0
  563. package/src/domains/toolchain/install.ts +327 -0
  564. package/src/domains/toolchain/manifest.ts +8 -0
  565. package/src/domains/toolchain/paths.ts +34 -0
  566. package/src/domains/toolchain/registry.ts +265 -0
  567. package/src/domains/toolchain/remove.ts +218 -0
  568. package/src/domains/toolchain/resolve.ts +182 -0
  569. package/src/domains/toolchain/types.ts +113 -0
  570. package/src/domains/toolchain/version.ts +88 -0
  571. package/src/engine/acp/adapter.ts +3 -3
  572. package/src/engine/acp/event-mapper.ts +3 -3
  573. package/src/engine/acp/server.ts +440 -96
  574. package/src/engine/acp/tool-mediator.ts +2 -2
  575. package/src/engine/acp/types.ts +20 -2
  576. package/src/engine/alcf-oauth.ts +5 -5
  577. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  578. package/src/engine/api-registry.ts +1 -1
  579. package/src/engine/apis/llamacpp-residency.ts +1 -19
  580. package/src/engine/apis/lmstudio.ts +1 -6
  581. package/src/engine/apis/ollama-native.ts +3 -3
  582. package/src/engine/apis/openai-completions.ts +2 -2
  583. package/src/engine/apis/residency.ts +3 -9
  584. package/src/engine/claude/sdk-module.ts +87 -0
  585. package/src/engine/claude/sdk-runtime.ts +25 -17
  586. package/src/engine/claude/subprocess-runtime.ts +1 -1
  587. package/src/engine/claude/tool-safety.ts +4 -4
  588. package/src/engine/loop-guard.ts +0 -5
  589. package/src/engine/session.ts +14 -7
  590. package/src/engine/tui-primitives.ts +21 -0
  591. package/src/engine/tui.ts +1 -0
  592. package/src/engine/worker-events.ts +6 -6
  593. package/src/engine/worker-runtime.ts +16 -26
  594. package/src/entry/boot-options.ts +2 -0
  595. package/src/entry/orchestrator.ts +207 -90
  596. package/src/entry/panes-activation.ts +31 -0
  597. package/src/entry/with-panes.ts +20 -0
  598. package/src/interactive/application-controller.ts +21 -21
  599. package/src/interactive/bus-notices.ts +2 -2
  600. package/src/interactive/chat-loop.ts +8 -8
  601. package/src/interactive/chat-panel.ts +1 -1
  602. package/src/interactive/clio-editor.ts +105 -1
  603. package/src/interactive/context-activity.ts +8 -6
  604. package/src/interactive/context-meter.ts +3 -6
  605. package/src/interactive/context-overlay.ts +2 -1
  606. package/src/interactive/cost-overlay.ts +3 -1
  607. package/src/interactive/council-grid.ts +3 -5
  608. package/src/interactive/council.ts +11 -0
  609. package/src/interactive/dispatch-board.ts +56 -49
  610. package/src/interactive/editor-bash.ts +21 -0
  611. package/src/interactive/editor-steer.ts +9 -4
  612. package/src/interactive/editor-submit.ts +24 -18
  613. package/src/interactive/external-editor.ts +1 -1
  614. package/src/interactive/file-reference-completion.ts +360 -0
  615. package/src/interactive/footer/dashboard.ts +15 -17
  616. package/src/interactive/footer/notifications.ts +14 -8
  617. package/src/interactive/footer/widgets.ts +2 -44
  618. package/src/interactive/interactive-application.ts +229 -62
  619. package/src/interactive/interactive-event-projection.ts +1 -1
  620. package/src/interactive/interactive-input-runtime.ts +9 -2
  621. package/src/interactive/interactive-presentation.ts +21 -16
  622. package/src/interactive/interactive-shell.ts +2 -2
  623. package/src/interactive/interactive-slash-runtime.ts +99 -23
  624. package/src/interactive/interactive-subscriptions.ts +1 -1
  625. package/src/interactive/interactive-tickers.ts +1 -1
  626. package/src/interactive/keybinding-manager.ts +4 -4
  627. package/src/interactive/layout.ts +1 -1
  628. package/src/interactive/memory-overlay.ts +3 -2
  629. package/src/interactive/modal-marker.ts +151 -0
  630. package/src/interactive/mutation-preview.ts +1 -1
  631. package/src/interactive/mux-bridge.ts +214 -0
  632. package/src/interactive/overlay-frame.ts +62 -14
  633. package/src/interactive/overlay-general-openers.ts +7 -2
  634. package/src/interactive/overlay-key-routing.ts +21 -10
  635. package/src/interactive/overlay-lifecycle.ts +20 -4
  636. package/src/interactive/overlay-model-selectors.ts +43 -6
  637. package/src/interactive/overlay-permission-lifecycle.ts +90 -22
  638. package/src/interactive/overlay-transitions.ts +18 -4
  639. package/src/interactive/overlays/agents.ts +3 -2
  640. package/src/interactive/overlays/ask-user.ts +161 -41
  641. package/src/interactive/overlays/auth-dialog.ts +1 -0
  642. package/src/interactive/overlays/context-reset.ts +29 -4
  643. package/src/interactive/overlays/cwd-fallback.ts +29 -4
  644. package/src/interactive/overlays/decisions.ts +15 -13
  645. package/src/interactive/overlays/extensions.ts +1 -0
  646. package/src/interactive/overlays/fleet-run-approval.ts +4 -3
  647. package/src/interactive/overlays/handoff-review.ts +3 -2
  648. package/src/interactive/overlays/help-reference.ts +2 -0
  649. package/src/interactive/overlays/interop.ts +2 -1
  650. package/src/interactive/overlays/library-install-confirm.ts +2 -1
  651. package/src/interactive/overlays/library-tabs.ts +28 -0
  652. package/src/interactive/overlays/list-overlay.ts +10 -1
  653. package/src/interactive/overlays/message-picker.ts +2 -1
  654. package/src/interactive/overlays/model-scope.ts +86 -0
  655. package/src/interactive/overlays/model-selector.ts +40 -31
  656. package/src/interactive/overlays/prompts.ts +11 -4
  657. package/src/interactive/overlays/session-selector.ts +3 -2
  658. package/src/interactive/overlays/settings-sections.ts +30 -0
  659. package/src/interactive/overlays/settings.ts +849 -268
  660. package/src/interactive/overlays/side-question.ts +3 -2
  661. package/src/interactive/overlays/skills-hub.ts +11 -19
  662. package/src/interactive/overlays/tree-selector.ts +3 -2
  663. package/src/interactive/pane-policy.ts +46 -0
  664. package/src/interactive/panes-runtime.ts +318 -0
  665. package/src/interactive/permission-overlay.ts +2 -2
  666. package/src/interactive/renderers/compaction-summary.ts +29 -0
  667. package/src/interactive/renderers/retry-status.ts +12 -4
  668. package/src/interactive/renderers/tool-execution.ts +4 -4
  669. package/src/interactive/renderers/worker-entry.ts +122 -14
  670. package/src/interactive/session-transcript.ts +3 -3
  671. package/src/interactive/slash-autocomplete.ts +454 -165
  672. package/src/interactive/slash-commands.ts +521 -189
  673. package/src/interactive/slash-spec.ts +160 -17
  674. package/src/interactive/status/controller.ts +2 -2
  675. package/src/interactive/stream-pacing-policy.ts +1 -1
  676. package/src/interactive/tasks-overlay.ts +21 -13
  677. package/src/interactive/terminal-lease.ts +6 -7
  678. package/src/interactive/theme/tokens.ts +3 -14
  679. package/src/interactive/turn-context.ts +58 -13
  680. package/src/interactive/turn-persistence.ts +2 -2
  681. package/src/interactive/turn-prewarm.ts +2 -2
  682. package/src/interactive/turn-runtime.ts +8 -8
  683. package/src/interactive/turn-state.ts +1 -1
  684. package/src/interactive/view/artifacts.ts +120 -9
  685. package/src/interactive/view/view-overlay.ts +14 -10
  686. package/src/interactive/watch-pane.ts +180 -0
  687. package/src/interactive/welcome-dashboard.ts +15 -15
  688. package/src/interactive/worker-progress.ts +11 -5
  689. package/src/interactive/worker-receipts.ts +20 -2
  690. package/src/interactive/worker-stream.ts +6 -4
  691. package/src/interactive/yazi-bridge.ts +451 -0
  692. package/src/tools/ask-user.ts +3 -3
  693. package/src/tools/bash.ts +1 -1
  694. package/src/tools/bootstrap.ts +26 -2
  695. package/src/tools/builtin-tool-catalog.ts +16 -1
  696. package/src/tools/compete-worktrees.ts +108 -17
  697. package/src/tools/context/index.ts +15 -1
  698. package/src/tools/core-bootstrap.ts +2 -1
  699. package/src/tools/dispatch-admission.ts +18 -5
  700. package/src/tools/dispatch-arguments.ts +21 -21
  701. package/src/tools/dispatch-plan.ts +0 -11
  702. package/src/tools/dispatch-run-events.ts +145 -28
  703. package/src/tools/dispatch-runner.ts +40 -13
  704. package/src/tools/dispatch-types.ts +15 -3
  705. package/src/tools/dispatch.ts +2 -2
  706. package/src/tools/executables.ts +17 -14
  707. package/src/tools/find.ts +1 -6
  708. package/src/tools/monitor.ts +4 -4
  709. package/src/tools/observation.ts +54 -4
  710. package/src/tools/observers.ts +0 -33
  711. package/src/tools/panes-surface.ts +38 -0
  712. package/src/tools/panes.ts +112 -0
  713. package/src/tools/policy.ts +10 -1
  714. package/src/tools/presentation.ts +1 -0
  715. package/src/tools/task-worktree.ts +28 -7
  716. package/src/tools/verify/authoring.ts +3 -6
  717. package/src/tools/verify/frontend.ts +1 -1
  718. package/src/tools/web-fetch.ts +1 -1
  719. package/src/worker/entry.ts +4 -3
  720. package/src/worker/protocol.ts +16 -14
  721. package/src/worker/spec-contract.ts +2 -2
  722. package/src/worker/stdin-demux.ts +2 -2
  723. package/dist/chunk-D73KXYPF.js +0 -37
  724. package/dist/chunk-MLOK6ZOS.js +0 -2888
  725. package/dist/chunk-PNY46YEY.js +0 -1581
  726. package/dist/chunk-XDOQXGFO.js +0 -515
  727. package/dist/chunk-YKOFT37S.js +0 -279
  728. package/dist/clio-LT5V7SSZ.js +0 -26
  729. package/dist/configure-2WYWSCSD.js +0 -49
  730. package/dist/doctor-TWBWFK5V.js +0 -165
  731. package/src/engine/apis/degraded-inference.ts +0 -95
  732. /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
  733. /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
@@ -32,7 +32,20 @@ export type DispatchIntentNormalizationResult =
32
32
  | { ok: true; intent: DispatchIntent }
33
33
  | { ok: false; reason: string; message: string };
34
34
 
35
- const RAW_FIELDS = new Set(["read_roots", "write_roots", "relevant_paths", "expected_outputs", "verification"]);
35
+ /**
36
+ * `version` is accepted on raw model-facing intent so a caller replaying a
37
+ * declaration it was shown can echo the version back. It is validated, never
38
+ * trusted: an unsupported value is a terminal refusal rather than a field the
39
+ * normalizer quietly overwrites with the version this build speaks.
40
+ */
41
+ const RAW_FIELDS = new Set([
42
+ "version",
43
+ "read_roots",
44
+ "write_roots",
45
+ "relevant_paths",
46
+ "expected_outputs",
47
+ "verification",
48
+ ]);
36
49
 
37
50
  function isRecord(value: unknown): value is Record<string, unknown> {
38
51
  return value !== null && typeof value === "object" && !Array.isArray(value);
@@ -129,6 +142,47 @@ function normalizePathList(
129
142
  return [...new Set(normalized)].sort(compareCodepoints);
130
143
  }
131
144
 
145
+ /**
146
+ * Build typed intent from paths a non-model producer already holds.
147
+ *
148
+ * Fleet contracts, CLI entry points, and extensions declare repository-relative
149
+ * scope in their own artifacts long before a dispatch request exists. Without
150
+ * this they hand the request nothing, and the scope resolver falls back to
151
+ * reading path-like tokens out of the rendered prompt, which is the exact
152
+ * ambiguity typed intent removes. The paths go through the same normalization,
153
+ * caps, and provenance construction as a model-facing declaration, so a
154
+ * producer cannot mint an intent shape the dispatch tool could not.
155
+ *
156
+ * Verification and expected outputs are deliberately not accepted here.
157
+ * A declared check id has to be resolved against the project's verification
158
+ * catalog before it means anything, and that resolution belongs to the
159
+ * admission controller that owns the catalog, not to a scope builder.
160
+ */
161
+ export function declaredScopeIntent(input: {
162
+ readRoots?: ReadonlyArray<string>;
163
+ writeRoots?: ReadonlyArray<string>;
164
+ relevantPaths?: ReadonlyArray<string>;
165
+ }): DispatchIntentNormalizationResult {
166
+ const readRoots = normalizePathList(input.readRoots, "intent.read_roots");
167
+ if (!Array.isArray(readRoots)) return readRoots;
168
+ const writeRoots = normalizePathList(input.writeRoots, "intent.write_roots");
169
+ if (!Array.isArray(writeRoots)) return writeRoots;
170
+ const relevantPaths = normalizePathList(input.relevantPaths, "intent.relevant_paths");
171
+ if (!Array.isArray(relevantPaths)) return relevantPaths;
172
+ return {
173
+ ok: true,
174
+ intent: {
175
+ version: 2,
176
+ readRoots,
177
+ writeRoots,
178
+ relevantPaths,
179
+ pathProvenance: declaredIntentPathProvenance({ readRoots, writeRoots, relevantPaths }),
180
+ expectedOutputs: [],
181
+ verification: [],
182
+ },
183
+ };
184
+ }
185
+
132
186
  export function isDispatchIntent(value: unknown): value is DispatchIntent {
133
187
  if (!isRecord(value) || value.version !== 2) return false;
134
188
  for (const field of ["readRoots", "writeRoots", "relevantPaths", "expectedOutputs"] as const) {
@@ -164,6 +218,30 @@ export function isDispatchIntent(value: unknown): value is DispatchIntent {
164
218
  );
165
219
  }
166
220
 
221
+ /**
222
+ * Project a declared intent onto a run that may not write.
223
+ *
224
+ * Council members, reviewers, judges, and any other read-only expansion of a
225
+ * caller's single task inherit the caller's declared scope. Inheriting
226
+ * `writeRoots` verbatim would leave the request claiming a write scope the run's
227
+ * autonomy makes unenforceable, so the write roots become read roots: the same
228
+ * trees, strictly less authority. Nothing is added, so the projection can only
229
+ * narrow. Returns the input unchanged when there is no write scope to demote.
230
+ */
231
+ export function narrowDispatchIntentToReadOnly(intent: DispatchIntent): DispatchIntent {
232
+ if (intent.writeRoots.length === 0) return intent;
233
+ const readRoots = [...new Set([...intent.readRoots, ...intent.writeRoots])].sort(compareCodepoints);
234
+ return {
235
+ version: 2,
236
+ readRoots,
237
+ writeRoots: [],
238
+ relevantPaths: [...intent.relevantPaths],
239
+ pathProvenance: declaredIntentPathProvenance({ readRoots, writeRoots: [], relevantPaths: intent.relevantPaths }),
240
+ expectedOutputs: [...intent.expectedOutputs],
241
+ verification: intent.verification.map((entry) => ({ ...entry })),
242
+ };
243
+ }
244
+
167
245
  export function normalizeDispatchIntent(
168
246
  raw: unknown,
169
247
  checks: ReadonlyMap<string, DispatchIntentCheckBound>,
@@ -173,6 +251,12 @@ export function normalizeDispatchIntent(
173
251
  .filter((key) => !RAW_FIELDS.has(key))
174
252
  .sort(compareCodepoints);
175
253
  if (unknown.length > 0) return fail("intent_malformed", `intent contains unknown field '${unknown[0]}'`);
254
+ if (raw.version !== undefined && raw.version !== 2) {
255
+ return fail(
256
+ "intent_version_unsupported",
257
+ `intent declares version ${JSON.stringify(raw.version)}; this build speaks dispatch intent version 2. A declaration at another version is refused rather than migrated: restate read_roots, write_roots, relevant_paths, expected_outputs, and verification under version 2`,
258
+ );
259
+ }
176
260
  const readRoots = normalizePathList(raw.read_roots, "intent.read_roots");
177
261
  if (!Array.isArray(readRoots)) return readRoots;
178
262
  const writeRoots = normalizePathList(raw.write_roots, "intent.write_roots");
@@ -76,7 +76,7 @@ export interface JointAgentDimension {
76
76
  }
77
77
 
78
78
  /** A single truthful role-quality label retires task-feature priors for this tuple. */
79
- export function routePriorForAgentEvidence(
79
+ function routePriorForAgentEvidence(
80
80
  agent: JointAgentDimension,
81
81
  observations: ReadonlyArray<RouteObservation>,
82
82
  ): RoutePrior {
@@ -64,19 +64,6 @@ export interface DeclaredScopeReplacementNotice {
64
64
  message: string;
65
65
  }
66
66
 
67
- export interface LegacyScopeInferenceNotice {
68
- code: "legacy_scope_inferred" | "legacy_scope_empty";
69
- level: "warning";
70
- paths: ReadonlyArray<{
71
- path: string;
72
- policy: "working-context" | "write-boundary";
73
- provenance: DispatchPathProvenanceKind;
74
- source: DispatchPathProvenanceSource;
75
- confidence: DispatchPathConfidence;
76
- }>;
77
- message: string;
78
- }
79
-
80
67
  export type DispatchPathScopeInferenceErrorCode = "legacy_scope_path_absolute" | "legacy_scope_path_malformed";
81
68
 
82
69
  export class DispatchPathScopeInferenceError extends Error {
@@ -320,51 +307,3 @@ export function declaredScopeReplacementNotice(scope: DispatchPathScope): Declar
320
307
  )}. Those paths did not select project rules or expand worker authority.`,
321
308
  };
322
309
  }
323
-
324
- function legacyNoticePaths(scope: DispatchPathScope): LegacyScopeInferenceNotice["paths"] {
325
- const paths: Array<LegacyScopeInferenceNotice["paths"][number]> = [];
326
- for (const [policy, entries] of [
327
- ["working-context", scope.provenance.workingContextPaths],
328
- ["write-boundary", scope.provenance.writeBoundaries],
329
- ] as const) {
330
- for (const entry of entries) {
331
- for (const evidence of entry.evidence) {
332
- paths.push({
333
- path: entry.path,
334
- policy,
335
- provenance: evidence.provenance,
336
- source: evidence.source,
337
- confidence: evidence.confidence,
338
- });
339
- }
340
- }
341
- }
342
- return paths;
343
- }
344
-
345
- /** Render the operator-visible warning for a legacy scope resolution. */
346
- export function legacyScopeInferenceNotice(scope: DispatchPathScope): LegacyScopeInferenceNotice | null {
347
- if (scope.source !== "inferred") return null;
348
- const paths = legacyNoticePaths(scope);
349
- if (paths.length === 0) {
350
- return {
351
- code: "legacy_scope_empty",
352
- level: "warning",
353
- paths,
354
- message:
355
- "[dispatch scope] legacy dispatch has no declared intent and inferred no policy-bearing paths. Path-scoped rules received no inferred match input, and worker authority did not expand.",
356
- };
357
- }
358
- const rendered = paths
359
- .map(
360
- (entry) =>
361
- `${entry.policy} ${entry.path} (provenance=${entry.provenance} source=${entry.source} confidence=${entry.confidence})`,
362
- )
363
- .join("; ");
364
- return {
365
- code: "legacy_scope_inferred",
366
- level: "warning",
367
- paths,
368
- message: `[dispatch scope] legacy dispatch resolved policy-bearing scope without declared intent: ${rendered}. Review this scope before execution.`,
369
- };
370
- }
@@ -61,9 +61,9 @@ function completedReroutes(
61
61
 
62
62
  function requestedNodeId(req: DispatchRequest, settings: Readonly<ClioSettings> | undefined): string | null {
63
63
  if (req.node !== undefined && req.node.trim().length > 0) return req.node.trim();
64
- const workers = settings?.workers;
64
+ const workers = settings?.fleet;
65
65
  if (!workers) return null;
66
- const profileName = req.workerProfile ?? workers.agentBindings?.[req.agentId];
66
+ const profileName = req.workerProfile ?? workers.agentProfiles?.[req.agentId];
67
67
  if (!profileName) return null;
68
68
  const pin = workers.profiles?.[profileName]?.node;
69
69
  return pin !== undefined && pin.trim().length > 0 ? pin.trim() : null;
@@ -49,7 +49,7 @@ function canonicalJson(value: unknown): string {
49
49
  throw new Error(`response schema digest cannot represent ${typeof value}`);
50
50
  }
51
51
 
52
- export function canonicalResponseSchemaDigest(schema: Record<string, unknown>): string {
52
+ function canonicalResponseSchemaDigest(schema: Record<string, unknown>): string {
53
53
  return createHash("sha256").update(canonicalJson(schema), "utf8").digest("hex");
54
54
  }
55
55
 
@@ -123,7 +123,7 @@ export const RECEIPT_INTEGRITY_FIELD_COVERAGE = {
123
123
  dynamicHash: true,
124
124
  promptSignature: true,
125
125
  toolSignature: true,
126
- clioVersion: true,
126
+ clioCoderVersion: true,
127
127
  piMonoVersion: true,
128
128
  platform: true,
129
129
  nodeVersion: true,
@@ -172,8 +172,14 @@ function selectedReceiptFields(
172
172
  return result;
173
173
  }
174
174
 
175
- function receiptDigestFields(receipt: RunReceipt | RunReceiptDraft): Record<string, unknown> {
175
+ function receiptDigestFields(receipt: RunReceipt | RunReceiptDraft, legacyNaming = false): Record<string, unknown> {
176
176
  const result = selectedReceiptFields(receipt, RECEIPT_FIELDS);
177
+ if (legacyNaming) {
178
+ const source = receipt as unknown as Record<string, unknown>;
179
+ const version = source.clioVersion ?? source.clioCoderVersion;
180
+ delete result.clioCoderVersion;
181
+ if (version !== undefined) result.clioVersion = version;
182
+ }
177
183
  result.briefing = receipt.briefing ?? null;
178
184
  result.outcomeCode = receipt.outcomeCode ?? null;
179
185
  result.steering = receipt.steering ?? null;
@@ -227,24 +233,29 @@ function ledgerDigestFields(envelope: RunEnvelope): Record<string, unknown> {
227
233
  };
228
234
  }
229
235
 
230
- function integrityPayload(receipt: RunReceipt | RunReceiptDraft, envelope: RunEnvelope): Record<string, unknown> {
236
+ function integrityPayload(
237
+ receipt: RunReceipt | RunReceiptDraft,
238
+ envelope: RunEnvelope,
239
+ legacyNaming = false,
240
+ ): Record<string, unknown> {
231
241
  return {
232
- contract: "clio.runReceipt.integrity",
242
+ contract: legacyNaming ? "clio.runReceipt.integrity" : "clio-coder.runReceipt.integrity",
233
243
  version: RUN_RECEIPT_INTEGRITY_VERSION,
234
244
  sources: ["receipt", "run-ledger"],
235
- receipt: receiptDigestFields(receipt),
245
+ receipt: receiptDigestFields(receipt, legacyNaming),
236
246
  ledger: ledgerDigestFields(envelope),
237
247
  };
238
248
  }
239
249
 
240
- export function computeReceiptIntegrity(
250
+ function computeReceiptIntegrity(
241
251
  receipt: RunReceipt | RunReceiptDraft,
242
252
  envelope: RunEnvelope,
253
+ legacyNaming = false,
243
254
  ): RunReceiptIntegrity {
244
255
  return {
245
256
  version: RUN_RECEIPT_INTEGRITY_VERSION,
246
257
  algorithm: RUN_RECEIPT_INTEGRITY_ALGORITHM,
247
- digest: sha256(canonicalJson(integrityPayload(receipt, envelope))),
258
+ digest: sha256(canonicalJson(integrityPayload(receipt, envelope, legacyNaming))),
248
259
  };
249
260
  }
250
261
 
@@ -385,7 +396,8 @@ export function verifyReceiptIntegrity(receipt: RunReceipt, envelope: RunEnvelop
385
396
  return { ok: false, reason: `ledger mismatch: ${mismatch}` };
386
397
  }
387
398
  const expected = computeReceiptIntegrity(receipt, envelope);
388
- if (expected.digest !== receipt.integrity.digest) {
399
+ const legacyExpected = computeReceiptIntegrity(receipt, envelope, true);
400
+ if (expected.digest !== receipt.integrity.digest && legacyExpected.digest !== receipt.integrity.digest) {
389
401
  return { ok: false, reason: "integrity mismatch" };
390
402
  }
391
403
  return { ok: true };
@@ -9,14 +9,29 @@ import {
9
9
  type CapacityStateFile,
10
10
  capacityStateLockPath,
11
11
  describeEndpointCapacityHolders,
12
+ endpointCapacityRemedy,
12
13
  readCapacityStateUnsafe,
13
14
  writeCapacityStateUnsafe,
14
15
  } from "./capacity-lease.js";
16
+ import { COUNCIL_MIN_MEMBERS } from "./gate-role-prompts.js";
15
17
 
16
18
  const MAX_RESERVATION_RECORDS = 500;
17
19
  export const DEFAULT_RESERVATION_TTL_MS = 15 * 60_000;
18
20
 
19
- export type ReservationTopology = "parallel" | "detached" | "sequential" | "pipeline" | "review" | "compete";
21
+ /**
22
+ * `council` is carried rather than flattened into `parallel` because it is the
23
+ * one topology with a floor on its own width. Every other plan can answer a
24
+ * capacity denial by dispatching fewer at once; a council of two cannot, and a
25
+ * denial that tells it to is advice it cannot take.
26
+ */
27
+ export type ReservationTopology =
28
+ | "parallel"
29
+ | "detached"
30
+ | "sequential"
31
+ | "pipeline"
32
+ | "review"
33
+ | "compete"
34
+ | "council";
20
35
  export type ReservationMemberStatus = "held" | "consumed" | "released";
21
36
  export type ReservationStatus = "active" | "released" | "rolled_back" | "expired";
22
37
 
@@ -79,8 +94,10 @@ function endpointCapacityDenial(input: {
79
94
  leases: number;
80
95
  reservations: number;
81
96
  foregroundStreams: number;
97
+ topology?: ReservationTopology;
82
98
  }): string {
83
- return `dispatch: admission denied: endpoint '${endpointLabel(input.endpointKey)}' capacity exceeded (${input.used + input.requested}/${input.limit} slots): ${describeEndpointCapacityHolders(input)}; reduce the same-wave worker count, collect in-flight runs, or point workers at a second server`;
99
+ const remedy = endpointCapacityRemedy(input.topology === "council" ? { rosterFloor: COUNCIL_MIN_MEMBERS } : undefined);
100
+ return `dispatch: admission denied: endpoint '${endpointLabel(input.endpointKey)}' capacity exceeded (${input.used + input.requested}/${input.limit} slots): ${describeEndpointCapacityHolders(input)}; ${remedy}`;
84
101
  }
85
102
 
86
103
  function copyRecord(record: DispatchReservationRecord): DispatchReservationRecord {
@@ -100,7 +117,8 @@ function validRecord(value: unknown): value is DispatchReservationRecord {
100
117
  record.topology === "sequential" ||
101
118
  record.topology === "pipeline" ||
102
119
  record.topology === "review" ||
103
- record.topology === "compete") &&
120
+ record.topology === "compete" ||
121
+ record.topology === "council") &&
104
122
  (record.status === "active" ||
105
123
  record.status === "released" ||
106
124
  record.status === "rolled_back" ||
@@ -191,6 +209,7 @@ function allocateReservation(
191
209
  tasks: ReadonlyArray<ReservationPlanTask>,
192
210
  existing: ReadonlyArray<DispatchReservationRecord>,
193
211
  capacity: ReservationCapacitySnapshot,
212
+ topology?: ReservationTopology,
194
213
  ): ReservationPlanResult {
195
214
  if (tasks.length === 0) return { ok: false, reason: "reservation requires at least one task" };
196
215
  const duplicate = tasks.find((task, index) => tasks.slice(0, index).some((entry) => entry.memberId === task.memberId));
@@ -230,6 +249,7 @@ function allocateReservation(
230
249
  leases: endpoint.leases ?? endpoint.active - (endpoint.foregroundStreams ?? 0),
231
250
  reservations: heldSlots,
232
251
  foregroundStreams: endpoint.foregroundStreams ?? 0,
252
+ ...(topology === undefined ? {} : { topology }),
233
253
  }),
234
254
  };
235
255
  }
@@ -264,7 +284,7 @@ export function createDispatchReservation(input: {
264
284
  `dispatch: reservation denied: capacity is draining (requested by pid ${drain.requestedByPid} at ${drain.requestedAt})`,
265
285
  );
266
286
  }
267
- const planned = allocateReservation(input.tasks, records, input.capacity);
287
+ const planned = allocateReservation(input.tasks, records, input.capacity, input.topology);
268
288
  if (!planned.ok) {
269
289
  replaceReservations(state, records);
270
290
  writeCapacityStateUnsafe(state);
@@ -579,31 +599,8 @@ export function getDispatchReservation(ownerId: string): DispatchReservationReco
579
599
  return record ? copyRecord(record) : null;
580
600
  }
581
601
 
582
- export function listDispatchReservations(): ReadonlyArray<DispatchReservationRecord> {
583
- return readStore();
584
- }
585
-
586
602
  export function reservedBudgetUsd(): number {
587
603
  return readStore()
588
604
  .filter((record) => record.status === "active")
589
605
  .reduce((sum, record) => sum + outstandingBudget(record), 0);
590
606
  }
591
-
592
- export function reservedCapacity(): {
593
- globalSlots: number;
594
- nodeSlots: Readonly<Record<string, number>>;
595
- endpointSlots: Readonly<Record<string, number>>;
596
- } {
597
- let globalSlots = 0;
598
- const nodeSlots: Record<string, number> = {};
599
- const endpointSlots: Record<string, number> = {};
600
- for (const record of readStore().filter((entry) => entry.status === "active")) {
601
- const allocation = reservationAllocation(outstandingTasks(record));
602
- globalSlots += allocation.globalSlots;
603
- for (const [nodeId, count] of Object.entries(allocation.nodeSlots))
604
- nodeSlots[nodeId] = (nodeSlots[nodeId] ?? 0) + count;
605
- for (const [endpointKey, count] of Object.entries(allocation.endpointSlots))
606
- endpointSlots[endpointKey] = (endpointSlots[endpointKey] ?? 0) + count;
607
- }
608
- return { globalSlots, nodeSlots, endpointSlots };
609
- }
@@ -597,7 +597,7 @@ function readinessHashProjection(report: RouteReadinessReport): readonly [boolea
597
597
  * `decisionDurationMs`, which is a measurement of the decision rather than an
598
598
  * input to it, so a replay on a faster machine still reproduces the hash.
599
599
  */
600
- export function routeDecisionHash(input: RouteDecisionInput): string {
600
+ function routeDecisionHash(input: RouteDecisionInput): string {
601
601
  // Arrays give every field an explicit position, so native JSON serialization
602
602
  // is deterministic without recursively sorting hundreds of short-lived
603
603
  // objects at the maximum universe bound. Candidate identity uses the same
@@ -137,7 +137,7 @@ function retireHistory(path: string, version: unknown): void {
137
137
  const retired = `${path}.v${String(version)}.${stamp}.retired`;
138
138
  renameSync(path, retired);
139
139
  process.stderr.write(
140
- `[clio:dispatch] route history v${String(version)} is retired; starting empty at v${ROUTE_HISTORY_VERSION}. Prior observations: ${retired}\n`,
140
+ `[clio-coder:dispatch] route history v${String(version)} is retired; starting empty at v${ROUTE_HISTORY_VERSION}. Prior observations: ${retired}\n`,
141
141
  );
142
142
  }
143
143
 
@@ -146,7 +146,7 @@ function rate(values: ReadonlyArray<boolean>, fallback = 0): number {
146
146
  }
147
147
 
148
148
  /** Conservative 95% Wilson lower confidence bound for a Bernoulli success rate. */
149
- export function wilsonLowerBound(successes: number, observations: number, z = 1.96): number {
149
+ function wilsonLowerBound(successes: number, observations: number, z = 1.96): number {
150
150
  if (observations <= 0) return 0;
151
151
  const proportion = successes / observations;
152
152
  const z2 = z * z;
@@ -90,31 +90,3 @@ export function evaluateRouteReadiness(input: RouteReadinessInput): RouteReadine
90
90
  labelsNeeded: Math.max(0, MINIMUM_ACTIVE_QUALITY_LABELS - estimate.qualityLabeledCount),
91
91
  };
92
92
  }
93
-
94
- /**
95
- * Human-readable one-liners for a refusal message. The wording names the
96
- * missing evidence, so an operator who sees an active refusal can tell whether
97
- * to wait for measurements or to fix a stale fact.
98
- */
99
- export function describeReadinessGap(gap: ReadinessGap): string {
100
- switch (gap) {
101
- case "hard-constraint-validity-below-one":
102
- return "hard-constraint evaluation was not consistently valid over the retained window";
103
- case "integrity-failures-in-window":
104
- return "the retained window contains receipt or source integrity failures";
105
- case "insufficient-quality-labels":
106
- return `fewer than ${MINIMUM_ACTIVE_QUALITY_LABELS} quality-labeled outcomes for this route and role`;
107
- case "quality-lower-bound-below-posture-floor":
108
- return "the conservative quality lower bound is below the posture floor";
109
- case "quality-lower-bound-below-requested-minimum":
110
- return "the conservative quality lower bound is below the request's minimumQuality";
111
- case "reliability-below-posture-floor":
112
- return "route-attributable reliability is below the posture floor";
113
- case "cost-upper-bound-unknown":
114
- return "the route has no conservative cost upper bound";
115
- case "route-facts-stale":
116
- return "node, endpoint, resource, capacity, or settings facts are stale";
117
- case "decision-latency-above-budget":
118
- return `shadow decision p95 exceeds ${DECISION_LATENCY_BUDGET_MS} ms at the configured universe bound`;
119
- }
120
- }
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Domain-owned writer for the run event journal.
3
+ *
4
+ * The journal was originally teed from `createDispatchRunEventRegistry`
5
+ * (src/tools/dispatch-run-events.ts), the display-tail helper behind the
6
+ * model-facing `dispatch` tool. That helper is not on the operator paths:
7
+ * `clio-coder run --agent` (src/cli/run.ts), `clio-coder fleet run`
8
+ * (src/cli/fleet.ts), and the TUI `/run` slash command each take a handle
9
+ * straight off `DispatchContract.dispatch` and iterate `handle.events`
10
+ * themselves, so no registry is ever built and the sink never fired. The
11
+ * writer had to move to something every dispatch reaches.
12
+ *
13
+ * `BusChannels.DispatchProgress` is that thing. The dispatch domain publishes
14
+ * it from inside the event pump for every consumer-visible event of every run,
15
+ * "attached, detached, batched, and retry runs, exactly once" (see
16
+ * src/core/bus-events.ts), whether or not anyone iterates the handle. The
17
+ * terminal pair `DispatchCompleted`/`DispatchFailed` closes every run the same
18
+ * way. Subscribing here makes the journal a property of dispatching, not of
19
+ * which caller happened to build a registry.
20
+ *
21
+ * Ownership is explicit rather than ambient: the bridge attaches only when a
22
+ * composition root asks for it (`DispatchBundleOptions.journalRunEvents`), and
23
+ * `registerAllTools` hands its registry `journal: null` in that same process.
24
+ * One writer per file, decided at one place, so a tool-path run in the TUI is
25
+ * not transcribed twice.
26
+ *
27
+ * Every write is best-effort. The sink degrades itself on I/O failure and a
28
+ * listener that throws is contained by the safe bus, so nothing here can fail a
29
+ * dispatch.
30
+ */
31
+
32
+ import type {
33
+ DispatchCompletedPayload,
34
+ DispatchFailedPayload,
35
+ DispatchProgressPayload,
36
+ } from "../../core/bus-events.js";
37
+ import { BusChannels } from "../../core/bus-events.js";
38
+ import type { SafeEventBus } from "../../core/event-bus.js";
39
+ import { runTailEntryFromEvent } from "../../tools/dispatch-run-events.js";
40
+ import { defaultRunEventJournal, type RunEventJournalSink } from "./run-event-journal.js";
41
+
42
+ /**
43
+ * Runs whose `open` line this bridge has already written. Bounded so a
44
+ * long-lived orchestrator cannot grow it without limit; the journal writer
45
+ * keeps its own bound for the same reason. Evicting a run only forgets that it
46
+ * was opened, and a later event for it writes a second `open` line, which the
47
+ * reader and the writer both tolerate.
48
+ */
49
+ const OPENED_RUN_LIMIT = 512;
50
+
51
+ export interface RunEventJournalBridge {
52
+ /** Unsubscribe from the bus. Idempotent. */
53
+ stop(): void;
54
+ }
55
+
56
+ export interface AttachRunEventJournalBridgeOptions {
57
+ /** Sink override; defaults to the process-wide journal. */
58
+ journal?: RunEventJournalSink;
59
+ }
60
+
61
+ function isRecord(value: unknown): value is Record<string, unknown> {
62
+ return typeof value === "object" && value !== null && !Array.isArray(value);
63
+ }
64
+
65
+ function runIdentity(payload: unknown): { runId: string; agentId: string } | null {
66
+ if (!isRecord(payload)) return null;
67
+ if (typeof payload.runId !== "string" || payload.runId.length === 0) return null;
68
+ return { runId: payload.runId, agentId: typeof payload.agentId === "string" ? payload.agentId : "unknown" };
69
+ }
70
+
71
+ /**
72
+ * Subscribe the journal to a dispatch bus. Returns a handle whose `stop()` the
73
+ * owning bundle calls on shutdown so a second bundle in the same process (tests
74
+ * do this) never inherits the first one's listeners.
75
+ */
76
+ export function attachRunEventJournalBridge(
77
+ bus: SafeEventBus,
78
+ options: AttachRunEventJournalBridgeOptions = {},
79
+ ): RunEventJournalBridge {
80
+ const journal = options.journal ?? defaultRunEventJournal();
81
+ const opened = new Set<string>();
82
+
83
+ const ensureOpen = (runId: string, agentId: string): void => {
84
+ if (opened.has(runId)) return;
85
+ opened.add(runId);
86
+ while (opened.size > OPENED_RUN_LIMIT) {
87
+ const oldest = opened.values().next();
88
+ if (oldest.done === true) break;
89
+ opened.delete(oldest.value);
90
+ }
91
+ journal.open(runId, agentId);
92
+ };
93
+
94
+ /**
95
+ * Write the receipt facts and close the run. Read defensively for the same
96
+ * reason the registry's seal is: a terminal payload that is missing a field
97
+ * it is typed to have must degrade the transcript, never throw back into the
98
+ * finalizer that emitted it.
99
+ */
100
+ const seal = (outcome: string, detail: string | null | undefined, payload: unknown): void => {
101
+ const identity = runIdentity(payload);
102
+ if (identity === null) return;
103
+ ensureOpen(identity.runId, identity.agentId);
104
+ const exitCode = isRecord(payload) && typeof payload.exitCode === "number" ? payload.exitCode : null;
105
+ journal.receipt(identity.runId, { outcome, exitCode });
106
+ journal.terminal(identity.runId, outcome, detail ?? undefined);
107
+ opened.delete(identity.runId);
108
+ };
109
+
110
+ const unsubscribes = [
111
+ bus.on(BusChannels.DispatchProgress, (payload: DispatchProgressPayload) => {
112
+ const identity = runIdentity(payload);
113
+ if (identity === null) return;
114
+ // The display projection decides what a transcript line is; a
115
+ // heartbeat or a streaming delta is not one. Opening the run only
116
+ // once an event survives that filter keeps a heartbeat-only run from
117
+ // creating an empty journal directory.
118
+ const entry = runTailEntryFromEvent(payload.event);
119
+ if (entry === null) return;
120
+ ensureOpen(identity.runId, identity.agentId);
121
+ // Route resolution warnings use `message`, while worker transcript
122
+ // events generally project their text through `detail`. Preserve the
123
+ // warning at this dispatch-owned durability seam so fleet view does not
124
+ // render a content-free `route_warning` line.
125
+ const message =
126
+ isRecord(payload.event) && typeof payload.event.message === "string" ? payload.event.message : undefined;
127
+ journal.append(
128
+ identity.runId,
129
+ entry.detail === undefined && message !== undefined ? { ...entry, detail: message } : entry,
130
+ );
131
+ }),
132
+ bus.on(BusChannels.DispatchCompleted, (payload: DispatchCompletedPayload) => {
133
+ seal(payload.outcome, payload.outcomeDetail, payload);
134
+ }),
135
+ bus.on(BusChannels.DispatchFailed, (payload: DispatchFailedPayload) => {
136
+ seal(payload.outcome, payload.outcomeDetail, payload);
137
+ }),
138
+ ];
139
+
140
+ let stopped = false;
141
+ return {
142
+ stop(): void {
143
+ if (stopped) return;
144
+ stopped = true;
145
+ for (const unsubscribe of unsubscribes) unsubscribe();
146
+ opened.clear();
147
+ },
148
+ };
149
+ }