@allocator-one/rcl 4.4.19

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 (663) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1415 -0
  3. package/dist/ci.d.ts +16 -0
  4. package/dist/ci.js +42 -0
  5. package/dist/ci.js.map +1 -0
  6. package/dist/config/data-dir.d.ts +6 -0
  7. package/dist/config/data-dir.js +12 -0
  8. package/dist/config/data-dir.js.map +1 -0
  9. package/dist/config/defaults.d.ts +82 -0
  10. package/dist/config/defaults.js +89 -0
  11. package/dist/config/defaults.js.map +1 -0
  12. package/dist/config/harness.d.ts +40 -0
  13. package/dist/config/harness.js +151 -0
  14. package/dist/config/harness.js.map +1 -0
  15. package/dist/config/loader.d.ts +13 -0
  16. package/dist/config/loader.js +131 -0
  17. package/dist/config/loader.js.map +1 -0
  18. package/dist/config/provider-concurrency.d.ts +4 -0
  19. package/dist/config/provider-concurrency.js +6 -0
  20. package/dist/config/provider-concurrency.js.map +1 -0
  21. package/dist/config/providers.d.ts +3 -0
  22. package/dist/config/providers.js +9 -0
  23. package/dist/config/providers.js.map +1 -0
  24. package/dist/config/schema.d.ts +179 -0
  25. package/dist/config/schema.js +115 -0
  26. package/dist/config/schema.js.map +1 -0
  27. package/dist/consensus/claim-contract.d.ts +9 -0
  28. package/dist/consensus/claim-contract.js +307 -0
  29. package/dist/consensus/claim-contract.js.map +1 -0
  30. package/dist/consensus/claim-identity.d.ts +5 -0
  31. package/dist/consensus/claim-identity.js +39 -0
  32. package/dist/consensus/claim-identity.js.map +1 -0
  33. package/dist/consensus/deduper.d.ts +43 -0
  34. package/dist/consensus/deduper.js +1052 -0
  35. package/dist/consensus/deduper.js.map +1 -0
  36. package/dist/consensus/finding-identity.d.ts +20 -0
  37. package/dist/consensus/finding-identity.js +49 -0
  38. package/dist/consensus/finding-identity.js.map +1 -0
  39. package/dist/consensus/gating.d.ts +215 -0
  40. package/dist/consensus/gating.js +699 -0
  41. package/dist/consensus/gating.js.map +1 -0
  42. package/dist/consensus/parser.d.ts +22 -0
  43. package/dist/consensus/parser.js +255 -0
  44. package/dist/consensus/parser.js.map +1 -0
  45. package/dist/consensus/semantic-deduper.d.ts +10 -0
  46. package/dist/consensus/semantic-deduper.js +70 -0
  47. package/dist/consensus/semantic-deduper.js.map +1 -0
  48. package/dist/consensus/types.d.ts +196 -0
  49. package/dist/consensus/types.js +2 -0
  50. package/dist/consensus/types.js.map +1 -0
  51. package/dist/consensus/verification-contract.d.ts +8 -0
  52. package/dist/consensus/verification-contract.js +95 -0
  53. package/dist/consensus/verification-contract.js.map +1 -0
  54. package/dist/consensus/voter.d.ts +29 -0
  55. package/dist/consensus/voter.js +394 -0
  56. package/dist/consensus/voter.js.map +1 -0
  57. package/dist/converge/attempt-budget.d.ts +88 -0
  58. package/dist/converge/attempt-budget.js +717 -0
  59. package/dist/converge/attempt-budget.js.map +1 -0
  60. package/dist/converge/bound-fix-recovery-source.d.ts +24 -0
  61. package/dist/converge/bound-fix-recovery-source.js +25 -0
  62. package/dist/converge/bound-fix-recovery-source.js.map +1 -0
  63. package/dist/converge/bound-fix-recovery.d.ts +15 -0
  64. package/dist/converge/bound-fix-recovery.js +65 -0
  65. package/dist/converge/bound-fix-recovery.js.map +1 -0
  66. package/dist/converge/correction-anchors.d.ts +1 -0
  67. package/dist/converge/correction-anchors.js +2 -0
  68. package/dist/converge/correction-anchors.js.map +1 -0
  69. package/dist/converge/cycle-remote.d.ts +6 -0
  70. package/dist/converge/cycle-remote.js +41 -0
  71. package/dist/converge/cycle-remote.js.map +1 -0
  72. package/dist/converge/delivery-reconciliation.d.ts +17 -0
  73. package/dist/converge/delivery-reconciliation.js +53 -0
  74. package/dist/converge/delivery-reconciliation.js.map +1 -0
  75. package/dist/converge/finding-identity.d.ts +6 -0
  76. package/dist/converge/finding-identity.js +7 -0
  77. package/dist/converge/finding-identity.js.map +1 -0
  78. package/dist/converge/fresh-review.d.ts +37 -0
  79. package/dist/converge/fresh-review.js +351 -0
  80. package/dist/converge/fresh-review.js.map +1 -0
  81. package/dist/converge/launch-guard.d.ts +55 -0
  82. package/dist/converge/launch-guard.js +363 -0
  83. package/dist/converge/launch-guard.js.map +1 -0
  84. package/dist/converge/launch-preflight.d.ts +5 -0
  85. package/dist/converge/launch-preflight.js +41 -0
  86. package/dist/converge/launch-preflight.js.map +1 -0
  87. package/dist/converge/launch-record.d.ts +136 -0
  88. package/dist/converge/launch-record.js +86 -0
  89. package/dist/converge/launch-record.js.map +1 -0
  90. package/dist/converge/legacy-launch-health.d.ts +311 -0
  91. package/dist/converge/legacy-launch-health.js +159 -0
  92. package/dist/converge/legacy-launch-health.js.map +1 -0
  93. package/dist/converge/legacy-roster.d.ts +29 -0
  94. package/dist/converge/legacy-roster.js +268 -0
  95. package/dist/converge/legacy-roster.js.map +1 -0
  96. package/dist/converge/native-lock.d.ts +18 -0
  97. package/dist/converge/native-lock.js +122 -0
  98. package/dist/converge/native-lock.js.map +1 -0
  99. package/dist/converge/ordinary-pending-export.d.ts +67 -0
  100. package/dist/converge/ordinary-pending-export.js +175 -0
  101. package/dist/converge/ordinary-pending-export.js.map +1 -0
  102. package/dist/converge/ordinary-pending-package.d.ts +28 -0
  103. package/dist/converge/ordinary-pending-package.js +36 -0
  104. package/dist/converge/ordinary-pending-package.js.map +1 -0
  105. package/dist/converge/pending-legacy-resume.d.ts +119 -0
  106. package/dist/converge/pending-legacy-resume.js +720 -0
  107. package/dist/converge/pending-legacy-resume.js.map +1 -0
  108. package/dist/converge/pending-recovery-source.d.ts +131 -0
  109. package/dist/converge/pending-recovery-source.js +71 -0
  110. package/dist/converge/pending-recovery-source.js.map +1 -0
  111. package/dist/converge/recovery-launch.d.ts +66 -0
  112. package/dist/converge/recovery-launch.js +518 -0
  113. package/dist/converge/recovery-launch.js.map +1 -0
  114. package/dist/converge/retained-report.d.ts +29 -0
  115. package/dist/converge/retained-report.js +218 -0
  116. package/dist/converge/retained-report.js.map +1 -0
  117. package/dist/converge/retry-source.d.ts +25 -0
  118. package/dist/converge/retry-source.js +13 -0
  119. package/dist/converge/retry-source.js.map +1 -0
  120. package/dist/converge/review-cycle.d.ts +49 -0
  121. package/dist/converge/review-cycle.js +26 -0
  122. package/dist/converge/review-cycle.js.map +1 -0
  123. package/dist/converge/round-gap-schema.d.ts +66 -0
  124. package/dist/converge/round-gap-schema.js +51 -0
  125. package/dist/converge/round-gap-schema.js.map +1 -0
  126. package/dist/converge/round-gap.d.ts +38 -0
  127. package/dist/converge/round-gap.js +334 -0
  128. package/dist/converge/round-gap.js.map +1 -0
  129. package/dist/converge/run-state.d.ts +224 -0
  130. package/dist/converge/run-state.js +564 -0
  131. package/dist/converge/run-state.js.map +1 -0
  132. package/dist/converge/stale-report-schema.d.ts +42 -0
  133. package/dist/converge/stale-report-schema.js +79 -0
  134. package/dist/converge/stale-report-schema.js.map +1 -0
  135. package/dist/converge/stale-report-storage.d.ts +47 -0
  136. package/dist/converge/stale-report-storage.js +172 -0
  137. package/dist/converge/stale-report-storage.js.map +1 -0
  138. package/dist/converge/stale-report.d.ts +14 -0
  139. package/dist/converge/stale-report.js +213 -0
  140. package/dist/converge/stale-report.js.map +1 -0
  141. package/dist/converge/target-ownership.d.ts +29 -0
  142. package/dist/converge/target-ownership.js +95 -0
  143. package/dist/converge/target-ownership.js.map +1 -0
  144. package/dist/converge/terminal-rejection-schema.d.ts +42 -0
  145. package/dist/converge/terminal-rejection-schema.js +39 -0
  146. package/dist/converge/terminal-rejection-schema.js.map +1 -0
  147. package/dist/converge/terminal-rejection.d.ts +13 -0
  148. package/dist/converge/terminal-rejection.js +275 -0
  149. package/dist/converge/terminal-rejection.js.map +1 -0
  150. package/dist/coordination/registry-lock.d.ts +82 -0
  151. package/dist/coordination/registry-lock.js +498 -0
  152. package/dist/coordination/registry-lock.js.map +1 -0
  153. package/dist/discuss.d.ts +53 -0
  154. package/dist/discuss.js +112 -0
  155. package/dist/discuss.js.map +1 -0
  156. package/dist/dispatch/adapter.d.ts +32 -0
  157. package/dist/dispatch/adapter.js +2 -0
  158. package/dist/dispatch/adapter.js.map +1 -0
  159. package/dist/dispatch/anthropic.d.ts +10 -0
  160. package/dist/dispatch/anthropic.js +235 -0
  161. package/dist/dispatch/anthropic.js.map +1 -0
  162. package/dist/dispatch/async-lane.d.ts +127 -0
  163. package/dist/dispatch/async-lane.js +414 -0
  164. package/dist/dispatch/async-lane.js.map +1 -0
  165. package/dist/dispatch/capture-council.d.ts +63 -0
  166. package/dist/dispatch/capture-council.js +137 -0
  167. package/dist/dispatch/capture-council.js.map +1 -0
  168. package/dist/dispatch/captured-async.d.ts +67 -0
  169. package/dist/dispatch/captured-async.js +40 -0
  170. package/dist/dispatch/captured-async.js.map +1 -0
  171. package/dist/dispatch/captured-inputs.d.ts +50 -0
  172. package/dist/dispatch/captured-inputs.js +190 -0
  173. package/dist/dispatch/captured-inputs.js.map +1 -0
  174. package/dist/dispatch/checkpoint-async-context.d.ts +27 -0
  175. package/dist/dispatch/checkpoint-async-context.js +51 -0
  176. package/dist/dispatch/checkpoint-async-context.js.map +1 -0
  177. package/dist/dispatch/checkpoint-async-execution.d.ts +22 -0
  178. package/dist/dispatch/checkpoint-async-execution.js +130 -0
  179. package/dist/dispatch/checkpoint-async-execution.js.map +1 -0
  180. package/dist/dispatch/checkpoint-async-store.d.ts +134 -0
  181. package/dist/dispatch/checkpoint-async-store.js +534 -0
  182. package/dist/dispatch/checkpoint-async-store.js.map +1 -0
  183. package/dist/dispatch/checkpoint-async-unknown.d.ts +19 -0
  184. package/dist/dispatch/checkpoint-async-unknown.js +46 -0
  185. package/dist/dispatch/checkpoint-async-unknown.js.map +1 -0
  186. package/dist/dispatch/checkpoint-async.d.ts +252 -0
  187. package/dist/dispatch/checkpoint-async.js +270 -0
  188. package/dist/dispatch/checkpoint-async.js.map +1 -0
  189. package/dist/dispatch/checkpoint-gating-execution.d.ts +26 -0
  190. package/dist/dispatch/checkpoint-gating-execution.js +84 -0
  191. package/dist/dispatch/checkpoint-gating-execution.js.map +1 -0
  192. package/dist/dispatch/checkpoint-phase-limits.d.ts +5 -0
  193. package/dist/dispatch/checkpoint-phase-limits.js +11 -0
  194. package/dist/dispatch/checkpoint-phase-limits.js.map +1 -0
  195. package/dist/dispatch/checkpoint-verification-context.d.ts +15 -0
  196. package/dist/dispatch/checkpoint-verification-context.js +48 -0
  197. package/dist/dispatch/checkpoint-verification-context.js.map +1 -0
  198. package/dist/dispatch/checkpoint-verification.d.ts +213 -0
  199. package/dist/dispatch/checkpoint-verification.js +381 -0
  200. package/dist/dispatch/checkpoint-verification.js.map +1 -0
  201. package/dist/dispatch/checkpoint.d.ts +329 -0
  202. package/dist/dispatch/checkpoint.js +1418 -0
  203. package/dist/dispatch/checkpoint.js.map +1 -0
  204. package/dist/dispatch/google.d.ts +10 -0
  205. package/dist/dispatch/google.js +158 -0
  206. package/dist/dispatch/google.js.map +1 -0
  207. package/dist/dispatch/late-audit.d.ts +23 -0
  208. package/dist/dispatch/late-audit.js +133 -0
  209. package/dist/dispatch/late-audit.js.map +1 -0
  210. package/dist/dispatch/merge.d.ts +29 -0
  211. package/dist/dispatch/merge.js +112 -0
  212. package/dist/dispatch/merge.js.map +1 -0
  213. package/dist/dispatch/openai-compat.d.ts +30 -0
  214. package/dist/dispatch/openai-compat.js +166 -0
  215. package/dist/dispatch/openai-compat.js.map +1 -0
  216. package/dist/dispatch/openai.d.ts +10 -0
  217. package/dist/dispatch/openai.js +159 -0
  218. package/dist/dispatch/openai.js.map +1 -0
  219. package/dist/dispatch/original-execution.d.ts +30 -0
  220. package/dist/dispatch/original-execution.js +91 -0
  221. package/dist/dispatch/original-execution.js.map +1 -0
  222. package/dist/dispatch/original-launch.d.ts +37 -0
  223. package/dist/dispatch/original-launch.js +117 -0
  224. package/dist/dispatch/original-launch.js.map +1 -0
  225. package/dist/dispatch/quorum.d.ts +15 -0
  226. package/dist/dispatch/quorum.js +33 -0
  227. package/dist/dispatch/quorum.js.map +1 -0
  228. package/dist/dispatch/recovery-operation.d.ts +44 -0
  229. package/dist/dispatch/recovery-operation.js +146 -0
  230. package/dist/dispatch/recovery-operation.js.map +1 -0
  231. package/dist/dispatch/recovery-policy.d.ts +54 -0
  232. package/dist/dispatch/recovery-policy.js +157 -0
  233. package/dist/dispatch/recovery-policy.js.map +1 -0
  234. package/dist/dispatch/recovery.d.ts +78 -0
  235. package/dist/dispatch/recovery.js +299 -0
  236. package/dist/dispatch/recovery.js.map +1 -0
  237. package/dist/dispatch/retained-async.d.ts +13 -0
  238. package/dist/dispatch/retained-async.js +101 -0
  239. package/dist/dispatch/retained-async.js.map +1 -0
  240. package/dist/dispatch/reviewer-identity.d.ts +10 -0
  241. package/dist/dispatch/reviewer-identity.js +19 -0
  242. package/dist/dispatch/reviewer-identity.js.map +1 -0
  243. package/dist/dispatch/runner.d.ts +76 -0
  244. package/dist/dispatch/runner.js +415 -0
  245. package/dist/dispatch/runner.js.map +1 -0
  246. package/dist/dispatch/utils.d.ts +159 -0
  247. package/dist/dispatch/utils.js +381 -0
  248. package/dist/dispatch/utils.js.map +1 -0
  249. package/dist/dispatch/verification-execution.d.ts +48 -0
  250. package/dist/dispatch/verification-execution.js +252 -0
  251. package/dist/dispatch/verification-execution.js.map +1 -0
  252. package/dist/dispatch/verification-late-audit.d.ts +17 -0
  253. package/dist/dispatch/verification-late-audit.js +117 -0
  254. package/dist/dispatch/verification-late-audit.js.map +1 -0
  255. package/dist/evidence/claim-recovery/authenticated-carrier-projection.d.ts +30 -0
  256. package/dist/evidence/claim-recovery/authenticated-carrier-projection.js +100 -0
  257. package/dist/evidence/claim-recovery/authenticated-carrier-projection.js.map +1 -0
  258. package/dist/evidence/claim-recovery/authenticated-receipts.d.ts +46 -0
  259. package/dist/evidence/claim-recovery/authenticated-receipts.js +120 -0
  260. package/dist/evidence/claim-recovery/authenticated-receipts.js.map +1 -0
  261. package/dist/evidence/claim-recovery/carrier-inventory.d.ts +49 -0
  262. package/dist/evidence/claim-recovery/carrier-inventory.js +340 -0
  263. package/dist/evidence/claim-recovery/carrier-inventory.js.map +1 -0
  264. package/dist/evidence/claim-recovery/claim-index.d.ts +12 -0
  265. package/dist/evidence/claim-recovery/claim-index.js +56 -0
  266. package/dist/evidence/claim-recovery/claim-index.js.map +1 -0
  267. package/dist/evidence/claim-recovery/confirmation.d.ts +53 -0
  268. package/dist/evidence/claim-recovery/confirmation.js +151 -0
  269. package/dist/evidence/claim-recovery/confirmation.js.map +1 -0
  270. package/dist/evidence/claim-recovery/context.d.ts +15 -0
  271. package/dist/evidence/claim-recovery/context.js +40 -0
  272. package/dist/evidence/claim-recovery/context.js.map +1 -0
  273. package/dist/evidence/claim-recovery/proof-storage.d.ts +6 -0
  274. package/dist/evidence/claim-recovery/proof-storage.js +97 -0
  275. package/dist/evidence/claim-recovery/proof-storage.js.map +1 -0
  276. package/dist/evidence/claim-recovery/validation/anchors.d.ts +20 -0
  277. package/dist/evidence/claim-recovery/validation/anchors.js +22 -0
  278. package/dist/evidence/claim-recovery/validation/anchors.js.map +1 -0
  279. package/dist/evidence/claim-recovery/validation/carrier-projection.d.ts +9 -0
  280. package/dist/evidence/claim-recovery/validation/carrier-projection.js +364 -0
  281. package/dist/evidence/claim-recovery/validation/carrier-projection.js.map +1 -0
  282. package/dist/evidence/claim-recovery/validation/carrier-types.d.ts +83 -0
  283. package/dist/evidence/claim-recovery/validation/carrier-types.js +2 -0
  284. package/dist/evidence/claim-recovery/validation/carrier-types.js.map +1 -0
  285. package/dist/evidence/claim-recovery/validation/claim-split.d.ts +57 -0
  286. package/dist/evidence/claim-recovery/validation/claim-split.js +209 -0
  287. package/dist/evidence/claim-recovery/validation/claim-split.js.map +1 -0
  288. package/dist/evidence/claim-recovery/validation/claims.d.ts +20 -0
  289. package/dist/evidence/claim-recovery/validation/claims.js +108 -0
  290. package/dist/evidence/claim-recovery/validation/claims.js.map +1 -0
  291. package/dist/evidence/claim-recovery/validation/current-projection.d.ts +36 -0
  292. package/dist/evidence/claim-recovery/validation/current-projection.js +424 -0
  293. package/dist/evidence/claim-recovery/validation/current-projection.js.map +1 -0
  294. package/dist/evidence/claim-recovery/validation/lexical.d.ts +18 -0
  295. package/dist/evidence/claim-recovery/validation/lexical.js +91 -0
  296. package/dist/evidence/claim-recovery/validation/lexical.js.map +1 -0
  297. package/dist/evidence/claim-recovery/validation/materials.d.ts +19 -0
  298. package/dist/evidence/claim-recovery/validation/materials.js +160 -0
  299. package/dist/evidence/claim-recovery/validation/materials.js.map +1 -0
  300. package/dist/evidence/claim-recovery/validation/native-material.d.ts +27 -0
  301. package/dist/evidence/claim-recovery/validation/native-material.js +35 -0
  302. package/dist/evidence/claim-recovery/validation/native-material.js.map +1 -0
  303. package/dist/evidence/claim-recovery/validation/native-occurrences.d.ts +79 -0
  304. package/dist/evidence/claim-recovery/validation/native-occurrences.js +187 -0
  305. package/dist/evidence/claim-recovery/validation/native-occurrences.js.map +1 -0
  306. package/dist/evidence/claim-recovery/validation/native-state.d.ts +45 -0
  307. package/dist/evidence/claim-recovery/validation/native-state.js +385 -0
  308. package/dist/evidence/claim-recovery/validation/native-state.js.map +1 -0
  309. package/dist/evidence/claim-recovery/validation/obligations.d.ts +15 -0
  310. package/dist/evidence/claim-recovery/validation/obligations.js +65 -0
  311. package/dist/evidence/claim-recovery/validation/obligations.js.map +1 -0
  312. package/dist/evidence/claim-recovery/validation/occurrence-source.d.ts +45 -0
  313. package/dist/evidence/claim-recovery/validation/occurrence-source.js +208 -0
  314. package/dist/evidence/claim-recovery/validation/occurrence-source.js.map +1 -0
  315. package/dist/evidence/claim-recovery/validation/occurrence-types.d.ts +101 -0
  316. package/dist/evidence/claim-recovery/validation/occurrence-types.js +2 -0
  317. package/dist/evidence/claim-recovery/validation/occurrence-types.js.map +1 -0
  318. package/dist/evidence/claim-recovery/validation/occurrence.d.ts +30 -0
  319. package/dist/evidence/claim-recovery/validation/occurrence.js +227 -0
  320. package/dist/evidence/claim-recovery/validation/occurrence.js.map +1 -0
  321. package/dist/evidence/claim-recovery/validation/primitives.d.ts +11 -0
  322. package/dist/evidence/claim-recovery/validation/primitives.js +41 -0
  323. package/dist/evidence/claim-recovery/validation/primitives.js.map +1 -0
  324. package/dist/evidence/claim-recovery/validation/receipts.d.ts +37 -0
  325. package/dist/evidence/claim-recovery/validation/receipts.js +83 -0
  326. package/dist/evidence/claim-recovery/validation/receipts.js.map +1 -0
  327. package/dist/evidence/claim-recovery/validation/recovery-json.d.ts +8 -0
  328. package/dist/evidence/claim-recovery/validation/recovery-json.js +42 -0
  329. package/dist/evidence/claim-recovery/validation/recovery-json.js.map +1 -0
  330. package/dist/evidence/claim-recovery/validation/semantic-cache.d.ts +3 -0
  331. package/dist/evidence/claim-recovery/validation/semantic-cache.js +22 -0
  332. package/dist/evidence/claim-recovery/validation/semantic-cache.js.map +1 -0
  333. package/dist/evidence/claim-recovery/validation/semantic-validation.d.ts +9 -0
  334. package/dist/evidence/claim-recovery/validation/semantic-validation.js +347 -0
  335. package/dist/evidence/claim-recovery/validation/semantic-validation.js.map +1 -0
  336. package/dist/evidence/claim-recovery/validation/sighting.d.ts +2 -0
  337. package/dist/evidence/claim-recovery/validation/sighting.js +15 -0
  338. package/dist/evidence/claim-recovery/validation/sighting.js.map +1 -0
  339. package/dist/evidence/claim-recovery/validation/sources.d.ts +15 -0
  340. package/dist/evidence/claim-recovery/validation/sources.js +2 -0
  341. package/dist/evidence/claim-recovery/validation/sources.js.map +1 -0
  342. package/dist/evidence/claim-recovery/validation/types.d.ts +126 -0
  343. package/dist/evidence/claim-recovery/validation/types.js +2 -0
  344. package/dist/evidence/claim-recovery/validation/types.js.map +1 -0
  345. package/dist/evidence/claim-split.d.ts +1 -0
  346. package/dist/evidence/claim-split.js +2 -0
  347. package/dist/evidence/claim-split.js.map +1 -0
  348. package/dist/evidence/event-receipts.d.ts +16 -0
  349. package/dist/evidence/event-receipts.js +41 -0
  350. package/dist/evidence/event-receipts.js.map +1 -0
  351. package/dist/evidence/finding-recovery.d.ts +23 -0
  352. package/dist/evidence/finding-recovery.js +74 -0
  353. package/dist/evidence/finding-recovery.js.map +1 -0
  354. package/dist/evidence/finding-retriage.d.ts +14 -0
  355. package/dist/evidence/finding-retriage.js +57 -0
  356. package/dist/evidence/finding-retriage.js.map +1 -0
  357. package/dist/evidence/format.d.ts +18 -0
  358. package/dist/evidence/format.js +152 -0
  359. package/dist/evidence/format.js.map +1 -0
  360. package/dist/evidence/original-run/decode.d.ts +30 -0
  361. package/dist/evidence/original-run/decode.js +208 -0
  362. package/dist/evidence/original-run/decode.js.map +1 -0
  363. package/dist/evidence/original-run/journal.d.ts +31 -0
  364. package/dist/evidence/original-run/journal.js +157 -0
  365. package/dist/evidence/original-run/journal.js.map +1 -0
  366. package/dist/evidence/original-run/lock-path.d.ts +17 -0
  367. package/dist/evidence/original-run/lock-path.js +116 -0
  368. package/dist/evidence/original-run/lock-path.js.map +1 -0
  369. package/dist/evidence/original-run/lock-scope.d.ts +21 -0
  370. package/dist/evidence/original-run/lock-scope.js +61 -0
  371. package/dist/evidence/original-run/lock-scope.js.map +1 -0
  372. package/dist/evidence/original-run/lock.d.ts +33 -0
  373. package/dist/evidence/original-run/lock.js +259 -0
  374. package/dist/evidence/original-run/lock.js.map +1 -0
  375. package/dist/evidence/original-run/remote.d.ts +23 -0
  376. package/dist/evidence/original-run/remote.js +110 -0
  377. package/dist/evidence/original-run/remote.js.map +1 -0
  378. package/dist/evidence/original-run/source.d.ts +61 -0
  379. package/dist/evidence/original-run/source.js +267 -0
  380. package/dist/evidence/original-run/source.js.map +1 -0
  381. package/dist/evidence/reads.d.ts +11 -0
  382. package/dist/evidence/reads.js +16 -0
  383. package/dist/evidence/reads.js.map +1 -0
  384. package/dist/evidence/recover-finding.d.ts +17 -0
  385. package/dist/evidence/recover-finding.js +65 -0
  386. package/dist/evidence/recover-finding.js.map +1 -0
  387. package/dist/evidence/recover-run.d.ts +26 -0
  388. package/dist/evidence/recover-run.js +180 -0
  389. package/dist/evidence/recover-run.js.map +1 -0
  390. package/dist/evidence/retained-time-budget.d.ts +9 -0
  391. package/dist/evidence/retained-time-budget.js +14 -0
  392. package/dist/evidence/retained-time-budget.js.map +1 -0
  393. package/dist/evidence/retriage-finding.d.ts +12 -0
  394. package/dist/evidence/retriage-finding.js +67 -0
  395. package/dist/evidence/retriage-finding.js.map +1 -0
  396. package/dist/evidence/reviewer-lineage.d.ts +35 -0
  397. package/dist/evidence/reviewer-lineage.js +293 -0
  398. package/dist/evidence/reviewer-lineage.js.map +1 -0
  399. package/dist/evidence/reviewer-original.d.ts +67 -0
  400. package/dist/evidence/reviewer-original.js +148 -0
  401. package/dist/evidence/reviewer-original.js.map +1 -0
  402. package/dist/evidence/reviewer-recovery.d.ts +74 -0
  403. package/dist/evidence/reviewer-recovery.js +179 -0
  404. package/dist/evidence/reviewer-recovery.js.map +1 -0
  405. package/dist/evidence/reviewer-status.d.ts +145 -0
  406. package/dist/evidence/reviewer-status.js +302 -0
  407. package/dist/evidence/reviewer-status.js.map +1 -0
  408. package/dist/evidence/show.d.ts +10 -0
  409. package/dist/evidence/show.js +41 -0
  410. package/dist/evidence/show.js.map +1 -0
  411. package/dist/evidence/status.d.ts +38 -0
  412. package/dist/evidence/status.js +73 -0
  413. package/dist/evidence/status.js.map +1 -0
  414. package/dist/evidence/target.d.ts +17 -0
  415. package/dist/evidence/target.js +74 -0
  416. package/dist/evidence/target.js.map +1 -0
  417. package/dist/evidence/types.d.ts +176 -0
  418. package/dist/evidence/types.js +109 -0
  419. package/dist/evidence/types.js.map +1 -0
  420. package/dist/index.d.ts +2 -0
  421. package/dist/index.js +2688 -0
  422. package/dist/index.js.map +1 -0
  423. package/dist/models/seed.d.ts +44 -0
  424. package/dist/models/seed.js +175 -0
  425. package/dist/models/seed.js.map +1 -0
  426. package/dist/models/server-stats.d.ts +80 -0
  427. package/dist/models/server-stats.js +109 -0
  428. package/dist/models/server-stats.js.map +1 -0
  429. package/dist/models/stats-store.d.ts +84 -0
  430. package/dist/models/stats-store.js +572 -0
  431. package/dist/models/stats-store.js.map +1 -0
  432. package/dist/output/artifacts.d.ts +16 -0
  433. package/dist/output/artifacts.js +29 -0
  434. package/dist/output/artifacts.js.map +1 -0
  435. package/dist/output/assembly-refusal.d.ts +8 -0
  436. package/dist/output/assembly-refusal.js +14 -0
  437. package/dist/output/assembly-refusal.js.map +1 -0
  438. package/dist/output/github.d.ts +12 -0
  439. package/dist/output/github.js +214 -0
  440. package/dist/output/github.js.map +1 -0
  441. package/dist/output/json.d.ts +3 -0
  442. package/dist/output/json.js +8 -0
  443. package/dist/output/json.js.map +1 -0
  444. package/dist/output/markdown.d.ts +3 -0
  445. package/dist/output/markdown.js +281 -0
  446. package/dist/output/markdown.js.map +1 -0
  447. package/dist/output/progress.d.ts +55 -0
  448. package/dist/output/progress.js +180 -0
  449. package/dist/output/progress.js.map +1 -0
  450. package/dist/output/sanitize.d.ts +18 -0
  451. package/dist/output/sanitize.js +46 -0
  452. package/dist/output/sanitize.js.map +1 -0
  453. package/dist/output/terminal.d.ts +2 -0
  454. package/dist/output/terminal.js +172 -0
  455. package/dist/output/terminal.js.map +1 -0
  456. package/dist/prepare/chunker.d.ts +18 -0
  457. package/dist/prepare/chunker.js +325 -0
  458. package/dist/prepare/chunker.js.map +1 -0
  459. package/dist/prepare/language.d.ts +1 -0
  460. package/dist/prepare/language.js +99 -0
  461. package/dist/prepare/language.js.map +1 -0
  462. package/dist/prepare/prompt-builder.d.ts +44 -0
  463. package/dist/prepare/prompt-builder.js +102 -0
  464. package/dist/prepare/prompt-builder.js.map +1 -0
  465. package/dist/prepare/unified-diff.d.ts +40 -0
  466. package/dist/prepare/unified-diff.js +135 -0
  467. package/dist/prepare/unified-diff.js.map +1 -0
  468. package/dist/prompts/base.d.ts +3 -0
  469. package/dist/prompts/base.js +53 -0
  470. package/dist/prompts/base.js.map +1 -0
  471. package/dist/prompts/hardening.d.ts +19 -0
  472. package/dist/prompts/hardening.js +67 -0
  473. package/dist/prompts/hardening.js.map +1 -0
  474. package/dist/prompts/languages/elixir.d.ts +1 -0
  475. package/dist/prompts/languages/elixir.js +13 -0
  476. package/dist/prompts/languages/elixir.js.map +1 -0
  477. package/dist/prompts/languages/generic.d.ts +1 -0
  478. package/dist/prompts/languages/generic.js +11 -0
  479. package/dist/prompts/languages/generic.js.map +1 -0
  480. package/dist/prompts/languages/python.d.ts +1 -0
  481. package/dist/prompts/languages/python.js +14 -0
  482. package/dist/prompts/languages/python.js.map +1 -0
  483. package/dist/prompts/languages/typescript.d.ts +1 -0
  484. package/dist/prompts/languages/typescript.js +13 -0
  485. package/dist/prompts/languages/typescript.js.map +1 -0
  486. package/dist/prompts/plan.d.ts +15 -0
  487. package/dist/prompts/plan.js +55 -0
  488. package/dist/prompts/plan.js.map +1 -0
  489. package/dist/report/aggregation-inputs.d.ts +52 -0
  490. package/dist/report/aggregation-inputs.js +114 -0
  491. package/dist/report/aggregation-inputs.js.map +1 -0
  492. package/dist/report/assembly.d.ts +43 -0
  493. package/dist/report/assembly.js +133 -0
  494. package/dist/report/assembly.js.map +1 -0
  495. package/dist/report/blocking-health.d.ts +64 -0
  496. package/dist/report/blocking-health.js +156 -0
  497. package/dist/report/blocking-health.js.map +1 -0
  498. package/dist/report/checkpoint-assembly.d.ts +10 -0
  499. package/dist/report/checkpoint-assembly.js +17 -0
  500. package/dist/report/checkpoint-assembly.js.map +1 -0
  501. package/dist/report/checkpoint-consensus.d.ts +59 -0
  502. package/dist/report/checkpoint-consensus.js +197 -0
  503. package/dist/report/checkpoint-consensus.js.map +1 -0
  504. package/dist/report/checkpoint-gating.d.ts +36 -0
  505. package/dist/report/checkpoint-gating.js +110 -0
  506. package/dist/report/checkpoint-gating.js.map +1 -0
  507. package/dist/report/checkpoint-projection.d.ts +76 -0
  508. package/dist/report/checkpoint-projection.js +122 -0
  509. package/dist/report/checkpoint-projection.js.map +1 -0
  510. package/dist/report/consensus-assembly.d.ts +37 -0
  511. package/dist/report/consensus-assembly.js +33 -0
  512. package/dist/report/consensus-assembly.js.map +1 -0
  513. package/dist/report/recovery-source.d.ts +7 -0
  514. package/dist/report/recovery-source.js +7 -0
  515. package/dist/report/recovery-source.js.map +1 -0
  516. package/dist/report/reviewer-artifact.d.ts +118 -0
  517. package/dist/report/reviewer-artifact.js +381 -0
  518. package/dist/report/reviewer-artifact.js.map +1 -0
  519. package/dist/report/reviewer-evidence-schema.d.ts +42 -0
  520. package/dist/report/reviewer-evidence-schema.js +28 -0
  521. package/dist/report/reviewer-evidence-schema.js.map +1 -0
  522. package/dist/report/reviewer-evidence.d.ts +54 -0
  523. package/dist/report/reviewer-evidence.js +229 -0
  524. package/dist/report/reviewer-evidence.js.map +1 -0
  525. package/dist/report/reviewer-health.d.ts +62 -0
  526. package/dist/report/reviewer-health.js +105 -0
  527. package/dist/report/reviewer-health.js.map +1 -0
  528. package/dist/report/run-header.d.ts +219 -0
  529. package/dist/report/run-header.js +307 -0
  530. package/dist/report/run-header.js.map +1 -0
  531. package/dist/report/supplemental-async.d.ts +19 -0
  532. package/dist/report/supplemental-async.js +85 -0
  533. package/dist/report/supplemental-async.js.map +1 -0
  534. package/dist/report/uuid.d.ts +16 -0
  535. package/dist/report/uuid.js +41 -0
  536. package/dist/report/uuid.js.map +1 -0
  537. package/dist/resolver/git.d.ts +16 -0
  538. package/dist/resolver/git.js +77 -0
  539. package/dist/resolver/git.js.map +1 -0
  540. package/dist/resolver/github-client.d.ts +82 -0
  541. package/dist/resolver/github-client.js +27 -0
  542. package/dist/resolver/github-client.js.map +1 -0
  543. package/dist/resolver/github.d.ts +29 -0
  544. package/dist/resolver/github.js +166 -0
  545. package/dist/resolver/github.js.map +1 -0
  546. package/dist/resolver/local.d.ts +3 -0
  547. package/dist/resolver/local.js +75 -0
  548. package/dist/resolver/local.js.map +1 -0
  549. package/dist/resolver/plan.d.ts +8 -0
  550. package/dist/resolver/plan.js +44 -0
  551. package/dist/resolver/plan.js.map +1 -0
  552. package/dist/resolver/target.d.ts +35 -0
  553. package/dist/resolver/target.js +112 -0
  554. package/dist/resolver/target.js.map +1 -0
  555. package/dist/resolver/types.d.ts +43 -0
  556. package/dist/resolver/types.js +2 -0
  557. package/dist/resolver/types.js.map +1 -0
  558. package/dist/roles/builtin.d.ts +4 -0
  559. package/dist/roles/builtin.js +282 -0
  560. package/dist/roles/builtin.js.map +1 -0
  561. package/dist/roles/dispatcher.d.ts +26 -0
  562. package/dist/roles/dispatcher.js +96 -0
  563. package/dist/roles/dispatcher.js.map +1 -0
  564. package/dist/roles/legacy-4.1.10.d.ts +2 -0
  565. package/dist/roles/legacy-4.1.10.js +320 -0
  566. package/dist/roles/legacy-4.1.10.js.map +1 -0
  567. package/dist/roles/legacy-4.4.9.d.ts +4 -0
  568. package/dist/roles/legacy-4.4.9.js +282 -0
  569. package/dist/roles/legacy-4.4.9.js.map +1 -0
  570. package/dist/roles/loader.d.ts +10 -0
  571. package/dist/roles/loader.js +104 -0
  572. package/dist/roles/loader.js.map +1 -0
  573. package/dist/roles/types.d.ts +13 -0
  574. package/dist/roles/types.js +2 -0
  575. package/dist/roles/types.js.map +1 -0
  576. package/dist/telemetry/abort-signal.d.ts +13 -0
  577. package/dist/telemetry/abort-signal.js +40 -0
  578. package/dist/telemetry/abort-signal.js.map +1 -0
  579. package/dist/telemetry/attest.d.ts +98 -0
  580. package/dist/telemetry/attest.js +331 -0
  581. package/dist/telemetry/attest.js.map +1 -0
  582. package/dist/telemetry/attested-retry.d.ts +79 -0
  583. package/dist/telemetry/attested-retry.js +195 -0
  584. package/dist/telemetry/attested-retry.js.map +1 -0
  585. package/dist/telemetry/attested-reviewer-delivery.d.ts +58 -0
  586. package/dist/telemetry/attested-reviewer-delivery.js +238 -0
  587. package/dist/telemetry/attested-reviewer-delivery.js.map +1 -0
  588. package/dist/telemetry/backfill.d.ts +95 -0
  589. package/dist/telemetry/backfill.js +460 -0
  590. package/dist/telemetry/backfill.js.map +1 -0
  591. package/dist/telemetry/credentials.d.ts +44 -0
  592. package/dist/telemetry/credentials.js +87 -0
  593. package/dist/telemetry/credentials.js.map +1 -0
  594. package/dist/telemetry/deliver.d.ts +152 -0
  595. package/dist/telemetry/deliver.js +662 -0
  596. package/dist/telemetry/deliver.js.map +1 -0
  597. package/dist/telemetry/envelope-validation.d.ts +13 -0
  598. package/dist/telemetry/envelope-validation.js +196 -0
  599. package/dist/telemetry/envelope-validation.js.map +1 -0
  600. package/dist/telemetry/envelope.d.ts +159 -0
  601. package/dist/telemetry/envelope.js +288 -0
  602. package/dist/telemetry/envelope.js.map +1 -0
  603. package/dist/telemetry/events.d.ts +68 -0
  604. package/dist/telemetry/events.js +79 -0
  605. package/dist/telemetry/events.js.map +1 -0
  606. package/dist/telemetry/notice.d.ts +15 -0
  607. package/dist/telemetry/notice.js +67 -0
  608. package/dist/telemetry/notice.js.map +1 -0
  609. package/dist/telemetry/outbox.d.ts +166 -0
  610. package/dist/telemetry/outbox.js +741 -0
  611. package/dist/telemetry/outbox.js.map +1 -0
  612. package/dist/telemetry/quarantine.d.ts +105 -0
  613. package/dist/telemetry/quarantine.js +224 -0
  614. package/dist/telemetry/quarantine.js.map +1 -0
  615. package/dist/telemetry/read-sink.d.ts +31 -0
  616. package/dist/telemetry/read-sink.js +25 -0
  617. package/dist/telemetry/read-sink.js.map +1 -0
  618. package/dist/telemetry/recovery/command.d.ts +16 -0
  619. package/dist/telemetry/recovery/command.js +70 -0
  620. package/dist/telemetry/recovery/command.js.map +1 -0
  621. package/dist/telemetry/recovery/discovery.d.ts +8 -0
  622. package/dist/telemetry/recovery/discovery.js +277 -0
  623. package/dist/telemetry/recovery/discovery.js.map +1 -0
  624. package/dist/telemetry/recovery/files.d.ts +20 -0
  625. package/dist/telemetry/recovery/files.js +123 -0
  626. package/dist/telemetry/recovery/files.js.map +1 -0
  627. package/dist/telemetry/recovery/plan.d.ts +10 -0
  628. package/dist/telemetry/recovery/plan.js +325 -0
  629. package/dist/telemetry/recovery/plan.js.map +1 -0
  630. package/dist/telemetry/recovery/source.d.ts +328 -0
  631. package/dist/telemetry/recovery/source.js +253 -0
  632. package/dist/telemetry/recovery/source.js.map +1 -0
  633. package/dist/telemetry/recovery/types.d.ts +100 -0
  634. package/dist/telemetry/recovery/types.js +2 -0
  635. package/dist/telemetry/recovery/types.js.map +1 -0
  636. package/dist/telemetry/recovery-request-budget.d.ts +39 -0
  637. package/dist/telemetry/recovery-request-budget.js +102 -0
  638. package/dist/telemetry/recovery-request-budget.js.map +1 -0
  639. package/dist/telemetry/report-consistency.d.ts +11 -0
  640. package/dist/telemetry/report-consistency.js +111 -0
  641. package/dist/telemetry/report-consistency.js.map +1 -0
  642. package/dist/telemetry/reviewer-delivery.d.ts +39 -0
  643. package/dist/telemetry/reviewer-delivery.js +279 -0
  644. package/dist/telemetry/reviewer-delivery.js.map +1 -0
  645. package/dist/telemetry/reviewer-preflight.d.ts +13 -0
  646. package/dist/telemetry/reviewer-preflight.js +56 -0
  647. package/dist/telemetry/reviewer-preflight.js.map +1 -0
  648. package/dist/telemetry/scrub.d.ts +53 -0
  649. package/dist/telemetry/scrub.js +205 -0
  650. package/dist/telemetry/scrub.js.map +1 -0
  651. package/dist/telemetry/sink.d.ts +212 -0
  652. package/dist/telemetry/sink.js +813 -0
  653. package/dist/telemetry/sink.js.map +1 -0
  654. package/dist/telemetry/terminal-reviewer-delivery.d.ts +18 -0
  655. package/dist/telemetry/terminal-reviewer-delivery.js +27 -0
  656. package/dist/telemetry/terminal-reviewer-delivery.js.map +1 -0
  657. package/dist/telemetry/transient-input.d.ts +2 -0
  658. package/dist/telemetry/transient-input.js +37 -0
  659. package/dist/telemetry/transient-input.js.map +1 -0
  660. package/dist/telemetry/verification.d.ts +9 -0
  661. package/dist/telemetry/verification.js +12 -0
  662. package/dist/telemetry/verification.js.map +1 -0
  663. package/package.json +73 -0
