@iowarp/clio-coder 0.4.2 → 0.4.4

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 (523) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/CONTRIBUTING.md +86 -19
  3. package/README.md +35 -6
  4. package/dist/{acp-TMDQZDIG.js → acp-WNAYYF4F.js} +12 -13
  5. package/dist/{agents-5N5NG3XG.js → agents-3OKXHLOI.js} +60 -57
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-Z5CCBXKQ.js → auth-VKNNMGPU.js} +21 -19
  8. package/dist/{builtins-K6TNDT24.js → builtins-WGALA46I.js} +9 -4
  9. package/dist/{chunk-XE3PCIXH.js → chunk-23L32XTI.js} +12 -9
  10. package/dist/{chunk-I64IFBLB.js → chunk-25QBEXRS.js} +18 -11
  11. package/dist/{chunk-CDNVLKUX.js → chunk-26QSH3EJ.js} +13 -7
  12. package/dist/{chunk-QQLGQY2A.js → chunk-2ASED4PZ.js} +22 -22
  13. package/dist/{chunk-MCEPRMZW.js → chunk-2CU2H6KE.js} +2 -2
  14. package/dist/chunk-2DSOYNFC.js +108 -0
  15. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  16. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  17. package/dist/{chunk-O3YUNJZ2.js → chunk-2ZSONWVL.js} +82 -25
  18. package/dist/{chunk-2NHR3NAY.js → chunk-36CT5VVL.js} +331 -42
  19. package/dist/{chunk-2X4RYJTJ.js → chunk-3GY4F45V.js} +3 -3
  20. package/dist/{chunk-ZW55JB7N.js → chunk-3ODX73FK.js} +4 -6
  21. package/dist/{chunk-PBP4B7XR.js → chunk-3UNOLWNZ.js} +3 -3
  22. package/dist/{chunk-4JDLP6ZS.js → chunk-3UUXNFEX.js} +14 -10
  23. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  24. package/dist/{chunk-ZW4HH5JJ.js → chunk-4M6Z5QVF.js} +6 -6
  25. package/dist/{chunk-K6BSR66V.js → chunk-4NSRCOYP.js} +4 -1
  26. package/dist/{chunk-M2DAX4F6.js → chunk-4WR7VSYB.js} +2 -2
  27. package/dist/{chunk-FSP7CMNU.js → chunk-54X7T7DK.js} +61 -6
  28. package/dist/{chunk-54ODD65L.js → chunk-5636DCO5.js} +4 -4
  29. package/dist/chunk-57XXR6DR.js +3763 -0
  30. package/dist/{chunk-3KIPBMUA.js → chunk-5ICU3EUH.js} +2 -2
  31. package/dist/{chunk-77QIVUZB.js → chunk-5MEZN6CB.js} +4 -4
  32. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  33. package/dist/{chunk-YJISEZKC.js → chunk-5TUB6SLS.js} +6 -6
  34. package/dist/{chunk-IMXMHHMQ.js → chunk-6OSVSQL5.js} +341 -57
  35. package/dist/{chunk-Q4XWMHX6.js → chunk-6PAZTBPA.js} +14 -2
  36. package/dist/{chunk-FVDGR2ZL.js → chunk-6Q3CYFD3.js} +112 -39
  37. package/dist/{chunk-IDNA72AH.js → chunk-6QOTUPRG.js} +155 -36
  38. package/dist/{chunk-X7IARSHT.js → chunk-6UINWWS6.js} +16 -10
  39. package/dist/{chunk-CYZW7JHJ.js → chunk-72YIHOZQ.js} +9 -9
  40. package/dist/{chunk-IKSLQ4XV.js → chunk-75W7L2E2.js} +752 -861
  41. package/dist/{chunk-CRFOIAX3.js → chunk-7UGL4MB5.js} +6 -6
  42. package/dist/{chunk-HIICAHCJ.js → chunk-AUPNRN7C.js} +2 -2
  43. package/dist/{chunk-7BHIY2MW.js → chunk-BJVFZO5U.js} +8 -50
  44. package/dist/{chunk-B74PXLU7.js → chunk-CUSRQKPU.js} +65 -3
  45. package/dist/chunk-DQOVN6KV.js +386 -0
  46. package/dist/{chunk-E7GT7O5N.js → chunk-DT3LWJOB.js} +7 -4
  47. package/dist/chunk-DXKJURES.js +671 -0
  48. package/dist/{chunk-JBCS7CRR.js → chunk-EL24TAU4.js} +10 -10
  49. package/dist/{chunk-TPEQIQIE.js → chunk-ELWDPP3Y.js} +8 -8
  50. package/dist/{chunk-NDINPTJ4.js → chunk-ELZVTCGV.js} +5 -4
  51. package/dist/chunk-EXLD33WO.js +381 -0
  52. package/dist/chunk-FEAXX7B6.js +101 -0
  53. package/dist/{chunk-RLYRBIYQ.js → chunk-FFUPXJC4.js} +90 -331
  54. package/dist/{chunk-5PFYMY2V.js → chunk-FTMGRKEF.js} +2 -2
  55. package/dist/{chunk-34BHNEE3.js → chunk-GHS5EBTQ.js} +58 -7
  56. package/dist/{chunk-DYHAXKHD.js → chunk-GWZNEVM2.js} +12 -8
  57. package/dist/chunk-GX5WYQO4.js +59 -0
  58. package/dist/chunk-GYV6VZOC.js +26 -0
  59. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  60. package/dist/chunk-I2DWJ4GM.js +390 -0
  61. package/dist/{chunk-TXOTCRLG.js → chunk-I5FWO7L5.js} +5 -5
  62. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  63. package/dist/{chunk-XQRY4DTA.js → chunk-IGLP3ODT.js} +10 -10
  64. package/dist/chunk-IRXAATOX.js +539 -0
  65. package/dist/chunk-IXIY2H4R.js +44 -0
  66. package/dist/{chunk-SSEYRH53.js → chunk-IZXGRF7P.js} +92 -147
  67. package/dist/{chunk-5TSRNF4G.js → chunk-JCI2ROMZ.js} +164 -6
  68. package/dist/{chunk-JWJGP5DQ.js → chunk-JEIYHLOR.js} +7 -7
  69. package/dist/{chunk-F2I26BDK.js → chunk-JQLNNIKT.js} +4 -4
  70. package/dist/{chunk-BYMNWQ7O.js → chunk-JSD46VO2.js} +315 -63
  71. package/dist/{chunk-AK5XEFVZ.js → chunk-JT2RFCC5.js} +64 -14
  72. package/dist/{chunk-MCMZMDAC.js → chunk-K6T2ZAMZ.js} +168 -6
  73. package/dist/{chunk-PGF63K6I.js → chunk-KFV5L5SK.js} +73 -4
  74. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  75. package/dist/{chunk-PJX3WQUQ.js → chunk-LLXSDWXS.js} +3 -3
  76. package/dist/{chunk-DZAW46HP.js → chunk-LTIKRKFL.js} +3 -3
  77. package/dist/{chunk-DZEK6CJN.js → chunk-N56KALIC.js} +21 -21
  78. package/dist/{chunk-B7HM5Z7T.js → chunk-NAI6ZFCY.js} +9 -5
  79. package/dist/{chunk-I66ZTYNP.js → chunk-NRO2BJRH.js} +2656 -2213
  80. package/dist/{chunk-ZGNYYXQ6.js → chunk-NXIMQY5W.js} +3 -3
  81. package/dist/{chunk-IKOZFYBN.js → chunk-NXYCB2VD.js} +149 -106
  82. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  83. package/dist/{chunk-462T4EGZ.js → chunk-O5CVSAG5.js} +2 -2
  84. package/dist/chunk-ODGTEFFI.js +50 -0
  85. package/dist/{chunk-3F7VUY77.js → chunk-OEJSLEPW.js} +2 -2
  86. package/dist/{chunk-KKOJXO6R.js → chunk-OMQNJVKW.js} +4 -2
  87. package/dist/{chunk-5KW52TEP.js → chunk-Q4WO54TA.js} +132 -77
  88. package/dist/{chunk-W6NIE6OW.js → chunk-QUFRYSWI.js} +13 -7
  89. package/dist/{chunk-42FMPA75.js → chunk-QZWQA4DE.js} +2 -2
  90. package/dist/chunk-R6Q67RJH.js +134 -0
  91. package/dist/{chunk-W4YEMFBX.js → chunk-RAY4OVGZ.js} +3 -3
  92. package/dist/{chunk-ZNT2M6TG.js → chunk-RQCKCSRL.js} +17 -17
  93. package/dist/{chunk-LJID3DYZ.js → chunk-RXTN6AKH.js} +3 -3
  94. package/dist/{chunk-P75RZCJW.js → chunk-RZDWV63N.js} +3 -3
  95. package/dist/{chunk-UH632ZYL.js → chunk-S6PYF2XF.js} +2 -2
  96. package/dist/{chunk-HJWWJ6IL.js → chunk-TOIVGRUX.js} +17 -5
  97. package/dist/{chunk-HLAFFSEK.js → chunk-TQAHXW6Y.js} +2 -2
  98. package/dist/{chunk-JIEGK6UF.js → chunk-U6TMQNSI.js} +48 -4
  99. package/dist/{chunk-2HFQNRV3.js → chunk-UEPWCCTY.js} +12 -12
  100. package/dist/chunk-UOIZ7DA4.js +41 -0
  101. package/dist/{chunk-UH347SHR.js → chunk-USR47QNF.js} +11 -11
  102. package/dist/{chunk-AZ4WMN4W.js → chunk-V6HJFQZE.js} +2 -2
  103. package/dist/chunk-V76WTFTW.js +318 -0
  104. package/dist/{chunk-NMJXSHBJ.js → chunk-W54I7H25.js} +2 -2
  105. package/dist/{chunk-KPXDY6QF.js → chunk-XRZT5WY5.js} +2 -2
  106. package/dist/{chunk-UBRFI4HS.js → chunk-XULDXHTN.js} +142 -50
  107. package/dist/chunk-XXYSBZIQ.js +283 -0
  108. package/dist/{chunk-HKMD33FO.js → chunk-Y55JBDO5.js} +405 -122
  109. package/dist/{chunk-XOXV5GKE.js → chunk-YD5GIKET.js} +17 -8
  110. package/dist/{chunk-XGDPUNND.js → chunk-YECAMM3D.js} +2 -2
  111. package/dist/{chunk-BO7Y52RY.js → chunk-YNFKXPEC.js} +7 -7
  112. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  113. package/dist/{chunk-M2WXEHER.js → chunk-ZA4VCIGV.js} +2 -2
  114. package/dist/cli/index.js +42 -40
  115. package/dist/{clio-7VB377CC.js → clio-QLICPCF5.js} +7 -7
  116. package/dist/{code-nav-YVLCYA7V.js → code-nav-IJR2DBPR.js} +9 -9
  117. package/dist/{components-UBWCQSRW.js → components-2TGAI2RC.js} +5 -6
  118. package/dist/{config-4HVOS65E.js → config-IUA6OYNS.js} +88 -81
  119. package/dist/{configure-PIWO7B24.js → configure-VEPX4NMX.js} +26 -25
  120. package/dist/{context-KQYIWPWT.js → context-2DKHWH2T.js} +60 -45
  121. package/dist/{context-IYEHL3WQ.js → context-4MPR7WKB.js} +78 -69
  122. package/dist/{context-N6ZE3LGJ.js → context-BOYF5EJM.js} +15 -11
  123. package/dist/{context-clear-G4OGZJDS.js → context-clear-S4ZJCQUX.js} +73 -65
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-BWLF6LJP.js → context-working-set-3I3FYX6Y.js} +18 -17
  126. package/dist/detail-A7JAVSIG.js +98 -0
  127. package/dist/{dispatch-runner-2QQAITS3.js → dispatch-runner-RJ5I2F2O.js} +99 -75
  128. package/dist/{docs-PD3EXDKU.js → docs-SPOV3BAN.js} +3 -5
  129. package/dist/{doctor-LHBD36VU.js → doctor-DKICC2SN.js} +71 -48
  130. package/dist/{eval-C45FYRJ6.js → eval-OQOQUDHK.js} +308 -146
  131. package/dist/{eval-inventory-6DEJPLBF.js → eval-inventory-Y6QRFOH5.js} +4 -4
  132. package/dist/{evidence-6SHONYAF.js → evidence-4DQ25GUQ.js} +79 -175
  133. package/dist/evidence-4F5USFKH.js +208 -0
  134. package/dist/{evolve-KRKMV72X.js → evolve-GSS52E5J.js} +71 -67
  135. package/dist/{extensions-KPZ2UHBB.js → extensions-G7MFLYHT.js} +8 -9
  136. package/dist/{fleet-IVTCKDHT.js → fleet-Q37YHHAQ.js} +126 -118
  137. package/dist/{fleet-commands-EDWL3IT7.js → fleet-commands-G7E4N7SM.js} +16 -13
  138. package/dist/{fleet-decisions-YP3YEFGK.js → fleet-decisions-O7M6QBA2.js} +9 -8
  139. package/dist/{fleet-graph-ZFWKHY2M.js → fleet-graph-TOUBW6OW.js} +21 -20
  140. package/dist/{fleet-inspect-FVUNCBML.js → fleet-inspect-SW33JJNI.js} +65 -60
  141. package/dist/{fleet-preflight-UN5XED4R.js → fleet-preflight-CV2655TW.js} +4 -5
  142. package/dist/{fleet-validate-XOWC4HSX.js → fleet-validate-KESZX2YH.js} +25 -24
  143. package/dist/{fleet-verify-UN3SODEL.js → fleet-verify-UQPMTVE3.js} +66 -61
  144. package/dist/{fleet-view-TWHJKCN6.js → fleet-view-MN2VG4MR.js} +65 -60
  145. package/dist/{init-T2QORQ3Y.js → init-PXEXQSBF.js} +90 -82
  146. package/dist/{interop-IN5I2A66.js → interop-ZG5T62U3.js} +12 -13
  147. package/dist/inventory-C26CFDRR.js +101 -0
  148. package/dist/{library-LSCATDLZ.js → library-B2W4N74O.js} +29 -29
  149. package/dist/{memory-HYOKAGGJ.js → memory-YCANYS5A.js} +73 -69
  150. package/dist/{models-2GPMFYCM.js → models-GERTU3YI.js} +51 -47
  151. package/dist/{monitor-E4ASVUJH.js → monitor-CPNIUULB.js} +74 -67
  152. package/dist/{orchestrator-DDMPR3PY.js → orchestrator-J4BSH4WQ.js} +1288 -1606
  153. package/dist/{panes-E3RUXOW5.js → panes-BOHAEGYC.js} +4 -4
  154. package/dist/{panes-IXKLOKA2.js → panes-NXSLDQZ2.js} +10 -11
  155. package/dist/{paths-L7LGY6RN.js → paths-VSUWNC22.js} +6 -7
  156. package/dist/reset-TNWTB5LU.js +343 -0
  157. package/dist/{resources-OTRSN34L.js → resources-4PXNMD5G.js} +29 -22
  158. package/dist/{run-5DEYH5QK.js → run-D6XJ34CN.js} +132 -132
  159. package/dist/{share-IHWTLO3M.js → share-2NWMJJEE.js} +27 -27
  160. package/dist/{skills-IYMXMKW4.js → skills-KR7WON5G.js} +40 -33
  161. package/dist/{skills-eval-DROHSJAR.js → skills-eval-O2ZNOLDS.js} +81 -77
  162. package/dist/{skills-inventory-D7X4L4ZX.js → skills-inventory-ZZOUBK7O.js} +23 -22
  163. package/dist/{slash-commands-QBM7UZ3B.js → slash-commands-ZXPJD64J.js} +47 -37
  164. package/dist/{steer-Z5DO23FJ.js → steer-XA25PSCS.js} +4 -4
  165. package/dist/{support-U7QOWY26.js → support-7EMVWYG2.js} +6 -6
  166. package/dist/{targets-P2FUC4IL.js → targets-OMH2XCSN.js} +50 -49
  167. package/dist/tasks-IPAGMEIX.js +36 -0
  168. package/dist/{terminal-lease-YREJ3JX2.js → terminal-lease-C2J3JYRE.js} +4 -4
  169. package/dist/{tools-5B7RO6MV.js → tools-EFFEAIDP.js} +8 -9
  170. package/dist/{trace-YMGMUM6A.js → trace-FXMXUZUF.js} +7 -7
  171. package/dist/uninstall-HALS6BLF.js +407 -0
  172. package/dist/upgrade-MS72RJEP.js +306 -0
  173. package/dist/{usage-ME5MPXGX.js → usage-NHG6MCJM.js} +162 -108
  174. package/dist/{verifiers-BVZ7IWOO.js → verifiers-7AUNVXDY.js} +155 -22
  175. package/dist/{verify-5K7ZKQFC.js → verify-FWYGPKMR.js} +14 -12
  176. package/dist/{web-fetch-MPARV2K7.js → web-fetch-V4FKSDAV.js} +4 -4
  177. package/dist/{wiki-generate-F5W5QTYY.js → wiki-generate-743CIGJW.js} +99 -90
  178. package/dist/{with-panes-BYOJCLAM.js → with-panes-BDQEWBRT.js} +10 -10
  179. package/dist/worker/entry.js +72 -68
  180. package/docs/README.md +3 -2
  181. package/docs/architecture/acp.md +17 -0
  182. package/docs/architecture/artifact-placement.md +1 -0
  183. package/docs/architecture/artifact-versions.md +2 -2
  184. package/docs/architecture/context-engine.md +4 -0
  185. package/docs/architecture/dispatch-typed-intent.md +1 -1
  186. package/docs/architecture/evidence-and-memory.md +1 -1
  187. package/docs/architecture/middleware-and-components.md +1 -1
  188. package/docs/architecture/model-catalog.md +21 -10
  189. package/docs/architecture/observability.md +19 -2
  190. package/docs/architecture/prompt-envelope-and-tools.md +17 -5
  191. package/docs/architecture/provider-adapter-cookbook.md +63 -0
  192. package/docs/architecture/safety-model.md +25 -22
  193. package/docs/architecture/tui-design.md +1 -1
  194. package/docs/guide/built-in-agents.md +25 -11
  195. package/docs/guide/commands-and-modes.md +18 -3
  196. package/docs/guide/configuration-and-targets.md +100 -10
  197. package/docs/guide/configuration-reference.md +17 -7
  198. package/docs/guide/environment-variables.md +4 -2
  199. package/docs/guide/installation-and-lifecycle.md +37 -4
  200. package/docs/guide/proactive-memory.md +66 -55
  201. package/docs/guide/skills-marketplace.md +18 -0
  202. package/docs/guide/tool-usage.md +78 -3
  203. package/docs/history/config-knobs-audit.md +2 -2
  204. package/docs/process/development-pipeline.md +40 -2
  205. package/docs/process/eval-runner.md +67 -3
  206. package/docs/process/git-commit-provenance.md +15 -0
  207. package/docs/process/release-cut-checklist.md +207 -0
  208. package/docs/process/scientific-validation.md +18 -17
  209. package/evals/behavioral-machinery-support.ts +1 -0
  210. package/evals/behavioral-machinery.yaml +1 -1
  211. package/evals/behavioral-model.yaml +3 -2
  212. package/package.json +2 -2
  213. package/skills/README.md +7 -5
  214. package/skills/coding/ast-grep/SKILL.md +101 -30
  215. package/skills/coding/ast-grep/evals.md +26 -0
  216. package/skills/coding/coding-standards/SKILL.md +47 -2
  217. package/skills/coding/coding-standards/evals.md +23 -0
  218. package/skills/coding/prototype/SKILL.md +87 -28
  219. package/skills/coding/prototype/evals.md +19 -0
  220. package/skills/coding/tdd/SKILL.md +80 -53
  221. package/skills/coding/tdd/evals.md +20 -0
  222. package/skills/context/context-handoff/SKILL.md +43 -2
  223. package/skills/context/context-handoff/evals.md +44 -0
  224. package/skills/context/context-prime/SKILL.md +45 -15
  225. package/skills/context/context-prime/evals.md +45 -0
  226. package/skills/git/branch-closeout/SKILL.md +132 -0
  227. package/skills/git/branch-closeout/evals.md +133 -0
  228. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  229. package/skills/git/file-ticket/SKILL.md +77 -63
  230. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  231. package/skills/git/file-ticket/evals.md +31 -26
  232. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  233. package/skills/git/fix-issue/SKILL.md +87 -64
  234. package/skills/git/fix-issue/evals.md +35 -31
  235. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  236. package/skills/git/resolve-merge-conflicts/SKILL.md +100 -51
  237. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  238. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  239. package/skills/git/ship/SKILL.md +103 -67
  240. package/skills/git/ship/assets/pr-template.md +21 -0
  241. package/skills/git/ship/evals.md +44 -28
  242. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  243. package/skills/git/worktree-create/SKILL.md +80 -50
  244. package/skills/git/worktree-create/evals.md +40 -33
  245. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  246. package/skills/git/worktree-merge/SKILL.md +112 -65
  247. package/skills/git/worktree-merge/evals.md +42 -34
  248. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  249. package/skills/planning/archify/SKILL.md +196 -0
  250. package/skills/planning/archify/evals.md +65 -0
  251. package/skills/planning/architecture/SKILL.md +61 -12
  252. package/skills/planning/architecture/evals.md +65 -0
  253. package/skills/planning/backlog/SKILL.md +130 -14
  254. package/skills/planning/backlog/evals.md +142 -0
  255. package/skills/planning/prd/SKILL.md +47 -6
  256. package/skills/planning/prd/evals.md +54 -0
  257. package/skills/planning/product-intent/SKILL.md +57 -2
  258. package/skills/planning/product-intent/evals.md +70 -0
  259. package/skills/planning/tech-spec/SKILL.md +53 -2
  260. package/skills/planning/tech-spec/evals.md +73 -0
  261. package/skills/registry.yaml +58 -50
  262. package/skills/remote.yaml +13 -0
  263. package/skills/research/arxiv-literature/SKILL.md +76 -18
  264. package/skills/research/arxiv-literature/evals.md +50 -0
  265. package/skills/research/experiment-protocol/SKILL.md +20 -1
  266. package/skills/research/experiment-protocol/evals.md +23 -0
  267. package/skills/research/scientific-debugging/SKILL.md +24 -1
  268. package/skills/research/scientific-debugging/evals.md +18 -0
  269. package/skills/research/scientific-modernization/SKILL.md +26 -1
  270. package/skills/research/scientific-modernization/evals.md +27 -0
  271. package/skills/skill-marketplace.json +63 -28
  272. package/skills/workflow/cut-it/SKILL.md +64 -5
  273. package/skills/workflow/cut-it/evals.md +101 -0
  274. package/skills/workflow/design-council/SKILL.md +112 -27
  275. package/skills/workflow/design-council/evals.md +161 -0
  276. package/skills/workflow/grill-me/SKILL.md +85 -10
  277. package/skills/workflow/grill-me/evals.md +153 -0
  278. package/skills/workflow/workflow-distiller/SKILL.md +76 -17
  279. package/skills/workflow/workflow-distiller/evals.md +118 -0
  280. package/src/cli/args.ts +0 -8
  281. package/src/cli/configure-interop.ts +105 -13
  282. package/src/cli/configure-oauth.ts +57 -0
  283. package/src/cli/configure-onboarding.ts +980 -0
  284. package/src/cli/configure-target.ts +594 -0
  285. package/src/cli/configure.ts +1084 -529
  286. package/src/cli/context-map.ts +114 -0
  287. package/src/cli/context.ts +4 -0
  288. package/src/cli/doctor-state-size.ts +1 -12
  289. package/src/cli/doctor-validation-contract.ts +28 -0
  290. package/src/cli/doctor.ts +5 -0
  291. package/src/cli/evidence-detail.ts +1 -75
  292. package/src/cli/evidence-inventory.ts +1 -167
  293. package/src/cli/index.ts +3 -0
  294. package/src/cli/lifecycle-presenter.ts +436 -0
  295. package/src/cli/models.ts +10 -2
  296. package/src/cli/modes/print.ts +5 -1
  297. package/src/cli/reset.ts +228 -106
  298. package/src/cli/run.ts +7 -4
  299. package/src/cli/select.ts +664 -0
  300. package/src/cli/skills.ts +9 -2
  301. package/src/cli/targets.ts +3 -0
  302. package/src/cli/tasks.ts +84 -0
  303. package/src/cli/uninstall.ts +233 -165
  304. package/src/cli/upgrade.ts +210 -150
  305. package/src/cli/usage.ts +92 -27
  306. package/src/cli/validate-model.ts +3 -3
  307. package/src/cli/verifiers.ts +147 -1
  308. package/src/cli/wiki-generate.ts +1 -0
  309. package/src/core/commit-attribution.ts +41 -1
  310. package/src/core/config.ts +56 -0
  311. package/src/core/external-diagnostic.ts +44 -0
  312. package/src/core/gateway-routing.ts +157 -0
  313. package/src/core/git-commit-attribution.ts +46 -3
  314. package/src/core/run-overrides.ts +0 -5
  315. package/src/core/safe-exec.ts +17 -2
  316. package/src/core/skill-activation.ts +92 -2
  317. package/src/core/tool-names.ts +5 -2
  318. package/src/domains/agents/builtins/architect.md +1 -1
  319. package/src/domains/agents/builtins/coder.md +1 -1
  320. package/src/domains/agents/builtins/documenter.md +1 -1
  321. package/src/domains/agents/builtins/git-master.md +1 -1
  322. package/src/domains/agents/builtins/provenance.md +7 -7
  323. package/src/domains/agents/builtins/tester.md +1 -1
  324. package/src/domains/agents/builtins/verifier.md +2 -2
  325. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  326. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  327. package/src/domains/agents/catalog.ts +1 -1
  328. package/src/domains/agents/result-contract.ts +70 -0
  329. package/src/domains/context/extension.ts +31 -7
  330. package/src/domains/context/refresh.ts +3 -0
  331. package/src/domains/context/wiki/frontmatter.ts +5 -2
  332. package/src/domains/context/wiki/generate.ts +6 -0
  333. package/src/domains/context/wiki/map-seed.ts +589 -0
  334. package/src/domains/context/wiki/plan.ts +2 -2
  335. package/src/domains/context/wiki/prompts.ts +43 -0
  336. package/src/domains/dispatch/active-route-planner.ts +4 -0
  337. package/src/domains/dispatch/admission.ts +29 -0
  338. package/src/domains/dispatch/agent-candidates.ts +10 -0
  339. package/src/domains/dispatch/budget-envelope.ts +86 -1
  340. package/src/domains/dispatch/capability-match.ts +1 -0
  341. package/src/domains/dispatch/capacity-lease.ts +17 -0
  342. package/src/domains/dispatch/code-step.ts +11 -4
  343. package/src/domains/dispatch/contract.ts +42 -8
  344. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  345. package/src/domains/dispatch/extension.ts +184 -56
  346. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  347. package/src/domains/dispatch/fleet-run.ts +1 -0
  348. package/src/domains/dispatch/host-verification.ts +114 -13
  349. package/src/domains/dispatch/intent.ts +28 -18
  350. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  351. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  352. package/src/domains/dispatch/reservation-store.ts +5 -3
  353. package/src/domains/dispatch/state.ts +15 -2
  354. package/src/domains/dispatch/types.ts +20 -2
  355. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  356. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  357. package/src/domains/eval/metrics/token-stream.ts +201 -31
  358. package/src/domains/eval/metrics/tracked.ts +40 -4
  359. package/src/domains/eval/runners/clio-run.ts +17 -11
  360. package/src/domains/eval/runners/context-index.ts +2 -7
  361. package/src/domains/eval/runners/context-init.ts +3 -6
  362. package/src/domains/eval/runners/external-command.ts +29 -11
  363. package/src/domains/eval/schema/suite.ts +28 -0
  364. package/src/domains/eval/schema/verdict.ts +2 -2
  365. package/src/domains/eval/suites/resolve.ts +13 -1
  366. package/src/domains/eval/suites/run.ts +24 -3
  367. package/src/domains/evidence/build.ts +102 -15
  368. package/src/domains/evidence/detail.ts +69 -0
  369. package/src/domains/evidence/eval.ts +13 -1
  370. package/src/domains/evidence/finish-contract-map.ts +5 -1
  371. package/src/domains/evidence/inventory.ts +167 -0
  372. package/src/domains/evidence/store.ts +16 -0
  373. package/src/domains/evidence/types.ts +12 -0
  374. package/src/domains/extensions/resources.ts +7 -0
  375. package/src/domains/interop/registry.ts +6 -2
  376. package/src/domains/interop/types.ts +4 -0
  377. package/src/domains/lifecycle/migrations/index.ts +4 -0
  378. package/src/domains/memory/task-memory-policy.ts +70 -26
  379. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  380. package/src/domains/middleware/index.ts +0 -1
  381. package/src/domains/middleware/marketplace-offer.ts +22 -35
  382. package/src/domains/middleware/memory-intervention.ts +127 -32
  383. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  384. package/src/domains/middleware/runtime.ts +7 -3
  385. package/src/domains/middleware/skills-reminder.ts +31 -2
  386. package/src/domains/mux/detect.ts +3 -6
  387. package/src/domains/observability/accountability.ts +15 -1
  388. package/src/domains/observability/compaction-usage.ts +118 -0
  389. package/src/domains/observability/contract.ts +52 -7
  390. package/src/domains/observability/cost.ts +1 -1
  391. package/src/domains/observability/evidence-index.ts +10 -0
  392. package/src/domains/observability/extension.ts +15 -6
  393. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  394. package/src/domains/observability/projection.ts +394 -45
  395. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  396. package/src/domains/prompts/fragments/operating/contract.md +2 -0
  397. package/src/domains/prompts/fragments/wiki/page.md +8 -0
  398. package/src/domains/providers/contract.ts +4 -1
  399. package/src/domains/providers/extension.ts +40 -9
  400. package/src/domains/providers/model-capabilities.ts +9 -0
  401. package/src/domains/providers/model-discovery.ts +3 -4
  402. package/src/domains/providers/model-runtime-capabilities.ts +15 -5
  403. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +48 -26
  404. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  405. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  406. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  407. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  408. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  409. package/src/domains/providers/support.ts +11 -5
  410. package/src/domains/providers/target-model-cache.ts +25 -2
  411. package/src/domains/providers/types/capability-flags.ts +2 -0
  412. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  413. package/src/domains/providers/types/target-descriptor.ts +19 -0
  414. package/src/domains/resources/index.ts +3 -0
  415. package/src/domains/resources/skills/install.ts +72 -7
  416. package/src/domains/resources/skills/loader.ts +7 -0
  417. package/src/domains/resources/skills/marketplace.ts +63 -11
  418. package/src/domains/safety/action-classifier.ts +7 -0
  419. package/src/domains/safety/autonomy.ts +15 -0
  420. package/src/domains/safety/default-path-policy.ts +2 -0
  421. package/src/domains/safety/finish-contract-registration.ts +29 -14
  422. package/src/domains/safety/finish-contract.ts +252 -40
  423. package/src/domains/safety/index.ts +21 -1
  424. package/src/domains/safety/path-policy.ts +1 -1
  425. package/src/domains/safety/policy-engine.ts +60 -17
  426. package/src/domains/safety/protected-artifacts.ts +191 -88
  427. package/src/domains/safety/rigor.ts +53 -39
  428. package/src/domains/safety/run-effects.ts +2 -22
  429. package/src/domains/safety/skill-authority.ts +55 -0
  430. package/src/domains/safety/validation-contract.ts +388 -0
  431. package/src/domains/session/archive-readers.ts +10 -1
  432. package/src/domains/session/compaction/compact.ts +72 -22
  433. package/src/domains/session/decision-board.ts +101 -2
  434. package/src/domains/session/entries.ts +50 -7
  435. package/src/domains/session/extension.ts +4 -4
  436. package/src/domains/session/handoff.ts +2 -1
  437. package/src/domains/session/manager.ts +2 -3
  438. package/src/domains/session/task-board.ts +14 -1
  439. package/src/domains/session/tree/fork.ts +1 -2
  440. package/src/domains/session/tree/navigator.ts +1 -1
  441. package/src/domains/session/usage.ts +3 -3
  442. package/src/domains/user-tasks/acceptance.ts +56 -0
  443. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  444. package/src/domains/user-tasks/store.ts +34 -3
  445. package/src/engine/acp/adapter.ts +24 -6
  446. package/src/engine/acp/server.ts +21 -4
  447. package/src/engine/acp/transport.ts +53 -8
  448. package/src/engine/acp/types.ts +4 -0
  449. package/src/engine/agent.ts +13 -3
  450. package/src/engine/ai.ts +26 -8
  451. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  452. package/src/engine/api-registry.ts +3 -0
  453. package/src/engine/apis/ollama-native.ts +15 -0
  454. package/src/engine/apis/openai-completions.ts +117 -14
  455. package/src/engine/claude/subprocess-runtime.ts +107 -60
  456. package/src/engine/external-subprocess.ts +122 -6
  457. package/src/entry/background-model-metadata.ts +18 -0
  458. package/src/entry/compaction-prompt.ts +57 -0
  459. package/src/entry/orchestrator.ts +416 -218
  460. package/src/entry/task-memory-lifecycle.ts +35 -0
  461. package/src/interactive/chat-loop-messages.ts +13 -4
  462. package/src/interactive/chat-loop.ts +65 -2
  463. package/src/interactive/chat-renderer.ts +1 -0
  464. package/src/interactive/cost-overlay.ts +26 -2
  465. package/src/interactive/dispatch-board.ts +46 -717
  466. package/src/interactive/fleet-run-preview.ts +2 -1
  467. package/src/interactive/interactive-application.ts +3 -2
  468. package/src/interactive/interactive-presentation.ts +55 -12
  469. package/src/interactive/interactive-slash-runtime.ts +4 -2
  470. package/src/interactive/oracle.ts +5 -2
  471. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  472. package/src/interactive/overlays/message-picker.ts +2 -2
  473. package/src/interactive/overlays/settings.ts +2 -2
  474. package/src/interactive/overlays/tree-selector.ts +2 -2
  475. package/src/interactive/renderers/branch-summary.ts +1 -1
  476. package/src/interactive/renderers/worker-entry.ts +32 -0
  477. package/src/interactive/slash-autocomplete.ts +4 -6
  478. package/src/interactive/slash-commands.ts +49 -45
  479. package/src/interactive/slash-spec.ts +28 -0
  480. package/src/interactive/theme/labels.ts +19 -13
  481. package/src/interactive/turn-context.ts +9 -5
  482. package/src/interactive/turn-recovery.ts +8 -0
  483. package/src/interactive/turn-runtime.ts +27 -11
  484. package/src/interactive/turn-state.ts +7 -0
  485. package/src/interactive/view/artifacts.ts +2 -0
  486. package/src/interactive/worker-receipts.ts +1 -0
  487. package/src/interactive/worker-stream.ts +13 -4
  488. package/src/tools/bootstrap.ts +4 -0
  489. package/src/tools/builtin-tool-catalog.ts +31 -0
  490. package/src/tools/compete-worktrees.ts +7 -1
  491. package/src/tools/context/index.ts +30 -9
  492. package/src/tools/core-bootstrap.ts +16 -0
  493. package/src/tools/decide.ts +136 -0
  494. package/src/tools/dispatch-admission.ts +21 -0
  495. package/src/tools/dispatch-arguments.ts +1 -0
  496. package/src/tools/dispatch-event-text.ts +10 -0
  497. package/src/tools/dispatch-plan.ts +6 -2
  498. package/src/tools/dispatch-runner.ts +27 -1
  499. package/src/tools/dispatch-types.ts +6 -0
  500. package/src/tools/evidence.ts +96 -0
  501. package/src/tools/limitation.ts +76 -0
  502. package/src/tools/policy.ts +9 -0
  503. package/src/tools/presentation.ts +3 -0
  504. package/src/tools/registry.ts +11 -5
  505. package/src/tools/result-shaping.ts +17 -5
  506. package/src/tools/task-worktree.ts +13 -3
  507. package/src/tools/tasks.ts +10 -1
  508. package/src/tools/verify/authoring.ts +170 -83
  509. package/src/tools/verify/catalog.ts +122 -5
  510. package/src/tools/verify/index.ts +2 -1
  511. package/src/tools/verify/numeric.ts +298 -0
  512. package/src/tools/verify/perf.ts +143 -0
  513. package/src/tools/verify/scripts.ts +229 -2
  514. package/src/tools/worker-evidence.ts +3 -1
  515. package/src/worker/spec-contract.ts +4 -0
  516. package/dist/chunk-2Z2IKEXI.js +0 -1554
  517. package/dist/chunk-RVG5JXAL.js +0 -41
  518. package/dist/chunk-T56WDKA5.js +0 -183
  519. package/dist/chunk-VN3SHNBN.js +0 -313
  520. package/dist/chunk-VPKWYKEY.js +0 -169
  521. package/dist/reset-OAQP3W4O.js +0 -230
  522. package/dist/uninstall-N34PCTGJ.js +0 -331
  523. package/dist/upgrade-PXK3S2YM.js +0 -325
