@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
@@ -18,7 +18,12 @@ import {
18
18
  import { wallTimeMetric } from "../metrics/latency.js";
19
19
  import { tokenAccountingFrom } from "../metrics/tokens.js";
20
20
  import { zeroToolCallMetrics } from "../metrics/tool-calls.js";
21
- import { buildEvalTrackedMetrics, emptyEvalTrackedMetrics, readEvalLedgerSnapshot } from "../metrics/tracked.js";
21
+ import {
22
+ buildEvalTrackedMetrics,
23
+ emptyEvalTrackedMetrics,
24
+ readEvalLedgerSnapshot,
25
+ selectEvalLedgerEntries,
26
+ } from "../metrics/tracked.js";
22
27
  import {
23
28
  type EvalServingObservation,
24
29
  evalClioProvenance,
@@ -234,11 +239,27 @@ async function runMatrixItem(
234
239
  },
235
240
  };
236
241
  const snapshot = await readEvalLedgerSnapshot(stateDir);
237
- const ledgerEntries = [...snapshot.entries, ...(runner.ledgerEntries ?? [])];
242
+ const selected = selectEvalLedgerEntries(snapshot.entries, runner.ledgerEntries ?? []);
243
+ result.artifacts.trackedMetricSources = JSON.stringify({
244
+ assistantCalls: selected.source,
245
+ sessionCalls: selected.sessionCalls,
246
+ streamCalls: selected.streamCalls,
247
+ compactions: "session",
248
+ });
249
+ if (selected.sessionCalls > 0 && selected.streamCalls > 0) {
250
+ // Preserve the unmerged evidence for opaque runners too. The native
251
+ // runner already publishes this artifact before stdout truncation.
252
+ result.artifacts.callLedger ??= JSON.stringify(runner.ledgerEntries);
253
+ if (selected.sessionCalls !== selected.streamCalls || task.runner.kind === "external-command") {
254
+ result.artifacts.trackedMetricWarning =
255
+ "Session and stream call coverage may differ; tracked metrics use session calls, not a reconciled union. " +
256
+ "Inspect callLedger before treating these counts as complete: no shared call identity proves overlap.";
257
+ }
258
+ }
238
259
  result.verdict = adaptSuiteV2ResultToVerdictV1(
239
260
  result,
240
261
  buildEvalTrackedMetrics({
241
- ledgerEntries,
262
+ ledgerEntries: selected.entries,
242
263
  receipt: receipt ?? null,
243
264
  fallbackWallClockMs: runner.wallTimeMs,
244
265
  }),
@@ -12,6 +12,8 @@ import type {
12
12
  } from "../dispatch/index.js";
13
13
  import { type ExecutionRole, isExecutionRole, readGateDecisionArtifactsForRunIds } from "../dispatch/index.js";
14
14
  import { detectValidationCommand } from "../safety/protected-artifacts.js";
15
+ import { foldDecisionBoard } from "../session/decision-board.js";
16
+ import { type DecisionLedgerEntry, decisionRef } from "../session/entries.js";
15
17
  import {
16
18
  type AuditJsonRow,
17
19
  type BashExecutionEntry,
@@ -23,6 +25,7 @@ import {
23
25
  readSessionEntriesForId,
24
26
  type SessionEntry,
25
27
  } from "../session/index.js";
28
+ import { filterEntriesToActivePath } from "../session/tree/active-path.js";
26
29
  import { attributeEvidenceFailure } from "./failure-attribution.js";
27
30
  import { renderEvidenceFindingsMarkdown } from "./findings-markdown.js";
28
31
  import { compareCodepoints as compareStrings } from "./ordering.js";
@@ -37,6 +40,7 @@ import {
37
40
  type EvidenceAuditLinkedRow,
38
41
  type EvidenceBuildResult,
39
42
  type EvidenceCleanTraceRow,
43
+ type EvidenceDecision,
40
44
  type EvidenceFinding,
41
45
  type EvidenceGateDecisionsFile,
42
46
  type EvidenceLinkConfidence,
@@ -94,6 +98,7 @@ interface LinkedSessionEntry {
94
98
  }
95
99
 
96
100
  interface SessionLinkResult {
101
+ decisionBoards: Map<string, DecisionLedgerEntry[]>;
97
102
  entries: LinkedSessionEntry[];
98
103
  attemptedSessionIds: string[];
99
104
  missingSessionIds: string[];
@@ -163,7 +168,10 @@ export async function buildEvidence(options: BuildEvidenceOptions): Promise<Evid
163
168
  gateDecisions: gateDecisions.decisions,
164
169
  validationEvidence,
165
170
  });
166
- const findings = buildFindings(runSources, trustStatusRaw, sessionLinks, auditLinks, protectedArtifactsRaw);
171
+ const decisionLinks = resolveReceiptDecisions(runSources, sessionLinks);
172
+ const rawFindings = buildFindings(runSources, trustStatusRaw, sessionLinks, auditLinks, protectedArtifactsRaw);
173
+ for (const row of decisionLinks.findings)
174
+ rawFindings.push({ ...row, id: `finding-${String(rawFindings.length + 1).padStart(3, "0")}` });
167
175
  // Export-boundary redaction (cold path): secret-shaped values are scrubbed
168
176
  // from everything the bundle serializes: envelopes, receipts (including
169
177
  // delegation toolCallLog arguments), tool-event previews, audit rows,
@@ -171,6 +179,7 @@ export async function buildEvidence(options: BuildEvidenceOptions): Promise<Evid
171
179
  // session files are untouched; the bundle is the boundary, and the
172
180
  // overview's redactionCount keeps the bundle honest about its filtering.
173
181
  const tally = createRedactionTally();
182
+ const findings = redactSecretsDeep(rawFindings, tally);
174
183
  const redactedRunSources: EvidenceRunSource[] = runSources.map((item) => ({
175
184
  ...item,
176
185
  envelope: redactSecretsDeep(item.envelope, tally),
@@ -187,18 +196,21 @@ export async function buildEvidence(options: BuildEvidenceOptions): Promise<Evid
187
196
  };
188
197
  const protectedArtifacts = redactSecretsDeep(protectedArtifactsRaw, tally);
189
198
  const trustStatus = redactSecretsDeep(trustStatusRaw, tally);
190
- const overview = buildOverview(
191
- evidenceId,
192
- source,
193
- redactedRunSources,
194
- findings,
195
- sessionLinks,
196
- redactedAuditLinks,
197
- redactedToolEvents,
198
- protectedArtifacts,
199
- );
199
+ const overview: EvidenceOverview = {
200
+ ...buildOverview(
201
+ evidenceId,
202
+ source,
203
+ redactedRunSources,
204
+ findings,
205
+ sessionLinks,
206
+ redactedAuditLinks,
207
+ redactedToolEvents,
208
+ protectedArtifacts,
209
+ ),
210
+ decisions: redactSecretsDeep(decisionLinks.decisions, tally),
211
+ };
200
212
  const transcript = redactSecretsText(
201
- renderTranscript(overview, redactedRunSources, sessionLinks, trustStatusRaw),
213
+ renderTranscript(overview, redactedRunSources, sessionLinks, trustStatusRaw, findings),
202
214
  tally,
203
215
  );
204
216
  const finalOverview: EvidenceOverview = { ...overview, redactionCount: tally.count };
@@ -215,7 +227,17 @@ export async function buildEvidence(options: BuildEvidenceOptions): Promise<Evid
215
227
  protectedArtifacts,
216
228
  transcript,
217
229
  );
218
- return { evidenceId, directory, overview: finalOverview, findings, trustStatus };
230
+ return {
231
+ evidenceId,
232
+ directory,
233
+ overview: finalOverview,
234
+ findings,
235
+ trustStatus,
236
+ ungroundedClaims: runSources.reduce((total, source) => {
237
+ const grounding = authenticatedReceipt(source)?.validationGrounding;
238
+ return total + (grounding === undefined ? 0 : Math.max(0, grounding.claimed - grounding.grounded));
239
+ }, 0),
240
+ };
219
241
  }
220
242
 
221
243
  function buildOverview(
@@ -229,7 +251,10 @@ function buildOverview(
229
251
  protectedArtifacts: EvidenceProtectedArtifactsFile,
230
252
  ): EvidenceOverview {
231
253
  const envelopes = runSources.map((item) => item.envelope);
232
- const receipts = runSources.flatMap((item) => (item.receipt === null ? [] : [item.receipt]));
254
+ const receipts = runSources.flatMap((item) => {
255
+ const receipt = authenticatedReceipt(item);
256
+ return receipt === null ? [] : [receipt];
257
+ });
233
258
  const toolStats = receipts.flatMap((receipt) => receipt.toolStats);
234
259
  const runIds = envelopes.map((envelope) => envelope.id).sort(compareStrings);
235
260
  const sessionIds = uniqueStrings(
@@ -619,7 +644,7 @@ async function writeEvidenceFiles(
619
644
  await writeJson(join(directory, "overview.json"), overview);
620
645
  await writeFile(
621
646
  join(directory, "transcript.md"),
622
- transcript ?? renderTranscript(overview, runSources, sessionLinks, trustStatus),
647
+ transcript ?? renderTranscript(overview, runSources, sessionLinks, trustStatus, findings),
623
648
  "utf8",
624
649
  );
625
650
  await writeJsonl(join(directory, "trace.raw.jsonl"), rawTraceRows(runSources));
@@ -736,6 +761,7 @@ async function linkSessionEntries(
736
761
  const attemptedSessionIds = sourceSessionIds(source, runSources);
737
762
  const windows = attributionWindows(ledger, runSources, attemptedSessionIds);
738
763
  const result: SessionLinkResult = {
764
+ decisionBoards: new Map(),
739
765
  entries: [],
740
766
  attemptedSessionIds,
741
767
  missingSessionIds: [],
@@ -748,6 +774,7 @@ async function linkSessionEntries(
748
774
  continue;
749
775
  }
750
776
  result.readErrors.push(...read.errors);
777
+ result.decisionBoards.set(sessionId, foldDecisionBoard(filterEntriesToActivePath(read.entries, read.leafTurnId)));
751
778
  for (const entry of read.entries) {
752
779
  const link = linkSessionEntry(entry, windows);
753
780
  if (source.kind === "run" && !linkCoversRun(link, source.runId)) continue;
@@ -1280,6 +1307,7 @@ function renderTranscript(
1280
1307
  runSources: ReadonlyArray<EvidenceRunSource>,
1281
1308
  sessionLinks: SessionLinkResult,
1282
1309
  trustStatus: EvidenceTrustStatusFile,
1310
+ findings: ReadonlyArray<EvidenceFinding>,
1283
1311
  ): string {
1284
1312
  const trustByRun = new Map(trustStatus.runs.map((entry) => [entry.runId, entry.status]));
1285
1313
  const lines = [
@@ -1306,6 +1334,21 @@ function renderTranscript(
1306
1334
  }
1307
1335
  }
1308
1336
  }
1337
+ const decisionFindings = findings.filter(
1338
+ (row) => row.tag === "context-provenance" && row.message.startsWith("Decision ref "),
1339
+ );
1340
+ if (decisionFindings.length > 0) {
1341
+ lines.push("", "## Decision provenance");
1342
+ for (const row of decisionFindings) lines.push(`- [${row.severity}] ${row.runId}: ${row.message}`);
1343
+ for (const decision of overview.decisions ?? []) {
1344
+ lines.push(
1345
+ `\n### ${decision.ref} (run ${decision.runId}, session ${decision.sessionId})`,
1346
+ "```json",
1347
+ JSON.stringify(decision.record, null, 2),
1348
+ "```",
1349
+ );
1350
+ }
1351
+ }
1309
1352
  if (sessionLinks.entries.length > 0) {
1310
1353
  lines.push("", "## Linked Session Transcript");
1311
1354
  for (const linked of sessionLinks.entries) {
@@ -1577,6 +1620,7 @@ function parseRunEnvelope(value: unknown, source: string): RunEnvelope {
1577
1620
  // tampered. The validated reads below still gate the fields evidence uses.
1578
1621
  return {
1579
1622
  ...(value as Partial<RunEnvelope>),
1623
+ version: 1,
1580
1624
  id: readString(value, source, "id"),
1581
1625
  agentId: readString(value, source, "agentId"),
1582
1626
  executionRole: readExecutionRole(value, source),
@@ -1874,3 +1918,46 @@ function sanitizeEvidenceId(value: string): string {
1874
1918
  const clean = value.replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
1875
1919
  return clean.length === 0 ? "unknown" : clean;
1876
1920
  }
1921
+
1922
+ /** Receipt refs authenticate the link, while the session ledger supplies the recorded argument. */
1923
+ function resolveReceiptDecisions(
1924
+ runSources: ReadonlyArray<EvidenceRunSource>,
1925
+ sessions: SessionLinkResult,
1926
+ ): {
1927
+ decisions: EvidenceDecision[];
1928
+ findings: EvidenceFinding[];
1929
+ } {
1930
+ const decisions: EvidenceDecision[] = [];
1931
+ const findings: EvidenceFinding[] = [];
1932
+ for (const source of runSources) {
1933
+ const receipt = authenticatedReceipt(source);
1934
+ if (!receipt?.decisionRefs?.length) continue;
1935
+ const sessionId = receipt.sessionId;
1936
+ const board = sessionId === null ? [] : (sessions.decisionBoards.get(sessionId) ?? []);
1937
+ const records = new Map(
1938
+ board.flatMap((entry) =>
1939
+ entry.decisions.map(
1940
+ (record) =>
1941
+ [
1942
+ decisionRef(entry.interviewId, record.key),
1943
+ { ...record, source: record.source ?? (entry.origin === "agent" ? ("agent" as const) : ("operator" as const)) },
1944
+ ] as const,
1945
+ ),
1946
+ ),
1947
+ );
1948
+ for (const ref of new Set(receipt.decisionRefs)) {
1949
+ const record = records.get(ref);
1950
+ if (record && sessionId !== null) decisions.push({ runId: receipt.runId, sessionId, ref, record });
1951
+ findings.push(
1952
+ finding(
1953
+ findings.length,
1954
+ record ? "info" : "warn",
1955
+ "context-provenance",
1956
+ receipt.runId,
1957
+ `Decision ref ${ref} ${record ? "resolved" : "does not resolve"} on session ${sessionId ?? "(unlinked)"} active path`,
1958
+ ),
1959
+ );
1960
+ }
1961
+ }
1962
+ return { decisions, findings };
1963
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Fixed machine-readable projection of one evidence bundle's trust record.
3
+ *
4
+ * `evidence inspect <id>` prints an operator record that quotes the task text,
5
+ * the bundle's file list, and per-finding prose. This is the same bundle read
6
+ * down to the one thing a GUI can carry safely and usefully: which runs the
7
+ * bundle covers, what verdict each run earned, and which axis produced it.
8
+ *
9
+ * Every value here comes from a closed vocabulary. The axis names, the axis
10
+ * states, and the verdicts are all enumerations the harness owns, so there is
11
+ * no free-form text on this surface at all, which is what lets it answer the
12
+ * question the inventory raises without reopening the boundary the inventory
13
+ * closed.
14
+ *
15
+ * Unlike the other fixed reads this one takes an identifier, because an
16
+ * operator names the bundle. The GUI host may only pass back an id it served
17
+ * inside its current bounded window; see `apps/workbench/artifact-allowlist.ts`.
18
+ */
19
+
20
+ import { clioDataDir } from "../../core/xdg.js";
21
+ import { inspectEvidence, TRUST_STATUS_AXES, type TrustStatusAxis, type TrustVerdict, trustVerdict } from "./index.js";
22
+
23
+ export const EVIDENCE_DETAIL_MAX_RUNS = 16;
24
+
25
+ export interface EvidenceDetailRun {
26
+ readonly runId: string;
27
+ readonly verdict: TrustVerdict;
28
+ /** Every axis, always all six, so an absent axis is stated rather than missing. */
29
+ readonly axes: Readonly<Record<TrustStatusAxis, string>>;
30
+ }
31
+
32
+ export interface EvidenceDetailSnapshot {
33
+ readonly version: 1;
34
+ readonly generatedAt: string;
35
+ readonly evidenceId: string;
36
+ readonly sourceKind: "run" | "session" | "eval";
37
+ /** False when the bundle predates the canonical trust projection. */
38
+ readonly canonical: boolean;
39
+ readonly runs: readonly EvidenceDetailRun[];
40
+ readonly runsTruncated: boolean;
41
+ }
42
+
43
+ export async function evidenceDetailSnapshot(
44
+ evidenceId: string,
45
+ now: () => number = Date.now,
46
+ dataDir: string = clioDataDir(),
47
+ ): Promise<EvidenceDetailSnapshot> {
48
+ const inspected = await inspectEvidence(dataDir, evidenceId);
49
+ const all = inspected.trustStatus.runs;
50
+ const window = all.slice(0, EVIDENCE_DETAIL_MAX_RUNS);
51
+ return {
52
+ version: 1,
53
+ generatedAt: new Date(now()).toISOString(),
54
+ evidenceId: inspected.overview.evidenceId,
55
+ sourceKind: inspected.overview.source.kind,
56
+ canonical: inspected.trustStatus.projection === "canonical",
57
+ runs: window.map(
58
+ (run): EvidenceDetailRun => ({
59
+ runId: run.runId,
60
+ verdict: trustVerdict(run.status),
61
+ axes: Object.fromEntries(TRUST_STATUS_AXES.map((axis) => [axis, run.status[axis].state])) as Record<
62
+ TrustStatusAxis,
63
+ string
64
+ >,
65
+ }),
66
+ ),
67
+ runsTruncated: all.length > window.length,
68
+ };
69
+ }
@@ -9,6 +9,7 @@ import { renderEvidenceFindingsMarkdown } from "./findings-markdown.js";
9
9
  import { compareCodepoints as compareStrings } from "./ordering.js";
10
10
  import { buildEvidenceTrustStatusFile } from "./run-trust.js";
11
11
  import { evidenceDirectory, findingsFile } from "./store.js";
12
+ import { inspectRunReceiptTrustStatus } from "./trust-status.js";
12
13
  import {
13
14
  EVIDENCE_VERSION,
14
15
  type EvidenceAuditLinkedRow,
@@ -107,7 +108,18 @@ export async function buildEvalEvidence(options: BuildEvalEvidenceOptions): Prom
107
108
  gateDecisions,
108
109
  trustStatus,
109
110
  );
110
- return { evidenceId, directory, overview, findings, trustStatus };
111
+ return {
112
+ evidenceId,
113
+ directory,
114
+ overview,
115
+ findings,
116
+ trustStatus,
117
+ ungroundedClaims: linkedRuns.runSources.reduce((total, source) => {
118
+ if (!inspectRunReceiptTrustStatus(source.receipt, source.envelope).integrity.ok) return total;
119
+ const grounding = source.receipt?.validationGrounding;
120
+ return total + (grounding === undefined ? 0 : Math.max(0, grounding.claimed - grounding.grounded));
121
+ }, 0),
122
+ };
111
123
  }
112
124
 
113
125
  export function evalEvidenceId(evalId: string): string {
@@ -7,7 +7,7 @@ import type { EvidenceTag } from "./types.js";
7
7
  *
8
8
  * The forensic layer (`evidence/build.ts`) speaks the canonical 23-tag
9
9
  * `EVIDENCE_TAGS` vocabulary over durable artifacts. The live layer
10
- * (`safety/finish-contract.ts`) speaks a 3-kind in-loop vocabulary
10
+ * (`safety/finish-contract.ts`) speaks a 4-kind in-loop vocabulary
11
11
  * (`FinishContractEvidenceKind`) over the last ~80 session entries. They are
12
12
  * the same accountability concept observed at two depths.
13
13
  *
@@ -29,11 +29,15 @@ import type { EvidenceTag } from "./types.js";
29
29
  * - dispatch_receipt: a passed dispatch receipt, whose forensic concerns are
30
30
  * `receipt-integrity` (the receipt verifies) and `session-linked` (the run
31
31
  * is linked to its session).
32
+ * - limitation: a successful `limitation` tool receipt, which the forensic
33
+ * layer records as the `completion-evidence` info row for a run that
34
+ * finished limited instead of evidenced.
32
35
  */
33
36
  export const FINISH_CONTRACT_EVIDENCE_TAGS: Record<FinishContractEvidenceKind, readonly EvidenceTag[]> = {
34
37
  validation_command: ["no-validation", "proxy-validation"],
35
38
  protected_artifact: ["protected-artifact"],
36
39
  dispatch_receipt: ["receipt-integrity", "session-linked"],
40
+ limitation: ["completion-evidence"],
37
41
  } as const;
38
42
 
39
43
  /** The canonical tags a single live finish-contract kind projects onto. */
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Fixed machine-readable projection of recent evidence artifacts.
3
+ *
4
+ * `evidence list` is an operator table and `evidence inspect <id>` needs an id,
5
+ * so neither is a transport a GUI host can invoke blind. This command accepts
6
+ * no identifier, path, or limit, selects a bounded newest-first window itself,
7
+ * and emits provenance, tags, totals, and a trust verdict.
8
+ *
9
+ * An overview carries the working directories the runs executed in, the task
10
+ * text the operator typed, and the file names inside the bundle. None of that
11
+ * appears here. What does is the shape of the artifact and how far it can be
12
+ * trusted, which is what an operator picks a bundle by.
13
+ */
14
+
15
+ import { clioDataDir } from "../../core/xdg.js";
16
+ import { truncateToWidth } from "../../engine/tui-primitives.js";
17
+ import { sanitizeCallTargetText } from "../safety/call-target.js";
18
+ import {
19
+ EVIDENCE_TAGS,
20
+ type EvidenceOverview,
21
+ type EvidenceTag,
22
+ listEvidenceOverviews,
23
+ loadEvidenceTrustStatus,
24
+ type TrustVerdict,
25
+ trustVerdict,
26
+ } from "./index.js";
27
+
28
+ export const EVIDENCE_INVENTORY_MAX_ARTIFACTS = 12;
29
+ export const EVIDENCE_INVENTORY_MAX_IDS = 8;
30
+
31
+ const IDENTITY_WIDTH = 128;
32
+
33
+ /**
34
+ * Worst verdict first.
35
+ *
36
+ * An artifact covering several runs is only as trustworthy as its weakest run,
37
+ * so the fold takes the worst rather than the newest or the most common. A
38
+ * `compromised` run inside an otherwise clean bundle is the fact the operator
39
+ * needs, and averaging it away would be the one summary worth not printing.
40
+ */
41
+ const VERDICT_SEVERITY: ReadonlyArray<TrustVerdict> = ["compromised", "unverified", "unknown", "grounded", "reviewed"];
42
+
43
+ export interface EvidenceInventoryArtifact {
44
+ readonly evidenceId: string;
45
+ readonly sourceKind: "run" | "session" | "eval";
46
+ readonly generatedAt: string;
47
+ readonly startedAt: string | null;
48
+ readonly endedAt: string | null;
49
+ readonly runIds: readonly string[];
50
+ readonly runIdsTruncated: boolean;
51
+ readonly agentIds: readonly string[];
52
+ readonly statuses: readonly string[];
53
+ readonly tags: readonly EvidenceTag[];
54
+ readonly totals: Readonly<{
55
+ runs: number;
56
+ receipts: number;
57
+ toolCalls: number;
58
+ toolErrors: number;
59
+ blockedToolCalls: number;
60
+ protectedArtifacts: number;
61
+ tokens: number;
62
+ costUsd: number;
63
+ wallTimeMs: number;
64
+ }>;
65
+ /** Secret-shaped values the builder replaced across the bundle's exports. */
66
+ readonly redactionCount: number;
67
+ readonly trust: Readonly<{
68
+ verdict: TrustVerdict;
69
+ /** Runs whose canonical trust status the bundle actually recorded. */
70
+ runsCovered: number;
71
+ /** True when the bundle predates the canonical trust projection. */
72
+ historical: boolean;
73
+ }>;
74
+ }
75
+
76
+ export interface EvidenceInventorySnapshot {
77
+ readonly version: 1;
78
+ readonly generatedAt: string;
79
+ readonly artifacts: readonly EvidenceInventoryArtifact[];
80
+ readonly truncated: boolean;
81
+ }
82
+
83
+ function bounded(value: string, width: number): string {
84
+ const sanitized = sanitizeCallTargetText(value);
85
+ if (sanitized.length === 0) return "unavailable";
86
+ return sanitizeCallTargetText(truncateToWidth(sanitized, width, "…", false));
87
+ }
88
+
89
+ /** Distinct, sanitized, bounded, in first-seen order. */
90
+ function identities(values: ReadonlyArray<string>): string[] {
91
+ const seen: string[] = [];
92
+ for (const value of values) {
93
+ const text = bounded(value, IDENTITY_WIDTH);
94
+ if (!seen.includes(text)) seen.push(text);
95
+ if (seen.length >= EVIDENCE_INVENTORY_MAX_IDS) break;
96
+ }
97
+ return seen;
98
+ }
99
+
100
+ function tally(value: number | undefined): number {
101
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.trunc(value) : 0;
102
+ }
103
+
104
+ function amount(value: number | undefined): number {
105
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
106
+ }
107
+
108
+ /** Newest generation first. An unparseable stamp sorts oldest rather than throwing. */
109
+ function byNewest(a: EvidenceOverview, b: EvidenceOverview): number {
110
+ return (Date.parse(b.generatedAt) || 0) - (Date.parse(a.generatedAt) || 0);
111
+ }
112
+
113
+ export async function evidenceInventorySnapshot(
114
+ now: () => number = Date.now,
115
+ dataDir: string = clioDataDir(),
116
+ ): Promise<EvidenceInventorySnapshot> {
117
+ const all = (await listEvidenceOverviews(dataDir)).sort(byNewest);
118
+ const window = all.slice(0, EVIDENCE_INVENTORY_MAX_ARTIFACTS);
119
+ const artifacts: EvidenceInventoryArtifact[] = [];
120
+ for (const overview of window) {
121
+ // One unreadable trust file costs that artifact its verdict, never the
122
+ // whole inventory: the bundle itself is still the thing being listed.
123
+ let verdict: TrustVerdict = "unknown";
124
+ let runsCovered = 0;
125
+ let historical = true;
126
+ try {
127
+ const status = await loadEvidenceTrustStatus(dataDir, overview.evidenceId);
128
+ historical = status.projection !== "canonical";
129
+ runsCovered = status.runs.length;
130
+ const verdicts = status.runs.map((run) => trustVerdict(run.status));
131
+ verdict = VERDICT_SEVERITY.find((candidate) => verdicts.includes(candidate)) ?? "unknown";
132
+ } catch {
133
+ verdict = "unknown";
134
+ }
135
+ artifacts.push({
136
+ evidenceId: bounded(overview.evidenceId, IDENTITY_WIDTH),
137
+ sourceKind: overview.source.kind,
138
+ generatedAt: overview.generatedAt,
139
+ startedAt: overview.startedAt,
140
+ endedAt: overview.endedAt,
141
+ runIds: identities(overview.runIds),
142
+ runIdsTruncated: overview.runIds.length > EVIDENCE_INVENTORY_MAX_IDS,
143
+ agentIds: identities(overview.agentIds),
144
+ statuses: identities(overview.statuses),
145
+ tags: overview.tags.filter((tag) => EVIDENCE_TAGS.includes(tag)),
146
+ totals: {
147
+ runs: tally(overview.totals.runs),
148
+ receipts: tally(overview.totals.receipts),
149
+ toolCalls: tally(overview.totals.toolCalls),
150
+ toolErrors: tally(overview.totals.toolErrors),
151
+ blockedToolCalls: tally(overview.totals.blockedToolCalls),
152
+ protectedArtifacts: tally(overview.totals.protectedArtifacts),
153
+ tokens: tally(overview.totals.tokens),
154
+ costUsd: amount(overview.totals.costUsd),
155
+ wallTimeMs: tally(overview.totals.wallTimeMs),
156
+ },
157
+ redactionCount: tally(overview.redactionCount),
158
+ trust: { verdict, runsCovered, historical },
159
+ });
160
+ }
161
+ return {
162
+ version: 1,
163
+ generatedAt: new Date(now()).toISOString(),
164
+ artifacts,
165
+ truncated: all.length > window.length,
166
+ };
167
+ }
@@ -2,6 +2,7 @@ import { readdir, readFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { assertSafeId } from "../../core/safe-id.js";
4
4
  import { type GateDecisionArtifact, verifyGateDecisionArtifact } from "../dispatch/index.js";
5
+ import { isDecisionRecord } from "../session/entries.js";
5
6
  import { compareCodepoints as compareStrings } from "./ordering.js";
6
7
  import { hasRunProvenance, type RunProvenanceView, runProvenanceFromUnknown } from "./provenance.js";
7
8
  import { normalizeTrustStatus } from "./trust-status.js";
@@ -230,6 +231,7 @@ function parseOverview(value: unknown, source: string): EvidenceOverview {
230
231
  tags,
231
232
  files,
232
233
  ...(redactionCount === undefined ? {} : { redactionCount }),
234
+ ...(value.decisions === undefined ? {} : { decisions: readDecisions(value.decisions, `${source}.decisions`) }),
233
235
  };
234
236
  }
235
237
 
@@ -335,3 +337,17 @@ function isRecord(value: unknown): value is Record<string, unknown> {
335
337
  export function findingsFile(evidenceId: string, findings: EvidenceFinding[]): EvidenceFindingsFile {
336
338
  return { version: 1, evidenceId, findings };
337
339
  }
340
+
341
+ function readDecisions(value: unknown, source: string): NonNullable<EvidenceOverview["decisions"]> {
342
+ if (!Array.isArray(value)) throw new Error(`${source}: expected array`);
343
+ return value.map((entry: unknown, index) => {
344
+ const path = `${source}[${index}]`;
345
+ if (!isRecord(entry) || !isDecisionRecord(entry.record)) throw new Error(`${path}: expected recorded decision`);
346
+ return {
347
+ runId: readString(entry, path, "runId"),
348
+ sessionId: readString(entry, path, "sessionId"),
349
+ ref: readString(entry, path, "ref"),
350
+ record: entry.record,
351
+ };
352
+ });
353
+ }
@@ -2,6 +2,7 @@ import type { GateDecisionArtifact, RunEnvelope, RunReceipt, ToolCallStat } from
2
2
  import type { RunPersonaOverride, RunPipelineProvenance, RunReceiptAutonomyEnforcement } from "../dispatch/types.js";
3
3
  import type { EvalCommandPhase, EvalFailureClass, EvalRunRecord } from "../eval/index.js";
4
4
  import type { ProtectedArtifact } from "../safety/protected-artifacts.js";
5
+ import type { DecisionRecord } from "../session/entries.js";
5
6
  import type { RunEscalationCounts } from "./provenance.js";
6
7
  import type { CanonicalTrustStatus } from "./trust-status.js";
7
8
 
@@ -81,7 +82,16 @@ export interface EvidenceTotals {
81
82
  wallTimeMs: number;
82
83
  }
83
84
 
85
+ export interface EvidenceDecision {
86
+ runId: string;
87
+ sessionId: string;
88
+ ref: string;
89
+ record: DecisionRecord;
90
+ }
91
+
84
92
  export interface EvidenceOverview {
93
+ /** Recorded arguments resolved from authenticated receipts on the linked active session path. */
94
+ decisions?: EvidenceDecision[];
85
95
  version: 1;
86
96
  evidenceId: string;
87
97
  source: EvidenceSource;
@@ -137,6 +147,8 @@ export interface EvidenceBuildResult {
137
147
  overview: EvidenceOverview;
138
148
  findings: EvidenceFinding[];
139
149
  trustStatus: EvidenceTrustStatusFile;
150
+ /** Total claims without matching commands, from integrity-verified receipts only. */
151
+ ungroundedClaims: number;
140
152
  }
141
153
 
142
154
  export interface EvidenceInspectable {
@@ -22,6 +22,13 @@ export function extensionSnapshotFor(cwd = process.cwd()): ExtensionSnapshot {
22
22
  return buildExtensionSnapshot({ cwd, generation: 0 });
23
23
  }
24
24
 
25
+ /**
26
+ * The canonical accessor for the enabled roots of one extension resource
27
+ * kind. The agent registry, fleet contract, skill and common resource
28
+ * loaders, and the extensions contract all read through it, so each of them
29
+ * sees the committed snapshot for the booted cwd or the ephemeral
30
+ * generation-0 build otherwise. Returns a fresh array the caller may mutate.
31
+ */
25
32
  export function enabledExtensionResourceRoots(
26
33
  kind: ExtensionResourceKind,
27
34
  cwd = process.cwd(),
@@ -94,8 +94,10 @@ export const INTEROP_AGENT_KINDS: ReadonlyArray<InteropAgentKind> = [
94
94
  id: "antigravity",
95
95
  label: "Antigravity CLI",
96
96
  binaryNames: ["agy"],
97
- userDir: ".antigravitycli",
98
- projectDir: ".antigravitycli",
97
+ userDir: ".gemini/antigravity-cli",
98
+ legacyUserDirs: [".antigravitycli"],
99
+ projectDir: ".gemini/antigravity-cli",
100
+ legacyProjectDirs: [".antigravitycli"],
99
101
  instructionFiles: [],
100
102
  },
101
103
  {
@@ -133,7 +135,9 @@ export function foreignAgentDirs(): ReadonlyArray<string> {
133
135
  const dirs: string[] = [];
134
136
  for (const kind of INTEROP_AGENT_KINDS) {
135
137
  dirs.push(`~/${kind.userDir}/`);
138
+ for (const legacy of kind.legacyUserDirs ?? []) dirs.push(`~/${legacy}/`);
136
139
  if (kind.projectDir !== undefined) dirs.push(`${kind.projectDir}/`);
140
+ for (const legacy of kind.legacyProjectDirs ?? []) dirs.push(`${legacy}/`);
137
141
  }
138
142
  return [...new Set(dirs)];
139
143
  }
@@ -33,8 +33,12 @@ export interface InteropAgentKind {
33
33
  binaryNames: ReadonlyArray<string>;
34
34
  /** Home-relative directory the agent owns. */
35
35
  userDir: string;
36
+ /** Older home-relative roots still owned by supported installations. */
37
+ legacyUserDirs?: ReadonlyArray<string>;
36
38
  /** Project-relative directory the agent owns, when it has one distinct from the repo's own. */
37
39
  projectDir?: string;
40
+ /** Older project-relative roots still protected from Clio writes. */
41
+ legacyProjectDirs?: ReadonlyArray<string>;
38
42
  userSkillRoot?: string;
39
43
  projectSkillRoot?: string;
40
44
  userPromptRoot?: string;