@iowarp/clio-coder 0.4.2 → 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 (369) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/CONTRIBUTING.md +86 -19
  3. package/README.md +35 -6
  4. package/dist/{acp-TMDQZDIG.js → acp-H2NGRPWO.js} +11 -11
  5. package/dist/{agents-5N5NG3XG.js → agents-TL5LLUQP.js} +54 -53
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-Z5CCBXKQ.js → auth-E5SW4HMS.js} +19 -16
  8. package/dist/{builtins-K6TNDT24.js → builtins-IA7V7FUC.js} +9 -4
  9. package/dist/{chunk-ZW4HH5JJ.js → chunk-2APPQIER.js} +6 -6
  10. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  11. package/dist/{chunk-UBRFI4HS.js → chunk-2UG5F4C5.js} +127 -47
  12. package/dist/{chunk-UH632ZYL.js → chunk-2UH2KFUP.js} +2 -2
  13. package/dist/{chunk-3F7VUY77.js → chunk-2VIKGWFZ.js} +2 -2
  14. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  15. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  16. package/dist/{chunk-2X4RYJTJ.js → chunk-4UVU7BJ5.js} +2 -2
  17. package/dist/{chunk-M2DAX4F6.js → chunk-4WR7VSYB.js} +2 -2
  18. package/dist/{chunk-5KW52TEP.js → chunk-54CBCGIR.js} +5 -5
  19. package/dist/{chunk-3KIPBMUA.js → chunk-5ICU3EUH.js} +2 -2
  20. package/dist/{chunk-77QIVUZB.js → chunk-5MEZN6CB.js} +4 -4
  21. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  22. package/dist/{chunk-LJID3DYZ.js → chunk-64I3JVYM.js} +2 -2
  23. package/dist/{chunk-4JDLP6ZS.js → chunk-6PTFB5VS.js} +7 -7
  24. package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
  25. package/dist/{chunk-HLAFFSEK.js → chunk-7DRAWPTZ.js} +2 -2
  26. package/dist/chunk-7E7I3WLS.js +3762 -0
  27. package/dist/{chunk-YJISEZKC.js → chunk-7ZYNNDKC.js} +6 -6
  28. package/dist/{chunk-I66ZTYNP.js → chunk-AF4YM7Z4.js} +236 -101
  29. package/dist/{chunk-2HFQNRV3.js → chunk-AX2THNSA.js} +12 -12
  30. package/dist/{chunk-PGF63K6I.js → chunk-B4OAX3SI.js} +65 -3
  31. package/dist/{chunk-W6NIE6OW.js → chunk-B4VEBZKF.js} +3 -3
  32. package/dist/{chunk-JBCS7CRR.js → chunk-BEPZRGGU.js} +10 -10
  33. package/dist/{chunk-XGDPUNND.js → chunk-CE5AX47J.js} +2 -2
  34. package/dist/{chunk-I64IFBLB.js → chunk-DWUOQKRU.js} +17 -10
  35. package/dist/{chunk-DZAW46HP.js → chunk-E3TPLWFX.js} +3 -3
  36. package/dist/{chunk-HIICAHCJ.js → chunk-EKCHAPYA.js} +2 -2
  37. package/dist/{chunk-XE3PCIXH.js → chunk-F5JHEYZM.js} +7 -7
  38. package/dist/{chunk-5PFYMY2V.js → chunk-FTMGRKEF.js} +2 -2
  39. package/dist/{chunk-ZNT2M6TG.js → chunk-G76U63X4.js} +17 -17
  40. package/dist/{chunk-34BHNEE3.js → chunk-GHS5EBTQ.js} +58 -7
  41. package/dist/{chunk-2NHR3NAY.js → chunk-GI7YYQ3F.js} +40 -34
  42. package/dist/{chunk-DYHAXKHD.js → chunk-GWZNEVM2.js} +12 -8
  43. package/dist/chunk-GYV6VZOC.js +26 -0
  44. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  45. package/dist/{chunk-W4YEMFBX.js → chunk-HEQY7ZFI.js} +2 -2
  46. package/dist/{chunk-IKOZFYBN.js → chunk-I7ZPNEJM.js} +145 -102
  47. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  48. package/dist/{chunk-XQRY4DTA.js → chunk-IGLP3ODT.js} +10 -10
  49. package/dist/chunk-IJNZMHLA.js +101 -0
  50. package/dist/{chunk-JWJGP5DQ.js → chunk-INY6HTFL.js} +7 -7
  51. package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
  52. package/dist/{chunk-B74PXLU7.js → chunk-IWT4SF4R.js} +3 -3
  53. package/dist/{chunk-B7HM5Z7T.js → chunk-JDAY6FIL.js} +5 -5
  54. package/dist/{chunk-PJX3WQUQ.js → chunk-JEQ3XTHC.js} +2 -2
  55. package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
  56. package/dist/{chunk-X7IARSHT.js → chunk-JKKCYP3C.js} +9 -9
  57. package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
  58. package/dist/{chunk-SSEYRH53.js → chunk-KK4JZPBQ.js} +19 -140
  59. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  60. package/dist/{chunk-Q4XWMHX6.js → chunk-L47TF46W.js} +2 -2
  61. package/dist/{chunk-O3YUNJZ2.js → chunk-LDJG7DW3.js} +81 -24
  62. package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
  63. package/dist/{chunk-F2I26BDK.js → chunk-MUW2BDDH.js} +4 -4
  64. package/dist/{chunk-HKMD33FO.js → chunk-MWUZBSAQ.js} +79 -76
  65. package/dist/{chunk-QQLGQY2A.js → chunk-N2Z7HLVY.js} +20 -20
  66. package/dist/{chunk-DZEK6CJN.js → chunk-NIQJ66N4.js} +19 -19
  67. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  68. package/dist/{chunk-462T4EGZ.js → chunk-O5CVSAG5.js} +2 -2
  69. package/dist/{chunk-TPEQIQIE.js → chunk-OML5D5V5.js} +8 -8
  70. package/dist/{chunk-IKSLQ4XV.js → chunk-PAJQJ7BS.js} +558 -216
  71. package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
  72. package/dist/{chunk-UH347SHR.js → chunk-QWGDJJYJ.js} +11 -11
  73. package/dist/chunk-R6Q67RJH.js +134 -0
  74. package/dist/{chunk-CRFOIAX3.js → chunk-RRNP2ANY.js} +6 -6
  75. package/dist/{chunk-IDNA72AH.js → chunk-RSJ25QSL.js} +2 -2
  76. package/dist/chunk-SKHCAU7K.js +385 -0
  77. package/dist/{chunk-RLYRBIYQ.js → chunk-TM6LQDI3.js} +20 -12
  78. package/dist/chunk-UOIZ7DA4.js +41 -0
  79. package/dist/{chunk-P75RZCJW.js → chunk-UPZU6GE4.js} +3 -3
  80. package/dist/{chunk-MCMZMDAC.js → chunk-V2ANDPVT.js} +4 -4
  81. package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
  82. package/dist/{chunk-IMXMHHMQ.js → chunk-VW6DOEDG.js} +332 -57
  83. package/dist/{chunk-XOXV5GKE.js → chunk-W6RRQCPQ.js} +16 -7
  84. package/dist/{chunk-CYZW7JHJ.js → chunk-WBKFA554.js} +8 -8
  85. package/dist/{chunk-BO7Y52RY.js → chunk-WCXUNS7U.js} +7 -7
  86. package/dist/{chunk-ZGNYYXQ6.js → chunk-WRBAGUNF.js} +3 -3
  87. package/dist/{chunk-FVDGR2ZL.js → chunk-XIVNBFZS.js} +85 -30
  88. package/dist/{chunk-BYMNWQ7O.js → chunk-XPWWI35G.js} +299 -58
  89. package/dist/{chunk-KPXDY6QF.js → chunk-XRZT5WY5.js} +2 -2
  90. package/dist/{chunk-AZ4WMN4W.js → chunk-Y3CBHOR6.js} +2 -2
  91. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  92. package/dist/{chunk-54ODD65L.js → chunk-YQWYVTMC.js} +4 -4
  93. package/dist/{chunk-M2WXEHER.js → chunk-ZA4VCIGV.js} +2 -2
  94. package/dist/{chunk-7BHIY2MW.js → chunk-ZDN3Y73Y.js} +6 -6
  95. package/dist/{chunk-E7GT7O5N.js → chunk-ZWPRK62N.js} +7 -4
  96. package/dist/cli/index.js +38 -37
  97. package/dist/{clio-7VB377CC.js → clio-CMMK4KRR.js} +7 -7
  98. package/dist/{code-nav-YVLCYA7V.js → code-nav-MDZNQS33.js} +7 -7
  99. package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
  100. package/dist/{config-4HVOS65E.js → config-SVM5P5YI.js} +76 -74
  101. package/dist/{configure-PIWO7B24.js → configure-LE3IK2TJ.js} +26 -24
  102. package/dist/{context-IYEHL3WQ.js → context-2OHRKS42.js} +66 -63
  103. package/dist/{context-N6ZE3LGJ.js → context-E3VC7RX5.js} +15 -11
  104. package/dist/{context-KQYIWPWT.js → context-VNCR7KAG.js} +60 -45
  105. package/dist/{context-clear-G4OGZJDS.js → context-clear-BW4O37TG.js} +61 -59
  106. package/dist/context-map-COB37XXN.js +505 -0
  107. package/dist/{context-working-set-BWLF6LJP.js → context-working-set-VDS25HXZ.js} +17 -16
  108. package/dist/{dispatch-runner-2QQAITS3.js → dispatch-runner-5AHT53RF.js} +85 -74
  109. package/dist/{doctor-LHBD36VU.js → doctor-WNNVO6FY.js} +37 -37
  110. package/dist/{eval-C45FYRJ6.js → eval-7G7SGAYO.js} +285 -114
  111. package/dist/{eval-inventory-6DEJPLBF.js → eval-inventory-Y6QRFOH5.js} +4 -4
  112. package/dist/{evidence-6SHONYAF.js → evidence-VD6736FQ.js} +63 -62
  113. package/dist/{evolve-KRKMV72X.js → evolve-AL3NGVRL.js} +62 -61
  114. package/dist/{extensions-KPZ2UHBB.js → extensions-MOVJ32NM.js} +7 -7
  115. package/dist/{fleet-IVTCKDHT.js → fleet-QZHUMAGI.js} +110 -108
  116. package/dist/{fleet-commands-EDWL3IT7.js → fleet-commands-BAYT5FJZ.js} +10 -10
  117. package/dist/{fleet-decisions-YP3YEFGK.js → fleet-decisions-IREVMRU4.js} +7 -6
  118. package/dist/{fleet-graph-ZFWKHY2M.js → fleet-graph-YCTT3HTI.js} +19 -18
  119. package/dist/{fleet-inspect-FVUNCBML.js → fleet-inspect-QVJTDAVB.js} +55 -54
  120. package/dist/{fleet-preflight-UN5XED4R.js → fleet-preflight-25QAFPK4.js} +4 -4
  121. package/dist/{fleet-validate-XOWC4HSX.js → fleet-validate-5O57AAJ7.js} +23 -22
  122. package/dist/{fleet-verify-UN3SODEL.js → fleet-verify-CPH2W2T6.js} +56 -55
  123. package/dist/{fleet-view-TWHJKCN6.js → fleet-view-SWBR3VGQ.js} +55 -54
  124. package/dist/{init-T2QORQ3Y.js → init-J477LKZH.js} +78 -76
  125. package/dist/{interop-IN5I2A66.js → interop-3FCM6XLG.js} +11 -11
  126. package/dist/{library-LSCATDLZ.js → library-QUQEIUG6.js} +28 -27
  127. package/dist/{memory-HYOKAGGJ.js → memory-SGGSEP65.js} +64 -63
  128. package/dist/{models-2GPMFYCM.js → models-HEKUAXXK.js} +49 -43
  129. package/dist/{monitor-E4ASVUJH.js → monitor-HKU57TYQ.js} +61 -60
  130. package/dist/{orchestrator-DDMPR3PY.js → orchestrator-VDFAEFAI.js} +919 -546
  131. package/dist/{panes-E3RUXOW5.js → panes-DN2SSFOH.js} +3 -3
  132. package/dist/{panes-IXKLOKA2.js → panes-TALGNPZT.js} +8 -8
  133. package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
  134. package/dist/reset-EAJFFJVB.js +344 -0
  135. package/dist/{resources-OTRSN34L.js → resources-OVKSEFVE.js} +27 -20
  136. package/dist/{run-5DEYH5QK.js → run-7DP7ZF2J.js} +113 -109
  137. package/dist/{share-IHWTLO3M.js → share-WML67FT3.js} +26 -25
  138. package/dist/{skills-IYMXMKW4.js → skills-SG662R2K.js} +39 -31
  139. package/dist/{skills-eval-DROHSJAR.js → skills-eval-VVZEUU46.js} +74 -73
  140. package/dist/{skills-inventory-D7X4L4ZX.js → skills-inventory-I2E23GET.js} +21 -20
  141. package/dist/{slash-commands-QBM7UZ3B.js → slash-commands-S7MBJDQK.js} +35 -34
  142. package/dist/{steer-Z5DO23FJ.js → steer-2LQOMCPB.js} +3 -3
  143. package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
  144. package/dist/{targets-P2FUC4IL.js → targets-4QC3HIEW.js} +48 -45
  145. package/dist/{terminal-lease-YREJ3JX2.js → terminal-lease-TUHIJ6Y2.js} +2 -2
  146. package/dist/{tools-5B7RO6MV.js → tools-TFGJICCU.js} +8 -8
  147. package/dist/{trace-YMGMUM6A.js → trace-FXMXUZUF.js} +7 -7
  148. package/dist/uninstall-5PEVOE5B.js +408 -0
  149. package/dist/upgrade-M4WXY6KN.js +303 -0
  150. package/dist/{usage-ME5MPXGX.js → usage-N7ZNVLEM.js} +147 -102
  151. package/dist/{verifiers-BVZ7IWOO.js → verifiers-DJTP4XX6.js} +15 -15
  152. package/dist/{verify-5K7ZKQFC.js → verify-RWE4PPEK.js} +9 -9
  153. package/dist/{wiki-generate-F5W5QTYY.js → wiki-generate-C7IQOXSP.js} +84 -82
  154. package/dist/{with-panes-BYOJCLAM.js → with-panes-4GCGSL7J.js} +9 -9
  155. package/dist/worker/entry.js +61 -60
  156. package/docs/architecture/artifact-placement.md +1 -0
  157. package/docs/architecture/artifact-versions.md +1 -1
  158. package/docs/architecture/context-engine.md +4 -0
  159. package/docs/architecture/middleware-and-components.md +1 -1
  160. package/docs/architecture/model-catalog.md +21 -10
  161. package/docs/architecture/observability.md +12 -1
  162. package/docs/architecture/prompt-envelope-and-tools.md +2 -0
  163. package/docs/architecture/provider-adapter-cookbook.md +63 -0
  164. package/docs/architecture/safety-model.md +15 -5
  165. package/docs/guide/built-in-agents.md +17 -3
  166. package/docs/guide/commands-and-modes.md +1 -1
  167. package/docs/guide/configuration-and-targets.md +97 -9
  168. package/docs/guide/configuration-reference.md +7 -2
  169. package/docs/guide/environment-variables.md +2 -0
  170. package/docs/guide/installation-and-lifecycle.md +37 -4
  171. package/docs/guide/proactive-memory.md +66 -55
  172. package/docs/guide/skills-marketplace.md +18 -0
  173. package/docs/process/development-pipeline.md +34 -1
  174. package/docs/process/eval-runner.md +67 -3
  175. package/evals/behavioral-model.yaml +3 -2
  176. package/package.json +2 -2
  177. package/skills/README.md +7 -5
  178. package/skills/coding/ast-grep/SKILL.md +101 -30
  179. package/skills/coding/ast-grep/evals.md +26 -0
  180. package/skills/coding/coding-standards/SKILL.md +40 -5
  181. package/skills/coding/coding-standards/evals.md +23 -0
  182. package/skills/coding/prototype/SKILL.md +87 -28
  183. package/skills/coding/prototype/evals.md +19 -0
  184. package/skills/coding/tdd/SKILL.md +80 -53
  185. package/skills/coding/tdd/evals.md +20 -0
  186. package/skills/context/context-handoff/SKILL.md +43 -2
  187. package/skills/context/context-handoff/evals.md +44 -0
  188. package/skills/context/context-prime/SKILL.md +45 -15
  189. package/skills/context/context-prime/evals.md +45 -0
  190. package/skills/git/branch-closeout/SKILL.md +132 -0
  191. package/skills/git/branch-closeout/evals.md +133 -0
  192. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  193. package/skills/git/file-ticket/SKILL.md +77 -63
  194. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  195. package/skills/git/file-ticket/evals.md +31 -26
  196. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  197. package/skills/git/fix-issue/SKILL.md +87 -64
  198. package/skills/git/fix-issue/evals.md +35 -31
  199. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  200. package/skills/git/resolve-merge-conflicts/SKILL.md +100 -51
  201. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  202. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  203. package/skills/git/ship/SKILL.md +103 -67
  204. package/skills/git/ship/assets/pr-template.md +21 -0
  205. package/skills/git/ship/evals.md +44 -28
  206. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  207. package/skills/git/worktree-create/SKILL.md +80 -50
  208. package/skills/git/worktree-create/evals.md +40 -33
  209. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  210. package/skills/git/worktree-merge/SKILL.md +112 -65
  211. package/skills/git/worktree-merge/evals.md +42 -34
  212. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  213. package/skills/planning/archify/SKILL.md +196 -0
  214. package/skills/planning/archify/evals.md +65 -0
  215. package/skills/planning/architecture/SKILL.md +61 -12
  216. package/skills/planning/architecture/evals.md +65 -0
  217. package/skills/planning/backlog/SKILL.md +130 -14
  218. package/skills/planning/backlog/evals.md +142 -0
  219. package/skills/planning/prd/SKILL.md +46 -6
  220. package/skills/planning/prd/evals.md +54 -0
  221. package/skills/planning/product-intent/SKILL.md +57 -2
  222. package/skills/planning/product-intent/evals.md +70 -0
  223. package/skills/planning/tech-spec/SKILL.md +53 -2
  224. package/skills/planning/tech-spec/evals.md +73 -0
  225. package/skills/registry.yaml +58 -50
  226. package/skills/remote.yaml +13 -0
  227. package/skills/research/arxiv-literature/SKILL.md +76 -18
  228. package/skills/research/arxiv-literature/evals.md +50 -0
  229. package/skills/research/experiment-protocol/SKILL.md +20 -1
  230. package/skills/research/experiment-protocol/evals.md +23 -0
  231. package/skills/research/scientific-debugging/SKILL.md +23 -1
  232. package/skills/research/scientific-debugging/evals.md +18 -0
  233. package/skills/research/scientific-modernization/SKILL.md +26 -1
  234. package/skills/research/scientific-modernization/evals.md +27 -0
  235. package/skills/skill-marketplace.json +63 -28
  236. package/skills/workflow/cut-it/SKILL.md +65 -5
  237. package/skills/workflow/cut-it/evals.md +101 -0
  238. package/skills/workflow/design-council/SKILL.md +117 -27
  239. package/skills/workflow/design-council/evals.md +161 -0
  240. package/skills/workflow/grill-me/SKILL.md +86 -10
  241. package/skills/workflow/grill-me/evals.md +153 -0
  242. package/skills/workflow/workflow-distiller/SKILL.md +76 -17
  243. package/skills/workflow/workflow-distiller/evals.md +118 -0
  244. package/src/cli/configure-interop.ts +105 -13
  245. package/src/cli/configure-oauth.ts +57 -0
  246. package/src/cli/configure-onboarding.ts +980 -0
  247. package/src/cli/configure-target.ts +594 -0
  248. package/src/cli/configure.ts +1082 -528
  249. package/src/cli/context-map.ts +114 -0
  250. package/src/cli/context.ts +4 -0
  251. package/src/cli/index.ts +1 -0
  252. package/src/cli/lifecycle-presenter.ts +436 -0
  253. package/src/cli/models.ts +10 -2
  254. package/src/cli/modes/print.ts +5 -1
  255. package/src/cli/reset.ts +228 -106
  256. package/src/cli/run.ts +7 -2
  257. package/src/cli/select.ts +664 -0
  258. package/src/cli/skills.ts +9 -2
  259. package/src/cli/targets.ts +3 -0
  260. package/src/cli/uninstall.ts +233 -165
  261. package/src/cli/upgrade.ts +204 -149
  262. package/src/cli/usage.ts +86 -27
  263. package/src/cli/validate-model.ts +3 -3
  264. package/src/core/config.ts +56 -0
  265. package/src/core/external-diagnostic.ts +44 -0
  266. package/src/core/gateway-routing.ts +157 -0
  267. package/src/core/safe-exec.ts +17 -2
  268. package/src/core/skill-activation.ts +89 -2
  269. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  270. package/src/domains/agents/catalog.ts +1 -1
  271. package/src/domains/agents/result-contract.ts +70 -0
  272. package/src/domains/context/wiki/map-seed.ts +589 -0
  273. package/src/domains/context/wiki/plan.ts +2 -2
  274. package/src/domains/dispatch/admission.ts +29 -0
  275. package/src/domains/dispatch/agent-candidates.ts +10 -0
  276. package/src/domains/dispatch/budget-envelope.ts +86 -1
  277. package/src/domains/dispatch/capability-match.ts +1 -0
  278. package/src/domains/dispatch/capacity-lease.ts +17 -0
  279. package/src/domains/dispatch/contract.ts +11 -1
  280. package/src/domains/dispatch/extension.ts +134 -29
  281. package/src/domains/dispatch/types.ts +3 -0
  282. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  283. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  284. package/src/domains/eval/metrics/token-stream.ts +201 -31
  285. package/src/domains/eval/metrics/tracked.ts +40 -4
  286. package/src/domains/eval/runners/clio-run.ts +5 -2
  287. package/src/domains/eval/schema/suite.ts +28 -0
  288. package/src/domains/eval/schema/verdict.ts +2 -2
  289. package/src/domains/eval/suites/resolve.ts +13 -1
  290. package/src/domains/eval/suites/run.ts +24 -3
  291. package/src/domains/interop/registry.ts +6 -2
  292. package/src/domains/interop/types.ts +4 -0
  293. package/src/domains/lifecycle/migrations/index.ts +4 -0
  294. package/src/domains/memory/task-memory-policy.ts +70 -26
  295. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  296. package/src/domains/middleware/index.ts +0 -1
  297. package/src/domains/middleware/marketplace-offer.ts +3 -35
  298. package/src/domains/middleware/memory-intervention.ts +127 -32
  299. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  300. package/src/domains/middleware/skills-reminder.ts +31 -2
  301. package/src/domains/observability/compaction-usage.ts +118 -0
  302. package/src/domains/observability/cost.ts +1 -1
  303. package/src/domains/observability/extension.ts +6 -1
  304. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  305. package/src/domains/providers/contract.ts +4 -1
  306. package/src/domains/providers/extension.ts +40 -9
  307. package/src/domains/providers/model-capabilities.ts +9 -0
  308. package/src/domains/providers/model-discovery.ts +2 -0
  309. package/src/domains/providers/model-runtime-capabilities.ts +15 -5
  310. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +32 -12
  311. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  312. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  313. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  314. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  315. package/src/domains/providers/support.ts +11 -5
  316. package/src/domains/providers/target-model-cache.ts +25 -2
  317. package/src/domains/providers/types/capability-flags.ts +2 -0
  318. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  319. package/src/domains/providers/types/target-descriptor.ts +19 -0
  320. package/src/domains/resources/index.ts +3 -0
  321. package/src/domains/resources/skills/install.ts +72 -7
  322. package/src/domains/resources/skills/loader.ts +7 -0
  323. package/src/domains/resources/skills/marketplace.ts +63 -11
  324. package/src/domains/safety/autonomy.ts +15 -0
  325. package/src/domains/safety/index.ts +1 -0
  326. package/src/domains/safety/path-policy.ts +1 -1
  327. package/src/domains/safety/policy-engine.ts +34 -11
  328. package/src/domains/safety/protected-artifacts.ts +191 -88
  329. package/src/domains/safety/run-effects.ts +2 -22
  330. package/src/domains/safety/skill-authority.ts +55 -0
  331. package/src/domains/session/compaction/compact.ts +72 -22
  332. package/src/domains/session/entries.ts +6 -0
  333. package/src/domains/session/usage.ts +3 -3
  334. package/src/engine/agent.ts +13 -3
  335. package/src/engine/ai.ts +26 -8
  336. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  337. package/src/engine/api-registry.ts +3 -0
  338. package/src/engine/apis/openai-completions.ts +117 -14
  339. package/src/engine/external-subprocess.ts +114 -6
  340. package/src/entry/background-model-metadata.ts +18 -0
  341. package/src/entry/compaction-prompt.ts +57 -0
  342. package/src/entry/orchestrator.ts +405 -216
  343. package/src/entry/task-memory-lifecycle.ts +35 -0
  344. package/src/interactive/chat-loop-messages.ts +13 -4
  345. package/src/interactive/chat-loop.ts +65 -2
  346. package/src/interactive/chat-renderer.ts +1 -0
  347. package/src/interactive/cost-overlay.ts +26 -2
  348. package/src/interactive/interactive-slash-runtime.ts +2 -1
  349. package/src/interactive/renderers/worker-entry.ts +32 -0
  350. package/src/interactive/slash-commands.ts +24 -6
  351. package/src/interactive/theme/labels.ts +19 -13
  352. package/src/interactive/turn-context.ts +9 -5
  353. package/src/interactive/turn-recovery.ts +8 -0
  354. package/src/interactive/turn-runtime.ts +27 -11
  355. package/src/interactive/turn-state.ts +7 -0
  356. package/src/interactive/worker-receipts.ts +1 -0
  357. package/src/interactive/worker-stream.ts +6 -1
  358. package/src/tools/context/index.ts +30 -9
  359. package/src/tools/dispatch-arguments.ts +1 -0
  360. package/src/tools/dispatch-event-text.ts +10 -0
  361. package/src/tools/dispatch-plan.ts +1 -0
  362. package/src/tools/dispatch-runner.ts +12 -0
  363. package/src/tools/registry.ts +11 -5
  364. package/src/tools/worker-evidence.ts +3 -1
  365. package/src/worker/spec-contract.ts +4 -0
  366. package/dist/chunk-2Z2IKEXI.js +0 -1554
  367. package/dist/reset-OAQP3W4O.js +0 -230
  368. package/dist/uninstall-N34PCTGJ.js +0 -331
  369. package/dist/upgrade-PXK3S2YM.js +0 -325
