@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
@@ -1,42 +1,40 @@
1
1
  ---
2
2
  id: operating.delegation
3
3
  version: 1
4
- budgetTokens: 620
5
4
  description: Coordinator delegation and receipt discipline; rendered only when dispatch is on the surface
6
5
  ---
7
6
 
8
7
  # Delegation
9
8
 
10
- You coordinate a fleet of Clio agents through the dispatch tool. You
11
- plan, route, and synthesize work across turns.
12
- Explicit broad repository or codebase exploration is bounded
13
- agent automation: hand it to a worker with a concrete reconnaissance
14
- handoff before repo-wide reads, pinning `scout` when the Fleet roster
15
- lists it. Use dispatch for other bounded fleet work with a clear
16
- handoff. A sealed run
17
- receipt is the durable record for delegated work. Receipt integrity verifies
18
- that record; evidence verification separately describes validation. The
19
- worker's prose remains an advisory claim unless its evidence is verified or
20
- the parent spot-checks it.
21
- A successful reconnaissance receipt is an index. Spot-check a small,
22
- risk-weighted subset of its citations, normally no more than six parent
23
- read/search calls, then proceed or delegate a narrower verification task.
24
- Spot-check delegated claims before repeating them: re-read any cited
25
- file:line location, and re-run or inspect the named validation before
26
- repeating a "tests pass" claim.
27
- Parent spot-checking is not independent specialist confirmation. Use the
28
- dispatch briefing field for receipt-derived context/data; keep it separate
29
- from task instructions. Collect detached runs before final synthesis.
30
- The operator can also run workers themselves with /run and /delegate,
31
- outside your dispatch history, and hand a finished answer to you with
32
- --share or /share. Such an answer arrives as operator text headed
33
- `[worker result] <agent> · run <id> · <outcome> · shared by the operator`,
34
- and its run id names a sealed receipt you can read. Treat that note as
35
- operator steering to use, like any operator text; it is not a tool result
36
- to check against your own dispatch history, and never dispatching that
37
- run is not a reason to dismiss it. Its prose is an advisory claim under
38
- the same spot-check discipline as any receipt.
39
- Report receipt integrity, evidence verification, briefing provenance, and
40
- project-context provenance separately. Failed, cap-exhausted, zero-tool,
41
- and citation-free reconnaissance is non-evidence: treat it as unconfirmed
42
- leads, never as validation.
9
+ You coordinate Clio workers through the dispatch tool. Before your first
10
+ edit, count the independent file-scoped changes the request asks for.
11
+ Two or more, or any repository-wide exploration: dispatch, and do not
12
+ edit those files yourself. One narrow change: do it yourself.
13
+ For two or more changes, one dispatch call carries them all as `tasks`,
14
+ one task per change, each naming its file in `intent`, with `agent`
15
+ "coder" and `mode` "parallel". For exploration, dispatch `scout` with
16
+ the question before any repo-wide grep or read, however small the
17
+ repository looks. You keep synthesis and validation: when the receipts
18
+ arrive, spot-check them and run the checks yourself. A worker whose
19
+ intent declares `write_roots` is confined to them and has no bash or
20
+ verify tool, so do not ask it to run tests or scripts: name the checks
21
+ in `verification` and the host runs them after it finishes.
22
+ A sealed run receipt is the durable record of delegated work; the
23
+ worker's prose is an advisory claim until its evidence is verified or
24
+ you spot-check it. Spot-check a small, risk-weighted subset of a
25
+ reconnaissance receipt's citations (normally at most six read or search
26
+ calls), and re-read any cited file:line and re-run or inspect the named
27
+ validation before repeating a "tests pass" claim. Failed, cap-exhausted,
28
+ zero-tool, or citation-free reconnaissance is unconfirmed leads, never
29
+ validation.
30
+ Put receipt-derived context in the dispatch briefing field, separate
31
+ from task instructions. Collect detached runs before final synthesis,
32
+ and report receipt integrity, evidence verification, briefing
33
+ provenance, and project-context provenance as separate facts. Never
34
+ narrate or summarize a worker you did not dispatch; if you cannot
35
+ dispatch, say so and name the reason.
36
+ A note headed `[worker result] <agent> · run <id> · <outcome> · shared
37
+ by the operator` is operator text: a worker the operator ran with /run
38
+ or /delegate and shared with --share or /share. Use it like any operator
39
+ steering, read its receipt by run id, and apply the same spot-check
40
+ discipline; not having dispatched it is no reason to dismiss it.
@@ -1,33 +1,19 @@
1
1
  ---
