@iowarp/clio-coder 0.3.7 → 0.3.9

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 (400) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +13 -4
  3. package/dist/{acp-SK4MD6MM.js → acp-7LOELQFP.js} +13 -13
  4. package/dist/{agents-2FN2K6ME.js → agents-FIBG2SHA.js} +41 -37
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-QIYZWM5I.js → auth-OI4LIH2I.js} +31 -24
  7. package/dist/builtins-AD25UL3C.js +17 -0
  8. package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
  9. package/dist/chunk-3DPEIQKN.js +113 -0
  10. package/dist/{chunk-EOOQZZDE.js → chunk-3DUR4WUA.js} +19 -19
  11. package/dist/{chunk-WHJYKASB.js → chunk-3MRC2YSQ.js} +2 -2
  12. package/dist/{chunk-EBEFWSGL.js → chunk-3UUY7R3Z.js} +14 -10
  13. package/dist/{chunk-LADCF22A.js → chunk-3V5AYSEQ.js} +113 -54
  14. package/dist/{chunk-BMWK7ZIZ.js → chunk-465CC7FK.js} +16 -13
  15. package/dist/{chunk-5WIGXA4T.js → chunk-47CMYGET.js} +111 -4
  16. package/dist/{chunk-CEYBNUGC.js → chunk-4H6ULJ3H.js} +378 -36
  17. package/dist/{chunk-YTYFXUI3.js → chunk-4LJX2PUC.js} +9 -9
  18. package/dist/{chunk-DOOEX22V.js → chunk-56KB5IJP.js} +5 -5
  19. package/dist/{chunk-SPULKLCF.js → chunk-5DQRIYDZ.js} +2 -2
  20. package/dist/{chunk-TSHXZTOQ.js → chunk-5HFBWUMU.js} +23 -11
  21. package/dist/{chunk-5UJ6ECTS.js → chunk-5PVQ4SRS.js} +80 -8
  22. package/dist/{chunk-ZWLZP4ZT.js → chunk-5QKCQQ3E.js} +359 -17
  23. package/dist/{chunk-6M7VS3J3.js → chunk-5T7RBWN2.js} +111 -5
  24. package/dist/chunk-774ILSRL.js +172 -0
  25. package/dist/chunk-7C6RYZGQ.js +391 -0
  26. package/dist/{chunk-GH5622CP.js → chunk-A2NJGIB3.js} +2 -2
  27. package/dist/{chunk-C4JBQ5SR.js → chunk-AD7Y7STJ.js} +6 -6
  28. package/dist/{chunk-GEYXPTRF.js → chunk-AEYBF3TB.js} +33 -12
  29. package/dist/{chunk-2SFS6XQE.js → chunk-AMKHQW3C.js} +3 -2
  30. package/dist/{chunk-D4MDIG46.js → chunk-B5CSFE7B.js} +7 -7
  31. package/dist/{chunk-MXI6J5JF.js → chunk-B5XRQOLB.js} +10 -10
  32. package/dist/{chunk-X2KV5FXT.js → chunk-BVDVID7E.js} +2 -2
  33. package/dist/{chunk-JNXPYBB4.js → chunk-CA42X6KT.js} +3 -3
  34. package/dist/{chunk-VREKEFLL.js → chunk-D73KXYPF.js} +3 -3
  35. package/dist/{chunk-JTSEDYVQ.js → chunk-DG4M6ZUE.js} +7 -7
  36. package/dist/{chunk-DQA7QLMD.js → chunk-EBOC7MT3.js} +10 -25
  37. package/dist/{chunk-KZ2H5X4G.js → chunk-ECUO3KDP.js} +129 -14
  38. package/dist/{chunk-JRIO5UD2.js → chunk-EQ63NRB7.js} +5 -5
  39. package/dist/{chunk-YD734TPH.js → chunk-FALJGAWU.js} +2 -2
  40. package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
  41. package/dist/{chunk-XEGB6BCN.js → chunk-GAYUJ7LE.js} +68 -14
  42. package/dist/{chunk-UND3GU2L.js → chunk-H7IXIC72.js} +2 -2
  43. package/dist/{chunk-IR4CFBFN.js → chunk-HAY4ZE2P.js} +12 -12
  44. package/dist/{chunk-UVDSQ6LW.js → chunk-HCBCAYZU.js} +74 -147
  45. package/dist/{chunk-4DWFMQDR.js → chunk-HJB5IUKP.js} +89 -145
  46. package/dist/{chunk-M4AKACEO.js → chunk-HKO36JWF.js} +33 -5
  47. package/dist/{chunk-KCMKRQX4.js → chunk-HPCTNZM2.js} +45 -82
  48. package/dist/{chunk-465YSENW.js → chunk-IFBNV6H6.js} +3 -3
  49. package/dist/{chunk-FJ3H4MN5.js → chunk-IHKBWSXF.js} +2 -2
  50. package/dist/chunk-JEQQR47K.js +3025 -0
  51. package/dist/{chunk-FO5ZOVUY.js → chunk-KV2AOLDF.js} +27 -7
  52. package/dist/chunk-LU7P4LHA.js +33 -0
  53. package/dist/{chunk-6TUKSZVF.js → chunk-LXPJXFM5.js} +11 -11
  54. package/dist/{chunk-VQNODYQ4.js → chunk-MIX5N5AC.js} +488 -3668
  55. package/dist/chunk-MLOK6ZOS.js +2888 -0
  56. package/dist/{chunk-ZZMN5OM4.js → chunk-MV2VUEJC.js} +2 -2
  57. package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
  58. package/dist/{chunk-OBMAI2DP.js → chunk-N3PBVRTZ.js} +12 -388
  59. package/dist/{chunk-WJHBC77E.js → chunk-N5XKWMDW.js} +17 -7
  60. package/dist/{chunk-5C3AQNDW.js → chunk-NNNWO6F2.js} +124 -36
  61. package/dist/{chunk-UFQ3F4FW.js → chunk-NQ6UCCOD.js} +4 -4
  62. package/dist/chunk-NUGM5KR6.js +165 -0
  63. package/dist/{chunk-DMD2AGVS.js → chunk-NZU6YDNV.js} +20 -18
  64. package/dist/{chunk-WHGPSPT5.js → chunk-O6I4CIEU.js} +151 -13
  65. package/dist/{chunk-XN3L4EYL.js → chunk-OEDBCISO.js} +2 -2
  66. package/dist/{chunk-PD3MESLB.js → chunk-P3JGPQFL.js} +4 -4
  67. package/dist/{chunk-UHXRNZ2J.js → chunk-PNY46YEY.js} +23 -6
  68. package/dist/{chunk-THKY7CD7.js → chunk-PZ4I4JE2.js} +134 -29
  69. package/dist/{chunk-SROCI7ZU.js → chunk-QQ7EKM72.js} +5 -5
  70. package/dist/{chunk-QCTRSGHQ.js → chunk-R7LNVMCS.js} +91 -53
  71. package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
  72. package/dist/chunk-RKKLTLYB.js +45 -0
  73. package/dist/{chunk-OB5HIGJY.js → chunk-RKRLDWD3.js} +4 -1
  74. package/dist/{chunk-DJNLUABN.js → chunk-S4COXYBG.js} +588 -32
  75. package/dist/{chunk-3HAPLH5M.js → chunk-T3Z6VAAF.js} +172 -11
  76. package/dist/{chunk-FOT2FX5J.js → chunk-TD7UE2L5.js} +12 -10
  77. package/dist/{chunk-UUANF5CR.js → chunk-TEO2TLVN.js} +856 -967
  78. package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
  79. package/dist/{chunk-EELBMBT6.js → chunk-VKBMFOYV.js} +74 -15
  80. package/dist/chunk-VO2LKSTM.js +165 -0
  81. package/dist/{chunk-5C77SEEY.js → chunk-VPTUJU4P.js} +3 -3
  82. package/dist/{chunk-WEH5XRJQ.js → chunk-WIE7ZOSW.js} +2 -2
  83. package/dist/{chunk-J7PIKKWC.js → chunk-WXCJ7VME.js} +8 -8
  84. package/dist/{chunk-4DGYLA73.js → chunk-XDOQXGFO.js} +22 -7
  85. package/dist/{chunk-PPAMZ32Z.js → chunk-XK56QHLX.js} +6 -1
  86. package/dist/{chunk-AB4XIIVB.js → chunk-YKOFT37S.js} +6 -6
  87. package/dist/chunk-YSEHGPCT.js +127 -0
  88. package/dist/{chunk-HFSBBKSQ.js → chunk-YW7UVM5V.js} +138 -3
  89. package/dist/cli/index.js +32 -32
  90. package/dist/{clio-WBVQEBKO.js → clio-LT5V7SSZ.js} +9 -9
  91. package/dist/{code-nav-FGGFIE7L.js → code-nav-LMW275PA.js} +5 -5
  92. package/dist/codewiki/build-worker.js +4 -4
  93. package/dist/{components-F7OEATSO.js → components-ZFA3SAER.js} +8 -8
  94. package/dist/{config-TRBL3RCF.js → config-RXS5T3JT.js} +98 -65
  95. package/dist/{configure-OLCVPHNM.js → configure-2WYWSCSD.js} +26 -22
  96. package/dist/{context-MJIJ6GOX.js → context-I3BTOTCS.js} +12 -12
  97. package/dist/{context-XEWE3MOJ.js → context-MVOORGMF.js} +54 -47
  98. package/dist/{context-WFPKQSM6.js → context-PALKKQYL.js} +28 -28
  99. package/dist/{context-clear-KNOS2JPB.js → context-clear-N2WOYZ2K.js} +53 -46
  100. package/dist/{context-index-SSR5ECNE.js → context-index-HNG3MOME.js} +6 -6
  101. package/dist/{context-working-set-EUXAZI6N.js → context-working-set-MIEVECVZ.js} +17 -18
  102. package/dist/{dispatch-runner-B7MTOVKL.js → dispatch-runner-VVA4SRRH.js} +90 -61
  103. package/dist/{docs-FLJTIDSE.js → docs-7LQ23DLM.js} +8 -8
  104. package/dist/doctor-TWBWFK5V.js +165 -0
  105. package/dist/eval-IJ5VEZDJ.js +4483 -0
  106. package/dist/{evidence-JZNBUOQZ.js → evidence-L5APPXNV.js} +68 -61
  107. package/dist/{evolve-FJVC4KKI.js → evolve-RGNKFJ52.js} +47 -40
  108. package/dist/{extensions-IQL36S7K.js → extensions-7WYWUX5A.js} +13 -7
  109. package/dist/{fleet-BDKYJFCP.js → fleet-6CNVBZZP.js} +113 -76
  110. package/dist/{fleet-commands-ZFIWZSB3.js → fleet-commands-L2SXSYEI.js} +10 -10
  111. package/dist/{fleet-graph-Y6HPXIVF.js → fleet-graph-2J3OOIPO.js} +17 -15
  112. package/dist/{fleet-preflight-BHSNPBMH.js → fleet-preflight-CZRJ4JP5.js} +5 -6
  113. package/dist/{fleet-validate-BIYREGIK.js → fleet-validate-C5RI6DP7.js} +20 -19
  114. package/dist/{init-LQUB5COQ.js → init-VBN2ACVA.js} +70 -63
  115. package/dist/{library-NJAHIGG4.js → library-JHGUMLY2.js} +22 -20
  116. package/dist/{memory-OG6HOYKM.js → memory-K4OQIYWG.js} +49 -42
  117. package/dist/{models-5ZG5XY7J.js → models-2NCZUWDD.js} +35 -29
  118. package/dist/{monitor-TJ7AMTGB.js → monitor-MMVTJABD.js} +64 -45
  119. package/dist/{orchestrator-WZYB54DM.js → orchestrator-ZKBPCHW6.js} +1971 -520
  120. package/dist/{paths-XUC7GS6E.js → paths-DBXMZMDU.js} +5 -5
  121. package/dist/registry-LG64LTF4.js +11 -0
  122. package/dist/{reset-PXQT45IY.js → reset-DD5JGOY3.js} +11 -11
  123. package/dist/{run-FQ74YF62.js → run-QEGNX7FL.js} +89 -83
  124. package/dist/{share-FW7SVCL3.js → share-JKD3BQMW.js} +20 -18
  125. package/dist/{skills-7E7IRB3R.js → skills-LMQIKDOZ.js} +23 -21
  126. package/dist/{skills-eval-LI75W6OK.js → skills-eval-I7X2774U.js} +59 -52
  127. package/dist/{steer-GGWFUJUD.js → steer-CF5TDANS.js} +3 -3
  128. package/dist/support-I7LOJLIF.js +38 -0
  129. package/dist/{targets-4CIFKCTW.js → targets-RUSR6B5Z.js} +77 -42
  130. package/dist/{terminal-lease-WUZY7ZV5.js → terminal-lease-QYVORFR4.js} +6 -4
  131. package/dist/{trace-PNCASAXC.js → trace-ODOQIVIW.js} +61 -6
  132. package/dist/{uninstall-7FV7IP4E.js → uninstall-ZJF5H5ZN.js} +8 -8
  133. package/dist/{upgrade-K2HVIVMQ.js → upgrade-XANW3FXB.js} +29 -26
  134. package/dist/{usage-GTZELZQX.js → usage-4H7ZRXQT.js} +110 -61
  135. package/dist/{verifiers-RLAHT27O.js → verifiers-UZXNBZEB.js} +13 -13
  136. package/dist/{verify-BX3BRKH5.js → verify-BVKWTNDL.js} +9 -9
  137. package/dist/{wiki-generate-ASIFASCN.js → wiki-generate-MY7WV2QI.js} +76 -69
  138. package/dist/worker/entry.js +69 -66
  139. package/docs/alcf-provider.md +1 -1
  140. package/docs/architecture.md +1 -1
  141. package/docs/artifact-versions.md +11 -5
  142. package/docs/built-in-agents.md +1 -1
  143. package/docs/capacity-and-scheduling.md +23 -2
  144. package/docs/commands-and-modes.md +2 -2
  145. package/docs/configuration-and-targets.md +37 -5
  146. package/docs/context-engine.md +63 -4
  147. package/docs/documentation-coverage.md +3 -3
  148. package/docs/documentation-guide.md +1 -1
  149. package/docs/environment-variables.md +2 -0
  150. package/docs/eval-runner.md +262 -11
  151. package/docs/evals-internal.md +72 -2
  152. package/docs/evidence-and-memory.md +77 -12
  153. package/docs/evolution.md +1 -1
  154. package/docs/extensions-and-sharing.md +3 -1
  155. package/docs/fleet-dispatch.md +34 -9
  156. package/docs/glossary.md +21 -1
  157. package/docs/installation-and-lifecycle.md +1 -1
  158. package/docs/middleware-and-components.md +1 -1
  159. package/docs/model-catalog.md +1 -1
  160. package/docs/observability.md +54 -3
  161. package/docs/proactive-memory.md +127 -14
  162. package/docs/prompt-envelope-and-tools.md +22 -2
  163. package/docs/provider-adapter-cookbook.md +1 -1
  164. package/docs/release-cut-checklist.md +60 -41
  165. package/docs/safety-model.md +1 -1
  166. package/docs/scientific-validation.md +1 -1
  167. package/docs/skills-marketplace.md +1 -1
  168. package/docs/tool-usage.md +1 -1
  169. package/docs/trace-store.md +1 -1
  170. package/docs/troubleshooting.md +87 -0
  171. package/docs/tui-design.md +1 -1
  172. package/docs/worker-dispatch-mechanics.md +1 -1
  173. package/package.json +2 -2
  174. package/src/cli/agents.ts +1 -1
  175. package/src/cli/argv.ts +5 -0
  176. package/src/cli/config-inspect.ts +33 -6
  177. package/src/cli/config.ts +1 -1
  178. package/src/cli/configure.ts +107 -23
  179. package/src/cli/doctor-state-size.ts +82 -0
  180. package/src/cli/doctor.ts +7 -1
  181. package/src/cli/eval.ts +80 -16
  182. package/src/cli/evidence.ts +30 -25
  183. package/src/cli/extensions.ts +5 -1
  184. package/src/cli/fleet-preflight.ts +2 -12
  185. package/src/cli/fleet.ts +32 -3
  186. package/src/cli/shared.ts +1 -0
  187. package/src/cli/targets.ts +45 -11
  188. package/src/cli/trace.ts +63 -4
  189. package/src/cli/usage.ts +63 -14
  190. package/src/cli/validate-model.ts +60 -5
  191. package/src/core/bus-events.ts +54 -1
  192. package/src/core/cache-telemetry.ts +42 -0
  193. package/src/core/commit-attribution.ts +4 -4
  194. package/src/core/config.ts +18 -0
  195. package/src/core/defaults.ts +36 -6
  196. package/src/core/endpoint-key.ts +27 -0
  197. package/src/core/path-boundary.ts +100 -0
  198. package/src/core/residency-target-key.ts +25 -0
  199. package/src/core/response-schema.ts +36 -2
  200. package/src/domains/agents/extension.ts +2 -11
  201. package/src/domains/agents/fleet-contract.ts +30 -12
  202. package/src/domains/agents/recipe.ts +7 -1
  203. package/src/domains/agents/registry.ts +73 -5
  204. package/src/domains/agents/result-contract.ts +128 -17
  205. package/src/domains/agents/write-boundary.ts +15 -50
  206. package/src/domains/config/classify.ts +3 -0
  207. package/src/domains/context/codewiki/coordinator.ts +12 -4
  208. package/src/domains/context/project-rules.ts +51 -1
  209. package/src/domains/dispatch/admission.ts +40 -3
  210. package/src/domains/dispatch/assignment-reconcile.ts +22 -5
  211. package/src/domains/dispatch/assignment-store.ts +151 -14
  212. package/src/domains/dispatch/capacity-lease.ts +98 -9
  213. package/src/domains/dispatch/contract.ts +26 -1
  214. package/src/domains/dispatch/delegation-plan.ts +2 -5
  215. package/src/domains/dispatch/execution-plan.ts +44 -4
  216. package/src/domains/dispatch/execution-role.ts +9 -1
  217. package/src/domains/dispatch/extension.ts +309 -96
  218. package/src/domains/dispatch/fleet-run.ts +78 -4
  219. package/src/domains/dispatch/gate-role-prompts.ts +38 -0
  220. package/src/domains/dispatch/heartbeat.ts +32 -8
  221. package/src/domains/dispatch/index.ts +6 -1
  222. package/src/domains/dispatch/intent-requirements.ts +40 -0
  223. package/src/domains/dispatch/intent.ts +84 -8
  224. package/src/domains/dispatch/orphan-recovery.ts +5 -0
  225. package/src/domains/dispatch/path-scope.ts +370 -0
  226. package/src/domains/dispatch/receipt-integrity.ts +2 -1
  227. package/src/domains/dispatch/reservation-store.ts +116 -8
  228. package/src/domains/dispatch/state.ts +4 -0
  229. package/src/domains/dispatch/types.ts +14 -7
  230. package/src/domains/dispatch/validation.ts +6 -3
  231. package/src/domains/dispatch/worker-spawn.ts +25 -11
  232. package/src/domains/dispatch/write-boundary-enforcer.ts +62 -0
  233. package/src/domains/dispatch/write-boundary.ts +262 -22
  234. package/src/domains/eval/artifacts/store.ts +62 -0
  235. package/src/domains/eval/compare/behavioral.ts +224 -0
  236. package/src/domains/eval/compare/compare.ts +355 -2
  237. package/src/domains/eval/compare/envelope.ts +128 -0
  238. package/src/domains/eval/compare/gates.ts +24 -6
  239. package/src/domains/eval/compare/thresholds.ts +30 -3
  240. package/src/domains/eval/execution-provenance.ts +240 -0
  241. package/src/domains/eval/metrics/aggregate.ts +136 -0
  242. package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
  243. package/src/domains/eval/metrics/evidence.ts +79 -2
  244. package/src/domains/eval/metrics/tracked.ts +413 -0
  245. package/src/domains/eval/provenance.ts +117 -0
  246. package/src/domains/eval/reports/comparison.ts +128 -0
  247. package/src/domains/eval/reports/junit.ts +17 -3
  248. package/src/domains/eval/reports/markdown.ts +3 -3
  249. package/src/domains/eval/reports/text.ts +14 -0
  250. package/src/domains/eval/run-compare.ts +20 -0
  251. package/src/domains/eval/runners/clio-run.ts +139 -2
  252. package/src/domains/eval/runners/external-command.ts +28 -3
  253. package/src/domains/eval/schema/adapter.ts +111 -0
  254. package/src/domains/eval/schema/artifact.ts +20 -0
  255. package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
  256. package/src/domains/eval/schema/behavioral.ts +520 -0
  257. package/src/domains/eval/schema/execution-envelope.ts +194 -0
  258. package/src/domains/eval/schema/serving.ts +74 -0
  259. package/src/domains/eval/schema/suite.ts +38 -8
  260. package/src/domains/eval/schema/validate.ts +58 -3
  261. package/src/domains/eval/schema/verdict.ts +237 -0
  262. package/src/domains/eval/suites/resolve.ts +2 -0
  263. package/src/domains/eval/suites/run.ts +264 -33
  264. package/src/domains/eval/verifiers/command.ts +2 -1
  265. package/src/domains/eval/workspaces/temp-copy.ts +145 -13
  266. package/src/domains/evidence/build.ts +68 -21
  267. package/src/domains/evidence/eval.ts +2 -12
  268. package/src/domains/evidence/findings-markdown.ts +33 -0
  269. package/src/domains/evidence/index.ts +21 -0
  270. package/src/domains/evidence/provenance.ts +46 -11
  271. package/src/domains/evidence/run-trust.ts +7 -113
  272. package/src/domains/evidence/trust-projection.ts +274 -0
  273. package/src/domains/evidence/trust-status.ts +145 -17
  274. package/src/domains/evidence/types.ts +4 -0
  275. package/src/domains/extensions/compatibility.ts +285 -0
  276. package/src/domains/extensions/discovery.ts +126 -4
  277. package/src/domains/extensions/resources.ts +21 -9
  278. package/src/domains/extensions/state.ts +18 -5
  279. package/src/domains/extensions/types.ts +6 -1
  280. package/src/domains/lifecycle/doctor.ts +209 -2
  281. package/src/domains/memory/index.ts +14 -0
  282. package/src/domains/memory/task-bank-promotion.ts +64 -0
  283. package/src/domains/memory/task-memory-policy.ts +77 -8
  284. package/src/domains/memory/task-memory-spend.ts +131 -0
  285. package/src/domains/memory/task-memory-status.ts +7 -0
  286. package/src/domains/memory/task-memory-telemetry.ts +2 -0
  287. package/src/domains/middleware/index.ts +1 -0
  288. package/src/domains/middleware/memory-intervention.ts +69 -5
  289. package/src/domains/middleware/memory-step-endpoint.ts +71 -0
  290. package/src/domains/observability/background-memory-usage.ts +140 -0
  291. package/src/domains/observability/cost.ts +1 -1
  292. package/src/domains/observability/index.ts +7 -0
  293. package/src/domains/observability/out-of-turn-usage.ts +51 -2
  294. package/src/domains/observability/trace-store.ts +192 -2
  295. package/src/domains/prompts/compiler.ts +100 -13
  296. package/src/domains/prompts/contract.ts +3 -5
  297. package/src/domains/providers/endpoint-capacity.ts +96 -0
  298. package/src/domains/providers/extension.ts +30 -2
  299. package/src/domains/providers/index.ts +10 -0
  300. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
  301. package/src/domains/providers/runtime-resolution.ts +8 -1
  302. package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
  303. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
  304. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  305. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
  306. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
  307. package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
  308. package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
  309. package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
  310. package/src/domains/providers/types/capability-flags.ts +2 -0
  311. package/src/domains/providers/types/target-descriptor.ts +2 -0
  312. package/src/domains/resources/common-loader.ts +3 -0
  313. package/src/domains/resources/prompts/loader.ts +184 -17
  314. package/src/domains/safety/call-target.ts +52 -0
  315. package/src/domains/safety/policy-engine.ts +5 -5
  316. package/src/domains/safety/run-effects.ts +96 -2
  317. package/src/domains/safety/scope.ts +7 -12
  318. package/src/domains/session/context-accounting.ts +52 -1
  319. package/src/domains/session/context-ledger.ts +37 -13
  320. package/src/domains/session/index.ts +6 -0
  321. package/src/domains/session/prompt-cache.ts +140 -0
  322. package/src/domains/session/prompt-manifest.ts +42 -0
  323. package/src/engine/acp/adapter.ts +18 -3
  324. package/src/engine/acp/server.ts +4 -1
  325. package/src/engine/ai.ts +35 -0
  326. package/src/engine/apis/llamacpp-residency.ts +55 -3
  327. package/src/engine/apis/lmstudio.ts +25 -5
  328. package/src/engine/apis/ollama-native.ts +2 -1
  329. package/src/engine/apis/openai-completions.ts +80 -17
  330. package/src/engine/apis/residency-lock.ts +3 -1
  331. package/src/engine/apis/residency.ts +34 -1
  332. package/src/engine/prompt-templates.ts +18 -1
  333. package/src/engine/provider-payload.ts +29 -1
  334. package/src/engine/worker-runtime.ts +6 -3
  335. package/src/entry/orchestrator.ts +176 -30
  336. package/src/interactive/chat-loop-messages.ts +26 -7
  337. package/src/interactive/chat-loop.ts +318 -41
  338. package/src/interactive/chat-panel.ts +62 -8
  339. package/src/interactive/clio-editor.ts +45 -8
  340. package/src/interactive/context-activity.ts +5 -1
  341. package/src/interactive/context-meter.ts +1 -1
  342. package/src/interactive/context-overlay.ts +40 -10
  343. package/src/interactive/cost-overlay.ts +64 -6
  344. package/src/interactive/dispatch-board.ts +127 -5
  345. package/src/interactive/fleet-run-preview.ts +41 -15
  346. package/src/interactive/handoff-round.ts +41 -2
  347. package/src/interactive/interactive-application.ts +24 -1
  348. package/src/interactive/interactive-event-projection.ts +14 -0
  349. package/src/interactive/interactive-input-runtime.ts +8 -0
  350. package/src/interactive/interactive-presentation.ts +4 -0
  351. package/src/interactive/interactive-shell.ts +20 -17
  352. package/src/interactive/interactive-slash-runtime.ts +27 -4
  353. package/src/interactive/memory-overlay.ts +8 -0
  354. package/src/interactive/mutation-preview.ts +295 -0
  355. package/src/interactive/overlay-general-openers.ts +16 -0
  356. package/src/interactive/overlay-key-routing.ts +38 -0
  357. package/src/interactive/overlay-lifecycle.ts +38 -5
  358. package/src/interactive/overlay-permission-lifecycle.ts +22 -2
  359. package/src/interactive/overlay-session-lifecycle.ts +73 -9
  360. package/src/interactive/overlays/ask-user.ts +91 -19
  361. package/src/interactive/overlays/help-reference.ts +4 -0
  362. package/src/interactive/overlays/prompts.ts +11 -1
  363. package/src/interactive/overlays/settings.ts +176 -48
  364. package/src/interactive/permission-hint.ts +34 -2
  365. package/src/interactive/permission-overlay.ts +159 -9
  366. package/src/interactive/prewarm.ts +197 -0
  367. package/src/interactive/render-trace.ts +162 -15
  368. package/src/interactive/renderers/tool-execution.ts +4 -0
  369. package/src/interactive/side-question.ts +58 -1
  370. package/src/interactive/slash-commands.ts +7 -2
  371. package/src/interactive/status/controller.ts +11 -0
  372. package/src/interactive/status/state-machine.ts +54 -2
  373. package/src/interactive/status/types.ts +7 -0
  374. package/src/interactive/terminal-lease.ts +2 -0
  375. package/src/interactive/turn-context.ts +299 -31
  376. package/src/interactive/turn-persistence.ts +14 -4
  377. package/src/interactive/turn-prewarm.ts +364 -0
  378. package/src/interactive/turn-queues.ts +7 -4
  379. package/src/interactive/turn-runtime.ts +8 -1
  380. package/src/interactive/turn-state.ts +23 -0
  381. package/src/interactive/view/artifacts.ts +42 -9
  382. package/src/interactive/view/view-overlay.ts +43 -6
  383. package/src/interactive/worker-receipts.ts +14 -2
  384. package/src/interactive/worker-stream.ts +8 -0
  385. package/src/tools/ask-user.ts +43 -2
  386. package/src/tools/dispatch-admission.ts +12 -13
  387. package/src/tools/dispatch-arguments.ts +27 -0
  388. package/src/tools/dispatch-plan.ts +46 -9
  389. package/src/tools/dispatch-runner.ts +48 -13
  390. package/src/tools/dispatch-scout.ts +1 -1
  391. package/src/tools/monitor.ts +13 -0
  392. package/src/tools/registry.ts +16 -0
  393. package/src/tools/worker-evidence.ts +19 -13
  394. package/src/worker/spec-contract.ts +2 -1
  395. package/dist/chunk-AOCYTWAV.js +0 -449
  396. package/dist/chunk-HWUFFB6L.js +0 -83
  397. package/dist/chunk-R346GLFC.js +0 -31
  398. package/dist/chunk-ZGH7FGS5.js +0 -1079
  399. package/dist/doctor-RN4YKO2X.js +0 -87
  400. package/dist/eval-RUBJVSNQ.js +0 -2557
