@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
@@ -0,0 +1,274 @@
1
+ import { RUN_RECEIPT_INTEGRITY_VERSION } from "../dispatch/receipt-integrity.js";
2
+ import {
3
+ type CanonicalTrustStatus,
4
+ retiredIntegrityVersionOf,
5
+ TRUST_STATUS_AXES,
6
+ type TRUST_STATUS_STATES,
7
+ type TrustArtifactReference,
8
+ type TrustStatusAxis,
9
+ } from "./trust-status.js";
10
+
11
+ /**
12
+ * The one projection of the canonical trust status every operator surface
13
+ * renders. The six-axis model stays the source of truth and is never
14
+ * collapsed into a score here; this module only fixes the words each state is
15
+ * called and the order the axes are read in, so the dispatch line, the
16
+ * monitor block, `evidence inspect`, `findings.md`, the Alt+W board, the
17
+ * receipt view, the eval bridge, and the ACP wire cannot each spell the same
18
+ * fact differently.
19
+ *
20
+ * Two shapes leave this module. `formatTrustSummary` is the compact human
21
+ * line: it answers who claims the result, what was observed, what was
22
+ * independently checked, and what is still unknown, without receipt
23
+ * internals. `summarizeTrustStatus` is the bounded, versioned machine record
24
+ * behind that line, carrying the axis states and typed references back to
25
+ * the artifacts the detailed model cites.
26
+ */
27
+
28
+ export const TRUST_SUMMARY_VERSION = 1 as const;
29
+
30
+ /** Reference cap for the machine projection; the canonical model keeps up to 16 per axis. */
31
+ export const TRUST_SUMMARY_MAX_REFS = 8;
32
+
33
+ /**
34
+ * How much the run's result can be leaned on, read off the axes in a fixed
35
+ * order. It is a presentation tier for styling and sorting, never a score:
36
+ * `reviewed` is the only tier that may be styled as independently verified.
37
+ */
38
+ export type TrustVerdict = "reviewed" | "grounded" | "unverified" | "compromised" | "unknown";
39
+
40
+ export const TRUST_VERDICTS: ReadonlyArray<TrustVerdict> = [
41
+ "reviewed",
42
+ "grounded",
43
+ "unverified",
44
+ "compromised",
45
+ "unknown",
46
+ ];
47
+
48
+ /** Bounded, versioned machine projection with references to the detailed artifacts. */
49
+ export interface TrustSummaryProjection {
50
+ version: typeof TRUST_SUMMARY_VERSION;
51
+ verdict: TrustVerdict;
52
+ /** The compact human line, byte-identical to what the text surfaces print. */
53
+ text: string;
54
+ /** Every axis state, in canonical vocabulary, for machine consumers. */
55
+ axes: Record<TrustStatusAxis, string>;
56
+ /** Who asserts the validation fact: `<authority kind>:<id>`, or `worker` when only the run's own prose exists. */
57
+ claimant: string;
58
+ /** Axes that answer nothing, so a consumer knows what remains unknown. */
59
+ unknown: TrustStatusAxis[];
60
+ /** `<artifact kind>:<id>` pointers to the detailed records, sorted, unique, capped. */
61
+ refs: string[];
62
+ }
63
+
64
+ type AxisStates = { [Axis in TrustStatusAxis]: (typeof TRUST_STATUS_STATES)[Axis][number] };
65
+
66
+ /**
67
+ * The standardized word for every state. A word is what an operator reads;
68
+ * the state id is what a machine reads. `mediated` names the `enforced`
69
+ * autonomy state because that is the receipt grade and the documented
70
+ * meaning: Clio's own safety gate mediated the run. `inferred` names an
71
+ * ungrounded validation claim: the worker said it validated, nothing was
72
+ * observed to have run.
73
+ */
74
+ export const TRUST_STATE_WORDS: { [Axis in TrustStatusAxis]: Record<AxisStates[Axis], string> } = {
75
+ artifactIntegrity: {
76
+ verified: "sealed",
77
+ failed: "seal broken",
78
+ absent: "no receipt",
79
+ unknown: "seal unchecked",
80
+ not_applicable: "seal not applicable",
81
+ },
82
+ validationGrounding: {
83
+ validated: "grounded",
84
+ failed: "validation failed",
85
+ ungrounded: "inferred: validation claimed, none observed",
86
+ absent: "no validation observed",
87
+ unknown: "validation unknown",
88
+ not_applicable: "validation not applicable",
89
+ },
90
+ independentReview: {
91
+ passed: "independently reviewed: pass",
92
+ failed: "independently reviewed: fail",
93
+ inconclusive: "independent review inconclusive",
94
+ not_independent: "review not independent",
95
+ absent: "not independently reviewed",
96
+ unknown: "independent review unknown",
97
+ not_applicable: "independent review not applicable",
98
+ },
99
+ contextProvenance: {
100
+ recorded: "context recorded",
101
+ invalid: "context record invalid",
102
+ absent: "context not recorded",
103
+ unknown: "context unknown",
104
+ not_applicable: "context not applicable",
105
+ },
106
+ autonomyEnforcement: {
107
+ enforced: "mediated",
108
+ approximated: "approximated",
109
+ bypassed: "bypassed",
110
+ absent: "autonomy not recorded",
111
+ unknown: "autonomy unknown",
112
+ not_applicable: "autonomy not applicable",
113
+ },
114
+ completionEvidence: {
115
+ evidenced: "completion evidenced",
116
+ incomplete: "completion unevidenced",
117
+ limited: "completion limited",
118
+ absent: "completion not recorded",
119
+ unknown: "completion unknown",
120
+ not_applicable: "completion not applicable",
121
+ },
122
+ };
123
+
124
+ /** The word for one axis state; unknown input never throws, it reads as unknown. */
125
+ export function trustStateWord<Axis extends TrustStatusAxis>(axis: Axis, state: string): string {
126
+ const words = TRUST_STATE_WORDS[axis] as Record<string, string>;
127
+ return words[state] ?? words.unknown ?? "unknown";
128
+ }
129
+
130
+ function authorityOf(status: CanonicalTrustStatus, axis: TrustStatusAxis): string | null {
131
+ const entry = status[axis];
132
+ return entry.state === "absent" ? null : `${entry.authority.kind}:${entry.authority.id}`;
133
+ }
134
+
135
+ /**
136
+ * A seal this build does not verify because its version is retired names
137
+ * that version and the one in force, so an intact receipt from the previous
138
+ * release never reads as "seal broken" or as merely unchecked. The state
139
+ * behind the clause is `unknown`, which is what it is: nothing was checked.
140
+ */
141
+ function integrityClause(status: CanonicalTrustStatus): string {
142
+ const retired = retiredIntegrityVersionOf(status.artifactIntegrity);
143
+ if (retired !== null) return `seal v${retired} retired (this build verifies v${RUN_RECEIPT_INTEGRITY_VERSION})`;
144
+ return trustStateWord("artifactIntegrity", status.artifactIntegrity.state);
145
+ }
146
+
147
+ /**
148
+ * The validation clause names its claimant, because "grounded" alone hides
149
+ * the difference between a host-run check and a self-reported one.
150
+ */
151
+ function validationClause(status: CanonicalTrustStatus): string {
152
+ const entry = status.validationGrounding;
153
+ const word = trustStateWord("validationGrounding", entry.state);
154
+ if (entry.state === "absent") return word;
155
+ if (entry.state === "validated" || entry.state === "failed") return `${word} by ${entry.authority.id}`;
156
+ // A named external system that could not observe the run is worth naming;
157
+ // the historical-format placeholder is not an authority anyone can ask.
158
+ if (entry.state === "unknown" && entry.authority.kind !== "unknown") return `${word} (${entry.authority.id})`;
159
+ return word;
160
+ }
161
+
162
+ /** External runtimes name themselves on the autonomy clause so approximation is never anonymous. */
163
+ function autonomyClause(status: CanonicalTrustStatus): string {
164
+ const entry = status.autonomyEnforcement;
165
+ const word = trustStateWord("autonomyEnforcement", entry.state);
166
+ if (entry.state !== "approximated" && entry.state !== "bypassed") return word;
167
+ return `${word} (${entry.authority.id})`;
168
+ }
169
+
170
+ /**
171
+ * The compact human body. Clause order is fixed: integrity, validation with
172
+ * its claimant, independent review, autonomy, context, completion. Every
173
+ * surface prints this body verbatim, so two surfaces can only disagree by
174
+ * reading different canonical input.
175
+ */
176
+ export function formatTrustSummary(status: CanonicalTrustStatus): string {
177
+ return [
178
+ integrityClause(status),
179
+ validationClause(status),
180
+ trustStateWord("independentReview", status.independentReview.state),
181
+ autonomyClause(status),
182
+ trustStateWord("contextProvenance", status.contextProvenance.state),
183
+ trustStateWord("completionEvidence", status.completionEvidence.state),
184
+ ].join("; ");
185
+ }
186
+
187
+ /** The tier and body under one versioned label for receipt-facing surfaces. */
188
+ export function formatTrustSummaryLine(status: CanonicalTrustStatus): string {
189
+ return `trust v${TRUST_SUMMARY_VERSION}: ${trustVerdict(status)}; ${formatTrustSummary(status)}`;
190
+ }
191
+
192
+ /**
193
+ * The drill-down token line: every axis in canonical state ids. This is the
194
+ * one machine-readable text form; `evidence inspect` and the dispatch and
195
+ * monitor labels all print it from here.
196
+ */
197
+ export function formatTrustAxes(status: CanonicalTrustStatus): string {
198
+ return [`trust_status=v${status.version}`, ...TRUST_STATUS_AXES.map((axis) => `${axis}:${status[axis].state}`)].join(
199
+ " ",
200
+ );
201
+ }
202
+
203
+ function isUnanswered(status: CanonicalTrustStatus, axis: TrustStatusAxis): boolean {
204
+ const state = status[axis].state;
205
+ return state === "absent" || state === "unknown";
206
+ }
207
+
208
+ /**
209
+ * Read the tier off the axes in priority order. A broken seal, a bypassed
210
+ * gate, a failed or inferred validation, a failed or correlated review, or a
211
+ * contradictory context record compromises the result whatever else holds.
212
+ * An unchecked or missing seal leaves it unknown. Only an authenticated
213
+ * independent pass is `reviewed`; observed validation without one is
214
+ * `grounded`; a sealed receipt with nothing observed is `unverified`.
215
+ */
216
+ export function trustVerdict(status: CanonicalTrustStatus): TrustVerdict {
217
+ const integrity = status.artifactIntegrity.state;
218
+ const validation = status.validationGrounding.state;
219
+ const review = status.independentReview.state;
220
+ const autonomy = status.autonomyEnforcement.state;
221
+ if (
222
+ integrity === "failed" ||
223
+ autonomy === "bypassed" ||
224
+ validation === "failed" ||
225
+ validation === "ungrounded" ||
226
+ review === "failed" ||
227
+ review === "not_independent" ||
228
+ status.contextProvenance.state === "invalid"
229
+ ) {
230
+ return "compromised";
231
+ }
232
+ if (integrity !== "verified") return "unknown";
233
+ if (review === "passed") return "reviewed";
234
+ if (validation === "validated") return "grounded";
235
+ return "unverified";
236
+ }
237
+
238
+ function claimantOf(status: CanonicalTrustStatus): string {
239
+ const state = status.validationGrounding.state;
240
+ if (state === "absent" || state === "ungrounded") return "worker";
241
+ return authorityOf(status, "validationGrounding") ?? "worker";
242
+ }
243
+
244
+ function referenceKey(reference: TrustArtifactReference): string {
245
+ return `${reference.kind}:${reference.id}`;
246
+ }
247
+
248
+ /** Every artifact the axes cite, as bounded pointers a consumer can resolve. */
249
+ export function trustSummaryReferences(status: CanonicalTrustStatus): string[] {
250
+ const keys = new Set<string>();
251
+ for (const axis of TRUST_STATUS_AXES) {
252
+ const entry = status[axis];
253
+ if (entry.state === "absent") continue;
254
+ for (const reference of entry.artifacts) keys.add(referenceKey(reference));
255
+ }
256
+ return [...keys].sort().slice(0, TRUST_SUMMARY_MAX_REFS);
257
+ }
258
+
259
+ /** The bounded machine projection. Flat by design so a depth-capped wire keeps it whole. */
260
+ export function summarizeTrustStatus(status: CanonicalTrustStatus): TrustSummaryProjection {
261
+ const axes = Object.fromEntries(TRUST_STATUS_AXES.map((axis) => [axis, status[axis].state])) as Record<
262
+ TrustStatusAxis,
263
+ string
264
+ >;
265
+ return {
266
+ version: TRUST_SUMMARY_VERSION,
267
+ verdict: trustVerdict(status),
268
+ text: formatTrustSummary(status),
269
+ axes,
270
+ claimant: claimantOf(status),
271
+ unknown: TRUST_STATUS_AXES.filter((axis) => isUnanswered(status, axis)),
272
+ refs: trustSummaryReferences(status),
273
+ };
274
+ }
@@ -1,5 +1,5 @@
1
1
  import type { GateDecisionArtifact, GateDecisionVerification } from "../dispatch/gate-decisions.js";
