@iowarp/clio-coder 0.4.1 → 0.4.3

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 (604) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/CONTRIBUTING.md +142 -52
  3. package/README.md +434 -473
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-ZILU3AUO.js → acp-H2NGRPWO.js} +12 -12
  6. package/dist/{agents-HYWGBGQR.js → agents-TL5LLUQP.js} +56 -55
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-N3QT7CBO.js → auth-E5SW4HMS.js} +23 -21
  9. package/dist/builtins-IA7V7FUC.js +22 -0
  10. package/dist/{chunk-7RY5VZPH.js → chunk-2APPQIER.js} +8 -8
  11. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  12. package/dist/{chunk-JA5QWE4Z.js → chunk-2UG5F4C5.js} +1973 -1664
  13. package/dist/{chunk-5YHDIDBP.js → chunk-2UH2KFUP.js} +2 -2
  14. package/dist/{chunk-CTJ4RNAA.js → chunk-2VIKGWFZ.js} +2 -2
  15. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  16. package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
  17. package/dist/chunk-3EBYEESD.js +314 -0
  18. package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
  19. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  20. package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
  21. package/dist/chunk-4UVU7BJ5.js +39 -0
  22. package/dist/{chunk-VKRH2TCS.js → chunk-4WR7VSYB.js} +2 -2
  23. package/dist/{chunk-BBTJOK6Y.js → chunk-54CBCGIR.js} +5 -5
  24. package/dist/{chunk-AP73CFDC.js → chunk-5ICU3EUH.js} +2 -2
  25. package/dist/chunk-5MEZN6CB.js +1334 -0
  26. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  27. package/dist/{chunk-ABLSQ6JX.js → chunk-64I3JVYM.js} +8 -2
  28. package/dist/{chunk-AFKWHWXF.js → chunk-6PTFB5VS.js} +39 -22
  29. package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
  30. package/dist/chunk-7DRAWPTZ.js +360 -0
  31. package/dist/chunk-7E7I3WLS.js +3762 -0
  32. package/dist/{chunk-BJGUKIG4.js → chunk-7ZYNNDKC.js} +7 -7
  33. package/dist/{chunk-XKA2ICR3.js → chunk-AF4YM7Z4.js} +652 -252
  34. package/dist/{chunk-GVQJ5CCZ.js → chunk-AX2THNSA.js} +12 -12
  35. package/dist/{chunk-IG7BCQBA.js → chunk-B4OAX3SI.js} +65 -3
  36. package/dist/{chunk-TD3PGPQA.js → chunk-B4VEBZKF.js} +3 -3
  37. package/dist/{chunk-74YWRRU5.js → chunk-BEPZRGGU.js} +10 -10
  38. package/dist/{chunk-FEFIFZTL.js → chunk-CE5AX47J.js} +2 -2
  39. package/dist/{chunk-UAPGZHYC.js → chunk-DWUOQKRU.js} +25 -11
  40. package/dist/{chunk-THYWACCR.js → chunk-E3TPLWFX.js} +3 -3
  41. package/dist/{chunk-7EPLI7VL.js → chunk-EKCHAPYA.js} +2 -2
  42. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  43. package/dist/{chunk-PJJ6MY27.js → chunk-F5JHEYZM.js} +7 -7
  44. package/dist/{chunk-6CCS4G3W.js → chunk-FTMGRKEF.js} +3 -3
  45. package/dist/{chunk-SINK3QR6.js → chunk-G76U63X4.js} +17 -17
  46. package/dist/{chunk-EIMVLWB3.js → chunk-GHS5EBTQ.js} +64 -9
  47. package/dist/{chunk-QMXC4JB7.js → chunk-GI7YYQ3F.js} +187 -1419
  48. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  49. package/dist/{chunk-6HMJX2VU.js → chunk-GWZNEVM2.js} +44 -12
  50. package/dist/chunk-GYV6VZOC.js +26 -0
  51. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  52. package/dist/{chunk-UXN6JT4W.js → chunk-HEQY7ZFI.js} +3 -3
  53. package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
  54. package/dist/{chunk-GCSMB2KY.js → chunk-I7ZPNEJM.js} +145 -102
  55. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  56. package/dist/{chunk-QTFGO774.js → chunk-IGLP3ODT.js} +29 -16
  57. package/dist/chunk-IJNZMHLA.js +101 -0
  58. package/dist/{chunk-BDPT6GTK.js → chunk-INY6HTFL.js} +7 -7
  59. package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
  60. package/dist/{chunk-6NJQITNH.js → chunk-IWT4SF4R.js} +6 -3
  61. package/dist/{chunk-R23Z6K6I.js → chunk-JDAY6FIL.js} +19 -19
  62. package/dist/chunk-JEQ3XTHC.js +42 -0
  63. package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
  64. package/dist/{chunk-TVH4ONAM.js → chunk-JKKCYP3C.js} +10 -10
  65. package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
  66. package/dist/{chunk-C537JADH.js → chunk-KK4JZPBQ.js} +19 -141
  67. package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
  68. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  69. package/dist/{chunk-6DWBAZ5U.js → chunk-L47TF46W.js} +5 -7
  70. package/dist/{chunk-HUAS7ITX.js → chunk-LDJG7DW3.js} +91 -42
  71. package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
  72. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  73. package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
  74. package/dist/{chunk-VKFQTNDV.js → chunk-MUW2BDDH.js} +4 -4
  75. package/dist/{chunk-E67WX76H.js → chunk-MWUZBSAQ.js} +104 -152
  76. package/dist/{chunk-OJTRZGR3.js → chunk-N2Z7HLVY.js} +21 -21
  77. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  78. package/dist/{chunk-FYUN5KZ3.js → chunk-NIQJ66N4.js} +21 -21
  79. package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
  80. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  81. package/dist/{chunk-VEGN6WIQ.js → chunk-O5CVSAG5.js} +3 -3
  82. package/dist/{chunk-MOPSG2X7.js → chunk-OML5D5V5.js} +8 -8
  83. package/dist/{chunk-2VG7KLYV.js → chunk-PAJQJ7BS.js} +5816 -3255
  84. package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
  85. package/dist/{chunk-BTGG6BG2.js → chunk-QWGDJJYJ.js} +158 -19
  86. package/dist/chunk-R6Q67RJH.js +134 -0
  87. package/dist/{chunk-ZJLUDYFY.js → chunk-RRNP2ANY.js} +6 -6
  88. package/dist/{chunk-PVAMAVBB.js → chunk-RSJ25QSL.js} +102 -2
  89. package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
  90. package/dist/chunk-SKHCAU7K.js +385 -0
  91. package/dist/chunk-SZAA6XDG.js +30 -0
  92. package/dist/{chunk-J4HBWF6Y.js → chunk-TM6LQDI3.js} +131 -28
  93. package/dist/chunk-UOIZ7DA4.js +41 -0
  94. package/dist/{chunk-MA3H6DM5.js → chunk-UPZU6GE4.js} +25 -3
  95. package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
  96. package/dist/{chunk-N5UK64DP.js → chunk-V2ANDPVT.js} +4 -4
  97. package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
  98. package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
  99. package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
  100. package/dist/{chunk-QKIFBZKT.js → chunk-VW6DOEDG.js} +497 -81
  101. package/dist/{chunk-SCYB3HA4.js → chunk-W6RRQCPQ.js} +63 -19
  102. package/dist/{chunk-2NM363SV.js → chunk-WBKFA554.js} +10 -10
  103. package/dist/{chunk-R32CLGZ6.js → chunk-WCXUNS7U.js} +82 -21
  104. package/dist/{chunk-GPPB3JBE.js → chunk-WRBAGUNF.js} +3 -3
  105. package/dist/{chunk-IXJT6DCX.js → chunk-XIVNBFZS.js} +85 -30
  106. package/dist/{chunk-UEDMSP56.js → chunk-XPWWI35G.js} +417 -201
  107. package/dist/chunk-XRZT5WY5.js +47 -0
  108. package/dist/{chunk-3QSOM6PA.js → chunk-Y3CBHOR6.js} +2 -2
  109. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  110. package/dist/{chunk-AKB4GYDL.js → chunk-YQWYVTMC.js} +5 -5
  111. package/dist/{chunk-6I5ILFOF.js → chunk-ZA4VCIGV.js} +3 -3
  112. package/dist/{chunk-7OBGU7UB.js → chunk-ZDN3Y73Y.js} +12 -18
  113. package/dist/{chunk-3I5NY75V.js → chunk-ZWPRK62N.js} +8 -5
  114. package/dist/cli/index.js +41 -39
  115. package/dist/{clio-IT3G3VQH.js → clio-CMMK4KRR.js} +9 -9
  116. package/dist/{code-nav-RK6S7F6E.js → code-nav-MDZNQS33.js} +89 -21
  117. package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
  118. package/dist/{config-3QZRWZJF.js → config-SVM5P5YI.js} +131 -84
  119. package/dist/{configure-FL7Y3KJF.js → configure-LE3IK2TJ.js} +28 -26
  120. package/dist/{context-5HE7ODYK.js → context-2OHRKS42.js} +69 -64
  121. package/dist/{context-KYQFRVDC.js → context-E3VC7RX5.js} +15 -11
  122. package/dist/{context-XNHL75JV.js → context-VNCR7KAG.js} +93 -65
  123. package/dist/{context-clear-N545L53A.js → context-clear-BW4O37TG.js} +64 -60
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-QHKXSV2F.js → context-working-set-VDS25HXZ.js} +19 -18
  126. package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-5AHT53RF.js} +93 -82
  127. package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
  128. package/dist/{doctor-ZGPEGHIP.js → doctor-WNNVO6FY.js} +48 -47
  129. package/dist/{eval-GXLL44RD.js → eval-7G7SGAYO.js} +287 -115
  130. package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-Y6QRFOH5.js} +4 -4
  131. package/dist/{evidence-HWLBRH3Q.js → evidence-VD6736FQ.js} +67 -64
  132. package/dist/{evolve-FTZBMNVW.js → evolve-AL3NGVRL.js} +65 -62
  133. package/dist/{extensions-VHRBEID7.js → extensions-MOVJ32NM.js} +9 -7
  134. package/dist/{fleet-CKZHJWZJ.js → fleet-QZHUMAGI.js} +114 -111
  135. package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-BAYT5FJZ.js} +10 -10
  136. package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-IREVMRU4.js} +7 -6
  137. package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-YCTT3HTI.js} +22 -19
  138. package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-QVJTDAVB.js} +58 -55
  139. package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-25QAFPK4.js} +4 -4
  140. package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-5O57AAJ7.js} +26 -23
  141. package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-CPH2W2T6.js} +59 -56
  142. package/dist/{fleet-view-WAMJYNDT.js → fleet-view-SWBR3VGQ.js} +58 -55
  143. package/dist/{init-5XQRBOFV.js → init-J477LKZH.js} +82 -79
  144. package/dist/{interop-34TVO25M.js → interop-3FCM6XLG.js} +11 -11
  145. package/dist/{library-3QY6KF57.js → library-QUQEIUG6.js} +30 -27
  146. package/dist/{memory-L4UTIIIW.js → memory-SGGSEP65.js} +67 -64
  147. package/dist/{models-ZVX3QOWE.js → models-HEKUAXXK.js} +53 -46
  148. package/dist/{monitor-CEKVSYTS.js → monitor-HKU57TYQ.js} +63 -60
  149. package/dist/{orchestrator-77BAP6BC.js → orchestrator-VDFAEFAI.js} +1831 -1057
  150. package/dist/{panes-7STHOAUJ.js → panes-DN2SSFOH.js} +5 -5
  151. package/dist/{panes-SHAUIRXY.js → panes-TALGNPZT.js} +29 -14
  152. package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
  153. package/dist/reset-EAJFFJVB.js +344 -0
  154. package/dist/{resources-74GKTLSF.js → resources-OVKSEFVE.js} +29 -20
  155. package/dist/{run-HBAUJNNZ.js → run-7DP7ZF2J.js} +120 -115
  156. package/dist/{share-G3APVLVP.js → share-WML67FT3.js} +32 -27
  157. package/dist/{skills-35HHUKCR.js → skills-SG662R2K.js} +41 -31
  158. package/dist/{skills-eval-QN4HSHDC.js → skills-eval-VVZEUU46.js} +78 -77
  159. package/dist/{skills-inventory-J357J34F.js → skills-inventory-I2E23GET.js} +23 -20
  160. package/dist/{slash-commands-JZZCQA32.js → slash-commands-S7MBJDQK.js} +40 -36
  161. package/dist/{steer-XAVHJM22.js → steer-2LQOMCPB.js} +3 -3
  162. package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
  163. package/dist/{targets-DSM6CY3M.js → targets-4QC3HIEW.js} +54 -54
  164. package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-TUHIJ6Y2.js} +5 -5
  165. package/dist/{tools-MKNWVPBH.js → tools-TFGJICCU.js} +10 -10
  166. package/dist/{trace-ECQ7TIYZ.js → trace-FXMXUZUF.js} +55 -7
  167. package/dist/uninstall-5PEVOE5B.js +408 -0
  168. package/dist/upgrade-M4WXY6KN.js +303 -0
  169. package/dist/{usage-X52N3IDJ.js → usage-N7ZNVLEM.js} +151 -104
  170. package/dist/{verifiers-EJTVVSMA.js → verifiers-DJTP4XX6.js} +15 -15
  171. package/dist/{verify-YJL6XET2.js → verify-RWE4PPEK.js} +9 -9
  172. package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
  173. package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-C7IQOXSP.js} +89 -86
  174. package/dist/{with-panes-OBOBFIIR.js → with-panes-4GCGSL7J.js} +53 -257
  175. package/dist/worker/entry.js +90 -74
  176. package/docs/README.md +176 -81
  177. package/docs/{acp.md → architecture/acp.md} +36 -20
  178. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  179. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  180. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +27 -23
  181. package/docs/architecture/artifact-versions.md +90 -0
  182. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  183. package/docs/{context-engine.md → architecture/context-engine.md} +29 -25
  184. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  185. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  186. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  187. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  188. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  189. package/docs/{model-catalog.md → architecture/model-catalog.md} +61 -27
  190. package/docs/{observability.md → architecture/observability.md} +38 -14
  191. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  192. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +57 -20
  193. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +99 -25
  194. package/docs/{safety-model.md → architecture/safety-model.md} +35 -20
  195. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  196. package/docs/architecture/time-conventions.md +125 -0
  197. package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
  198. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  199. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  200. package/docs/{built-in-agents.md → guide/built-in-agents.md} +65 -35
  201. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +66 -61
  202. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -297
  203. package/docs/guide/configuration-reference.md +1163 -0
  204. package/docs/{environment-variables.md → guide/environment-variables.md} +33 -28
  205. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
  206. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  207. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
  208. package/docs/{glossary.md → guide/glossary.md} +14 -11
  209. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +81 -17
  210. package/docs/guide/panes-and-files.md +290 -0
  211. package/docs/{proactive-memory.md → guide/proactive-memory.md} +131 -107
  212. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  213. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +25 -3
  214. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  215. package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
  216. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
  217. package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
  218. package/docs/process/development-pipeline.md +152 -0
  219. package/docs/process/documentation-coverage.md +100 -0
  220. package/docs/process/documentation-guide.md +187 -0
  221. package/docs/{eval-runner.md → process/eval-runner.md} +108 -53
  222. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  223. package/docs/{evolution.md → process/evolution.md} +2 -2
  224. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
  225. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  226. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  227. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  228. package/evals/README.md +2 -2
  229. package/evals/behavioral-model.yaml +3 -2
  230. package/package.json +10 -8
  231. package/skills/README.md +52 -41
  232. package/skills/coding/ast-grep/SKILL.md +102 -31
  233. package/skills/coding/ast-grep/evals.md +26 -0
  234. package/skills/coding/coding-standards/SKILL.md +41 -6
  235. package/skills/coding/coding-standards/evals.md +23 -0
  236. package/skills/coding/prototype/SKILL.md +88 -29
  237. package/skills/coding/prototype/evals.md +19 -0
  238. package/skills/coding/tdd/SKILL.md +81 -54
  239. package/skills/coding/tdd/evals.md +20 -0
  240. package/skills/context/context-handoff/SKILL.md +44 -3
  241. package/skills/context/context-handoff/evals.md +44 -0
  242. package/skills/context/context-prime/SKILL.md +46 -16
  243. package/skills/context/context-prime/evals.md +45 -0
  244. package/skills/git/branch-closeout/SKILL.md +132 -0
  245. package/skills/git/branch-closeout/evals.md +133 -0
  246. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  247. package/skills/git/file-ticket/SKILL.md +78 -64
  248. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  249. package/skills/git/file-ticket/evals.md +31 -26
  250. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  251. package/skills/git/fix-issue/SKILL.md +88 -65
  252. package/skills/git/fix-issue/evals.md +35 -31
  253. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  254. package/skills/git/resolve-merge-conflicts/SKILL.md +101 -52
  255. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  256. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  257. package/skills/git/ship/SKILL.md +103 -67
  258. package/skills/git/ship/assets/pr-template.md +21 -0
  259. package/skills/git/ship/evals.md +44 -28
  260. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  261. package/skills/git/worktree-create/SKILL.md +80 -50
  262. package/skills/git/worktree-create/evals.md +40 -33
  263. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  264. package/skills/git/worktree-merge/SKILL.md +112 -65
  265. package/skills/git/worktree-merge/evals.md +42 -34
  266. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  267. package/skills/meta/clio-coder-dev/SKILL.md +9 -5
  268. package/skills/meta/clio-coder-dev/evals.md +3 -2
  269. package/skills/meta/clio-coder-test/SKILL.md +102 -95
  270. package/skills/meta/clio-coder-test/evals.md +9 -4
  271. package/skills/meta/clio-coder-test/references/harness.md +100 -124
  272. package/skills/meta/clio-coder-test/references/test-map.md +77 -50
  273. package/skills/meta/credentials/SKILL.md +2 -2
  274. package/skills/meta/find-skills/SKILL.md +2 -2
  275. package/skills/meta/herdr/SKILL.md +2 -2
  276. package/skills/meta/skill-craft/SKILL.md +22 -16
  277. package/skills/planning/archify/SKILL.md +196 -0
  278. package/skills/planning/archify/evals.md +65 -0
  279. package/skills/planning/architecture/SKILL.md +62 -13
  280. package/skills/planning/architecture/evals.md +65 -0
  281. package/skills/planning/backlog/SKILL.md +131 -15
  282. package/skills/planning/backlog/evals.md +142 -0
  283. package/skills/planning/prd/SKILL.md +47 -7
  284. package/skills/planning/prd/evals.md +54 -0
  285. package/skills/planning/product-intent/SKILL.md +58 -3
  286. package/skills/planning/product-intent/evals.md +70 -0
  287. package/skills/planning/tech-spec/SKILL.md +54 -3
  288. package/skills/planning/tech-spec/evals.md +73 -0
  289. package/skills/registry.yaml +70 -62
  290. package/skills/remote.yaml +13 -0
  291. package/skills/research/arxiv-literature/SKILL.md +77 -19
  292. package/skills/research/arxiv-literature/evals.md +50 -0
  293. package/skills/research/experiment-protocol/SKILL.md +21 -2
  294. package/skills/research/experiment-protocol/evals.md +23 -0
  295. package/skills/research/scientific-debugging/SKILL.md +24 -2
  296. package/skills/research/scientific-debugging/evals.md +18 -0
  297. package/skills/research/scientific-modernization/SKILL.md +27 -2
  298. package/skills/research/scientific-modernization/evals.md +27 -0
  299. package/skills/skill-marketplace.json +97 -62
  300. package/skills/workflow/cut-it/SKILL.md +66 -6
  301. package/skills/workflow/cut-it/evals.md +101 -0
  302. package/skills/workflow/design-council/SKILL.md +118 -28
  303. package/skills/workflow/design-council/evals.md +161 -0
  304. package/skills/workflow/grill-me/SKILL.md +87 -11
  305. package/skills/workflow/grill-me/evals.md +153 -0
  306. package/skills/workflow/workflow-distiller/SKILL.md +77 -18
  307. package/skills/workflow/workflow-distiller/evals.md +118 -0
  308. package/src/cli/args.ts +2 -2
  309. package/src/cli/bootstrap-generate.ts +1 -1
  310. package/src/cli/config-inspect.ts +65 -12
  311. package/src/cli/configure-interop.ts +105 -13
  312. package/src/cli/configure-oauth.ts +57 -0
  313. package/src/cli/configure-onboarding.ts +980 -0
  314. package/src/cli/configure-target.ts +594 -0
  315. package/src/cli/configure.ts +1082 -532
  316. package/src/cli/context-map.ts +114 -0
  317. package/src/cli/context.ts +4 -0
  318. package/src/cli/docs.ts +22 -14
  319. package/src/cli/doctor-naming.ts +5 -5
  320. package/src/cli/doctor-toolchain.ts +3 -3
  321. package/src/cli/eval.ts +1 -2
  322. package/src/cli/extensions.ts +2 -1
  323. package/src/cli/fleet.ts +1 -1
  324. package/src/cli/index.ts +3 -1
  325. package/src/cli/internal-dispatch.ts +3 -4
  326. package/src/cli/lifecycle-presenter.ts +436 -0
  327. package/src/cli/models.ts +10 -2
  328. package/src/cli/modes/print.ts +5 -1
  329. package/src/cli/panes.ts +19 -5
  330. package/src/cli/reset.ts +228 -106
  331. package/src/cli/run.ts +9 -4
  332. package/src/cli/select.ts +664 -0
  333. package/src/cli/share.ts +5 -1
  334. package/src/cli/skills-eval.ts +3 -3
  335. package/src/cli/skills.ts +9 -2
  336. package/src/cli/targets.ts +5 -6
  337. package/src/cli/trace.ts +55 -4
  338. package/src/cli/uninstall.ts +233 -165
  339. package/src/cli/upgrade.ts +204 -149
  340. package/src/cli/usage.ts +86 -27
  341. package/src/cli/validate-model.ts +3 -3
  342. package/src/cli/wiki-generate.ts +1 -1
  343. package/src/core/artifact-paths.ts +1 -1
  344. package/src/core/bash-exec.ts +131 -86
  345. package/src/core/bus-events.ts +51 -6
  346. package/src/core/config.ts +61 -1
  347. package/src/core/defaults.ts +7 -4
  348. package/src/core/dispatch-outcome.ts +16 -0
  349. package/src/core/external-diagnostic.ts +44 -0
  350. package/src/core/gateway-routing.ts +157 -0
  351. package/src/core/guardrails.ts +10 -49
  352. package/src/core/prompt-hint.ts +9 -0
  353. package/src/core/safe-exec.ts +17 -2
  354. package/src/core/skill-activation.ts +89 -2
  355. package/src/domains/agents/builtins/architect.md +2 -3
  356. package/src/domains/agents/builtins/coder.md +3 -2
  357. package/src/domains/agents/builtins/debugger.md +2 -2
  358. package/src/domains/agents/builtins/documenter.md +2 -2
  359. package/src/domains/agents/builtins/git-master.md +1 -1
  360. package/src/domains/agents/builtins/oracle.md +1 -1
  361. package/src/domains/agents/builtins/provenance.md +1 -1
  362. package/src/domains/agents/builtins/researcher.md +1 -1
  363. package/src/domains/agents/builtins/scout.md +1 -1
  364. package/src/domains/agents/builtins/tester.md +2 -2
  365. package/src/domains/agents/builtins/verifier.md +2 -2
  366. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  367. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  368. package/src/domains/agents/catalog.ts +13 -15
  369. package/src/domains/agents/contract.ts +2 -0
  370. package/src/domains/agents/extension.ts +23 -1
  371. package/src/domains/agents/result-contract.ts +70 -0
  372. package/src/domains/config/keybindings.ts +8 -0
  373. package/src/domains/context/extension.ts +0 -3
  374. package/src/domains/context/wiki/map-seed.ts +589 -0
  375. package/src/domains/context/wiki/plan.ts +2 -2
  376. package/src/domains/context/working-set/path-index.ts +1 -0
  377. package/src/domains/dispatch/admission.ts +29 -0
  378. package/src/domains/dispatch/agent-candidates.ts +10 -0
  379. package/src/domains/dispatch/budget-envelope.ts +86 -1
  380. package/src/domains/dispatch/capability-match.ts +11 -0
  381. package/src/domains/dispatch/capacity-lease.ts +17 -0
  382. package/src/domains/dispatch/contract.ts +11 -1
  383. package/src/domains/dispatch/extension.ts +237 -49
  384. package/src/domains/dispatch/host-verification.ts +435 -39
  385. package/src/domains/dispatch/intent-requirements.ts +10 -0
  386. package/src/domains/dispatch/intent.ts +18 -1
  387. package/src/domains/dispatch/path-scope.ts +235 -24
  388. package/src/domains/dispatch/run-event-journal.ts +4 -15
  389. package/src/domains/dispatch/state.ts +2 -3
  390. package/src/domains/dispatch/transport.ts +45 -21
  391. package/src/domains/dispatch/types.ts +58 -3
  392. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  393. package/src/domains/eval/artifacts/store.ts +5 -0
  394. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  395. package/src/domains/eval/metrics/token-stream.ts +201 -31
  396. package/src/domains/eval/metrics/tracked.ts +40 -4
  397. package/src/domains/eval/runners/clio-run.ts +5 -2
  398. package/src/domains/eval/schema/suite.ts +28 -0
  399. package/src/domains/eval/schema/verdict.ts +2 -2
  400. package/src/domains/eval/store.ts +8 -1
  401. package/src/domains/eval/suites/resolve.ts +13 -1
  402. package/src/domains/eval/suites/run.ts +24 -3
  403. package/src/domains/evidence/trust-status.ts +10 -1
  404. package/src/domains/extensions/contract.ts +15 -1
  405. package/src/domains/extensions/discovery.ts +238 -41
  406. package/src/domains/extensions/extension.ts +105 -6
  407. package/src/domains/extensions/index.ts +24 -0
  408. package/src/domains/extensions/integrity.ts +189 -0
  409. package/src/domains/extensions/manager.ts +17 -1
  410. package/src/domains/extensions/resource-path.ts +27 -0
  411. package/src/domains/extensions/resources.ts +18 -38
  412. package/src/domains/extensions/snapshot-store.ts +39 -0
  413. package/src/domains/extensions/snapshot.ts +180 -0
  414. package/src/domains/extensions/state.ts +385 -57
  415. package/src/domains/extensions/types.ts +118 -1
  416. package/src/domains/interop/registry.ts +6 -2
  417. package/src/domains/interop/types.ts +4 -0
  418. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  419. package/src/domains/lifecycle/migrations/index.ts +6 -0
  420. package/src/domains/lifecycle/naming-resources.ts +19 -4
  421. package/src/domains/lifecycle/naming-yazi.ts +10 -5
  422. package/src/domains/memory/task-memory-policy.ts +70 -26
  423. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  424. package/src/domains/middleware/contract.ts +26 -0
  425. package/src/domains/middleware/extension.ts +24 -24
  426. package/src/domains/middleware/hook-receipts.ts +27 -4
  427. package/src/domains/middleware/hooks-io.ts +65 -32
  428. package/src/domains/middleware/hooks.ts +64 -0
  429. package/src/domains/middleware/index.ts +28 -5
  430. package/src/domains/middleware/marketplace-offer.ts +3 -35
  431. package/src/domains/middleware/memory-intervention.ts +127 -32
  432. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  433. package/src/domains/middleware/registrations.ts +326 -0
  434. package/src/domains/middleware/runtime.ts +28 -0
  435. package/src/domains/middleware/skills-reminder.ts +31 -2
  436. package/src/domains/middleware/snapshot.ts +20 -7
  437. package/src/domains/mux/contract.ts +38 -0
  438. package/src/domains/mux/detect.ts +6 -13
  439. package/src/domains/mux/index.ts +1 -1
  440. package/src/domains/mux/operations.ts +44 -5
  441. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  442. package/src/domains/mux/yazi/session.ts +53 -4
  443. package/src/domains/mux/yazi/theme.ts +117 -17
  444. package/src/domains/observability/compaction-usage.ts +118 -0
  445. package/src/domains/observability/contract.ts +10 -11
  446. package/src/domains/observability/cost.ts +1 -1
  447. package/src/domains/observability/extension.ts +17 -4
  448. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  449. package/src/domains/observability/projection.ts +14 -90
  450. package/src/domains/observability/trace-store.ts +43 -7
  451. package/src/domains/prompts/compiler.ts +73 -53
  452. package/src/domains/prompts/contract.ts +15 -3
  453. package/src/domains/prompts/extension.ts +97 -9
  454. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
  455. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  456. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  457. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  458. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  459. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  460. package/src/domains/prompts/fragments/operating/skills.md +10 -24
  461. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  462. package/src/domains/providers/contract.ts +4 -1
  463. package/src/domains/providers/extension.ts +40 -9
  464. package/src/domains/providers/index.ts +1 -1
  465. package/src/domains/providers/model-capabilities.ts +9 -0
  466. package/src/domains/providers/model-discovery.ts +2 -0
  467. package/src/domains/providers/model-runtime-capabilities.ts +99 -25
  468. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +699 -114
  469. package/src/domains/providers/runtime-resolution.ts +31 -0
  470. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  471. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  472. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  473. package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
  474. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  475. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  476. package/src/domains/providers/support.ts +11 -5
  477. package/src/domains/providers/target-model-cache.ts +25 -2
  478. package/src/domains/providers/types/capability-flags.ts +2 -0
  479. package/src/domains/providers/types/cost-provenance.ts +19 -0
  480. package/src/domains/providers/types/local-model-quirks.ts +85 -37
  481. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  482. package/src/domains/providers/types/target-descriptor.ts +19 -0
  483. package/src/domains/resources/index.ts +3 -0
  484. package/src/domains/resources/skills/install.ts +72 -7
  485. package/src/domains/resources/skills/loader.ts +23 -19
  486. package/src/domains/resources/skills/marketplace.ts +63 -11
  487. package/src/domains/safety/autonomy.ts +15 -0
  488. package/src/domains/safety/call-target.ts +1 -1
  489. package/src/domains/safety/index.ts +1 -0
  490. package/src/domains/safety/loop-detector.ts +7 -4
  491. package/src/domains/safety/path-policy.ts +1 -1
  492. package/src/domains/safety/policy-engine.ts +34 -11
  493. package/src/domains/safety/protected-artifacts.ts +191 -88
  494. package/src/domains/safety/run-effects.ts +2 -22
  495. package/src/domains/safety/skill-authority.ts +55 -0
  496. package/src/domains/session/compaction/compact.ts +72 -22
  497. package/src/domains/session/entries.ts +6 -0
  498. package/src/domains/session/task-board.ts +10 -9
  499. package/src/domains/session/usage.ts +3 -3
  500. package/src/domains/share/archive.ts +164 -7
  501. package/src/engine/acp/server.ts +62 -9
  502. package/src/engine/agent.ts +13 -3
  503. package/src/engine/ai.ts +26 -8
  504. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  505. package/src/engine/api-registry.ts +3 -0
  506. package/src/engine/apis/llamacpp-residency.ts +3 -4
  507. package/src/engine/apis/lmstudio.ts +3 -3
  508. package/src/engine/apis/ollama-native.ts +6 -6
  509. package/src/engine/apis/openai-completions.ts +145 -39
  510. package/src/engine/apis/output-budget.ts +8 -18
  511. package/src/engine/apis/residency.ts +8 -27
  512. package/src/engine/external-subprocess.ts +114 -6
  513. package/src/engine/gemma-channel-filter.ts +19 -0
  514. package/src/engine/loop-guard.ts +92 -12
  515. package/src/engine/worker-runtime.ts +40 -11
  516. package/src/engine/worker-tools.ts +3 -1
  517. package/src/entry/background-model-metadata.ts +18 -0
  518. package/src/entry/compaction-prompt.ts +57 -0
  519. package/src/entry/extension-hook-sources.ts +28 -0
  520. package/src/entry/extension-reload.ts +309 -0
  521. package/src/entry/orchestrator.ts +464 -251
  522. package/src/entry/task-memory-lifecycle.ts +35 -0
  523. package/src/interactive/application-controller.ts +2 -1
  524. package/src/interactive/bus-notices.ts +8 -1
  525. package/src/interactive/chat-loop-messages.ts +16 -17
  526. package/src/interactive/chat-loop.ts +75 -3
  527. package/src/interactive/chat-panel.ts +36 -13
  528. package/src/interactive/chat-renderer.ts +72 -7
  529. package/src/interactive/cost-overlay.ts +26 -2
  530. package/src/interactive/dispatch-board.ts +6 -11
  531. package/src/interactive/footer/widgets.ts +13 -0
  532. package/src/interactive/interactive-application.ts +39 -4
  533. package/src/interactive/interactive-input-runtime.ts +4 -0
  534. package/src/interactive/interactive-presentation.ts +2 -2
  535. package/src/interactive/interactive-slash-runtime.ts +4 -1
  536. package/src/interactive/overlays/extensions.ts +9 -1
  537. package/src/interactive/overlays/help-reference.ts +13 -0
  538. package/src/interactive/overlays/settings.ts +27 -16
  539. package/src/interactive/panes-runtime.ts +111 -35
  540. package/src/interactive/prompt-cache-identity.ts +88 -0
  541. package/src/interactive/renderers/worker-entry.ts +32 -0
  542. package/src/interactive/slash-commands.ts +153 -20
  543. package/src/interactive/stream-pacing-policy.ts +0 -23
  544. package/src/interactive/theme/labels.ts +19 -13
  545. package/src/interactive/turn-context.ts +39 -20
  546. package/src/interactive/turn-recovery.ts +8 -0
  547. package/src/interactive/turn-runtime.ts +27 -11
  548. package/src/interactive/turn-state.ts +7 -0
  549. package/src/interactive/worker-receipts.ts +1 -0
  550. package/src/interactive/worker-stream.ts +6 -1
  551. package/src/interactive/yazi-bridge.ts +60 -6
  552. package/src/tools/agent-tools.ts +30 -1
  553. package/src/tools/artifact.ts +2 -2
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/bootstrap.ts +4 -0
  557. package/src/tools/builtin-tool-catalog.ts +52 -22
  558. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  559. package/src/tools/codewiki/code-nav.ts +99 -13
  560. package/src/tools/context/docs-engine.ts +20 -7
  561. package/src/tools/context/index.ts +59 -21
  562. package/src/tools/core-bootstrap.ts +28 -6
  563. package/src/tools/credential-present.ts +1 -2
  564. package/src/tools/dispatch-arguments.ts +6 -1
  565. package/src/tools/dispatch-event-text.ts +10 -0
  566. package/src/tools/dispatch-plan.ts +49 -4
  567. package/src/tools/dispatch-run-events.ts +1 -1
  568. package/src/tools/dispatch-runner.ts +12 -0
  569. package/src/tools/dispatch-schema.ts +338 -0
  570. package/src/tools/dispatch-types.ts +3 -0
  571. package/src/tools/dispatch.ts +9 -254
  572. package/src/tools/ledger.ts +3 -5
  573. package/src/tools/monitor-surface.ts +5 -13
  574. package/src/tools/observation.ts +4 -5
  575. package/src/tools/panes-surface.ts +4 -11
  576. package/src/tools/panes.ts +4 -2
  577. package/src/tools/policy.ts +15 -2
  578. package/src/tools/read.ts +5 -6
  579. package/src/tools/registry.ts +41 -12
  580. package/src/tools/result-shaping.ts +18 -14
  581. package/src/tools/steer-surface.ts +1 -1
  582. package/src/tools/tasks.ts +1 -1
  583. package/src/tools/truncate.ts +6 -5
  584. package/src/tools/verify/surface.ts +6 -12
  585. package/src/tools/web-fetch-surface.ts +1 -3
  586. package/src/tools/worker-evidence.ts +3 -1
  587. package/src/worker/spec-contract.ts +4 -0
  588. package/dist/builtins-UJLMOVOV.js +0 -17
  589. package/dist/chunk-5QIAJV2D.js +0 -48
  590. package/dist/chunk-JZWT5J3Y.js +0 -814
  591. package/dist/chunk-K7VKOLQQ.js +0 -15
  592. package/dist/chunk-PMZCIOCJ.js +0 -25
  593. package/dist/chunk-SUW5DORT.js +0 -819
  594. package/dist/chunk-UOV2BYIW.js +0 -107
  595. package/dist/chunk-WR6U3OVP.js +0 -45
  596. package/dist/chunk-Y45G3AXC.js +0 -1558
  597. package/dist/reset-EOLM7GVE.js +0 -230
  598. package/dist/uninstall-N34PCTGJ.js +0 -331
  599. package/dist/upgrade-H7TOM7YL.js +0 -323
  600. package/docs/artifact-versions.md +0 -67
  601. package/docs/development-pipeline.md +0 -121
  602. package/docs/documentation-coverage.md +0 -46
  603. package/docs/documentation-guide.md +0 -167
  604. package/docs/time-conventions.md +0 -101