@@ -24,13 +24,14 @@ import {
24
24
  type SessionEntry,
25
25
  } from "../session/index.js";
26
26
  import { attributeEvidenceFailure } from "./failure-attribution.js";
27
+ import { renderEvidenceFindingsMarkdown } from "./findings-markdown.js";
27
28
  import { compareCodepoints as compareStrings } from "./ordering.js";
28
29
  import { extractRunProvenance, provenanceTranscriptLines } from "./provenance.js";
29
30
  import { createRedactionTally, redactSecretsDeep, redactSecretsText } from "./redact.js";
30
31
  import { buildEvidenceTrustStatusFile } from "./run-trust.js";
31
32
  import { EVIDENCE_FILES, evidenceDirectory, findingsFile } from "./store.js";
32
- import type { TrustArtifactReference } from "./trust-status.js";
33
- import { inspectRunReceiptTrustStatus } from "./trust-status.js";
33
+ import type { CanonicalTrustStatus, TrustArtifactReference } from "./trust-status.js";
34
+ import { inspectRunReceiptTrustStatus, retiredIntegrityVersionOf } from "./trust-status.js";
34
35
  import {
35
36
  EVIDENCE_VERSION,
36
37
  type EvidenceAuditLinkedRow,
@@ -45,6 +46,7 @@ import {
45
46
  type EvidenceReceiptFile,
46
47
  type EvidenceRunLink,
47
48
  type EvidenceRunSource,
49
+ type EvidenceSeverity,
48
50
  type EvidenceTag,
49
51
  type EvidenceToolEvent,
50
52
  type EvidenceTrustStatusFile,
@@ -158,7 +160,6 @@ export async function buildEvidence(options: BuildEvidenceOptions): Promise<Evid
158
160
  evidenceId,
159
161
  runSources,
160
162
  gateDecisions: gateDecisions.decisions,
161
- auditRows: auditLinks.rows,
162
163
  validationEvidence,
163
164
  });
