@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
@@ -29,7 +29,7 @@ export interface SkillEvalParseResult {
29
29
 
30
30
  // Tolerates ASCII dash/colon and the en/em dashes older evals.md files used.
31
31
  // The canonical prefix is S ("## S1 - title"); discipline skills use other
32
- // letters (clio-dev's D1), so any single capital letter is accepted.
32
+ // letters (clio-coder-dev's D1), so any single capital letter is accepted.
33
33
  const SCENARIO_HEADING = /^##\s+([A-Z])(\d+)\s*[-:–—]\s*(.+?)\s*$/;
34
34
 
35
35
  export function parseSkillEvals(markdown: string): SkillEvalParseResult {
@@ -140,14 +140,33 @@ interface ProvenanceFields {
140
140
  installedBy?: "worker";
141
141
  }
142
142
 
143
+ function canonicalizeProductMetadataBlock(lines: ReadonlyArray<string>): string[] {
144
+ const hasCanonical = lines.some((line) => /^clio-coder:/.test(line));
145
+ const canonical: string[] = [];
146
+ let dropLegacyChildren = false;
147
+ for (const line of lines) {
148
+ if (/^clio:/.test(line)) {
149
+ dropLegacyChildren = hasCanonical;
150
+ if (!hasCanonical) canonical.push(line.replace(/^clio:/, "clio-coder:"));
151
+ continue;
152
+ }
153
+ if (dropLegacyChildren) {
154
+ if (line.trim().length === 0 || /^[ \t]/.test(line)) continue;
155
+ dropLegacyChildren = false;
156
+ }
157
+ canonical.push(line);
158
+ }
159
+ return canonical;
160
+ }
161
+
143
162
  /**
144
163
  * Replace install-lifecycle frontmatter with the recorded fields, written
145
- * nested under the reserved `clio:` block (merged into an existing block-style
146
- * `clio:` mapping when the skill carries one). Registry identity lines
164
+ * nested under the reserved `clio-coder:` block (merged into an existing block-style
165
+ * `clio-coder:` mapping when the skill carries one). Registry identity lines
147
166
  * (`registry-id`, `registry-url`) are content, not lifecycle, so they survive
148
167
  * the install and keep pinned drift checks working on the installed copy.
149
168
  *
150
- * A flow-style `clio: {...}` value cannot take appended block lines, so that
169
+ * A flow-style `clio-coder: {...}` value cannot take appended block lines, so that
151
170
  * rare shape falls back to the legacy flat stamps, which the hash and loader
152
171
  * still understand.
153
172
  */
@@ -166,21 +185,24 @@ function injectProvenanceFrontmatter(rawText: string, fields: ProvenanceFields):
166
185
  "audit: unknown",
167
186
  ...(fields.installedBy ? [`installed-by: ${yamlQuote(fields.installedBy)}`] : []),
168
187
  ];
169
- const clioIndex = kept.findIndex((line) => /^clio:/.test(line));
170
- if (clioIndex >= 0 && !/^clio:\s*$/.test(kept[clioIndex] as string)) {
171
- return `${region.head}${[...kept, ...stamps].join("\n")}${region.tail}`;
188
+ const canonicalKept = canonicalizeProductMetadataBlock(kept);
189
+ const clioIndex = canonicalKept.findIndex((line) => /^clio-coder:/.test(line));
190
+ if (clioIndex >= 0 && !/^clio-coder:\s*$/.test(canonicalKept[clioIndex] as string)) {
191
+ return `${region.head}${[...canonicalKept, ...stamps].join("\n")}${region.tail}`;
172
192
  }
173
193
  const nested = stamps.map((line) => ` ${line}`);
174
194
  if (clioIndex < 0) {
175
- return `${region.head}${[...kept, "clio:", ...nested].join("\n")}${region.tail}`;
195
+ return `${region.head}${[...canonicalKept, "clio-coder:", ...nested].join("\n")}${region.tail}`;
176
196
  }
177
197
  let blockEnd = clioIndex + 1;
178
- while (blockEnd < kept.length) {
179
- const line = kept[blockEnd] as string;
198
+ while (blockEnd < canonicalKept.length) {
199
+ const line = canonicalKept[blockEnd] as string;
180
200
  if (line.trim().length > 0 && !/^[ \t]/.test(line)) break;
181
201
  blockEnd += 1;
182
202
  }
183
- return `${region.head}${[...kept.slice(0, blockEnd), ...nested, ...kept.slice(blockEnd)].join("\n")}${region.tail}`;
203
+ return `${region.head}${[...canonicalKept.slice(0, blockEnd), ...nested, ...canonicalKept.slice(blockEnd)].join(
204
+ "\n",
205
+ )}${region.tail}`;
184
206
  }
185
207
 
186
208
  function resolveSkillDir(target: string): string {
@@ -205,7 +227,7 @@ function fetchSource(spec: SkillSourceSpec): FetchedSource {
205
227
  if (spec.kind === "local") {
206
228
  return { skillDir: resolveSkillDir(spec.path), cleanup: () => {} };
207
229
  }
208
- const tmp = mkdtempSync(path.join(tmpdir(), "clio-skill-"));
230
+ const tmp = mkdtempSync(path.join(tmpdir(), "clio-coder-skill-"));
209
231
  const cleanup = (): void => rmSync(tmp, { recursive: true, force: true });
210
232
  try {
211
233
  execFileSync("git", ["clone", "--depth", "1", "--branch", spec.branch, spec.cloneUrl, tmp], {
@@ -358,7 +380,9 @@ export function installSkillFromSource(input: InstallSkillInput): InstallSkillRe
358
380
  function managedSkills(cwd: string, configDir?: string): Skill[] {
359
381
  const list = loadSkills({ cwd, ...(configDir ? { configDir } : {}) });
360
382
  // Only Clio-managed roots are update targets; compat roots belong to other harnesses.
361
- return list.items.filter((skill) => skill.source === "clio" && (skill.scope === "user" || skill.scope === "project"));
383
+ return list.items.filter(
384
+ (skill) => skill.source === "clio-coder" && (skill.scope === "user" || skill.scope === "project"),
385
+ );
362
386
  }
363
387
 
364
388
  function updateOne(skill: Skill, force: boolean): SkillUpdateReport {
@@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
2
2
  import { type Dirent, existsSync, readdirSync, readFileSync, realpathSync } from "node:fs";
3
3
  import { homedir } from "node:os";
4
4
  import path from "node:path";
5
+ import { warnLegacyNaming } from "../../../core/naming-compat.js";
5
6
  import type { PendingSkillRequest } from "../../../core/skill-activation.js";
6
7
  import { type ToolName, ToolNames } from "../../../core/tool-names.js";
7
8
  import { clioConfigDir } from "../../../core/xdg.js";
@@ -47,7 +48,7 @@ const CORE_FRONTMATTER_KEYS = new Set([
47
48
  * only encodes collision precedence tiers shared across resource kinds.
48
49
  */
49
50
  export type SkillSource =
50
- | "clio"
51
+ | "clio-coder"
51
52
  | "agents"
52
53
  | "claude"
53
54
  | "codex"
@@ -216,9 +217,20 @@ function defaultPrecedenceForScope(scope: ResourceScope): number {
216
217
  * this gate with skills: both substitute another agent's project file into
217
218
  * Clio's context, so one opt-in covers both.
218
219
  */
220
+ let warnedLegacyProjectTrustEnv = false;
221
+
219
222
  export function projectCompatTrusted(explicit?: boolean): boolean {
220
223
  if (explicit === true) return true;
221
- return process.env.CLIO_CODER_TRUST_PROJECT_SKILLS === "1";
224
+ if (process.env.CLIO_CODER_TRUST_PROJECT_RESOURCES === "1") return true;
225
+ if (process.env.CLIO_CODER_TRUST_PROJECT_SKILLS !== "1") return false;
226
+ if (!warnedLegacyProjectTrustEnv) {
227
+ warnedLegacyProjectTrustEnv = true;
228
+ process.emitWarning("CLIO_CODER_TRUST_PROJECT_SKILLS is deprecated; use CLIO_CODER_TRUST_PROJECT_RESOURCES instead", {
229
+ code: "CLIO_CODER_DEPRECATED_ENV",
230
+ type: "DeprecationWarning",
231
+ });
232
+ }
233
+ return true;
222
234
  }
223
235
 
224
236
  /**
@@ -268,7 +280,7 @@ export function defaultSkillRoots(input: LoadSkillsInput = {}): SkillRoot[] {
268
280
  roots.push({
269
281
  path: path.join(configDir, "skills"),
270
282
  scope: "user",
271
- source: "clio",
283
+ source: "clio-coder",
272
284
  origin: "config",
273
285
  precedence: SKILL_PRECEDENCE.user,
274
286
  trusted: true,
@@ -292,7 +304,7 @@ export function defaultSkillRoots(input: LoadSkillsInput = {}): SkillRoot[] {
292
304
  roots.push({
293
305
  path: path.join(cwd, ".clio-coder", "skills"),
294
306
  scope: "project",
295
- source: "clio",
307
+ source: "clio-coder",
296
308
  origin: "project",
297
309
  precedence: SKILL_PRECEDENCE.project,
298
310
  trusted: true,
@@ -445,24 +457,36 @@ function extractMetadata(frontmatter: Record<string, unknown>): Record<string, u
445
457
  const metadata: Record<string, unknown> = {};
446
458
  for (const [key, value] of Object.entries(frontmatter)) {
447
459
  if (CORE_FRONTMATTER_KEYS.has(key)) continue;
460
+ if (key === "clio-coder") {
461
+ metadata.clioCoder = value;
462
+ continue;
463
+ }
464
+ if (key === "clio") {
465
+ warnLegacyNaming("clio: skill metadata", "clio-coder: skill metadata");
466
+ if (!("clio-coder" in frontmatter)) metadata.clioCoder = value;
467
+ continue;
468
+ }
448
469
  metadata[key] = value;
449
470
  }
450
471
  return metadata;
451
472
  }
452
473
 
453
474
  function extractProvenance(frontmatter: Record<string, unknown>): SkillProvenance | undefined {
454
- // Provenance lives nested under the reserved `clio:` block; the flat
475
+ // Provenance lives nested under the reserved `clio-coder:` block; the flat
455
476
  // top-level keys remain readable for already-installed copies stamped
456
477
  // before the nested form existed.
457
- const clioRaw = frontmatter.clio;
458
- const clio =
459
- clioRaw !== null && typeof clioRaw === "object" && !Array.isArray(clioRaw)
460
- ? (clioRaw as Record<string, unknown>)
478
+ const canonicalRaw = frontmatter["clio-coder"];
479
+ const legacyRaw = frontmatter.clio;
480
+ if (legacyRaw !== undefined) warnLegacyNaming("clio: skill metadata", "clio-coder: skill metadata");
481
+ const clioCoderRaw = canonicalRaw ?? legacyRaw;
482
+ const clioCoder =
483
+ clioCoderRaw !== null && typeof clioCoderRaw === "object" && !Array.isArray(clioCoderRaw)
484
+ ? (clioCoderRaw as Record<string, unknown>)
461
485
  : undefined;
462
486
  const field = (...keys: string[]): string | null => {
463
487
  for (const key of keys) {
464
- if (clio) {
465
- const nested = stringField(clio, key);
488
+ if (clioCoder) {
489
+ const nested = stringField(clioCoder, key);
466
490
  if (nested !== null) return nested;
467
491
  }
468
492
  }
@@ -621,7 +645,9 @@ function loadSkillFile(
621
645
 
622
646
  const pathSubject = validationSubject(filePath);
623
647
  const frontmatterName = stringField(parsed.frontmatter, "name");
624
- const name = frontmatterName ?? pathSubject;
648
+ const rawName = frontmatterName ?? pathSubject;
649
+ const name = rawName === "clio-dev" ? "clio-coder-dev" : rawName === "clio-test" ? "clio-coder-test" : rawName;
650
+ if (name !== rawName) warnLegacyNaming(rawName, name);
625
651
  const description = stringField(parsed.frontmatter, "description");
626
652
 
627
653
  for (const message of validateDescription(description)) diagnostics.push({ type: "warning", message, path: filePath });
@@ -658,7 +684,7 @@ function loadSkillFile(
658
684
  disableModelInvocation: booleanField(parsed.frontmatter, "disable-model-invocation"),
659
685
  ...(allowedTools ? { allowedTools } : {}),
660
686
  ...(disallowedTools ? { disallowedTools } : {}),
661
- source: root.source ?? "clio",
687
+ source: root.source ?? "clio-coder",
662
688
  scope,
663
689
  hash: sha256(raw),
664
690
  normalizedHash: normalizedSkillHash(raw),
@@ -1,5 +1,6 @@
1
1
  import { existsSync, readdirSync, readFileSync } from "node:fs";
2
2
  import path from "node:path";
3
+ import { warnLegacyNaming } from "../../../core/naming-compat.js";
3
4
  import { resolvePackageRoot } from "../../../core/package-root.js";
4
5
  import { clioConfigDir } from "../../../core/xdg.js";
5
6
  import {
@@ -55,6 +56,8 @@ export interface MarketplaceSkill {
55
56
  audit?: "pass" | "warn" | "fail" | "unknown";
56
57
  /** Catalog grouping ("git", "research", ...); absent in a flat catalog. */
57
58
  category?: string;
59
+ /** Trigger phrases from the skill's frontmatter, for local promotion matching. */
60
+ triggers?: string[];
58
61
  origin: MarketplaceSkillOrigin;
59
62
  requires?: LibraryRequirementRef[];
60
63
  }
@@ -131,6 +134,16 @@ function optionalString(value: unknown): string | undefined {
131
134
  return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
132
135
  }
133
136
 
137
+ /** Non-empty trimmed trigger phrases, or undefined when the field is absent or unusable. */
138
+ function optionalTriggerList(value: unknown): string[] | undefined {
139
+ if (!Array.isArray(value)) return undefined;
140
+ const triggers = value
141
+ .filter((entry): entry is string => typeof entry === "string")
142
+ .map((entry) => entry.trim())
143
+ .filter((entry) => entry.length > 0);
144
+ return triggers.length > 0 ? triggers : undefined;
145
+ }
146
+
134
147
  function indexAudit(value: unknown): MarketplaceSkill["audit"] {
135
148
  return value === "pass" || value === "warn" || value === "fail" || value === "unknown" ? value : undefined;
136
149
  }
@@ -151,6 +164,7 @@ function parseMarketplaceIndex(indexPath: string, diagnostics: string[] = []): M
151
164
  const version = optionalString(record.version);
152
165
  const audit = indexAudit(record.audit);
153
166
  const category = optionalString(record.category);
167
+ const triggers = optionalTriggerList(record.triggers);
154
168
  if (record.kind !== undefined && !["skill", "agent", "prompt", "fleet"].includes(String(record.kind))) {
155
169
  diagnostics.push(`skill marketplace index entry has unsupported kind: ${skill.name}`);
156
170
  return [];
@@ -176,6 +190,7 @@ function parseMarketplaceIndex(indexPath: string, diagnostics: string[] = []): M
176
190
  ...(version ? { version } : {}),
177
191
  ...(audit ? { audit } : {}),
178
192
  ...(category ? { category } : {}),
193
+ ...(triggers ? { triggers } : {}),
179
194
  ...(requires ? { requires } : {}),
180
195
  origin: "index" as const,
181
196
  },
@@ -242,6 +257,7 @@ function catalogCategory(catalogDir: string, baseDir: string): string | undefine
242
257
  function catalogEntry(skill: Skill, catalogDir: string): MarketplaceSkill {
243
258
  const version = typeof skill.metadata.version === "string" ? skill.metadata.version : undefined;
244
259
  const category = catalogCategory(catalogDir, skill.baseDir);
260
+ const triggers = optionalTriggerList(skill.metadata.triggers);
245
261
  return {
246
262
  name: skill.name,
247
263
  description: skill.description,
@@ -249,6 +265,7 @@ function catalogEntry(skill: Skill, catalogDir: string): MarketplaceSkill {
249
265
  ...(version ? { version } : {}),
250
266
  ...(skill.provenance?.audit ? { audit: skill.provenance.audit } : {}),
251
267
  ...(category ? { category } : {}),
268
+ ...(triggers ? { triggers } : {}),
252
269
  origin: "catalog",
253
270
  kind: "skill",
254
271
  };
@@ -311,7 +328,9 @@ export function getMarketplaceSkills(options: DiscoverMarketplaceOptions = {}):
311
328
  * an existing install always requires an explicit `force: true`.
312
329
  */
313
330
  export function installSkill(input: InstallSkillInput): InstallSkillResult {
314
- const source = input.source.trim();
331
+ const requested = input.source.trim();
332
+ const source = requested === "clio-dev" ? "clio-coder-dev" : requested === "clio-test" ? "clio-coder-test" : requested;
333
+ if (source !== requested) warnLegacyNaming(requested, source);
315
334
  const spec = parseSkillSourceSpec(source);
316
335
  if (spec?.kind === "local" && isSkillName(source) && !existsSync(spec.path)) {
317
336
  const skill = getMarketplaceSkills({ ...(input.cwd ? { cwd: input.cwd } : {}) }).find(
@@ -322,5 +341,5 @@ export function installSkill(input: InstallSkillInput): InstallSkillResult {
322
341
  }
323
342
  return installSkillFromSource({ ...input, source: skill.sourceUrl });
324
343
  }
325
- return installSkillFromSource(input);
344
+ return installSkillFromSource({ ...input, source });
326
345
  }
@@ -0,0 +1,214 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { safeResourceWrite } from "../../../core/safe-resource-write.js";
4
+ import { clioConfigDir } from "../../../core/xdg.js";
5
+ import type { MarketplaceSkill } from "./marketplace.js";
6
+
7
+ /**
8
+ * Marketplace self-promotion: local detection that an uninstalled marketplace
9
+ * skill serves the operator's current request, plus the two policy pieces the
10
+ * offer flow needs — the persistent "never offer this skill" store and the
11
+ * own-marketplace source gate that bounds what a promotion-flow install may
12
+ * ever fetch.
13
+ *
14
+ * Detection is a pure lexical match against the local catalog: no model call,
15
+ * no network, and no request text ever leaves the process. False positives
16
+ * cost operator trust, so the matcher is deliberately conservative — a
17
+ * trigger-phrase hit or a strong distinctive-token overlap fires; anything
18
+ * weaker stays silent and the broad paths (the first-turn reminder,
19
+ * context(scope="skills")) remain the fallback.
20
+ */
21
+
22
+ export interface PromotionMatch {
23
+ entry: MarketplaceSkill;
24
+ score: number;
25
+ /** The trigger phrase that fired, when the match came from one. */
26
+ matchedTrigger?: string;
27
+ }
28
+
29
+ const TOKEN_STOPWORDS = new Set([
30
+ "the",
31
+ "a",
32
+ "an",
33
+ "and",
34
+ "or",
35
+ "for",
36
+ "with",
37
+ "this",
38
+ "that",
39
+ "when",
40
+ "what",
41
+ "how",
42
+ "into",
43
+ "from",
44
+ "use",
45
+ "used",
46
+ "using",
47
+ "one",
48
+ "not",
49
+ "skill",
50
+ "skills",
51
+ "clio",
52
+ "please",
53
+ "can",
54
+ "you",
55
+ "should",
56
+ "would",
57
+ "about",
58
+ "need",
59
+ "want",
60
+ "help",
61
+ "make",
62
+ "file",
63
+ "files",
64
+ "code",
65
+ ]);
66
+
67
+ function normalize(text: string): string {
68
+ return text
69
+ .toLowerCase()
70
+ .replace(/[^\p{L}\p{N}\s]/gu, " ")
71
+ .replace(/\s+/g, " ")
72
+ .trim();
73
+ }
74
+
75
+ /** Distinctive tokens: 4+ chars and outside the stopword set. */
76
+ function distinctiveTokens(text: string): Set<string> {
77
+ return new Set(
78
+ normalize(text)
79
+ .split(" ")
80
+ .filter((token) => token.length >= 4 && !TOKEN_STOPWORDS.has(token)),
81
+ );
82
+ }
83
+
84
+ const TRIGGER_SCORE = 4;
85
+ /** Distinct description/name token overlaps required to fire without a trigger. */
86
+ const TOKEN_FIRE_THRESHOLD = 3;
87
+
88
+ /**
89
+ * Score one marketplace entry against the operator's request text. A trigger
90
+ * phrase is a whole-phrase substring match on normalized text; token overlap
91
+ * is a fallback for skills whose triggers have not been authored yet.
92
+ */
93
+ export function scorePromotionEntry(userText: string, entry: MarketplaceSkill): PromotionMatch | null {
94
+ const haystack = ` ${normalize(userText)} `;
95
+ if (haystack.trim().length === 0) return null;
96
+ for (const trigger of entry.triggers ?? []) {
97
+ const phrase = normalize(trigger);
98
+ if (phrase.length >= 4 && haystack.includes(` ${phrase} `)) {
99
+ return { entry, score: TRIGGER_SCORE, matchedTrigger: trigger };
100
+ }
101
+ }
102
+ const requestTokens = distinctiveTokens(userText);
103
+ if (requestTokens.size === 0) return null;
104
+ const entryTokens = distinctiveTokens(`${entry.name.replace(/-/g, " ")} ${entry.description}`);
105
+ let overlap = 0;
106
+ for (const token of requestTokens) if (entryTokens.has(token)) overlap += 1;
107
+ return overlap >= TOKEN_FIRE_THRESHOLD ? { entry, score: overlap } : null;
108
+ }
109
+
110
+ /**
111
+ * The uninstalled marketplace entries that match the request, best first.
112
+ * `excludedNames` carries installed skills plus every decline scope the
113
+ * caller tracks; the matcher itself is stateless.
114
+ */
115
+ export function matchMarketplaceSkills(
116
+ userText: string,
117
+ entries: ReadonlyArray<MarketplaceSkill>,
118
+ excludedNames: ReadonlySet<string>,
119
+ ): PromotionMatch[] {
120
+ const matches: PromotionMatch[] = [];
121
+ for (const entry of entries) {
122
+ if (entry.kind !== "skill" || excludedNames.has(entry.name)) continue;
123
+ const match = scorePromotionEntry(userText, entry);
124
+ if (match) matches.push(match);
125
+ }
126
+ return matches.sort((a, b) => b.score - a.score || a.entry.name.localeCompare(b.entry.name));
127
+ }
128
+
129
+ /**
130
+ * The hard runtime gate on promotion-flow installs: only Clio's own
131
+ * marketplace is ever an acceptable source, whether the install runs on
132
+ * operator consent or autonomously at full-auto. A local path is the shipped
133
+ * package catalog (install copies files, no network); the one acceptable URL
134
+ * shape is this project's own repository tree. Public skill registries and
135
+ * arbitrary GitHub sources are rejected here, in code — a prompt instruction
136
+ * is not the enforcement mechanism.
137
+ *
138
+ * This gates the promotion flow only. Operator-driven installs through
139
+ * `clio-coder skills install <url>` keep their existing behavior.
140
+ */
141
+ export const OWN_MARKETPLACE_URL_PREFIX = "https://github.com/iowarp/clio-coder/";
142
+
143
+ export function isOwnMarketplaceSource(entry: Pick<MarketplaceSkill, "origin" | "sourceUrl">): boolean {
144
+ const source = entry.sourceUrl.trim();
145
+ if (/^(?:https?:\/\/|git@)/.test(source)) return source.startsWith(OWN_MARKETPLACE_URL_PREFIX);
146
+ // A non-URL source is a local filesystem path; only catalog discovery
147
+ // produces those, and it resolves them against the shipped package.
148
+ return entry.origin === "catalog" && path.isAbsolute(source);
149
+ }
150
+
151
+ export function assertPromotionInstallSource(entry: MarketplaceSkill): void {
152
+ if (isOwnMarketplaceSource(entry)) return;
153
+ throw new Error(
154
+ `skill promotion: refusing to install "${entry.name}" from ${entry.sourceUrl}; ` +
155
+ "promotion installs only from Clio's own marketplace (local catalog or " +
156
+ `${OWN_MARKETPLACE_URL_PREFIX}). Install manually with clio-coder skills install if intended.`,
157
+ );
158
+ }
159
+
160
+ /**
161
+ * Persistent "never offer this skill" store. Session-scoped declines live in
162
+ * the offer registration's memory and die with the session; this file holds
163
+ * only the explicit fourth option. It is a standalone JSON document in the
164
+ * config dir rather than a settings key because the settings-v2 manifest is
165
+ * owned elsewhere this sprint; the proposed key for a later migration is
166
+ * `skills.promotionDeclines`.
167
+ */
168
+ export const PROMOTION_DECLINES_FILE = "skill-promotion-declines.json";
169
+
170
+ export interface PromotionDeclineStore {
171
+ /** decline key (name@version) -> ISO timestamp of the operator's "never" answer. */
172
+ never: Record<string, string>;
173
+ }
174
+
175
+ /**
176
+ * The decline store key. A "never" answer is scoped to the catalog version the
177
+ * operator saw, so a later version of the same skill is offerable again while a
178
+ * re-published identical version stays declined. Absent version keys as
179
+ * `name@`, distinct from any real version, so it re-offers once a version
180
+ * appears.
181
+ */
182
+ export function declineKey(name: string, version?: string): string {
183
+ return `${name}@${version ?? ""}`;
184
+ }
185
+
186
+ function declinesPath(configDir?: string): string {
187
+ return path.join(configDir ?? clioConfigDir(), PROMOTION_DECLINES_FILE);
188
+ }
189
+
190
+ export function readPromotionDeclines(configDir?: string): PromotionDeclineStore {
191
+ const file = declinesPath(configDir);
192
+ if (!existsSync(file)) return { never: {} };
193
+ try {
194
+ const parsed = JSON.parse(readFileSync(file, "utf8")) as unknown;
195
+ const never =
196
+ parsed && typeof parsed === "object" && !Array.isArray(parsed) ? (parsed as { never?: unknown }).never : undefined;
197
+ if (never && typeof never === "object" && !Array.isArray(never)) {
198
+ const entries = Object.entries(never as Record<string, unknown>).filter(
199
+ (pair): pair is [string, string] => typeof pair[1] === "string",
200
+ );
201
+ return { never: Object.fromEntries(entries) };
202
+ }
203
+ } catch {
204
+ // An unreadable store means no recorded declines; the worst outcome is
205
+ // one extra offer, which the operator can re-decline.
206
+ }
207
+ return { never: {} };
208
+ }
209
+
210
+ export function recordPromotionNeverDecline(name: string, version?: string, configDir?: string): void {
211
+ const store = readPromotionDeclines(configDir);
212
+ store.never[declineKey(name, version)] = new Date().toISOString();
213
+ safeResourceWrite(declinesPath(configDir), `${JSON.stringify(store, null, 2)}\n`, { encoding: "utf8" });
214
+ }
@@ -11,7 +11,7 @@ import type { SafetyPolicyDecision } from "./policy-engine.js";
11
11
  * rotation, and on a low-frequency background interval instead of once per
12
12
  * row, which kept blocking the admission hot path on disk latency. Write
13
13
  * errors never throw back to the caller because safety must not kill the hot
14
- * path; they are logged to stderr with a `[clio:audit]` prefix for
14
+ * path; they are logged to stderr with a `[clio-coder:audit]` prefix for
15
15
  * post-mortem review.
16
16
  *
17
17
  * Records are a discriminated union over `kind`:
@@ -404,7 +404,7 @@ interface OpenFile {
404
404
  function logAuditError(err: unknown, path?: string): void {
405
405
  const msg = err instanceof Error ? err.message : String(err);
406
406
  const where = path ? ` (${path})` : "";
407
- process.stderr.write(`[clio:audit] ${msg}${where}\n`);
407
+ process.stderr.write(`[clio-coder:audit] ${msg}${where}\n`);
408
408
  }
409
409
 
410
410
  /** Cadence of the background safety flush that bounds how long rows can sit unfsynced. */
@@ -490,9 +490,10 @@ function bashExecutionEvidence(entry: unknown): FinishContractEvidence | null {
490
490
  if (record.exitCode !== 0) return null;
491
491
  const detected = detectValidationCommand(record.command);
492
492
  if (detected.kind !== "validation") return null;
493
+ const contextMarker = record.excludeFromContext === true ? " [not sent to model]" : "";
493
494
  const evidence: FinishContractEvidence = {
494
495
  kind: "validation_command",
495
- summary: `validation command passed: ${detected.matched}`,
496
+ summary: `validation command passed: ${detected.matched}${contextMarker}`,
496
497
  };
497
498
  const turnId = turnIdOf(entry);
498
499
  if (turnId !== null) evidence.turnId = turnId;
@@ -140,7 +140,7 @@ const ENUMERABLE_ACTION_CLASSES: ReadonlySet<string> = new Set(["read", "write"]
140
140
  * `unknown` and is opaque, which is the fail-closed answer for a tool whose
141
141
  * arguments this process has no schema for.
142
142
  */
143
- export function toolWritesOpaquely(toolName: string): boolean {
143
+ function toolWritesOpaquely(toolName: string): boolean {
144
144
  return !ENUMERABLE_ACTION_CLASSES.has(classify({ tool: toolName }).actionClass);
145
145
  }
146
146
 
@@ -28,14 +28,14 @@ export function createSchedulingBundle(context: DomainContext): DomainBundle<Sch
28
28
  const observability = context.getContract<ObservabilityContract>("observability");
29
29
 
30
30
  const settings = config.get();
31
- let budget = createBudgetState(settings.budget.sessionCeilingUsd);
31
+ let budget = createBudgetState(settings.safety.limits.sessionCostUsd);
32
32
  const fleet = createFleetRegistry(() => config.get().fleet?.nodes ?? [], {
33
- localMaxWorkers: () => resolveMaxWorkers(config.get().budget.concurrency),
33
+ localMaxWorkers: () => resolveMaxWorkers(config.get().fleet.concurrency),
34
34
  });
35
35
  const unsubscribes: Array<() => void> = [];
36
36
 
37
37
  function syncBudget(): void {
38
- const nextCeiling = config.get().budget.sessionCeilingUsd;
38
+ const nextCeiling = config.get().safety.limits.sessionCostUsd;
39
39
  if (nextCeiling === budget.ceilingUsd) return;
40
40
  budget = createBudgetState(nextCeiling);
41
41
  }
@@ -83,7 +83,7 @@ export function createSchedulingBundle(context: DomainContext): DomainBundle<Sch
83
83
  const { verdict, currentUsd } = evaluate();
84
84
  return { verdict, currentUsd, ceilingUsd: budget.ceilingUsd };
85
85
  },
86
- maxWorkers: () => resolveMaxWorkers(config.get().budget.concurrency),
86
+ maxWorkers: () => resolveMaxWorkers(config.get().fleet.concurrency),
87
87
  fleet,
88
88
  };
89
89
 
@@ -42,6 +42,14 @@ export interface SessionLedgerRef {
42
42
  path: string;
43
43
  }
44
44
 
45
+ const ROUTING_NOTICE_CUSTOM_TYPE = "clio-coder.routing-notice";
46
+ const LEGACY_ROUTING_NOTICE_CUSTOM_TYPE = "clio.routing-notice";
47
+
48
+ function normalizeReleasedCustomType(entry: SessionEntry): SessionEntry {
49
+ if (entry.kind !== "custom" || entry.customType !== LEGACY_ROUTING_NOTICE_CUSTOM_TYPE) return entry;
50
+ return { ...entry, customType: ROUTING_NOTICE_CUSTOM_TYPE };
51
+ }
52
+
45
53
  /**
46
54
  * Read every `<stateDir>/audit/<date>.jsonl` row. Malformed lines are skipped
47
55
  * and reported in `errors` instead of failing the read.
@@ -157,7 +165,7 @@ export function parseSessionEntries(raw: string, source: string): SessionReadRes
157
165
  }
158
166
  if (isSessionHeader(parsed)) continue;
159
167
  if (isSessionEntry(parsed)) {
160
- entries.push(parsed);
168
+ entries.push(normalizeReleasedCustomType(parsed));
161
169
  continue;
162
170
  }
163
171
  errors.push(
@@ -162,6 +162,10 @@ export function serializeConversation(entries: ReadonlyArray<SessionEntry>): str
162
162
  continue;
163
163
  }
164
164
  if (entry.kind === "bashExecution") {
165
+ // `!!` is an operator-private terminal command. Its immutable ledger
166
+ // entry remains available to transcript replay, but neither its command
167
+ // nor its output may cross a model boundary through compaction.
168
+ if (entry.excludeFromContext === true) continue;
165
169
  parts.push(`[Bash]: $ ${entry.command}\n${truncate(entry.output, TOOL_RESULT_MAX_CHARS)}`);
166
170
  continue;
167
171
  }
@@ -497,7 +497,7 @@ interface TextBlock {
497
497
  text: string;
498
498
  }
499
499
 
500
- export function textFromAssistant(message: unknown): string {
500
+ function textFromAssistant(message: unknown): string {
501
501
  if (!message || typeof message !== "object" || !("content" in message)) return "";
502
502
  const content = (message as { content: unknown }).content;
503
503
  if (typeof content === "string") return content;
@@ -49,6 +49,10 @@ function estimateMessage(entry: MessageEntry): number {
49
49
  }
50
50
 
51
51
  function estimateBashExecution(entry: BashExecutionEntry): number {
52
+ // `!!` rows are transcript-only and never become provider input, including
53
+ // through a later compaction prompt. Charging their bytes to the model
54
+ // context would make the context meter claim the model can see private output.
55
+ if (entry.excludeFromContext === true) return 0;
52
56
  return ceilChars(entry.command.length + entry.output.length);
53
57
  }
54
58
 
@@ -370,7 +370,7 @@ export function lastLoadedContextWindow(meta: SessionMeta, providerId: string, m
370
370
  return null;
371
371
  }
372
372
 
373
- export function buildSnapshotCategories(inputs: {
373
+ function buildSnapshotCategories(inputs: {
374
374
  systemPrompt?: string | undefined;
375
375
  promptSegments?: ReadonlyArray<{ id: string; tokenEstimate: number }> | undefined;
376
376
  tools?: ReadonlyArray<unknown> | undefined;
@@ -54,7 +54,7 @@ function answeredAtForDecision(policy: AskUserToolPolicy, sourceQuestion: string
54
54
  * The policy already keeps last-value-wins decisions; the defensive map also
55
55
  * makes conversion deterministic for hand-built policies and older callers.
56
56
  */
57
- export function finalizedInterviewEntryFields(policy: AskUserToolPolicy): DecisionLedgerEntryFields | null {
57
+ function finalizedInterviewEntryFields(policy: AskUserToolPolicy): DecisionLedgerEntryFields | null {
58
58
  if (policy.rounds.length === 0 && policy.decisions.length === 0) return null;
59
59
  if (!policy.turnId) throw new Error(`decision board: interview ${policy.id} has no originating user turn`);
60
60
  if (policy.status !== "complete" && policy.status !== "cancelled") {