@iowarp/clio-coder 0.4.3 → 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 (340) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +1 -1
  3. package/dist/{acp-H2NGRPWO.js → acp-WNAYYF4F.js} +4 -5
  4. package/dist/{agents-TL5LLUQP.js → agents-3OKXHLOI.js} +33 -31
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-E5SW4HMS.js → auth-VKNNMGPU.js} +10 -11
  7. package/dist/{builtins-IA7V7FUC.js → builtins-WGALA46I.js} +4 -4
  8. package/dist/{chunk-F5JHEYZM.js → chunk-23L32XTI.js} +10 -7
  9. package/dist/{chunk-DWUOQKRU.js → chunk-25QBEXRS.js} +2 -2
  10. package/dist/{chunk-LLDJM5XK.js → chunk-26QSH3EJ.js} +2 -2
  11. package/dist/{chunk-N2Z7HLVY.js → chunk-2ASED4PZ.js} +10 -10
  12. package/dist/{chunk-MCEPRMZW.js → chunk-2CU2H6KE.js} +2 -2
  13. package/dist/chunk-2DSOYNFC.js +108 -0
  14. package/dist/{chunk-LDJG7DW3.js → chunk-2ZSONWVL.js} +4 -4
  15. package/dist/{chunk-GI7YYQ3F.js → chunk-36CT5VVL.js} +324 -41
  16. package/dist/{chunk-4UVU7BJ5.js → chunk-3GY4F45V.js} +2 -2
  17. package/dist/{chunk-PUVDKJ2Y.js → chunk-3ODX73FK.js} +3 -5
  18. package/dist/{chunk-IUE3Y34X.js → chunk-3UNOLWNZ.js} +2 -2
  19. package/dist/{chunk-6PTFB5VS.js → chunk-3UUXNFEX.js} +8 -4
  20. package/dist/{chunk-2APPQIER.js → chunk-4M6Z5QVF.js} +4 -4
  21. package/dist/{chunk-K6BSR66V.js → chunk-4NSRCOYP.js} +4 -1
  22. package/dist/{chunk-JGRC33J2.js → chunk-54X7T7DK.js} +12 -3
  23. package/dist/{chunk-YQWYVTMC.js → chunk-5636DCO5.js} +4 -4
  24. package/dist/{chunk-7E7I3WLS.js → chunk-57XXR6DR.js} +23 -22
  25. package/dist/{chunk-7ZYNNDKC.js → chunk-5TUB6SLS.js} +2 -2
  26. package/dist/{chunk-VW6DOEDG.js → chunk-6OSVSQL5.js} +11 -2
  27. package/dist/{chunk-L47TF46W.js → chunk-6PAZTBPA.js} +14 -2
  28. package/dist/{chunk-XIVNBFZS.js → chunk-6Q3CYFD3.js} +34 -16
  29. package/dist/{chunk-RSJ25QSL.js → chunk-6QOTUPRG.js} +155 -36
  30. package/dist/{chunk-JKKCYP3C.js → chunk-6UINWWS6.js} +10 -4
  31. package/dist/{chunk-WBKFA554.js → chunk-72YIHOZQ.js} +2 -2
  32. package/dist/{chunk-PAJQJ7BS.js → chunk-75W7L2E2.js} +246 -697
  33. package/dist/{chunk-RRNP2ANY.js → chunk-7UGL4MB5.js} +4 -4
  34. package/dist/{chunk-EKCHAPYA.js → chunk-AUPNRN7C.js} +2 -2
  35. package/dist/{chunk-ZDN3Y73Y.js → chunk-BJVFZO5U.js} +6 -48
  36. package/dist/{chunk-IWT4SF4R.js → chunk-CUSRQKPU.js} +64 -2
  37. package/dist/{chunk-SKHCAU7K.js → chunk-DQOVN6KV.js} +3 -2
  38. package/dist/{chunk-ZWPRK62N.js → chunk-DT3LWJOB.js} +4 -4
  39. package/dist/chunk-DXKJURES.js +671 -0
  40. package/dist/{chunk-BEPZRGGU.js → chunk-EL24TAU4.js} +2 -2
  41. package/dist/{chunk-OML5D5V5.js → chunk-ELWDPP3Y.js} +5 -5
  42. package/dist/{chunk-NDINPTJ4.js → chunk-ELZVTCGV.js} +5 -4
  43. package/dist/chunk-EXLD33WO.js +381 -0
  44. package/dist/{chunk-IJNZMHLA.js → chunk-FEAXX7B6.js} +2 -2
  45. package/dist/{chunk-TM6LQDI3.js → chunk-FFUPXJC4.js} +74 -323
  46. package/dist/chunk-GX5WYQO4.js +59 -0
  47. package/dist/chunk-I2DWJ4GM.js +390 -0
  48. package/dist/{chunk-TXOTCRLG.js → chunk-I5FWO7L5.js} +5 -5
  49. package/dist/chunk-IRXAATOX.js +539 -0
  50. package/dist/chunk-IXIY2H4R.js +44 -0
  51. package/dist/{chunk-KK4JZPBQ.js → chunk-IZXGRF7P.js} +76 -10
  52. package/dist/{chunk-5TSRNF4G.js → chunk-JCI2ROMZ.js} +164 -6
  53. package/dist/{chunk-INY6HTFL.js → chunk-JEIYHLOR.js} +2 -2
  54. package/dist/{chunk-MUW2BDDH.js → chunk-JQLNNIKT.js} +2 -2
  55. package/dist/{chunk-XPWWI35G.js → chunk-JSD46VO2.js} +19 -8
  56. package/dist/{chunk-VA5FNYMT.js → chunk-JT2RFCC5.js} +39 -2
  57. package/dist/{chunk-V2ANDPVT.js → chunk-K6T2ZAMZ.js} +168 -6
  58. package/dist/{chunk-B4OAX3SI.js → chunk-KFV5L5SK.js} +13 -6
  59. package/dist/{chunk-JEQ3XTHC.js → chunk-LLXSDWXS.js} +2 -2
  60. package/dist/{chunk-E3TPLWFX.js → chunk-LTIKRKFL.js} +3 -3
  61. package/dist/{chunk-NIQJ66N4.js → chunk-N56KALIC.js} +17 -17
  62. package/dist/{chunk-JDAY6FIL.js → chunk-NAI6ZFCY.js} +13 -9
  63. package/dist/{chunk-AF4YM7Z4.js → chunk-NRO2BJRH.js} +2490 -2182
  64. package/dist/{chunk-WRBAGUNF.js → chunk-NXIMQY5W.js} +2 -2
  65. package/dist/{chunk-I7ZPNEJM.js → chunk-NXYCB2VD.js} +5 -5
  66. package/dist/chunk-ODGTEFFI.js +50 -0
  67. package/dist/{chunk-2VIKGWFZ.js → chunk-OEJSLEPW.js} +2 -2
  68. package/dist/{chunk-KKOJXO6R.js → chunk-OMQNJVKW.js} +4 -2
  69. package/dist/{chunk-54CBCGIR.js → chunk-Q4WO54TA.js} +132 -77
  70. package/dist/{chunk-B4VEBZKF.js → chunk-QUFRYSWI.js} +12 -6
  71. package/dist/{chunk-42FMPA75.js → chunk-QZWQA4DE.js} +2 -2
  72. package/dist/{chunk-HEQY7ZFI.js → chunk-RAY4OVGZ.js} +2 -2
  73. package/dist/{chunk-G76U63X4.js → chunk-RQCKCSRL.js} +7 -7
  74. package/dist/{chunk-64I3JVYM.js → chunk-RXTN6AKH.js} +2 -2
  75. package/dist/{chunk-UPZU6GE4.js → chunk-RZDWV63N.js} +3 -3
  76. package/dist/{chunk-2UH2KFUP.js → chunk-S6PYF2XF.js} +2 -2
  77. package/dist/{chunk-JSC3U7TI.js → chunk-TOIVGRUX.js} +2 -2
  78. package/dist/{chunk-7DRAWPTZ.js → chunk-TQAHXW6Y.js} +1 -1
  79. package/dist/{chunk-JIEGK6UF.js → chunk-U6TMQNSI.js} +48 -4
  80. package/dist/{chunk-AX2THNSA.js → chunk-UEPWCCTY.js} +4 -4
  81. package/dist/{chunk-QWGDJJYJ.js → chunk-USR47QNF.js} +4 -4
  82. package/dist/{chunk-Y3CBHOR6.js → chunk-V6HJFQZE.js} +2 -2
  83. package/dist/chunk-V76WTFTW.js +318 -0
  84. package/dist/{chunk-NMJXSHBJ.js → chunk-W54I7H25.js} +2 -2
  85. package/dist/{chunk-2UG5F4C5.js → chunk-XULDXHTN.js} +24 -12
  86. package/dist/chunk-XXYSBZIQ.js +283 -0
  87. package/dist/{chunk-MWUZBSAQ.js → chunk-Y55JBDO5.js} +331 -51
  88. package/dist/{chunk-W6RRQCPQ.js → chunk-YD5GIKET.js} +4 -4
  89. package/dist/{chunk-CE5AX47J.js → chunk-YECAMM3D.js} +2 -2
  90. package/dist/{chunk-WCXUNS7U.js → chunk-YNFKXPEC.js} +6 -6
  91. package/dist/cli/index.js +36 -35
  92. package/dist/{clio-CMMK4KRR.js → clio-QLICPCF5.js} +2 -2
  93. package/dist/{code-nav-MDZNQS33.js → code-nav-IJR2DBPR.js} +6 -6
  94. package/dist/{components-UCUQ4QXW.js → components-2TGAI2RC.js} +3 -4
  95. package/dist/{config-SVM5P5YI.js → config-IUA6OYNS.js} +52 -47
  96. package/dist/{configure-LE3IK2TJ.js → configure-VEPX4NMX.js} +14 -15
  97. package/dist/{context-VNCR7KAG.js → context-2DKHWH2T.js} +23 -23
  98. package/dist/{context-2OHRKS42.js → context-4MPR7WKB.js} +48 -42
  99. package/dist/{context-E3VC7RX5.js → context-BOYF5EJM.js} +11 -11
  100. package/dist/{context-clear-BW4O37TG.js → context-clear-S4ZJCQUX.js} +48 -42
  101. package/dist/{context-working-set-VDS25HXZ.js → context-working-set-3I3FYX6Y.js} +8 -8
  102. package/dist/detail-A7JAVSIG.js +98 -0
  103. package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-RJ5I2F2O.js} +71 -58
  104. package/dist/{docs-PD3EXDKU.js → docs-SPOV3BAN.js} +3 -5
  105. package/dist/{doctor-WNNVO6FY.js → doctor-DKICC2SN.js} +54 -31
  106. package/dist/{eval-7G7SGAYO.js → eval-OQOQUDHK.js} +47 -56
  107. package/dist/{evidence-VD6736FQ.js → evidence-4DQ25GUQ.js} +53 -150
  108. package/dist/evidence-4F5USFKH.js +208 -0
  109. package/dist/{evolve-AL3NGVRL.js → evolve-GSS52E5J.js} +44 -41
  110. package/dist/{extensions-MOVJ32NM.js → extensions-G7MFLYHT.js} +4 -5
  111. package/dist/{fleet-QZHUMAGI.js → fleet-Q37YHHAQ.js} +74 -68
  112. package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-G7E4N7SM.js} +14 -11
  113. package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-O7M6QBA2.js} +6 -6
  114. package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-TOUBW6OW.js} +13 -13
  115. package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-SW33JJNI.js} +43 -39
  116. package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-CV2655TW.js} +2 -3
  117. package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-KESZX2YH.js} +16 -16
  118. package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-UQPMTVE3.js} +42 -38
  119. package/dist/{fleet-view-SWBR3VGQ.js → fleet-view-MN2VG4MR.js} +43 -39
  120. package/dist/{init-J477LKZH.js → init-PXEXQSBF.js} +60 -54
  121. package/dist/{interop-3FCM6XLG.js → interop-ZG5T62U3.js} +6 -7
  122. package/dist/inventory-C26CFDRR.js +101 -0
  123. package/dist/{library-QUQEIUG6.js → library-B2W4N74O.js} +16 -17
  124. package/dist/{memory-SGGSEP65.js → memory-YCANYS5A.js} +45 -42
  125. package/dist/{models-HEKUAXXK.js → models-GERTU3YI.js} +20 -22
  126. package/dist/{monitor-HKU57TYQ.js → monitor-CPNIUULB.js} +50 -44
  127. package/dist/{orchestrator-VDFAEFAI.js → orchestrator-J4BSH4WQ.js} +491 -1182
  128. package/dist/{panes-DN2SSFOH.js → panes-BOHAEGYC.js} +3 -3
  129. package/dist/{panes-TALGNPZT.js → panes-NXSLDQZ2.js} +5 -6
  130. package/dist/{paths-NBMFAIEZ.js → paths-VSUWNC22.js} +3 -4
  131. package/dist/{reset-EAJFFJVB.js → reset-TNWTB5LU.js} +5 -6
  132. package/dist/{resources-OVKSEFVE.js → resources-4PXNMD5G.js} +14 -14
  133. package/dist/{run-7DP7ZF2J.js → run-D6XJ34CN.js} +79 -83
  134. package/dist/{share-WML67FT3.js → share-2NWMJJEE.js} +14 -15
  135. package/dist/{skills-SG662R2K.js → skills-KR7WON5G.js} +18 -19
  136. package/dist/{skills-eval-VVZEUU46.js → skills-eval-O2ZNOLDS.js} +49 -46
  137. package/dist/{skills-inventory-I2E23GET.js → skills-inventory-ZZOUBK7O.js} +14 -14
  138. package/dist/{slash-commands-S7MBJDQK.js → slash-commands-ZXPJD64J.js} +32 -23
  139. package/dist/{steer-2LQOMCPB.js → steer-XA25PSCS.js} +3 -3
  140. package/dist/{support-CC2UJBJ6.js → support-7EMVWYG2.js} +2 -2
  141. package/dist/{targets-4QC3HIEW.js → targets-OMH2XCSN.js} +25 -27
  142. package/dist/tasks-IPAGMEIX.js +36 -0
  143. package/dist/{terminal-lease-TUHIJ6Y2.js → terminal-lease-C2J3JYRE.js} +4 -4
  144. package/dist/{tools-TFGJICCU.js → tools-EFFEAIDP.js} +5 -6
  145. package/dist/{uninstall-5PEVOE5B.js → uninstall-HALS6BLF.js} +7 -8
  146. package/dist/{upgrade-M4WXY6KN.js → upgrade-MS72RJEP.js} +14 -11
  147. package/dist/{usage-N7ZNVLEM.js → usage-NHG6MCJM.js} +60 -51
  148. package/dist/{verifiers-DJTP4XX6.js → verifiers-7AUNVXDY.js} +150 -17
  149. package/dist/{verify-RWE4PPEK.js → verify-FWYGPKMR.js} +12 -10
  150. package/dist/{web-fetch-MPARV2K7.js → web-fetch-V4FKSDAV.js} +4 -4
  151. package/dist/{wiki-generate-C7IQOXSP.js → wiki-generate-743CIGJW.js} +63 -56
  152. package/dist/{with-panes-4GCGSL7J.js → with-panes-BDQEWBRT.js} +2 -2
  153. package/dist/worker/entry.js +36 -33
  154. package/docs/README.md +3 -2
  155. package/docs/architecture/acp.md +17 -0
  156. package/docs/architecture/artifact-versions.md +1 -1
  157. package/docs/architecture/dispatch-typed-intent.md +1 -1
  158. package/docs/architecture/evidence-and-memory.md +1 -1
  159. package/docs/architecture/observability.md +7 -1
  160. package/docs/architecture/prompt-envelope-and-tools.md +15 -5
  161. package/docs/architecture/safety-model.md +10 -17
  162. package/docs/architecture/tui-design.md +1 -1
  163. package/docs/guide/built-in-agents.md +8 -8
  164. package/docs/guide/commands-and-modes.md +17 -2
  165. package/docs/guide/configuration-and-targets.md +3 -1
  166. package/docs/guide/configuration-reference.md +10 -5
  167. package/docs/guide/environment-variables.md +2 -2
  168. package/docs/guide/tool-usage.md +78 -3
  169. package/docs/history/config-knobs-audit.md +2 -2
  170. package/docs/process/development-pipeline.md +6 -1
  171. package/docs/process/git-commit-provenance.md +15 -0
  172. package/docs/process/release-cut-checklist.md +207 -0
  173. package/docs/process/scientific-validation.md +18 -17
  174. package/evals/behavioral-machinery-support.ts +1 -0
  175. package/evals/behavioral-machinery.yaml +1 -1
  176. package/package.json +1 -1
  177. package/skills/coding/coding-standards/SKILL.md +14 -4
  178. package/skills/context/context-handoff/SKILL.md +3 -3
  179. package/skills/context/context-prime/SKILL.md +3 -3
  180. package/skills/planning/architecture/SKILL.md +5 -5
  181. package/skills/planning/backlog/SKILL.md +4 -4
  182. package/skills/planning/prd/SKILL.md +4 -3
  183. package/skills/planning/product-intent/SKILL.md +8 -8
  184. package/skills/planning/tech-spec/SKILL.md +4 -4
  185. package/skills/registry.yaml +32 -32
  186. package/skills/research/arxiv-literature/SKILL.md +3 -3
  187. package/skills/research/experiment-protocol/SKILL.md +3 -3
  188. package/skills/research/scientific-debugging/SKILL.md +3 -2
  189. package/skills/research/scientific-modernization/SKILL.md +3 -3
  190. package/skills/skill-marketplace.json +16 -16
  191. package/skills/workflow/cut-it/SKILL.md +3 -4
  192. package/skills/workflow/design-council/SKILL.md +5 -10
  193. package/skills/workflow/grill-me/SKILL.md +14 -15
  194. package/skills/workflow/workflow-distiller/SKILL.md +4 -4
  195. package/src/cli/args.ts +0 -8
  196. package/src/cli/configure.ts +2 -1
  197. package/src/cli/doctor-state-size.ts +1 -12
  198. package/src/cli/doctor-validation-contract.ts +28 -0
  199. package/src/cli/doctor.ts +5 -0
  200. package/src/cli/evidence-detail.ts +1 -75
  201. package/src/cli/evidence-inventory.ts +1 -167
  202. package/src/cli/index.ts +2 -0
  203. package/src/cli/run.ts +0 -2
  204. package/src/cli/targets.ts +1 -1
  205. package/src/cli/tasks.ts +84 -0
  206. package/src/cli/upgrade.ts +10 -5
  207. package/src/cli/usage.ts +6 -0
  208. package/src/cli/verifiers.ts +147 -1
  209. package/src/cli/wiki-generate.ts +1 -0
  210. package/src/core/commit-attribution.ts +41 -1
  211. package/src/core/git-commit-attribution.ts +46 -3
  212. package/src/core/run-overrides.ts +0 -5
  213. package/src/core/skill-activation.ts +3 -0
  214. package/src/core/tool-names.ts +5 -2
  215. package/src/domains/agents/builtins/architect.md +1 -1
  216. package/src/domains/agents/builtins/coder.md +1 -1
  217. package/src/domains/agents/builtins/documenter.md +1 -1
  218. package/src/domains/agents/builtins/git-master.md +1 -1
  219. package/src/domains/agents/builtins/provenance.md +7 -7
  220. package/src/domains/agents/builtins/tester.md +1 -1
  221. package/src/domains/agents/builtins/verifier.md +2 -2
  222. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  223. package/src/domains/context/extension.ts +31 -7
  224. package/src/domains/context/refresh.ts +3 -0
  225. package/src/domains/context/wiki/frontmatter.ts +5 -2
  226. package/src/domains/context/wiki/generate.ts +6 -0
  227. package/src/domains/context/wiki/prompts.ts +43 -0
  228. package/src/domains/dispatch/active-route-planner.ts +4 -0
  229. package/src/domains/dispatch/code-step.ts +11 -4
  230. package/src/domains/dispatch/contract.ts +31 -7
  231. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  232. package/src/domains/dispatch/extension.ts +50 -27
  233. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  234. package/src/domains/dispatch/fleet-run.ts +1 -0
  235. package/src/domains/dispatch/host-verification.ts +114 -13
  236. package/src/domains/dispatch/intent.ts +28 -18
  237. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  238. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  239. package/src/domains/dispatch/reservation-store.ts +5 -3
  240. package/src/domains/dispatch/state.ts +15 -2
  241. package/src/domains/dispatch/types.ts +17 -2
  242. package/src/domains/eval/runners/clio-run.ts +12 -9
  243. package/src/domains/eval/runners/context-index.ts +2 -7
  244. package/src/domains/eval/runners/context-init.ts +3 -6
  245. package/src/domains/eval/runners/external-command.ts +29 -11
  246. package/src/domains/evidence/build.ts +102 -15
  247. package/src/domains/evidence/detail.ts +69 -0
  248. package/src/domains/evidence/eval.ts +13 -1
  249. package/src/domains/evidence/finish-contract-map.ts +5 -1
  250. package/src/domains/evidence/inventory.ts +167 -0
  251. package/src/domains/evidence/store.ts +16 -0
  252. package/src/domains/evidence/types.ts +12 -0
  253. package/src/domains/extensions/resources.ts +7 -0
  254. package/src/domains/middleware/marketplace-offer.ts +20 -1
  255. package/src/domains/middleware/runtime.ts +7 -3
  256. package/src/domains/mux/detect.ts +3 -6
  257. package/src/domains/observability/accountability.ts +15 -1
  258. package/src/domains/observability/contract.ts +52 -7
  259. package/src/domains/observability/evidence-index.ts +10 -0
  260. package/src/domains/observability/extension.ts +9 -5
  261. package/src/domains/observability/projection.ts +394 -45
  262. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  263. package/src/domains/prompts/fragments/operating/contract.md +2 -0
  264. package/src/domains/prompts/fragments/wiki/page.md +8 -0
  265. package/src/domains/providers/model-discovery.ts +1 -4
  266. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
  267. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  268. package/src/domains/providers/support.ts +1 -1
  269. package/src/domains/providers/types/runtime-descriptor.ts +1 -1
  270. package/src/domains/safety/action-classifier.ts +7 -0
  271. package/src/domains/safety/default-path-policy.ts +2 -0
  272. package/src/domains/safety/finish-contract-registration.ts +29 -14
  273. package/src/domains/safety/finish-contract.ts +252 -40
  274. package/src/domains/safety/index.ts +20 -1
  275. package/src/domains/safety/policy-engine.ts +26 -6
  276. package/src/domains/safety/rigor.ts +53 -39
  277. package/src/domains/safety/validation-contract.ts +388 -0
  278. package/src/domains/session/archive-readers.ts +10 -1
  279. package/src/domains/session/decision-board.ts +101 -2
  280. package/src/domains/session/entries.ts +44 -7
  281. package/src/domains/session/extension.ts +4 -4
  282. package/src/domains/session/handoff.ts +2 -1
  283. package/src/domains/session/manager.ts +2 -3
  284. package/src/domains/session/task-board.ts +14 -1
  285. package/src/domains/session/tree/fork.ts +1 -2
  286. package/src/domains/session/tree/navigator.ts +1 -1
  287. package/src/domains/user-tasks/acceptance.ts +56 -0
  288. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  289. package/src/domains/user-tasks/store.ts +34 -3
  290. package/src/engine/acp/adapter.ts +24 -6
  291. package/src/engine/acp/server.ts +21 -4
  292. package/src/engine/acp/transport.ts +53 -8
  293. package/src/engine/acp/types.ts +4 -0
  294. package/src/engine/apis/ollama-native.ts +15 -0
  295. package/src/engine/claude/subprocess-runtime.ts +107 -60
  296. package/src/engine/external-subprocess.ts +12 -4
  297. package/src/entry/orchestrator.ts +11 -2
  298. package/src/interactive/dispatch-board.ts +46 -717
  299. package/src/interactive/fleet-run-preview.ts +2 -1
  300. package/src/interactive/interactive-application.ts +3 -2
  301. package/src/interactive/interactive-presentation.ts +55 -12
  302. package/src/interactive/interactive-slash-runtime.ts +2 -1
  303. package/src/interactive/oracle.ts +5 -2
  304. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  305. package/src/interactive/overlays/message-picker.ts +2 -2
  306. package/src/interactive/overlays/settings.ts +2 -2
  307. package/src/interactive/overlays/tree-selector.ts +2 -2
  308. package/src/interactive/renderers/branch-summary.ts +1 -1
  309. package/src/interactive/slash-autocomplete.ts +4 -6
  310. package/src/interactive/slash-commands.ts +25 -39
  311. package/src/interactive/slash-spec.ts +28 -0
  312. package/src/interactive/view/artifacts.ts +2 -0
  313. package/src/interactive/worker-stream.ts +7 -3
  314. package/src/tools/bootstrap.ts +4 -0
  315. package/src/tools/builtin-tool-catalog.ts +31 -0
  316. package/src/tools/compete-worktrees.ts +7 -1
  317. package/src/tools/core-bootstrap.ts +16 -0
  318. package/src/tools/decide.ts +136 -0
  319. package/src/tools/dispatch-admission.ts +21 -0
  320. package/src/tools/dispatch-plan.ts +5 -2
  321. package/src/tools/dispatch-runner.ts +15 -1
  322. package/src/tools/dispatch-types.ts +6 -0
  323. package/src/tools/evidence.ts +96 -0
  324. package/src/tools/limitation.ts +76 -0
  325. package/src/tools/policy.ts +9 -0
  326. package/src/tools/presentation.ts +3 -0
  327. package/src/tools/registry.ts +1 -1
  328. package/src/tools/result-shaping.ts +17 -5
  329. package/src/tools/task-worktree.ts +13 -3
  330. package/src/tools/tasks.ts +10 -1
  331. package/src/tools/verify/authoring.ts +170 -83
  332. package/src/tools/verify/catalog.ts +122 -5
  333. package/src/tools/verify/index.ts +2 -1
  334. package/src/tools/verify/numeric.ts +298 -0
  335. package/src/tools/verify/perf.ts +143 -0
  336. package/src/tools/verify/scripts.ts +229 -2
  337. package/dist/chunk-7DICMOS6.js +0 -313
  338. package/dist/chunk-RVG5JXAL.js +0 -41
  339. package/dist/chunk-T56WDKA5.js +0 -183
  340. package/dist/chunk-VPKWYKEY.js +0 -169
