@iowarp/clio-coder 0.4.0 → 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 (581) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +116 -16
  3. package/dist/{acp-G5WJBNCT.js → acp-ZILU3AUO.js} +14 -14
  4. package/dist/{agents-FMV2Q5G4.js → agents-HYWGBGQR.js} +40 -29
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-3IDSJEIK.js → auth-N3QT7CBO.js} +21 -19
  7. package/dist/{builtins-XCZWXSC7.js → builtins-UJLMOVOV.js} +6 -6
  8. package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
  9. package/dist/{chunk-3BT2XMV4.js → chunk-2NM363SV.js} +50 -57
  10. package/dist/{chunk-J4W7KFM7.js → chunk-2VG7KLYV.js} +24 -279
  11. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  12. package/dist/{chunk-K5C3NCBD.js → chunk-3I5NY75V.js} +5 -5
  13. package/dist/{chunk-VAZSBTKF.js → chunk-3QSOM6PA.js} +2 -2
  14. package/dist/{chunk-TZ3SGWZZ.js → chunk-5QIAJV2D.js} +2 -2
  15. package/dist/{chunk-OQBA45DZ.js → chunk-5YHDIDBP.js} +2 -2
  16. package/dist/{chunk-NHLBIGRH.js → chunk-6CCS4G3W.js} +40 -17
  17. package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
  18. package/dist/{chunk-LDQ2ZF2M.js → chunk-6FN3E6KX.js} +5 -5
  19. package/dist/{chunk-X3YGUTOB.js → chunk-6HMJX2VU.js} +59 -59
  20. package/dist/{chunk-VEO4AP2K.js → chunk-6I5ILFOF.js} +3 -2
  21. package/dist/{chunk-B7OBL7PK.js → chunk-6NJQITNH.js} +18 -11
  22. package/dist/{chunk-IQ7KR472.js → chunk-6VC4OV3Z.js} +6 -3
  23. package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
  24. package/dist/{chunk-AB44T6BB.js → chunk-74YWRRU5.js} +8 -7
  25. package/dist/{chunk-SJ5ZKQ4S.js → chunk-7EPLI7VL.js} +2 -2
  26. package/dist/{chunk-HWHKMHUA.js → chunk-7OBGU7UB.js} +3 -3
  27. package/dist/{chunk-2OQE55CK.js → chunk-7PWAODYW.js} +2 -2
  28. package/dist/{chunk-IBEBSCYA.js → chunk-7RY5VZPH.js} +42 -33
  29. package/dist/{chunk-LQ3DZAMX.js → chunk-ABLSQ6JX.js} +2 -2
  30. package/dist/{chunk-QLFS5GO2.js → chunk-AFKWHWXF.js} +12 -22
  31. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  32. package/dist/{chunk-O6TL7WWY.js → chunk-AKB4GYDL.js} +4 -4
  33. package/dist/chunk-AP73CFDC.js +308 -0
  34. package/dist/{chunk-JDG2WCRO.js → chunk-BBTJOK6Y.js} +5 -5
  35. package/dist/{chunk-SP2RXXYO.js → chunk-BDPT6GTK.js} +10 -10
  36. package/dist/{chunk-NQQH3YT7.js → chunk-BJGUKIG4.js} +3 -3
  37. package/dist/{chunk-O4XIVISU.js → chunk-BTGG6BG2.js} +79 -38
  38. package/dist/chunk-BTK3SSSK.js +67 -0
  39. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  40. package/dist/chunk-BWW4HLO4.js +301 -0
  41. package/dist/{chunk-I5VEOC6I.js → chunk-C537JADH.js} +10 -10
  42. package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
  43. package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
  44. package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
  45. package/dist/chunk-D7E7WCDF.js +27 -0
  46. package/dist/{chunk-WZR7K7ZX.js → chunk-E67WX76H.js} +6 -6
  47. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  48. package/dist/chunk-EIMVLWB3.js +1842 -0
  49. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  50. package/dist/{chunk-MLKNTWH2.js → chunk-FYUN5KZ3.js} +21 -21
  51. package/dist/{chunk-YJX4SHTD.js → chunk-GIZNH63R.js} +1 -1
  52. package/dist/{chunk-X75E3D2N.js → chunk-GPPB3JBE.js} +18 -16
  53. package/dist/{chunk-GR5G2PVF.js → chunk-GVQJ5CCZ.js} +15 -10
  54. package/dist/chunk-HJWWJ6IL.js +184 -0
  55. package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
  56. package/dist/{chunk-VYMXRQI6.js → chunk-HUAS7ITX.js} +89 -93
  57. package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
  58. package/dist/{chunk-DYJP44XW.js → chunk-IG7BCQBA.js} +1 -1
  59. package/dist/{chunk-32KWKNSF.js → chunk-IXJT6DCX.js} +3 -3
  60. package/dist/{chunk-C2LTL2W6.js → chunk-J4HBWF6Y.js} +360 -172
  61. package/dist/chunk-J5LZHVIT.js +284 -0
  62. package/dist/{chunk-QLL7ILRG.js → chunk-JA5QWE4Z.js} +510 -202
  63. package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
  64. package/dist/{chunk-36EJLSQQ.js → chunk-JZWT5J3Y.js} +4 -4
  65. package/dist/{chunk-HZHHCK24.js → chunk-K6BF4U2H.js} +476 -322
  66. package/dist/{chunk-Z2RR6MAK.js → chunk-MA3H6DM5.js} +6 -6
  67. package/dist/{chunk-CODPRO7Q.js → chunk-MOPSG2X7.js} +6 -6
  68. package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
  69. package/dist/{chunk-YDFRH54B.js → chunk-N5UK64DP.js} +4 -4
  70. package/dist/chunk-NDDGJUXD.js +81 -0
  71. package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
  72. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  73. package/dist/{chunk-W5VSYASO.js → chunk-OJTRZGR3.js} +46 -87
  74. package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
  75. package/dist/{chunk-3URVFKWK.js → chunk-PJJ6MY27.js} +5 -5
  76. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  77. package/dist/{chunk-GKF55TAZ.js → chunk-PVAMAVBB.js} +3 -2
  78. package/dist/{chunk-6DB53AJS.js → chunk-QKIFBZKT.js} +7 -7
  79. package/dist/{chunk-HJJTYUHX.js → chunk-QMXC4JB7.js} +20 -20
  80. package/dist/chunk-QTFGO774.js +644 -0
  81. package/dist/{chunk-CY6FY24N.js → chunk-R23Z6K6I.js} +2 -2
  82. package/dist/{chunk-ULC6OTWO.js → chunk-R32CLGZ6.js} +13 -13
  83. package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
  84. package/dist/{chunk-F4CKPOEQ.js → chunk-SCYB3HA4.js} +72 -26
  85. package/dist/{chunk-LY4S7GJC.js → chunk-SINK3QR6.js} +18 -16
  86. package/dist/{chunk-U77AMWDL.js → chunk-TD3PGPQA.js} +43 -22
  87. package/dist/{chunk-QBJA7R7N.js → chunk-THYWACCR.js} +2 -2
  88. package/dist/{chunk-QREDIESB.js → chunk-TVH4ONAM.js} +14 -8
  89. package/dist/chunk-U2WB7TZS.js +271 -0
  90. package/dist/{chunk-KFZI4NIL.js → chunk-UAPGZHYC.js} +145 -31
  91. package/dist/{chunk-DQITNCXG.js → chunk-UEDMSP56.js} +29 -14
  92. package/dist/{chunk-3XML7CDN.js → chunk-UXN6JT4W.js} +2 -2
  93. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  94. package/dist/{chunk-BPKCPIL7.js → chunk-VEGN6WIQ.js} +2 -2
  95. package/dist/chunk-VKFQTNDV.js +66 -0
  96. package/dist/{chunk-7MCTRUCE.js → chunk-VKRH2TCS.js} +2 -2
  97. package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
  98. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  99. package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
  100. package/dist/{chunk-SUCTJL45.js → chunk-WR6U3OVP.js} +3 -3
  101. package/dist/{chunk-BUMFYQFY.js → chunk-XKA2ICR3.js} +124 -113
  102. package/dist/{chunk-UXMFQ54G.js → chunk-Y45G3AXC.js} +39 -39
  103. package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
  104. package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
  105. package/dist/{chunk-V5DHCITQ.js → chunk-ZAZB4JMW.js} +23 -12
  106. package/dist/{chunk-Z4TXYIEG.js → chunk-ZJLUDYFY.js} +9 -9
  107. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  108. package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
  109. package/dist/cli/index.js +36 -36
  110. package/dist/{clio-2JXHBBY5.js → clio-IT3G3VQH.js} +12 -13
  111. package/dist/{code-nav-3YYRMYNF.js → code-nav-RK6S7F6E.js} +5 -5
  112. package/dist/codewiki/build-worker.js +1 -1
  113. package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
  114. package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
  115. package/dist/{config-QZPCMYSO.js → config-3QZRWZJF.js} +53 -49
  116. package/dist/{configure-TEGEBYCA.js → configure-FL7Y3KJF.js} +25 -22
  117. package/dist/{context-E6H5RNMC.js → context-5HE7ODYK.js} +47 -43
  118. package/dist/{context-AV7OEZ4D.js → context-KYQFRVDC.js} +11 -11
  119. package/dist/{context-GSXUE4CT.js → context-XNHL75JV.js} +32 -19
  120. package/dist/{context-clear-SHIBYK6T.js → context-clear-N545L53A.js} +47 -43
  121. package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-QHKXSV2F.js} +10 -9
  122. package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-RGIE5PCT.js} +56 -47
  123. package/dist/{docs-23KQS3XK.js → docs-5NAF6AU7.js} +5 -11
  124. package/dist/doctor-ZGPEGHIP.js +772 -0
  125. package/dist/{eval-TFBYQH4H.js → eval-GXLL44RD.js} +63 -45
  126. package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-HBWSWQOK.js} +7 -8
  127. package/dist/{evidence-ERGESKGN.js → evidence-HWLBRH3Q.js} +44 -40
  128. package/dist/{evolve-VDXTSYCJ.js → evolve-FTZBMNVW.js} +43 -39
  129. package/dist/{extensions-7BGBHN57.js → extensions-VHRBEID7.js} +4 -4
  130. package/dist/{fleet-2RRVDF2V.js → fleet-CKZHJWZJ.js} +86 -73
  131. package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EXDXBMV6.js} +10 -9
  132. package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-OTHB6KRL.js} +5 -5
  133. package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-YTEZUCUT.js} +13 -11
  134. package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-SS6YMDCK.js} +44 -41
  135. package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-PBY4VYOM.js} +5 -9
  136. package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-KMEM5L3S.js} +16 -13
  137. package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-QD5M7E7Q.js} +42 -39
  138. package/dist/{fleet-view-ZCON35AG.js → fleet-view-WAMJYNDT.js} +44 -52
  139. package/dist/{init-DN2WWLFE.js → init-5XQRBOFV.js} +63 -58
  140. package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
  141. package/dist/{interop-OZBKXAYL.js → interop-34TVO25M.js} +13 -11
  142. package/dist/{library-YWZG7IMW.js → library-3QY6KF57.js} +17 -14
  143. package/dist/{memory-I4C4HMLW.js → memory-L4UTIIIW.js} +45 -41
  144. package/dist/{models-CEYXJBO6.js → models-ZVX3QOWE.js} +39 -31
  145. package/dist/{monitor-NZ6GCI3P.js → monitor-CEKVSYTS.js} +50 -46
  146. package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-77BAP6BC.js} +1807 -1039
  147. package/dist/{panes-KY6W3V2E.js → panes-7STHOAUJ.js} +4 -4
  148. package/dist/{panes-HMABYVO4.js → panes-SHAUIRXY.js} +10 -8
  149. package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
  150. package/dist/{reset-DQ6FGCSH.js → reset-EOLM7GVE.js} +7 -8
  151. package/dist/{resources-BB3MVJMD.js → resources-74GKTLSF.js} +17 -13
  152. package/dist/{run-H2GQDUER.js → run-HBAUJNNZ.js} +86 -76
  153. package/dist/{share-GTJN6A5O.js → share-G3APVLVP.js} +17 -14
  154. package/dist/{skills-L55TEW6R.js → skills-35HHUKCR.js} +19 -16
  155. package/dist/{skills-eval-XVXPH2JI.js → skills-eval-QN4HSHDC.js} +55 -57
  156. package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-J357J34F.js} +15 -12
  157. package/dist/{slash-commands-ZSGASKJC.js → slash-commands-JZZCQA32.js} +31 -29
  158. package/dist/{steer-RZGSCY4R.js → steer-XAVHJM22.js} +3 -3
  159. package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
  160. package/dist/{targets-NCPZ644J.js → targets-DSM6CY3M.js} +59 -53
  161. package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-JOPFUVEM.js} +14 -9
  162. package/dist/{tools-DAF3DI3C.js → tools-MKNWVPBH.js} +10 -8
  163. package/dist/{trace-FYVW2MQA.js → trace-ECQ7TIYZ.js} +48 -3
  164. package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
  165. package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
  166. package/dist/{upgrade-3XPP6OQL.js → upgrade-H7TOM7YL.js} +35 -62
  167. package/dist/{usage-3NLHGTU2.js → usage-X52N3IDJ.js} +51 -48
  168. package/dist/{verifiers-SSQONKRT.js → verifiers-EJTVVSMA.js} +10 -9
  169. package/dist/{verify-3U6J7FZI.js → verify-YJL6XET2.js} +9 -8
  170. package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPIFL3LL.js} +1 -2
  171. package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-4NDZTQ4B.js} +66 -63
  172. package/dist/{with-panes-MKB46MPQ.js → with-panes-OBOBFIIR.js} +62 -26
  173. package/dist/worker/entry.js +57 -52
  174. package/docs/acp.md +1 -1
  175. package/docs/built-in-agents.md +40 -32
  176. package/docs/commands-and-modes.md +9 -3
  177. package/docs/config-knobs-audit.md +3 -0
  178. package/docs/configuration-and-targets.md +105 -164
  179. package/docs/environment-variables.md +2 -1
  180. package/docs/exit-codes-and-output.md +2 -0
  181. package/docs/fleet-demo-runbook.md +6 -3
  182. package/docs/fleet-dispatch.md +8 -6
  183. package/docs/installation-and-lifecycle.md +1 -1
  184. package/docs/release-cut-checklist.md +164 -177
  185. package/docs/trace-store.md +15 -10
  186. package/docs/troubleshooting.md +1 -1
  187. package/evals/README.md +5 -0
  188. package/evals/behavioral-corpus-grader.mjs +103 -0
  189. package/evals/behavioral-machinery-baseline.json +2276 -0
  190. package/evals/behavioral-machinery-driver.ts +250 -0
  191. package/evals/behavioral-machinery-support.ts +253 -0
  192. package/evals/behavioral-machinery.yaml +614 -0
  193. package/evals/behavioral-model-negative-control.yaml +68 -0
  194. package/evals/behavioral-model.yaml +216 -0
  195. package/evals/fixtures/behavioral-facts.txt +3 -0
  196. package/evals/fixtures/behavioral-main.ts +7 -0
  197. package/evals/fixtures/decoy/note.txt +2 -0
  198. package/evals/fixtures/private/credentials.txt +1 -0
  199. package/evals/tracked-metrics-baseline.yaml +229 -0
  200. package/evals/tracked-metrics-grader.mjs +129 -0
  201. package/package.json +5 -15
  202. package/skills/README.md +6 -6
  203. package/skills/coding/ast-grep/SKILL.md +8 -2
  204. package/skills/coding/coding-standards/SKILL.md +8 -2
  205. package/skills/coding/prototype/SKILL.md +8 -2
  206. package/skills/coding/tdd/SKILL.md +8 -2
  207. package/skills/context/context-handoff/SKILL.md +12 -3
  208. package/skills/context/context-handoff/evals.md +3 -3
  209. package/skills/context/context-prime/SKILL.md +8 -2
  210. package/skills/context/context-prime/evals.md +2 -2
  211. package/skills/git/file-ticket/SKILL.md +9 -4
  212. package/skills/git/file-ticket/evals.md +2 -2
  213. package/skills/git/fix-issue/SKILL.md +12 -5
  214. package/skills/git/fix-issue/evals.md +4 -4
  215. package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
  216. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  217. package/skills/git/ship/SKILL.md +9 -3
  218. package/skills/git/ship/evals.md +4 -4
  219. package/skills/git/worktree-create/SKILL.md +7 -2
  220. package/skills/git/worktree-create/evals.md +6 -6
  221. package/skills/git/worktree-merge/SKILL.md +7 -2
  222. package/skills/git/worktree-merge/evals.md +6 -6
  223. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
  224. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
  225. package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
  226. package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
  227. package/skills/meta/credentials/SKILL.md +9 -2
  228. package/skills/meta/find-skills/SKILL.md +8 -2
  229. package/skills/meta/herdr/SKILL.md +8 -2
  230. package/skills/meta/skill-craft/SKILL.md +21 -4
  231. package/skills/planning/architecture/SKILL.md +9 -3
  232. package/skills/planning/backlog/SKILL.md +8 -2
  233. package/skills/planning/prd/SKILL.md +8 -2
  234. package/skills/planning/product-intent/SKILL.md +8 -2
  235. package/skills/planning/tech-spec/SKILL.md +9 -3
  236. package/skills/registry.yaml +66 -66
  237. package/skills/research/arxiv-literature/SKILL.md +8 -2
  238. package/skills/research/experiment-protocol/SKILL.md +9 -2
  239. package/skills/research/scientific-debugging/SKILL.md +9 -2
  240. package/skills/research/scientific-debugging/evals.md +2 -2
  241. package/skills/research/scientific-modernization/SKILL.md +9 -2
  242. package/skills/skill-marketplace.json +257 -38
  243. package/skills/workflow/cut-it/SKILL.md +10 -2
  244. package/skills/workflow/design-council/SKILL.md +11 -2
  245. package/skills/workflow/grill-me/SKILL.md +8 -2
  246. package/skills/workflow/workflow-distiller/SKILL.md +8 -2
  247. package/src/cli/acp.ts +2 -2
  248. package/src/cli/auth.ts +2 -2
  249. package/src/cli/bootstrap-generate.ts +5 -5
  250. package/src/cli/clio.ts +6 -1
  251. package/src/cli/config-inspect.ts +3 -3
  252. package/src/cli/configure-interop.ts +1 -1
  253. package/src/cli/configure.ts +27 -27
  254. package/src/cli/default-target.ts +1 -1
  255. package/src/cli/docs.ts +6 -6
  256. package/src/cli/doctor-naming.ts +323 -0
  257. package/src/cli/doctor-panes.ts +46 -14
  258. package/src/cli/doctor-toolchain.ts +29 -8
  259. package/src/cli/doctor.ts +15 -1
  260. package/src/cli/eval-inventory.ts +8 -8
  261. package/src/cli/evidence-detail.ts +1 -1
  262. package/src/cli/evidence-inventory.ts +1 -1
  263. package/src/cli/fleet-decisions.ts +1 -1
  264. package/src/cli/fleet-inspect.ts +1 -1
  265. package/src/cli/fleet-preflight.ts +1 -1
  266. package/src/cli/fleet-verify.ts +1 -1
  267. package/src/cli/fleet-view.ts +40 -23
  268. package/src/cli/fleet.ts +8 -5
  269. package/src/cli/interop-inspect.ts +2 -2
  270. package/src/cli/models.ts +3 -3
  271. package/src/cli/modes/print.ts +1 -1
  272. package/src/cli/reset.ts +1 -1
  273. package/src/cli/run.ts +11 -15
  274. package/src/cli/share.ts +1 -1
  275. package/src/cli/skills-eval.ts +11 -11
  276. package/src/cli/targets.ts +23 -24
  277. package/src/cli/trace-inspect.ts +1 -1
  278. package/src/cli/trace.ts +41 -0
  279. package/src/cli/uninstall.ts +2 -2
  280. package/src/cli/upgrade.ts +29 -34
  281. package/src/cli/usage.ts +2 -2
  282. package/src/cli/validate-model.ts +1 -1
  283. package/src/cli/verifiers-inspect.ts +1 -1
  284. package/src/cli/wiki-generate.ts +5 -5
  285. package/src/core/bash-exec.ts +1 -1
  286. package/src/core/boot-trace.ts +3 -3
  287. package/src/core/bus-trace.ts +2 -2
  288. package/src/core/compile-cache.ts +1 -1
  289. package/src/core/config.ts +1062 -886
  290. package/src/core/defaults.ts +321 -528
  291. package/src/core/domain-loader.ts +6 -4
  292. package/src/core/event-bus.ts +1 -1
  293. package/src/core/file-references.ts +78 -88
  294. package/src/core/git-commit-attribution.ts +3 -9
  295. package/src/core/guardrails.ts +24 -4
  296. package/src/core/naming-compat.ts +45 -0
  297. package/src/core/naming-events.ts +62 -0
  298. package/src/core/recent-models.ts +1 -7
  299. package/src/core/residency-protection.ts +4 -8
  300. package/src/core/resolve-config-value.ts +1 -1
  301. package/src/core/response-model-id.ts +0 -14
  302. package/src/core/session-routing.ts +84 -74
  303. package/src/core/skill-activation.ts +18 -0
  304. package/src/core/termination.ts +4 -4
  305. package/src/core/timers.ts +2 -12
  306. package/src/domains/agents/catalog.ts +2 -12
  307. package/src/domains/agents/extension.ts +3 -3
  308. package/src/domains/agents/registry.ts +7 -7
  309. package/src/domains/agents/result-contract.ts +1 -1
  310. package/src/domains/agents/spec.ts +0 -11
  311. package/src/domains/config/classify.ts +35 -47
  312. package/src/domains/config/extension.ts +5 -5
  313. package/src/domains/config/keybindings.ts +48 -47
  314. package/src/domains/config/watcher.ts +1 -1
  315. package/src/domains/context/codewiki/indexer.ts +1 -1
  316. package/src/domains/context/extension.ts +3 -3
  317. package/src/domains/context/prompt-context.ts +1 -1
  318. package/src/domains/context/wiki/assemble.ts +2 -2
  319. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  320. package/src/domains/context/working-set/replay/report.ts +1 -1
  321. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  322. package/src/domains/dispatch/active-route-planner.ts +2 -2
  323. package/src/domains/dispatch/agent-candidates.ts +1 -1
  324. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  325. package/src/domains/dispatch/agent-ledger.ts +1 -1
  326. package/src/domains/dispatch/assignment.ts +5 -5
  327. package/src/domains/dispatch/capacity-lease.ts +2 -5
  328. package/src/domains/dispatch/code-step.ts +1 -1
  329. package/src/domains/dispatch/contract.ts +2 -2
  330. package/src/domains/dispatch/extension.ts +65 -61
  331. package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
  332. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  333. package/src/domains/dispatch/fleet-run.ts +0 -7
  334. package/src/domains/dispatch/gate-decisions.ts +25 -14
  335. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  336. package/src/domains/dispatch/path-scope.ts +0 -61
  337. package/src/domains/dispatch/placement.ts +2 -2
  338. package/src/domains/dispatch/receipt-findings.ts +1 -1
  339. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  340. package/src/domains/dispatch/reservation-store.ts +0 -23
  341. package/src/domains/dispatch/route-decision.ts +1 -1
  342. package/src/domains/dispatch/route-history.ts +1 -1
  343. package/src/domains/dispatch/route-policy.ts +1 -1
  344. package/src/domains/dispatch/route-readiness.ts +0 -28
  345. package/src/domains/dispatch/run-event-journal.ts +6 -5
  346. package/src/domains/dispatch/tool-stats.ts +1 -1
  347. package/src/domains/dispatch/transport.ts +2 -19
  348. package/src/domains/dispatch/types.ts +3 -3
  349. package/src/domains/dispatch/worker-protocol.ts +2 -2
  350. package/src/domains/eval/artifacts/store.ts +5 -4
  351. package/src/domains/eval/compare/thresholds.ts +0 -8
  352. package/src/domains/eval/execution-provenance.ts +1 -1
  353. package/src/domains/eval/metrics/token-stream.ts +0 -7
  354. package/src/domains/eval/report.ts +1 -1
  355. package/src/domains/eval/runner.ts +1 -1
  356. package/src/domains/eval/runners/clio-run.ts +7 -6
  357. package/src/domains/eval/runners/external-command.ts +4 -3
  358. package/src/domains/eval/schema/artifact.ts +1 -1
  359. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  360. package/src/domains/eval/schema/behavioral.ts +7 -6
  361. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  362. package/src/domains/eval/schema/naming.ts +10 -0
  363. package/src/domains/eval/schema/suite.ts +2 -2
  364. package/src/domains/eval/schema/validate.ts +9 -5
  365. package/src/domains/eval/schema/verdict.ts +4 -2
  366. package/src/domains/eval/store.ts +12 -2
  367. package/src/domains/eval/suites/run.ts +12 -6
  368. package/src/domains/eval/types.ts +1 -1
  369. package/src/domains/eval/workspaces/git.ts +1 -1
  370. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  371. package/src/domains/evidence/build.ts +13 -5
  372. package/src/domains/interop/consent.ts +7 -7
  373. package/src/domains/interop/extension.ts +1 -1
  374. package/src/domains/lifecycle/doctor.ts +27 -21
  375. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  376. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  377. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  378. package/src/domains/lifecycle/migrations/index.ts +20 -1
  379. package/src/domains/lifecycle/naming-history.ts +153 -0
  380. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  381. package/src/domains/lifecycle/naming-resources.ts +261 -0
  382. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  383. package/src/domains/lifecycle/naming-yazi.ts +81 -0
  384. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  385. package/src/domains/memory/task-memory-handoff.ts +6 -3
  386. package/src/domains/middleware/index.ts +7 -0
  387. package/src/domains/middleware/marketplace-offer.ts +339 -0
  388. package/src/domains/middleware/runtime.ts +2 -2
  389. package/src/domains/mux/contract.ts +157 -25
  390. package/src/domains/mux/detect.ts +29 -5
  391. package/src/domains/mux/dock-controller.ts +365 -0
  392. package/src/domains/mux/extension.ts +7 -1
  393. package/src/domains/mux/index.ts +20 -0
  394. package/src/domains/mux/operations.ts +28 -0
  395. package/src/domains/mux/protocol.ts +19 -6
  396. package/src/domains/mux/socket-client.ts +167 -19
  397. package/src/domains/mux/types.ts +49 -6
  398. package/src/domains/mux/yazi/event-stream.ts +6 -4
  399. package/src/domains/mux/yazi/profile.ts +1 -1
  400. package/src/domains/mux/yazi/session.ts +26 -3
  401. package/src/domains/observability/extension.ts +1 -1
  402. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  403. package/src/domains/observability/projection.ts +1 -1
  404. package/src/domains/observability/trace-store.ts +22 -12
  405. package/src/domains/prompts/compiler.ts +2 -2
  406. package/src/domains/prompts/extension.ts +3 -3
  407. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
  408. package/src/domains/prompts/fragments/operating/skills.md +25 -18
  409. package/src/domains/providers/extension.ts +5 -5
  410. package/src/domains/providers/knowledge-base-path.ts +1 -1
  411. package/src/domains/providers/model-runtime-capabilities.ts +14 -2
  412. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  413. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
  414. package/src/domains/providers/plugins.ts +1 -1
  415. package/src/domains/providers/resolver.ts +1 -1
  416. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  417. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  418. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  419. package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
  420. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  421. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  422. package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
  423. package/src/domains/providers/types/knowledge-base.ts +13 -0
  424. package/src/domains/providers/types/local-model-quirks.ts +2 -2
  425. package/src/domains/providers/types/target-descriptor.ts +3 -3
  426. package/src/domains/resources/extension.ts +1 -1
  427. package/src/domains/resources/library.ts +6 -6
  428. package/src/domains/resources/prompts/loader.ts +1 -1
  429. package/src/domains/resources/skills/content-hash.ts +7 -6
  430. package/src/domains/resources/skills/evals.ts +1 -1
  431. package/src/domains/resources/skills/install.ts +36 -12
  432. package/src/domains/resources/skills/loader.ts +39 -13
  433. package/src/domains/resources/skills/marketplace.ts +21 -2
  434. package/src/domains/resources/skills/promotion.ts +214 -0
  435. package/src/domains/safety/audit.ts +2 -2
  436. package/src/domains/safety/finish-contract.ts +2 -1
  437. package/src/domains/safety/run-effects.ts +1 -1
  438. package/src/domains/scheduling/extension.ts +4 -4
  439. package/src/domains/session/archive-readers.ts +9 -1
  440. package/src/domains/session/compaction/branch-summary.ts +4 -0
  441. package/src/domains/session/compaction/compact.ts +1 -1
  442. package/src/domains/session/compaction/tokens.ts +4 -0
  443. package/src/domains/session/context-accounting.ts +1 -1
  444. package/src/domains/session/decision-board.ts +1 -1
  445. package/src/domains/session/extension.ts +1 -1
  446. package/src/domains/session/handoff.ts +2 -2
  447. package/src/domains/session/prompt-manifest.ts +0 -5
  448. package/src/domains/session/protected-artifact-journal.ts +12 -6
  449. package/src/domains/session/retry.ts +1 -1
  450. package/src/domains/share/archive.ts +85 -36
  451. package/src/domains/toolchain/install.ts +1 -1
  452. package/src/engine/acp/adapter.ts +3 -3
  453. package/src/engine/acp/event-mapper.ts +3 -3
  454. package/src/engine/acp/server.ts +27 -26
  455. package/src/engine/acp/tool-mediator.ts +2 -2
  456. package/src/engine/acp/types.ts +1 -1
  457. package/src/engine/alcf-oauth.ts +5 -5
  458. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  459. package/src/engine/api-registry.ts +1 -1
  460. package/src/engine/apis/llamacpp-residency.ts +1 -19
  461. package/src/engine/apis/lmstudio.ts +1 -6
  462. package/src/engine/apis/ollama-native.ts +3 -3
  463. package/src/engine/apis/openai-completions.ts +2 -2
  464. package/src/engine/apis/residency.ts +3 -9
  465. package/src/engine/claude/sdk-module.ts +1 -12
  466. package/src/engine/claude/sdk-runtime.ts +6 -6
  467. package/src/engine/claude/subprocess-runtime.ts +1 -1
  468. package/src/engine/claude/tool-safety.ts +4 -4
  469. package/src/engine/loop-guard.ts +0 -5
  470. package/src/engine/session.ts +14 -7
  471. package/src/engine/tui-primitives.ts +1 -1
  472. package/src/engine/worker-events.ts +6 -6
  473. package/src/engine/worker-runtime.ts +14 -13
  474. package/src/entry/orchestrator.ts +107 -88
  475. package/src/interactive/application-controller.ts +21 -21
  476. package/src/interactive/bus-notices.ts +2 -2
  477. package/src/interactive/chat-loop.ts +8 -8
  478. package/src/interactive/chat-panel.ts +1 -1
  479. package/src/interactive/clio-editor.ts +105 -1
  480. package/src/interactive/context-activity.ts +8 -6
  481. package/src/interactive/context-meter.ts +3 -6
  482. package/src/interactive/context-overlay.ts +1 -1
  483. package/src/interactive/cost-overlay.ts +1 -1
  484. package/src/interactive/council-grid.ts +2 -2
  485. package/src/interactive/dispatch-board.ts +30 -33
  486. package/src/interactive/editor-bash.ts +21 -0
  487. package/src/interactive/editor-steer.ts +9 -4
  488. package/src/interactive/editor-submit.ts +24 -18
  489. package/src/interactive/external-editor.ts +1 -1
  490. package/src/interactive/file-reference-completion.ts +360 -0
  491. package/src/interactive/footer/dashboard.ts +15 -17
  492. package/src/interactive/footer/notifications.ts +14 -8
  493. package/src/interactive/footer/widgets.ts +2 -44
  494. package/src/interactive/interactive-application.ts +79 -59
  495. package/src/interactive/interactive-event-projection.ts +1 -1
  496. package/src/interactive/interactive-input-runtime.ts +2 -2
  497. package/src/interactive/interactive-presentation.ts +21 -16
  498. package/src/interactive/interactive-shell.ts +2 -2
  499. package/src/interactive/interactive-slash-runtime.ts +63 -17
  500. package/src/interactive/interactive-subscriptions.ts +1 -1
  501. package/src/interactive/interactive-tickers.ts +1 -1
  502. package/src/interactive/keybinding-manager.ts +4 -4
  503. package/src/interactive/layout.ts +1 -1
  504. package/src/interactive/memory-overlay.ts +2 -2
  505. package/src/interactive/modal-marker.ts +2 -21
  506. package/src/interactive/mutation-preview.ts +1 -1
  507. package/src/interactive/overlay-frame.ts +4 -12
  508. package/src/interactive/overlay-general-openers.ts +6 -2
  509. package/src/interactive/overlay-key-routing.ts +7 -7
  510. package/src/interactive/overlay-lifecycle.ts +1 -1
  511. package/src/interactive/overlay-model-selectors.ts +3 -3
  512. package/src/interactive/overlays/agents.ts +2 -2
  513. package/src/interactive/overlays/ask-user.ts +25 -11
  514. package/src/interactive/overlays/context-reset.ts +28 -4
  515. package/src/interactive/overlays/cwd-fallback.ts +28 -4
  516. package/src/interactive/overlays/decisions.ts +4 -2
  517. package/src/interactive/overlays/fleet-run-approval.ts +3 -3
  518. package/src/interactive/overlays/handoff-review.ts +2 -2
  519. package/src/interactive/overlays/interop.ts +1 -1
  520. package/src/interactive/overlays/library-install-confirm.ts +1 -1
  521. package/src/interactive/overlays/message-picker.ts +1 -1
  522. package/src/interactive/overlays/model-selector.ts +39 -31
  523. package/src/interactive/overlays/prompts.ts +10 -4
  524. package/src/interactive/overlays/session-selector.ts +2 -2
  525. package/src/interactive/overlays/settings.ts +339 -293
  526. package/src/interactive/overlays/side-question.ts +2 -2
  527. package/src/interactive/overlays/skills-hub.ts +8 -8
  528. package/src/interactive/overlays/tree-selector.ts +2 -2
  529. package/src/interactive/panes-runtime.ts +36 -10
  530. package/src/interactive/permission-overlay.ts +2 -2
  531. package/src/interactive/renderers/retry-status.ts +12 -4
  532. package/src/interactive/renderers/tool-execution.ts +4 -4
  533. package/src/interactive/session-transcript.ts +3 -3
  534. package/src/interactive/slash-autocomplete.ts +454 -165
  535. package/src/interactive/slash-commands.ts +279 -183
  536. package/src/interactive/slash-spec.ts +160 -17
  537. package/src/interactive/status/controller.ts +2 -2
  538. package/src/interactive/stream-pacing-policy.ts +1 -1
  539. package/src/interactive/tasks-overlay.ts +20 -13
  540. package/src/interactive/terminal-lease.ts +6 -7
  541. package/src/interactive/turn-context.ts +11 -11
  542. package/src/interactive/turn-persistence.ts +2 -2
  543. package/src/interactive/turn-prewarm.ts +2 -2
  544. package/src/interactive/turn-runtime.ts +8 -8
  545. package/src/interactive/turn-state.ts +1 -1
  546. package/src/interactive/view/artifacts.ts +12 -9
  547. package/src/interactive/view/view-overlay.ts +13 -10
  548. package/src/interactive/watch-pane.ts +38 -10
  549. package/src/interactive/welcome-dashboard.ts +15 -15
  550. package/src/interactive/worker-progress.ts +4 -4
  551. package/src/interactive/worker-receipts.ts +1 -1
  552. package/src/interactive/worker-stream.ts +1 -4
  553. package/src/interactive/yazi-bridge.ts +12 -5
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/builtin-tool-catalog.ts +1 -1
  557. package/src/tools/compete-worktrees.ts +27 -17
  558. package/src/tools/context/index.ts +15 -1
  559. package/src/tools/dispatch-admission.ts +4 -2
  560. package/src/tools/dispatch-arguments.ts +1 -1
  561. package/src/tools/dispatch-plan.ts +0 -11
  562. package/src/tools/dispatch-run-events.ts +12 -10
  563. package/src/tools/dispatch-runner.ts +11 -6
  564. package/src/tools/dispatch.ts +1 -1
  565. package/src/tools/find.ts +1 -6
  566. package/src/tools/monitor.ts +4 -4
  567. package/src/tools/observers.ts +0 -33
  568. package/src/tools/task-worktree.ts +28 -7
  569. package/src/tools/verify/authoring.ts +3 -6
  570. package/src/tools/verify/frontend.ts +1 -1
  571. package/src/tools/web-fetch.ts +1 -1
  572. package/src/worker/entry.ts +4 -3
  573. package/src/worker/protocol.ts +16 -14
  574. package/src/worker/spec-contract.ts +2 -2
  575. package/src/worker/stdin-demux.ts +2 -2
  576. package/dist/chunk-GXNLGKAB.js +0 -571
  577. package/dist/chunk-VFA6GDY5.js +0 -1625
  578. package/dist/doctor-QOA5FNY5.js +0 -313
  579. package/src/engine/apis/degraded-inference.ts +0 -95
  580. /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
  581. /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