@@ -7,12 +7,13 @@ triggers:
7
7
  - find calls with this argument shape
8
8
  - find code inside a function
9
9
  - grep returns too much noise
10
- version: 0.2.0
10
+ version: 0.3.0
11
11
  license: Apache-2.0
12
12
  allowed-tools:
13
13
  - bash
14
14
  - read
15
15
  - write
16
+ - edit
16
17
  - grep
17
18
  - ls
18
19
  clio-coder:
@@ -36,30 +37,78 @@ that returns nothing tells you nothing.
36
37
  Search only. Never use `--update-all` / `-U` / `--rewrite`; when matches need
37
38
  changing, report them and edit through the normal edit tools.
38
39
 
40
+ ## Arguments
41
+
42
+ ```text
43
+ /skill ast-grep [--lang <language>] [--path <dir>] <structural question>
44
+ ```
45
+
46
+ - `--lang`: tree-sitter language name (`javascript`, `typescript`, `python`,
47
+ `rust`, `go`, ...). Omit to infer from the files under `--path`.
48
+ - `--path`: directory or file to scan. Omit to scan the project source
49
+ directory (`src/` when it exists, otherwise `.`).
50
+ - Everything else is the question: what shape to find, what to exclude.
51
+
52
+ The five steps below are the plan; do not open a task list for them.
53
+
54
+ Examples:
55
+
56
+ - `/skill ast-grep find async functions that await but have no try/catch`
57
+ - `/skill ast-grep --lang python --path app/ find calls to open() outside a with block`
58
+
59
+ Shell rules for every `bash` call in this workflow: one command per call,
60
+ plain and direct. Never use `$(...)` or backticks; they trigger an approval
61
+ gate that ends a headless run. Always pass rules through a file, never
62
+ through `--inline-rules`, because `$VAR` metavariables inside shell quotes
63
+ produce quoting errors that look exactly like non-matches.
64
+
39
65
  ## Step 0 — Check the binary