2
- import { type ReceiptIntegrityResult, verifyReceiptIntegrity } from "../dispatch/receipt-integrity.js";
2
+ import { RUN_RECEIPT_INTEGRITY_VERSION, verifyReceiptIntegrity } from "../dispatch/receipt-integrity.js";
3
3
  import type {
4
4
  RunBriefingProvenance,
5
5
  RunEnvelope,
@@ -459,13 +459,89 @@ function compatibilitySource(receipt: PersistedRunReceiptTrustFacts, field: stri
459
459
  const DISPATCH_AUTHORITY: TrustStatusAuthority = { kind: "clio", id: "dispatch" };
460
460
  const COMPATIBILITY_AUTHORITY: TrustStatusAuthority = { kind: "unknown", id: "historical-persisted-format" };
461
461
 
462
+ /**
463
+ * A receipt sealed under an integrity version this build no longer verifies.
464
+ * It is not migrated and not read as evidence, on the same terms as every
465
+ * prior integrity bump, but it is not a tampered receipt either: nothing was
466
+ * checked, so nothing failed. The outcome names both versions so an operator
467
+ * with a store full of last release's runs can tell a retired seal from a
468
+ * broken one.
469
+ */
470
+ export interface RetiredReceiptIntegrity {
471
+ receiptVersion: number;
472
+ supportedVersion: number;
473
+ }
474
+
475
+ /**
476
+ * The dispatch verifier's result, widened with the retired-format diagnosis
477
+ * this module puts in front of it. A failure without `retired` is the
478
+ * verifier's own verdict: a malformed seal, a ledger mismatch, or a digest
479
+ * that does not match the receipt's contents.
480
+ */
481
+ export type ReceiptIntegrityOutcome = { ok: true } | { ok: false; reason: string; retired?: RetiredReceiptIntegrity };
482
+
483
+ /** The retired-version diagnosis for a receipt's integrity block, or null when the block is current or unreadable. */
484
+ export function retiredReceiptIntegrity(integrity: unknown): RetiredReceiptIntegrity | null {
485
+ if (!isRecord(integrity)) return null;
486
+ const version = integrity.version;
487
+ if (typeof version !== "number" || !Number.isInteger(version) || version < 1) return null;
488
+ if (version >= RUN_RECEIPT_INTEGRITY_VERSION) return null;
489
+ return { receiptVersion: version, supportedVersion: RUN_RECEIPT_INTEGRITY_VERSION };
490
+ }
491
+
492
+ /** The one sentence every surface prints for a retired seal. It never calls the receipt invalid, broken, or corrupt. */
493
+ export function retiredReceiptIntegrityReason(retired: RetiredReceiptIntegrity): string {
494
+ return `receipt integrity v${retired.receiptVersion} is retired; this build verifies v${retired.supportedVersion}; the receipt is not read as evidence`;
495
+ }
496
+
497
+ /**
498
+ * Verify a receipt against its ledger row, diagnosing a retired seal before
499
+ * the verifier can report it as a malformed one. Every trust-bearing
500
+ * verification goes through here so the CLI, the bundle, and the TUI receipt
501
+ * view agree on what a retired receipt is.
502
+ */
503
+ export function verifyReceiptIntegrityOutcome(receipt: RunReceipt, envelope: RunEnvelope): ReceiptIntegrityOutcome {
504
+ const retired = retiredReceiptIntegrity(receipt.integrity);
505
+ if (retired !== null) return { ok: false, reason: retiredReceiptIntegrityReason(retired), retired };
506
+ return verifyReceiptIntegrity(receipt, envelope);
507
+ }
508
+
509
+ const RETIRED_INTEGRITY_SOURCE = /:integrity-v(\d+)-retired$/u;
510
+
511
+ function retiredIntegritySourceId(runId: string, receiptVersion: number): string {
512
+ return `run_receipt:${runId}:integrity-v${receiptVersion}-retired`;
513
+ }
514
+
515
+ /**
516
+ * The retired integrity version a projected artifact-integrity axis names, or
517
+ * null when the axis says something else. The compatibility source id is the
518
+ * only place the persisted projection carries the version, so the human clause
519
+ * reads it back from there rather than from the receipt.
520
+ */
521
+ export function retiredIntegrityVersionOf(status: ArtifactIntegrityStatus): number | null {
522
+ if (status.state !== "unknown" || status.source.kind !== "compatibility") return null;
523
+ const match = RETIRED_INTEGRITY_SOURCE.exec(status.source.id);
524
+ return match === null ? null : Number(match[1]);
525
+ }
526
+
462
527
  /** Adapt receipt integrity verification without reading any receipt claim as self-authenticating. */
463
528
  export function adaptReceiptIntegrityStatus(
464
529
  receipt: PersistedRunReceiptTrustFacts | null | undefined,
465
- verification?: ReceiptIntegrityResult,
530
+ verification?: ReceiptIntegrityOutcome,
466
531
  ): ArtifactIntegrityStatus {
467
532
  if (receipt === null || receipt === undefined) return absentTrustStatus("artifact_missing");
468
533
  const artifacts = [receiptReference(receipt)];
534
+ // A retired seal was never checked, so the axis is unknown rather than
535
+ // failed, and the compatibility source names the version it was sealed
536
+ // under. `failed` stays reserved for a seal this build verified and rejected.
537
+ if (verification !== undefined && !verification.ok && verification.retired !== undefined) {
538
+ return attributed(
539
+ "unknown",
540
+ { kind: "compatibility", id: retiredIntegritySourceId(receipt.runId, verification.retired.receiptVersion) },
541
+ COMPATIBILITY_AUTHORITY,
542
+ artifacts,
543
+ );
544
+ }
469
545
  if (verification === undefined || (verification.ok && receipt.integrity === undefined)) {
470
546
  return attributed(
471
547
  "unknown",
@@ -576,15 +652,46 @@ function validBoundedProjectContext(context: RunProjectContextProvenance): boole
576
652
  );
577
653
  }
578
654
 
655
+ /**
656
+ * The one structured message a `none`-tier run can still receive. The tier is
657
+ * the CLIO-CODER.md handbook policy; the workspace-root message is sent
658
+ * regardless of it, and the producer records the characters and hash of
659
+ * every structured message it sent (`projectContextProvenanceFor` in the
660
+ * dispatch extension). A none-tier block naming exactly this section, with
661
+ * a well-formed count and hash, is therefore a consistent record of a real
662
+ * message, not a contradiction. Anything else under a none tier cannot be
663
+ * explained by the policy: a handbook section the policy forbids, a hash
664
+ * with no section to hash, or a malformed count.
665
+ */
666
+ const NONE_TIER_SECTIONS: ReadonlyArray<string> = ["workspace-root"];
667
+
668
+ function validNoneTierProjectContext(context: RunProjectContextProvenance): boolean {
669
+ return (
670
+ context.tier === "none" &&
671
+ context.sections !== undefined &&
672
+ context.sections.length === NONE_TIER_SECTIONS.length &&
673
+ context.sections.every((section) => NONE_TIER_SECTIONS.includes(section)) &&
674
+ Number.isSafeInteger(context.chars) &&
675
+ (context.chars ?? -1) >= 0 &&
676
+ typeof context.contentHash === "string" &&
677
+ /^[a-f0-9]{64}$/u.test(context.contentHash)
678
+ );
679
+ }
680
+
681
+ function recordedProjectContextHash(context: RunProjectContextProvenance | undefined): string | undefined {
682
+ if (context === undefined) return undefined;
683
+ if (context.tier === "bounded") return validBoundedProjectContext(context) ? context.contentHash : undefined;
684
+ return validNoneTierProjectContext(context) ? context.contentHash : undefined;
685
+ }
686
+
579
687
  function contextArtifacts(receipt: PersistedRunReceiptTrustFacts): TrustArtifactReference[] {
580
688
  const artifacts = [receiptReference(receipt)];
581
689
  if (receipt.briefing !== undefined && validBriefing(receipt.briefing)) {
582
690
  artifacts.push(sha256Reference("briefing", `${receipt.runId}:briefing`, receipt.briefing.contentHash));
583
691
  }
584
- if (receipt.projectContext?.tier === "bounded" && validBoundedProjectContext(receipt.projectContext)) {
585
- artifacts.push(
586
- sha256Reference("project_context", `${receipt.runId}:project-context`, receipt.projectContext.contentHash),
587
- );
692
+ const recordedHash = recordedProjectContextHash(receipt.projectContext);
693
+ if (recordedHash !== undefined) {
694
+ artifacts.push(sha256Reference("project_context", `${receipt.runId}:project-context`, recordedHash));
588
695
  }
589
696
  return uniqueBoundedReferences(artifacts);
590
697
  }
@@ -604,12 +711,23 @@ export function adaptRunReceiptContextStatus(
604
711
  return attributed("unknown", compatibilitySource(receipt, "projectContext"), COMPATIBILITY_AUTHORITY, artifacts);
605
712
  }
606
713
  if (context.tier === "none") {
607
- if (context.chars !== undefined || context.contentHash !== undefined || context.sections !== undefined) {
608
- return attributed("invalid", source, DISPATCH_AUTHORITY, artifacts);
714
+ const bare = context.chars === undefined && context.contentHash === undefined && context.sections === undefined;
715
+ if (bare) {
716
+ // Nothing structured was sent: the axis does not apply unless a
717
+ // briefing was recorded, which is context of its own.
718
+ return receipt.briefing === undefined
719
+ ? attributed("not_applicable", source, DISPATCH_AUTHORITY, artifacts)
720
+ : attributed("recorded", source, DISPATCH_AUTHORITY, artifacts);
609
721
  }
610
- return receipt.briefing === undefined
611
- ? attributed("not_applicable", source, DISPATCH_AUTHORITY, artifacts)
612
- : attributed("recorded", source, DISPATCH_AUTHORITY, artifacts);
722
+ // The workspace-root message is the one thing a none-tier run receives,
723
+ // and its record is valid; every other none-tier content shape is a
724
+ // record the policy cannot account for.
725
+ return attributed(
726
+ validNoneTierProjectContext(context) ? "recorded" : "invalid",
727
+ source,
728
+ DISPATCH_AUTHORITY,
729
+ artifacts,
730
+ );
613
731
  }
614
732
  return attributed(validBoundedProjectContext(context) ? "recorded" : "invalid", source, DISPATCH_AUTHORITY, artifacts);
615
733
  }
@@ -639,18 +757,19 @@ export function adaptRunReceiptAutonomyStatus(
639
757
  }
640
758
 
641
759
  export interface AdaptRunReceiptTrustOptions {
642
- integrity?: ReceiptIntegrityResult;
760
+ integrity?: ReceiptIntegrityOutcome;
643
761
  }
644
762
 
645
763
  function receiptClaimsAreAuthenticated(
646
764
  receipt: PersistedRunReceiptTrustFacts | null | undefined,
647
- integrity: ReceiptIntegrityResult | undefined,
765
+ integrity: ReceiptIntegrityOutcome | undefined,
648
766
  ): boolean {
649
767
  return receipt?.integrity !== undefined && integrity?.ok === true;
650
768
  }
651
769
 
652
770
  function unauthenticatedReceiptProjection(
653
771
  receipt: PersistedRunReceiptTrustFacts | null | undefined,
772
+ integrity: ReceiptIntegrityOutcome | undefined,
654
773
  ): TrustStatusProjection {
655
774
  if (receipt === null || receipt === undefined) {
656
775
  return {
@@ -682,6 +801,15 @@ function unauthenticatedReceiptProjection(
682
801
  ),
683
802
  };
684
803
  }
804
+ // A retired seal leaves the receipt unread rather than rejected: its axes
805
+ // are absent because the format is historical, not because a check failed.
806
+ if (integrity !== undefined && !integrity.ok && integrity.retired !== undefined) {
807
+ return {
808
+ validationGrounding: absentTrustStatus("historical_format"),
809
+ contextProvenance: absentTrustStatus("historical_format"),
810
+ autonomyEnforcement: absentTrustStatus("historical_format"),
811
+ };
812
+ }
685
813
  // The artifact-integrity axis retains the failure diagnostic. No other
686
814
  // axis reads a field from a receipt that failed authentication.
687
815
  return {
@@ -703,7 +831,7 @@ export function adaptRunReceiptTrustStatus(
703
831
  contextProvenance: adaptRunReceiptContextStatus(receipt),
704
832
  autonomyEnforcement: adaptRunReceiptAutonomyStatus(receipt),
705
833
  }
706
- : unauthenticatedReceiptProjection(receipt);
834
+ : unauthenticatedReceiptProjection(receipt, options.integrity);
707
835
  return composeTrustStatus({
708
836
  artifactIntegrity: adaptReceiptIntegrityStatus(receipt, options.integrity),
709
837
  ...receiptProjection,
@@ -715,7 +843,7 @@ export function adaptRunReceiptTrustStatus(
715
843
  }
716
844
 
717
845
  export interface RunReceiptTrustInspection {
718
- integrity: ReceiptIntegrityResult;
846
+ integrity: ReceiptIntegrityOutcome;
719
847
  status: CanonicalTrustStatus;
720
848
  }
721
849
 
@@ -728,14 +856,14 @@ export function inspectRunReceiptTrustStatus(
728
856
  receipt: RunReceipt | null | undefined,
729
857
  envelope: RunEnvelope | null | undefined,
730
858
  ): RunReceiptTrustInspection {
731
- let integrity: ReceiptIntegrityResult;
859
+ let integrity: ReceiptIntegrityOutcome;
732
860
  if (receipt === null || receipt === undefined) {
733
861
  integrity = { ok: false, reason: "receipt unavailable" };
734
862
  } else if (envelope === null || envelope === undefined) {
735
863
  integrity = { ok: false, reason: "run ledger envelope unavailable" };
736
864
  } else {
737
865
  try {
738
- integrity = verifyReceiptIntegrity(receipt, envelope);
866
+ integrity = verifyReceiptIntegrityOutcome(receipt, envelope);
739
867
  } catch (error) {
740
868
  integrity = {
741
869
  ok: false,
@@ -23,7 +23,11 @@ export const EVIDENCE_TAGS = [
23
23
  "escalation",
24
24
  "external-bypass",
25
25
  "external-approximation",
26
+ "independent-review",
27
+ "context-provenance",
28
+ "completion-evidence",
26
29
  "receipt-integrity",
30
+ "receipt-retired",
27
31
  "protected-artifact",
28
32
  "tool-loop",
29
33
  "test-failure",