@@ -1,78 +1,4 @@
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 {
22
- inspectEvidence,
23
- TRUST_STATUS_AXES,
24
- type TrustStatusAxis,
25
- type TrustVerdict,
26
- trustVerdict,
27
- } from "../domains/evidence/index.js";
28
-
29
- export const EVIDENCE_DETAIL_MAX_RUNS = 16;
30
-
31
- export interface EvidenceDetailRun {
32
- readonly runId: string;
33
- readonly verdict: TrustVerdict;
34
- /** Every axis, always all six, so an absent axis is stated rather than missing. */
35
- readonly axes: Readonly<Record<TrustStatusAxis, string>>;
36
- }
37
-
38
- export interface EvidenceDetailSnapshot {
39
- readonly version: 1;
40
- readonly generatedAt: string;
41
- readonly evidenceId: string;
42
- readonly sourceKind: "run" | "session" | "eval";
43
- /** False when the bundle predates the canonical trust projection. */
44
- readonly canonical: boolean;
45
- readonly runs: readonly EvidenceDetailRun[];
46
- readonly runsTruncated: boolean;
47
- }
48
-
49
- async function evidenceDetailSnapshot(
50
- evidenceId: string,
51
- now: () => number = Date.now,
52
- dataDir: string = clioDataDir(),
53
- ): Promise<EvidenceDetailSnapshot> {
54
- const inspected = await inspectEvidence(dataDir, evidenceId);
55
- const all = inspected.trustStatus.runs;
56
- const window = all.slice(0, EVIDENCE_DETAIL_MAX_RUNS);
57
- return {
58
- version: 1,
59
- generatedAt: new Date(now()).toISOString(),
60
- evidenceId: inspected.overview.evidenceId,
61
- sourceKind: inspected.overview.source.kind,
62
- canonical: inspected.trustStatus.projection === "canonical",
63
- runs: window.map(
64
- (run): EvidenceDetailRun => ({
65
- runId: run.runId,
66
- verdict: trustVerdict(run.status),
67
- axes: Object.fromEntries(TRUST_STATUS_AXES.map((axis) => [axis, run.status[axis].state])) as Record<
68
- TrustStatusAxis,
69
- string
70
- >,
71
- }),
72
- ),
73
- runsTruncated: all.length > window.length,
74
- };
75
- }
1
+ import { evidenceDetailSnapshot } from "../domains/evidence/detail.js";
76
2
 