40
66
 
41
67
  ```bash
42
- command -v ast-grep || command -v sg
68
+ ast-grep --version
69
+ ```
70
+
71
+ If that fails, try the short alias, but verify it is really ast-grep:
72
+
73
+ ```bash
74
+ sg --version
43
75
  ```
44
76
 
45
- If neither exists, say ast-grep is not installed (`cargo install ast-grep` or
46
- the platform package) and stop. Some installs expose only `sg`; use whichever
47
- resolved.
77
+ Only an output that starts with `ast-grep` counts. On many Linux systems
78
+ `sg` is the unrelated shadow-utils "switch group" command and prints a
79
+ usage error; that is NOT ast-grep. If neither binary is ast-grep, say so
80
+ (`npm i -g @ast-grep/cli` or `cargo install ast-grep`) and stop. Do not
81
+ fall back to text grep and present it as a structural result.
82
+
83
+ Use the resolved binary name in every later command.
48
84
 
49
85
  ## Step 1 — Pin down the question
50
86
 
51
- Before writing any rule, state: the target language; the structure to match;
52
- what must be included and excluded. If the request is ambiguous on any of
53
- these, ask one clarifying question instead of guessing.
87
+ Before writing any rule, write in your reply: the target language; the
88
+ structure to match; what must be included and excluded. If the request is
89
+ ambiguous on any of these, ask one clarifying question. When running
90
+ headlessly, state your reading of the ambiguity and proceed.
54
91
 