164
165
  const findings = buildFindings(runSources, trustStatusRaw, sessionLinks, auditLinks, protectedArtifactsRaw);
@@ -195,7 +196,10 @@ export async function buildEvidence(options: BuildEvidenceOptions): Promise<Evid
195
196
  redactedToolEvents,
196
197
  protectedArtifacts,
197
198
  );
198
- const transcript = redactSecretsText(renderTranscript(overview, redactedRunSources, sessionLinks), tally);
199
+ const transcript = redactSecretsText(
200
+ renderTranscript(overview, redactedRunSources, sessionLinks, trustStatusRaw),
201
+ tally,
202
+ );
199
203
  const finalOverview: EvidenceOverview = { ...overview, redactionCount: tally.count };
200
204
  await writeEvidenceFiles(
201
205
  directory,
@@ -285,8 +289,14 @@ function buildFindings(
285
289
  const status = trustByRun.get(source.envelope.id);
286
290
  if (status === undefined) throw new Error(`canonical trust status missing for run ${source.envelope.id}`);
287
291
  if (source.receiptError !== null) {
288
- const tag = source.receiptIntegrityFailed ? "receipt-integrity" : "unknown";
289
- findings.push(finding(findings.length, "warn", tag, source.envelope.id, source.receiptError));
292
+ // The canonical axis, not the raw reason string, says whether the seal
293
+ // was retired: `receipt-retired` is the expected state of every run
294
+ // that predates an integrity bump and is an info row, while
295
+ // `receipt-integrity` stays the warning for a seal that was checked
296
+ // and rejected.
297
+ const retired = retiredIntegrityVersionOf(status.artifactIntegrity) !== null;
298
+ const tag = retired ? "receipt-retired" : source.receiptIntegrityFailed ? "receipt-integrity" : "unknown";
299
+ findings.push(finding(findings.length, retired ? "info" : "warn", tag, source.envelope.id, source.receiptError));
290
300
  }
291
301
  if (
292
302
  isSuccessfulRun(source) &&
@@ -359,6 +369,13 @@ function buildFindings(
359
369
  ),
360
370
  );
361
371
  }
372
+ // The remaining axes were never read here, so a run could finish with
373
+ // no independent review, a contradictory context record, or a mutation
374
+ // nobody validated, and findings.md said nothing. Each finding is
375
+ // selected from the canonical state the way the validation and
376
+ // autonomy findings above are, with the detailed record left in
377
+ // trust-status.json.
378
+ findings.push(...axisFindings(findings.length, source, status));
362
379
  if (source.envelope.status === "stale" || source.envelope.status === "dead") {
363
380
  findings.push(
364
381
  finding(findings.length, "warn", "timeout", source.envelope.id, `run status ${source.envelope.status}`),
@@ -601,7 +618,7 @@ async function writeEvidenceFiles(
601
618
  await writeJson(join(directory, "overview.json"), overview);
602
619
  await writeFile(
603
620
  join(directory, "transcript.md"),
604
- transcript ?? renderTranscript(overview, runSources, sessionLinks),
621
+ transcript ?? renderTranscript(overview, runSources, sessionLinks, trustStatus),
605
622
  "utf8",
606
623
  );
607
624
  await writeJsonl(join(directory, "trace.raw.jsonl"), rawTraceRows(runSources));
@@ -613,7 +630,7 @@ async function writeEvidenceFiles(
613
630
  await writeJson(join(directory, "trust-status.json"), trustStatus);
614
631
  await writeJson(join(directory, "protected-artifacts.json"), protectedArtifacts);
615
632
  await writeJson(join(directory, "findings.json"), findingsFile(overview.evidenceId, [...findings]));
616
- await writeFile(join(directory, "findings.md"), renderFindings(findings), "utf8");
633
+ await writeFile(join(directory, "findings.md"), renderEvidenceFindingsMarkdown(findings, trustStatus), "utf8");
617
634
  }
618
635
 
619
636
  function rawTraceRows(runSources: ReadonlyArray<EvidenceRunSource>): EvidenceRawTraceRow[] {
@@ -636,9 +653,11 @@ function cleanedTraceRows(
636
653
  const rows: EvidenceCleanTraceRow[] = [];
637
654
  for (const source of runSources) {
638
655
  const envelope = source.envelope;
639
- // Clean trace rows project only provenance carried by the sealed receipt.
656
+ // Clean trace rows project only provenance carried by an authenticated
657
+ // receipt: a rejected or retired seal contributes none of its fields.
640
658
  // Runs without receipt provenance keep the standard row shape.
641
- const provenance = source.receipt === null ? {} : extractRunProvenance(source.receipt);
659
+ const receipt = authenticatedReceipt(source);
660
+ const provenance = receipt === null ? {} : extractRunProvenance(receipt);
642
661
  rows.push({
643
662
  kind: "run",
644
663
  runId: envelope.id,
@@ -1258,7 +1277,9 @@ function renderTranscript(
1258
1277
  overview: EvidenceOverview,
1259
1278
  runSources: ReadonlyArray<EvidenceRunSource>,
1260
1279
  sessionLinks: SessionLinkResult,
1280
+ trustStatus: EvidenceTrustStatusFile,
1261
1281
  ): string {
1282
+ const trustByRun = new Map(trustStatus.runs.map((entry) => [entry.runId, entry.status]));
1262
1283
  const lines = [
1263
1284
  `# Evidence ${overview.evidenceId}`,
1264
1285
  "",
@@ -1274,10 +1295,11 @@ function renderTranscript(
1274
1295
  `- ${envelope.id} status=${envelope.status} exit=${exitCode ?? "?"} agent=${envelope.agentId} target=${envelope.targetId}`,
1275
1296
  );
1276
1297
  lines.push(` task: ${truncateText(envelope.task, MAX_TASK_CHARS)}`);
1277
- // Run section rendering reads provenance from the sealed receipt and adds
1278
- // sentences only for fields that are present.
1298
+ // Run section rendering adds a sentence per provenance field the
1299
+ // canonical projection admits; a rejected or retired seal adds none.
1279
1300
  if (source.receipt !== null) {
1280
- for (const line of provenanceTranscriptLines(extractRunProvenance(source.receipt))) {
1301
+ const status = trustByRun.get(envelope.id);
1302
+ for (const line of provenanceTranscriptLines(extractRunProvenance(source.receipt), status)) {
1281
1303
  lines.push(` ${line}`);
1282
1304
  }
1283
1305
  }
@@ -1438,15 +1460,37 @@ function renderSessionTranscriptEntry(linked: LinkedSessionEntry): string[] {
1438
1460
  return [`${prefix} ${String(_exhaustive)}`];
1439
1461
  }
1440
1462
 
1441
- function renderFindings(findings: ReadonlyArray<EvidenceFinding>): string {
1442
- if (findings.length === 0) return "# Findings\n\nNo findings.\n";
1443
- const lines = ["# Findings", ""];
1444
- for (const item of findings) {
1445
- const run = item.runId === null ? "" : ` run=${item.runId}`;
1446
- lines.push(`- ${item.id} [${item.severity}] ${item.tag}${run}: ${item.message}`);
1463
+ /** Independent review, context provenance, and completion evidence, read off the canonical axes. */
1464
+ function axisFindings(offset: number, source: EvidenceRunSource, status: CanonicalTrustStatus): EvidenceFinding[] {
1465
+ const out: EvidenceFinding[] = [];
1466
+ const runId = source.envelope.id;
1467
+ const next = (severity: EvidenceSeverity, tag: EvidenceTag, message: string): void => {
1468
+ out.push(finding(offset + out.length, severity, tag, runId, message));
1469
+ };
1470
+ const review = status.independentReview.state;
1471
+ if (review === "failed") {
1472
+ next("warn", "independent-review", "independent review failed for this run");
1473
+ } else if (review === "not_independent") {
1474
+ next("warn", "independent-review", "review was not independent of the run it judged");
1475
+ } else if (review === "inconclusive") {
1476
+ next("info", "independent-review", "independent review was inconclusive");
1477
+ } else if (isSuccessfulRun(source) && (review === "absent" || review === "unknown")) {
1478
+ next("info", "independent-review", "run was not independently reviewed; its result rests on its own receipt");
1447
1479
  }
1448
- lines.push("");
1449
- return `${lines.join("\n")}\n`;
1480
+ if (status.contextProvenance.state === "invalid") {
1481
+ next("warn", "context-provenance", "context provenance record is contradictory; see trust-status.json");
1482
+ }
1483
+ const completion = status.completionEvidence.state;
1484
+ if (completion === "incomplete") {
1485
+ next(
1486
+ "warn",
1487
+ "completion-evidence",
1488
+ "run mutated the workspace and finished without validation evidence at the completion boundary",
1489
+ );
1490
+ } else if (completion === "limited") {
1491
+ next("info", "completion-evidence", "run finished with an explicit limitation instead of validation evidence");
1492
+ }
1493
+ return out;
1450
1494
  }
1451
1495
 
1452
1496
  async function readRunLedger(stateDir: string): Promise<RunLedgerRows> {
@@ -1507,6 +1551,9 @@ async function readReceipt(
1507
1551
  }
1508
1552
  const integrity = inspectRunReceiptTrustStatus(receipt, envelope).integrity;
1509
1553
  if (!integrity.ok) {
1554
+ // A retired seal is set aside unread, the way a missing receipt is; it
1555
+ // is not a failed one, and its reason already names both versions.
1556
+ if (integrity.retired !== undefined) return { receipt, error: integrity.reason, integrityFailed: false };
1510
1557
  return { receipt, error: `receipt integrity: ${integrity.reason}`, integrityFailed: true };
1511
1558
  }
1512
1559
  return { receipt, error: null, integrityFailed: false };
@@ -5,6 +5,7 @@ import { readGateDecisionArtifactsForRunIds } from "../dispatch/index.js";
5
5
  import { redactArtifactForStorage } from "../eval/artifacts/redact.js";
6
6
  import type { EvalCommandResult, EvalRunArtifact, EvalRunRecord } from "../eval/index.js";
7
7
  import { loadEvalArtifact } from "../eval/index.js";
8
+ import { renderEvidenceFindingsMarkdown } from "./findings-markdown.js";
8
9
  import { compareCodepoints as compareStrings } from "./ordering.js";
9
10
  import { buildEvidenceTrustStatusFile } from "./run-trust.js";
10
11
  import { evidenceDirectory, findingsFile } from "./store.js";
@@ -95,7 +96,6 @@ export async function buildEvalEvidence(options: BuildEvalEvidenceOptions): Prom
95
96
  evidenceId,
96
97
  runSources: linkedRuns.runSources,
97
98
  gateDecisions: gateDecisions.decisions,
98
- auditRows: linkedRuns.auditRows,
99
99
  });
100
100
  await writeEvalEvidenceFiles(
101
101
  directory,
@@ -258,7 +258,7 @@ async function writeEvalEvidenceFiles(
258
258
  await writeJson(join(directory, "protected-artifacts.json"), emptyProtected);
259
259
  await writeJson(join(directory, "eval-result.json"), redactedArtifact);
260
260
  await writeJson(join(directory, "findings.json"), findingsFile(overview.evidenceId, [...findings]));
261
- await writeFile(join(directory, "findings.md"), renderFindings(findings), "utf8");
261
+ await writeFile(join(directory, "findings.md"), renderEvidenceFindingsMarkdown(findings, trustStatus), "utf8");
262
262
  }
263
263
 
264
264
  function rawEvalTraceRows(artifact: EvalRunArtifact): EvidenceEvalRawTraceRow[] {
@@ -360,16 +360,6 @@ function renderEvalTranscript(artifact: EvalRunArtifact, overview: EvidenceOverv
360
360
  return `${lines.join("\n")}\n`;
361
361
  }
362
362
 
363
- function renderFindings(findings: ReadonlyArray<EvidenceFinding>): string {
364
- if (findings.length === 0) return "No findings.\n";
365
- const lines = ["# Findings", ""];
366
- for (const finding of findings) {
367
- lines.push(`- ${finding.id} [${finding.severity}] ${finding.tag}: ${finding.message}`);
368
- }
369
- lines.push("");
370
- return `${lines.join("\n")}\n`;
371
- }
372
-
373
363
  async function writeJson(path: string, value: unknown): Promise<void> {
374
364
  await writeFile(path, `${JSON.stringify(value, null, 2)}\n`, "utf8");
375
365
  }
@@ -0,0 +1,33 @@
1
+ import { formatTrustAxes, formatTrustSummary, trustVerdict } from "./trust-projection.js";
2
+ import type { EvidenceFinding, EvidenceTrustStatusFile } from "./types.js";
3
+
4
+ /** Render the canonical verdict before the diagnostic records in every evidence bundle. */
5
+ export function renderEvidenceFindingsMarkdown(
6
+ findings: ReadonlyArray<EvidenceFinding>,
7
+ trustStatus: EvidenceTrustStatusFile,
8
+ ): string {
9
+ const lines = ["# Findings", "", "## Canonical trust", ""];
10
+ if (trustStatus.runs.length === 0) {
11
+ lines.push("No linked run trust status.");
12
+ } else {
13
+ for (const run of trustStatus.runs) {
14
+ lines.push(
15
+ `- run=${run.runId}`,
16
+ ` tier: ${trustVerdict(run.status)}`,
17
+ ` summary: ${formatTrustSummary(run.status)}`,
18
+ ` axes: ${formatTrustAxes(run.status)}`,
19
+ );
20
+ }
21
+ }
22
+ lines.push("", "## Finding records", "");
23
+ if (findings.length === 0) {
24
+ lines.push("No findings.");
25
+ } else {
26
+ for (const item of findings) {
27
+ const run = item.runId === null ? "" : ` run=${item.runId}`;
28
+ lines.push(`- ${item.id} [${item.severity}] ${item.tag}${run}: ${item.message}`);
29
+ }
30
+ }
31
+ lines.push("");
32
+ return `${lines.join("\n")}\n`;
33
+ }
@@ -5,6 +5,7 @@ export { buildEvalEvidence, evalEvidenceId } from "./eval.js";
5
5
  export { FINISH_CONTRACT_EVIDENCE_TAGS, finishContractEvidenceTags } from "./finish-contract-map.js";
6
6
  export type { RunEscalationCounts, RunProvenanceView } from "./provenance.js";
7
7
  export {
8
+ admitRunProvenance,
8
9
  extractRunProvenance,
9
10
  hasRunProvenance,
10
11
  PERSONA_HASH_PREFIX_CHARS,
@@ -22,6 +23,20 @@ export {
22
23
  loadEvidenceRunProvenance,
23
24
  loadEvidenceTrustStatus,
24
25
  } from "./store.js";
26
+ export type { TrustSummaryProjection, TrustVerdict } from "./trust-projection.js";
27
+ export {
28
+ formatTrustAxes,
29
+ formatTrustSummary,
30
+ formatTrustSummaryLine,
31
+ summarizeTrustStatus,
32
+ TRUST_STATE_WORDS,
33
+ TRUST_SUMMARY_MAX_REFS,
34
+ TRUST_SUMMARY_VERSION,
35
+ TRUST_VERDICTS,
36
+ trustStateWord,
37
+ trustSummaryReferences,
38
+ trustVerdict,
39
+ } from "./trust-projection.js";
25
40
  export type {
26
41
  AbsentTrustStatus,
27
42
  AdaptFinishContractTrustOptions,
@@ -35,6 +50,8 @@ export type {
35
50
  GroundedEvidenceValidationInput,
36
51
  IndependentReviewStatus,
37
52
  PersistedRunReceiptTrustFacts,
53
+ ReceiptIntegrityOutcome,
54
+ RetiredReceiptIntegrity,
38
55
  RunReceiptTrustInspection,
39
56
  TrustAbsenceReason,
40
57
  TrustArtifactKind,
@@ -63,12 +80,16 @@ export {
63
80
  inspectRunReceiptTrustStatus,
64
81
  normalizeTrustStatus,
65
82
  projectTrustStatus,
83
+ retiredIntegrityVersionOf,
84
+ retiredReceiptIntegrity,
85
+ retiredReceiptIntegrityReason,
66
86
  TRUST_STATUS_AXES,
67
87
  TRUST_STATUS_MAX_ARTIFACT_REFERENCES,
68
88
  TRUST_STATUS_MAX_IDENTIFIER_LENGTH,
69
89
  TRUST_STATUS_STATES,
70
90
  TRUST_STATUS_VERSION,
71
91
  validateTrustStatus,
92
+ verifyReceiptIntegrityOutcome,
72
93
  } from "./trust-status.js";
73
94
  export type {
74
95
  EvidenceAuditLinkedRow,
@@ -4,6 +4,7 @@ import type {
4
4
  RunReceipt,
5
5
  RunReceiptAutonomyEnforcement,
6
6
  } from "../dispatch/types.js";
7
+ import type { CanonicalTrustStatus } from "./trust-status.js";
7
8
 
8
9
  /**
9
10
  * Worker permission-escalation counters projected from sealed receipt
@@ -50,6 +51,33 @@ export function extractRunProvenance(receipt: ProvenanceReceipt): RunProvenanceV
50
51
  return view;
51
52
  }
52
53
 
54
+ /**
55
+ * The slice of a provenance view the canonical projection admits. The
56
+ * projection is the only thing that decides whether an axis is reported, so
57
+ * the autonomy detail (`autonomy=`, `mode=`, `dangerousBypass=`) is kept only
58
+ * when the projection reports the autonomy axis in a recorded state, and the
59
+ * non-axis provenance (pipeline, persona override, escalations) only when the
60
+ * seal that carries it verified. With no projection at hand no axis detail is
61
+ * admitted at all, whatever the receipt says; the non-axis provenance passes
62
+ * through for a caller that prints it beside its own integrity banner.
63
+ */
64
+ export function admitRunProvenance(view: RunProvenanceView, status?: CanonicalTrustStatus): RunProvenanceView {
65
+ const admitted: RunProvenanceView = {};
66
+ if (status === undefined || status.artifactIntegrity.state === "verified") {
67
+ if (view.pipeline !== undefined) admitted.pipeline = view.pipeline;
68
+ if (view.personaOverride !== undefined) admitted.personaOverride = view.personaOverride;
69
+ if (view.escalation !== undefined) admitted.escalation = view.escalation;
70
+ }
71
+ const autonomy = status?.autonomyEnforcement.state;
72
+ if (
73
+ view.autonomyEnforcement !== undefined &&
74
+ (autonomy === "enforced" || autonomy === "approximated" || autonomy === "bypassed")
75
+ ) {
76
+ admitted.autonomyEnforcement = view.autonomyEnforcement;
77
+ }
78
+ return admitted;
79
+ }
80
+
53
81
  /** True when at least one provenance field set is present. */
54
82
  export function hasRunProvenance(view: RunProvenanceView): boolean {
55
83
  return (
@@ -144,10 +172,15 @@ function formatPersonaHashPrefix(promptHash: string): string {
144
172
  }
145
173
 
146
174
  /**
147
- * Human transcript sentences for each present provenance field set.
148
- * An empty view adds no lines to the transcript run section.
175
+ * Human transcript sentences for each admitted provenance field set, gated
176
+ * through {@link admitRunProvenance}. The autonomy line carries only the
177
+ * detail the canonical projection does not: the policy name, the external
178
+ * mode, and the bypass flag. The axis itself (mediated, approximated,
179
+ * bypassed) is printed by the trust summary and nowhere else, so one
180
+ * autonomy fact never appears in two vocabularies on one screen.
149
181
  */
150
- export function provenanceTranscriptLines(view: RunProvenanceView): string[] {
182
+ export function provenanceTranscriptLines(source: RunProvenanceView, status?: CanonicalTrustStatus): string[] {
183
+ const view = admitRunProvenance(source, status);
151
184
  const lines: string[] = [];
152
185
  if (view.pipeline !== undefined) {
153
186
  const { fromRunId, position, inputBytes, inputTruncated } = view.pipeline;
@@ -163,20 +196,22 @@ export function provenanceTranscriptLines(view: RunProvenanceView): string[] {
163
196
  lines.push(`escalations: ${requested} requested, ${approved} approved, ${denied} denied, ${timedOut} timed out`);
164
197
  }
165
198
  if (view.autonomyEnforcement !== undefined) {
166
- const { grade, autonomy, externalMode, dangerousBypass } = view.autonomyEnforcement;
199
+ const { autonomy, externalMode, dangerousBypass } = view.autonomyEnforcement;
167
200
  const mode = externalMode !== undefined ? ` mode=${externalMode}` : "";
168
201
  const bypass = dangerousBypass === true ? " dangerousBypass=true" : "";
169
- lines.push(`autonomy enforcement: ${grade} autonomy=${autonomy}${mode}${bypass}`);
202
+ lines.push(`autonomy: ${autonomy}${mode}${bypass}`);
170
203
  }
171
204
  return lines;
172
205
  }
173
206
 
174
207
  /**
175
- * Compact ` key=value` suffix for the dispatch tool's per-run and CLI lines.
176
- * The leading space lets callers append it directly. An empty provenance view
177
- * returns an empty string.
208
+ * Compact ` key=value` suffix for the dispatch tool's per-run and CLI lines,
209
+ * gated through {@link admitRunProvenance} on the same terms as the
210
+ * transcript lines. The leading space lets callers append it directly. An
211
+ * empty admitted view returns an empty string.
178
212
  */
179
- export function provenanceCompactSuffix(view: RunProvenanceView): string {
213
+ export function provenanceCompactSuffix(source: RunProvenanceView, status?: CanonicalTrustStatus): string {
214
+ const view = admitRunProvenance(source, status);
180
215
  const parts: string[] = [];
181
216
  if (view.pipeline !== undefined) {
182
217
  const { fromRunId, position, inputBytes, inputTruncated } = view.pipeline;
@@ -191,10 +226,10 @@ export function provenanceCompactSuffix(view: RunProvenanceView): string {
191
226
  parts.push(`escalations=${requested}req/${approved}appr/${denied}deny/${timedOut}timeout`);
192
227
  }
193
228
  if (view.autonomyEnforcement !== undefined) {
194
- const { grade, autonomy, externalMode, dangerousBypass } = view.autonomyEnforcement;
229
+ const { autonomy, externalMode, dangerousBypass } = view.autonomyEnforcement;
195
230
  const mode = externalMode !== undefined ? `/${externalMode}` : "";
196
231
  const bypass = dangerousBypass === true ? "/bypass" : "";
197
- parts.push(`enforcement=${grade}:${autonomy}${mode}${bypass}`);
232
+ parts.push(`autonomy=${autonomy}${mode}${bypass}`);
198
233
  }
199
234
  return parts.length === 0 ? "" : ` ${parts.join(" ")}`;
200
235
  }
@@ -1,9 +1,7 @@
1
1
  import { type GateDecisionArtifact, verifyGateDecisionArtifact } from "../dispatch/gate-decisions.js";
2
2
  import type { RunEnvelope, RunReceipt } from "../dispatch/types.js";
3
- import type { FinishContractAssessment, FinishContractEvidenceKind } from "../safety/finish-contract.js";
4
3
  import { compareCodepoints as compareStrings } from "./ordering.js";
5
4
  import {
6
- adaptFinishContractCompletionStatus,
7
5
  adaptGateDecisionReviewStatus,
8
6
  adaptGroundedEvidenceValidationStatus,
9
7
  type CanonicalTrustStatus,
@@ -12,7 +10,7 @@ import {
12
10
  isTrustStatusIdentifier,
13
11
  type TrustArtifactReference,
14
12
  } from "./trust-status.js";
15
- import { EVIDENCE_VERSION, type EvidenceAuditLinkedRow, type EvidenceTrustStatusFile } from "./types.js";
13
+ import { EVIDENCE_VERSION, type EvidenceTrustStatusFile } from "./types.js";
16
14
 
17
15
  export interface EvidenceRunTrustSource {
18
16
  envelope: RunEnvelope;
@@ -23,15 +21,15 @@ export interface BuildEvidenceTrustStatusInput {
23
21
  evidenceId: string;
24
22
  runSources: ReadonlyArray<EvidenceRunTrustSource>;
25
23
  gateDecisions: ReadonlyArray<GateDecisionArtifact>;
26
- auditRows: ReadonlyArray<EvidenceAuditLinkedRow>;
27
24
  validationEvidence?: ReadonlyMap<string, ReadonlyArray<TrustArtifactReference>>;
28
25
  }
29
26
 
30
27
  /**
31
28
  * Compose every evidence-linked trust axis at one pure boundary. Both the
32
29
  * run/session and eval builders call this function, so the same authenticated
33
- * receipt, gate decision, and exact finish-contract row cannot project
34
- * differently merely because it was bundled through a different entry point.
30
+ * receipt and gate decision cannot project differently merely because the
31
+ * receipt was bundled through a different entry point. Completion evidence
32
+ * stays receipt-derived so an audit row cannot change one surface alone.
35
33
  */
36
34
  export function buildEvidenceTrustStatusFile(input: BuildEvidenceTrustStatusInput): EvidenceTrustStatusFile {
37
35
  return {
@@ -44,7 +42,6 @@ export function buildEvidenceTrustStatusFile(input: BuildEvidenceTrustStatusInpu
44
42
  evidenceId: input.evidenceId,
45
43
  source,
46
44
  gateDecisions: input.gateDecisions,
47
- auditRows: input.auditRows,
48
45
  validationEvidence: input.validationEvidence?.get(source.envelope.id) ?? [],
49
46
  }),
50
47
  })),
@@ -55,22 +52,15 @@ interface ComposeEvidenceRunTrustInput {
55
52
  evidenceId: string;
56
53
  source: EvidenceRunTrustSource;
57
54
  gateDecisions: ReadonlyArray<GateDecisionArtifact>;
58
- auditRows: ReadonlyArray<EvidenceAuditLinkedRow>;
59
55
  validationEvidence: ReadonlyArray<TrustArtifactReference>;
60
56
  }
61
57
 
62
58
  function composeEvidenceRunTrustStatus(input: ComposeEvidenceRunTrustInput): CanonicalTrustStatus {
63
59
  const inspection = inspectRunReceiptTrustStatus(input.source.receipt, input.source.envelope);
64
- // A receipt that was presented and rejected authenticates nothing about the
65
- // run it names. Its integrity failure stays on `artifactIntegrity`; no other
66
- // axis may reach a trust-granting state on the strength of that run's own
67
- // self-reports. A missing or unchecked receipt is not a rejection.
68
- const receiptRejected = inspection.status.artifactIntegrity.state === "failed";
69
60
  let status = inspection.status;
70
- // Only independently observed executions ground validation. The
71
- // completion-contract audit row is the run's own self-report: it feeds
72
- // `completionEvidence` below and nothing else. The cross-axis rules this
73
- // enforces are listed under "composition rules" in docs/evidence-and-memory.md.
61
+ // Only independently observed executions ground validation. A completion
62
+ // contract audit row is the run's own self-report and cannot override the
63
+ // receipt-derived completion axis on this surface alone.
74
64
  const grounded = input.validationEvidence.filter((artifact) => isTrustStatusIdentifier(artifact.id));
75
65
  if (
76
66
  grounded.length > 0 &&
@@ -106,25 +96,6 @@ function composeEvidenceRunTrustStatus(input: ComposeEvidenceRunTrustInput): Can
106
96
  independentReview: adaptGateDecisionReviewStatus(gate, input.source.envelope.id, verification),
107
97
  });
108
98
  }
109
-
110
- const finish = latestFinishContractForRun(input.auditRows, input.source.envelope.id);
111
- if (finish !== null) {
112
- const completion = adaptFinishContractCompletionStatus(finish.assessment, {
113
- sourceId: finish.sourceId,
114
- artifacts: finish.artifacts,
115
- });
116
- status = composeTrustStatus(status, {
117
- completionEvidence:
118
- receiptRejected && completion.state === "evidenced"
119
- ? {
120
- state: "unknown",
121
- source: { kind: "finish_contract", id: finish.sourceId },
122
- authority: { kind: "clio", id: "finish-contract" },
123
- artifacts: finish.artifacts,
124
- }
125
- : completion,
126
- });
127
- }
128
99
  return status;
129
100
  }
130
101
 
@@ -142,80 +113,3 @@ function latestGateDecisionForRun(
142
113
  .at(-1) ?? null
143
114
  );
144
115
  }
145
-
146
- interface EvidenceFinishContractProjection {
147
- sourceId: string;
148
- assessment: FinishContractAssessment;
149
- artifacts: TrustArtifactReference[];
150
- }
151
-
152
- function latestFinishContractForRun(
153
- rows: ReadonlyArray<EvidenceAuditLinkedRow>,
154
- runId: string,
155
- ): EvidenceFinishContractProjection | null {
156
- const candidates = rows
157
- .filter((row) => row.auditKind === "completion_contract" && row.runId === runId && row.confidence === "exact")
158
- .flatMap((row) => {
159
- const assessment = finishContractAssessmentFromAudit(row.row);
160
- if (assessment === null) return [];
161
- const correlationId = readOptionalString(row.row.correlationId) ?? `${runId}:completion-contract`;
162
- // A malformed row is dropped from the trust projection rather than
163
- // thrown out of the whole forensic build. `readAuditRows` already
164
- // reports the malformed line, so the bundle stays honest about it.
165
- if (!isTrustStatusIdentifier(correlationId)) return [];
166
- const turnId = readOptionalString(row.row.turnId);
167
- const artifacts: TrustArtifactReference[] = [
168
- { kind: "finish_contract_evidence", id: correlationId },
169
- ...(turnId === null || !isTrustStatusIdentifier(turnId) ? [] : [{ kind: "session_entry" as const, id: turnId }]),
170
- ];
171
- return [{ sourceId: correlationId, assessment, artifacts, timestamp: row.ts ?? "" }];
172
- })
173
- .sort(
174
- (left, right) => compareStrings(left.timestamp, right.timestamp) || compareStrings(left.sourceId, right.sourceId),
175
- );
176
- const latest = candidates.at(-1);
177
- return latest === undefined
178
- ? null
179
- : { sourceId: latest.sourceId, assessment: latest.assessment, artifacts: latest.artifacts };
180
- }
181
-
182
- function finishContractAssessmentFromAudit(row: Record<string, unknown>): FinishContractAssessment | null {
183
- const reason = readOptionalString(row.reason);
184
- const decision = readOptionalString(row.decision);
185
- const mutatedPaths = Array.isArray(row.mutatedPaths)
186
- ? row.mutatedPaths.filter((entry): entry is string => typeof entry === "string")
187
- : [];
188
- const turnId = readOptionalString(row.turnId);
189
- const evidenceKinds = Array.isArray(row.evidenceKinds) ? row.evidenceKinds.filter(isFinishContractEvidenceKind) : [];
190
- const evidence = evidenceKinds.map((kind) => ({
191
- kind,
192
- summary: "recorded by the finish contract",
193
- ...(turnId === null ? {} : { turnId }),
194
- }));
195
- if (decision === "ok" && reason === "no_mutation") {
196
- return { kind: "ok", reason, evidence: [], mutatedPaths };
197
- }
198
- if (decision === "ok" && reason === "validation_evidence") {
199
- return { kind: "ok", reason, evidence, mutatedPaths };
200
- }
201
- if (decision === "ok" && reason === "explicit_limitation") {
202
- return { kind: "ok", reason, evidence: [], mutatedPaths };
203
- }
204
- if (decision === "engage" && reason === "unvalidated_mutation") {
205
- return { kind: "engage", reason, message: "finish contract engaged", evidence: [], mutatedPaths };
206
- }
207
- return null;
208
- }
209
-
210
- function isFinishContractEvidenceKind(value: unknown): value is FinishContractEvidenceKind {
211
- return value === "validation_command" || value === "protected_artifact" || value === "dispatch_receipt";
212
- }
213
-
214
- /**
215
- * A blank or whitespace-only optional field is absent, not an identifier. The
216
- * `??` fallbacks below depend on it, and an empty string would otherwise reach
217
- * `normalizeArtifactReference` and abort the entire bundle.
218
- */
219
- function readOptionalString(value: unknown): string | null {
220
- return typeof value === "string" && value.trim().length > 0 ? value : null;
221
- }