77
3
  /**
78
4
  * `clio-coder evidence inspect <id> --json`.
@@ -1,170 +1,4 @@
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 {
17
- EVIDENCE_TAGS,
18
- type EvidenceOverview,
19
- type EvidenceTag,
20
- listEvidenceOverviews,
21
- loadEvidenceTrustStatus,
22
- type TrustVerdict,
23
- trustVerdict,
24
- } from "../domains/evidence/index.js";
25
- import { sanitizeCallTargetText } from "../domains/safety/call-target.js";
26
- import { truncateToWidth } from "../engine/tui-primitives.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
- 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
- }
1
+ import { evidenceInventorySnapshot } from "../domains/evidence/inventory.js";
168
2
 
169
3
  /**
170
4
  * `clio-coder evidence inventory --json`, and nothing else.
package/src/cli/index.ts CHANGED
@@ -71,6 +71,7 @@ Usage:
71
71
  clio-coder extensions install, list, enable, disable, or remove extension packages
72
72
  clio-coder skills list, inspect, validate, or install skills
73
73
  clio-coder library list, search, add, or sync agents, prompts, fleets, and skills from catalogs
74
+ clio-coder tasks list, add, hand, finish, or drop project operator tasks
74
75
  clio-coder verifiers discover, inspect, author, validate, edit, or dry-run project checks
75
76
  clio-coder tools list|status|install|remove <id> pinned external programs Clio can drive
76
77
  clio-coder interop inspect --json detected external coding agents and how far each one is wired
@@ -259,6 +260,7 @@ const COMMAND_HANDLERS = new Map<string, CommandHandler>([
259
260
  ["fleet", async (subArgs) => (await import("./fleet.js")).runFleetCommand(subArgs)],
260
261
  ["skills", async (subArgs) => (await import("./skills.js")).runSkillsCommand(subArgs)],
261
262
  ["library", async (subArgs) => (await import("./library.js")).runLibraryCommand(subArgs)],
263
+ ["tasks", async (subArgs) => (await import("./tasks.js")).runTasksCommand(subArgs)],
262
264
  ["verifiers", async (subArgs) => (await import("./verifiers.js")).runVerifiersCommand(subArgs)],
263
265
  ["docs", async (subArgs) => (await import("./docs.js")).runDocsCommand(subArgs)],
264
266
  ["share", async (subArgs) => (await import("./share.js")).runShareCommand(subArgs)],
package/src/cli/run.ts CHANGED
@@ -62,7 +62,6 @@ Flags:
62
62
  --frequency-penalty <N> one-run frequency penalty override
63
63
  --repeat-penalty <N> one-run repeat penalty override
64
64
  --max-context-tokens <N> one-run context-window override for supported local runtimes
65
- --kv-cache-mode <mode> one-run KV-cache mode override: f16|f32|none|false|q8_0|q4_0|q4_1|iq4_nl|q5_0|q5_1
66
65
  --json stream JSONL events for the main-agent path; dispatch streams events and receipt JSON
67
66
  --json-events <mode> main-agent JSON stream mode: full|terminal; implies --json
68
67
  --steer-channel <path> read live steering lines from a FIFO or appended regular file
@@ -213,7 +212,6 @@ export async function runClioRun(
213
212
  return withRunOverrides(
214
213
  {
215
214
  ...(parsed.maxContextTokens !== undefined ? { maxContextTokens: parsed.maxContextTokens } : {}),
216
- ...(parsed.kvCacheMode !== undefined ? { kvCacheMode: parsed.kvCacheMode } : {}),
217
215
  },
218
216
  async () => {
219
217
  if (parsed.help) {
@@ -1003,7 +1003,7 @@ function formatUrl(status: TargetStatus): string {
1003
1003
 
1004
1004
  function formatAuth(providers: ProvidersContract, status: TargetStatus): string {
1005
1005
  if (!status.runtime) return "-";
1006
- if (status.runtime.externalAgentLoop !== undefined) return "operator session";
1006
+ if (status.runtime.externalAgentLoop !== undefined && status.runtime.auth !== "claude-cli") return "operator session";
1007
1007
  if (status.runtime.auth !== "api-key" && status.runtime.auth !== "oauth") return status.runtime.auth;
1008
1008
  const auth = providers.auth.statusForTarget(status.target, status.runtime);
1009
1009
  if (!auth.available) return "disconnected";
@@ -0,0 +1,84 @@
1
+ import { normalizeIntentExpectedOutputs, normalizeIntentVerification } from "../domains/dispatch/intent.js";
2
+ import type { UserTaskAcceptance } from "../domains/user-tasks/acceptance.js";
3
+ import { createUserTasksStore } from "../domains/user-tasks/store.js";
4
+ import { packageDeclaredCheck } from "../tools/verify/catalog.js";
5
+ import { discoverDeclaredChecksAtRoot, discoverDeclaredProjectEntriesAtRoot } from "../tools/verify/scripts.js";
6
+ import { printError } from "./argv.js";
7
+
8
+ /** Operator flags use the same bounds and normalization as dispatch intent. */
9
+ export function acceptanceFromTaskFlags(
10
+ cwd: string,
11
+ expectedOutputs: string[],
12
+ verify: string[],
13
+ ): UserTaskAcceptance | undefined {
14
+ if (expectedOutputs.length === 0 && verify.length === 0) return undefined;
15
+ const discovery = discoverDeclaredChecksAtRoot(cwd, undefined);
16
+ if (!discovery.ok) throw new Error(discovery.reason);
17
+ const checks = new Map(
18
+ discovery.sources.flatMap((source) => source.checks.map((check) => [check.id, check] as const)),
19
+ );
20
+ for (const entry of discoverDeclaredProjectEntriesAtRoot(cwd)) {
21
+ if (entry.kind === "package-script" && !checks.has(entry.id))
22
+ checks.set(entry.id, packageDeclaredCheck(entry.id, entry.path, ".", []));
23
+ }
24
+ const verification = verify.map((value) => {
25
+ const suffix = checks.has(value) ? null : /^(.*):([0-9]+)$/.exec(value);
26
+ const check = suffix?.[1] ?? value;
27
+ if (!checks.has(check))
28
+ throw new Error(
29
+ `Unknown verification check '${check}'. Known ids: ${[...checks.keys()].sort().join(", ") || "(none)"}`,
30
+ );
31
+ return { check, ...(suffix ? { timeout_ms: Number(suffix[2]) } : {}) };
32
+ });
33
+ const outputs = normalizeIntentExpectedOutputs(expectedOutputs);
34
+ if (!Array.isArray(outputs)) throw new Error(outputs.ok ? "invalid expected outputs" : outputs.message);
35
+ const normalized = normalizeIntentVerification(verification, checks);
36
+ if (!Array.isArray(normalized)) throw new Error(normalized.ok ? "invalid verification" : normalized.message);
37
+ return { expectedOutputs: outputs, verification: normalized };
38
+ }
39
+
40
+ const HELP = `Usage:
41
+ clio-coder tasks [list]
42
+ clio-coder tasks add [--expect <path>] [--verify <checkId>[:timeoutMs]] <text>
43
+ clio-coder tasks hand|done|drop <uN>
44
+
45
+ --expect and --verify are repeatable. Check ids must be declared in package.json or .clio-coder/verifiers.yaml.`;
46
+
47
+ export function runTasksCommand(args: string[]): number {
48
+ try {
49
+ if (args.includes("--help") || args.includes("-h")) {
50
+ console.log(HELP);
51
+ return 0;
52
+ }
53
+ const store = createUserTasksStore({ cwd: process.cwd() });
54
+ const [action = "list", ...rest] = args;
55
+ if (action === "add") {
56
+ const expected: string[] = [],
57
+ verify: string[] = [],
58
+ title: string[] = [];
59
+ for (let index = 0; index < rest.length; index++) {
60
+ const token = rest[index] ?? "";
61
+ if (token === "--") {
62
+ title.push(...rest.slice(index + 1));
63
+ break;
64
+ }
65
+ if (token === "--expect" || token === "--verify") {
66
+ const value = rest[++index];
67
+ if (!value || value.startsWith("--")) throw new Error(`${token} requires a value`);
68
+ (token === "--expect" ? expected : verify).push(value);
69
+ } else if (token.startsWith("--")) throw new Error(`Unknown flag ${token}`);
70
+ else title.push(token);
71
+ }
72
+ const task = store.add(title.join(" "), undefined, acceptanceFromTaskFlags(process.cwd(), expected, verify));
73
+ console.log(`logged operator task ${task.id}: ${task.title}`);
74
+ } else if (action === "list" && rest.length === 0) {
75
+ console.log(JSON.stringify(store.snapshot(), null, 2));
76
+ } else if ((action === "hand" || action === "done" || action === "drop") && rest.length === 1) {
77
+ console.log(JSON.stringify(store[action](rest[0] ?? ""), null, 2));
78
+ } else throw new Error(HELP);
79
+ return 0;
80
+ } catch (error) {
81
+ printError(error instanceof Error ? error.message : String(error));
82
+ return 1;
83
+ }
84
+ }
@@ -88,12 +88,17 @@ type RegistryLookup =
88
88
  | { asked: false; reason: "source checkout" | "network checks are disabled" }