@@ -1,30 +1,34 @@
1
1
  import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
- import {
3
- loadProjectVerifierCatalog
4
- } from "./chunk-VN3SHNBN.js";
5
- import {
6
- pathBoundaryCovers,
7
- resolvePathBoundary
8
- } from "./chunk-HHV2GANA.js";
9
2
  import {
10
3
  classify
11
- } from "./chunk-PGF63K6I.js";
4
+ } from "./chunk-KFV5L5SK.js";
12
5
  import {
13
- artifactDefaultPath,
6
+ extractCommandCdTargets,
14
7
  extractCommandDeleteTargets,
15
8
  extractCommandWriteTargets,
16
9
  inlineShellScript,
17
- tokenizeShellLike
18
- } from "./chunk-IKOZFYBN.js";
10
+ invokesClioSkillMutation,
11
+ scanShellLike
12
+ } from "./chunk-NXYCB2VD.js";
19
13
  import {
20
14
  canonicalizeExistingPath
21
15
  } from "./chunk-ECH6PKUQ.js";
16
+ import {
17
+ loadProjectVerifierCatalog
18
+ } from "./chunk-DXKJURES.js";
19
+ import {
20
+ pathBoundaryCovers,
21
+ resolvePathBoundary
22
+ } from "./chunk-HHV2GANA.js";
23
+ import {
24
+ artifactDefaultPath
25
+ } from "./chunk-GYV6VZOC.js";
22
26
  import {
23
27
  ToolNames
24
- } from "./chunk-K6BSR66V.js";
28
+ } from "./chunk-4NSRCOYP.js";
25
29
  import {
26
30
  foreignAgentDirs
27
- } from "./chunk-IHXBNWMM.js";
31
+ } from "./chunk-KXDSS5WJ.js";
28
32
  import {
29
33
  resolvePackageRoot
30
34
  } from "./chunk-IWHMRKLL.js";