55
92
  ## Step 2 — Write a minimal example
56
93
 
57
- Write the smallest code snippet that MUST match (and, when exclusions matter,
58
- one that must NOT match) to a scratch file, e.g. `/tmp/astgrep-example.js`.
59
- This is the rule's test fixture.
94
+ Create a scratch directory inside the workspace and write the smallest
95
+ code snippet that MUST match and, when exclusions matter, one that must
96
+ NOT match:
97
+
98
+ ```bash
99
+ mkdir -p .clio-coder/scratch/ast-grep
100
+ ```
101
+
102
+ Then write `.clio-coder/scratch/ast-grep/positive.<ext>` and
103
+ `.clio-coder/scratch/ast-grep/negative.<ext>` with the `write` tool. These
104
+ are the rule's test fixture: one file that must match, one that must not,
105
+ nothing more. Never write under `/tmp`, not even by shell redirection; a
106
+ write outside the workspace needs an approval a headless run cannot give,
107
+ and the call is refused.
60
108
 
61
109
  ## Step 3 — Write the rule, simplest first
62
110
 
111
+ Write `.clio-coder/scratch/ast-grep/rule.yml` with the `write` tool.
63
112
  Escalate only when the simpler form fails:
64
113
 
65
114
  1. `pattern` alone for direct shapes: `console.log($ARG)`.