89
89
  | { asked: true; version: string | null };
90
90
 
91
+ function testSeam(name: string): string | undefined {
92
+ if (process.env.NODE_ENV !== "test") return undefined;
93
+ return process.env[name];
94
+ }
95
+
91
96
  async function lookUpAvailableVersion(
92
97
  channel: Channel,
93
98
  method: "source" | "npm",
94
99
  noNetwork: boolean,
95
100
  ): Promise<RegistryLookup> {
96
- const seam = process.env.CLIO_CODER_TEST_UPGRADE_AVAILABLE;
101
+ const seam = testSeam("CLIO_CODER_TEST_UPGRADE_AVAILABLE");
97
102
  // `unreachable` stands in for a registry that answered nothing, which is the
98
103
  // only way to reach that branch without a network in the test.
99
104
  if (seam) return { asked: true, version: seam === "unreachable" ? null : seam };
@@ -143,14 +148,14 @@ async function runChild(command: string, args: ReadonlyArray<string>, label: str
143
148
  }
144
149
 
145
150
  async function runNpmInstall(channel: Channel): Promise<void> {
146
- if (process.env.CLIO_CODER_TEST_UPGRADE_FAIL === "npm") {
151
+ if (testSeam("CLIO_CODER_TEST_UPGRADE_FAIL") === "npm") {
147
152
  throw new Error("npm ERR! 404 Not Found (mock failure)");
148
153
  }
149
154
  await runChild("npm", ["install", "-g", `@iowarp/clio-coder@${channel}`], "npm install");
150
155
  }
151
156
 
152
157
  async function runDoctorFixAfterInstall(): Promise<void> {
153
- if (process.env.CLIO_CODER_TEST_UPGRADE_FAIL === "doctor") {
158
+ if (testSeam("CLIO_CODER_TEST_UPGRADE_FAIL") === "doctor") {
154
159
  throw new Error("mock doctor fix failure");
155
160
  }
156
161
  await runChild("clio-coder", ["doctor", "--fix"], "clio-coder doctor --fix");
@@ -184,7 +189,7 @@ export async function runUpgradeCommand(argv: ReadonlyArray<string>): Promise<nu
184
189
  const methodLabel = method === "source" ? "source checkout" : "npm global";
185
190
  presenter.setMethod(methodLabel);
186
191
 
187
- const noNetwork = Boolean(process.env.CLIO_CODER_TEST_UPGRADE_NO_NETWORK);
192
+ const noNetwork = Boolean(testSeam("CLIO_CODER_TEST_UPGRADE_NO_NETWORK"));
188
193
  const lookup = await lookUpAvailableVersion(opts.channel, method, noNetwork);
189
194
  const availableVersion = lookup.asked ? lookup.version : null;
190
195
 
@@ -285,7 +290,7 @@ export async function runUpgradeCommand(argv: ReadonlyArray<string>): Promise<nu
285
290
  } else {
286
291
  let result: Awaited<ReturnType<typeof runPending>>;
287
292
  try {
288
- if (process.env.CLIO_CODER_TEST_UPGRADE_FAIL === "migration") {
293
+ if (testSeam("CLIO_CODER_TEST_UPGRADE_FAIL") === "migration") {
289
294
  throw new Error("mock migration failure in 2026-09-01-settings-v2");
290
295
  }
291
296
  result = await runPending(stateDir);
package/src/cli/usage.ts CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  } from "../core/response-model-id.js";
9
9
  import { clioDataDir, clioStateDir } from "../core/xdg.js";
10
10
  import { loadMemoryRecordsSync, type MemoryRecord } from "../domains/memory/index.js";
11
+ import { summarizeEvidenceIndex } from "../domains/observability/accountability.js";
11
12
  import { summarizeFailedCompactionUsage } from "../domains/observability/compaction-usage.js";
12
13
  import { readEvidenceIndex } from "../domains/observability/evidence-index.js";
13
14
  import { type OutOfTurnUsageRow, readOutOfTurnUsageRows } from "../domains/observability/out-of-turn-usage.js";
@@ -358,6 +359,7 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
358
359
  return decision === "blocked" || decision === "denied";
359
360
  });
360
361
  const evidenceRows = readEvidenceIndex(stateDir).filter((row) => inWindow(row.generatedAt, windowStart, now));
362
+ const accountability = summarizeEvidenceIndex(evidenceRows);
361
363
  let memoryRecords: MemoryRecord[] = [];
362
364
  try {
363
365
  memoryRecords = loadMemoryRecordsSync(clioDataDir());
@@ -559,6 +561,8 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
559
561
  else emit({ kind: "fact", fact: "session-store-missing", path: presence.sessionsPath });
560
562
  if (presence.receiptsPresent) emit({ kind: "fact", fact: "dispatch-runs", value: receipts.length });
561
563
  else emit({ kind: "fact", fact: "receipt-store-missing", path: presence.receiptsPath });
564
+ emit({ kind: "fact", fact: "unverified-successes", value: accountability.unverifiedSuccesses });
565
+ emit({ kind: "fact", fact: "ungrounded-claims", value: accountability.ungroundedClaims });
562
566
  emit({ kind: "fact", fact: "audit-tool-calls", value: auditToolCalls.length, blocked: auditBlocked.length });
563
567
  if (usageMeasurable) {
564
568
  // The origin split is emitted only when something out of turn was
@@ -806,6 +810,8 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
806
810
  ),
807
811
  );
808
812
  }
813
+ out(` unverified successes: ${accountability.unverifiedSuccesses}`);
814
+ out(` ungrounded claims: ${accountability.ungroundedClaims}`);
809
815
  if (tagCounts.size > 0) {
810
816
  out("");
811
817
  out(" failure tags (from evidence index)");