2
2
  id: operating.skills
3
3
  version: 1
4
- budgetTokens: 340
5
4
  description: Coordinator skill suggestion discipline; rendered only when context is on the surface
6
5
  ---
7
6
 
8
7
  # Skills
9
8
 
10
- Skills package proven workflows. Some are installed; the rest sit in a
11
- marketplace the operator installs from, and context (scope="skills") is
12
- the one authoritative listing of both — never guess the inventory or
13
- search the repository for a skill file. The catalog spans git delivery
14
- (filing, fixing, and shipping issues), planning (intent, PRD, backlog,
15
- architecture, sprint slicing), coding practice (TDD, standards,
16
- prototyping), context priming and handoff, research workflows, and
17
- plan-stress-testing debates. When a task lands in one of those shapes,
18
- call context (scope="skills") first and match it against the catalog.
19
- Suggest the best match to the operator as /skill <name> — the sequence
20
- in order when skills compose — and let the operator decide before
21
- grinding through that workflow bare; a marketplace match is suggested
22
- the same way, and /skill <name> offers the install. When the operator
23
- names a skill or asks how one works, answer from that same listing.
24
- When a [Marketplace] reminder names an uninstalled skill for the
25
- current request, first check the installed side with context
26
- (scope="skills"); only if nothing installed serves and the named skill
27
- truly fits, put the install question to the operator with ask_user
28
- using exactly the four options the reminder states, then continue the
29
- task in the same turn. The harness performs any consented install;
30
- never install a skill yourself, and never offer one no reminder named.
31
- Only an explicit operator request activates a skill; never load one on
32
- your own. If nothing fits or the task is routine, proceed normally and
9
+ Skills are operator-activated workflows: git delivery, planning, coding
10
+ practice, context priming and handoff, research, and plan stress-testing.
11
+ context (scope="skills") is the one authoritative listing of installed
12
+ and marketplace skills; never guess the inventory or search the
13
+ repository for one. When a task has one of those shapes, list them,
14
+ suggest the best match as /skill <name> (the sequence in order when
15
+ several compose), and continue the task without it: only the operator
16
+ activates or installs a skill, and a [Marketplace] reminder states its
17
+ own offer options. When the operator names a skill or asks how one
18
+ works, answer from that listing. If nothing fits, proceed normally and
33
19
  suggest nothing.
@@ -1,16 +1,9 @@
1
1
  ---
2
2
  id: operating.worker
3
3
  version: 1
4
- budgetTokens: 120
5
4
  description: Assigned-task contract for a bounded fleet worker
6
5
  ---
7
6
 
8
7
  # Assigned Task Contract
9
8
 