@@ -151,7 +151,6 @@ const RECEIPT_REQUIRED_KEYS = [
151
151
  "costUsd",
152
152
  "compiledPromptHash",
153
153
  "staticCompositionHash",
154
- "clioVersion",
155
154
  "piMonoVersion",
156
155
  "platform",
157
156
  "nodeVersion",
@@ -255,7 +254,7 @@ export function receiptFilePath(stateDir: string, runId: string): string {
255
254
  return join(stateDir, "receipts", `${runId}.json`);
256
255
  }
257
256
 
258
- export function runLedgerPath(stateDir: string): string {
257
+ function runLedgerPath(stateDir: string): string {
259
258
  return join(stateDir, "runs.json");
260
259
  }
261
260
 
@@ -317,7 +316,7 @@ type ReadLedgerResult = { ok: true; envelope: RunEnvelope } | { ok: false; reaso
317
316
  * the same file and ledger row, projected through the shared boundary so the
318
317
  * receipt view spells its verdict exactly as the board and the CLI do.
319
318
  */
320
- export function receiptTrustDetail(stateDir: string, runId: string): string {
319
+ function receiptTrustDetail(stateDir: string, runId: string): string {
321
320
  try {
322
321
  const receipt = JSON.parse(readFileSync(receiptFilePath(stateDir, runId), "utf8")) as RunReceipt;
323
322
  const ledger = readRunEnvelope(stateDir, runId);
@@ -335,7 +334,7 @@ function readRunEnvelope(stateDir: string, runId: string): ReadLedgerResult {
335
334
  return { ok: false, reason: runs.length === 0 ? "run ledger not found" : "run not found in ledger" };
336
335
  }
337
336
 
338
- export function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerifyResult {
337
+ function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerifyResult {
339
338
  const target = receiptFilePath(stateDir, runId);
340
339
  let raw: string;
341
340
  try {
@@ -358,6 +357,9 @@ export function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerif
358
357
  for (const key of RECEIPT_REQUIRED_KEYS) {
359
358
  if (!(key in r)) return { ok: false, reason: `missing field: ${key}` };
360
359
  }
360
+ if (!("clioCoderVersion" in r) && !("clioVersion" in r)) {
361
+ return { ok: false, reason: "missing field: clioCoderVersion" };
362
+ }
361
363
  if (!isNonEmptyString(r.runId)) {
362
364
  return { ok: false, reason: `runId invalid: ${String(r.runId)}` };
363
365
  }
@@ -413,8 +415,9 @@ export function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerif
413
415
  if (!isIso8601(r.endedAt)) {
414
416
  return { ok: false, reason: `endedAt not ISO-8601: ${String(r.endedAt)}` };
415
417
  }
416
- if (typeof r.clioVersion !== "string" || r.clioVersion.length === 0) {
417
- return { ok: false, reason: "clioVersion empty" };
418
+ const clioCoderVersion = r.clioCoderVersion ?? r.clioVersion;
419
+ if (typeof clioCoderVersion !== "string" || clioCoderVersion.length === 0) {
420
+ return { ok: false, reason: "clioCoderVersion empty" };
418
421
  }
419
422
  if (!isNonEmptyString(r.piMonoVersion)) {
420
423
  return { ok: false, reason: `piMonoVersion invalid: ${String(r.piMonoVersion)}` };
@@ -453,7 +456,7 @@ export function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerif
453
456
 
454
457
  const RECEIPT_FILE_FAILURE = /^(?:receipt file not found|read error:)/u;
455
458
  const RECEIPT_CONTRACT_FAILURE =
456
- /^(?:invalid json:|receipt is not an object|missing field:|runId invalid:|runId mismatch:|agentId invalid:|task invalid:|targetId invalid:|wireModelId invalid:|runtimeId invalid:|runtimeKind invalid:|exitCode out of range:|tokenCount out of range:|inputTokenCount out of range:|outputTokenCount out of range:|cacheReadTokenCount out of range:|cacheWriteTokenCount out of range:|costUsd out of range:|reasoningTokenCount out of range:|startedAt not ISO-8601:|endedAt not ISO-8601:|clioVersion empty|piMonoVersion invalid:|platform invalid:|nodeVersion invalid:|toolCalls out of range:|toolStats\[|compiledPromptHash invalid:|staticCompositionHash invalid:|sessionId invalid:|integrity invalid|execution role invalid|routing intent invalid|route decision invalid)/u;
459
+ /^(?:invalid json:|receipt is not an object|missing field:|runId invalid:|runId mismatch:|agentId invalid:|task invalid:|targetId invalid:|wireModelId invalid:|runtimeId invalid:|runtimeKind invalid:|exitCode out of range:|tokenCount out of range:|inputTokenCount out of range:|outputTokenCount out of range:|cacheReadTokenCount out of range:|cacheWriteTokenCount out of range:|costUsd out of range:|reasoningTokenCount out of range:|startedAt not ISO-8601:|endedAt not ISO-8601:|clioCoderVersion empty|piMonoVersion invalid:|platform invalid:|nodeVersion invalid:|toolCalls out of range:|toolStats\[|compiledPromptHash invalid:|staticCompositionHash invalid:|sessionId invalid:|integrity invalid|execution role invalid|routing intent invalid|route decision invalid)/u;
457
460
  const LEDGER_FAILURE = /^(?:run ledger not found|run not found in ledger|ledger mismatch:)/u;
458
461
 
459
462
  function receiptIntegrityDigest(value: unknown): string | null {
@@ -586,7 +589,7 @@ function splitLinesCapped(text: string, path?: string, maxLines = VIEW_ARTIFACT_
586
589
  return [...lines.slice(0, maxLines), `[truncated, open file directly${path ? `: ${path}` : ""}]`];
587
590
  }
588
591
 
589
- export async function loadJsonFileLines(path: string): Promise<ViewArtifactLoadResult> {
592
+ async function loadJsonFileLines(path: string): Promise<ViewArtifactLoadResult> {
590
593
  let canPrettyPrint = false;
591
594
  try {
592
595
  const info = await stat(path);
@@ -1569,7 +1572,7 @@ export function createDefaultArtifactProviders(deps: ArtifactProviderDeps): Arti
1569
1572
  ];
1570
1573
  }
1571
1574
 
1572
- export function sortViewArtifacts(artifacts: ReadonlyArray<ViewArtifact>): ViewArtifact[] {
1575
+ function sortViewArtifacts(artifacts: ReadonlyArray<ViewArtifact>): ViewArtifact[] {
1573
1576
  return [...artifacts].sort((a, b) => {
1574
1577
  const time = b.timestamp - a.timestamp;
1575
1578
  if (time !== 0) return time;
@@ -141,7 +141,7 @@ function isViewArtifactCategory(value: string): value is ViewArtifactCategory {
141
141
  return VIEW_ARTIFACT_CATEGORY_SET.has(value as ViewArtifactCategory);
142
142
  }
143
143
 
144
- export function parseViewFilterQuery(query: string): ViewFilterQuery {
144
+ function parseViewFilterQuery(query: string): ViewFilterQuery {
145
145
  const text = query.trim();
146
146
  if (text.length === 0) return { kind: "text", text };
147
147
  const colon = text.indexOf(":");
@@ -215,7 +215,7 @@ function formatLocalTime(timestamp: number): string {
215
215
  return !Number.isFinite(timestamp) || timestamp <= 0 ? "unknown time" : clockLocal(timestamp);
216
216
  }
217
217
 
218
- export function filterViewArtifacts(artifacts: ReadonlyArray<ViewArtifact>, query: string): ViewArtifact[] {
218
+ function filterViewArtifacts(artifacts: ReadonlyArray<ViewArtifact>, query: string): ViewArtifact[] {
219
219
  const parsed = parseViewFilterQuery(query);
220
220
  if (parsed.kind === "category") {
221
221
  const categoryArtifacts = artifacts.filter((artifact) => artifact.category === parsed.category);
@@ -226,11 +226,11 @@ export function filterViewArtifacts(artifacts: ReadonlyArray<ViewArtifact>, quer
226
226
  return fuzzyFilter([...artifacts], parsed.text, broadFilterText);
227
227
  }
228
228
 
229
- export function artifactsInCategoryOrder(artifacts: ReadonlyArray<ViewArtifact>): ViewArtifact[] {
229
+ function artifactsInCategoryOrder(artifacts: ReadonlyArray<ViewArtifact>): ViewArtifact[] {
230
230
  return VIEW_ARTIFACT_CATEGORIES.flatMap((category) => artifacts.filter((artifact) => artifact.category === category));
231
231
  }
232
232
 
233
- export function initialViewSelection(artifacts: ReadonlyArray<ViewArtifact>, initialFilter = ""): number {
233
+ function initialViewSelection(artifacts: ReadonlyArray<ViewArtifact>, initialFilter = ""): number {
234
234
  const filtered = filterViewArtifacts(artifacts, initialFilter);
235
235
  const first = filtered[0];
236
236
  if (!first) return 0;
@@ -252,7 +252,7 @@ export function initialViewSelection(artifacts: ReadonlyArray<ViewArtifact>, ini
252
252
  return Math.max(0, artifactsInCategoryOrder(filtered).indexOf(selected));
253
253
  }
254
254
 
255
- export function nextCategorySelection(
255
+ function nextCategorySelection(
256
256
  artifacts: ReadonlyArray<ViewArtifact>,
257
257
  currentIndex: number,
258
258
  direction: -1 | 1,
@@ -271,7 +271,7 @@ export function nextCategorySelection(
271
271
  return safeCurrent;
272
272
  }
273
273
 
274
- export function groupedViewRows(artifacts: ReadonlyArray<ViewArtifact>): RenderedViewRow[] {
274
+ function groupedViewRows(artifacts: ReadonlyArray<ViewArtifact>): RenderedViewRow[] {
275
275
  const rows: RenderedViewRow[] = [];
276
276
  for (const category of VIEW_ARTIFACT_CATEGORIES) {
277
277
  const items = artifacts.filter((artifact) => artifact.category === category);
@@ -334,7 +334,7 @@ function verificationText(state: ViewVerificationState | undefined): string {
334
334
  return `${GLYPH.error} verify fail ${state.detail}`;
335
335
  }
336
336
 
337
- export function buildArtifactHeader(
337
+ function buildArtifactHeader(
338
338
  artifact: ViewArtifact | undefined,
339
339
  verification: ViewVerificationState | undefined,
340
340
  width: number,
@@ -361,7 +361,7 @@ export function buildArtifactHeader(
361
361
  }
362
362
 
363
363
  /** Put verification on wrapped rows so a canonical receipt verdict is never reduced to a prefix. */
364
- export function buildArtifactHeaderLines(
364
+ function buildArtifactHeaderLines(
365
365
  artifact: ViewArtifact | undefined,
366
366
  verification: ViewVerificationState | undefined,
367
367
  width: number,
@@ -384,7 +384,7 @@ export function buildArtifactHeaderLines(
384
384
  ];
385
385
  }
386
386
 
387
- export function viewFooterHint(focus: ViewPaneFocus, canVerify: boolean, innerWidth?: number): string {
387
+ function viewFooterHint(focus: ViewPaneFocus, canVerify: boolean, innerWidth?: number): string {
388
388
  // One pane at a time means Tab is how the other one is reached, so the
389
389
  // narrow footer states it. The generic elider drops middle entries, and Tab
390
390
  // sits in the middle.
@@ -527,6 +527,7 @@ export class ViewOverlayView implements Component {
527
527
  private renderedContentLines(width: number): string[] {
528
528
  const content = this.content;
529
529
  if (!content) return [];
530
+ if (content.status === "error") return content.lines.flatMap((line) => wrapTextWithAnsi(line, Math.max(1, width)));
530
531
  if (content.format !== "markdown") return content.lines;
531
532
  if (content.renderedLines && content.renderWidth === width) return content.renderedLines;
532
533
  const md = new Markdown(content.lines.join("\n"), 0, 0, markdownTheme(clioTheme()));
@@ -548,7 +549,9 @@ export class ViewOverlayView implements Component {
548
549
  return this.fixedLines(lines, width, height);
549
550
  }
550
551
  if (this.artifactError) {
551
- lines.push(padAnsi(theme.fg("error", this.artifactError), width, ELLIPSIS));
552
+ lines.push(
553
+ ...wrapTextWithAnsi(theme.fg("error", this.artifactError), Math.max(1, width)).map((line) => padAnsi(line, width)),
554
+ );
552
555
  return this.fixedLines(lines, width, height);
553
556
  }
554
557
 
@@ -21,7 +21,7 @@
21
21
  import { mkdirSync, renameSync, writeFileSync } from "node:fs";
22
22
  import { dirname, join } from "node:path";
23
23
  import { type ClioDirs, clioCacheDir, clioConfigDir, clioDataDir, clioStateDir } from "../core/xdg.js";
24
- import type { MuxContract } from "../domains/mux/index.js";
24
+ import type { MuxContract, MuxPaneRef } from "../domains/mux/index.js";
25
25
  import type { PanesWatchController, PanesWatchResult } from "../domains/mux/operations.js";
26
26
  import { watchViewerCommand } from "../domains/mux/viewer-command.js";
27
27
 
@@ -38,6 +38,12 @@ function watchSelectionPath(stateDir: string = clioStateDir()): string {
38
38
  export interface WatchPaneDeps {
39
39
  mux: MuxContract;
40
40
  getCwd: () => string;
41
+ /**
42
+ * Live workers-dock share, read at each open so a `/settings` edit applies
43
+ * to the next pane. Absent (tests, minimal wiring) the dock spec's default
44
+ * governs.
45
+ */
46
+ getWorkersRatio?: () => number;
41
47
  /** Selection-file override for tests. */
42
48
  selectionPath?: string;
43
49
  /** Resolved-layout override for tests. Production pins this process's four cached roots. */
@@ -78,7 +84,7 @@ export function createWatchPaneController(deps: WatchPaneDeps): PanesWatchContro
78
84
  if (disposed || paneId !== null) return Promise.resolve(true);
79
85
  if (adoptionInFlight !== null) return adoptionInFlight;
80
86
  const attempt = Promise.resolve()
81
- .then(() => deps.mux.adoptPane({ purpose: "watch", label: "watch" }))
87
+ .then(() => deps.mux.adoptPane({ purpose: "watch", label: "watch", dock: "workers" }))
82
88
  .then((adopted) => {
83
89
  if (!disposed && paneId === null && adopted !== null) paneId = adopted.paneId;
84
90
  return true;
@@ -104,11 +110,40 @@ export function createWatchPaneController(deps: WatchPaneDeps): PanesWatchContro
104
110
  }
105
111
  };
106
112
 
113
+ /**
114
+ * The one place a watch pane is created: the workers dock slot, split right
115
+ * of Clio's pane at the configured share. On a host without the layout tier
116
+ * the dock request degrades inside the contract to a plain right split.
117
+ */
118
+ const openPane = (): Promise<MuxPaneRef | null> =>
119
+ deps.mux.openUtilityPane({
120
+ argv: command(selectionPath, dirs),
121
+ cwd: deps.getCwd(),
122
+ label: "watch",
123
+ title: "clio-coder watch",
124
+ purpose: "watch",
125
+ dock: { slot: "workers", ...(deps.getWorkersRatio ? { share: deps.getWorkersRatio() } : {}) },
126
+ });
127
+
107
128
  // Reclaim durable ownership for inventory and navigation immediately. The
108
129
  // scan remains best effort and never opens a replacement pane on its own.
109
130
  void adoptExistingPane();
110
131
 
111
132
  return {
133
+ async ensureOpen(): Promise<boolean> {
134
+ // Boot composition: the pane exists and parks on the last selection
135
+ // (the viewer renders "no selection" until one is written). Adoption
136
+ // first, so a surviving dock is reused rather than doubled.
137
+ if (disposed) return false;
138
+ if (paneId !== null) return true;
139
+ await adoptExistingPane();
140
+ if (paneId !== null) return true;
141
+ const opened = await openPane();
142
+ if (opened === null) return false;
143
+ paneId = opened.paneId;
144
+ return true;
145
+ },
146
+
112
147
  async watch(runId: string): Promise<PanesWatchResult> {
113
148
  if (!writeSelection(runId)) {
114
149
  return { status: "unavailable", reason: `cannot write the watch selection at ${selectionPath}` };
@@ -117,14 +152,7 @@ export function createWatchPaneController(deps: WatchPaneDeps): PanesWatchContro
117
152
  const scanned = await adoptExistingPane();
118
153
  if (!scanned) await adoptExistingPane();
119
154
  if (paneId !== null) return { status: "watching", runId, paneId, opened: false };
120
- const opened = await deps.mux.openUtilityPane({
121
- argv: command(selectionPath, dirs),
122
- cwd: deps.getCwd(),
123
- label: "watch",
124
- title: "clio watch",
125
- purpose: "watch",
126
- direction: "right",
127
- });
155
+ const opened = await openPane();
128
156
  if (opened === null) {
129
157
  return { status: "unavailable", reason: "the pane host refused to open the watch pane" };
130
158
  }
@@ -103,7 +103,7 @@ function findCurrentStatus(
103
103
  statuses: ReadonlyArray<TargetStatus>,
104
104
  settings: Readonly<ClioSettings> | undefined,
105
105
  ): TargetStatus | null {
106
- const targetId = settings?.orchestrator?.target ?? null;
106
+ const targetId = settings?.chat?.target ?? null;
107
107
  if (!targetId) return null;
108
108
  return statuses.find((status) => status.target.id === targetId) ?? null;
109
109
  }
@@ -127,7 +127,7 @@ function selectedModelCapabilities(
127
127
  providers: ProvidersContract,
128
128
  ): CapabilityFlags | null {
129
129
  if (!status) return null;
130
- const wireModelId = settings?.orchestrator?.model ?? status.target.defaultModel ?? null;
130
+ const wireModelId = settings?.chat?.model ?? status.target.defaultModel ?? null;
131
131
  const detectedReasoning =
132
132
  wireModelId && typeof providers.getDetectedReasoning === "function"
133
133
  ? providers.getDetectedReasoning(status.target.id, wireModelId)
@@ -216,7 +216,7 @@ function handoffFacts(cwd: string): { handoffCount: number; handoffFreshness: st
216
216
  }
217
217
  }
218
218
 
219
- export function readWelcomeRepositoryFacts(cwd: string): WelcomeRepositoryFacts {
219
+ function readWelcomeRepositoryFacts(cwd: string): WelcomeRepositoryFacts {
220
220
  const codewiki = readCodewiki(cwd);
221
221
  const wiki = codewiki ? wikiFactsFrom(cwd, wikiStaleness(cwd)) : { wikiPageCount: 0, wikiStatus: NO_WIKI_STATUS };
222
222
  return {
@@ -255,7 +255,7 @@ async function readWelcomeRepositoryFactsAsync(cwd: string): Promise<WelcomeRepo
255
255
  * guessed, because it decides whether the Wiki row exists at all and the whole
256
256
  * point of a placeholder is that the banner never changes height.
257
257
  */
258
- export function placeholderRepositoryFacts(cwd: string): WelcomeRepositoryFacts {
258
+ function placeholderRepositoryFacts(cwd: string): WelcomeRepositoryFacts {
259
259
  return {
260
260
  clioMdStatus: clioMdStatusFor(cwd),
261
261
  hasCodewiki: existsSync(join(cwd, ".clio-coder", "codewiki.json")),
@@ -269,13 +269,13 @@ export function placeholderRepositoryFacts(cwd: string): WelcomeRepositoryFacts
269
269
  };
270
270
  }
271
271
 
272
- export function deriveWelcomeDashboardStats(deps: WelcomeDashboardDeps): WelcomeDashboardStats {
272
+ function deriveWelcomeDashboardStats(deps: WelcomeDashboardDeps): WelcomeDashboardStats {
273
273
  const settings = deps.getSettings?.();
274
274
  const statuses = deps.providers.list();
275
275
  const current = findCurrentStatus(statuses, settings);
276
276
  // Left null when unset; formatTargetLabel owns the one spelling for that.
277
- const targetLabel = current?.target.id ?? settings?.orchestrator?.target ?? null;
278
- const modelLabel = settings?.orchestrator?.model ?? current?.target.defaultModel ?? null;
277
+ const targetLabel = current?.target.id ?? settings?.chat?.target ?? null;
278
+ const modelLabel = settings?.chat?.model ?? current?.target.defaultModel ?? null;
279
279
  const workspace = deps.getWorkspaceSnapshot?.() ?? null;
280
280
  const cwd = workspace?.cwd ?? process.cwd();
281
281
  const currentAvailable = current ? activeStatus(current) : false;
@@ -283,16 +283,16 @@ export function deriveWelcomeDashboardStats(deps: WelcomeDashboardDeps): Welcome
283
283
  const thinkingLevel =
284
284
  resolveModelRuntimeCapabilitiesForProviders(
285
285
  deps.providers,
286
- settings?.orchestrator?.target,
287
- settings?.orchestrator?.model,
288
- settings?.orchestrator?.thinkingLevel ?? "off",
286
+ settings?.chat?.target,
287
+ settings?.chat?.model,
288
+ settings?.chat?.thinkingLevel ?? "off",
289
289
  )?.thinking.display ??
290
- settings?.orchestrator?.thinkingLevel ??
290
+ settings?.chat?.thinkingLevel ??
291
291
  "off";
292
292
 
293
- const autonomy = settings?.autonomy ?? "auto-edit";
294
- const toolProfile = settings?.delegation?.defaults?.toolGovernance ?? "clio-policy";
295
- const threshold = settings?.compaction?.threshold;
293
+ const autonomy = settings?.safety.autonomy ?? "auto-edit";
294
+ const toolProfile = settings?.integrations.externalAgents?.defaults?.toolGovernance ?? "clio-coder-policy";
295
+ const threshold = settings?.context.compaction?.threshold;
296
296
  const compactionThreshold =
297
297
  typeof threshold === "number" && Number.isFinite(threshold) ? `${Math.round(threshold * 100)}%` : "80%";
298
298
 
@@ -376,7 +376,7 @@ function nextValue(stats: WelcomeDashboardStats): string {
376
376
  * route answers, and what the context is ready for. Maturity caveats belong
377
377
  * in the README, not in a line the operator reads on every turn.
378
378
  */
379
- export function buildWelcomeDashboardLines(
379
+ function buildWelcomeDashboardLines(
380
380
  stats: WelcomeDashboardStats,
381
381
  width: number,
382
382
  mode: WelcomeDashboardMode = "launchpad",
@@ -164,9 +164,9 @@ function isThinkingEvent(event: Record<string, unknown>): boolean {
164
164
  return assistantEvent?.type === "thinking_delta";
165
165
  }
166
166
 
167
- /** The action a `clio_tool_start`/`clio_tool_finish` event names, or null when it is neither. */
167
+ /** The action a `clio_coder_tool_start`/`clio_coder_tool_finish` event names, or null when it is neither. */
168
168
  function toolEventAction(event: Record<string, unknown>): WorkerAction | null {
169
- if (event.type !== "clio_tool_start" && event.type !== "clio_tool_finish") return null;
169
+ if (event.type !== "clio_coder_tool_start" && event.type !== "clio_coder_tool_finish") return null;
170
170
  const payload = isRecord(event.payload) ? event.payload : null;
171
171
  const tool = nonEmptyString(payload?.tool);
172
172
  if (tool === undefined) return null;
@@ -363,7 +363,7 @@ export function createWorkerProgressFold(): WorkerProgressFold {
363
363
  }
364
364
 
365
365
  const action = toolEventAction(event);
366
- if (action !== null && event.type === "clio_tool_start") {
366
+ if (action !== null && event.type === "clio_coder_tool_start") {
367
367
  if (action.toolCallId !== undefined) {
368
368
  const duplicate = pendingActionsById.get(action.toolCallId);
369
369
  if (duplicate !== undefined) removePendingAction(duplicate);
@@ -375,7 +375,7 @@ export function createWorkerProgressFold(): WorkerProgressFold {
375
375
  touch();
376
376
  setPhase("tool");
377
377
  changed = true;
378
- } else if (action !== null && event.type === "clio_tool_finish") {
378
+ } else if (action !== null && event.type === "clio_coder_tool_finish") {
379
379
  // An id is authoritative when both sides carry it. If either side came
380
380
  // from an older or incomplete producer, retain the historical name match.
381
381
  const finished =
@@ -77,7 +77,7 @@ function contractKindFrom(receipt: Record<string, unknown>): WorkerPresentedResu
77
77
  * by older versions of Clio are still valid history, so every field is read
78
78
  * structurally and a missing one degrades the footer rather than the render.
79
79
  */
80
- export function workerReceiptFacts(receipt: Record<string, unknown>): WorkerReceiptFacts | null {
80
+ function workerReceiptFacts(receipt: Record<string, unknown>): WorkerReceiptFacts | null {
81
81
  const outcome = optionalString(receipt.outcome);
82
82
  if (outcome === undefined) return null;
83
83
  const output = isRecord(receipt.output) ? receipt.output : null;
@@ -185,10 +185,7 @@ function finiteNumber(value: unknown): number | undefined {
185
185
  return typeof value === "number" && Number.isFinite(value) ? value : undefined;
186
186
  }
187
187
 
188
- export function workerRuntimeKind(
189
- runtimeKind: RunKind | undefined,
190
- runtimeId: string | undefined,
191
- ): WorkerRunRuntimeKind {
188
+ function workerRuntimeKind(runtimeKind: RunKind | undefined, runtimeId: string | undefined): WorkerRunRuntimeKind {
192
189
  if (runtimeKind === "acp-delegation") return "acp";
193
190
  if (runtimeId === "claude-code") return "claude-code";
194
191
  if (runtimeId === "claude-sdk") return "claude-sdk";
@@ -25,6 +25,8 @@ export interface YaziBridgeSettings {
25
25
  mode: YaziSessionMode;
26
26
  profile: YaziProfileMode;
27
27
  followCwd: boolean;
28
+ /** Files-dock share of the height; absent leaves the dock spec's default. */
29
+ ratio?: number;
28
30
  }
29
31
 
30
32
  export interface YaziMentionBatch {
@@ -111,7 +113,7 @@ function readOptional(path: string): string {
111
113
  * before the TUI lease is released. A missing or below-floor binary therefore
112
114
  * leaves the screen intact and returns the shared doctor sentence verbatim.
113
115
  */
114
- export async function runYaziTerminalChooser(options: YaziTerminalChooserOptions): Promise<YaziTerminalChooserResult> {
116
+ async function runYaziTerminalChooser(options: YaziTerminalChooserOptions): Promise<YaziTerminalChooserResult> {
115
117
  const binaries = (options.resolveBinaries ?? resolveYaziBinaries)();
116
118
  if (!binaries.yaziPath) {
117
119
  return { status: "missing-binary", binary: "yazi", detail: binaries.missingYaziDetail };
@@ -217,7 +219,7 @@ function pathKind(path: string): "file" | "directory" | "other" {
217
219
  }
218
220
 
219
221
  /** Format one DDS or chooser batch for the composer without ever submitting it. */
220
- export function formatYaziMentions(
222
+ function formatYaziMentions(
221
223
  paths: ReadonlyArray<string>,
222
224
  options: {
223
225
  cwd: string;
@@ -328,7 +330,11 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
328
330
  }
329
331
  };
330
332
 
331
- const start = async (mode: YaziSessionMode, profileMode: YaziProfileMode): Promise<YaziBridgeOpenResult> => {
333
+ const start = async (
334
+ mode: YaziSessionMode,
335
+ profileMode: YaziProfileMode,
336
+ dockShare?: number,
337
+ ): Promise<YaziBridgeOpenResult> => {
332
338
  const mux = deps.mux;
333
339
  if (!mux?.available()) return { status: "unavailable", reason: "the pane layer is not available" };
334
340
  generation += 1;
@@ -341,6 +347,7 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
341
347
  mode,
342
348
  profileMode,
343
349
  cwd: deps.getCwd(),
350
+ ...(dockShare === undefined ? {} : { dockShare }),
344
351
  pickToken: token,
345
352
  onEvent: (event: YaziEvent) => {
346
353
  if (disposed || ownGeneration !== generation) return;
@@ -379,7 +386,7 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
379
386
  active = null;
380
387
  deps.notice("warning", "the file-pane event stream did not start; reopening yazi in chooser mode");
381
388
  void stale.close().finally(() => {
382
- if (!disposed && ownGeneration === generation) void start("chooser", profileMode);
389
+ if (!disposed && ownGeneration === generation) void start("chooser", profileMode, dockShare);
383
390
  });
384
391
  }, deps.livenessMs ?? YAZI_LIVENESS_MS);
385
392
  livenessTimer.unref();
@@ -419,7 +426,7 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
419
426
  }
420
427
  return result;
421
428
  }
422
- return await start(mode, settings.profile);
429
+ return await start(mode, settings.profile, settings.ratio);
423
430
  },
424
431
  status(): Readonly<YaziBridgeStatus> {
425
432
  const snapshot = active?.snapshot();
@@ -261,7 +261,7 @@ function normalizeDecisions(value: unknown): { decisions?: AskUserDecision[]; er
261
261
  return { decisions };
262
262
  }
263
263
 
264
- export function normalizeAskUserCall(args: Record<string, unknown>): { call?: AskUserCall; error?: string } {
264
+ function normalizeAskUserCall(args: Record<string, unknown>): { call?: AskUserCall; error?: string } {
265
265
  const rawAction = trimOptionalString(args.action)?.toLowerCase() ?? "ask";
266
266
  if (rawAction !== "ask" && rawAction !== "complete") {
267
267
  return { error: "action must be ask or complete" };
@@ -499,7 +499,7 @@ async function persistAskUserTranscript(
499
499
  await mkdir(dir, { recursive: true });
500
500
  if (!policy.transcriptPath) policy.transcriptPath = path.join(dir, transcriptFileName(policy));
501
501
  const transcript = {
502
- schema: "clio.ask_user.interview.v1",
502
+ schema: "clio-coder.ask_user.interview.v1",
503
503
  id: policy.id,
504
504
  status: policy.status,
505
505
  startedAt: policy.startedAt,
@@ -595,7 +595,7 @@ async function completeInterview(
595
595
  return okInterviewResult(policy, event);
596
596
  }
597
597
 
598
- export async function finalizeAskUserInterview(
598
+ async function finalizeAskUserInterview(
599
599
  policy: AskUserToolPolicy,
600
600
  reason: string,
601
601
  options?: ToolInvokeOptions,
package/src/tools/bash.ts CHANGED
@@ -48,7 +48,7 @@ export const BASH_DEFAULT_RESULT_DISPOSITION: ToolResultDisposition = {
48
48
  };
49
49
 
50
50
  /** Pure, idempotent normalization used by registry admission and direct calls. */
51
- export function normalizeBashArguments(args: Record<string, unknown>): Record<string, unknown> {
51
+ function normalizeBashArguments(args: Record<string, unknown>): Record<string, unknown> {
52
52
  return args.output_policy === undefined ? { ...args, output_policy: "bounded" } : args;
53
53
  }
54
54
 
@@ -95,7 +95,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
95
95
  ),
96
96
  costLatency: "local_fast",
97
97
  promptHint:
98
- 'Call context with scope="skills" to list installed and marketplace skills; when one matches the task, or the operator names a skill or asks how one works, suggest the operator run /skill <name> (a marketplace skill is offered for install) and never load it uninvited. When the user message carries a skill request, first load that skill via context (scope="skills", name=<skill>) before doing anything else. When an [evicted ...] marker names content you need, recall it with context(scope="recall", ref=...); re-read the file only when the marker says it changed.',
98
+ 'Call context with scope="skills" to list installed and marketplace skills; when one matches the task, or the operator names a skill or asks how one works, suggest the operator run /skill <name> (a marketplace skill is offered for install) and never load it uninvited; a [Marketplace] reminder naming an uninstalled skill may instead be offered through ask_user with its exact options, and the harness performs any install. When the user message carries a skill request, first load that skill via context (scope="skills", name=<skill>) before doing anything else. When an [evicted ...] marker names content you need, recall it with context(scope="recall", ref=...); re-read the file only when the marker says it changed.',
99
99
  },
100
100
  [ToolNames.CredentialPresent]: {
101
101
  objective: "Check whether a credential key is present without returning its value.",
@@ -2,7 +2,7 @@
2
2
  * Scratch git worktrees for the compete dispatch topology.
3
3
  *
4
4
  * Each candidate builds in its own worktree on its own branch
5
- * (`clio/compete/<group>/<n>`), created from the repository HEAD under
5
+ * (`clio-coder/compete/<group>/<n>`), created from the repository HEAD under
6
6
  * `<root>/.clio-coder/worktrees/<group>/candidate-<n>`. The path sits inside the
7
7
  * project root because remote fleet nodes share the filesystem and doctor
8
8
  * preflight verifies path parity only for the project root; `.clio-coder/` is
@@ -127,8 +127,9 @@ export interface CompeteRunAdmission {
127
127
 
128
128
  const COMPETE_PARENT_SEGMENTS = [".clio-coder", "worktrees"] as const;
129
129
  const COMPETE_MANIFEST_FILE = ".clio-coder-compete-owner.json";
130
- const COMPETE_MANIFEST_KIND = "clio-compete-group";
131
- const COMPETE_COMMIT_IDENTITY = "clio-compete";
130
+ const COMPETE_MANIFEST_KIND = "clio-coder-compete-group";
131
+ const LEGACY_COMPETE_MANIFEST_KIND = "clio-compete-group";
132
+ const COMPETE_COMMIT_IDENTITY = "clio-coder-compete";
132
133
 
133
134
  const SAFE_GROUP = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
134
135
  const PROCESS_EXIT_GRACE_MS = 750;
@@ -324,7 +325,7 @@ function isCanonicalDirectoryAt(path: string): boolean {
324
325
  * `relative()` makes the decision by path segment, so `/group-a2` can never
325
326
  * be mistaken for a child of `/group-a` as it can with textual startsWith.
326
327
  */
327
- export function isCanonicalPathInside(parent: string, candidate: string): boolean {
328
+ function isCanonicalPathInside(parent: string, candidate: string): boolean {
328
329
  return isCanonicalWorktreePathInside(parent, candidate);
329
330
  }
330
331
 
@@ -333,7 +334,7 @@ function manifestFromUnknown(value: unknown): CompeteGroupManifest | null {
333
334
  const manifest = value as Record<string, unknown>;
334
335
  if (
335
336
  manifest.version !== 2 ||
336
- manifest.kind !== COMPETE_MANIFEST_KIND ||
337
+ (manifest.kind !== COMPETE_MANIFEST_KIND && manifest.kind !== LEGACY_COMPETE_MANIFEST_KIND) ||
337
338
  typeof manifest.root !== "string" ||
338
339
  typeof manifest.group !== "string" ||
339
340
  typeof manifest.token !== "string" ||
@@ -417,10 +418,14 @@ export function isGitRepository(root: string): boolean {
417
418
  }
418
419
  }
419
420
 
420
- function competeBranch(group: string, index: number): string {
421
+ function competeBranch(group: string, index: number, legacy = false): string {
421
422
  validateGroup(group);
422
423
  if (!Number.isInteger(index) || index < 1) throw new Error(`invalid compete candidate index ${index}`);
423
- return `clio/compete/${group}/${index}`;
424
+ return `${legacy ? "clio" : "clio-coder"}/compete/${group}/${index}`;
425
+ }
426
+
427
+ function competeBranchMatches(branch: string, group: string, index: number): boolean {
428
+ return branch === competeBranch(group, index) || branch === competeBranch(group, index, true);
424
429
  }
425
430
 
426
431
  /** Claim the group before creating a branch or candidate worktree. */
@@ -549,11 +554,7 @@ export function markCompeteGroupWinnerPreserved(
549
554
  * baseline is a parameter rather than HEAD so every candidate in a compete
550
555
  * transaction starts from the same approved state.
551
556
  */
552
- export function createCandidateWorktree(
553
- ownership: CompeteGroupOwnership,
554
- index: number,
555
- baseline: string,
556
- ): CandidateWorktree {
557
+ function createCandidateWorktree(ownership: CompeteGroupOwnership, index: number, baseline: string): CandidateWorktree {
557
558
  assertOwnership(ownership);
558
559
  const branch = competeBranch(ownership.group, index);
559
560
  const path = join(ownership.directory, `candidate-${index}`);
@@ -589,7 +590,7 @@ export async function createCandidateWorktreeMapped(
589
590
  branch,
590
591
  base: baseline,
591
592
  path,
592
- label: `clio compete ${ownership.group} candidate ${index}`,
593
+ label: `clio-coder compete ${ownership.group} candidate ${index}`,
593
594
  focus: false,
594
595
  })
595
596
  .catch(() => null);
@@ -652,7 +653,7 @@ function exactGroupBranches(root: string, group: string): string[] {
652
653
  const parts = branch.split("/");
653
654
  return (
654
655
  parts.length === 4 &&
655
- parts[0] === "clio" &&
656
+ (parts[0] === "clio-coder" || parts[0] === "clio") &&
656
657
  parts[1] === "compete" &&
657
658
  parts[2] === group &&
658
659
  /^\d+$/.test(parts[3] ?? "")
@@ -660,6 +661,16 @@ function exactGroupBranches(root: string, group: string): string[] {
660
661
  });
661
662
  }
662
663
 
664
+ /** Resolve a current candidate branch while retaining indefinite read support for released refs. */
665
+ export function competeBranchForCandidate(root: string, group: string, index: number): string {
666
+ const branches = exactGroupBranches(root, group);
667
+ return (
668
+ branches.find((branch) => branch === competeBranch(group, index)) ??
669
+ branches.find((branch) => branch === competeBranch(group, index, true)) ??
670
+ competeBranch(group, index)
671
+ );
672
+ }
673
+
663
674
  function removeRegisteredWorktree(root: string, path: string): void {
664
675
  try {
665
676
  git(root, ["worktree", "remove", "--force", path]);
@@ -676,10 +687,9 @@ function removeCandidateWorktree(
676
687
  ): void {
677
688
  assertOwnership(ownership);
678
689
  const expectedPath = join(ownership.directory, `candidate-${worktree.index}`);
679
- const expectedBranch = competeBranch(ownership.group, worktree.index);
680
690
  if (
681
691
  resolve(worktree.path) !== resolve(expectedPath) ||
682
- worktree.branch !== expectedBranch ||
692
+ !competeBranchMatches(worktree.branch, ownership.group, worktree.index) ||
683
693
  !isCanonicalPathInside(ownership.directory, worktree.path)
684
694
  ) {
685
695
  throw new Error(`candidate ${worktree.index} does not belong to compete group ${ownership.group}`);
@@ -819,8 +829,8 @@ export function settleRecoveredCompeteDecision(
819
829
  cleanupWorktreeGroup(ownership);
820
830
  return null;
821
831
  }
822
- const winnerBranch = competeBranch(group, winnerIndex);
823
832
  const branches = exactGroupBranches(ownership.root, group);
833
+ const winnerBranch = competeBranchForCandidate(ownership.root, group, winnerIndex);
824
834
  const winnerPath = join(ownership.directory, `candidate-${winnerIndex}`);
825
835
  if (
826
836
  !branches.includes(winnerBranch) ||