@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
  - build the backlog
8
8
  - decompose this plan into tickets
9
9
  - create GitHub issues from this architecture
10
- version: 0.3.0
10
+ version: 0.4.0
11
11
  license: Apache-2.0
12
12
  allowed-tools:
13
13
  - read
14
14
  - grep
15
15
  - ls
16
+ - git
16
17
  - bash
17
18
  - tasks
18
19
  - ask_user
@@ -33,12 +34,93 @@ clio-coder:
33
34
  Turn a finished planning doc into small, engineer-ready tickets on a real
34
35
  tracker. Decomposition is tracker-agnostic; creation branches on the target.
35
36
 
37
+ ## Arguments
38
+
39
+ ```text
40
+ /skill backlog <path to the finished PRD or planning doc>
41
+ ```
42
+
43
+ - Required: the doc path. Named inline, or clearly the file just discussed
44
+ in context — never a doc invented from memory. If no path can be found or
45
+ inferred, say so at Step 1 and stop; do not decompose without a doc.
46
+ - Optional, inferred rather than asked for by default: target platform
47
+ (Step 1's own rule picks it — see below) and a milestone/epic to attach
48
+ tickets to.
49
+
50
+ There is no operator in a headless run: `ask_user` resolves immediately
51
+ with no answer, every time it is called — not a stall, and calling it again
52
+ will not produce a different result. **This skill treats headless
53
+ degradation differently at each step below, because Step 3 gates an
54
+ outward, not-cleanly-reversible action — real tickets, GitHub issues or
55
+ persisted local tasks — not a document write:**
56
+
57
+ - **Step 1 (platform).** The default rule (`gh` when a remote and the `gh`
58
+ binary are both present; the `tasks` fallback otherwise) is a fact to
59
+ detect, not a judgment call, and runs the same whether or not anyone is
60
+ watching — no confirmation needed either way. It is genuinely ambiguous
61
+ only when the user names a platform with no available integration; if
62
+ that `ask_user` call goes unanswered, do not guess a fallback and do not
63
+ silently substitute `gh` or `tasks` for the platform actually requested —
64
+ state plainly that the named platform is unavailable and confirmation of
65
+ what to use instead was not obtainable, then stop exactly as Step 3 does.
66
+ - **Step 2 (decompose).** Always run to completion, headless or not.
67
+ Decomposition itself creates nothing yet, and every source-doc gap still
68
+ needs surfacing whether or not a human is present to read it.
69
+ - **Step 3 (confirm before creating).** An unanswered `ask_user` here is
70
+ never a yes, and this gate does not get the assumed-confirm-and-proceed
71
+ treatment the other planning skills use for their document gates. Finish
72
+ Step 2, print the full proposed ticket list and target platform exactly
73
+ as Step 3 already requires, then stop: say explicitly that confirmation
74
+ is required before any ticket is created, that it was not obtainable in
75
+ this run, and that Step 4 did not execute. This is the one gate in the
76
+ planning category's headless story that ends in a stop rather than an
77
+ assumed yes — filing unrequested public GitHub issues, or persisting
78
+ local tickets nobody confirmed, on a guess is worse than an incomplete
79
+ run; the full decomposed list is still delivered as the answer.
80
+
81
+ The steps below are the plan; hold it in your head, not in a tool — do not
82
+ call `tasks` with `plan`/`add`/`done`/`block`/`drop` to track your own
83
+ progress through Steps 1–5 as if they were a workflow board. What actually
84
+ matters when Step 3 stops without confirmation: the board must end this
85
+ run holding zero net-open items. `tasks` calls here are Step 4's — one
86
+ entry per ticket *already confirmed at Step 3* — and Step 4 never runs
87
+ before that yes. If you do reach for `tasks` before confirmation (to
88
+ stage the proposal, or to check the board is clean), any item you opened
89
+ with `plan`/`add` must be `drop`ped again before you finish, in the same
90
+ run — an item left open on the board is exactly "created without
91
+ confirmation," whether or not you called it that. A read-only
92
+ `tasks(action="list")` changes nothing and is always fine. Do not re-invoke
93
+ `context(scope="skills")` once the skill is already loaded this turn — it
94
+ is refused as a redundant call and wastes a turn; if you need to recheck
95
+ what you already read, use `read`/`grep` on the files themselves.
96
+
97
+ Shell rules for every `bash` call: one command per call, plain and direct.
98
+ Never use `$(...)` or backticks; they trigger an approval gate a headless
99
+ run cannot answer, and the call is refused outright. Never redirect output
100
+ to `/tmp` (`> /tmp/...`) to stage or capture something for a later step —
101
+ that write needs an approval a headless run cannot give either, and the
102
+ call is refused the same way; just run the command and read its output
103
+ directly, nothing needs staging on disk first. The `git` tool only covers
104
+ `status`/`diff`/`log`; it has no `remote` op, so Step 1's remote and
105
+ `gh`-availability check still goes through `bash` (e.g. `git remote -v`,
106
+ `command -v gh`) — use `git` for a plain status check, `bash` for
107
+ everything else this skill needs from git or `gh`.
108
+
36
109
  ## Step 1 — Inputs
37
110
 
38
- Required: the path to the PRD or planning doc. Target platform: GitHub
39
- issues via `gh` by default; another tracker only when the user names it and
40
- an integration for it is available. Platform genuinely ambiguous ask,
41
- never guess. Optional: a milestone or epic to attach tickets to.
111
+ Required: the path to the PRD or planning doc (see Arguments). Target
112
+ platform: GitHub issues via `gh` when a git remote exists and the `gh`
113
+ binary is present check both in one `bash` call (`git remote -v;
114
+ command -v gh`) and trust the result; empty output from `git remote -v` is
115
+ a definitive "no remote", not an inconclusive check that needs a second or
116
+ third method (`git config`, reading `.git/config` directly — the latter is
117
+ a hard-blocked path regardless of this skill). Fall back to local tracking
118
+ automatically (see Step 4) when there is no remote, `gh` is unavailable, or
119
+ the user asked for local tracking, and say which was detected and why. A
120
+ platform the user names with no integration available is genuinely
121
+ ambiguous → ask, never guess, and never silently substitute a different
122
+ platform than the one requested (see Arguments for the headless case).
123
+ Optional: a milestone or epic to attach tickets to.
42
124
 
43
125
  ## Step 2 — Decompose
44
126
 
@@ -55,17 +137,23 @@ each user story becomes one or more tickets. Per ticket, draft:
55
137
  Sizing rules: a ticket is at most about a day of work; a ticket that needs
56
138
  more than one screen to describe is two tickets. A phase too vague to
57
139
  decompose is a gap in the source doc — stop and flag it rather than
58
- inventing tickets.
140
+ inventing tickets. Flag it by name (which phase, what is missing) in the
141
+ Step 3 list and again in the Step 5 report; do not paper over it with a
142
+ plausible-sounding ticket the source doc never actually specified.
59
143
 
60
144
  ## Step 3 — Confirm before creating
61
145
 
62
- Print the full proposed list (titles grouped by phase) and the target
63
- platform, and get explicit confirmation via `ask_user`. Ticket creation is
64
- outward-facing and not one-click reversible; nothing is created before the
65
- yes.
146
+ Print the full proposed list, grouped by phase — title *and* acceptance
147
+ criteria per ticket, not titles alone, plus any flagged gaps from Step 2 —
148
+ and the target platform, and get explicit confirmation via `ask_user`.
149
+ Ticket creation is outward-facing and not one-click reversible; nothing is
150
+ created before the yes. When that confirmation cannot be obtained (see
151
+ Arguments), stop here — do not proceed to Step 4.
66
152
 
67
153
  ## Step 4 — Create
68
154
 
155
+ Runs only after Step 3's explicit yes.
156
+
69
157
  GitHub:
70
158
 
71
159
  ```bash
@@ -82,15 +170,43 @@ or the user asks for local tracking, create each confirmed ticket with the
82
170
  `tasks` tool instead (one task per ticket, acceptance criteria in the
83
171
  description) and capture the task ids. Say which target was used and why.
84
172
 
173
+ Every report in this skill — confirmed-and-created or stopped-before-
174
+ confirmation — is delivered as a chat message, never a file. Do not call
175
+ `write` to save the proposal or the report to disk as a backlog/proposal
176
+ markdown file; `write` is not in this skill's tool surface and the call is
177
+ refused. If the user wants the backlog persisted as a document, that is a
178
+ different, file-producing skill (`prd`, `architecture`), not this one.
179
+
85
180
  ## Step 5 — Report
86
181
 
87
- A table: title → phase → issue number/URL, plus the source doc path and any
88
- failures. Done when every proposed ticket is either created with its URL
89
- captured or listed as failed with the error.
182
+ Confirmed-and-created run: a table of title → phase → issue number/URL,
183
+ plus the source doc path and any failures. Done when every proposed ticket
184
+ is either created with its URL captured or listed as failed with the
185
+ error.
186
+
187
+ Stopped-before-confirmation run (see Arguments): one self-contained final
188
+ message — never split across turns and never "see above" — that repeats
189
+ the full proposed ticket list with title *and* acceptance criteria per
190
+ ticket (a status column of "proposed" is not a substitute for the
191
+ criteria themselves), plus one explicit line stating that confirmation was
192
+ required and unavailable and no ticket was created. A reader who sees only
193
+ this last message must get the complete list and the complete status;
194
+ never let the table alone imply creation happened, and never make the
195
+ stop notice depend on an earlier turn still being visible.
90
196
 
91
197
  ## Red flags
92
198
 
93
- - Tickets created before the Step 3 confirmation.
199
+ - Tickets created before the Step 3 confirmation — including a headless
200
+ run that treats an unanswered `ask_user` there as a yes and proceeds to
201
+ Step 4 anyway; that gate stops, it does not assume.
202
+ - A final report whose ticket table doesn't say, in words, whether creation
203
+ happened or confirmation was unavailable.
94
204
  - Acceptance criteria that restate the title.
95
205
  - A mega-ticket hiding a week of work.
96
206
  - Tickets with no trace back to a phase or story in the source doc.
207
+ - A vague phase decomposed into invented tickets instead of flagged as a
208
+ source-doc gap.
209
+ - Any item left net-open on the `tasks` board when a run stops without
210
+ Step 3 confirmation; `tasks` here is Step 4's confirmed-ticket store, and
211
+ anything opened before that as a scratchpad must be dropped again in the
212
+ same run.
@@ -41,3 +41,145 @@ Expected:
41
41
 
42
42
  One representative scenario via `clio-coder skills eval` against Nemo-3.5-Lightning
43
43
  (30B local, llamacpp on mini), full-auto sandbox. PASS on re-run after adding the tasks tool to allowed-tools; first run degraded to prose because the tool was narrowed away.
44
+
45
+ ## Battletest record (2026-09-03)
46
+
47
+ Fixture: `/home/akougkas/eval-temp/harness/test_backlog.py`, continuing the
48
+ planning category's shared HPC log-triage domain from `product-intent`/
49
+ `prd`/`tech-spec`/`architecture`. Self-contained: seeds a plausible
50
+ architecture-doc-shaped source (`docs/hpc-log-triage-architecture.md`) with
51
+ three phases — Phase 1 (signature coverage, concrete) and Phase 3 (top-3
52
+ ranking + CLI, concrete) plus an intentionally vague Phase 2 ("improve
53
+ triage performance", no metric/baseline/target) to exercise S2 — and the
54
+ same partial `src/scanner.py` (`FailureEvent` + OOM-only `scan_oom`) used
55
+ by the sibling fixtures. The repo is `git init`ed with **no remote**; the
56
+ real `gh` binary (installed and authenticated on this host) fails against
57
+ it deterministically with `no git remotes found`, exit 1, no network call —
58
+ this exercises the gh-unavailable/local-`tasks`-fallback path (S3-adjacent)
59
+ without any mocking or risk of filing a real issue anywhere. `ask_user` in
60
+ this harness auto-cancels immediately in a headless run (confirmed by
61
+ `prd`/`product-intent`/`architecture`), which makes Step 3's "confirm
62
+ before creating" gate a genuine test: **the central design call for this
63
+ skill, unlike its four planning siblings, is that Step 3 does NOT get the
64
+ assumed-confirm-and-proceed treatment.** A doc write (prd/architecture/
65
+ tech-spec's output) is idempotent and reversible; a created GitHub issue or
66
+ a persisted local ticket is an outward-facing action nobody asked for if
67
+ guessed wrong. So the hardened skill fully decomposes (Step 2 always runs),
68
+ prints the complete proposed list, and **stops** when confirmation is
69
+ unavailable, naming clearly that it stopped. Graded 10 checks against the
70
+ reconstructed final assistant text and the raw JSONL's tool-call/safety-
71
+ block stream: zero safety blocks; the central invariant — no ticket left
72
+ net-open on the `tasks` board and no `gh issue create` attempted before
73
+ confirmation; Phase 1 and Phase 3 traced with `phase-N` labels; Phase 2
74
+ flagged as a source-doc gap, not invented; acceptance criteria present and
75
+ non-vague; the final message is self-contained (lists every proposed
76
+ ticket, not "see above"). Ran on `dynamo`/`ornith-1.5-35b-a3b` only this
77
+ pass (concurrent-sibling speed tradeoff, see Still weak below — no
78
+ secondary-model confirm).
79
+
80
+ | run | wall | turns | in / out tokens | safety blocks | score | outcome |
81
+ |---|---|---|---|---|---|---|
82
+ | baseline (no skill) | 71s | 15 | 89.1k / 2.2k | 1 (benign ENOENT) | 2/10 | never invoked `/skill backlog`; investigated well and correctly created **zero tickets**, but used `tasks` as its own ad hoc plan/block board (left 2 items net-open), never stated a phase-2 gap, and its final reply didn't list acceptance criteria |
83
+ | v1 (frozen 0.3.0) | 38s | 5 | 52.8k / 6.4k | 1 real (`$(...)` in one `bash` call, the old skill had no shell-rules paragraph) | 9/10 | correctly detected no-remote → `tasks` fallback, decomposed phase 1/3, flagged phase 2 as a gap, and **stopped with zero tickets created** on its own initiative — the frozen skill's existing Step 3 prose already held on this model; the one gap was the missing shell-rules line |
84
+ | v2 (first hardened cut, 0.4.0) | 81s | 14 | 245.5k / 12.2k | 3 real (`git` tool refused — not yet in allowed-tools; a benign `ls` ENOENT; a redundant `context` re-call refused) | 6/10 (grading also over-counted a `tasks plan`+`drop` self-cleanup as "created" — later fixed, see below) | regression: added `git` to Step 0 exploration reflexively before it was in `allowed-tools`; opened a `tasks` plan to track its own steps then dropped it; final reply split across turns so the last message alone didn't restate the full list |
85
+ | v3 | 54s | 7 | 84.6k / 8.1k | 2 real (`$(...)` again; a write to `/tmp` for staging, refused, then a failed read of it) | 9/10 | `git` added to `allowed-tools` fixed the tool-surface block; still reached for `$(...)` once and staged output via `> /tmp/...` once — both new Red-flag/shell-rules gaps closed after this run |
86
+ | v4 (0.4.0, stable) | 55s | 7 | 93.4k / 8.4k | 0 | **10/10** | first clean run: no `git`/`bash`/`/tmp` block, zero `tasks` calls, full decomposition, phase 2 flagged, self-contained stop message |
87
+ | v6 | 77s | 6 | 90.7k / 13.9k | 1 real (`write` refused — model tried to save the proposal as a file) | 9/10 | added an explicit "report is a chat message, never a file" line after this run |
88
+ | v8 | 69s | 14 | 200.3k / 10.9k | 2 real (`$(...)` recurred; a hard-blocked `read .git/config` after an over-long remote-detection loop) | 8/10 | added a one-shot "trust the first `git remote -v` result" line to Step 1 to cut the verification loop that led to the blocked read |
89
+ | v9 | 46s | 6 | 76.9k / 7.2k | 1 (benign `grep`-no-match) | 9/10 | |
90
+ | v10 | 77s | 8 | 76.8k / 2.1k | 0 | **10/10** | used `tasks` as a scratch board (`plan` then `drop` every item) and explicitly verified the board ended clean — correct net-open-zero behavior once grading was fixed to match the skill's real invariant (see Changes) |
91
+ | v11 (final, re-confirm) | 39s | 4 | 47.6k / 6.5k | 0 | **10/10** | |
92
+ | vfinal (post-cleanup re-confirm) | 61s | 6 | 92.5k / 8.9k | 2 real (`tasks(action="plan")` with an empty list, then `tasks(action="ask_user", ...)` — an invalid action, the model's own hallucinated attempt to simulate confirmation through the wrong tool) | 8/10 | still stopped correctly with zero tickets created and a self-contained report; the two safety blocks were harmless self-inflicted tool-signature confusion, not a tool-surface or outcome failure; the acceptance-criteria check missed because this run's tickets used `- [ ]` checklists without the literal words "acceptance criteria" (grading-phrase gap, not missing criteria) |
93
+
94
+ Across all 10 hardened runs (v1–v11), the one property that never once
95
+ failed was the central design call itself: **zero runs created a ticket,
96
+ opened a GitHub issue, or left a `tasks` item net-open without
97
+ confirmation** — every run either produced no `tasks`/`gh` activity at all,
98
+ or staged-then-fully-reversed it. The score dips above are all secondary
99
+ (a bash reflex, a stray `/tmp` write, a redundant tool call, a benign
100
+ nonzero-exit) — real hardening work, but never a breach of the "don't
101
+ create outward-facing tickets on a guess" line the coordinator's design
102
+ call was actually about.
103
+
104
+ **Changes** (0.3.0 -> 0.4.0):
105
+
106
+ 1. **`## Arguments` contract**, the section neither `tech-spec` nor
107
+ `architecture` had before this session either — slash-invocation
108
+ syntax, what's required (the doc path) vs. inferred (platform,
109
+ milestone), and the no-operator/`ask_user`-auto-cancels rule.
110
+ 2. **The central, deliberate divergence from every other planning skill's
111
+ headless pattern**: `product-intent`/`prd`/`tech-spec`/`architecture`
112
+ all treat an unanswered gate as "assume the grounded default, mark
113
+ `assumed — confirm`, keep going" because their output is a document —
114
+ idempotent, reversible, safe to revise. `backlog`'s Step 3 gates ticket
115
+ *creation* — a real `gh issue create` or a persisted local ticket —
116
+ which is not cleanly reversible and not something to guess yes on. The
117
+ Arguments section states this explicitly per-step: Step 1's platform
118
+ default needs no confirmation (it's a detected fact); Step 2 always
119
+ decomposes fully; **Step 3 alone stops** when confirmation can't be
120
+ obtained, delivering the complete proposed list instead of a partial
121
+ run or a guessed yes. This is verified behavior, not aspirational prose
122
+ — see the run table above.
123
+ 3. **`git` added to `allowed-tools`** — the frozen skill lacked it and the
124
+ model instinctively reached for the `git` tool (not `bash git`) to
125
+ check repo state; v2's regression was exactly this block. `git` only
126
+ covers `status`/`diff`/`log` (no `remote` op), so Step 1's remote check
127
+ still documents `bash git remote -v` explicitly.
128
+ 4. **Shell rules paragraph** (one command per `bash` call, never `$(...)`
129
+ or backticks) — the frozen skill had `bash` in `allowed-tools` but no
130
+ shell-rules line at all; this was v1's only real safety block and
131
+ recurred in v3/v8 before enough explicit repetition held.
132
+ 5. **Explicit `/tmp` write refusal** — v3 staged a remote/gh check via
133
+ `> /tmp/platform.txt`, got refused, then failed to read it back; added
134
+ a direct line telling the model to read command output directly
135
+ instead of staging it on disk.
136
+ 6. **`tasks`-misuse guidance, twice-revised**: first cut banned all
137
+ non-`list` `tasks` calls outright, which unfairly penalized a model
138
+ that used `tasks` as an honest plan-then-drop scratchpad and verified
139
+ the board ended clean (v10). Rewritten around the real invariant —
140
+ **zero net-open items on the board when Step 3 stops** — matching what
141
+ Step 4's actual job is (one entry per *confirmed* ticket) rather than
142
+ banning the tool outright.
143
+ 7. **Redundant `context(scope="skills")` re-invocation** flagged as a
144
+ wasted, refused call once the skill is already loaded.
145
+ 8. **"Report is a chat message, never a file"** — a model reached for
146
+ `write` (not in `allowed-tools`) to save the proposal to disk (v6);
147
+ added an explicit line pointing that instinct at `prd`/`architecture`
148
+ instead.
149
+ 9. **Step 5's stopped-before-confirmation report must be one
150
+ self-contained final message** (full ticket list + criteria, not a
151
+ status line referencing an earlier turn) — v2 and v8 both split the
152
+ list into an earlier turn and left only a short recap as the literal
153
+ last message.
154
+ 10. Five new Red flags entries naming the concrete failures observed
155
+ above (headless assumed-yes at Step 3, a report that doesn't say
156
+ created-vs-proposed, `tasks` opened for the step list itself).
157
+
158
+ **Still weak**: per this pass's coordinator note, only
159
+ `ornith-1.5-35b-a3b`/`dynamo` was run — no `qwen3.8-27b` confirmation this
160
+ session (the sibling `prd`/`architecture` runs found fixes tuned on one
161
+ model family did not always fully generalize to the other), so cross-
162
+ model generalization is unverified here too. The `$(...)` shell-rules
163
+ violation recurred twice (v3, v8) despite an explicit paragraph — this
164
+ looks like irreducible instruction-following variance at this model size
165
+ rather than a prompt gap; more repetition had diminishing returns. A
166
+ redundant `context` re-call still happened once in 10 hardened runs (v5,
167
+ not tabled above) — a soft nudge, not a tool-surface block, that cost one
168
+ wasted turn. S3 as originally written ("user names a tracker with no
169
+ integration available") was not exercised as its own standalone scenario
170
+ this pass — the fixture's gh-unavailable path exercises the *adjacent*
171
+ no-remote default-fallback case, not a user naming an explicitly
172
+ unsupported tracker by name; that gate's headless behavior (stop and say
173
+ so, same as Step 3, per the Arguments section) is specified but unrun.
174
+ `vfinal`'s two safety blocks are a distinct, rarer failure mode (~1 of 12
175
+ hardened runs): the model, finding no real `ask_user` tool call available
176
+ to it, hallucinated an `action="ask_user"` on the `tasks` tool instead of
177
+ either calling `ask_user` directly (and reading its cancellation, as every
178
+ other run did) or reasoning from the Arguments section alone — no prose
179
+ fix was attempted for this single occurrence since it never affected the
180
+ outcome (still zero tickets, still a correct self-contained stop), but a
181
+ future pass should watch for it recurring. The acceptance-criteria grading
182
+ check only matches the literal phrase "acceptance criteria"; a run whose
183
+ tickets carry real `- [ ]` checklists without that exact heading (vfinal)
184
+ under-scores on a grading-phrase technicality, not a real quality miss —
185
+ worth loosening the check before trusting the score column in isolation.
@@ -7,7 +7,7 @@ triggers:
7
7
  - define this feature