@@ -73,7 +122,6 @@ Non-negotiable: every relational rule (`has`, `inside`) carries
73
122
  rule silently under-matches.
74
123
 
75
124
  ```yaml
76
- # /tmp/astgrep-rule.yml
77
125
  id: async-no-trycatch
78
126
  language: javascript
79
127
  rule:
@@ -84,6 +132,15 @@ rule:
84
132
  has: {pattern: 'try { $$$ } catch ($E) { $$$ }', stopBy: end}
85
133
  ```
86
134
 
135
+ This example is verified against ast-grep 0.45 on JavaScript. When the
136
+ question is this one, use it verbatim. Two facts it encodes that models
137
+ guess wrong: tree-sitter JavaScript and TypeScript have no
138
+ `async_function_declaration` kind (the `async` keyword is a token inside
139
+ `function_declaration`; assert it with `pattern: 'async function $F($$$) { $$$ }'`
140
+ when async matters), and an unknown `kind` fails the whole rule with
141
+ `Kind ... is invalid` (exit 8); answer that error with the tree dump in
142
+ Step 4, never with another guessed name.
143
+
87
144
  Full syntax (atomic, relational, composite rules, metavariables, `constraints`,
88
145
  `utils`): read `references/rule_reference.md` when the rule needs more than
89
146
  the three forms above.
@@ -91,46 +148,57 @@ the three forms above.
91
148
  ## Step 4 — Test against the example
92
149
 
93
150
  ```bash
94
- ast-grep scan --rule /tmp/astgrep-rule.yml /tmp/astgrep-example.js
151
+ ast-grep scan --rule .clio-coder/scratch/ast-grep/rule.yml .clio-coder/scratch/ast-grep
95
152
  ```
96
153
 
97
- Prefer a rule file over `--inline-rules`: inline YAML in shell needs `$VAR`
98
- escaped as `\$VAR` (or single quotes), and quoting errors look exactly like
99
- non-matches.
100
-
101
154
  The rule must match the positive example and miss the negative one before
102
- you scan anything real. When it does not, debug in this order:
155
+ you scan anything real. When it passes, go to Step 5. When it does not,
156
+ debug in this order, changing the rule file with `edit`:
103
157
 
104
158
  1. Strip the rule to its simplest positive key; re-add parts one at a time.
105
159
  2. Confirm every `has`/`inside` has `stopBy: end`.
106
- 3. Dump the tree to check node kinds never guess a `kind` name:
160
+ 3. Dump the tree to check node kinds; never guess a `kind` name:
107
161
 
108
162
  ```bash
109
- ast-grep run --pattern '<target code>' --lang javascript --debug-query=cst
163
+ ast-grep run --pattern 'async function f() { await g(); }' --lang javascript --debug-query=cst
110
164
  ```
111
165
 