@@ -0,0 +1,114 @@
1
+ import { z } from 'zod';
2
+ import { GatingSchema, ThresholdsSchema } from '../config/schema.js';
3
+ import { sha256Hex, stableStringify } from './run-header.js';
4
+ export const MAX_AGGREGATION_INPUT_BYTES = 8 * 1024 * 1024;
5
+ // Version 2 fixes every deduper sort to UTF-16 code-unit ordering. Version 1
6
+ // depended on ambient ICU collation and cannot be independently reconstructed.
7
+ export const AGGREGATION_ALGORITHM = Object.freeze({ name: 'consensus', version: 2 });
8
+ const algorithmSchema = z.object({ name: z.literal(AGGREGATION_ALGORITHM.name), version: z.literal(AGGREGATION_ALGORITHM.version) }).strict();
9
+ const digestSchema = z.string().regex(/^[a-f0-9]{64}$/);
10
+ const thresholdsSchema = ThresholdsSchema.required().strict();
11
+ const verifierSchema = GatingSchema.shape.verificationModel.unwrap().min(1).refine(model => !model.startsWith('openrouter/'));
12
+ const gatingSchema = z.object({
13
+ mode: GatingSchema.shape.mode.unwrap(), minModels: GatingSchema.shape.minModels.unwrap().safe(),
14
+ verificationModel: verifierSchema.nullable(),
15
+ verificationReasoningEffort: GatingSchema.shape.verificationReasoningEffort,
16
+ verificationTimeoutMs: GatingSchema.shape.verificationTimeout.unwrap(),
17
+ verificationPassTimeoutMs: GatingSchema.shape.verificationPassTimeout.unwrap(),
18
+ }).strict();
19
+ const roleSchema = z.object({ name: z.string().min(1), systemPrompt: z.string(), focus: z.array(z.string()),
20
+ severityBias: z.record(z.string(), z.number().finite()).optional(), description: z.string(), isSpecialized: z.boolean() }).strict();
21
+ const roleEntrySchema = z.object({ name: z.string().min(1), role: roleSchema }).strict().refine(entry => entry.name === entry.role.name);
22
+ // loadMergedWeights applies the supported voter's inclusive [0.5, 1.5] range.
23
+ const weightEntrySchema = z.object({ model: z.string().min(1).refine(model => !/[\u0000-\u001f\u007f-\u009f]/.test(model)), weight: z.number().finite().min(0.5).max(1.5) }).strict();
24
+ const wireSchema = z.object({
25
+ version: z.literal(1), verifierContractVersion: z.literal(2).optional(), algorithm: algorithmSchema, diffSha256: digestSchema,
26
+ roles: z.array(roleEntrySchema).refine(rows => rows.every((row, index) => index === 0 || rows[index - 1].name < row.name)),
27
+ thresholds: thresholdsSchema, gating: gatingSchema,
28
+ modelWeights: z.array(weightEntrySchema).refine(rows => rows.every((row, index) => index === 0 || rows[index - 1].model < row.model)).optional(),
29
+ belowThresholdAppendix: z.boolean(),
30
+ }).strict().refine(wire => wire.verifierContractVersion === 2 || wire.gating.verificationReasoningEffort === undefined);
31
+ const inputSchema = z.object({
32
+ algorithm: algorithmSchema, diffSha256: digestSchema, roleMap: z.instanceof(Map), thresholds: thresholdsSchema,
33
+ gating: gatingSchema.extend({ verificationModel: verifierSchema.optional() }), modelWeights: z.instanceof(Map).optional(),
34
+ belowThresholdAppendix: z.boolean(),
35
+ }).strict();
36
+ const capturedValues = new WeakSet();
37
+ function freeze(value) {
38
+ if (value !== null && typeof value === 'object' && !Object.isFrozen(value)) {
39
+ for (const child of Object.values(value))
40
+ freeze(child);
41
+ Object.freeze(value);
42
+ }
43
+ return value;
44
+ }
45
+ function bound(bytes) {
46
+ if (typeof bytes !== 'string' || Buffer.byteLength(bytes, 'utf8') > MAX_AGGREGATION_INPUT_BYTES ||
47
+ Buffer.from(bytes, 'utf8').toString('utf8') !== bytes)
48
+ throw new Error('aggregation_invalid_bytes');
49
+ }
50
+ function compareKeys(left, right) { return left < right ? -1 : left > right ? 1 : 0; }
51
+ /** Runtime validation brand, not provider, source-lineage or persistence authority. */
52
+ export function isCapturedAggregationInputs(value) {
53
+ return value !== null && typeof value === 'object' && capturedValues.has(value);
54
+ }
55
+ /**
56
+ * Snapshot resolved static inputs before the first paid intent. The caller binds
57
+ * these bytes in the existing capture document; this pure function stores nothing.
58
+ */
59
+ export function captureAggregationInputs(input) {
60
+ const parsed = inputSchema.safeParse(input);
61
+ if (!parsed.success)
62
+ throw new Error('aggregation_invalid_input');
63
+ const actual = parsed.data;
64
+ let componentBytes = 0;
65
+ const retain = (value) => {
66
+ componentBytes += Buffer.byteLength(stableStringify(value), 'utf8');
67
+ if (componentBytes > MAX_AGGREGATION_INPUT_BYTES)
68
+ throw new Error('aggregation_invalid_bytes');
69
+ return value;
70
+ };
71
+ const roles = [...actual.roleMap.entries()].map(([name, role]) => {
72
+ const entry = roleEntrySchema.safeParse({ name, role });
73
+ if (!entry.success || stableStringify(entry.data) !== stableStringify({ name, role }))
74
+ throw new Error('aggregation_invalid_input');
75
+ return retain(entry.data);
76
+ }).sort((left, right) => compareKeys(left.name, right.name));
77
+ const modelWeights = actual.modelWeights === undefined ? undefined : [...actual.modelWeights.entries()].map(([model, weight]) => {
78
+ const entry = weightEntrySchema.safeParse({ model, weight });
79
+ if (!entry.success)
80
+ throw new Error('aggregation_invalid_input');
81
+ return retain(entry.data);
82
+ }).sort((left, right) => compareKeys(left.model, right.model));
83
+ const bytes = stableStringify({ version: 1, verifierContractVersion: 2, algorithm: actual.algorithm, diffSha256: actual.diffSha256, roles,
84
+ thresholds: actual.thresholds, gating: { ...actual.gating, verificationModel: actual.gating.verificationModel ?? null },
85
+ ...(modelWeights !== undefined ? { modelWeights } : {}), belowThresholdAppendix: actual.belowThresholdAppendix });
86
+ return decodeAggregationInputs(bytes, actual.diffSha256);
87
+ }
88
+ /** Decode only the captured values. No defaults, filesystem, server weights or provider selection. */
89
+ export function decodeAggregationInputs(bytes, expectedDiffSha256) {
90
+ bound(bytes);
91
+ if (!digestSchema.safeParse(expectedDiffSha256).success)
92
+ throw new Error('aggregation_invalid_expected_diff');
93
+ let decoded;
94
+ try {
95
+ decoded = JSON.parse(bytes);
96
+ }
97
+ catch {
98
+ throw new Error('aggregation_invalid_json');
99
+ }
100
+ const parsed = wireSchema.safeParse(decoded);
101
+ if (!parsed.success)
102
+ throw new Error('aggregation_invalid_document');
103
+ if (stableStringify(parsed.data) !== bytes)
104
+ throw new Error('aggregation_noncanonical_json');
105
+ const wire = parsed.data;
106
+ if (wire.diffSha256 !== expectedDiffSha256)
107
+ throw new Error('aggregation_diff_mismatch');
108
+ // Explicit null on wire freezes unavailable selection; runtime keeps the existing gating API.
109
+ const captured = freeze({ ...wire, bytes, digest: sha256Hex(bytes),
110
+ gating: { ...wire.gating, verificationModel: wire.gating.verificationModel ?? undefined } });
111
+ capturedValues.add(captured);
112
+ return captured;
113
+ }
114
+ //# sourceMappingURL=aggregation-inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregation-inputs.js","sourceRoot":"","sources":["../../src/report/aggregation-inputs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { DedupeOrdering } from '../consensus/deduper.js';
2
+ import type { Config } from '../config/schema.js';
3
+ import { type GatingOptions, type ResolvedGatingConfig } from '../consensus/gating.js';
4
+ import type { ConsensusFinding, ModelReview, ReviewResult } from '../consensus/types.js';
5
+ import type { Diff } from '../resolver/types.js';
6
+ import type { Role } from '../roles/types.js';
7
+ import { type RunHeader, type RunHeaderInput } from './run-header.js';
8
+ import { type ReviewerHealth } from './reviewer-health.js';
9
+ import { type ConsensusAssembly, type ConsensusAssemblyContribution } from './consensus-assembly.js';
10
+ export interface CompletedReviewInput {
11
+ chunkReviews: ModelReview[];
12
+ arrivedAsync: ModelReview[];
13
+ asyncLaunched: number;
14
+ startTime: number;
15
+ roleMap: Map<string, Role>;
16
+ config: Config;
17
+ diff: Diff;
18
+ gatingConfig: ResolvedGatingConfig;
19
+ modelWeights?: Map<string, number>;
20
+ dedupeOrdering?: DedupeOrdering;
21
+ /** Validated original-seat health for proof-bearing reports; never deserialized counts. */
22
+ reviewerHealth?: ReviewerHealth;
23
+ run: Omit<RunHeaderInput, 'config' | 'diff' | 'gating' | 'thresholds' | 'finishedAt' | 'ciExitCode'>;
24
+ }
25
+ export interface AssemblyDependencies extends Pick<GatingOptions, 'ask' | 'monotonicNow' | 'onVerificationProgress'> {
26
+ onStage?: (stage: string) => void;
27
+ onVerificationStart?: () => void;
28
+ onWarning?: (warning: string) => void;
29
+ /** Indices refer to the merged voting reviews in the returned report. */
30
+ onFindingContributions?: (groups: ConsensusAssemblyContribution[]) => void;
31
+ }
32
+ /** Internal replay projection; the checkpoint adapter derives it from validated retained evidence. */
33
+ export interface CompletedReviewProjection {
34
+ consensus: ConsensusAssembly;
35
+ findings: ConsensusFinding[];
36
+ appendix: ConsensusFinding[];
37
+ verification?: ReviewResult['stats']['verification'];
38
+ blockingHealth: NonNullable<ReviewResult['stats']['blockingHealth']>;
39
+ }
40
+ /** Assemble retained reviewer outputs through consensus, bounded gating, and the run header. */
41
+ export declare function assembleCompletedReview(input: CompletedReviewInput, dependencies?: AssemblyDependencies, retained?: CompletedReviewProjection): Promise<ReviewResult & {
42
+ run: RunHeader;
43
+ }>;
@@ -0,0 +1,133 @@
1
+ import { assertUnambiguousReviewerIdentities } from '../dispatch/reviewer-identity.js';
2
+ import { evaluateCiGate } from '../ci.js';
3
+ import { DEFAULT_QUORUM_FRACTION, DEFAULT_THRESHOLDS } from '../config/defaults.js';
4
+ import { deriveBlockingHealth, summarizeBlockingHealth } from './blocking-health.js';
5
+ import { applyGatingWithFallback } from '../consensus/gating.js';
6
+ import { mergeChunkReviews } from '../dispatch/merge.js';
7
+ import { buildRunHeader } from './run-header.js';
8
+ import { uuidv7 } from './uuid.js';
9
+ import { assertReviewerHealth } from './reviewer-health.js';
10
+ import { deriveConsensusAssembly } from './consensus-assembly.js';
11
+ /**
12
+ * A report whose rows cannot be matched to its roster still completes: the
13
+ * summary is omitted, and admission derives health again and refuses it.
14
+ */
15
+ function blockingHealthStats(roster, reviews, fraction) {
16
+ try {
17
+ return { blockingHealth: summarizeBlockingHealth(deriveBlockingHealth({ roster, reviews, fraction })) };
18
+ }
19
+ catch {
20
+ return {};
21
+ }
22
+ }
23
+ /** Assemble retained reviewer outputs through consensus, bounded gating, and the run header. */
24
+ export async function assembleCompletedReview(input, dependencies = {}, retained) {
25
+ const { chunkReviews, arrivedAsync, asyncLaunched, startTime, roleMap, config, diff, gatingConfig, modelWeights } = input;
26
+ assertUnambiguousReviewerIdentities([...chunkReviews, ...arrivedAsync, ...(retained?.consensus.reviews ?? [])]);
27
+ if (input.reviewerHealth !== undefined)
28
+ assertReviewerHealth(input.reviewerHealth);
29
+ dependencies.onStage?.('computing consensus');
30
+ const runId = input.run.id ?? uuidv7();
31
+ const { reviews, consensusFindings, reportFindings, droppedFindings, contributions } = retained?.consensus ?? deriveConsensusAssembly({
32
+ runId, chunkReviews, arrivedAsync, roleMap, thresholds: config.thresholds, modelWeights,
33
+ collectContributions: dependencies.onFindingContributions !== undefined,
34
+ dedupeOrdering: input.dedupeOrdering,
35
+ });
36
+ // Convergence gating (RCL-23): annotate every kept finding with why it
37
+ // does or does not gate; single-model blocking findings get one batched
38
+ // evidence-based adjudication call.
39
+ let finalFindings = retained?.findings ?? reportFindings;
40
+ let gatedAppendix = retained?.appendix ?? droppedFindings;
41
+ let verificationStats = retained?.verification;
42
+ if (retained === undefined && gatingConfig.mode === 'verified-consensus' && (input.reviewerHealth === undefined || input.reviewerHealth.conclusive)) {
43
+ dependencies.onVerificationStart?.();
44
+ const gated = await applyGatingWithFallback(reportFindings, {
45
+ minModels: gatingConfig.minModels,
46
+ verificationModel: gatingConfig.verificationModel,
47
+ verificationReasoningEffort: gatingConfig.verificationReasoningEffort,
48
+ verificationTimeoutMs: gatingConfig.verificationTimeoutMs,
49
+ verificationPassTimeoutMs: gatingConfig.verificationPassTimeoutMs,
50
+ ask: dependencies.ask,
51
+ monotonicNow: dependencies.monotonicNow,
52
+ onVerificationProgress: dependencies.onVerificationProgress,
53
+ diffFiles: diff.files,
54
+ ...(modelWeights ? { modelWeights } : {}),
55
+ });
56
+ finalFindings = gated.findings;
57
+ verificationStats = gated.ok ? gated.verification : undefined;
58
+ if (!gated.ok) {
59
+ (dependencies.onWarning ?? console.warn)(`Gating pass failed (${String(gated.failure)}); falling back to severity gating for this round.`);
60
+ }
61
+ else {
62
+ // Appendix findings never block convergence; mark them so the report
63
+ // JSON carries a gating reason on every finding.
64
+ gatedAppendix = droppedFindings.map((f) => ({ ...f, gating: { reason: 'none' } }));
65
+ }
66
+ }
67
+ const keepAppendix = config.output?.belowThresholdAppendix ?? true;
68
+ if (dependencies.onFindingContributions) {
69
+ dependencies.onFindingContributions(contributions);
70
+ }
71
+ const totalRawFindings = reviews.reduce((sum, r) => sum + r.findings.length, 0);
72
+ const body = {
73
+ reviews,
74
+ findings: finalFindings,
75
+ ...(keepAppendix && gatedAppendix.length > 0
76
+ ? { belowThresholdFindings: gatedAppendix }
77
+ : {}),
78
+ stats: {
79
+ totalReviews: reviews.length,
80
+ successfulReviews: reviews.filter((r) => r.status === 'success').length,
81
+ totalRawFindings,
82
+ totalDeduped: consensusFindings.length,
83
+ belowThreshold: droppedFindings.length,
84
+ durationMs: Date.now() - startTime,
85
+ ...(asyncLaunched > 0 ? { asyncLaunched } : {}),
86
+ ...(arrivedAsync.length > 0
87
+ ? { asyncMerged: mergeChunkReviews(arrivedAsync).length }
88
+ : {}),
89
+ // Per-call (pre-merge) so a straggler canceled on one chunk stays
90
+ // visible even when its other chunks succeeded.
91
+ ...(chunkReviews.some((r) => r.status === 'canceled')
92
+ ? {
93
+ canceledCalls: chunkReviews
94
+ .filter((r) => r.status === 'canceled')
95
+ .map((r) => ({ model: r.model, role: r.role, elapsedMs: r.durationMs })),
96
+ }
97
+ : {}),
98
+ ...(retained ? { blockingHealth: retained.blockingHealth }
99
+ : blockingHealthStats(input.run.roster, reviews, config.quorumFraction ?? DEFAULT_QUORUM_FRACTION)),
100
+ ...(verificationStats ? { verification: verificationStats } : {}),
101
+ // Applied weights for this run's models, so the report shows what
102
+ // scaled the votes (RCL-27).
103
+ ...(modelWeights
104
+ ? {
105
+ modelWeights: Object.fromEntries([...new Set(reviews.map((r) => r.model))].map((m) => [
106
+ m,
107
+ modelWeights.get(m) ?? 1,
108
+ ])),
109
+ }
110
+ : {}),
111
+ },
112
+ };
113
+ dependencies.onStage?.('assembling the terminal report');
114
+ // Self-describing run header (IO-12475 section 5.1), built once the body
115
+ // exists so the CI verdict is recorded uniformly — with or without --ci.
116
+ const run = buildRunHeader({
117
+ ...input.run,
118
+ id: runId,
119
+ config,
120
+ diff,
121
+ gating: gatingConfig,
122
+ thresholds: {
123
+ minConsensusScore: config.thresholds?.minConsensusScore ?? DEFAULT_THRESHOLDS.minConsensusScore,
124
+ minConfidence: config.thresholds?.minConfidence ?? DEFAULT_THRESHOLDS.minConfidence,
125
+ dedupeLineWindow: config.thresholds?.dedupeLineWindow ?? DEFAULT_THRESHOLDS.dedupeLineWindow,
126
+ jaccardThreshold: config.thresholds?.jaccardThreshold ?? DEFAULT_THRESHOLDS.jaccardThreshold,
127
+ },
128
+ finishedAt: new Date(),
129
+ ciExitCode: evaluateCiGate(body, input.reviewerHealth).exitCode,
130
+ });
131
+ return { run, ...body };
132
+ }
133
+ //# sourceMappingURL=assembly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assembly.js","sourceRoot":"","sources":["../../src/report/assembly.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import type { ModelReview, ReviewResult } from '../consensus/types.js';
2
+ import { type QuorumPolicy } from '../dispatch/quorum.js';
3
+ import type { RosterEntry, RosterLane } from './run-header.js';
4
+ /**
5
+ * The lane Harness assigns a report review row: the first roster entry with
6
+ * the same model and role, else async when flagged, else blocking. Evidence
7
+ * envelopes use this same function, so client health reads the rows exactly
8
+ * as the server's `Status.conclusive?/1` does.
9
+ */
10
+ export declare function reviewLane(review: Pick<ModelReview, 'model' | 'role' | 'async'>, roster: readonly RosterEntry[]): RosterLane;
11
+ export interface BlockingSeat {
12
+ model: string;
13
+ role: string;
14
+ /** `missing`: the roster names the seat but no blocking row covers it. */
15
+ status: ModelReview['status'] | 'missing';
16
+ }
17
+ /** Report-level blocking reviewer health; aggregate `stats` stay informational. */
18
+ export interface BlockingHealth {
19
+ policy: QuorumPolicy;
20
+ successfulSeats: BlockingSeat[];
21
+ unsuccessfulSeats: BlockingSeat[];
22
+ conclusive: boolean;
23
+ /** Successful rows outside the blocking lane: retained, never counted. */
24
+ excludedSuccesses: Record<Exclude<RosterLane, 'blocking'>, number>;
25
+ }
26
+ /** The count-only projection written to `stats.blockingHealth`. */
27
+ export interface BlockingHealthSummary {
28
+ version: 1;
29
+ fraction: number;
30
+ seats: number;
31
+ required: number;
32
+ successful: number;
33
+ conclusive: boolean;
34
+ excludedSuccesses: Record<Exclude<RosterLane, 'blocking'>, number>;
35
+ }
36
+ /**
37
+ * Blocking health over merged report rows. A blocking seat counts only when
38
+ * its merged review succeeded, which chunk merging grants only when every
39
+ * required chunk succeeded. Secondary, async and verification successes are
40
+ * counted separately and never reach the quorum. Duplicate model/role
41
+ * assignments are one seat, as in the merged report and on the server.
42
+ * A synchronous row outside a non-empty roster is refused rather than
43
+ * counted, so an added row can never create a seat.
44
+ * A stricter supported fraction raises the requirement; 2/3 is the floor.
45
+ */
46
+ export declare function deriveBlockingHealth(input: {
47
+ roster: readonly RosterEntry[];
48
+ reviews: readonly ModelReview[];
49
+ fraction?: number;
50
+ }): BlockingHealth;
51
+ export declare function summarizeBlockingHealth(health: BlockingHealth): BlockingHealthSummary;
52
+ /** One line naming the counted seats, the requirement and every seat that fell short. */
53
+ export declare function describeBlockingHealth(health: BlockingHealth): string;
54
+ export declare class ReportHealthError extends Error {
55
+ readonly code: 'report_health_inconclusive' | 'report_health_unverifiable';
56
+ readonly health?: BlockingHealth | undefined;
57
+ constructor(code: 'report_health_inconclusive' | 'report_health_unverifiable', message: string, health?: BlockingHealth | undefined);
58
+ }
59
+ /**
60
+ * Admission check for a serialized report. Health is derived again from the
61
+ * report's roster and rows; a recorded summary may only confirm it, and its
62
+ * fraction may only make the requirement stricter than the server's 2/3.
63
+ */
64
+ export declare function assertAdmissibleReportHealth(report: Pick<ReviewResult, 'reviews' | 'run' | 'stats'>): BlockingHealth;
@@ -0,0 +1,156 @@
1
+ import { isDeepStrictEqual } from 'node:util';
2
+ import { DEFAULT_QUORUM_FRACTION } from '../config/defaults.js';
3
+ import { hasSuccessfulQuorum, resolveQuorumPolicy } from '../dispatch/quorum.js';
4
+ /**
5
+ * The lane Harness assigns a report review row: the first roster entry with
6
+ * the same model and role, else async when flagged, else blocking. Evidence
7
+ * envelopes use this same function, so client health reads the rows exactly
8
+ * as the server's `Status.conclusive?/1` does.
9
+ */
10
+ export function reviewLane(review, roster) {
11
+ const seat = roster.find((entry) => entry.model === review.model && entry.role === review.role);
12
+ if (seat)
13
+ return seat.lane;
14
+ return review.async ? 'async' : 'blocking';
15
+ }
16
+ const seatKey = (model, role) => JSON.stringify([model, role]);
17
+ const STATUSES = new Set(['success', 'timeout', 'error', 'parse_failed', 'canceled']);
18
+ const LANES = new Set(['blocking', 'secondary', 'async', 'verification']);
19
+ const nonblank = (value) => typeof value === 'string' && value.trim().length > 0;
20
+ /**
21
+ * Blocking health over merged report rows. A blocking seat counts only when
22
+ * its merged review succeeded, which chunk merging grants only when every
23
+ * required chunk succeeded. Secondary, async and verification successes are
24
+ * counted separately and never reach the quorum. Duplicate model/role
25
+ * assignments are one seat, as in the merged report and on the server.
26
+ * A synchronous row outside a non-empty roster is refused rather than
27
+ * counted, so an added row can never create a seat.
28
+ * A stricter supported fraction raises the requirement; 2/3 is the floor.
29
+ */
30
+ export function deriveBlockingHealth(input) {
31
+ const seats = new Map();
32
+ if (!Array.isArray(input.roster) || !Array.isArray(input.reviews))
33
+ throw new Error('Invalid roster or reviewer rows');
34
+ for (const entry of input.roster) {
35
+ // An unknown lane must never silently drop a seat from the requirement.
36
+ if (!entry || !nonblank(entry.model) || !nonblank(entry.role) || !LANES.has(entry.lane)) {
37
+ throw new Error('Invalid roster entry identity or lane');
38
+ }
39
+ if (entry.lane === 'blocking')
40
+ seats.set(seatKey(entry.model, entry.role), { model: entry.model, role: entry.role });
41
+ }
42
+ const rows = new Map();
43
+ const excludedSuccesses = { secondary: 0, async: 0, verification: 0 };
44
+ for (const review of input.reviews) {
45
+ if (!review || !nonblank(review.model) || !nonblank(review.role) || !STATUSES.has(review.status)) {
46
+ throw new Error('Invalid reviewer row identity or status');
47
+ }
48
+ const lane = reviewLane(review, input.roster);
49
+ if (lane !== 'blocking') {
50
+ if (review.status === 'success')
51
+ excludedSuccesses[lane]++;
52
+ continue;
53
+ }
54
+ const key = seatKey(review.model, review.role);
55
+ // An async-only row on a blocking seat cannot supply that seat's coverage.
56
+ if (review.async === true) {
57
+ if (review.status === 'success')
58
+ excludedSuccesses.async++;
59
+ if (!seats.has(key))
60
+ continue;
61
+ if (rows.has(key))
62
+ throw new Error(`Duplicate blocking reviewer row for ${review.model}/${review.role}`);
63
+ rows.set(key, review);
64
+ continue;
65
+ }
66
+ if (rows.has(key))
67
+ throw new Error(`Duplicate blocking reviewer row for ${review.model}/${review.role}`);
68
+ rows.set(key, review);
69
+ if (!seats.has(key)) {
70
+ // Every row RCL writes is rostered; only a legacy report without a
71
+ // roster falls back to treating its synchronous rows as blocking.
72
+ if (input.roster.length > 0)
73
+ throw new Error(`Unrostered reviewer row for ${review.model}/${review.role}`);
74
+ seats.set(key, { model: review.model, role: review.role });
75
+ }
76
+ }
77
+ const policy = resolveQuorumPolicy(seats.size, input.fraction ?? DEFAULT_QUORUM_FRACTION);
78
+ const successfulSeats = [];
79
+ const unsuccessfulSeats = [];
80
+ for (const [key, seat] of seats) {
81
+ const review = rows.get(key);
82
+ const status = review === undefined || review.async === true ? 'missing' : review.status;
83
+ (status === 'success' ? successfulSeats : unsuccessfulSeats).push({ ...seat, status });
84
+ }
85
+ return {
86
+ policy,
87
+ successfulSeats,
88
+ unsuccessfulSeats,
89
+ conclusive: hasSuccessfulQuorum(policy, successfulSeats.length),
90
+ excludedSuccesses,
91
+ };
92
+ }
93
+ export function summarizeBlockingHealth(health) {
94
+ return {
95
+ version: 1,
96
+ fraction: health.policy.fraction,
97
+ seats: health.policy.seatCount,
98
+ required: health.policy.minimumSuccessful,
99
+ successful: health.successfulSeats.length,
100
+ conclusive: health.conclusive,
101
+ excludedSuccesses: { ...health.excludedSuccesses },
102
+ };
103
+ }
104
+ /** One line naming the counted seats, the requirement and every seat that fell short. */
105
+ export function describeBlockingHealth(health) {
106
+ const { policy } = health;
107
+ const excluded = Object.entries(health.excludedSuccesses)
108
+ .filter(([, count]) => count > 0).map(([lane, count]) => `${count} ${lane}`);
109
+ const short = health.unsuccessfulSeats.map((seat) => `${seat.model}/${seat.role} (${seat.status})`);
110
+ return `Blocking reviewer health ${health.conclusive ? 'conclusive' : 'inconclusive'}: ` +
111
+ `${health.successfulSeats.length}/${policy.seatCount} blocking seats complete; ${policy.minimumSuccessful} required` +
112
+ (excluded.length > 0 ? `; excluded from quorum: ${excluded.join(', ')} successful` : '') +
113
+ (short.length > 0 ? `; incomplete: ${short.join(', ')}` : '') + '.';
114
+ }
115
+ export class ReportHealthError extends Error {
116
+ code;
117
+ health;
118
+ constructor(code, message, health) {
119
+ super(message);
120
+ this.code = code;
121
+ this.health = health;
122
+ this.name = 'ReportHealthError';
123
+ }
124
+ }
125
+ /**
126
+ * Admission check for a serialized report. Health is derived again from the
127
+ * report's roster and rows; a recorded summary may only confirm it, and its
128
+ * fraction may only make the requirement stricter than the server's 2/3.
129
+ */
130
+ export function assertAdmissibleReportHealth(report) {
131
+ const recorded = report.stats?.blockingHealth;
132
+ let health;
133
+ try {
134
+ if (!Array.isArray(report.reviews))
135
+ throw new Error('report has no reviews array');
136
+ const fraction = recorded === undefined ? DEFAULT_QUORUM_FRACTION : recorded.fraction;
137
+ if (typeof fraction !== 'number')
138
+ throw new Error('recorded blocking health has no fraction');
139
+ // Only a report without a run header predates rosters; a header must name its seats.
140
+ if (report.run !== undefined && (!Array.isArray(report.run?.roster) || report.run.roster.length === 0)) {
141
+ throw new Error('run header has no roster');
142
+ }
143
+ health = deriveBlockingHealth({ roster: report.run?.roster ?? [], reviews: report.reviews, fraction });
144
+ if (recorded !== undefined && !isDeepStrictEqual(recorded, summarizeBlockingHealth(health))) {
145
+ throw new Error('recorded blocking health does not match the report rows');
146
+ }
147
+ }
148
+ catch (error) {
149
+ throw new ReportHealthError('report_health_unverifiable', `Reviewer health cannot be derived from this report (${error instanceof Error ? error.message : String(error)}); it is not admitted.`);
150
+ }
151
+ if (!health.conclusive) {
152
+ throw new ReportHealthError('report_health_inconclusive', `${describeBlockingHealth(health)} The report is not admitted; its findings are not triaged.`, health);
153
+ }
154
+ return health;
155
+ }
156
+ //# sourceMappingURL=blocking-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocking-health.js","sourceRoot":"","sources":["../../src/report/blocking-health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type AssemblyDependencies } from './assembly.js';
2
+ import { type CheckpointAssemblyInput, type CheckpointAssemblyResult } from './checkpoint-consensus.js';
3
+ import { type SealedVerificationProof } from './checkpoint-gating.js';
4
+ export * from './checkpoint-consensus.js';
5
+ export interface CheckpointAssemblyDependencies extends AssemblyDependencies {
6
+ /** Sealed current-run verifier evidence, independently checked against the regenerated plan. */
7
+ verificationProof?: SealedVerificationProof;
8
+ }
9
+ /** Assemble retained output by replaying sealed evidence; this path never launches a verifier. */
10
+ export declare function assembleCheckpointReview(input: CheckpointAssemblyInput, dependencies?: CheckpointAssemblyDependencies): Promise<CheckpointAssemblyResult>;
@@ -0,0 +1,17 @@
1
+ import { assembleCompletedReview } from './assembly.js';
2
+ import { prepareCheckpointAssembly, summarizeCheckpointBlockingHealth } from './checkpoint-consensus.js';
3
+ import { deriveCheckpointGating } from './checkpoint-gating.js';
4
+ export * from './checkpoint-consensus.js';
5
+ /** Assemble retained output by replaying sealed evidence; this path never launches a verifier. */
6
+ export async function assembleCheckpointReview(input, dependencies = {}) {
7
+ const gated = deriveCheckpointGating(input, dependencies.verificationProof);
8
+ const { completedInput } = prepareCheckpointAssembly(input);
9
+ const report = await assembleCompletedReview(completedInput, dependencies, {
10
+ consensus: gated.derived.consensus, findings: gated.findings, appendix: gated.appendix,
11
+ blockingHealth: summarizeCheckpointBlockingHealth(input, gated.derived.consensus.reviews),
12
+ ...(gated.verification === undefined ? {} : { verification: gated.verification }),
13
+ });
14
+ return { report, contributions: gated.derived.contributions,
15
+ observations: gated.derived.observations, projection: gated.derived.projection };
16
+ }
17
+ //# sourceMappingURL=checkpoint-assembly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-assembly.js","sourceRoot":"","sources":["../../src/report/checkpoint-assembly.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA6B,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,iCAAiC,EAA+D,MAAM,2BAA2B,CAAC;AACtK,OAAO,EAAE,sBAAsB,EAAgC,MAAM,wBAAwB,CAAC;AAC9F,cAAc,2BAA2B,CAAC;AAO1C,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAA8B,EAC9B,eAA+C,EAAE;IAEjD,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,EAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAC5E,MAAM,EAAE,cAAc,EAAE,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,cAAc,EAAE,YAAY,EAAE;QACzE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACtF,cAAc,EAAE,iCAAiC,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;QACzF,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;KAClF,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa;QACzD,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;AACrF,CAAC"}