8
8
  - structure this product brain dump
9
9
  - create milestone prompts
10
- version: 0.3.0
10
+ version: 0.4.0
11
11
  license: Apache-2.0
12
12
  allowed-tools:
13
13
  - read
@@ -37,13 +37,47 @@ milestone prompts. The discipline is the phase gate: each phase produces a
37
37
  small locked artifact that the next phase builds on. No phase reopens without
38
38
  the user saying so. Markdown only, no external templates, repo-aware.
39
39
 
40
+ ## Arguments
41
+
42
+ ```text
43
+ /skill prd <brain dump or idea, in a few sentences>
44
+ ```
45
+
46
+ - The text is the raw brain dump that starts phase 1. An existing intent
47
+ doc, PRD, or evidence file named or pathed in the request is material to
48
+ read first (see "Read the repo before asking" below), not more arguments.
49
+ - Nothing is required beyond some text; a blank invocation gets phase 1's
50
+ own prompt — let the user describe the idea raw — rather than an invented
51
+ idea.
52
+
53
+ There is no operator in a headless run: `ask_user` is either not registered
54
+ or nothing answers it, and stalling a gate to wait for it never resolves.
55
+ When a gate goes unanswered, do not skip the phase and do not go quiet: run
56
+ it as a monologue instead — state the phase's question, your
57
+ recommendation (grounded in the repo and any evidence read, or the most
58
+ defensible product default when nothing grounds it), and the reasoning,
59
+ adopt the recommendation, mark it `assumed — confirm`, and move to the next
60
+ phase. All nine phases still run, end to end, in one turn — the phase list
61
+ below is the plan to execute, not an outline to abbreviate because no one
62
+ answered the first gate. Never invent evidence or a fact to back an
63
+ assumption; anything genuinely unknown stays an open item, marked as such,
64
+ not a plausible guess.
65
+
66
+ The nine phases below are the plan; do not open a task list for them.
67
+ `tasks` sits outside this skill's tool surface and any call to it is
68
+ refused. `bash` is also outside this skill's tool surface — verify what you
69
+ wrote with `grep`, `read`, and `find`, never `bash`.
70
+
40
71
  ## Interview mechanics