10
- The assigned task is authoritative. Role guidance is a persona, not a replacement task.
11
-
12
- Do not invent a different task, source tree, file path, or implementation plan.
13
-
14
- If the assigned task asks for an exact response, a direct answer, or no tool use, answer it directly without tool calls.
15
-
16
- Use tools only when necessary for the assigned task and admitted by the worker tool contract.
9
+ The assigned task is authoritative; role guidance is a persona, not a replacement. Do not invent a different task, source tree, file path, or implementation plan.
@@ -59,6 +59,8 @@ export interface TargetStatus {
59
59
  probeSurfaces?: Readonly<ProbeSurfaceMap>;
60
60
  /** Ids returned by the last successful probeModels() call. */
61
61
  discoveredModels: ReadonlyArray<string>;
62
+ /** Human-readable live/cache labels keyed by exact model slug. */
63
+ discoveredModelLabels?: Readonly<Record<string, string>>;
62
64
  /**
63
65
  * Source for `discoveredModels`. `probe` means the target just returned a
64
66
  * live catalog, `cache` is a previously probed catalog preserved across a
@@ -93,7 +95,8 @@ export interface ProvidersContract {
93
95
  * `reasoning: false` skips an inference-based reasoning-capability probe while
94
96
  * retaining the target's liveness and model-catalog checks.
95
97
  */
96
- probeTarget(id: string, options?: { reasoning?: boolean }): Promise<TargetStatus | null>;
98
+ /** Optional cancellation covers auth and metadata; a cancelled probe does not publish health. */
99
+ probeTarget(id: string, options?: { reasoning?: boolean; signal?: AbortSignal }): Promise<TargetStatus | null>;
97
100
 
98
101
  /** Clear in-memory live connection state for a configured target. */
99
102
  disconnectTarget(id: string): TargetStatus | null;
@@ -156,6 +156,7 @@ function sameProbeIdentity(previous: TargetDescriptor, next: TargetDescriptor):
156
156
 
157
157
  export interface ProbeMerge {
158
158
  discoveredModels: string[];
159
+ discoveredModelLabels: Readonly<Record<string, string>>;
159
160
  discoveredModelsSource: "probe" | "cache" | "runtime" | "none";
160
161
  discoveredModelStates: NonNullable<TargetStatus["discoveredModelStates"]> | null;
161
162
  probeCapabilities: NonNullable<TargetStatus["probeCapabilities"]> | null;
@@ -179,6 +180,7 @@ function mergeProbeResult(
179
180
  probe: ProbeResult | null,
180
181
  previous: TargetStatus | undefined,
181
182
  cachedModels: ReadonlyArray<string> = [],
183
+ cachedModelLabels: Readonly<Record<string, string>> = {},
182
184
  ): ProbeMerge {
183
185
  const probeSucceeded = probe?.ok ?? false;
184
186
  const preservePrevious = !probeSucceeded && previous !== undefined && sameProbeIdentity(previous.target, target);
@@ -201,8 +203,14 @@ function mergeProbeResult(
201
203
  [],
202
204
  );
203
205
  const discoveredModelStates = probe?.modelStates ?? (preservePrevious ? previous.discoveredModelStates : null) ?? null;
206
+ const discoveredModelLabels =
207
+ probe?.modelLabels ??
208
+ (preservePrevious ? previous.discoveredModelLabels : undefined) ??
209
+ (cachedModels.length > 0 ? cachedModelLabels : undefined) ??
210
+ {};
204
211
  const merge: ProbeMerge = {
205
212
  discoveredModels,
213
+ discoveredModelLabels,
206
214
  discoveredModelsSource: discoveredModelsSource(probe, preservePrevious, previous, cachedModels, desc),
207
215
  discoveredModelStates,
208
216
  probeCapabilities,
@@ -225,14 +233,16 @@ function mergeProbeResult(
225
233
  * there is no live evidence either way.
226
234
  */
227
235
  function unservedDefaultModelReason(
228
- desc: Pick<RuntimeDescriptor, "id">,
236
+ desc: Pick<RuntimeDescriptor, "id" | "externalAgentLoop">,
229
237
  target: Pick<TargetDescriptor, "defaultModel">,
230
238
  merge: Pick<ProbeMerge, "discoveredModels" | "discoveredModelsSource" | "discoveredModelStates">,
231
239
  ): string | null {
232
240
  const model = target.defaultModel;
233
241
  if (!model) return null;
234
242
  if (merge.discoveredModelsSource !== "probe" || merge.discoveredModels.length === 0) return null;
235
- if (listKnownModelsForRuntime(desc.id).length > 0) return null;
243
+ if (listKnownModelsForRuntime(desc.id).length > 0 && desc.externalAgentLoop?.modelCatalog !== "live-authoritative") {
244
+ return null;
245
+ }
236
246
  if (merge.discoveredModels.includes(model)) return null;
237
247
  // LM Studio lists a loaded model under its instance id and keeps the model
238
248
  // key in the state map; the request path resolves either.
@@ -258,14 +268,22 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
258
268
  return readSettings();
259
269
  }
260
270
 
261
- async function buildProbeContextForTarget(target: TargetDescriptor, desc: RuntimeDescriptor): Promise<ProbeContext> {
271
+ async function buildProbeContextForTarget(
272
+ target: TargetDescriptor,
273
+ desc: RuntimeDescriptor,
274
+ signal?: AbortSignal,
275
+ ): Promise<ProbeContext> {
262
276
  const probeCtx: ProbeContext = {
263
277
  credentialsPresent: credentialsPresent(),
264
278
  httpTimeoutMs: DEFAULT_PROBE_TIMEOUT_MS,
279
+ ...(signal ? { signal } : {}),
265
280
  };
266
281
  if (!targetRequiresAuth(target, desc)) return probeCtx;
267
282
  try {
268
- const resolution = await authStore.resolveForTarget(resolveAuthTarget(target, desc), { includeFallback: false });
283
+ const resolution = await authStore.resolveForTarget(resolveAuthTarget(target, desc), {
284
+ includeFallback: false,
285
+ ...(signal ? { signal } : {}),
286
+ });
269
287
  if (resolution.apiKey) probeCtx.authToken = resolution.apiKey;
270
288
  } catch {
271
289
  // Authenticated probes should still return a runtime-specific missing-auth error.
@@ -325,8 +343,9 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
325
343
  return out;
326
344
  }
327
345
  const availability = availabilityFor(desc, target, authStatusFor);
328
- const cachedModels = readTargetModelSnapshot(target)?.models ?? [];
329
- const merge = mergeProbeResult(desc, target, probe, previous, cachedModels);
346
+ const cachedSnapshot = readTargetModelSnapshot(target);
347
+ const cachedModels = cachedSnapshot?.models ?? [];
348
+ const merge = mergeProbeResult(desc, target, probe, previous, cachedModels, cachedSnapshot?.modelLabels ?? {});
330
349
  const { capabilities, contextWindowProvenance } = capabilitiesFor(desc, target, merge, kb);
331
350
  const healthy = probe !== null ? probe.ok : null;
332
351
  const unservedDefault = probe?.ok ? unservedDefaultModelReason(desc, target, merge) : null;
@@ -353,6 +372,7 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
353
372
  probeModelCapabilities: merge.probeModelCapabilities,
354
373
  probeModelId: merge.probeModelId,
355
374
  discoveredModels: merge.discoveredModels,
375
+ discoveredModelLabels: merge.discoveredModelLabels,
356
376
  discoveredModelsSource: merge.discoveredModelsSource,
357
377
  discoveredModelStates: merge.discoveredModelStates,
358
378
  };
@@ -364,8 +384,9 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
364
384
  async function probeTargetInternal(
365
385
  target: TargetDescriptor,
366
386
  live: boolean,
367
- options?: { reasoning?: boolean },
387
+ options?: { reasoning?: boolean; signal?: AbortSignal },
368
388
  ): Promise<TargetStatus> {
389
+ options?.signal?.throwIfAborted();
369
390
  const previous = statuses.get(target.id);
370
391
  const desc = registry.get(target.runtime);
371
392
  if (!desc) {
@@ -379,13 +400,15 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
379
400
  statuses.set(target.id, status);
380
401
  return status;
381
402
  }
382
- const probeCtx = await buildProbeContextForTarget(target, desc);
403
+ const probeCtx = await buildProbeContextForTarget(target, desc, options?.signal);
404
+ options?.signal?.throwIfAborted();
383
405
  let probeResult: ProbeResult;
384
406
  try {
385
407
  probeResult = await desc.probe(target, probeCtx);
386
408
  } catch (err) {
387
409
  probeResult = { ok: false, error: err instanceof Error ? err.message : String(err) };
388
410
  }
411
+ options?.signal?.throwIfAborted();
389
412
  if (probeResult.ok && typeof desc.probeModels === "function" && !probeResult.models) {
390
413
  try {
391
414
  const ids = await desc.probeModels(target, probeCtx);
@@ -394,6 +417,7 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
394
417
  // model discovery is best-effort; keep probe as-is.
395
418
  }
396
419
  }
420
+ options?.signal?.throwIfAborted();
397
421
  if (probeResult.ok && options?.reasoning !== false && typeof desc.probeReasoning === "function") {
398
422
  const settings = readConfig();
399
423
  const orchestratorTarget = settings.chat.target === target.id ? settings.chat.model : null;
@@ -401,6 +425,7 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
401
425
  if (candidateModelId) {
402
426
  try {
403
427
  const result = await desc.probeReasoning(target, candidateModelId, probeCtx);
428
+ options?.signal?.throwIfAborted();
404
429
  reasoningCache.set(reasoningCacheKey(target.id, candidateModelId), result.reasoning);
405
430
  const capabilityModelId = probeResult.capabilityModelId ?? null;
406
431
  if (capabilityModelId === null || capabilityModelId === candidateModelId) {
@@ -422,10 +447,16 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
422
447
  }
423
448
  }
424
449
  }
450
+ // A cancelled role preparation must not publish failed/stale target state.
451
+ options?.signal?.throwIfAborted();
425
452
  const status = buildStatus(target, desc, probeResult, previous);
426
453
  statuses.set(target.id, status);
427
454
  if (probeResult.ok && probeResult.models !== undefined) {
428
- recordTargetModelSnapshot(target, probeResult.models);
455
+ recordTargetModelSnapshot(
456
+ target,
457
+ probeResult.models,
458
+ probeResult.modelLabels ? { modelLabels: probeResult.modelLabels } : {},
459
+ );
429
460
  }
430
461
  // Durable so the next process resolves this endpoint's real slot count
431
462
  // instead of the conservative default. Fire and forget: the probe's answer
@@ -161,7 +161,7 @@ export {
161
161
  VALID_THINKING_LEVELS,
162
162
  } from "./types/capability-flags.js";
163
163
  export { type ContextWindowSlots, formatContextWindowSlots } from "./types/context-window-slots.js";
164
- export { type CostProvenance, normalizeCostProvenance } from "./types/cost-provenance.js";
164
+ export { type CostProvenance, normalizeCostProvenance, resolveCostProvenance } from "./types/cost-provenance.js";
165
165
  export type { KnowledgeBase, KnowledgeBaseEntry, KnowledgeBaseHit } from "./types/knowledge-base.js";
166
166
  export type {
167
167
  ProbeContext,
@@ -14,6 +14,7 @@ export interface ModelCapabilityPatchTarget {
14
14
  contextWindow?: number;
15
15
  maxTokens?: number;
16
16
  reasoning?: boolean;
17
+ clioCoder?: Record<string, unknown>;
17
18
  }
18
19
 
19
20
  /**
@@ -30,6 +31,14 @@ export function applyModelCapabilityPatch<T extends ModelCapabilityPatchTarget>(
30
31
  if (typeof caps.contextWindow === "number") model.contextWindow = caps.contextWindow;
31
32
  if (typeof caps.maxTokens === "number") model.maxTokens = caps.maxTokens;
32
33
  if (typeof caps.reasoning === "boolean") model.reasoning = caps.reasoning;
34
+ // Refresh the probe-only control hint together with the capability snapshot.
35
+ // Missing metadata after a later probe must not retain an earlier route claim.
36
+ if (model.clioCoder || caps.thinkingControlRuntime !== undefined) {
37
+ const metadata = { ...model.clioCoder };
38
+ delete metadata.thinkingControlRuntime;
39
+ if (caps.thinkingControlRuntime !== undefined) metadata.thinkingControlRuntime = caps.thinkingControlRuntime;
40
+ model.clioCoder = metadata;
41
+ }
33
42
  return model;
34
43
  }
35
44
 
@@ -6,6 +6,7 @@ export type ProviderModelSource = "configured" | "live" | "catalog" | "default";
6
6
 
7
7
  export interface ProviderModelCandidate {
8
8
  id: string;
9
+ label?: string;
9
10
  source: ProviderModelSource;
10
11
  loadState?: string;
11
12
  loadStateDetail?: string;
@@ -100,6 +101,7 @@ export function modelCandidatesForStatus(status: TargetStatus): ProviderModelCan
100
101
  const state = status.discoveredModelStates?.[trimmed];
101
102
  out.push({
102
103
  id: trimmed,
104
+ ...(status.discoveredModelLabels?.[trimmed] ? { label: status.discoveredModelLabels[trimmed] } : {}),
103
105
  source,
104
106
  ...(state ? { loadState: state.state } : {}),
105
107
  ...(state?.detail ? { loadStateDetail: state.detail } : {}),
@@ -36,7 +36,7 @@ export interface AppliedThinking {
36
36
  mechanism: ThinkingMechanism;
37
37
  effort?: string;
38
38
  budgetTokens?: number;
39
- chatTemplateKwargs?: Record<string, boolean>;
39
+ chatTemplateKwargs?: Record<string, boolean | string | number>;
40
40
  noticeKind: AppliedThinkingNoticeKind;
41
41
  notice: string;
42
42
  }
@@ -53,7 +53,20 @@ export interface ResolvedRequestCapability {
53
53
  reasoningEffort?: string;
54
54
  budgetTokens?: number;
55
55
  budgetEnforcement: ThinkingBudgetEnforcement;
56
- chatTemplateKwargs?: Record<string, boolean | string>;
56
+ chatTemplateKwargs?: Record<string, boolean | string | number>;
57
+ /**
58
+ * Family-declared chat-template kwargs the runtime cannot carry. LM Studio
59
+ * ignores `chat_template_kwargs` for every family measured, so the keys are
60
+ * named here for the resolution diagnostics instead of riding in
61
+ * `chatTemplateKwargs` only to be deleted at the wire.
62
+ */
63
+ undeliverableChatTemplateKwargs?: UndeliverableChatTemplateKwargs;
64
+ }
65
+
66
+ export interface UndeliverableChatTemplateKwargs {
67
+ keys: string[];
68
+ /** True when the family entry itself marks the block `lmstudio: unsupported`. */
69
+ declaredUnsupported: boolean;
57
70
  }
58
71
 
59
72
  export interface ResolvedResponseCapability {
@@ -118,6 +131,7 @@ interface ClioRuntimeMetadata {
118
131
  lifecycle?: "user-managed" | "clio-coder-managed";
119
132
  gateway?: boolean;
120
133
  family?: string;
134
+ thinkingControlRuntime?: CapabilityFlags["thinkingControlRuntime"];
121
135
  quirks?: LocalModelQuirks;
122
136
  };
123
137
  /** Released in-memory metadata name accepted at plugin/runtime read boundaries. */
@@ -127,6 +141,7 @@ interface ClioRuntimeMetadata {
127
141
  lifecycle?: "user-managed" | "clio-coder-managed";
128
142
  gateway?: boolean;
129
143
  family?: string;
144
+ thinkingControlRuntime?: CapabilityFlags["thinkingControlRuntime"];
130
145
  quirks?: LocalModelQuirks;
131
146
  };
132
147
  compat?: {
@@ -335,14 +350,15 @@ function supportedEffortLevels(
335
350
  ): ReadonlyArray<ThinkingLevel> {
336
351
  if (harmony) return HARMONY_LEVELS;
337
352
  const efforts = quirks?.thinking?.effortByLevel;
338
- if (!efforts) return baseLevels;
353
+ const byLevelValues = (quirks?.chatTemplateKwargs ?? quirks?.thinking?.chatTemplateKwargs)?.byLevel?.values;
354
+ if (!efforts && !byLevelValues) return baseLevels;
339
355
  const out: ThinkingLevel[] = [];
340
356
  if (baseLevels.includes("off")) out.push("off");
341
- if (efforts.minimal !== undefined) out.push("minimal");
342
- if (efforts.low !== undefined) out.push("low");
343
- if (efforts.medium !== undefined) out.push("medium");
344
- if (efforts.high !== undefined) out.push("high");
345
- if (efforts.xhigh !== undefined) out.push("xhigh");
357
+ if (efforts?.minimal !== undefined || byLevelValues?.minimal !== undefined) out.push("minimal");
358
+ if (efforts?.low !== undefined || byLevelValues?.low !== undefined) out.push("low");
359
+ if (efforts?.medium !== undefined || byLevelValues?.medium !== undefined) out.push("medium");
360
+ if (efforts?.high !== undefined || byLevelValues?.high !== undefined) out.push("high");
361
+ if (efforts?.xhigh !== undefined || byLevelValues?.xhigh !== undefined) out.push("xhigh");
346
362
  return out.length > 0 ? out : baseLevels;
347
363
  }
348
364
 
@@ -367,9 +383,10 @@ export function effectiveThinkingLevel(
367
383
  const fallback = available[0] ?? "off";
368
384
  if (!configured) return fallback;
369
385
  if (available.includes(configured)) return configured;
370
- // Catalog effort maps intentionally stop at xhigh; `max` must clamp to that
371
- // supported ceiling instead of falling through to the generic low fallback.
372
- if (configured === "max" && available.includes("xhigh")) return "xhigh";
386
+ // A family with xhigh but no high keeps the released high alias at its
387
+ // supported ceiling; neither high nor max may fall through to low.
388
+ if ((configured === "max" || (configured === "high" && !available.includes("high"))) && available.includes("xhigh"))
389
+ return "xhigh";
373
390
  if ((configured === "high" || configured === "xhigh" || configured === "max") && available.includes("high")) {
374
391
  return "high";
375
392
  }
@@ -525,27 +542,71 @@ function resolveThinkingCapability(
525
542
  }
526
543
 
527
544
  /**
528
- * Runtimes whose OpenAI-compatible surface reads the on-off thinking control
529
- * from `reasoning_effort` rather than `chat_template_kwargs.enable_thinking`.
530
- * Measured against the live fleet on 2026-08-11 with
531
- * `nvidia-nemotron-3.5-lightning-30b-a3b`: LM Studio suppressed reasoning
532
- * entirely for `reasoning_effort: "none"` and ignored `enable_thinking: false`,
533
- * while llama.cpp did the reverse. Sending the wrong spelling reads as "no
534
- * preference" to the server, so the model keeps reasoning at every dial.
545
+ * Runtimes whose OpenAI-compatible surface ignores `chat_template_kwargs`
546
+ * and reads every thinking control from `reasoning_effort`. Measured against
547
+ * dynamo (LM Studio) on 2026-08-11 with `nvidia-nemotron-3.5-lightning-30b-a3b`
548
+ * and again on 2026-09-02 across three mechanisms: `enable_thinking: false`
549
+ * left 26 reasoning tokens on qwen3.8-27b (effort-levels), 52 on
550
+ * gemma-4-26b-a4b-it (on-off) and 105 on nemotron-3.5-lightning (on-off),
551
+ * while `reasoning_effort: "none"` produced 0 on each; llama.cpp does the
552
+ * reverse. Sending the wrong spelling reads as "no preference" to the
553
+ * server, so the model keeps reasoning at every dial. The same runtime drops
554
+ * a family's own kwargs (#267) for the same reason, so those are reported as
555
+ * undeliverable rather than merged into the request (#268).
535
556
  */
536
- const REASONING_EFFORT_ON_OFF_RUNTIMES: ReadonlySet<string> = new Set(["lmstudio"]);
557
+ const REASONING_EFFORT_ONLY_RUNTIMES: ReadonlySet<string> = new Set(["lmstudio"]);
537
558
 
538
- /** `none` is LM Studio's documented off value; on-off models have no finer dial than `low`. */
559
+ /** `none` is the observed LM Studio HTTP off value; on-off models have no finer dial than `low`. */
539
560
  function onOffReasoningEffort(thinkingActive: boolean): string {
540
561
  return thinkingActive ? "low" : "none";
541
562
  }
542
563
 
564
+ function resolveFamilyChatTemplateKwargs(
565
+ quirks: LocalModelQuirks | undefined,
566
+ effectiveLevel: ThinkingLevel,
567
+ configuredLevel: ThinkingLevel,
568
+ ): Record<string, boolean | string | number> | undefined {
569
+ const block = quirks?.chatTemplateKwargs ?? quirks?.thinking?.chatTemplateKwargs;
570
+ if (!block) return undefined;
571
+ const out: Record<string, boolean | string | number> = {};
572
+ if (block.static) {
573
+ for (const [k, v] of Object.entries(block.static)) {
574
+ out[k] = v;
575
+ }
576
+ }
577
+ if (block.byLevel) {
578
+ const byLevel = block.byLevel;
579
+ const val = byLevel.values[effectiveLevel] ?? byLevel.values[configuredLevel];
580
+ if (val !== undefined) {
581
+ out[byLevel.key] = val;
582
+ }
583
+ }
584
+ return Object.keys(out).length > 0 ? out : undefined;
585
+ }
586
+
587
+ function familyKwargsDeclaredUnsupported(quirks: LocalModelQuirks | undefined, runtimeId: string): boolean {
588
+ if (runtimeId !== "lmstudio") return false;
589
+ const block = quirks?.chatTemplateKwargs ?? quirks?.thinking?.chatTemplateKwargs;
590
+ return block?.lmstudio === "unsupported" || block?.byLevel?.lmstudio === "unsupported";
591
+ }
592
+
543
593
  function resolveRequestCapability(
544
594
  thinking: ResolvedThinkingCapability,
545
595
  parser: ResponseParserKind,
546
596
  runtimeId: string,
597
+ quirks?: LocalModelQuirks,
547
598
  ): ResolvedRequestCapability {
548
599
  const request: ResolvedRequestCapability = { budgetEnforcement: thinking.budgetEnforcement };
600
+ const effortOnly = REASONING_EFFORT_ONLY_RUNTIMES.has(runtimeId);
601
+ const familyKwargs = resolveFamilyChatTemplateKwargs(quirks, thinking.effectiveLevel, thinking.configuredLevel);
602
+ if (familyKwargs && effortOnly) {
603
+ request.undeliverableChatTemplateKwargs = {
604
+ keys: Object.keys(familyKwargs),
605
+ declaredUnsupported: familyKwargsDeclaredUnsupported(quirks, runtimeId),
606
+ };
607
+ } else if (familyKwargs) {
608
+ request.chatTemplateKwargs = { ...familyKwargs };
609
+ }
549
610
  if (thinking.mechanism === "effort-levels" && thinking.effort) {
550
611
  request.reasoningEffort = thinking.effort;
551
612
  }
@@ -556,15 +617,21 @@ function resolveRequestCapability(
556
617
  request.budgetTokens = thinking.budgetTokens;
557
618
  }
558
619
  if (thinking.mechanism === "on-off" && thinking.chatTemplateKwargs) {
559
- request.chatTemplateKwargs = { ...thinking.chatTemplateKwargs };
560
- if (REASONING_EFFORT_ON_OFF_RUNTIMES.has(runtimeId)) {
561
- request.reasoningEffort = onOffReasoningEffort(thinking.thinkingActive);
562
- }
620
+ request.chatTemplateKwargs = { ...(request.chatTemplateKwargs ?? {}), ...thinking.chatTemplateKwargs };
563
621
  }
564
622
  if (parser === "harmony" && thinking.effort) {
565
623
  request.reasoningEffort = thinking.effort;
566
624
  request.chatTemplateKwargs = { ...(request.chatTemplateKwargs ?? {}), reasoning_effort: thinking.effort };
567
625
  }
626
+ // Every mechanism that means "off" has to reach an effort-only runtime as
627
+ // reasoning_effort "none": the template flag above is what llama.cpp reads
628
+ // and what LM Studio drops. An interactive session with thinking "off" had
629
+ // spent 37k reasoning tokens before the effort-levels case reached the
630
+ // wire, and on-off and budget-tokens families reasoned on the same way.
631
+ if (effortOnly && thinking.mechanism !== "none" && thinking.mechanism !== "always-on") {
632
+ if (!thinking.thinkingActive) request.reasoningEffort = onOffReasoningEffort(false);
633
+ else if (thinking.mechanism === "on-off") request.reasoningEffort = onOffReasoningEffort(true);
634
+ }
568
635
  return request;
569
636
  }
570
637
 
@@ -583,7 +650,12 @@ export function resolveModelRuntimeCapabilities(
583
650
  family,
584
651
  capabilities: input.capabilities,
585
652
  thinking,
586
- request: resolveRequestCapability(thinking, parser, input.runtimeId),
653
+ request: resolveRequestCapability(
654
+ thinking,
655
+ parser,
656
+ input.runtimeId === "litellm" ? (input.capabilities.thinkingControlRuntime ?? input.runtimeId) : input.runtimeId,
657
+ quirks,
658
+ ),
587
659
  response: {
588
660
  parser,
589
661
  stripTokenizerSentinels: true,
@@ -671,6 +743,7 @@ function thinkingFormatFromModelApi(api: Api): CapabilityFlags["thinkingFormat"]
671
743
 
672
744
  function capabilitiesFromModel(model: Model<Api> & ClioRuntimeMetadata): CapabilityFlags {
673
745
  const format = model.compat?.thinkingFormat ?? thinkingFormatFromModelApi(model.api);
746
+ const controlRuntime = (model.clioCoder ?? model.clio)?.thinkingControlRuntime;
674
747
  const caps: CapabilityFlags = {
675
748
  chat: true,
676
749
  tools: true,
@@ -682,6 +755,7 @@ function capabilitiesFromModel(model: Model<Api> & ClioRuntimeMetadata): Capabil
682
755
  fim: false,
683
756
  contextWindow: model.contextWindow,
684
757
  maxTokens: model.maxTokens,
758
+ ...(controlRuntime ? { thinkingControlRuntime: controlRuntime } : {}),
685
759
  };
686
760
  if (
687
761
  format === "qwen-chat-template" ||