@@ -525,6 +525,57 @@ function validateLmStudioSettings(
525
525
  return Object.keys(out).length > 0 ? out : undefined;
526
526
  }
527
527
 
528
+ function validateLiteLLMSettings(
529
+ issues: Issues,
530
+ path: string,
531
+ value: unknown,
532
+ ): ClioSettings["targets"][number]["litellm"] | undefined {
533
+ if (!isPlainObject(value)) {
534
+ issues.add(path, `expected a map, got ${describe(value)}`);
535
+ return undefined;
536
+ }
537
+ issues.unknownKeys(path, value, ["request"]);
538
+ const out: NonNullable<ClioSettings["targets"][number]["litellm"]> = {};
539
+ if ("request" in value) {
540
+ if (!isPlainObject(value.request)) {
541
+ issues.add(`${path}.request`, `expected a map, got ${describe(value.request)}`);
542
+ } else {
543
+ issues.unknownKeys(`${path}.request`, value.request, [
544
+ "tags",
545
+ "sendSessionId",
546
+ "timeoutSeconds",
547
+ "streamTimeoutSeconds",
548
+ "numRetries",
549
+ ]);
550
+ const request: NonNullable<typeof out.request> = {};
551
+ if ("tags" in value.request) {
552
+ const parsed = expectStringArray(issues, `${path}.request.tags`, value.request.tags);
553
+ if (parsed !== undefined) {
554
+ const invalidTag = parsed.find((tag) => tag.includes(","));
555
+ if (invalidTag) issues.add(`${path}.request.tags`, "tags may not contain commas");
556
+ else if (parsed.length > 0) request.tags = [...new Set(parsed)];
557
+ }
558
+ }
559
+ if ("sendSessionId" in value.request) {
560
+ const parsed = expectBoolean(issues, `${path}.request.sendSessionId`, value.request.sendSessionId);
561
+ if (parsed !== undefined) request.sendSessionId = parsed;
562
+ }
563
+ for (const key of ["timeoutSeconds", "streamTimeoutSeconds"] as const) {
564
+ if (key in value.request) {
565
+ const parsed = expectNumber(issues, `${path}.request.${key}`, value.request[key], { min: 0.001, max: 86_400 });
566
+ if (parsed !== undefined) request[key] = parsed;
567
+ }
568
+ }
569
+ if ("numRetries" in value.request) {
570
+ const parsed = expectInteger(issues, `${path}.request.numRetries`, value.request.numRetries, { min: 0, max: 100 });
571
+ if (parsed !== undefined) request.numRetries = parsed;
572
+ }
573
+ if (Object.keys(request).length > 0) out.request = request;
574
+ }
575
+ }
576
+ return Object.keys(out).length > 0 ? out : undefined;
577
+ }
578
+
528
579
  function validateTarget(issues: Issues, path: string, value: unknown): ClioSettings["targets"][number] | null {
529
580
  if (!isPlainObject(value)) {
530
581
  issues.add(path, `expected a map, got ${describe(value)}`);
@@ -542,6 +593,7 @@ function validateTarget(issues: Issues, path: string, value: unknown): ClioSetti
542
593
  "gateway",
543
594
  "pricing",
544
595
  "lmstudio",
596
+ "litellm",
545
597
  "maxConcurrentRequests",
546
598
  ]);