41
72
 
42
73
  - Use the `ask_user` tool for every confirmation and choice, with your
43
- recommendation as the first option. Without `ask_user`, ask in plain text,
44
- one focused exchange per phase.
74
+ recommendation as the first option: post the question, stop, wait for the
75
+ answer. See Arguments above for what a gate that goes unanswered means and
76
+ how to carry every phase through anyway.
45
77
  - **Read the repo before asking.** Stack, conventions, existing entities, and
46
- integrations are facts; discover them and *confirm*, never ask cold.
78
+ integrations are facts; discover them and *confirm*, never ask cold. An
79
+ entity or module that already exists gets reused and marked as such, never
80
+ re-specced as new work.
47
81
  - Keep each phase to one or two exchanges. Synthesize, propose, lock, move on.
48
82
 
49
83
  ## The phases (in order, each locks before the next)
@@ -71,7 +105,8 @@ the user saying so. Markdown only, no external templates, repo-aware.
71
105
 
72
106
  - **`PRD.md`** at the repo root: purpose, features, out-of-scope, stack,
73
107
  integrations, data model, per-feature scope, milestone overview. Markdown
74
- only.
108
+ only. Never write it anywhere else or under another name — a nested
109
+ `docs/PRD.md`, a slugged filename, or a report-style name are all wrong.
75
110
  - **`milestones/N-<slug>/prompt.md`** for each milestone: a self-contained