@@ -48,7 +52,7 @@ function isSameOrDescendant(candidatePath, policyPath) {
48
52
  const candidate = path.resolve(candidatePath);
49
53
  const policy = path.resolve(policyPath);
50
54
  const relative = path.relative(policy, candidate);
51
- return relative === "" || !relative.startsWith("..") && !path.isAbsolute(relative);
55
+ return relative === "" || relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
52
56
  }
53
57
  function expandTilde(rawPath) {
54
58
  if (rawPath === "~") return homedir();
@@ -145,7 +149,7 @@ function normalizeSeparators(value) {
145
149
  // src/domains/safety/policy-engine.ts
146
150
  init_esm_shims();
147
151
  import { createHash as createHash2 } from "node:crypto";
148
- import path3 from "node:path";
152
+ import path4 from "node:path";
149
153
 
150
154
  // src/domains/safety/default-path-policy.ts
151
155
  init_esm_shims();
@@ -208,8 +212,10 @@ var DEFAULT_DAMAGE_CONTROL_PATH_POLICY = {
208
212
  // widen its own permissions in two tool calls. Both are authored by the
209
213
  // operator through the CLI (`clio-coder verifiers author` lands nothing
210
214
  // before `--yes`), so model-side writes and deletes are refused.
215
+ // Skills also refuse model-side writes and deletes; installs go through `clio-coder skills install`.
211
216
  ".clio-coder/safety.yaml",
212
217
  ".clio-coder/verifiers.yaml",
218
+ ".clio-coder/skills/",
213
219
  "/etc/",
214
220
  "/usr/",
215
221
  "/bin/",
@@ -730,6 +736,42 @@ function getCachedDefaultRulePacks() {
730
736
  return cachedPacks;
731
737
  }
732
738
 
739
+ // src/domains/safety/skill-authority.ts
740
+ init_esm_shims();
741
+ import { homedir as homedir2 } from "node:os";
742
+ import path3 from "node:path";
743
+ function activeClioSkillRoots(cwd) {
744
+ return [path3.join(cwd, ".clio-coder", "skills"), path3.join(clioConfigDir(), "skills")];
745
+ }
746
+ function skillMutationReason(roots, targets, cwd, command) {
747
+ const workingDirs = [cwd];
748
+ if (command !== null) {
749
+ for (const destination of extractCommandCdTargets(command)) {
750
+ workingDirs.push(path3.resolve(workingDirs.at(-1) ?? cwd, expandHome(destination)));
751
+ }
752
+ }
753
+ for (const target of targets) {
754
+ if (target.operation === "read") continue;
755
+ for (const directory of workingDirs) {
756
+ const lexical = path3.resolve(directory, expandHome(target.path));
757
+ const resolved = canonicalizeExistingPath(lexical);
758
+ for (const root of roots) {
759
+ for (const boundary of [root, canonicalizeExistingPath(root)]) {
760
+ for (const candidate of [lexical, resolved]) {
761
+ if (isSameOrDescendant(candidate, boundary) || target.operation === "delete" && isSameOrDescendant(boundary, candidate)) {
762
+ return `active skill tree ${root} is operator-owned; draft changes outside active skill roots and ask the operator to install or update them`;
763
+ }
764
+ }
765
+ }
766
+ }
767
+ }
768
+ }
769
+ return null;
770
+ }
771
+ function expandHome(value) {
772
+ return value === "~" ? homedir2() : value.startsWith("~/") ? path3.join(homedir2(), value.slice(2)) : value;
773
+ }
774
+
733
775
  // src/domains/safety/policy-engine.ts
734
776
  var BUILTIN_ALLOWLIST = [
735
777
  { id: "builtin:pwd", re: /^pwd$/ },
@@ -771,19 +813,23 @@ function evaluateWriteRoots(roots, writeRootCwd, call) {
771
813
  if (roots.length === 0) return null;
772
814
  const target = writeRootTargetPath(call);
773
815
  if (target === null) return null;
774
- const resolved = path3.resolve(writeRootCwd, target);
816
+ const resolved = path4.resolve(writeRootCwd, target);
775
817
  if (pathBoundaryCovers(roots, resolved)) return null;
776
818
  return `write target '${target}' resolves to '${resolved}', which is outside the permitted write roots for this run: ${roots.join(", ")}`;
777
819
  }
778
820
  function createSafetyPolicyEngine(options = {}) {
779
- const cwd = canonicalizeExistingPath(path3.resolve(options.cwd ?? process.cwd()));
780
- const writeRootCwd = path3.resolve(options.cwd ?? process.cwd());
821
+ const cwd = canonicalizeExistingPath(path4.resolve(options.cwd ?? process.cwd()));
822
+ const writeRootCwd = path4.resolve(options.cwd ?? process.cwd());
781
823
  const writeRoots = (options.writeRoots ?? []).map((root) => resolvePathBoundary(writeRootCwd, root));
824
+ const skillRoots = activeClioSkillRoots(cwd);
782
825
  const packs = options.rulePacks ?? getCachedDefaultRulePacks();
783
826
  const projectPolicy = options.projectPolicy ?? loadProjectSafetyPolicy(cwd);
784
- const projectPolicyRoot = projectPolicy.path === null ? cwd : path3.dirname(path3.dirname(canonicalizeExistingPath(projectPolicy.path)));
827
+ const projectPolicyRoot = projectPolicy.path === null ? cwd : path4.dirname(path4.dirname(canonicalizeExistingPath(projectPolicy.path)));
785
828
  const pathPolicyInput = projectPolicy.disableDefaultPathPolicy ? projectPolicy.pathPolicy : mergePathPolicyInputs(DEFAULT_DAMAGE_CONTROL_PATH_POLICY, projectPolicy.pathPolicy);
786
- const expandedDefaults = projectPolicy.disableDefaultPathPolicy ? pathPolicyInput : mergePathPolicyInputs(pathPolicyInput, { zeroAccessPaths: clioCredentialStorePaths() });
829
+ const expandedDefaults = projectPolicy.disableDefaultPathPolicy ? pathPolicyInput : mergePathPolicyInputs(pathPolicyInput, {
830
+ zeroAccessPaths: clioCredentialStorePaths(),
831
+ readOnlyPaths: clioSkillsRootPaths()
832
+ });
787
833
  const pathPolicy = compilePathPolicy(expandedDefaults, projectPolicyRoot);
788
834
  const zeroAccessPolicy = {
789
835
  root: pathPolicy.root,
@@ -843,6 +889,21 @@ function createSafetyPolicyEngine(options = {}) {
843
889
  if (projectPolicy.path !== null) blockInput.projectPolicyPath = projectPolicy.path;
844
890
  return blockDecision(base, blockInput);
845
891
  }
892
+ const mutationCommand = call.tool === ToolNames.Bash ? command : catalogCommand;
893
+ const skillReason = mutationCommand !== null && invokesClioSkillMutation(mutationCommand) ? "skill installation and updates require the operator CLI or an explicit operator install choice; draft outside active skill roots" : skillMutationReason(
894
+ skillRoots,
895
+ pathPolicyTargets(catalogCommand === null ? call : { tool: ToolNames.Bash, args: { command: catalogCommand } }),
896
+ callCwd,
897
+ mutationCommand
898
+ );
899
+ if (skillReason !== null) {
900
+ return blockDecision(base, {
901
+ ruleId: "skill-authority",
902
+ reasonCode: "skill-authority",
903
+ reasons: [skillReason],
904
+ policySource: "builtin-classifier"
905
+ });
906
+ }
846
907
  const pathBlock = evaluateProjectPathPolicy(pathPolicy, call, callCwd);
847
908
  if (pathBlock !== null) {
848
909
  const blockInput = {
@@ -940,7 +1001,14 @@ function createSafetyPolicyEngine(options = {}) {
940
1001
  }
941
1002
  function clioCredentialStorePaths() {
942
1003
  try {
943
- return [path3.join(clioConfigDir(), "credentials.yaml")];
1004
+ return [path4.join(clioConfigDir(), "credentials.yaml")];
1005
+ } catch {
1006
+ return [];
1007
+ }
1008
+ }
1009
+ function clioSkillsRootPaths() {
1010
+ try {
1011
+ return [path4.join(clioConfigDir(), "skills")];
944
1012
  } catch {
945
1013
  return [];
946
1014
  }
@@ -962,10 +1030,10 @@ function stripQuotes(token) {
962
1030
  }
963
1031
  function bashPathTokenCandidates(command) {
964
1032
  const candidates = [];
965
- for (const token of tokenizeShellLike(command)) {
1033
+ for (const scanned of scanShellLike(command)) {
1034
+ if (scanned.operator) continue;
1035
+ const token = scanned.value;
966
1036
  if (token.length === 0) continue;
967
- if (token === ";" || token === "&&" || token === "||" || token === "|" || token === ">" || token === ">>") continue;
968
- if (token === "<" || token === "<<") continue;
969
1037
  if (/\s/.test(token)) continue;
970
1038
  if (token.startsWith("-") && !token.includes("/") && !token.includes("=")) continue;
971
1039
  candidates.push(token);
@@ -1205,29 +1273,28 @@ function effectiveClassification(classification, match) {
1205
1273
  }
1206
1274
  function matchingProjectCommand(policy, command, cwd) {
1207
1275
  if (!policy.valid || policy.path === null) return null;
1208
- const policyRoot = path3.dirname(path3.dirname(policy.path));
1276
+ const policyRoot = path4.dirname(path4.dirname(policy.path));
1209
1277
  for (const entry of policy.commands) {
1210
1278
  if (entry.command !== command) continue;
1211
1279
  if (entry.shellOperators === "deny" && hasShellOperators(command)) continue;
1212
- const allowedCwd = entry.cwd !== void 0 ? path3.resolve(policyRoot, entry.cwd) : policyRoot;
1280
+ const allowedCwd = entry.cwd !== void 0 ? path4.resolve(policyRoot, entry.cwd) : policyRoot;
1213
1281
  if (!isUnderOrSame(cwd, allowedCwd)) continue;
1214
1282
  return entry;
1215
1283
  }
1216
1284
  return null;
1217
1285
  }
1218
- var CHAIN_BREAKING_TOKENS = /* @__PURE__ */ new Set([";", "|", "||", ">", ">>", "<", "<<"]);
1219
1286
  var CHAIN_MAX_SEGMENTS = 6;
1220
1287
  function recognizeCommandChain(command, callCwd, workspaceRoot, policy) {
1221
1288
  const segments = [];
1222
1289
  let current = [];
1223
- for (const token of tokenizeShellLike(command)) {
1224
- if (token === "&&") {
1290
+ for (const token of scanShellLike(command)) {
1291
+ if (token.operator && token.value === "&&") {
1225
1292
  segments.push(current);
1226
1293
  current = [];
1227
1294
  continue;
1228
1295
  }
1229
- if (CHAIN_BREAKING_TOKENS.has(token)) return null;
1230
- current.push(token);
1296
+ if (token.operator) return null;
1297
+ current.push(token.value);
1231
1298
  }
1232
1299
  segments.push(current);
1233
1300
  if (segments.length < 2 || segments.length > CHAIN_MAX_SEGMENTS) return null;
@@ -1238,7 +1305,7 @@ function recognizeCommandChain(command, callCwd, workspaceRoot, policy) {
1238
1305
  if (segment[0] === "cd") {
1239
1306
  if (segment.length !== 2) return null;
1240
1307
  const target = segment[1] ?? "";
1241
- if (target.startsWith("~") || !isUnderOrSame(path3.resolve(callCwd, target), workspaceRoot)) return null;
1308
+ if (target.startsWith("~") || !isUnderOrSame(path4.resolve(callCwd, target), workspaceRoot)) return null;
1242
1309
  ruleIds.push("builtin:cd-workspace");
1243
1310
  continue;
1244
1311
  }
@@ -1265,11 +1332,11 @@ function hasShellOperators(command) {
1265
1332
  return hasSequencingOperators(command) || hasCommandSubstitution(command);
1266
1333
  }
1267
1334
  function isUnderOrSame(child, parent) {
1268
- const rel = path3.relative(
1269
- canonicalizeExistingPath(path3.resolve(parent)),
1270
- canonicalizeExistingPath(path3.resolve(child))
1335
+ const rel = path4.relative(
1336
+ canonicalizeExistingPath(path4.resolve(parent)),
1337
+ canonicalizeExistingPath(path4.resolve(child))
1271
1338
  );
1272
- return rel === "" || !rel.startsWith("..") && !path3.isAbsolute(rel);
1339
+ return rel === "" || !rel.startsWith("..") && !path4.isAbsolute(rel);
1273
1340
  }
1274
1341
  function commandArg(args) {
1275
1342
  return typeof args?.command === "string" ? args.command : null;
@@ -1280,10 +1347,16 @@ function pathArg(args) {
1280
1347
  return typeof candidate === "string" && candidate.length > 0 ? candidate : null;
1281
1348
  }
1282
1349
  function cwdArg(args, fallback) {
1283
- const resolved = typeof args?.cwd === "string" && args.cwd.length > 0 ? path3.resolve(fallback, args.cwd) : fallback;
1350
+ const resolved = typeof args?.cwd === "string" && args.cwd.length > 0 ? path4.resolve(fallback, args.cwd) : fallback;
1284
1351
  return canonicalizeExistingPath(resolved);
1285
1352
  }
1286
- var CONTENT_BEARING_TOOLS = /* @__PURE__ */ new Set([ToolNames.Write, ToolNames.Edit, ToolNames.Artifact]);
1353
+ var CONTENT_BEARING_TOOLS = /* @__PURE__ */ new Set([
1354
+ ToolNames.Write,
1355
+ ToolNames.Edit,
1356
+ ToolNames.Artifact,
1357
+ ToolNames.Dispatch,
1358
+ ToolNames.Tasks
1359
+ ]);
1287
1360
  function damageControlScan(call) {
1288
1361
  if (!CONTENT_BEARING_TOOLS.has(call.tool)) return serializeArgs(call.args);
1289
1362
  const pathArg2 = call.args?.path;
@@ -1340,4 +1413,4 @@ export {
1340
1413
  WRITE_ROOT_REFUSED_TOOLS,
1341
1414
  createSafetyPolicyEngine
1342
1415
  };
1343
- //# sourceMappingURL=chunk-FVDGR2ZL.js.map
1416
+ //# sourceMappingURL=chunk-6Q3CYFD3.js.map
@@ -4,33 +4,27 @@ import {
4
4
  extractCommandDeleteTargets,
5
5
  extractCommandWriteTargets,
6
6
  toolMutationPaths
7
- } from "./chunk-IKOZFYBN.js";
7
+ } from "./chunk-NXYCB2VD.js";
8
+ import {
9
+ PROJECT_VERIFIER_CATALOG_RELATIVE_PATH
10
+ } from "./chunk-DXKJURES.js";
8
11
  import {
9
12
  isProjectVerifierCheckId,
10
13
  isVerificationScriptName
11
14
  } from "./chunk-UL3WSD3F.js";
12
15
  import {
13
16
  ToolNames
14
- } from "./chunk-K6BSR66V.js";
17
+ } from "./chunk-4NSRCOYP.js";
15
18
  import {
16
19
  init_esm_shims
17
20
  } from "./chunk-3R73A4XB.js";
18
21
 
19
22
  // src/domains/safety/finish-contract.ts
20
23
  init_esm_shims();
21
- var FINISH_CONTRACT_ADVISORY_MESSAGE = "[Clio Coder] finish-contract advisory: you changed files this turn without recording validation evidence or an explicit limitation. Run a verification command or state what could not be verified.";
24
+ import { resolve } from "node:path";
25
+ var FINISH_CONTRACT_ADVISORY_MESSAGE = "[Clio Coder] finish-contract advisory: you changed files this turn without recording validation evidence or a limitation receipt. Run a verification command or call limitation with the scope and reason.";
22
26
  var DEFAULT_RECENT_ENTRY_LIMIT = 80;
23
- var LIMITATION_PATTERNS = [
24
- /\b(?:blocked by|blocker|blockers|unable to|not able to|could not|couldn't|cannot|can't)\b/i,
25
- /\b(?:did not|didn't|have not|haven't|has not|hasn't|was not able|wasn't able)\b/i,
26
- /\b(?:not complete|incomplete)\b/i,
27
- /\b(?:not|un)(?:\s|-)?(?:validated|verified|tested)\b/i,
28
- /^\s*Tests\s*:\s*(?:not run|not executed|not available|failed|blocked|skipped)\b/im,
29
- /^\s*Known gaps?\s*:\s*(?!\s*(?:none|no\b|n\/a|not applicable)\b).+/im,
30
- /\bremaining(?:\s+\w+){0,3}\s+(?:work|issue|issues|gap|gaps|blocker|blockers)\b/i
31
- ];
32
27
  function assessFinishContract(input) {
33
- const assistantText = input.assistantText.trim();
34
28
  const sessionEntries = input.sessionEntries ?? [];
35
29
  const assistantTurnId = input.assistantTurnId ?? null;
36
30
  const window = recentEntries(sessionEntries, assistantTurnId, input.recentEntryLimit ?? DEFAULT_RECENT_ENTRY_LIMIT);
@@ -38,12 +32,38 @@ function assessFinishContract(input) {
38
32
  if (mutatedPaths.length === 0) {
39
33
  return { kind: "ok", reason: "no_mutation", evidence: [], mutatedPaths };
40
34
  }
41
- const evidence = collectValidationEvidence(window);
35
+ const acceptanceChecks = new Set(input.activeAcceptance?.verification.map((item) => item.check) ?? []);
36
+ const evidence = collectValidationEvidence(window, acceptanceChecks, input.workspaceRoot);
37
+ const limitations = collectLimitationEvidence(window);
38
+ const required = input.rigor === "high" ? input.activeAcceptance?.verification ?? [] : [];
39
+ if (required.length > 0) {
40
+ const passes = new Set(
41
+ required.filter((check) => evidence.some((item) => acceptanceCheckPassed(item, check, input.workspaceRoot)))
42
+ );
43
+ const limited = new Set(limitations.flatMap((item) => item.paths ?? []));
44
+ const missing = [
45
+ ...new Set(required.filter((check) => !passes.has(check) && !limited.has(check.check)).map((item) => item.check))
46
+ ];
47
+ if (missing.length > 0)
48
+ return {
49
+ kind: "engage",
50
+ reason: "unvalidated_mutation",
51
+ message: `[Clio Coder] high-rigor finish gate: operator acceptance still requires passing validation for: ${missing.join(", ")}. Run each named check or include its exact id in limitation.paths.`,
52
+ evidence: [...evidence, ...limitations],
53
+ mutatedPaths
54
+ };
55
+ return {
56
+ kind: "ok",
57
+ reason: passes.size === required.length ? "validation_evidence" : "explicit_limitation",
58
+ evidence: [...evidence, ...limitations],
59
+ mutatedPaths
60
+ };
61
+ }
42
62
  if (evidence.length > 0) {
43
63
  return { kind: "ok", reason: "validation_evidence", evidence, mutatedPaths };
44
64
  }
45
- if (hasExplicitLimitation(assistantText)) {
46
- return { kind: "ok", reason: "explicit_limitation", evidence: [], mutatedPaths };
65
+ if (limitations.length > 0) {
66
+ return { kind: "ok", reason: "explicit_limitation", evidence: limitations, mutatedPaths };
47
67
  }
48
68
  return {
49
69
  kind: "engage",
@@ -53,10 +73,59 @@ function assessFinishContract(input) {
53
73
  mutatedPaths
54
74
  };
55
75
  }
56
- function hasExplicitLimitation(text) {
57
- const normalized = text.trim();
58
- if (normalized.length === 0) return false;
59
- return LIMITATION_PATTERNS.some((pattern) => pattern.test(normalized));
76
+ function acceptanceCheckPassed(evidence, required, workspaceRoot) {
77
+ if (evidence.kind !== "validation_command" || evidence.check !== required.check || !workspaceRoot || !evidence.source)
78
+ return false;
79
+ if (evidence.durationMs !== void 0 && evidence.durationMs > required.timeoutMs) return false;
80
+ const root = resolve(workspaceRoot);
81
+ if (evidence.source.kind === "project-catalog")
82
+ return evidence.source.path === resolve(root, PROJECT_VERIFIER_CATALOG_RELATIVE_PATH);
83
+ return evidence.source.path === resolve(root, "package.json") && evidence.cwd === root && validationCheckId(evidence.argv?.join(" ") ?? "") === required.check;
84
+ }
85
+ function collectLimitationEvidence(recent) {
86
+ const evidence = [];
87
+ const calls = /* @__PURE__ */ new Map();
88
+ const seen = /* @__PURE__ */ new Set();
89
+ for (const entry of recent) {
90
+ const call = limitationToolCall(entry);
91
+ if (call !== null) {
92
+ calls.set(call.toolCallId, call);
93
+ continue;
94
+ }
95
+ const resultId = successfulToolResultId(entry);
96
+ if (resultId === null) continue;
97
+ const candidate = calls.get(resultId);
98
+ if (candidate === void 0) continue;
99
+ const item = {
100
+ kind: "limitation",
101
+ summary: candidate.command,
102
+ ...candidate.paths ? { paths: candidate.paths } : {}
103
+ };
104
+ if (candidate.turnId !== void 0) item.turnId = candidate.turnId;
105
+ pushEvidence(evidence, seen, item);
106
+ }
107
+ return evidence;
108
+ }
109
+ function limitationToolCall(entry) {
110
+ const record = asRecord(entry);
111
+ if (record?.kind !== "message" || record.role !== "tool_call") return null;
112
+ const payload = asRecord(record.payload);
113
+ if (payload === null) return null;
114
+ const toolName = stringFromFirst(payload, ["name", "toolName", "tool"]);
115
+ if (toolName !== ToolNames.Limitation) return null;
116
+ const toolCallId = stringFromFirst(payload, ["toolCallId", "tool_call_id", "id"]) ?? turnIdOf(entry);
117
+ if (toolCallId === null) return null;
118
+ const args = asRecord(payload.args ?? payload.arguments ?? payload.input);
119
+ const scope = typeof args?.scope === "string" ? args.scope.trim() : "";
120
+ const reason = typeof args?.reason === "string" ? args.reason.trim() : "";
121
+ const candidate = {
122
+ toolCallId,
123
+ paths: Array.isArray(args?.paths) ? args.paths.filter((item) => typeof item === "string").map((item) => item.trim()) : [],
124
+ command: `limitation recorded: ${scope.length > 0 ? scope : "unspecified"} (reason=${reason.length > 0 ? reason : "unspecified"})`
125
+ };
126
+ const turnId = turnIdOf(entry);
127
+ if (turnId !== null) candidate.turnId = turnId;
128
+ return candidate;
60
129
  }
61
130
  function mutatingReceipts(recent) {
62
131
  const mutationCalls = /* @__PURE__ */ new Map();
@@ -117,7 +186,7 @@ function pushPath(paths, seen, path) {
117
186
  seen.add(path);
118
187
  paths.push(path);
119
188
  }
120
- function collectValidationEvidence(recent) {
189
+ function collectValidationEvidence(recent, acceptanceChecks, workspaceRoot) {
121
190
  const evidence = [];
122
191
  const toolCalls = /* @__PURE__ */ new Map();
123
192
  const dispatchCalls = /* @__PURE__ */ new Map();
@@ -128,7 +197,7 @@ function collectValidationEvidence(recent) {
128
197
  pushEvidence(evidence, seen, protectedArtifact);
129
198
  continue;
130
199
  }
131
- const call = bashValidationCall(entry);
200
+ const call = bashValidationCall(entry, acceptanceChecks, workspaceRoot);
132
201
  if (call !== null) {
133
202
  toolCalls.set(call.toolCallId, call);
134
203
  continue;
@@ -153,11 +222,11 @@ function collectValidationEvidence(recent) {
153
222
  }
154
223
  const candidate = toolCalls.get(resultId);
155
224
  if (candidate !== void 0) {
156
- pushEvidence(evidence, seen, validationEvidence(candidate));
225
+ pushEvidence(evidence, seen, validationEvidence(candidate, entry));
157
226
  }
158
227
  continue;
159
228
  }
160
- const bashExecution = bashExecutionEvidence(entry);
229
+ const bashExecution = bashExecutionEvidence(entry, acceptanceChecks, workspaceRoot);
161
230
  if (bashExecution !== null) pushEvidence(evidence, seen, bashExecution);
162
231
  }
163
232
  return evidence;
@@ -175,7 +244,7 @@ function recentEntries(entries, assistantTurnId, recentEntryLimit) {
175
244
  }
176
245
  return entries.slice(startInclusive, endExclusive);
177
246
  }
178
- function bashValidationCall(entry) {
247
+ function bashValidationCall(entry, acceptanceChecks, workspaceRoot) {
179
248
  const record = asRecord(entry);
180
249
  if (record?.kind !== "message" || record.role !== "tool_call") return null;
181
250
  const payload = asRecord(record.payload);
@@ -185,13 +254,15 @@ function bashValidationCall(entry) {
185
254
  const args = asRecord(payload.args ?? payload.arguments ?? payload.input);
186
255
  const command = typeof args?.command === "string" ? args.command : null;
187
256
  if (command === null) return null;
188
- const detected = detectValidationCommand(command);
257
+ const detected = acceptanceValidationCommand(command, acceptanceChecks);
189
258
  if (detected.kind !== "validation") return null;
190
259
  const toolCallId = stringFromFirst(payload, ["toolCallId", "tool_call_id", "id"]) ?? turnIdOf(entry);
191
260
  if (toolCallId === null) return null;
192
261
  const candidate = {
193
262
  toolCallId,
194
- command: detected.matched
263
+ command: detected.matched,
264
+ ...validationCheckFields(detected.matched),
265
+ execution: packageCommandExecution(command, args?.cwd, workspaceRoot)
195
266
  };
196
267
  const turnId = turnIdOf(entry);
197
268
  if (turnId !== null) candidate.turnId = turnId;
@@ -245,7 +316,8 @@ function validationToolCall(entry) {
245
316
  if (toolCallId === null) return null;
246
317
  const candidate = {
247
318
  toolCallId,
248
- command: summary
319
+ command: summary,
320
+ ...validationCheckFields(summary)
249
321
  };
250
322
  const turnId = turnIdOf(entry);
251
323
  if (turnId !== null) candidate.turnId = turnId;
@@ -273,7 +345,8 @@ function successfulToolResultId(entry) {
273
345
  if (payload.isError === true || payload.error === true) return null;
274
346
  const result = asRecord(payload.result);
275
347
  const details = asRecord(result?.details);
276
- if (details?.kind === "error") return null;
348
+ if (result?.kind === "error" || details?.kind === "error") return null;
349
+ if (typeof details?.exitCode === "number" && details.exitCode !== 0) return null;
277
350
  return stringFromFirst(payload, ["toolCallId", "tool_call_id", "id"]);
278
351
  }
279
352
  function dispatchReceiptEvidence(entry, candidate) {
@@ -318,18 +391,20 @@ function dispatchReceiptAgentId(receiptAgentId, candidate) {
318
391
  if (receiptAgentId !== void 0 && receiptAgentId.length > 0) return receiptAgentId;
319
392
  return candidate?.command.match(/^agent=([^\s]+)/)?.[1] ?? "unknown";
320
393
  }
321
- function bashExecutionEvidence(entry) {
394
+ function bashExecutionEvidence(entry, acceptanceChecks, workspaceRoot) {
322
395
  const record = asRecord(entry);
323
396
  if (record?.kind !== "bashExecution") return null;
324
397
  if (typeof record.command !== "string") return null;
325
398
  if (record.cancelled === true) return null;
326
399
  if (record.exitCode !== 0) return null;
327
- const detected = detectValidationCommand(record.command);
400
+ const detected = acceptanceValidationCommand(record.command, acceptanceChecks);
328
401
  if (detected.kind !== "validation") return null;
329
402
  const contextMarker = record.excludeFromContext === true ? " [not sent to model]" : "";
330
403
  const evidence = {
331
404
  kind: "validation_command",
332
- summary: `validation command passed: ${detected.matched}${contextMarker}`
405
+ summary: `validation command passed: ${detected.matched}${contextMarker}`,
406
+ ...validationCheckFields(detected.matched),
407
+ ...packageCommandExecution(record.command, record.cwd, workspaceRoot)
333
408
  };
334
409
  const turnId = turnIdOf(entry);
335
410
  if (turnId !== null) evidence.turnId = turnId;
@@ -349,16 +424,46 @@ function protectedArtifactEvidence(entry) {
349
424
  if (turnId !== null) evidence.turnId = turnId;
350
425
  return evidence;
351
426
  }
352
- function validationEvidence(candidate) {
427
+ function validationEvidence(candidate, entry) {
353
428
  const evidence = {
354
429
  kind: "validation_command",
355
- summary: `validation command passed: ${candidate.command}`
430
+ summary: `validation command passed: ${candidate.command}`,
431
+ ...candidate.check ? { check: candidate.check } : {},
432
+ ...candidate.execution ?? declaredCheckExecution(entry, candidate.check)
356
433
  };
357
434
  if (candidate.turnId !== void 0) evidence.turnId = candidate.turnId;
358
435
  return evidence;
359
436
  }
437
+ function declaredCheckExecution(entry, check) {
438
+ const payload = asRecord(asRecord(entry)?.payload);
439
+ const details = asRecord(asRecord(payload?.result)?.details);
440
+ const source = asRecord(details?.source);
441
+ if (!details || details.check !== check || details.exitCode !== 0 || details.aborted === true || details.timedOut === true || details.outputCapped === true || source?.kind !== "package.json" && source?.kind !== "project-catalog" || typeof source.path !== "string" || typeof details.cwd !== "string" || !Array.isArray(details.argv) || !details.argv.every((arg) => typeof arg === "string"))
442
+ return {};
443
+ if (source.kind === "project-catalog") {
444
+ const argv = details.argv;
445
+ if (!Array.isArray(details.declaredCommand) || details.declaredCommand.length !== details.argv.length || !details.declaredCommand.every((arg, index) => arg === argv[index]) || typeof details.declaredCwd !== "string" || typeof details.declaredTimeoutMs !== "number" || typeof details.durationMs !== "number" || details.durationMs > details.declaredTimeoutMs || resolve(source.path, "../..", details.declaredCwd) !== details.cwd)
446
+ return {};
447
+ }
448
+ return {
449
+ source: { kind: source.kind, path: source.path },
450
+ cwd: details.cwd,
451
+ argv: details.argv,
452
+ ...typeof details.durationMs === "number" ? { durationMs: details.durationMs } : {}
453
+ };
454
+ }
455
+ function packageCommandExecution(command, cwd, workspaceRoot) {
456
+ if (!workspaceRoot || !/^(?:npm|pnpm|yarn|bun) /u.test(command.trim()) || validationCheckId(command.trim()) === void 0)
457
+ return {};
458
+ const executionCwd = resolve(workspaceRoot, typeof cwd === "string" ? cwd : ".");
459
+ return {
460
+ source: { kind: "package.json", path: resolve(executionCwd, "package.json") },
461
+ cwd: executionCwd,
462
+ argv: command.trim().split(/\s+/u)
463
+ };
464
+ }
360
465
  function pushEvidence(evidence, seen, item) {
361
- const key = `${item.kind}\0${item.summary}\0${item.turnId ?? ""}`;
466
+ const key = JSON.stringify(item);
362
467
  if (seen.has(key)) return;
363
468
  seen.add(key);
364
469
  evidence.push(item);
@@ -383,6 +488,19 @@ function stringFromFirst(record, keys) {
383
488
  function asRecord(value) {
384
489
  return value !== null && typeof value === "object" ? value : null;
385
490
  }
491
+ function validationCheckId(command) {
492
+ return /^(?:npm|pnpm|yarn|bun) (?:run )?([a-z0-9][a-z0-9._:-]*)$/.exec(command)?.[1] ?? /^verify ([a-z0-9][a-z0-9._:-]*)$/.exec(command)?.[1];
493
+ }
494
+ function validationCheckFields(command) {
495
+ const check = validationCheckId(command);
496
+ return check ? { check } : {};
497
+ }
498
+ function acceptanceValidationCommand(command, checks) {
499
+ const exact = command.trim();
500
+ const check = /^npm run ([a-z0-9][a-z0-9._:-]*)$/.exec(exact)?.[1];
501
+ if (check && checks.has(check)) return { kind: "validation", matched: exact };
502
+ return detectValidationCommand(command);
503
+ }
386
504
 
387
505
  // src/domains/safety/loop-detector.ts
388
506
  init_esm_shims();
@@ -487,6 +605,7 @@ export {
487
605
  observe,
488
606
  DEFAULT_RECENT_ENTRY_LIMIT,
489
607
  assessFinishContract,
608
+ recentEntries,
490
609
  typedValidationSummary
491
610
  };
492
- //# sourceMappingURL=chunk-IDNA72AH.js.map
611
+ //# sourceMappingURL=chunk-6QOTUPRG.js.map
@@ -5,13 +5,13 @@ import {
5
5
  import {
6
6
  probeWorkspace
7
7
  } from "./chunk-HVDIIIQW.js";
8
+ import {
9
+ protectArtifact
10
+ } from "./chunk-NXYCB2VD.js";
8
11
  import {
9
12
  isSessionEntry,
10
13
  isSessionHeader
11
- } from "./chunk-FSP7CMNU.js";
12
- import {
13
- protectArtifact
14
- } from "./chunk-IKOZFYBN.js";
14
+ } from "./chunk-54X7T7DK.js";
15
15
  import {
16
16
  stripTokenizerSentinels
17
17
  } from "./chunk-CFGTUFWB.js";
@@ -26,7 +26,7 @@ import {
26
26
  readSessionMeta,
27
27
  resumeSession,
28
28
  sessionPaths
29
- } from "./chunk-MQXIVJ35.js";
29
+ } from "./chunk-HAXOFFRH.js";
30
30
  import {
31
31
  BusChannels
32
32
  } from "./chunk-F4EKGO4N.js";
@@ -1243,9 +1243,9 @@ function ledgerUsageCalls(entries, defaults = {}) {
1243
1243
  const usage2 = entry.usage;
1244
1244
  if (!usage2 || usage2.totalTokens <= 0) continue;
1245
1245
  calls.push({
1246
- providerId: currentTarget ?? "unknown",
1247
- attributedModelId: currentModel ?? "unknown",
1248
- requestedModelId: currentModel ?? "unknown",
1246
+ providerId: usage2.targetId ?? currentTarget ?? "unknown",
1247
+ attributedModelId: usage2.modelId ?? currentModel ?? "unknown",
1248
+ requestedModelId: usage2.modelId ?? currentModel ?? "unknown",
1249
1249
  responseModelIdObservation: { state: "not-observed" },
1250
1250
  input: usage2.input,
1251
1251
  output: usage2.output,
@@ -1400,7 +1400,13 @@ async function readSessionEntriesForId(stateDir, sessionId) {
1400
1400
  return { entries: [], missing: false, errors: [`${currentPath}: ${err.message ?? String(err)}`] };
1401
1401
  }
1402
1402
  }
1403
- return parseSessionEntries(raw, source);
1403
+ const result = parseSessionEntries(raw, source);
1404
+ try {
1405
+ const meta = JSON.parse(await readFile(join3(root, cwdHash2, sessionId, "meta.json"), "utf8"));
1406
+ if (isRecord(meta) && typeof meta.pinnedLeafTurnId === "string") result.leafTurnId = meta.pinnedLeafTurnId;
1407
+ } catch {
1408
+ }
1409
+ return result;
1404
1410
  }
1405
1411
  return { entries: [], missing: true, errors: [] };
1406
1412
  }
@@ -1481,4 +1487,4 @@ export {
1481
1487
  ledgerUsageCalls,
1482
1488
  SessionDomainModule
1483
1489
  };
1484
- //# sourceMappingURL=chunk-X7IARSHT.js.map
1490
+ //# sourceMappingURL=chunk-6UINWWS6.js.map