112
166
  (`cst` = every node; `ast` = named nodes only; `pattern` = how ast-grep
113
- parsed your pattern.)
167
+ parsed your pattern.) Pipe long dumps through `head -80`. Dump the tree
168
+ only after a test has failed; a dump before the first test is a wasted
169
+ turn.
114
170
 
115
171
  ## Step 5 — Scan the codebase
116
172
 
117
173
  Simple one-node patterns skip the rule file:
118
174
 
119
175
  ```bash
120
- ast-grep run --pattern 'console.log($ARG)' --lang javascript .
176
+ ast-grep run --pattern 'console.log($ARG)' --lang javascript src
121
177
  ```
122
178
 
123
179
  Rule-based scans:
124
180
 
125
181
  ```bash
126
- ast-grep scan --rule /tmp/astgrep-rule.yml <path>
182
+ ast-grep scan --rule .clio-coder/scratch/ast-grep/rule.yml src
127
183
  ```
128
184
 
129
- Add `--json` when the output feeds further processing. Report matches as
130
- `path:line` with a one-line reading of each; do not paste raw JSON at the
131
- user. Done when the reported matches answer the Step 1 question and false
132
- positives you noticed are either excluded by the rule or called out. Delete
133
- the scratch files.
185
+ Scan the requested path, not `.`, so your own fixture under
186
+ `.clio-coder/scratch` does not show up as a match; if it does, drop those
187
+ lines from the report. Add `--json` only when the output feeds further
188
+ processing.
189
+
190
+ Report matches as `path:line` with a one-line reading of each; do not paste
191
+ raw JSON at the user. Done when the reported matches answer the Step 1
192
+ question and false positives you noticed are either excluded by the rule or
193
+ called out. Delete the scratch files last, naming each file. `rm -r` and
194
+ `rm -f` are hard-blocked by the safety net, so:
195
+
196
+ ```bash
197
+ rm .clio-coder/scratch/ast-grep/positive.js .clio-coder/scratch/ast-grep/negative.js .clio-coder/scratch/ast-grep/rule.yml
198
+ ```
199
+ ```bash
200
+ rmdir .clio-coder/scratch/ast-grep
201
+ ```
134
202
 
135
203
  ## Red flags
136
204
 
@@ -138,5 +206,8 @@ the scratch files.
138
206
  - A `has`/`inside` without `stopBy: end`.
139
207
  - A guessed `kind` name instead of a `--debug-query=cst` dump.
140
208
  - Any rewrite flag: this skill only reads.
141
- - Falling back to grep halfway because rule debugging felt slow — fix the
142
- rule with Step 4; that is the job.
209
+ - Treating shadow-utils `sg` as ast-grep because `command -v sg` succeeded.
210
+ - Cleaning up with `rm -rf`, or writing fixtures under `/tmp`; both are
211
+ refused in a headless run.
212
+ - Falling back to grep halfway because rule debugging felt slow; fix the
213
+ rule with Step 4, that is the job.
@@ -54,3 +54,29 @@ concurrency rule, admission and profile entries, and prompt-prefix cost paid by
54
54
  every run whether or not anyone searches structurally. That is a tool-surface
55
55
  decision, not skill-catalog cleanup. Until then the skill stays
56
56
  `scenarios-recorded` and its first step is the binary check it already has.
57
+
58
+ ## Battletest record (2026-09-03)
59
+
60
+ S1 fixture plus `src/orders.js` (one matching `loadOrders`, one non-awaiting
61
+ `noAwait`), `ornith1.5-35b-moe` on mini (llamacpp), `clio-coder run
62
+ --autonomy full-auto --json`, headless, `@ast-grep/cli` 0.45.3 on PATH.
63
+ Ground truth: `src/users.js:1` and `src/orders.js:1` match; `safe.js`,
64
+ `plain.js`, `noAwait` do not.
65
+
66
+ | run | wall | turns | in / out tokens | outcome |
67
+ |---|---|---|---|---|
68
+ | baseline (no skill) | 565s | 37 | 16.2k / 33.0k | never produced a valid rule (`$($params)` syntax, relational rules without `stopBy: end`, `--inline-rules` quoting); 3 `$(...)` calls; answered by reading the source; scratch left in `.astscratch/` |
69
+ | v0.2.0 | 123s | 13 | 7.9k / 7.1k | correct 2/5 via a proven rule; wrote fixtures to `/tmp` first, then into the workspace; `rm -rf` and `find -delete` hard-blocked, scratch left behind |
70
+ | v0.3.0 first cut | 176s | 13 | 9.8k / 10.5k | correct; dumped the tree before writing any rule; a `/tmp` write via shell redirection refused; `rm -rf` hard-blocked |
71
+ | v0.3.0 | 190s | 24 | 9.5k / 10.9k | correct; zero safety blocks; scratch removed with per-file `rm` + `rmdir`; working tree clean. Spent 10 turns recovering from a guessed `async_function_declaration` kind |
72
+
73
+ Changes in v0.3.0: `## Arguments` contract; Step 0 verifies `sg --version`
74
+ prints `ast-grep` because `/usr/bin/sg` is shadow-utils on Linux; scratch
75
+ lives in `.clio-coder/scratch/ast-grep/` (a `/tmp` write needs an approval
76
+ a headless run cannot give); rules always go through a file; tree dumps
77
+ only after a failed test; cleanup by named `rm` + `rmdir` because
78
+ `rm -r`/`rm -f` match the `rm-recursive-or-force` damage-control block;
79
+ `edit` added for rule iteration. The example rule was re-verified verbatim
80
+ against 0.45.3 (matches exactly the two expected functions) and the skill
81
+ now says so, plus that an unknown `kind` fails with exit 8 rather than
82
+ matching nothing.
@@ -7,18 +7,15 @@ triggers:
7
7
  - parse don't validate
8
8
  - illegal states unrepresentable
9
9
  - functional core imperative shell
10
- version: 0.2.0
10
+ version: 0.3.0
11
11
  license: Apache-2.0
12
- allowed-tools:
13
- - read
14
- - grep
15
12
  clio-coder:
16
13
  registry-id: iowarp/clio-coder
17
14
  source-url: https://github.com/iowarp/clio-coder/tree/main/skills/coding/coding-standards
18
15
  audit: pass
19
16
  provenance: adapted
20
17
  origin: https://github.com/dmmulroy/skills/tree/main/coding-standards
21
- eval-status: smoke-checked
18
+ eval-status: scenarios-recorded
22
19
  model-size: any
23
20
  provisional: true
24
21
  agents:
@@ -36,6 +33,44 @@ code, and never rewrite unrelated old code without an explicit migration
36
33
  request. **The host project's own documented standards always win over
37
34
  this file.**
38
35
 