76
111
  prompt that a coding agent can execute cold — context, scope, constraints
77
112
  from the PRD, and done-when criteria. A reader must not need the PRD open
@@ -83,6 +118,11 @@ into a sprint.
83
118
  ## Red flags (you are doing it wrong)
84
119
 
85
120
  - Asking about the stack when package.json answers it.
86
- - A phase "locked" without the user confirming it.
121
+ - A phase "locked" without the user confirming it, and — in a headless run —
122
+ a phase left unconfirmed instead of run as the assumed-confirm monologue.
87
123
  - Out-of-scope list that is empty or generic ("no mobile app").
88
124
  - Milestone prompts that say "see PRD for details".
125
+ - An existing entity or module re-specced as new work instead of reused.
126
+ - Reaching for `bash` to grep or verify what was written: `bash` is not in
127
+ this skill's tool surface and the call is refused. Use `grep`/`read`/`find`.
128
+ - Opening a task list for the nine phases; `tasks` is refused.
@@ -47,3 +47,57 @@ Expected:
47
47
 
48
48
  One representative scenario via `clio-coder skills eval` against Nemo-3.5-Lightning
49
49
  (30B local, llamacpp on mini), full-auto sandbox. WEAK PASS. Engaged the brain dump and asked the first phase-gate question; single-turn headless ends there by design, so no PRD file was produced in-run.