547
599
  const id = "id" in value ? expectString(issues, `${path}.id`, value.id) : undefined;
@@ -593,6 +645,10 @@ function validateTarget(issues: Issues, path: string, value: unknown): ClioSetti
593
645
  const v = validateLmStudioSettings(issues, `${path}.lmstudio`, value.lmstudio);
594
646
  if (v !== undefined) target.lmstudio = v;
595
647
  }
648
+ if ("litellm" in value) {
649
+ const v = validateLiteLLMSettings(issues, `${path}.litellm`, value.litellm);
650
+ if (v !== undefined) target.litellm = v;
651
+ }
596
652
  if ("maxConcurrentRequests" in value) {
597
653
  const v = expectInteger(issues, `${path}.maxConcurrentRequests`, value.maxConcurrentRequests, { min: 1 });
598
654
  if (v !== undefined) target.maxConcurrentRequests = v;
@@ -1486,7 +1542,11 @@ export function validateSettings(raw: unknown): SettingsValidationResult {
1486
1542
  if (!isPlainObject(raw.context)) issues.add("context", `expected a map, got ${describe(raw.context)}`);
1487
1543
  else {
1488
1544
  const context = raw.context;
1489
- issues.unknownKeys("context", context, ["workingSet", "compaction", "memory"]);
1545
+ issues.unknownKeys("context", context, ["toolResultMaxBytes", "workingSet", "compaction", "memory"]);
1546
+ if ("toolResultMaxBytes" in context) {
1547
+ const parsed = expectInteger(issues, "context.toolResultMaxBytes", context.toolResultMaxBytes, { min: 4096 });
1548
+ if (parsed !== undefined) settings.context.toolResultMaxBytes = parsed;
1549
+ }
1490
1550
  if ("workingSet" in context) {
1491
1551
  if (!isPlainObject(context.workingSet))
1492
1552
  issues.add("context.workingSet", `expected a map, got ${describe(context.workingSet)}`);
@@ -412,6 +412,7 @@ export interface MemorySettings {
412
412
  }
413
413
 
414
414
  export interface ContextSettings {
415
+ toolResultMaxBytes: number;
415
416
  workingSet: WorkingSetSettings;
416
417
  compaction: DurableCompactionSettings;
417
418
  memory: MemorySettings;
@@ -447,13 +448,13 @@ export const DEFAULT_SETTINGS = {
447
448
  chat: {
448
449
  target: null as string | null,
449
450
  model: null as string | null,
450
- thinkingLevel: "off" as ThinkingLevel,
451
+ thinkingLevel: "low" as ThinkingLevel,
451
452
  modelPicker: {
452
453
  cycleSet: [] as string[],
453
454
  favorites: [] as string[],
454
455
  recentLimit: 12,
455
456
  } as ModelSelectorSettings,
456
- maxOutputTokens: 32768,
457
+ maxOutputTokens: 0,
457
458
  prewarm: true,
458
459
  retry: {
459
460
  enabled: true,
@@ -491,6 +492,7 @@ export const DEFAULT_SETTINGS = {
491
492
  history: { maxRuns: GUARDRAIL_DEFAULTS.maxDispatchRuns, journal: true },
492
493
  } as FleetSettings,
493
494
  context: {
495
+ toolResultMaxBytes: 65536,
494
496
  workingSet: DEFAULT_WORKING_SET_SETTINGS,
495
497
  compaction: {
496
498
  auto: true,
@@ -582,12 +584,12 @@ targets: []
582
584
  chat:
583
585
  target: null
584
586
  model: null
585
- thinkingLevel: off
587
+ thinkingLevel: low
586
588
  modelPicker:
587
589
  cycleSet: []
588
590
  favorites: []
589
591
  recentLimit: 12
590
- maxOutputTokens: 32768
592
+ maxOutputTokens: 0
591
593
  prewarm: true
592
594
  retry:
593
595
  enabled: true
@@ -626,6 +628,7 @@ fleet:
626
628
  journal: true
627
629
 
628
630
  context:
631
+ toolResultMaxBytes: 65536
629
632
  workingSet:
630
633
  enabled: true
631
634
  policy: structural-v1
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Shared mapping from a `DispatchFailed` payload's `reason` field to the
3
+ * terminal status it implies. Both the observability projection's run
4
+ * summary (src/domains/observability/projection.ts) and the interactive
5
+ * dispatch board (src/interactive/dispatch-board.ts) derive a run's status
6
+ * from the same DispatchCompleted/DispatchFailed bus events; before this
7
+ * module existed they each carried their own copy of this exact mapping,
8
+ * kept in sync only by a comment asking the next editor to remember to.
9
+ */
10
+ export type DispatchFailureStatus = "dead" | "aborted" | "failed";
11
+
12
+ export function resolveDispatchFailureStatus(reason: unknown): DispatchFailureStatus {
13
+ if (reason === "dead" || reason === "stalled") return "dead";
14
+ if (reason === "interrupted" || reason === "canceled") return "aborted";
15
+ return "failed";
16
+ }
@@ -0,0 +1,44 @@
1
+ const REDACTED = "[redacted]";
2
+
3
+ /**
4
+ * Sanitize free-form text received from an external process before it crosses
5
+ * into errors, receipts, transcripts, evidence, or model-catalog snapshots.
6
+ */
7
+ function redactExternalDiagnostic(input: string): string {
8
+ return input
9
+ .replace(/\b(?:authorization|proxy-authorization)\s*:\s*[^\r\n]+/giu, `Authorization: ${REDACTED}`)
10
+ .replace(/\b(?:set-cookie|cookie)\s*:\s*[^\r\n]+/giu, `Cookie: ${REDACTED}`)
11
+ .replace(/\bbearer\s+[A-Za-z0-9._~+/-]+=*/giu, `Bearer ${REDACTED}`)
12
+ .replace(
13
+ /\b(?:api[_-]?key|access[_-]?token|refresh[_-]?token|token|secret|password)\s*[:=]\s*[^\s,;]+/giu,
14
+ (match) => {
15
+ const separator = match.includes(":") ? ":" : "=";
16
+ return `${match.slice(0, match.indexOf(separator)).trim()}${separator}${REDACTED}`;
17
+ },
18
+ )
19
+ .replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/gu, REDACTED)
20
+ .replace(
21
+ /(?:~|\/[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)*)\/\.(?:gemini\/antigravity-cli|antigravitycli)(?:\/[^\s]*)?/gu,
22
+ "[redacted credential path]",
23
+ )
24
+ .replace(/https?:\/\/[^\s"'<>]+/giu, (url) => {
25
+ try {
26
+ const parsed = new URL(url);
27
+ if (/(?:auth|oauth|login|signin|callback)/iu.test(parsed.pathname)) return "[redacted authorization URL]";
28
+ parsed.username = "";
29
+ parsed.password = "";
30
+ parsed.search = "";
31
+ parsed.hash = "";
32
+ return parsed.toString();
33
+ } catch {
34
+ return REDACTED;
35
+ }
36
+ });
37
+ }
38
+
39
+ export function boundedExternalDiagnostic(input: string, maxBytes = 8192): string {
40
+ const redacted = redactExternalDiagnostic(input).trim();
41
+ const bytes = Buffer.from(redacted, "utf8");
42
+ if (bytes.byteLength <= maxBytes) return redacted;
43
+ return `${bytes.subarray(0, Math.max(0, maxBytes - 32)).toString("utf8")}\n[diagnostic truncated]`;
44
+ }
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Durable routing facts reported by an AI gateway for one upstream response.
3
+ *
4
+ * The gateway is authoritative for the physical deployment that served an
5
+ * alias. Clio deliberately records only the host portion of an upstream API
6
+ * base: LiteLLM deployments may embed paths, query credentials, or user-info
7
+ * in the configured URL, none of which belongs in a session or sealed receipt.
8
+ */
9
+ export interface LiteLLMGatewayRoutingObservation {
10
+ gateway: "litellm";
11
+ callId?: string;
12
+ modelGroup?: string;
13
+ modelName?: string;
14
+ apiBaseHost?: string;
15
+ deploymentId?: string;
16
+ attemptedFallbacks?: number;
17
+ attemptedRetries?: number;
18
+ overheadMs?: number;
19
+ responseDurationMs?: number;
20
+ version?: string;
21
+ }
22
+
23
+ export type GatewayRoutingObservation = LiteLLMGatewayRoutingObservation;
24
+
25
+ /**
26
+ * Preserve the provider's diagnostic while making Clio's failure policy
27
+ * explicit and actionable. LiteLLM targets deliberately do not enter Clio's
28
+ * transient retry ladder: a named route is an operator choice, not permission
29
+ * to substitute another model behind their back.
30
+ */
31
+ export function liteLLMRouteFailureMessage(
32
+ errorMessage: string | null | undefined,
33
+ targetId: string,
34
+ modelId: string,
35
+ ): string {
36
+ const providerMessage = errorMessage?.trim() || "LiteLLM request failed.";
37
+ const advice =
38
+ `LiteLLM route '${modelId}' on target '${targetId}' failed. ` +
39
+ "Clio did not retry or substitute another model; select a different route with /model, then resend.";
40
+ return providerMessage.includes(advice) ? providerMessage : `${providerMessage}\n\n${advice}`;
41
+ }
42
+
43
+ interface HeaderReader {
44
+ get(name: string): string | null;
45
+ }
46
+
47
+ function nonEmptyString(value: unknown): string | undefined {
48
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
49
+ }
50
+
51
+ function nonnegativeNumber(value: unknown): number | undefined {
52
+ if (typeof value === "number" && Number.isFinite(value) && value >= 0) return value;
53
+ if (typeof value !== "string" || value.trim().length === 0) return undefined;
54
+ const parsed = Number(value);
55
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;
56
+ }
57
+
58
+ function nonnegativeInteger(value: unknown): number | undefined {
59
+ const parsed = nonnegativeNumber(value);
60
+ return parsed === undefined ? undefined : Math.floor(parsed);
61
+ }
62
+
63
+ function apiBaseHost(value: unknown): string | undefined {
64
+ const raw = nonEmptyString(value);
65
+ if (raw === undefined) return undefined;
66
+ try {
67
+ return new URL(raw).host || undefined;
68
+ } catch {
69
+ return undefined;
70
+ }
71
+ }
72
+
73
+ function storedApiBaseHost(value: unknown): string | undefined {
74
+ const raw = nonEmptyString(value);
75
+ if (raw === undefined) return undefined;
76
+ try {
77
+ return new URL(raw.includes("://") ? raw : `http://${raw}`).host || undefined;
78
+ } catch {
79
+ return undefined;
80
+ }
81
+ }
82
+
83
+ /** Read LiteLLM's response headers without retaining sensitive API-base data. */
84
+ export function liteLLMGatewayRoutingFromHeaders(headers: HeaderReader): GatewayRoutingObservation | null {
85
+ const callId = nonEmptyString(headers.get("x-litellm-call-id"));
86
+ const modelGroup = nonEmptyString(headers.get("x-litellm-model-group"));
87
+ const modelName = nonEmptyString(headers.get("x-litellm-model-name"));
88
+ const host = apiBaseHost(headers.get("x-litellm-model-api-base"));
89
+ const deploymentId = nonEmptyString(headers.get("x-litellm-model-id"));
90
+ const attemptedFallbacks = nonnegativeInteger(headers.get("x-litellm-attempted-fallbacks"));
91
+ const attemptedRetries = nonnegativeInteger(headers.get("x-litellm-attempted-retries"));
92
+ const overheadMs = nonnegativeNumber(headers.get("x-litellm-overhead-duration-ms"));
93
+ const responseDurationMs = nonnegativeNumber(headers.get("x-litellm-response-duration-ms"));
94
+ const version = nonEmptyString(headers.get("x-litellm-version"));
95
+ const observation: GatewayRoutingObservation = {
96
+ gateway: "litellm",
97
+ ...(callId !== undefined ? { callId } : {}),
98
+ ...(modelGroup !== undefined ? { modelGroup } : {}),
99
+ ...(modelName !== undefined ? { modelName } : {}),
100
+ ...(host !== undefined ? { apiBaseHost: host } : {}),
101
+ ...(deploymentId !== undefined ? { deploymentId } : {}),
102
+ ...(attemptedFallbacks !== undefined ? { attemptedFallbacks } : {}),
103
+ ...(attemptedRetries !== undefined ? { attemptedRetries } : {}),
104
+ ...(overheadMs !== undefined ? { overheadMs } : {}),
105
+ ...(responseDurationMs !== undefined ? { responseDurationMs } : {}),
106
+ ...(version !== undefined ? { version } : {}),
107
+ };
108
+ return Object.keys(observation).length > 1 ? observation : null;
109
+ }
110
+
111
+ /** Parse a live message, persisted session row, or receipt response defensively. */
112
+ export function gatewayRoutingObservationFromRecord(
113
+ record: Readonly<Record<string, unknown>>,
114
+ ): GatewayRoutingObservation | null {
115
+ const value = record.gatewayRouting;
116
+ if (value === null || typeof value !== "object" || Array.isArray(value)) return null;
117
+ const raw = value as Record<string, unknown>;
118
+ if (raw.gateway !== "litellm") return null;
119
+ const callId = nonEmptyString(raw.callId);
120
+ const modelGroup = nonEmptyString(raw.modelGroup);
121
+ const modelName = nonEmptyString(raw.modelName);
122
+ const host = storedApiBaseHost(raw.apiBaseHost);
123
+ const deploymentId = nonEmptyString(raw.deploymentId);
124
+ const attemptedFallbacks = nonnegativeInteger(raw.attemptedFallbacks);
125
+ const attemptedRetries = nonnegativeInteger(raw.attemptedRetries);
126
+ const overheadMs = nonnegativeNumber(raw.overheadMs);
127
+ const responseDurationMs = nonnegativeNumber(raw.responseDurationMs);
128
+ const version = nonEmptyString(raw.version);
129
+ const observation: GatewayRoutingObservation = {
130
+ gateway: "litellm",
131
+ ...(callId !== undefined ? { callId } : {}),
132
+ ...(modelGroup !== undefined ? { modelGroup } : {}),
133
+ ...(modelName !== undefined ? { modelName } : {}),
134
+ ...(host !== undefined ? { apiBaseHost: host } : {}),
135
+ ...(deploymentId !== undefined ? { deploymentId } : {}),
136
+ ...(attemptedFallbacks !== undefined ? { attemptedFallbacks } : {}),
137
+ ...(attemptedRetries !== undefined ? { attemptedRetries } : {}),
138
+ ...(overheadMs !== undefined ? { overheadMs } : {}),
139
+ ...(responseDurationMs !== undefined ? { responseDurationMs } : {}),
140
+ ...(version !== undefined ? { version } : {}),
141
+ };
142
+ return Object.keys(observation).length > 1 ? observation : null;
143
+ }
144
+
145
+ /** Compact human projection for receipts and operator notices. */
146
+ export function gatewayRoutingObservationLabel(observation: GatewayRoutingObservation): string {
147
+ const route = [observation.modelGroup, observation.modelName].filter(Boolean).join("->");
148
+ const destination = [route, observation.apiBaseHost ? `@${observation.apiBaseHost}` : ""].filter(Boolean).join("");
149
+ const parts = [
150
+ "gateway=litellm",
151
+ ...(destination ? [`route=${destination}`] : []),
152
+ ...(observation.attemptedFallbacks !== undefined ? [`fallbacks=${observation.attemptedFallbacks}`] : []),
153
+ ...(observation.attemptedRetries !== undefined ? [`retries=${observation.attemptedRetries}`] : []),
154
+ ...(observation.overheadMs !== undefined ? [`overhead_ms=${observation.overheadMs}`] : []),
155
+ ];
156
+ return parts.join(" ");
157
+ }
@@ -2,17 +2,11 @@
2
2
  * Guardrail policy values: the numeric backstops that bound runaway agent
3
3
  * behavior (tool-call budgets, tool output byte caps, dispatch ledger size).
4
4
  *
5
- * These are durable operator policy, the same species as
6
- * `compaction.threshold`, so their primary home is the `guardrails:` section
7
- * of settings.yaml. The composition roots (orchestrator entry and worker
8
- * runtime) wire that section in via {@link configureGuardrails}; consumers
9
- * resolve values through {@link resolveGuardrail}, which layers a per-process
10
- * env override on top for CI and one-off experiments:
11
- *
12
- * env var > settings.yaml guardrails > built-in default
13
- *
14
- * Every value is a positive safe integer; invalid overrides fall through to
15
- * the next layer rather than erroring.
5
+ * These are durable operator policy, so their only configurable home is the
6
+ * canonical version 2 settings tree. Composition roots project that tree into
7
+ * this process through {@link configureGuardrails}; hot-path consumers resolve
8
+ * the current projection through {@link resolveGuardrail} without reading
9
+ * settings.yaml themselves.
16
10
  */
17
11
 
18
12
  export interface GuardrailValues {
@@ -66,16 +60,6 @@ export const GUARDRAIL_DEFAULTS: GuardrailValues = {
66
60
  internalDispatchTimeoutMs: 15 * 60 * 1000,
67
61
  };
68
62
 
69
- /** Per-process env overrides, one per guardrail. */
70
- export const GUARDRAIL_ENV_VARS: Readonly<Record<keyof GuardrailValues, string>> = {
71
- turnToolCallBudget: "CLIO_CODER_TURN_TOOL_CALL_BUDGET",
72
- workerToolCallCap: "CLIO_CODER_WORKER_TOOL_CALL_CAP",
73
- maxDispatchRuns: "CLIO_CODER_MAX_DISPATCH_RUNS",
74
- readMaxBytes: "CLIO_CODER_READ_MAX_BYTES",
75
- observationTurnBudgetBytes: "CLIO_CODER_OBSERVATION_TURN_BUDGET_BYTES",
76
- internalDispatchTimeoutMs: "CLIO_CODER_INTERNAL_DISPATCH_TIMEOUT_MS",
77
- };
78
-
79
63
  /** Project canonical v2 settings leaves onto the process-local guardrail registry. */
80
64
  export function guardrailValuesFromSettings(settings: {
81
65
  safety: {
@@ -100,15 +84,6 @@ export function guardrailValuesFromSettings(settings: {
100
84
  };
101
85
  }
102
86
 
103
- /**
104
- * Older env spellings that still read. `CLIO_CODER_MAX_RUNS` was the only
105
- * guardrail whose variable was not the SCREAMING_SNAKE of its key, and CI
106
- * environments already set it, so it keeps working behind the canonical name.
107
- */
108
- const GUARDRAIL_ENV_ALIASES: Readonly<Partial<Record<keyof GuardrailValues, string>>> = {
109
- maxDispatchRuns: "CLIO_CODER_MAX_RUNS",
110
- };
111
-
112
87
  /**
113
88
  * One-shot annotation attached to the first tool result inside the reserve
114
89
  * window. Advisory: the call that carried it still ran; only subsequent
@@ -178,28 +153,14 @@ export function mentionsWorkerToolCallCap(text: string | null | undefined): bool
178
153
  let configured: Partial<GuardrailValues> = {};
179
154
 
180
155
  /**
181
- * Install the settings.yaml `guardrails:` section. Called once per process by
182
- * the composition roots; later calls replace the whole layer (used by tests).
156
+ * Install the effective settings projection. Later calls replace the whole
157
+ * layer when a session override or configuration reload changes the view.
183
158
  */
184
159
  export function configureGuardrails(values: Partial<GuardrailValues> | undefined): void {
185
160
  configured = { ...(values ?? {}) };
186
161
  }
187
162
 
188
- function parsePositiveSafeInt(raw: string | undefined): number | undefined {
189
- if (raw === undefined) return undefined;
190
- const normalized = raw.trim();
191
- if (!/^[1-9]\d*$/.test(normalized)) return undefined;
192
- const parsed = Number(normalized);
193
- return Number.isSafeInteger(parsed) ? parsed : undefined;
194
- }
195
-
196
- /** Resolve one guardrail: env override > configured settings > default. */
197
- export function resolveGuardrail(key: keyof GuardrailValues, env: NodeJS.ProcessEnv = process.env): number {
198
- const alias = GUARDRAIL_ENV_ALIASES[key];
199
- return (
200
- parsePositiveSafeInt(env[GUARDRAIL_ENV_VARS[key]]) ??
201
- (alias ? parsePositiveSafeInt(env[alias]) : undefined) ??
202
- configured[key] ??
203
- GUARDRAIL_DEFAULTS[key]
204
- );
163
+ /** Resolve one guardrail from the effective settings projection or its default. */
164
+ export function resolveGuardrail(key: keyof GuardrailValues): number {
165
+ return configured[key] ?? GUARDRAIL_DEFAULTS[key];
205
166
  }
@@ -0,0 +1,9 @@
1
+ /** Collapse descriptor-authored prompt guidance to one byte-stable line. */
2
+ export function normalizePromptHint(text: string | undefined): string | undefined {
3
+ if (!text) return undefined;
4
+ const normalized = text
5
+ .replace(/[\r\n]+/gu, " ")
6
+ .replace(/\s+/gu, " ")
7
+ .trim();
8
+ return normalized.length > 0 ? normalized : undefined;
9
+ }
@@ -24,6 +24,18 @@ const ENV_ALLOWLIST = [
24
24
  "TMP",
25
25
  "CI",
26
26
  "NO_COLOR",
27
+ // Platform/session location variables needed by installed local CLIs. These
28
+ // locate operator-owned state; provider keys and Clio gates are deliberately
29
+ // absent from this allowlist.
30
+ "XDG_CONFIG_HOME",
31
+ "XDG_CACHE_HOME",
32
+ "XDG_STATE_HOME",
33
+ "APPDATA",
34
+ "LOCALAPPDATA",
35
+ "SYSTEMROOT",
36
+ "WINDIR",
37
+ "COMSPEC",
38
+ "PATHEXT",
27
39
  ] as const;
28
40
 
29
41
  export interface SafeCommandResult {
@@ -49,10 +61,13 @@ export interface RunCommandVectorOptions {
49
61
  env?: Record<string, string>;
50
62
  }
51
63
 
52
- export function buildSafeToolEnv(extra: Record<string, string> = {}): NodeJS.ProcessEnv {
64
+ export function buildSafeToolEnv(
65
+ extra: Record<string, string> = {},
66
+ source: NodeJS.ProcessEnv = process.env,
67
+ ): NodeJS.ProcessEnv {
53
68
  const env: NodeJS.ProcessEnv = {};
54
69
  for (const key of ENV_ALLOWLIST) {
55
- const value = process.env[key];
70
+ const value = source[key];
56
71
  if (value !== undefined) env[key] = value;
57
72
  }
58
73
  for (const [key, value] of Object.entries(extra)) {
@@ -58,6 +58,90 @@ export interface PendingSkillToolPolicy {
58
58
  loadedSkillNames: Set<string>;
59
59
  /** Declared tool policy per successfully loaded skill, recorded by context(scope=skills). */
60
60
  loadedSkillPolicies: Map<string, SkillDeclaredToolPolicy>;
61
+ /**
62
+ * True once this policy is a surface that outlived the turn that armed it.
63
+ * The narrowing is identical; the flag exists so a load request the policy
64
+ * does not cover reads as "only the operator activates skills" rather than
65
+ * claiming a pending request that no longer exists.
66
+ */
67
+ carriedSurface?: boolean;
68
+ /**
69
+ * True when the session's autonomy level lets the model activate an
70
+ * installed skill itself instead of emitting the suggestion anchor and
71
+ * waiting for `/skill`. Activation is the same per-run policy the operator's
72
+ * path produces: skills only ever narrow the tool surface, so this grants
73
+ * nothing the level had not already granted. Marketplace (not yet
74
+ * installed) skills stay operator-gated at every level.
75
+ */
76
+ modelActivation?: boolean;
77
+ }
78
+
79
+ /**
80
+ * The surface that stays armed after an interactive turn ends.
81
+ *
82
+ * A skill an operator loaded narrows the tools for the workflow it started,
83
+ * and a multi-turn workflow (an interview skill asking a question per turn)
84
+ * is still inside that workflow on the operator's next message. Dropping the
85
+ * narrowing at turn end handed the workflow back the full surface partway
86
+ * through, which is how a `bash` call correctly refused in turn one ran in
87
+ * turn six. Returns undefined when nothing declared a narrowing, which is the
88
+ * signal to clear whatever surface was armed before.
89
+ */
90
+ export function armedSkillSurface(policy: PendingSkillToolPolicy | undefined): PendingSkillToolPolicy | undefined {
91
+ if (!policy) return undefined;
92
+ const declared = [...policy.loadedSkillPolicies.entries()].filter(
93
+ ([, declaration]) => (declaration.allowedTools?.length ?? 0) > 0 || (declaration.disallowedTools?.length ?? 0) > 0,
94
+ );
95
+ if (declared.length === 0) return undefined;
96
+ return {
97
+ allowedSkillNames: [...policy.allowedSkillNames],
98
+ requests: [...policy.requests],
99
+ loadedSkillNames: new Set(policy.loadedSkillNames),
100
+ loadedSkillPolicies: new Map(declared),
101
+ carriedSurface: true,
102
+ };
103
+ }
104
+
105
+ /** Skill names contributing a declaration to an armed surface, for the operator notice. */
106
+ export function skillSurfaceNames(policy: PendingSkillToolPolicy | undefined): ReadonlyArray<string> {
107
+ return policy ? [...policy.loadedSkillPolicies.keys()] : [];
108
+ }
109
+
110
+ /**
111
+ * The same names, each tagged with who activated it. A skill the operator
112
+ * named arrives as a pending request; anything else was activated by the model
113
+ * under `modelActivation`, and the operator's one line about the surface is
114
+ * where that distinction has to be visible.
115
+ */
116
+ export function skillSurfaceLabels(policy: PendingSkillToolPolicy | undefined): ReadonlyArray<string> {
117
+ if (!policy) return [];
118
+ return [...policy.loadedSkillPolicies.keys()].map((name) =>
119
+ policy.requests.some((request) => request.name === name) ? `${name} (operator)` : `${name} (model)`,
120
+ );
121
+ }
122
+
123
+ /**
124
+ * Stamp (or clear) the model-activation grant on the policy this turn runs
125
+ * under, creating one when nothing else did. Mutates in place so a surface
126
+ * carried from an earlier turn keeps its identity, and re-stamps every turn so
127
+ * a level change takes effect on the next message rather than the next skill.
128
+ */
129
+ export function withModelSkillActivation(
130
+ policy: PendingSkillToolPolicy | undefined,
131
+ enabled: boolean,
132
+ ): PendingSkillToolPolicy | undefined {
133
+ if (policy) {
134
+ policy.modelActivation = enabled;
135
+ return policy;
136
+ }
137
+ if (!enabled) return undefined;
138
+ return {
139
+ allowedSkillNames: [],
140
+ requests: [],
141
+ loadedSkillNames: new Set<string>(),
142
+ loadedSkillPolicies: new Map<string, SkillDeclaredToolPolicy>(),
143
+ modelActivation: true,
144
+ };
61
145
  }
62
146
 
63
147
  /**
@@ -75,6 +159,8 @@ export interface SkillToolSurfaceViolation {
75
159
  mergedAllowedTools: ReadonlyArray<string> | null;
76
160
  /** Skills whose disallowed-tools name the tool directly. */
77
161
  disallowedBy: ReadonlyArray<string>;
162
+ /** True when the surface outlived the turn that armed it, which changes the lifetime the block message states. */
163
+ carriedSurface: boolean;
78
164
  }
79
165
 
80
166
  /**
@@ -98,15 +184,16 @@ export function evaluateSkillToolSurface(
98
184
  if (SKILL_SURFACE_EXEMPT_TOOLS.has(tool)) return null;
99
185
  const entries = [...policy.loadedSkillPolicies.entries()];
100
186
  const skills = entries.map(([name]) => name);
187
+ const carriedSurface = policy.carriedSurface === true;
101
188
  const disallowedBy = entries
102
189
  .filter(([, declared]) => declared.disallowedTools?.includes(tool) === true)
103
190
  .map(([name]) => name);
104
- if (disallowedBy.length > 0) return { skills, mergedAllowedTools: null, disallowedBy };
191
+ if (disallowedBy.length > 0) return { skills, mergedAllowedTools: null, disallowedBy, carriedSurface };
105
192
  const allowLists = entries.map(([, declared]) => declared.allowedTools);
106
193
  if (allowLists.some((list) => list === undefined || list.length === 0)) return null;
107
194
  const merged = [...new Set(allowLists.flatMap((list) => [...(list ?? [])]))];
108
195
  if (merged.includes(tool)) return null;
109
- return { skills, mergedAllowedTools: merged, disallowedBy: [] };
196
+ return { skills, mergedAllowedTools: merged, disallowedBy: [], carriedSurface };
110
197
  }
111
198
 
112
199
  /**
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1
3
3
  name: Architect
4
- description: Designs coding changes across boundaries, contracts, migrations, and validation gates; slices an existing plan into an executable dependency-ordered sprint via its bound cut-it skill.
4
+ description: Designs a change across boundaries and slices it into a sprint. Covers contracts, migrations, and validation gates, and turns an existing plan into a dependency-ordered sprint through its bound cut-it skill.
5
5
  tools:
6
6
  required: [artifact, context]
7
7
  optional: [read, grep, find, ls, code_nav, git, ledger]
@@ -22,8 +22,7 @@ You are Architect, the base design agent for coding work.
22
22
  Start by restating the requested change, the affected modules, and the decision the operator needs.
23
23
  Read contracts, manifests, call sites, and recent diffs before recommending a shape.
24
24
  Map ownership boundaries first: domains, engine, worker, tools, prompts, tests, docs, and runtime receipts.
25
- Before broad exploration, check `code_nav mode=wiki` and read `.clio-coder/wiki/quickstart.md` when a wiki exists.
26
- Use codewiki tools only when the assignment is navigation-heavy. Otherwise rely on the provided context and targeted reads.
25
+ When `code_nav` is among your tools and a wiki exists, check `code_nav mode=wiki` and read `.clio-coder/wiki/quickstart.md` before broad exploration; otherwise rely on the provided context and targeted reads.
27
26
  Prefer extending existing contracts over adding abstractions unless the new surface removes real complexity.
28
27
  Separate the required implementation slice from optional follow-up work.
29
28
  Call out prompt, safety, persistence, worker-runtime, and test consequences when they apply.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  version: 1
3
3
  name: Coder
4
- description: Implements bounded code changes, repairs, and behavior-preserving refactors.
4
+ description: Implements bounded code changes, repairs, and refactors. Behavior-preserving by default.
5
5
  tools:
6
6
  required: [read, {anyOf: [write, edit]}, context]
7
7
  optional: [grep, find, ls, web_fetch, git, verify, code_nav, bash, ledger]
@@ -21,12 +21,13 @@ tags: [implementation, repair, refactor]
21
21
  You are Coder, the base implementation agent.
22
22
  Start by restating the assigned coding task and the finished-state criteria.
23
23
  Read the local code, tests, and call sites before changing files.
24
- When the task is navigation-heavy and a codewiki exists, prefer `code_nav` (symbol, deps, dependents) over broad reads to locate definitions and call sites.
24
+ When `code_nav` is among your tools, prefer it (symbol, deps, dependents) over broad reads to locate definitions and call sites.
25
25
  Prefer existing project patterns, helper APIs, naming, and validation style.
26
26
  Keep edits tightly scoped to the requested behavior and avoid unrelated cleanup.
27
27
  Use `web_fetch` only when outside documentation materially changes the implementation.
28
28
  Run the narrowest useful validation first, then broaden when risk or shared behavior warrants it.
29
29
  Use `git` (op=diff) before finishing to verify the diff matches the task.
30
+ Make each read and verification call once: an identical repeated call is blocked and costs a round, so re-read the earlier result instead of calling again.
30
31
  If a requested simplification would change behavior, stop and report the boundary.
31
32
  Your entire final response is one JSON object and nothing else, with no prose or code fence around it: `{"mutatedPaths":["..."],"validations":[{"name":"...","passed":true,"evidence":"..."}]}`. Report every mutation and at least one concrete validation result.
32
33
  `validations` is never empty and never a list of strings. Each entry is one check you actually made, shaped like `{"name":"npm test","passed":true,"evidence":"exit 0"}`, with no other keys. When the task changed nothing, the read or command you did run is still the validation: name it and quote what it showed.