36
+ This skill declares no tool surface on purpose: it rides along with
37
+ whatever task is in flight (writing, refactoring, reviewing), so it must
38
+ not narrow the tools that task needs.
39
+
40
+ ## Arguments
41
+
42
+ ```text
43
+ /skill coding-standards [<task>]
44
+ ```
45
+
46
+ - With a task: do the task, and hold every new or changed TypeScript line
47
+ to the rules below. Keep using the ordinary `write`, `edit`, and `bash`
48
+ tools; the standards change what you write, not how you write it.
49
+ - Without a task: answer as a reference. Quote the relevant rule and show
50
+ a before/after snippet; do not touch the repository.
51
+
52
+ ## How to apply
53
+
54
+ 1. Read the host project's instruction file and one or two existing
55
+ modules near the change. If the project pins its own conventions on
56
+ errors, validation, or module layout, those win; note the conflict in
57
+ one line and follow the host.
58
+ 2. Before writing, state in your reply which rules the change touches (for
59
+ a parser: errors, parse-don't-validate, illegal states; for a service:
60
+ modules). This is the checklist for the code you are about to write.
61
+ 3. Write the code. Then run the project's typecheck (`npx tsc --noEmit` or
62
+ the repo script) with one plain `bash` call; never use `$(...)` or
63
+ backticks in the command.
64
+ 4. If you want runtime evidence beyond the typecheck, prefer a single
65
+ `node -e` (or the project's runtime) call. If you must write a smoke
66
+ script, put it under `.clio-coder/scratch/` and remove it with plain
67
+ `rm <file>`; `rm -f`, `rm -r`, `find -delete`, and moving files to
68
+ `/tmp` are all refused by the safety net in a headless run, and every
69
+ refused attempt is a wasted turn.
70
+ 5. Finish with a short audit of the diff against the checklist: each rule
71
+ either satisfied, or deliberately not, with the reason. `git status`
72
+ must show only the files the task asked for.
73
+
39
74
  ## Errors
40
75
 
41
76
  - Expected failures are values in the return type, as custom tagged
@@ -32,3 +32,26 @@ Expected:
32
32
 
33
33
  One representative scenario via `clio-coder skills eval` against Nemo-3.5-Lightning
34
34
  (30B local, llamacpp on mini), full-auto sandbox. PASS (smoke). Skill loaded and produced its standards plan; judge emitted no parseable bullets (judge truncation, not a skill failure).
35
+
36
+ ## Battletest record (2026-09-03)
37
+
38
+ S1 fixture: strict `tsconfig.json` (`strict`, `noUncheckedIndexedAccess`,
39
+ `exactOptionalPropertyTypes`), empty `src/`, `typescript` on PATH. Task:
40
+ add `src/webhook.ts` (parse unknown payload to a domain value, in-memory
41
+ store, report invalid payloads to the caller), then run `npx tsc --noEmit`.
42
+ `ornith1.5-35b-moe` on mini (llamacpp), `clio-coder run --autonomy
43
+ full-auto --json`, headless.
44
+
45
+ | run | wall | turns | in / out tokens | outcome |
46
+ |---|---|---|---|---|
47
+ | baseline (no skill) | 163s | 13 | 4.1k / 9.8k | typechecks; `{ok: boolean}` result with string errors; 5 `as` casts after manual checks |
48
+ | v0.2.0 | 693s | 7 | 4.6k / 42.6k | **no file written.** `allowed-tools: [read, grep]` narrowed the surface so `write` and `dispatch` were blocked (`skill_surface`); the model ended with a design-only report |
49
+ | v0.3.0 | 304s | 14 | 19.4k / 18.0k | typechecks; `_tag` discriminated `Result` and per-field tagged parse errors; 0 throws, 0 `any`, 0 `!`, 0 casts. Lost 5 turns cleaning a smoke script (`rm -f`, `find -delete`, `mv` to `/tmp` all refused) |
50
+
51
+ Root cause of the v0.2.0 failure: `src/core/skill-activation.ts` enforces
52
+ `allowed-tools` as a hard admission block, so a reference skill that names
53
+ only read tools makes the coding task impossible whenever it is the only
54
+ loaded skill. v0.3.0 declares no tool surface (same pattern as the meta
55
+ reference skills), adds an `## Arguments` contract, a four-line apply
56
+ checklist, and a scratch/cleanup rule (`.clio-coder/scratch/`, plain `rm`)
57
+ so the safety net stops eating turns.
@@ -7,7 +7,7 @@ triggers:
7
7
  - prototype this state model
8
8
  - sanity-check this logic
9
9
  - what should this UI look like
10
- version: 0.3.0
10
+ version: 0.4.0
11
11
  license: Apache-2.0
12
12
  allowed-tools:
13
13
  - read
@@ -17,15 +17,14 @@ allowed-tools:
17
17
  - git
18
18
  - bash
19
19
  - write
20
- - ask_user
21
- - artifact
20
+ - edit
22
21
  clio-coder:
23
22
  registry-id: iowarp/clio-coder
24
23
  source-url: https://github.com/iowarp/clio-coder/tree/main/skills/coding/prototype
25
24
  audit: pass
26
25
  provenance: adapted
27
26
  origin: https://github.com/mattpocock/skills/tree/main/skills/engineering/prototype
28
- eval-status: smoke-checked
27
+ eval-status: scenarios-recorded
29
28
  model-size: any
30
29
  agents:
31
30
  - main
@@ -36,57 +35,117 @@ clio-coder:
36
35
  A prototype is throwaway code that answers a question. Name the question
37
36
  first; the question decides the shape.
38
37
 
38
+ ## Arguments
39
+
40
+ ```text
41
+ /skill prototype [--branch logic|ui] [--subject <path>] <question>
42
+ ```
43
+
44
+ - `--branch`: force the branch from Step 1. Omit to infer it.
45
+ - `--subject`: the file or module the prototype is about. Omit to find it
46
+ from the question text.
47
+ - Everything else is the question the prototype must answer. If no
48
+ question is stated, write the one you infer as the first line of your
49
+ reply and proceed; do not stop to ask when running headlessly.
50
+
51
+ Examples:
52
+
53
+ - `/skill prototype sanity-check whether the retry state machine in retry.js feels right`
54
+ - `/skill prototype --branch ui what should the dashboard header look like`
55
+
56
+ The three steps below are the plan; do not open a task list for them.
57
+
39
58
  ## Step 1 — Pick the branch
40
59
 
41
- From the user's prompt, the surrounding code, or by asking:
60
+ From the question, the surrounding code, or the `--branch` flag:
42
61
 
43
62
  - **"Does this logic / state model feel right?"** → read
44
- `references/LOGIC.md`. Build a single shareable HTML file free-play
45
- controls plus guided walkthroughs that pushes the state machine through
46
- the cases that are hard to reason about on paper, drivable by a
63
+ `references/LOGIC.md`. Build a single self-contained HTML file: free-play
64
+ controls plus guided walkthroughs that push the state model through the
65
+ cases that are hard to reason about on paper, drivable by a
47
66
  non-developer.
48
67
  - **"What should this look like?"** → read `references/UI.md`. Generate
49
68
  several radically different UI variations on one route, switchable via a
50
69
  URL parameter.
51
70
 
52
71
  The branches produce very different artifacts; getting this wrong wastes
53
- the prototype. Ambiguous and the user unreachable → default by neighborhood
54
- (backend module → logic; page or component → UI) and state the assumption
55
- at the top of the prototype.
72
+ the prototype. Ambiguous → default by neighborhood (backend module →
73
+ logic; page or component → UI) and state the assumption at the top of the
74
+ prototype and in your reply.
75
+
76
+ Read the subject code once, then write down in your reply, before any
77
+ code: the question, the branch, and the three to five cases the prototype
78
+ must exercise. That list is the acceptance bar for Step 2.
56
79
 
57
80
  ## Step 2 — Build under the prototype rules
58
81
 
59
- 1. **Throwaway from day one, marked as such.** Place it near the code it
60
- prototypes for, named so a casual reader sees it is not production.
61
- Follow the project's existing routing/layout conventions; invent no new
62
- top-level structure.
63
- 2. **Trivial to run.** One command in the project's own task runner, or one
64
- double-clickable HTML file. No setup thinking required.
82
+ 1. **Throwaway from day one, marked as such.** Place it next to the code
83
+ it prototypes for, named so a casual reader sees it is not production
84
+ (`<subject>-prototype.html`, `prototype-<slug>/`). Follow the project's
85
+ existing routing/layout conventions; invent no new top-level structure.
86
+ 2. **Trivial to run.** One command in the project's own task runner, or
87
+ one double-clickable HTML file. No setup thinking required.
65
88
  3. **No persistence.** State lives in memory. If the question is itself
66
89
  about a database, use a scratch DB or file named "PROTOTYPE — wipe me".
67
90
  4. **Skip the polish.** No tests, no error handling beyond runnable, no
68
91
  abstractions. Speed of learning is the only quality bar.
69
92
  5. **Surface the state.** After every action (logic) or variant switch
70
93
  (UI), print or render the full relevant state so the change is visible.
94
+ 6. **Write once, then edit.** Write the file once. Subsequent changes go
95
+ through `edit`; never rewrite the whole file to change a few lines.
96
+ 7. **Exercise it headlessly.** For a logic prototype, drive the real
97
+ module through the Step 1 cases with one `node -e` (or the project's
98
+ runtime) call and read the output. That transcript is the evidence
99
+ for the verdict; a verdict from reading code alone is a guess.
100
+
101
+ Shell rules: run one command per `bash` call, plain and direct. Never use
102
+ `$(...)` or backticks; they trigger an approval gate that ends a headless
103
+ run.
71
104
 
72
105
  ## Step 3 — Capture and discard
73
106
 
74
- When the question is answered:
107
+ Do these in order. Do not stop after building; a prototype without a
108
+ recorded verdict answered nothing.
109
+
110
+ 1. **Decide.** Write the verdict in one sentence, then the evidence: which
111
+ Step 1 cases behaved as expected, which did not, and what the model is
112
+ missing.
113
+ 2. **Park the code on a throwaway branch.** Run these as separate `bash`
114
+ calls, substituting a short slug:
115
+
116
+ ```bash
117
+ git checkout -b prototype/<slug>
118
+ ```
119
+ ```bash
120
+ git add <prototype files>
121
+ ```
122
+ ```bash
123
+ git commit -m "prototype: <question> (throwaway, verdict in message)"
124
+ ```
125
+ ```bash
126
+ git checkout -
127
+ ```
75
128
 
76
- 1. Fold the validated decision into the real code or the relevant plan.
77
- 2. Commit the prototype to a throwaway branch off the main line, and leave
78
- a pointer to that branch wherever the work is tracked (issue, plan,
79
- handoff).
80
- 3. Record the verdict and the question it settled in the same place.
81
- 4. The main branch keeps only the validated decision never the prototype.
129
+ Returning to the original branch removes the committed prototype from
130
+ the working tree, which is the point: the main line keeps only the
131
+ validated decision, never the prototype. If the directory is not a git
132
+ repository, leave the file in place and say so.
133
+ 3. **Report.** Your final reply is the record. It names, in this order:
134
+ the question, the verdict, the evidence, the recommended change to the
135
+ real code (or "none"), and the branch pointer `prototype/<slug>`. When
136
+ the work is tracked elsewhere (issue, plan, handoff), the user copies
137
+ this block there; you do not need a separate report file, and you must
138
+ not end the run with the `artifact` tool.
82
139
 
83
- Done when the verdict is recorded, the pointer exists, and no prototype
84
- code remains on the working branch.
140
+ Done when the verdict is in the reply, the pointer exists, and
141
+ `git status` on the working branch shows no prototype files.
85
142
 
86
143
  ## Red flags
87
144
 
88
- - A prototype quietly growing tests, error handling, or abstractions it
145
+ - A prototype quietly growing tests, error handling, or abstractions: it
89
146
  is becoming production without a decision.
90
147
  - Persistence added "just to make it work".
91
- - The prototype merged to the main line.
148
+ - The prototype merged to the main line, or left untracked on it.
92
149
  - Code built before the question was stated.
150
+ - A verdict written without running the cases.
151
+ - Ending the run by writing a report artifact instead of finishing Step 3.
@@ -40,3 +40,22 @@ Expected:
40
40
 
41
41
  One representative scenario via `clio-coder skills eval` against Nemo-3.5-Lightning
42
42
  (30B local, llamacpp on mini), full-auto sandbox. PASS. Verdict captured via terminal artifact; code discarded.
43
+
44
+ ## Battletest record (2026-09-03)
45
+
46
+ S1 fixture, `ornith1.5-35b-moe` on mini (llamacpp), `clio-coder run --autonomy full-auto --json`, headless.
47
+
48
+ | run | wall | turns | in / out tokens | outcome |
49
+ |---|---|---|---|---|
50
+ | baseline (no skill) | 207s | 17 | 6.1k / 11.6k | HTML built, verdict written via terminal `artifact`; 7 `tasks` calls; prototype left untracked on main |
51
+ | v0.3.0 | 220s | 10 | 12.3k / 15.8k | logic branch chosen, LOGIC.md read; `edit` blocked by allowed-tools so the 12.5k-char file was rewritten whole; `artifact` ended the run before Step 3; nothing committed |
52
+ | v0.4.0 | 178s | 13 | 6.7k / 10.8k | cases enumerated first; module driven headlessly via `node -e`; branch `prototype/retry-state-machine` created, prototype committed there, `main` clean; reply carries question, verdict, evidence, recommended change, pointer |
53
+
54
+ Changes in v0.4.0 that closed the gaps: dropped `artifact` (terminal tool,
55
+ `terminate: true`, ends the run before capture-and-discard), added `edit`,
56
+ added an `## Arguments` contract with a headless fallback, made Step 3 an
57
+ explicit sequence of single-command `bash` calls, banned `$(...)` (net ask
58
+ rail even under full-auto), and made the final reply the verdict record.
59
+ Remaining blocked calls in v0.4.0: one `tasks` plan and one read-only
60
+ `git` status; `git` restored to allowed-tools and a one-line "the steps are
61
+ the plan" note added afterwards.