50
+
51
+ ## Battletest record (2026-09-03)
52
+
53
+ Fixture: `/home/akougkas/eval-temp/harness/test_prd.py`, continuing the
54
+ planning category's shared HPC log-triage domain from `product-intent`.
55
+ Seeds the actual `docs/hpc-log-triage.prd.md` product-intent output, its two
56
+ evidence docs, and a partial codebase (`src/scanner.py`: a working
57
+ `FailureEvent` + `scan_oom`, OOM only — ECC/Xid not yet implemented) inside a
58
+ git repo. The brain-dump prompt names ten scope-creep features (dashboard,
59
+ Slack, always-on pipeline, auto-remediation, learned ranking, federation,
60
+ audit export, RBAC, mobile app) and one explicit one-way-door tension
61
+ (on-demand reads vs. an always-on ingestion pipeline), combining S1
62
+ (existing foundation, stack detection), S2 (scope honesty), and S3 (existing
63
+ foundation reuse) into one gradable run. Graded 14 checks against real
64
+ post-run disk state (`PRD.md` at the exact promised path, all eight required
65
+ sections, the out-of-scope section itself — not just anywhere in the
66
+ document — actually containing the pushed-out features, `FailureEvent`
67
+ reused rather than re-specced, ≥2 self-contained milestone prompts with no
68
+ "see PRD" phrase) plus the reconstructed final assistant text and the raw
69
+ JSONL's tool-call/safety-block stream.
70
+
71
+ | run | model | wall | turns | in / out tokens | safety blocks | score | outcome |
72
+ |---|---|---|---|---|---|---|---|
73
+ | baseline (no skill) | qwen3.8-27b | 311s | 11 | 283.0k / 25.4k | 0 | 1/14 | never invoked `/skill prd`; misread the brain dump as an architecture request (it saw the installed `architecture` skill via `context(scope="skills")`) and wrote `docs/architecture-log-triage-v1.md` instead — no `PRD.md`, no milestones |
74
+ | v1 (frozen 0.3.0) | qwen3.8-27b | 492s | 12 | 408.3k / 43.4k | 2 | 12/14 | correct `PRD.md` + 5 self-contained milestone prompts, honest out-of-scope, reused `FailureEvent`; on its own initiative noticed no `ask_user` tool was present and ran the full nine-phase loop as a monologue, recording each lock — but opened a `tasks` plan and one `bash` call, both refused by the narrowed surface (self-recovered, but the two-safety-block outcome is exactly what an explicit refusal line prevents) |
75
+ | v2 (live 0.4.0) | qwen3.8-27b | 299s | 9 | 197.4k / 22.9k | 0 | 14/14 | same correctness as v1, zero safety blocks, no `tasks`/`bash` calls at all; final reply names the monologue explicitly ("no `ask_user` tool exists in my surface, so every gate was run as the skill's assumed-confirm monologue") |
76
+ | v2 confirm | ornith-1.5-35b-a3b | 79s | 11 | 169.9k / 11.5k | 0 | 14/14 | fastest of the four runs by a wide margin, same shape and grounding, zero safety blocks |
77
+
78
+ **Changes**: (1) `## Arguments` contract with an explicit headless/no-operator
79
+ rule — every one of the nine phases runs as an assumed-confirm monologue
80
+ when no one answers a gate, not just the first one, matching the pattern
81
+ ported from `architecture`/`product-intent`; (2) an explicit `tasks` and
82
+ `bash` refusal line — these were v1's only two failures, both self-recovered
83
+ by this model but a real safety-block pair on a weaker or more literal one;
84
+ (3) "Read the repo before asking" now says explicitly that an existing
85
+ entity gets reused and marked, not re-specced, closing S3; (4) the
86
+ `PRD.md` line now names the wrong shapes to avoid (`docs/PRD.md`, a slugged
87
+ filename, a report-style name), mirroring `architecture`'s
88
+ `final_report.md` fix; (5) three new Red flags for the failures actually
89
+ observed: an unconfirmed phase left that way instead of run as the
90
+ monologue, an existing module re-specced as new, and the `bash`/`tasks`
91
+ refusals named explicitly.
92
+
93
+ **Still weak**: the baseline's failure mode (skipping the skill entirely and
94
+ misreading the task as an architecture request) is a skill-selection gap
95
+ this SKILL.md cannot fix from inside its own body — it only activates once
96
+ invoked. Only the combined S1+S2+S3 fixture ran; a plain "just write it,
97
+ no interview" decline path and a genuinely blank invocation weren't tested
98
+ standalone. `ask_user` was never actually called on either model tested —
99
+ both recognized the headless gap and went straight to the monologue without
100
+ attempting the tool first, so the explicit degradation prose is a defensive
101
+ addition, not a proven repro-then-fix (the same caveat the context category
102
+ noted for its own headless guidance). `code_nav` (in allowed-tools) was
103
+ never exercised. Only 27–35B class models tried, no small-model run.
@@ -7,7 +7,7 @@ triggers:
7
7
  - problem-first PRD
