@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
package/CHANGELOG.md CHANGED
@@ -2,6 +2,133 @@
2
2
 
3
3
  All notable changes to Clio Coder are documented in this file. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and versions follow Semantic Versioning; pre-1.0 minor releases may include incompatible changes.
4
4
 
5
+ ## 0.4.3 - 2026-09-05
6
+
7
+ This release adds Archify architecture maps and experimental Antigravity research delegation, and tightens thinking controls, session memory, compaction and execution evidence. Usage and cost reports retain explicit coverage limits; full evidence reconciliation is deferred to v0.4.5 or later.
8
+
9
+ ### Added
10
+ - Remote marketplace entries. `skills/remote.yaml` lists skills whose content lives in another repository at a pinned ref; `npm run skills:pin` publishes each into `skills/skill-marketplace.json` with `origin: "remote"`, the upstream tree as `sourceUrl`, the catalog `overlay` package whose files land on top of the clone at install, and the upstream top-level members to `exclude`. The overlay `SKILL.md` is pinned in `skills/registry.yaml`, so `skills:check` fails on its drift. Install stages the fetched tree, applies the exclusions and the overlay, validates the shaped result, and swaps it in atomically; discovery lets an overlay-bearing index entry win over its own catalog folder, and `clio-coder skills update` re-applies the same shaping. Contract: `tests/contracts/skill-remote-entries.test.ts`.
11
+ - The `archify` skill (`skills/planning/archify/`), a remote entry pinned to `tt-a1i/archify` v2.16.0: validated interactive architecture, workflow, sequence, dataflow, and lifecycle diagrams as standalone HTML from a typed JSON spec. Clio ships only the wrapper `SKILL.md` and `evals.md`; the renderer, schemas, and brand-mark notices come from upstream at install time and never enter the npm tarball. The wrapper adds Clio's placement rule (`.clio-coder/artifacts/maps/`), the repository-evidence flow through `clio-coder context map`, and `verify(check="frontend")` after `deliver`, and omits upstream's update-awareness step because it performs a network request during a chat turn.
12
+ - `clio-coder context map [--out <path>] [--json]` writes an archify architecture seed from the codewiki index with no model call: components are the largest directory areas (capped at 12, plus at most three external packages), connections are import edges collapsed area to area, and `meta.repository` is recorded only for a GitHub origin at a full revision; only then do components carry `sources`, each citing an indexed file and its first symbol's line, since archify accepts citations only against a pinned revision. Placement is layered with explicit routes for archify's standard profile; composition warnings may still need operator edits. Pass `--repo-root .` when the seed carries pinned repository evidence. It refuses, naming `clio-coder context index`, when no index exists. Contract: `tests/contracts/context-map-seed.test.ts`.
13
+ - `.clio-coder/artifacts/maps/` is a placement class (human transient) in `docs/architecture/artifact-placement.md`; `docs/guide/skills-marketplace.md` documents remote entries and overlays with archify as the worked example, and `docs/architecture/context-engine.md` documents the seed's guarantees.
14
+ - A distinct, permanently read-only `world-knowledge` shadow agent handles current open-world discovery, ecosystem comparisons, broad external context, and advisory second opinions. Its compact result contract separates supported facts and source identifiers from synthesis, uncertainties, and follow-up verification, and it reports honestly when native discovery/search is unavailable instead of treating URL retrieval as search or fabricating citations.
15
+ - Reusable `branch-closeout` Git skill (`skills/git/branch-closeout/`) for proving merged work on canonical remotes, inspecting dirty or ignored worktree state, safely removing registered worktrees through Git, deleting local branches, optionally removing contributor fork branches, and auditing surviving repository references.
16
+
17
+ ### Changed
18
+ - The local and hosted CI gate checks skill pins once through lint, removing the duplicate explicit pass. The full contract/smoke, trace-viewer and release-package checks remain in place; contributor guidance distinguishes focused checks from the complete release gate.
19
+ - The existing `context.compaction.model` and `context.compaction.systemPrompt` overrides now take effect. An explicit model must uniquely resolve to an available, eligible summary route; invalid choices fail visibly instead of silently using chat. Custom UTF-8 prompt files are reread at compaction time, must be nonempty regular files of at most 65,536 bytes, and resolve relative paths against the session workspace. Unset controls retain the active chat route and built-in prompt; checkpoints record the selected usage route while older checkpoints remain readable (#324).
20
+ - Antigravity external delegation remains experimental and now uses a bounded external-agent subprocess boundary: it is dispatch-only, uses the operator's existing `agy` session, sends literal prompts over structured stdin, accepts only a valid one-terminal stream, bounds and redacts all external output, runs with an allowlisted environment, cancels the POSIX process group, and attributes receipts to external delegation rather than the Gemini API. Its non-generating live `{id,label}` catalog is authoritative and round-trips through the generic model snapshot; failures distinguish missing CLI, sign-in, required CLI update, unavailable catalog, and disappeared configured models. Clio records per-tool recipe budgets as unobserved/not enforced inside the external one-shot loop and never automatically retries a generating run.
21
+ - First-run onboarding can offer **Antigravity CLI — experimental local delegation** only after a valid primary target exists. The optional step never changes chat/background pointers or enables dangerous full access; it can create a `world-knowledge-external` fleet profile and bind `world-knowledge`. Noninteractive `configure` gains `--bind-agent <agentId>` alongside `--agent-profile`, and model/target listings preserve live labels and source/freshness.
22
+ - Hardened the entire Git skill suite under `skills/git/` (`file-ticket`, `fix-issue`, `ship`, `worktree-create`, `worktree-merge`, `resolve-merge-conflicts`). Added formal argument contracts with structural parsing; made workflow bodies project-agnostic without hardcoding repos, remotes, or branch names while preserving the canonical-main-only policy in `CONTRIBUTING.md`; required confirmation before every outward ticket action including duplicate issue comments; decoupled unsupported RCA automation claims from `fix-issue`; separated `ship` into explicit `commit`, `pr`, maintainer-local, and `closeout` modes; corrected rebase ours/theirs reversal semantics and added conflict matrices covering binary, rename, modify/delete, and lockfile conflicts; supported configurable roots, safe path derivation, and strategy controls in worktree operations; and expanded evals across all skills.
23
+ - Branch and worktree closeout is now an explicit final development step: prove the merged result, inspect local state, remove registered worktrees through Git, delete local scaffolding, and report every surviving branch, stash, local-only tag, and canonical remote head. The canonical repository keeps only `main`: maintainer topic and compact release-candidate branches such as `v043` stay local, contributors submit branches from their forks, and dotted names such as `v0.4.3` are reserved for immutable release tags.
24
+
25
+ ### Fixed
26
+ - Dedicated memory, compaction and native worker admission now discover cold LiteLLM target metadata before resolving thinking controls; sharing a gateway URL with chat no longer hides a missing target probe. Memory keeps discovery within its existing cancellation/deadline boundary, rechecks known endpoint capacity at actual launch, and does not turn cancelled metadata into endpoint failure. Compaction now sends its intended thinking-off request through the simple stream API. Workers keep their approved route and reservation while discovery runs within the invocation's cancellation and admission deadline; late cancelled metadata cannot launch a worker. Unknown runtime declarations remain unguessed.
27
+ - Failed or empty compaction now retains known per-stream usage in the existing out-of-turn ledger, including a successful first stream before a failed or empty second split response. Rows retain the originating session and selected route, distinguish completed/error/aborted calls, and keep missing or ambiguous zero usage unknown. For completed compactions, the checkpoint remains the sole durable accounting source; checkpoint-write ambiguity fails visibly without speculative double counting. Usage reports expose known and errored subtotals with missing coverage, and live successful accounting follows the selected compaction route. Adapter prices remain estimates, and existing numeric cost ceilings bound known spending only. Usage reports read the retained failed-compaction records; eval totals and live /cost reseeding do not yet reconcile that out-of-turn store.
28
+ - Thinking controls now survive LiteLLM parameter filtering for declared upstream runtimes. Unanimous per-alias LM Studio metadata selects its explicit off effort, while llama.cpp keeps template controls; only a legitimately resolved effort is added to the gateway request allowance. Gateway routing, authentication and residency stay unchanged, unknown/mixed declarations are not guessed, and returned reasoning is not hidden. Qwen3.8 exposes off/low/medium/xhigh; released high/max choices normalize to xhigh without changing saved preferences or confusing the vendor template default with Clio defaults.
29
+ - Proactive memory prefers its dedicated configured route and can use the active chat model when that route is unavailable, including a shared reasoning model with thinking requested off. A dedicated client error permits one fallback within the original remaining deadline; cancellation, scope changes, timeouts and model output do not trigger retries. Known usage and telemetry remain separate for each attempted route. Memory now consults existing endpoint capacity evidence and observed foreground/dispatch occupancy instead of treating every shared URL as a busy one-slot server; LiteLLM retains gateway routing authority. Unset memory roles stay rules-only, and fallback selection does not change saved settings.
30
+ - Context map seeds now keep distinct directory areas, external packages, and connections identifiable when readable IDs collide. Collision suffixes preserve other existing readable IDs, and internal and external imports with matching names retain their own destinations and counts.
31
+ - Active project and user skill trees now remain operator-owned for both main-agent and worker tool admissions, including full-auto. Direct mutations, recognized shell mutation and Clio installation commands (including `skills sync` and confirmed `library add --yes` with skill dependencies), ancestor deletion, and current symlink aliases are refused even when general default path protections are disabled. Literal shell comments and redirection targets cannot masquerade as help/version arguments to bypass that guard. Quoted search patterns remain read-only, and literal operator filenames do not hide later mutation operands. Unconfirmed library plans remain available. Marketplace matches now require the existing bound operator answer before installation at every autonomy level; operator CLI, hub and slash installation/update workflows remain available. Draft skills outside active roots. Shell command inspection remains a bounded guard rather than an operating-system sandbox; arbitrary programs, dynamic expansions, aliases and concurrent filesystem changes still require supervision (#300).
32
+ - Native session and eval call timing now starts before each provider stream invocation, so TTFT and API duration include the request's wait for response headers and later tool-loop calls have their own clocks. Empty output does not manufacture TTFT. Historical timing values remain unchanged; stdout-only fallback timing still starts at the provider's message-start event and must not be compared as complete request latency.
33
+ - Eval now exposes observed provider terminal reasons, retry phases, and errored-call known usage subtotals for opt-in health gates (#278). Known failed-call spend stays in total accounting, and repeated retry countdown frames do not inflate attempt counts. Missing, partial, or ambiguous all-zero failed usage remains explicitly incomplete; stream cost can reflect adapter pricing and does not certify billing. Recovered tasks keep the existing default pass policy, and retries hidden inside a runtime remain unobserved. Reported failed reasoning remains separate from output/total tokens; an ambiguous adapter estimate is not promoted to provider-reported usage.
34
+ - Completed parallel dispatch receipts keep their sealed ledger status while finalization waits for durable persistence. Heartbeat reconciliation no longer regresses a finished run to running, stale, or dead during ledger lock contention; active workers still receive normal stall detection. Batch host checks and receipt digest verification retain their existing semantics.
35
+ - Eval first-call TTFT now reports `{ value: null, source: "estimated" }` when timing is absent, preserving a measured zero as `{ value: 0, source: "ledger" }`. The first call is selected by its recorded timestamp across session ledgers. Stream fallback measures only observed output after a call start and leaves missing timing absent. Verdict consumers must handle nullable TTFT; historical numeric artifacts remain readable without rewriting (#277).
36
+ - Headless runs that recover from a provider failure with a successful tool-only artifact completion no longer retain the earlier error and fail evaluation despite producing the required artifact. Terminal errors, failed artifacts, cancellation, and shutdown still fail truthfully; recovered runs retain their failure history and reported spend (#275).
37
+ - Transient task memory and its observer state now reset on explicit session and branch switches, including same-session `/tree` navigation. Late background completions cannot mutate the successor bank, deliver reminders, or propose durable memory. Reported usage keeps its originating session identity without inflating the successor's live cost. Ordinary forward turns and compaction retain continuity; abort-ignoring transports may still finish, but their stale content is discarded (#323).
38
+ - Eval tracked token and model-call totals no longer double-count assistant calls recorded by both the native runner's session ledger and stdout fold (#276). Tracked metrics prefer durable assistant-call facts, including timing and cache provenance, and fall back to stream calls when no durable calls exist; durable compaction and tool records remain included. Compaction usage intentionally makes tracked totals differ from stdout-only totals. Artifacts record source counts and warn when observed counts differ or an external runner mixes sources. Partial or mixed ledgers can still omit stream-only calls, and fork-inherited history is not reconciled: no shared call identity proves overlap or complete coverage, so these cases must not be treated as reconciled run totals. Full reconciliation across session, stdout, fork and out-of-turn evidence is deferred to v0.4.5 or later. This release exposes count-based diagnostics but does not automatically reject cost or efficiency comparisons on incomplete evidence.
39
+
40
+ ## 0.4.2 - 2026-09-02
41
+
42
+ ### Added
43
+ - Accountability reaches ACP. The observability extension publishes `accountability.evidenceReady` on the bus once per run whose evidence bundle and index row landed, with the payload spread from the same `ObservabilityRunEvidence` object it hands the projection, and the ACP server forwards it as the opt-in `accountability.evidenceReady` kind (`{runId,evidenceId,firstPassSuccess,findingCount,tags}`, `terminal:true`) through the shared `forwardEvent` sender. The v0.4.2 telemetry audit found first-pass success and finding counts reached the TUI, `usage`, `evidence-detail`, and the trace viewer but no ACP event, not even opt-in (#271). Bundle prose never crosses; a failed build sends nothing. Contract: `tests/contracts/acp-evidence-ready-event.test.ts`.
44
+ - `clio-coder trace code-steps <rootId> [--json]` reads back the deterministic code-step records every fleet code step writes to `<stateDir>/code-steps/<rootId>/`. The v0.4.2 telemetry audit found the writer had no reader anywhere (#270): each run recorded argv, cwd, env names, exit code, duration, output digest, and artifact paths that nothing surfaced. The store stays as it is; the command is the missing read surface, oldest first, verbatim under `--json`, empty state on an unknown root. Contract: `tests/contracts/trace-code-steps.test.ts`.
45
+ - `npm run smoke:real-home` (`scripts/smoke-real-home.sh`) boots the built binary against a copy of the operator's own settings. It copies `~/.config/clio-coder/settings.yaml` (and `credentials.yaml` when present) into a scratch `CLIO_CODER_HOME`, runs `doctor` and one read-only headless turn there, fails on a doctor crash or deprecation warning, a turn that exits non-zero, a tool policy drift refusal, or a turn with no `agent_end` event, prints doctor's own failing rows for the operator, and deletes the scratch home. The 0.4.2 release smoke ran only with isolated homes and missed two bugs a real settings file exposed on first launch (the raised read cap refusing to boot, and the legacy skill metadata warning), both fixed in this release. The release checklist names it beside the isolated-home turn.
46
+ - The files pane is a Clio Coder surface with its own verb and key. `/files` toggles a file view docked below the session and moves the keyboard into it; the same command or `Alt+E` (`clio-coder.files.toggle`, with the `Ctrl+G e` leader fallback) closes it and hands the keyboard back. `/files pick` and `/panes open files --once` borrow the pane for one selection. A pick lands in the composer as an `@file` mention and returns focus to the prompt; a pane herdr reports gone counts as closed, so the next toggle opens rather than trying to close nothing; reopening an open pane leaves any zoom that hides it and focuses it. Outside a pane host `/files` still runs the one-shot full-screen pick. The `panes` tool, `/panes open`, and the keybinding all reach one shared controller (`PanesOperations.files`). Verified end to end in a herdr 0.8.2 session on Linux x64: open, pick with `Ctrl+Y`, toggle close, key toggle, one-shot pick, and a clean `/quit` with the dock gone. Contract: `tests/contracts/panes-files.test.ts`.
47
+ - `clio-coder panes theme` prints Clio's theme tokens as a herdr `[theme.custom]` block. herdr styles its own chrome from its config file and offers no per-pane styling on the socket, so Clio prints the block for the operator to paste rather than editing another program's configuration. The files pane itself is themed from the same tokens at open time, now across the engine's manager, mode, status, which-key, pick, input, completion, task, help, and notification surfaces instead of five keys, with every emitted document parsed as TOML in the contract test.
48
+ - `docs/guide/panes-and-files.md` is the operator page for panes and the files pane from a clean machine: install, the two settings, what `doctor` prints at each stage, every command and key, what `/quit` closes, the theme boundary, and the exact messages with their remedies. Every quoted output is from a run of the built binary in a herdr session on this release; `docs/html/panes_files_blueprint.html` is its visual counterpart and the parity check holds both to the same command facts.
49
+ - Installed extensions are now projected into one immutable, generation-numbered snapshot per session. The extensions domain publishes nothing when it starts; the composition root builds and validates boot generation 1 and its user-hook registrations, then publishes both with adjacent reference assignments. Every in-process consumer of extension skill, prompt, agent, and fleet roots and of extension `hooks.yaml` declarations reads that paired generation instead of re-listing and re-hashing every installed tree on each load. `/resources extensions reload` is the only in-session trigger and uses the same paired publication path, so a turn observes either the previous resources with the previous hooks or the new resources with the new hooks and never a mixture. A rejected build, a stale candidate, or a re-entrant call publishes neither side, leaves the active generation untouched, and reports bounded diagnostics. Prompt fragments, cached agent recipes, and the session prompt refresh only when the committed content digest changed.
50
+ - Extension `hooks.yaml` declarations are now registered from the exact bytes hashed during install-digest verification and captured into the snapshot. A `hooks.yaml` rewritten after verification is never reopened; the tree fails verification on the next generation and contributes no hooks. Hook sources and hook receipts carry a structured `extension` object with the package provenance (id, scope, canonical root, manifest digest, content digest), the declarations digest, and the admitting generation, replacing the loose `extensionScope` and `installedContentDigest` fields. `hook-receipts.json` stays version 1 and older records still parse.
51
+ - Middleware registrations declared by user hooks are owned as one unit under a strictly increasing generation. A replacement for an older or equal generation is refused, a late disposer from a superseded generation is a no-op, builtin and host registration ids are never taken by an owned set, and an in-flight asynchronous hook evaluation finishes against the registration list it started with. Collisions surface as a `registration_conflict` middleware diagnostic and interactive notice.
52
+ - `docs/configuration-reference.md` is the audited inventory of every switch that changes what Clio Coder does at the 0.4.2 cut: 158 settings keys, 102 environment variables, 310 CLI flags across 33 commands, 60 `.clio-coder/` file keys, 22 recipe and 4 fragment frontmatter keys, 97 tool arguments on `dispatch`, `bash`, `context`, and `verify`, and 77 model knowledge-base tags, each with its default, what it controls, and what beats what when several surfaces set the same value. The audit behind it found 168 of them documented nowhere, 4 read by nothing, 13 with a second spelling, and 1 documented default that disagreed with the code; the entries below apply the result. Bounding constants are listed as code-owned invariants, not configuration.
53
+ - The documentation tree is organized by audience (`docs/guide/` for operators, `docs/architecture/` for contributors, `docs/process/` for how the project is run, `docs/history/` for dated records) with `docs/README.md` as the hub, and every one of the 51 Markdown pages has one HTML blueprint under `docs/html/` served by `clio-coder docs`. A source-first audit pinned to `ff56ea3e` found 42 pages with at least one claim that disagreed with the code (defaults, flag names, removed knobs, file paths) and corrected all of them; the blueprints were then synchronized from the corrected Markdown, and `docs/process/documentation-coverage.md` records the per-page result. The package ships the whole Markdown tree (never `docs/html`), `context(scope=docs)` walks the subdirectories, and the `docs-parity` hygiene check fails lint when a page and its blueprint disagree on the commands and environment variables they name or when either side is missing.
54
+ - Local model knowledge-base families and the quirks schema now declare static and thinking-level keyed chat-template kwargs (#267). Runtimes forward the merged kwargs object, preserving numeric values as numbers and letting existing thinking-control switches win on key collisions. NVIDIA Nemotron 3.5 Lightning declares static `force_nonempty_content`, Nemotron 3 Nano Omni declares numeric `reasoning_budget`, and Muse Glimmer declares level-keyed `reasoning_strength` while documenting LM Studio as unsupported.
55
+
56
+ ### Changed
57
+ - `/quit` in a pane host now says what it left behind. The policy is decided (#272): docks (the files pane, the workers watch pane) close with the session, utility panes opened with `/panes open shell|logs|<argv>` stay, and `/quit` prints one line after the terminal is restored naming each pane it left, the `/panes close all` that would have taken them along, and the `herdr pane close` that closes them now. Nothing is printed when only docks were open. Contract: `tests/contracts/panes-quit-left-behind.test.ts`.
58
+ - Tool results now use a configurable `context.toolResultMaxBytes` ceiling with a 65,536-byte default and a 4,096-byte minimum. Session overrides and configuration reloads apply to the next result, while overflow still preserves the complete text in the session scratch file and the separate 196,608-byte turn guardrail remains unchanged.
59
+ - Chat output now defaults to each model's advertised maximum instead of a fixed 32,768-token ceiling. Models without an advertised cap retain a bounded 32,768-token fallback, explicit settings still win, and the Qwen3.6 27B and 35B catalog caps now match the vendor's documented 81,920-token maximum.
60
+ - The files pane no longer names its engine anywhere an operator reads. The preset is `files` (`/panes open files`; `yazi` still parses as an alias so saved habits and scripts keep working), the pane label is `files`, the composer notices say "the files pane", the doctor rows read `files pane profile` and `naming files profile`, the Settings labels read Files pane, and the help overlay gains a "panes & files" topic. The engine's name survives exactly where it is a fact the operator acts on: the registry id in `clio-coder tools install yazi`, `tools status yazi`, and the `interface.panes.files.*` settings the reference already used. The model's `panes` tool enum carries `files`, `logs`, `shell`.
61
+ - `/panes open logs` and `/panes open shell` say why the pane layer is missing and how to get it, repeating detection's reason (`HERDR_ENV is not 1, so Clio is not running inside a pane host`) and the `clio-coder --with-panes` remedy, where they previously said only that the layer was unavailable. An empty logs preset names the journal root it watched instead of "has nothing to show yet". A second `/panes open shell` or `logs` focuses the pane that is already open rather than splitting a second one, and reports `focused pane` so the difference is visible.
62
+ - Local model knowledge now projects only engine-consumed sampling and thinking quirks. Removed structured KV cache recommendations and unused per-profile output caps; KV serving facts remain in `llamaCpp`, `measuredUnder`, and serving notes, while `capabilities.maxTokens` remains the authoritative output cap. No request default changes. Catalog authors should use those surviving provenance and capability fields instead of the five removed no-op tags.
63
+ - Model residency now resolves only from `targets[].lifecycle`. Removed the duplicate `CLIO_CODER_RESIDENCY` process switch. Local targets remain managed by default, and SSH nodes remain observe by default through WorkerSpec lifecycle projection. Operators should replace process overrides with `targets[].lifecycle` or `fleet.nodes[].residency`; an explicit target `user-managed` opt-out remains authoritative.
64
+ - Smooth-stream pacing and third-party project resource trust now resolve only from `interface.smoothStreaming` and `integrations.projectResources.trustProjectImports`. Removed both duplicate process environment overrides. `off` remains the smooth-stream default, and `false` remains the project-import trust default. Operators should replace environment overrides with those settings keys.
65
+ - Guardrail limits and the run event journal now use only their version 2 settings paths under `safety.limits` and `fleet`. Removed the seven duplicate environment overrides, and the existing settings defaults remain in force. Operators should replace environment overrides with the corresponding `safety.limits`, `fleet.limits`, and `fleet.history` keys. Session-only changes and configuration hot reload now refresh the process-local projections, and the orchestrator reads the current turn budget on each attempt.
66
+ - Removed the deprecated `CLIO_CODER_MAX_RUNS` and `CLIO_CODER_TRUST_PROJECT_SKILLS` environment spellings, the pre-fleet `--worker*` command aliases, the headless `run --runtime` alias, and eval's `--clio-entry` alias. No default behavior changes. Operators should use `fleet.history.maxRuns`, `integrations.projectResources.trustProjectImports`, and the canonical flags named by each command's help; old spellings now reject or fall through without compatibility warnings.
67
+ - The `dispatch` tool schema serializes its `intent` and `budget` object schemas once, under `$defs`, and references them by JSON pointer from the top level and from every task; a task object now carries only what varies per task (`task`, `briefing`, `agent`, `budget`, `target`, `model`, `node`, `worktree`, `intent`, `gate`), with `persona`, `tool_profile`, `cwd`, and `apply` inherited from the batch defaults (an item that still sends one is honored). The schema went from 9,863 to 7,959 characters; under Qwen3.8-27B on dynamo the `dispatch` tool went from 2,884 to 2,357 tokens and the full-capability first turn from 9,501 to 8,923, and on the Ornith 1.5 tokenizer the schema went from 2,190 to 1,782 tokens with the per-task object alone from 635 to 201. TypeBox's validator and pi's tool-argument validator both resolve the pointers, and `tests/contracts/dispatch-admission.test.ts` still admits a batch whose tasks declare their own intent and budget.
68
+ - Resource loads no longer re-hash installed extension trees on every skills, prompts, agents, or fleets read. An extension installed, enabled, disabled, or removed by another process while a session runs is not visible to that session until `/resources extensions reload` or a restart; previously it could appear on the next load without any explicit action. `clio-coder config inspect` reports hook and extension entries with `reload:reload` instead of `reload:restart`.
69
+ - Updated the Pi engine SDK libraries (`pi-ai`, `pi-agent-core`, `pi-tui`) from 0.84.0 to 0.84.4. The agent loop now runs Clio's post-tool continuation guard only when another assistant turn is about to start, so a terminating tool batch no longer triggers the guard after its final result; Clio's guard was already continuation-only and needed no change. Inherited fixes include OpenAI-compatible reasoning replay and thinking-signature serialization, Anthropic server-side refusal fallback pricing, optional tool arguments sent as `null` being treated as omitted, fullscreen transcript search and half-page/line scrolling actions, the SSH-aware `PI_TUI_ESC_TIMEOUT` escape window, and lower alternate-screen per-frame allocation. While the fullscreen search overlay is focused, `ctrl+g` advances the match and the Clio leader chord is unavailable; Clio's own bindings do not otherwise overlap the new defaults. New engine lifecycle contracts lock these behaviors.
70
+ - The delegation threshold now opens the Delegation section as a count taken before the first edit, with the dispatch call shape beside it: two or more independent file-scoped changes, or any repository-wide exploration however small the repository looks, means one `dispatch` call with `tasks` (one per change, `agent` coder, `mode` parallel, `intent` naming each file) or a `scout` dispatch before any repo-wide grep or read, and the parent keeps synthesis and validation. The Fleet block no longer carries the threshold. On the round-2 drive with Qwen3.8-27B on LM Studio at temperature 0 the bare Fleet-block threshold lost to inertia on every run (two-changes 0 of 2 dispatched, reconnaissance 0 of 2 dispatched scout); with the count up front and the call shape next to it, two-changes dispatched both workers in one parallel call on 6 of 6 runs and reconnaissance dispatched scout before any repo-wide read on 5 of 6, the miss being the run before "however small the repository looks" was added. On the final build the parent stayed off both assigned files on 2 of 2 two-changes runs, spot-checked the receipts, and ran the tests itself. Re-measured after the merge with v0.4.2's prompt hardening and the `dispatch` schema slim: two-changes 2 of 2 dispatched with the parent off both assigned files, reconnaissance 2 of 2 scout-first, inventory and docs-first 2 of 2, bad-argument recovery 2 of 2 without a same-shape retry, and the skill suggestion fired on 2 of 2 runs at 8,995 first-turn tokens.
71
+ - `ledger` is off the session tool surface and on every worker registry. The session never binds an agent-ledger port, so on that surface the tool could only answer "no ledger" while its schema cost 444 tokens of every first turn; `registerCoreTools` takes `includeLedgerTools`, the session leaves it off, and the worker registry sets it whether or not a port is bound, because the orchestrator admits `ledger` for every batch member and signs that surface. An interim build that gated the worker side on the port refused every batch worker with `Worker attestation rejected: tool surface drift`; `tests/contracts/worker-attestation-surface.test.ts` pins both sides.
72
+ - The compiled prompt reads the tool surface from the frozen name list only. `toolSurfaceHasTool` in `src/domains/prompts/compiler.ts` counted a registry hint as evidence that its tool was attached, so a stale hint could render the Skills or Delegation passage for a tool the model could not call; hints now render only for tools on that list and the surface gates read the same list.
73
+ - The `context(scope="skills")` listing opens with a label instead of a second copy of the suggest-and-continue protocol; the recency anchor at the bottom, the line literal models act on, is unchanged. Every catalog skill's description is now one lead sentence saying what the skill does plus its "Not for X; use Y" routing clauses, with the trigger phrases kept in `triggers`: the 31 descriptions went from 13,116 to 7,741 characters in the listing. `skills/README.md` and `skill-craft` state the split, and every catalog version took the minor bump the versioning policy requires for a description change.
74
+ - Recipes name `code_nav` only as "when it is among your tools": routine non-Scout dispatch removes the tool, so "when a codewiki exists, prefer `code_nav`" invited a call the worker could not make.
75
+ - Three dispatch rejections that cost a live orchestrator a round each now either read the intent or say what to do. `intent.read_roots` or `write_roots` entries of `.` or `./` name the repository root, which an empty scope already means, so they are read as that instead of refused; a briefing that quotes an import specifier such as `./parser.js` infers `parser.js` instead of failing the whole dispatch for a dot segment (a `..` token is still refused as an escape); and the `verification_check_undeclared` and empty-`gate` errors say what an entry is (a check id `verify()` lists, never a shell command) and offer the move that always works, omitting it and running the check after the receipt. The orchestrator that put `git diff src/formatter.ts` in `verification` had retried the same shape until the loop guard disabled tool calls for the turn.
76
+ - The model knowledge base gains an `ornith-1.5` family with an on-off thinking mechanism. The inherited `ornith` entry classified every Ornith checkpoint as always-on from a 2026-08-08 LM Studio measurement of Ornith 1.0, so a worker dispatched with thinking off still produced a full reasoning trace (1,061 of 1,518 output tokens on one debugger receipt). Measured 2026-09-02 on llama.cpp: `enable_thinking: false` answered in 4 completion tokens with no `reasoning_content`, `true` spent 79.
77
+ - Seven more ids the mini llama.cpp router serves now resolve to a family whose thinking mechanism was measured on that runtime. Six had no family at all, and what that cost depended on how the router launched them. `gemma4-26b-moe` and `gemma4-31b-dense` run under `--reasoning off` and `muse-30b-dense` under no `--reasoning` flag at all, so the probe reported no reasoning, the resolver returned mechanism `none`, pinned the dial to off, and stripped every thinking field from the payload. `nemo3.5-30b-moe`, `nemotron3-30b-moe-omni` and `thinkingcap-27b-dense-q4` run under `--reasoning on`, so the probe reported reasoning and the resolver already guessed `on-off` and already put `enable_thinking` on the wire; what they gain here is a measured classification instead of a guess, plus sampling defaults, guidance and provenance. `qwopus3.6-35b-moe` matched the `qwopus3.6-27b-v1-preview` distill through a bare `qwopus3.6` pattern and inherited a budget-tokens dial that emits nothing on llama.cpp. Measured 2026-09-02 on a one-line arithmetic prompt, completion tokens at `chat_template_kwargs.enable_thinking` false against true: `gemma4-26b-moe` 3/99, `gemma4-31b-dense` 3/68, `nemo3.5-30b-moe` 3/120, `nemotron3-30b-moe-omni` 4/42, `thinkingcap-27b-dense-q4` 3/130, `qwopus3.6-35b-moe` 3/130, every one of them on-off; `muse-30b-dense` gave 91 tokens with 332 characters of reasoning at false against 90 with 312 at true, so it is always-on and its strength scale has no off level to reach. `reasoning_effort` moved none of the seven on llama.cpp, so `nemotron-3-nano-omni-30b-a3b-reasoning` drops its budget-tokens dial and `qwopus3.6-35b-a3b-coder` drops its four-level effort map, both for on-off, and both keep their earlier LM Studio findings in `measuredUnder`. New families cover NVIDIA Nemotron 3.5 Lightning, Meta Muse Glimmer 30B, and BottleCapAI ThinkingCap-Qwen3.6-27B. The bare `qwopus3.6` pattern is deleted rather than reordered, because the matcher ranks by pattern length and ignores file order. The `thinkingcap-27b-dense-q6` the issue names was measured on the same date and then deleted from mini, so the family is keyed to the q4 the router still serves (`tests/contracts/local-model-family-resolution.test.ts`).
78
+ - The Gemma channel filter is keyed on the wire model id rather than on the resolved family, so it survives a Gemma id gaining a catalog entry. `capabilityFamily` returns the knowledge-base family whenever the catalog matches an id, and every Gemma entry names a build (`gemma4-26b-a4b`, `gemma-4-31b-it-qat-mtp`), never the literal `gemma-4` the gate compared against, so the filter had been running only for Gemma ids the catalog did not know. Naming `gemma4-26b-moe` and `gemma4-31b-dense` in the catalog would have turned it off for the two the mini router serves, and a llama-server that leaves the thought inline in `content` would have put `<|channel>own-think` and the private thought into visible assistant text and into turn history.
79
+ - The prompt-optimization recording proxy keeps llama.cpp's `timings` block (`prompt_n`, `cache_n`, `prompt_ms`) beside each captured request and keeps the tail of a long stream rather than its head, and `envelope-run.ts` takes `--runtime` so a llama.cpp target can be measured. Development instruments only; nothing under `scripts/` ships.
80
+ - The first turn of a full-capability session on this repository measured 12,950 input tokens under Qwen3.8-27B before this change, 69 percent of it tool schemas and 26 percent the `dispatch` schema alone, with the same rules restated across the Delegation fragment, the Fleet block, the Tool Contract, and the `dispatch` and `monitor` descriptions. The prompt now says each rule once: the Delegation fragment keeps receipt and spot-check discipline, the Fleet block keeps routing (including that `agent:"auto"` is a fallback, which no longer also appears in the Tool Contract), the Skills fragment is a short suggest-and-continue pointer since the first-turn `[Skills]` reminder is the channel local models act on, the identity block drops the biography and keeps the name, the vendor denial, the safety line, and the installed paths, and the operating contract drops the posture-toggle and report-artifact sentences. Every `dispatch` field keeps one discriminating sentence and the tool description states only the call shape; `monitor`, `steer`, `panes`, `ask_user`, `verify`, `bash`, `credential_present`, `web_fetch`, and `ledger` lose restated policy from their schemas. Recipe descriptions now lead with a job sentence that fits the 64-character roster line, so the Fleet section no longer ends nine of eleven lines in `...`.
81
+ - Tool schemas reach the provider without TypeBox 1.x's string-keyed markers. `Type.Unsafe` and `Type.Optional` stamp `"~unsafe": null` and `"~optional": true` on every enum field, and unlike the older symbol keys those survive `JSON.stringify`, so 44 such keys rode along on the default surface. `wireParameterSchema` in `src/tools/agent-tools.ts` hands the agent loop a copy with every `~`-prefixed key removed; `Value.Check` validates identically with and without them and the registry keeps the original schema object.
82
+ - Rebuilt the product README and operator documentation around the current CLI, settings-v2 contract, package layout, and experimental boundaries so new users and repository agents have one concise, accurate route into the product.
83
+ - Compacted the main and worker system prompts by removing duplicated routing, skill, retrieval, and worker-task prose while preserving Clio identity, autonomy and safety rules, Fleet receipts and evidence, permission routing, local-model guidance, result contracts, and stable section order.
84
+ - The `dispatch` tool schema is composed once per session from the fleet the session starts with (`src/tools/dispatch-schema.ts`). The council fields (`roster`, `members`, `synthesis`, `rounds`) are advertised only when `fleet.rosters` names a roster, the compete fields (`candidates`, `judge`, `apply_winner`) only when the fleet has more than one distinct target/model route, and the adaptive-routing fields (`routing.posture`, `minimumQuality`, `locality`, `failover`) only when `fleet.adaptiveRouting` activates a role or posture; the hard bounds (`maxCostUsd`, `deadlineMs`, `requiredCapabilities`) and the `mode` enum entries for the advertised modes stay. Admission reads every field whether or not it was advertised, so a caller that sends a hidden one is honored. `intent.write_roots` and `intent.expected_outputs` carry one-sentence descriptions saying they are paths under a write root, not prose: the interim two-changes batch (r4-mid) paid 3 and 1 dispatch rejections (`intent_outputs_outside_write_roots`, `verification_check_undeclared`) before its parallel call was admitted; the final batch (r4-final) dispatched both tasks in one parallel call with per-task intent on the first try in 2/2 runs, and the parent edited neither assigned file. On the one-route, no-roster sandbox under Qwen3.8-27B on dynamo the `dispatch` tool went from 2,357 to 1,800 tokens (1,766 before the two descriptions) and the full-capability first turn from 8,924 to 8,365 (r4-final; the same tree measured 8,323 on mini under Ornith 1.5); `tests/contracts/dispatch-schema.test.ts` pins the composition and the open schema.
85
+ - The `coder` recipe says to make each read and verification call once. Round-3 receipts on Ornith 1.5 showed every coder run blocked five times by the identical-call loop guard (repeated `code_nav` and `git diff`) while using 17 to 30 of its 50-call budget; the final batch's four coder runs used 3, 5, 9, and 17 calls with 0, 0, 1, and 2 blocks (r4-final against 30/5, 19/5, 27/5, 17/5 in r3-final). Budgets and result contracts stay as they were: no builtin recipe reached its budget or fired contract repair in any measured run, so the guard, not the budget, was the binding knob. The worker prompt pin moves from 5,179 to 5,335 characters.
86
+ - Thinking "off" now reaches LM Studio for effort-level families (qwen3.8 and its relatives) as `reasoning_effort: "none"`. LM Studio ignores `chat_template_kwargs.enable_thinking` for these models, so every session configured with `chat.thinkingLevel: off` on that runtime had been reasoning anyway (37k reasoning tokens in one 25-minute interactive turn), and every round-2 to round-4 main-agent measurement on dynamo ran with reasoning on. Measured on a one-line prompt: `enable_thinking:false` left 63 reasoning tokens, identical to no override; `reasoning_effort:"none"` produced 0 and a shorter rendered prompt. llama.cpp keeps the template flag alone, which it honors. The `chat.thinkingLevel` default moves from `off` to `low` in the same release (see the next entry), so a fresh home keeps the reasoning it had been getting by accident (`tests/contracts/thinking-off-wire.test.ts`).
87
+ - `chat.thinkingLevel` defaults to `low` instead of `off`. Every measurement before the wire fix ran with reasoning on, so `off` had never actually been the shipped behavior on LM Studio. With reasoning truly off, the same three-issue interactive exercise on Qwen3.8-27B re-emitted one batch of eleven read-only calls five times and finished nothing in its first run, and even with the loop guard fixed the model plans visibly worse than it does with a low effort budget. `fleet.default.thinkingLevel` stays `off`: workers run bounded recipes where the round-4 receipts showed no benefit. Existing settings files that name a level are unaffected.
88
+ - The identical-call loop detector retains the last 48 attempts instead of a 30-second window or the last four, and the loop guard counts repeats from the turn's last successful write or edit. A session with thinking off re-emitted the same batch of eleven read-only bash calls five times, every call admitted, and ran to the 60-call soft budget with nothing done; a batch re-emitted a third time is now blocked on its first call, while a check rerun after an edit stays a fresh call (`tests/contracts/loop-detector.test.ts`, `tests/contracts/loop-guard-epoch.test.ts`).
89
+ - A worker confined to `write_roots` is told so: the Declared Result Requirements block says the run has no bash or verify tool, that the host runs the declared checks after it finishes, and to write the code and tests and report; the `write_roots` schema description and the Delegation section say the same to the coordinator, which now puts checks in `verification` instead of the task text. Before this, three parallel coders on Ornith 1.5 told to "run the tests" spent 40, 23, and 15 `code_nav` calls looking for a way to run them and made zero source edits; with the sentence they finished in 10, 18, and 12 calls with every file edited (`tests/contracts/intent-requirements.test.ts`).
90
+ - A typed intent that declares no `write_roots` and no `expected_outputs` outranks the prose task classifier for a read-only recipe, so a scout survey that mentions writing a failing test is admitted instead of refused as a change-class task. An intent with a write root still refuses (`tests/contracts/dispatch-admission.test.ts`).
91
+ - The `[dispatch scope]` notice names only tokens with a source or document extension or a trailing separator, capped at twelve; a live three-task dispatch had printed 27 omitted "paths" per task, most of them `0.5`, `4/10`, `v24.9`, `e.g`, and method names like `Store.fromText`.
92
+ - `tasks done` on a task that was never started records the start and the completion together and names the implicit start in its notes; the evidence note stays mandatory. A live session had spent six start/done pairs of pure ceremony closing a board whose work was already done (`tests/contracts/task-board-done.test.ts`).
93
+ - The chat panel renders a `Suggested skill: /skill <name>` line wherever the model wrote it as the suggestion row, with the rest of the message as the answer. Round-4 skill batches fired the line 2/2 per batch but opened the reply with it 1/2, 1/2, and 0/2 across three wordings, so the harness recognizes it instead (`tests/contracts/rendering-invariants.test.ts`).
94
+ - The compact footer row names the live context window after the percent (`ctx ▰▰▱▱ 4.6% of 262.1k`) at 72 columns and wider, so a session on a 1M window and one on 128k no longer read the same. The window comes from the context ledger when one is bound and from the target capabilities otherwise; an unknown window shows the percent alone (`tests/contracts/footer-context-window.test.ts`).
95
+ - Self-awareness names the live settings file and state directory of the resolved home rather than the XDG defaults, and the tool-inventory line says `dispatch(list:true)` answers which target and model run the session and its workers. Asked which worker would run a coder dispatch and where that is configured, the first exercise run answered from the recipe alone; the third named the fleet default target and model from the isolated home's settings.yaml. The `artifact` description says to close the task board before writing, because the artifact ends the turn. Main prompt 10,313 -> 10,504 chars (`tests/contracts/compact-prompt-contracts.test.ts`).
96
+
97
+ ### Fixed
98
+ - The boot deprecation for a skill file that still carries `clio:` frontmatter names the file, and `clio-coder doctor` finds it. The warning read `'clio: skill metadata' is a deprecated Clio Coder identifier` with no path, while the doctor's `naming resources` row said installed skills were canonical, because `inspectSkillMetadataNaming` scanned only `<config>/skills` and `.clio-coder/skills` and the loader also reads every interop agent's user and project compatibility root (`.claude/skills`, `.codex/skills`, `.agents/skills`, and the rest). The operator's copy was a gitignored `.claude/skills/file-ticket/SKILL.md` in the project. The warning now reads `clio: skill metadata in <path>`, once per file, and the doctor scans the loader's roots and lists each offending path with the rename to make (`tests/contracts/settings-migration.test.ts`).
99
+ - The engine reads runtime metadata from `model.clioCoder` again. The 2026-09-01 naming migration moved the key the synthesizer writes from `model.clio` to `model.clioCoder` (`src/domains/providers/runtimes/common/local-synth.ts`) and updated the providers domain, but `src/engine/apis/openai-completions.ts`, `src/engine/apis/lmstudio.ts`, `src/engine/apis/ollama-native.ts`, and the prompt compiler in `src/interactive/turn-context.ts` kept reading `clio`, so for every model built since the migration the engine saw no metadata at all: LM Studio targets kept receiving the `chat_template_kwargs` map the runtime ignores and never ran residency, TTL, draft-model or advertised-effort handling; family sampling profiles never reached the request; llama.cpp requests carried no `cache_prompt` and skipped residency; llama.cpp and LM Studio backend timings were not attributed; Ollama residency and quirks did nothing; and the family's thinking guidance never rendered into the Runtime prompt block. Reproduced through the OpenAI-compatible fixture with a model shaped exactly as the synthesizer shapes it, and the contract suite had not caught it because the one engine test that builds such a model had been updated to the new key without the reader following. `tests/contracts/engine-model-metadata-key.test.ts` pins the LM Studio wire (no `chat_template_kwargs`, `reasoning_effort` from the dial), the sampling profile on the request, and llama.cpp's `cache_prompt`.
100
+ - Thinking off reaches LM Studio as `reasoning_effort: "none"` for every mechanism, not only effort-level families (#268). Measured 2026-09-02 on dynamo at temperature 0 on a one-line prompt: `chat_template_kwargs.enable_thinking: false` left 26 reasoning tokens on qwen3.8-27b, 52 on gemma-4-26b-a4b-it and 105 on nvidia-nemotron-3.5-lightning-30b-a3b, while `reasoning_effort: "none"` produced 0 on each. The resolver's on-off branch already carried the spelling; the budget-tokens branch did not, and the wire only reached it through the LM Studio payload composer that the metadata-key regression above had switched off. `resolveRequestCapability` now sets `none` for any inactive mechanism other than `none` and `always-on` on that runtime, and llama.cpp keeps the template flag alone. A family's own chat-template kwargs (#267) are no longer merged into a request the runtime drops: on LM Studio the resolver lists them under `request.undeliverableChatTemplateKwargs` with whether the family entry marks them `lmstudio: unsupported`, and runtime resolution prints one `chat-template-kwargs-undeliverable` warning per target and model, so a Nemotron 3.5 Lightning session on dynamo says it runs without `force_nonempty_content` instead of finding the key missing from the wire. `tests/contracts/thinking-off-wire.test.ts` covers on-off, budget-tokens and the shipped Gemma 4 and Nemotron 3.5 entries on both runtimes; `tests/contracts/chat-template-kwargs-diagnostic.test.ts` drives the warning through `resolveRuntimeTarget`.
101
+ - gpt-oss reasoning from LM Studio lands in thinking content (#269). LM Studio streams the Harmony analysis channel as the OpenAI-compatible `reasoning` delta field, with `reasoning_content` absent (measured 2026-09-02 on dynamo, gpt-oss-20b and gpt-oss-120b). The OpenAI-completions stream reader already accepts `reasoning_content`, `reasoning`, and `reasoning_text`, so the text was captured; what was missing was a contract holding that and a family entry naming the field per runtime. The `openai-gpt-oss` entry now states `reasoning_content` on llama.cpp and `reasoning` on LM Studio, and `tests/contracts/lmstudio-reasoning-field.test.ts` streams all three spellings through the engine against the fixture and checks the text stays out of the answer and the Harmony effort goes out as `reasoning_effort` with no `chat_template_kwargs`.
102
+ - `interface.panes.enabled: embedded` no longer turns every pane off. The settings overlay offered `embedded` beside `auto` and `off`, and picking it made boot print "embedded mode is not implemented yet ... this session has no panes at all" while the same operator inside herdr would have had guest panes under `auto`. Embedded mode is still unimplemented; the rung now runs the guest detection ladder and logs that it did, so the setting an operator chose because they wanted panes gives them panes (`tests/contracts/pane-remedies.test.ts`).
103
+ - A settings file that raises `safety.limits.readBytesPerCall` above the 50 KiB default no longer refuses to start. The read tool's result-size policy cap was computed once at module import from the guardrail default, while the drift check at registration compared it against the cap installed from settings, so `clio-coder` exited with `tool policy drift: tool read policy cap 53248B sits below self cap + slack (67584B)` before the first prompt. The cap is now recomputed when the tool is registered (`tests/contracts/read-policy-cap-follows-guardrail.test.ts`).
104
+ - `docs/architecture/artifact-versions.md` gives `<stateDir>/runs.json` (the dispatch run ledger, `RunEnvelope` in `src/domains/dispatch/state.ts`) its own registry row instead of only naming it as deliberately excluded. It has at least nine reader call sites across the eval, evidence, CLI, and TUI domains and genuinely has no version field on `RunEnvelope` to check, so the row follows this document's own existing pattern for a real but unversioned artifact (`Current Version: unversioned JSON array`, matching the Out-of-turn Usage Ledger and Library Pins rows already there) rather than inventing a version number that does not exist. Also corrected, in the same paragraph: the doc named a `detached-batch` store it deliberately excludes from its registry, but the actual on-disk file is `batches.json` (`src/domains/dispatch/batch-store.ts:55`); the sentence now names the real filename. Mirrored both changes into `docs/html/artifact_versions_blueprint.html`. Docs-only; no code or behavior changed, and `check-hygiene.ts`'s `docs-parity` check passes.
105
+ - The trace database's `runs` table now carries an explicit `source` column (`'dispatch'` or `'session'`) instead of leaving a dispatch run and an interactive session turn indistinguishable except through the undocumented sentinel `assignment_id = "session"`. `docs/architecture/trace-store.md` named that sentinel but never called it a discriminator a reader should rely on. The column is additive, the same way `processes.host`/`processes.birth_token` were added before it: `TraceStore` (the writer) backfills it in place from the sentinel on next open, with no schema-version bump, matching this database's existing migration precedent (`ensureProcessOwnerColumns`). Because `TraceReader` and the trace-viewer's `ViewerDatabase` both open read-only and can reach a database no writer has touched yet (the viewer opened fresh against a dormant install being the realistic case), both now detect a missing column via `PRAGMA table_info` and derive the same value from the sentinel at query time rather than showing an absent field. `clio-coder trace runs`' text-mode table gains a SOURCE column; its `--json` output and the trace-viewer API carried the field automatically once the column exists, since both already `SELECT *`. `tests/contracts/trace-store-run-source.test.ts` and `apps/trace-viewer/tests/server.test.mjs` cover the read-only-before-migration, writer-then-reader, and fresh-database cases.
106
+ - The observability projection's run summary and the interactive dispatch board no longer maintain two copies of the same DispatchCompleted/DispatchFailed field mapping. Both independently subscribed to the same three bus channels and built their own summary; `resolveFailedStatus`, mapping a failure `reason` to a terminal status, existed as two byte-for-byte identical function bodies in `src/domains/observability/projection.ts` and `src/interactive/dispatch-board.ts`, kept in sync only by a comment asking the next editor to remember to. Re-verified the two sides were not actually a wholesale duplicate before touching anything: the dispatch board's `DispatchBoardRow` carries dozens of fields (budget envelope, gate/council state, trust projection, context-window meter, retry and failover tracking) the observability summary has no concept of, driven by additional bus channels (`DispatchEnqueued`, `RunAborted`, assignment/attempt events) the summary never reads, so making the board read the projection instead of its own subscription, the audit's proposed direction, would have thrown away real state; consolidation was scoped to the two fields the discrepancy actually named. The status mapping is now `resolveDispatchFailureStatus` in the new `src/core/dispatch-outcome.ts`, imported by both. Cost provenance had a real, live divergence, not just a duplication risk: the projection validated a payload's `costProvenance` against the closed four-value set and kept the previous value otherwise, while the board accepted any truthy string via `payload.costProvenance ?? "unknown"`; both now call the new `resolveCostProvenance` in `src/domains/providers/types/cost-provenance.ts`, which applies the stricter, correct behavior on both sides. Fixing `applyTerminalTokens` to use the projection's own existing `num()` helper (already used elsewhere in the same file, just not here) for `costUsd`/`tokenCount`/`inputTokenCount`/`outputTokenCount`/`reasoningTokenCount` closes a related gap in the same code: those fields previously passed a bare `typeof === "number"` check that accepted `NaN`/`Infinity`, unlike the board's already-`Number.isFinite`-checked equivalent, so a malformed terminal payload could silently corrupt the projection's running total while the board correctly rejected it. `tests/contracts/dispatch-outcome-provenance.test.ts` pins the two shared resolvers directly; `tests/contracts/observability-run-summary.test.ts` drives the projection through a real bus end to end, including the NaN/Infinity and out-of-set-provenance cases.
107
+ - The observability projection's notice ring (`src/domains/observability/projection.ts`) no longer classifies seven notice kinds nothing ever read. `runtime`, `middleware`, `safety`, `loop`, `tool-budget`, `context`, and `budget` notices were built from the same bus channels the interactive layer's own live notice pipeline (`bus-notices.ts` and `interactive-event-projection.ts`) already classifies independently, richer and with real behavior attached (loop-guard and tool-budget notices can cancel the active turn, which the projection's pure classifier cannot do), for the toast surface a session actually shows; the projection's copies had no reader anywhere and could silently disagree with what the operator saw. Verified one kind is a genuine, live exception: `evidence`-kind notices (evidence-build failures) are read by the Dispatch Board's per-run evidence-failure-reason lookup and have no equivalent in the interactive notice pipeline, so that kind, `pushNotice`, and the notice ring itself are unchanged; `ObservabilityNotice.kind` narrows to `"evidence"` and `.ref` narrows to `{ runId }`, its only populated field. `tests/contracts/observability-notices.test.ts` pins that the seven removed channels now produce nothing and that evidence-build-failure notices still round-trip.
108
+ - `clio-coder config inspect` now reads the durable hook-execution receipt log it has claimed to read since the log's own doc comment was written. `hook-receipts.json` (`src/domains/middleware/hook-receipts.ts`, written on every user-defined hook execution) had zero readers anywhere in the repository, and `config inspect` only ever read hook *configuration* sources (`capturedHookSourcesFor`), never execution receipts; a doc comment at the top of the writer named `config inspect` as the reader regardless. The customization graph now carries one `hook-receipts` entry (count, capacity, an outcome tally, and the most recent receipt) sourced from `readPersistedHookReceipts`, a new reader that loads the persisted snapshot back for a process that never held the running session's in-memory ring. One rolled-up entry rather than one per receipt: the graph explains configuration provenance, and a couple hundred execution rows would swamp that rather than answer it. `tests/contracts/hook-receipts-inspect.test.ts` covers both the never-persisted and the populated case.
109
+ - `skills-eval` and `clio-coder eval run` no longer resolve to the same artifact file when handed the same eval id. Both `writeEvalArtifact` (version-1 `EvalRunArtifact`, `src/domains/eval/store.ts`) and `writeEvalArtifactV4` (version-4 `EvalArtifactV4`, `src/domains/eval/artifacts/store.ts`) computed `<dataDir>/evals/<evalId>.json`, so one writer could silently overwrite the other's differently-shaped file; `eval inventory`'s directory listing was also miscounting every on-disk `skills-eval` artifact as an unreadable retired shape, since it reads only version 4. The legacy version-1 writer now nests under `<dataDir>/evals/skills-eval/<evalId>.json`; the documented version-4 location (`docs/architecture/artifact-versions.md`'s Eval Artifact row) is unchanged. `tests/contracts/eval-artifact-namespacing.test.ts` writes both shapes under one shared id in both orders and reads both back intact.
110
+ - The files pane engine's per-session transport files (`.stream`, `.chooser`, `.cwd` under `<cache>/yazi/sessions/`) were never removed, so every open left three files behind for the life of the install. They are removed when the session ends, and anything older than a day is swept on the next open, which also cleans up installs that accumulated them before this release. The vendored engine configuration also loses a `title_format` key the pinned engine does not read.
111
+ - The llama.cpp probe no longer loads a model to read its slot count. A router answers `/props?model=<id>` by loading that model, and with `--models-max 1` that evicts whatever is resident, so every probe of a fleet target's default model unloaded the chat model and the next turn prefilled from zero (the round-3 resume run on mini prefilled 11,601 tokens with `cache_n` 0 even though the resumed request was byte-identical through the tool results). The router's model list already carries the worker's flags for an unloaded model, so the worker's props are read only when the router reports it resident; `tests/contracts/llamacpp-router-probe.test.ts` pins both cases. Re-measured on the same two-turn run: the resumed turn's first request prefills 90 new tokens against 11,525 cached in 0.66 s, and the turn's wall time went from 31 s to 5.9 s.
112
+ - A synthesis-locked worker round whose reply was tool-call markup only gets one re-prompt, delivered as a paired synthetic tool exchange, before the fallback notice stands as the run's whole output; when a result contract is active, that round costs the re-prompt rather than one of the contract's bounded repair slots. Locked rounds remove the tool surface on OpenAI-family runtimes and send `tool_choice: none` on Anthropic, whose API rejects a history carrying tool_use blocks when no tools are defined. Measured on mini with a two-call recipe that locks every run, the re-prompt recovered every Ornith 1.5 markup round and 2 of 4 on Qwen3.8-27B.
113
+ - Headless `run --autonomy <level>` takes effect. The flag was keyed by the bare word in the session overrides, which `setAtPath` wrote as a top-level key nothing reads, so a run in a home saved at auto-edit compiled "Autonomy: auto-edit" and parked a piped bash command for approval; the override is now keyed `safety.autonomy`, the path the effective view, the prompt compiler, and admission all read. `tests/smoke/cli-core.test.ts` runs the same home with and without the flag.
114
+ - A resumed session replays a parallel tool batch's results in the order the assistant issued the calls. The ledger records a result when its tool finishes while the live loop sends the batch by call index, so a two-call turn whose second call finished first replayed as [b, a] after being sent as [a, b], and the provider prefix cache missed from that message for the rest of the session (the round-2 two-turn run on mini swapped messages 3 and 4). Results are staged until the next non-result message and released in call order; an orphan keeps its ledger position after the known ones. The visible transcript still renders the ledger as recorded.
115
+ - `intent.verification: [{ check: "none" }]`, the shape a model writes to say "no verification", normalizes to an empty list instead of a refused dispatch round, unless the project declares a check by that name.
116
+ - A briefing that quotes an import specifier with a leading `../` no longer fails the whole dispatch (#266). Round-5 exercise run 3 lost a coder dispatch to `legacy_scope_path_malformed: briefing contains a malformed path token '../src/store.js'` after the orchestrator copied `import { Store } from "../src/store.js"` out of `test/store.test.ts`, then retried without the quote. The quote's origin never reaches prose inference, which is handed the task and briefing text and nothing else, so a leading `../` run is stripped and the remainder probed against the dispatch root: `../src/store.js` infers `src/store.js` when that file exists, and is otherwise dropped from inference instead of rejecting the call. That costs one `existsSync` per `../`-leading token (3 microseconds on a hit and 2 on a miss over 5,000 warm calls) and no stat for the ordinary token, which the grammar matches dozens of per dispatch. **A leading run that names nothing is dropped rather than refused**, including `../../../etc/passwd`, which is a deliberate reading of the issue rather than an oversight: a run's origin is unknowable at this layer, so "never reject the dispatch" and "still refuse a token whose `..` segments leave the repository root" cannot both hold for the same input, and only the first is decidable without an origin. Neither outcome widens authority, since an inferred path selects project rules but never becomes a write boundary and an anchored remainder carries no `..` to escape with, and neither is silent: both the drop and the rewrite are named per token in a `[dispatch scope]` notice, on the stderr diagnostic, and on the `dispatch_plan` approval artifact, which now probes the dispatch's own `cwd` rather than the orchestrator's process directory so the plan an operator approves resolves the same scope the run does. A `..` or `.` outside the leading run (`src/../../b.ts`, `../src/./b.ts`) walks back out of a segment it already anchored and keeps the refusal, and typed `intent.read_roots`, `write_roots`, and `relevant_paths` still refuse any `..` with `intent_path_escapes_root`.
117
+ - A fresh home no longer bounds every llama.cpp endpoint to one slot until someone runs `targets --probe`. The dispatch domain probes each configured endpoint whose bound resolved to the local-native default once when it starts, in the background and without the inference-based reasoning check, and the count lands in the provider statuses and the durable slot store where admission already looks.
118
+ - Compiled-prompt reuse now keys every resolved runtime input and the exact provider-facing attached-tool schema bytes, while handbook context, project rules, operator profile, workspace facts, and repository awareness are snapshotted per session and refreshed only by configuration invalidation or a new session; unrelated cache misses no longer admit opportunistic disk drift.
119
+ - Tool guidance now shares one deterministic role-aware normalizer, renders Marketplace installation ownership once, and remains absent for unavailable tools and roles. Bundled `code_nav source=clio` keeps its source in continuation guidance and resolves indexed paths under the installed or explicitly overridden package root.
120
+ - Extension manifests once again permit the documented omission of `resources` while strictly validating any value that is present. Upgrade now backs up and atomically adds verified content digests to valid pre-digest install records without changing their source, timestamp, or disabled state; invalid legacy trees remain visible but inactive. Corrupt extension state stays fail-closed but no longer traps operators: forced reinstall and removal preserve corrupt state and unverifiable package bytes before recovery. Share-imported extension packages now pass whole-tree preflight and the canonical transactional installer, so a successful import always has a verified install record before resources activate.
121
+ - Extension admission now rejects malformed manifests, invalid or changed installed trees, escaping links, hard-linked files, and special resource entries before they can contribute resources or hooks; canonical package discovery deduplicates aliases while retaining failures as deterministic diagnostics.
122
+ - Documentation that disagreed with the code: `integrations.externalAgents.defaults.toolGovernance` defaults to `clio-coder-policy` (the page said `clio-policy`); `CLIO_CODER_FORCE_COMPACT` compacts before every interactive turn while set, not once; `CLIO_CODER_TRUST_PROJECT_RESOURCES` can only enable trust, never revoke a setting that grants it; `CLIO_CODER_TIMING` prints only on the bannered non-interactive boot; `CLIO_CODER_RESIDENCY` also accepts `0`, `false`, `user`, and `user-managed` and is exported to SSH workers; `CLIO_CODER_RUN_JOURNAL`, `CLIO_CODER_EVAL_RUNNER_STDOUT_FILE`, and `CLIO_CODER_YAZI_PICK_TOKEN` have rows.
123
+ - `src/tools/dispatch-schema.ts` carried one NUL byte since round 4 and diffed as binary; stripped.
124
+ - A parallel dispatch batch runs each declared host check once, after every live member of the wave has finished, and charges a failing check by write-root coverage across the whole wave. The checks used to run per worker on the shared checkout while siblings were still editing it, so one worker's broken test sealed `host_verification_rejected` on all three receipts of a three-task batch (round-5 interactive exercise, 2026-09-02, kvlog with workers on mini `ornith1.5-35b-moe`). Exculpation always requires positive evidence: a member is cleared only when the failing check named a path and every named path falls inside its own boundary or inside a live sibling's, and a member that declared the check but no `intent.write_roots` ran with no write confinement at all, so it is charged unconditionally. A failing check that names no path, or names one no member claims, still rejects every member that declared it. A cleared member seals the new `hostVerification.status: "not_implicated"` rather than `verified`, because its `checks` array still carries the non-zero exit code and `verified` is what the trust surface, the board, and `worker evidence` all read as "the declared checks passed"; the run is not failed by it and no validator speaks for it. The receipt also seals `hostVerification.strategy: "batch-settled"` and the per-check attribution, whose `basis` names the weakest evidence behind the charge; a single-task dispatch omits both and its receipt bytes are unchanged. The barrier waits only on members that already hold a capacity lease and never on one still queued for capacity, so a batch larger than `fleet.concurrency` cannot deadlock on its own parked leases, and each later admission wave forms its own barrier instead of racing. The queued member of such a batch is admitted once the live members settle rather than when the first of them finishes, so a batch whose first member finishes inside the 60 s admission deadline and whose last does not now expires that member's admission and aborts the batch; releasing the lease before the barrier would readmit a writer into the checkout the settlement is about to judge, so that wait stands. Taking the workspace fingerprint once on the settled tree also stops the verification memo key churning between siblings (`tests/contracts/host-verification-batch.test.ts`).
125
+
126
+ - ACP's per-prompt usage accumulator (`AcpServerUsage`, `src/engine/acp/server.ts:206`) carried five discrete token fields and never a combined total or a dollar figure, while the TUI and the CLI `--json`/`--json-events` dispatch stream both carry `totalTokens` and `costUsd` for the same run; an editor connected over ACP had to reconstruct the total itself and had no way at all to show cost. `mergeUsage` now reads `usage.cost.total` off the same `message_end`/`agent_end` message objects `sumRunUsage` already reads for the TUI and json-stream paths, so ACP's dollar figure is never re-derived through a separate pricing calculation, and `totalTokens` follows the same explicit-value-or-summed-fallback rule `sumRunUsage` uses. Both fields ride in the existing `clio-coder/usage` `_meta` key on the `session/prompt` result. `tests/contracts/acp-usage-meta.test.ts` pins the accumulation, including the malformed-cost and explicit-total-wins cases.
127
+
128
+ ### Removed
129
+ - `CLIO_CODER_RESUME_SESSION_ID` and `CLIO_CODER_BOOTSTRAP_GENERATE_CHILD` are no longer read: nothing has set the first since headless `--session` and `--continue` replaced the self-restart, and the bootstrap scout that the second guarded against now runs as an internal dispatch. The `budgetTokens` key in seven prompt fragments' frontmatter went with them; the loader reads only `id`, `version`, `description`, and `dynamic`. `TERM_PROGRAM` is still read for OSC 9 notification routing but no longer copied into the stream-pacing environment it never consulted.
130
+ - `CLIO_CODER_SYNTHESIS_LOCK` is no longer read, and a synthesis-locked worker round always removes the tool surface on OpenAI-family runtimes. Its `tool-choice` mode kept the schemas and sent `tool_choice: none` instead, which preserved the locked round's prefix (350 to 900 new tokens against 1,200 to 1,800 for the strip, roughly half the prefill time), but it never beat the strip on any family measured on mini with a two-call recipe that locks every run, losing on two of the three and tying on the third. Lost-result counts, strip against tool-choice: Qwen3.8-27B 1 of 5 against 2 of 5, Ornith 1.5 35B 0 of 5 against 0 of 5, Ornith 1.5 9B 2 of 5 against 3 of 5. Under tool-choice the model called a tool anyway in 4 of 5 Qwen3.8-27B runs and 2 of 5 Ornith 1.5 35B runs, with no such count taken on Ornith 1.5 9B. Setting the variable now does nothing.
131
+
5
132
  ## 0.4.1 - 2026-09-01
6
133
 
7
134
  This grew beyond the bug-fix-only patch originally planned. v0.4.1 is a full release led by the version-2 `settings.yaml` contract, its automatic migration, and a smaller grammar-driven slash-command surface. It adds editor and marketplace workflows; fixes the release-blocking configuration, CLI, TUI, and Workbench failures found in final testing; replaces the oversized test and CI machinery with one fast deterministic gate; consolidates evaluation around the shipping eval domain and `evals/` reference suites; and moves machine-facing names into the `clio-coder` namespace without changing the product persona.
package/CONTRIBUTING.md CHANGED
@@ -32,26 +32,39 @@ Local and GitHub PR gate (fast, deterministic):
32
32
  npm run ci
33
33
  ```
34
34
 
35
+ This runs type checking, lint (including boundaries, documentation drift and
36
+ skill pins), one build, the contract/smoke suite, and the trace-viewer suite.
37
+ Use `npm run skills:check` when checking skill pins on their own; it is already
38
+ included in `lint` and `ci`.
39
+
35
40
  Release gate (for maintainers before tags or release artifacts):
36
41
 
37
42
  ```bash
38
43
  npm run ci:release
39
44
  ```
40
45
 
41
- Live LLM smoke validation (manual/opt-in):
46
+ The release gate includes `ci` and adds the package audit. Running `ci` again
47
+ on the same unchanged tree is unnecessary. Run a focused regression while
48
+ developing a repair, then the full gate for the candidate being reviewed.
49
+
50
+ Live provider validation (manual/opt-in, after `npm run build`):
42
51
 
43
52
  ```bash
44
- npm run live:smoke -- --target <configured-target-id>
53
+ node dist/cli/index.js run \
54
+ --target <configured-target-id> \
55
+ --autonomy read-only \
56
+ "Reply with exactly: CLIO_LIVE_OK"
45
57
  ```
46
58
 
47
59
  ## Testing conventions
48
60
 
49
- CLI-facing contract tests drive the built binary through the child-process
50
- harness in `tests/harness/spawn.ts`: `makeScratchHome()` gives the run an
51
- isolated `CLIO_CODER_HOME`, and `runCli(args, { env, cwd })` spawns `dist/cli` and
52
- returns its captured `stdout`, `stderr`, and exit code. Rebuild `dist/` with
53
- `npm run build` after changing CLI source, since these tests exercise the
54
- built output.
61
+ Contract tests import `src/` directly through tsx. The test scripts preload
62
+ `tests/harness/tmp-root.ts`, which gives the run one guarded temporary root,
63
+ and stateful tests use the helpers in `tests/harness/scratch-env.ts` to isolate
64
+ Clio's data, config, state, and cache directories. Smoke tests exercise the
65
+ built `dist/cli/index.js`; their files own the process drivers needed for each
66
+ boundary. Rebuild `dist/` after changing CLI or entry-point source before
67
+ running a focused smoke test.
55
68
 
56
69
  Do not assert a CLI subcommand's output by capturing `process.stdout.write`
57
70
  in-process. In-process stdout capture fights the node:test spec reporter:
@@ -64,28 +77,46 @@ output in-process while the reporter runs.
64
77
  ## Releasing
65
78
 
66
79
  Releases are cut from a tag. The GitHub release is created by CI; the npm
67
- publish is a manual maintainer step. The ordered procedure for a cut lives in
68
- [docs/release-cut-checklist.md](docs/release-cut-checklist.md).
69
-
70
- 1. Bump `version` in `package.json` and retitle the top section of
71
- `CHANGELOG.md` to the version being cut. `scripts/check-release.mjs` fails
72
- when the two disagree or the heading still says `Unreleased`.
73
- 2. Run `npm run ci:release`. It runs the full `ci` gate, then
74
- `scripts/check-release.mjs`, which verifies the built `dist/` and audits
75
- the exact npm package contents.
76
- 3. Land the release commit on `main`. There is no need to wait on the `ci`
77
- workflow before tagging: the release workflow runs the same gate itself.
78
- 4. Tag and push: `git tag -a vX.Y.Z && git push origin vX.Y.Z`. The tag must
79
- match `package.json`'s version; the release workflow refuses mismatches.
80
- 5. `.github/workflows/release.yml` verifies the tag against `package.json`,
81
- runs `npm run ci:release` on the tagged tree, and creates the GitHub
82
- release with the tarball attached and the version's `CHANGELOG.md` section
83
- as the body. It does not publish to npm.
84
- 6. A maintainer publishes from the tagged commit with `npm publish`;
85
- `prepublishOnly` runs the same `ci:release` gate first.
80
+ publish is a manual maintainer step. The current procedure is the sequence
81
+ below together with `.github/workflows/release.yml` and
82
+ `scripts/check-release.mjs`. The
83
+ [v0.4.1 release-cut checklist](docs/history/release-cut-checklist.md) is a
84
+ historical record, not a reusable current checklist.
85
+
86
+ 1. During development, keep the top changelog section at `## Unreleased`. A
87
+ maintainer collects release work on a **local-only** compact candidate
88
+ branch (`v043` for `v0.4.3`) and bumps `version` there. Never push this
89
+ candidate branch to the canonical repository. Before the cut, retitle the
90
+ changelog section `## <version> - YYYY-MM-DD`.
91
+ 2. Run `npm run ci:release` on the exact candidate. It runs the full `ci` gate,
92
+ then `scripts/check-release.mjs`, which verifies the built `dist/` and
93
+ audits the exact npm package contents.
94
+ 3. Fetch `origin`, require the fetched `origin/main` to be the candidate's
95
+ ancestor, then fast-forward local `main` with `git merge --ff-only v043`.
96
+ Re-run the release gate if the candidate changed and verify local `main`
97
+ equals the reviewed candidate SHA.
98
+ 4. Fetch once more and stop on unexpected movement. With explicit maintainer
99
+ authorization, push only `refs/heads/main:refs/heads/main`; no topic or
100
+ release-candidate branch is pushed to canonical `origin`.
101
+ 5. Require CI for that exact `main` SHA to pass. Create the annotated tag on
102
+ that commit and push only it: `git tag -a v0.4.3` followed by
103
+ `git push origin refs/tags/v0.4.3`. The tag must match `package.json`; the
104
+ release workflow refuses mismatches.
105
+ 6. `.github/workflows/release.yml` verifies the tag against `package.json`,
106
+ runs `npm run ci:release` on the tagged tree, and creates the GitHub release
107
+ with the tarball attached and the version's `CHANGELOG.md` section as the
108
+ body. It does not publish to npm.
109
+ 7. A maintainer publishes from the tagged commit with `npm publish`;
110
+ `prepublishOnly` runs the same `ci:release` gate in release mode first.
111
+ 8. Verify the release and tag, then delete the local compact candidate branch.
112
+ The canonical remote returns to its steady state: `main` plus immutable
113
+ release tags and GitHub releases, with no release branch.
86
114
 
87
115
  What `scripts/check-release.mjs` enforces, and how to respond when it fails:
88
116
 
117
+ - Development branches may open with `## Unreleased`. Exact version tags and
118
+ `npm publish` require `## <version> - YYYY-MM-DD`, so unfinished notes cannot
119
+ enter an immutable artifact.
89
120
  - Only `dist/cli/index.js` and `dist/worker/entry.js` carry a shebang. The
90
121
  shebang comes from the hashbang line in each entry source file. Never add
91
122
  a tsup `banner`; it would stamp every chunk in `dist/`.
@@ -95,10 +126,10 @@ What `scripts/check-release.mjs` enforces, and how to respond when it fails:
95
126
  - Runtime resources must resolve from the installed package root: prompt
96
127
  fragments, builtin agents, model catalogs, the Markdown guides in `docs/`, the 128px logo,
97
128
  and `damage-control-rules.yaml`. A new runtime resource must be listed in
98
- both package.json `files` and the required list in `check-release.mjs`.
129
+ both package.json `files` and `scripts/release-manifest.json`.
99
130
  The double bookkeeping is deliberate: neither edit can silently drop a
100
131
  resource the CLI needs at runtime.
101
- - Size budgets: 15 MB tarball, 40 MB unpacked, set in `check-release.mjs`.
132
+ - Size budgets: 10 MB tarball, 50 MB unpacked, set in `check-release.mjs`.
102
133
  They are a tripwire for packaging defects such as a leaked `node_modules`
103
134
  or a doubled `dist/`, not a diet. If a legitimate change exceeds them,
104
135
  raise the budget in the same PR with a justification, never as a drive-by.
@@ -112,29 +143,45 @@ that needs them runs.
112
143
 
113
144
  ## Hard Rules
114
145
 
115
- 1. Do not push to `main`.
116
- 2. Open pull requests against `main`.
117
- 3. `main` requires review by `@akougkas`.
146
+ 1. The canonical repository's only branch is `main`. Maintainer topic,
147
+ integration, and release-candidate branches stay local and are never pushed
148
+ to canonical `origin`.
149
+ 2. Contributors push topic branches to their own forks and open pull requests
150
+ from the fork into canonical `main`; they never push a topic branch to the
151
+ canonical repository.
152
+ 3. A maintainer may update canonical `main` only by an explicitly authorized,
153
+ reviewed fast-forward from the exact locally gated candidate. Everyone else
154
+ changes `main` through a pull request reviewed by `@akougkas`.
118
155
  4. Keep every PR focused. Split unrelated docs, runtime, CLI, and TUI work.
119
156
  5. Update `CHANGELOG.md` for user-visible behavior, developer workflow, or
120
157
  release status changes.
121
158
  6. Run `npm run ci` before requesting review.
122
159
  7. Do not commit secrets, local config, generated `dist/`, or scratch plans.
160
+ 8. Push release tags as fully qualified `refs/tags/vX.Y.Z`; never push a
161
+ similarly named branch.
123
162
 
124
163
  ## Architecture Invariants
125
164
 
126
- The boundary checker enforces these:
127
-
128
- - Engine boundary: only `src/engine/**` value-imports pi SDK packages
129
- (`@earendil-works/pi-*`, pinned in `package.json`).
130
- - Worker isolation: `src/worker/**` value-imports only the worker-safe
131
- provider runtime rehydration modules under `src/domains/providers/**`;
132
- all other worker domain imports must be type-only.
133
- - Domain independence: cross-domain flows go through `SafeEventBus`.
165
+ The boundary checker enforces these six rules:
166
+
167
+ - Engine boundary: only `src/engine/**` imports the
168
+ `@earendil-works/pi-*` packages, including type-only imports.
169
+ - Worker isolation: `src/worker/**` may value-import only the declared
170
+ provider runtime rehydration seams under `src/domains/providers/**`; all
171
+ other worker imports from domains must be type-only.
172
+ - Domain independence: one domain never imports another domain's
173
+ `extension.ts`; cross-domain behavior uses public contracts and event buses.
174
+ - Tool substrate: `src/tools/**` never imports `src/interactive/**`.
175
+ - Entry-point composition: `src/interactive/turn-*.ts` and `chat-loop.ts` never
176
+ import `src/entry/**`.
177
+ - Stage 0 closure: external value importers enter the protected instant-shell
178
+ graph only through declared seams, and those seams may not create an
179
+ undeclared edge back into the closure.
134
180
 
135
181
  The checker runs as part of `npm run lint` (`scripts/check-hygiene.ts` imports
136
182
  `tests/boundaries/check-boundaries.ts`), so a boundary violation fails the
137
- same lint every PR runs.
183
+ same lint every PR runs. The full definitions and exceptions live in
184
+ [Architecture](docs/architecture/architecture.md#boundary-invariants).
138
185
 
139
186
  ## Branches
140
187
 
@@ -152,6 +199,44 @@ Examples:
152
199
  - `fix/session-resume-replay`
153
200
  - `docs/github-governance`
154
201
 
202
+ Maintainer branches are local-only. A temporary release candidate uses the
203
+ compact version spelling with no dots: `v043` for release tag `v0.4.3`. Never
204
+ create or push a branch named `v0.4.3`; dotted `vX.Y.Z` names belong exclusively
205
+ to immutable release tags. The compact branch is local scaffolding and is
206
+ deleted after its reviewed commit reaches `main` and the release succeeds.
207
+
208
+ Contributors use the same topic prefixes in their own forks. The pull request
209
+ head is `<contributor-fork>:<topic>` and its base is canonical `main`. Delete
210
+ the fork branch after merge so both the canonical repository and contributor
211
+ forks return to a small steady state.
212
+
213
+ ### Branch closeout
214
+
215
+ Branch and worktree cleanup is part of finishing work, not optional future
216
+ housekeeping. Use `branch-closeout` (or `ship closeout`) to automate this
217
+ verification and teardown safely. After a PR is merged or a release is tagged:
218
+
219
+ 1. Fetch and prune remote-tracking refs, then verify the PR is merged and its
220
+ result is represented on `origin/main`. An ancestry check is sufficient for
221
+ merge commits; squash and cherry-pick landings require the merged PR and
222
+ resulting commit as evidence rather than a matching subject alone.
223
+ 2. Confirm the source worktree has no tracked or untracked work worth keeping.
224
+ Remove a registered worktree with `git worktree remove <path>`, never
225
+ `rm -rf`; use `--force` only after explicitly authorizing disposal of the
226
+ remaining local artifacts.
227
+ 3. Delete the local topic or release branch. For a contributor PR, delete its
228
+ branch from the contributor's fork after merge. A topic branch must never be
229
+ created on canonical `origin`, and canonical `main` is never deleted.
230
+ 4. Preserve unfinished experiments by filing their result and next decision in
231
+ an issue, not by accumulating anonymous `work/`, `wip/`, or `tmp` refs.
232
+ 5. Report the remaining local branches, worktrees, stashes, local-only tags,
233
+ and canonical remote heads. The expected canonical head set is exactly
234
+ `refs/heads/main`; every additional head is a cleanup failure.
235
+
236
+ For a release, first verify `refs/tags/vX.Y.Z^{commit}` equals the reviewed
237
+ commit on `main`, then close the compact candidate branch such as `v043`.
238
+ Published tags are never deleted, moved, or recreated during cleanup.
239
+
155
240
  ## Commits
156
241
 
157
242
  Use concise conventional subjects:
@@ -206,19 +291,24 @@ Agents should:
206
291
  `skills/` is the curated skills marketplace: maintainer-approved `SKILL.md`
207
292
  guides, distinct from the runtime skills any user can drop into a discovery
208
293
  root. It is not itself a discovery root, so nothing here auto-loads; skills
209
- activate only via `clio-coder skills install <name>`.
294
+ activate after `clio-coder skills install <name>` or from an explicit
295
+ `clio-coder --skill skills/<category>/<name>/SKILL.md` development path.
210
296
 
211
297
  To propose a skill:
212
298
 
213
- 1. Add `skills/<name>/SKILL.md`. Follow the `superpowers:writing-skills`
214
- methodology and Anthropic's skill-authoring guidance: a trigger-rich
215
- `description` (third person, "Use when ..."), one excellent example, and
216
- progressive disclosure (push heavy reference into `references/`).
217
- 2. Include the provenance frontmatter (`registry-id`, `source-url`, `version`,
218
- `license`) and ship an `evals.md` with the baseline scenarios you tested.
219
- 3. Verify locally: `clio-coder skills validate skills/<name>/SKILL.md`, then
220
- `clio-coder skills install <name>` and `clio-coder skills list`.
221
- 4. Open a PR. A maintainer reviews against the rubric, then sets `audit: pass`
222
- and the `version` to approve it for the catalog.
299
+ 1. Add `skills/<category>/<name>/SKILL.md`. Follow the local
300
+ [`skill-craft`](skills/meta/skill-craft/) guidance: put trigger phrases in
301
+ `triggers`, keep `description` to the job and explicit routing boundaries,
302
+ and move conditional detail into `references/`.
303
+ 2. Include the core `name`, `description`, `version`, and `license` fields plus
304
+ a nested `clio-coder:` block with `registry-id`, `source-url`, `provenance`,
305
+ and `eval-status`. Ship an `evals.md` with the baseline scenarios.
306
+ 3. Verify locally with
307
+ `clio-coder skills validate skills/<category>/<name>/SKILL.md`.
308
+ 4. Install the candidate by name and confirm it appears with
309
+ `clio-coder skills list`.
310
+ 5. Open a PR. A maintainer reviews against the rubric, sets `audit: pass`,
311
+ approves the catalog version, then regenerates and checks the catalog with
312
+ `npm run skills:pin` and `npm run skills:check`.
223
313
 
224
314
  Full catalog conventions and install options: [skills/README.md](skills/README.md).