8
8
  - define a falsifiable product hypothesis
9
9
  - greenfield product intent
10
- version: 0.3.0
10
+ version: 0.4.0
11
11
  license: Apache-2.0
12
12
  allowed-tools:
13
13
  - read
@@ -37,6 +37,35 @@ team can challenge before building and judge after shipping. Engineering
37
37
  decisions (library, data model, boundaries) never enter it; they belong to
38
38
  `architecture`.
39
39
 
40
+ ## Arguments
41
+
42
+ ```text
43
+ /skill product-intent <idea or problem, in a few sentences>
44
+ ```
45
+
46
+ - The text is the raw idea, problem statement, or "just write it" request
47
+ that starts Step 0. Reference docs (interviews, tickets, analytics,
48
+ competitor notes) named or pathed in the request are evidence to read
49
+ first, not more arguments.
50
+ - Nothing is required beyond some text; a blank invocation gets Step 0's own
51
+ "What do you want to build? A few sentences." question.
52
+
53
+ There is no operator in a headless run: `ask_user` still executes, but with
54
+ nothing to answer it every call returns immediately with no answers, every
55
+ time — calling it again will not produce a different result. Treat the
56
+ first empty response exactly like the user saying "just write it" (see "If
57
+ the user declines the interview" below), and apply that treatment from
58
+ wherever it happened onward — Step 0's evidence check included, not just
59
+ the five clusters: state the question, your best evidence-grounded answer
60
+ (or, absent evidence, the most defensible product default) and the
61
+ reasoning, mark it `assumed — confirm`, and move to the next step. Never
62
+ invent evidence to back an assumption; one with nothing behind it stays an
63
+ open question, not a fact.
64
+
65
+ The interview clusters below are the plan; do not open a task list for
66
+ them. `tasks` sits outside this skill's tool surface and any call to it is
67
+ refused.
68
+
40
69
  Two hard guards, checked before writing anything:
41
70
 
42
71
  1. **Intent-framed.** If only one solution could fit your problem statement,
@@ -59,7 +88,10 @@ the same turn. Thin answers get reflected back and dug into.
59
88
 
60
89
  If the user declines the interview ("just write it"): honor it, name what
61
90
  you will have to leave TBD, ask only the two or three highest-leverage
62
- questions, and mark everything else "TBD — needs validation".
91
+ questions, and mark everything else "TBD — needs validation". This is also
92
+ the headless default: see Arguments above for what an empty `ask_user`
93
+ response means and how to apply this same treatment cluster by cluster
94
+ instead of stopping after the first one.
63
95
 
64
96
  1. **Initiate.** Input given → restate and confirm. Blank → "What do you
65
97
  want to build? A few sentences." GATE.
@@ -116,3 +148,26 @@ offered: `architecture` for the engineering decisions this PRD
116
148
  deliberately left open. Failing any of the five tests below means not done:
117
149
  evidence-grounded problem · hypothesis with separate RIGHT and WRONG ·
118
150
  outcome-shaped metrics · explicit non-goals · zero engineering decisions.
151
+
152
+ ## Red flags
153
+
154
+ - A stack, library, database, or framework name anywhere in the document —
155
+ "React + Postgres" appearing at all is an instant fail; that decision
156
+ belongs to `architecture`, not here.
157
+ - A hypothesis with a RIGHT condition and no WRONG condition, or a WRONG
158
+ condition that is just the RIGHT one negated instead of a real
159
+ counter-signal.
160
+ - The literal filename `PRD.md`, or anything outside `docs/`, instead of
161
+ `docs/<kebab-slug>.prd.md`.
162
+ - Calling `ask_user` again after an empty response, instead of switching to
163
+ the decline treatment for every step from there on.
164
+ - Opening a task list for the interview clusters; `tasks` is refused.
165
+ - Reaching Generate without ever attempting Step 0 or the first cluster —
166
+ the decline/headless treatment is a fallback for a gate that ran and came
167
+ back empty, not a license to skip the loop from the start.
168
+ - Claims in the document that trace to neither the seeded evidence nor a
169
+ marked assumption — an invented fact reads as confident and is the
170
+ hardest failure to catch after the fact.
171
+ - Reaching for `bash` to grep or count-check the written PRD: `bash` is not
172
+ in this skill's tool surface and the call is refused. Verify with `grep`
173
+ and `read` instead.
@@ -34,3 +34,73 @@ Expected:
34
34
 
35
35
  One representative scenario via `clio-coder skills eval` against Nemo-3.5-Lightning
36
36
  (30B local, llamacpp on mini), full-auto sandbox. PASS. Interview degraded gracefully headless; PRD written to docs/, judge 5/5.
37
+
38
+ ## Battletest record (2026-09-03)
39
+
40
+ Fixture: `/home/akougkas/eval-temp/harness/test_productintent.py`. S1's own
41
+ domain ("a log-triage tool for HPC operators") made concrete: a repo with
42
+ `docs/evidence/support-tickets.md` (3 tickets, a 45-min OOM triage, a
43
+ silent-ECC lost queue, a tmux/grep cope with a ~12-node ceiling) and
44
+ `docs/evidence/interview-notes.md` (3 operator quotes, including an explicit
45
+ switch signal). Task: "write the PRD," grounding docs named but not pasted,
46
+ so Step 0's read-first behavior is load-bearing. Graded 12 checks against
47
+ real post-run disk state (file at `docs/<slug>.prd.md`, all 9 sections, a
48
+ hypothesis with distinct RIGHT/WRONG, >=3 seeded facts grounded, zero
49
+ stack-term leaks, non-goals, checkbox open questions) plus the reconstructed
50
+ final assistant text (names the path, offers `architecture` next) and
51
+ process (zero safety blocks, no `tasks` call). `qwen3.8-27b` on `dynamo`
52
+ throughout; one confirm run on `ornith-1.5-35b-a3b`.
53
+
54
+ | run | model | wall | turns | in / out tok | safety blocks | score | outcome |
55
+ |---|---|---|---|---|---|---|---|
56
+ | baseline (no skill) | qwen3.8-27b | 145s | 11 | 189.1k / 13.1k | 0 | 2/12 | wrote `PRD.md` at repo root (wrong name/path); no interview at all, no hypothesis RIGHT/WRONG block, no non-goals/open-questions sections; opened a task list (harmless here, no skill narrowing the surface) |
57
+ | v1 (frozen 0.3.0) | qwen3.8-27b | 137s | 7 | 102.5k / 12.8k | 1 | 10/12 | correct path, sections, hypothesis, grounding, non-goals; opened a `tasks` call refused by the narrowed surface (self-recovered); degraded past the interview on its own reasoning ("`ask_user` isn't in this session's tool surface" — false, it is listed, the model just never tried it) rather than on any instruction in the skill |
58
+ | v2 (first hardened cut) | qwen3.8-27b | 224s | 8 | 170.9k / 20.2k | 1 | 11/12 | no `tasks` call; ran the assumed-confirm monologue explicitly through all 5 clusters citing evidence; one `bash` call (a `$(...)` count-check on the written PRD) refused — `bash` was never in this skill's surface, model reached for it anyway to self-verify, then recovered with `grep` |
59
+ | v3 (final 0.4.0) | qwen3.8-27b | 227s | 7 | 132.5k / 20.5k | 0 | 12/12 | same correctness as v2, self-verified with `grep`/`read` instead of `bash` after the added Red flags line; zero safety blocks, zero stack leaks, explicit "Process notes" section narrating the headless degradation cluster by cluster |
60
+ | confirm (0.4.0) | ornith-1.5-35b-a3b | 69s | 11 | 158.6k / 10.8k | 1 | 11/12 | same content correctness; independently reached for a `bash` echo ("attempting ask_user via context") once, blocked, self-recovered with `grep` — the Red flags line reduced but did not eliminate the `bash` reflex on a second model family |
61
+
62
+ **Changes** (0.3.0 -> 0.4.0): (1) an `## Arguments` contract stating there is
63
+ no operator in a headless run, that `ask_user` returns immediately with no
64
+ answers every time regardless of how many times it's called, and that the
65
+ fix is to apply the existing "user declines" treatment cluster by cluster
66
+ from wherever the first empty response lands — including Step 0's evidence
67
+ check, which the old text left ungated but unaddressed for headless; (2) the
68
+ decline paragraph in "The interview" now cross-references that headless
69
+ default explicitly instead of leaving the model to infer it (v1 inferred a
70
+ *wrong* reason — a nonexistent tool-surface gap — and got lucky); (3) an
71
+ explicit "the clusters below are the plan; `tasks` is refused" line, which
72
+ closed v1's one real safety block; (4) a new `## Red flags` section (the
73
+ skill had none) naming the concrete failures seen across runs: stack-term
74
+ leaks, a WRONG condition that's just RIGHT negated, the literal `PRD.md`
75
+ name, re-calling `ask_user` after an empty response, skipping the loop
76
+ outright instead of degrading into it, ungrounded claims, and reaching for
77
+ `bash` (not in this skill's surface) to self-verify instead of `grep`/`read`.
78
+
79
+ **Design note on the biggest named risk**: the mission brief flagged gating
80
+ hard on Step 0/cluster 1 and never reaching Generate as the single biggest
81
+ risk for this skill. It did not reproduce on either model tested, on any
82
+ version including the unhardened v1 baseline snapshot — `ask_user`'s
83
+ headless behavior in this harness (confirmed by reading
84
+ `src/tools/ask-user.ts`: with no operator handler wired by `clio-coder run`,
85
+ every `ask_user` call resolves immediately to `{cancelled: true}`, framed as
86
+ an ok result with "proceed with defaults" guidance, never an error or a
87
+ hang) means a stalled interview was never actually the failure mode to
88
+ defend against here. What *was* real and reproduced on both models: an
89
+ unprompted reach for `bash` to self-verify a written document, refused
90
+ because `bash` is correctly outside this skill's surface. The hardening
91
+ therefore targets the reproduced failure (`tasks` in v1, `bash` in v2/
92
+ confirm), not the hypothesized one — matching context/context-handoff's
93
+ own finding that the ask_user-stall defense is precautionary, not
94
+ repro-driven, here too.
95
+
96
+ **Still weak**: the `bash`-reach-to-verify reflex was reduced (v2 -> v3 on
97
+ qwen3.8-27b: fixed) but not eliminated on ornith-1.5-35b-a3b, which hit the
98
+ identical refused-tool pattern even after the Red flags line existed — a
99
+ prose warning did not fully generalize across model families, only across
100
+ runs of the same one. S2 (explicit "skip the questions, just write it") and
101
+ S3 (solution-shaped request, "PRD for adding a reply button") from the
102
+ scenario list above were not run standalone against 0.4.0 — only the S1-style
103
+ combined evidence fixture ran, five times. The `git` tool (in allowed-tools)
104
+ was never exercised in any run; a fixture with prior commits/branches to
105
+ reference might exercise it. Only 27-35B class models tried, no small-model
106
+ run.