agentic-qe 3.14.0 → 3.14.1

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 (413) hide show
  1. package/.claude/helpers/brain-checkpoint.cjs +2 -1
  2. package/.claude/helpers/validate-v3-config.sh +6 -5
  3. package/.claude/hooks/aqe-hook.cjs +14 -14
  4. package/.claude/skills/qe-browser/evals/qe-browser.yaml +30 -41
  5. package/.claude/skills/qe-browser/fixtures/serve-skills.js +37 -0
  6. package/.claude/skills/qe-browser/scripts/lib/vibium.js +1 -1
  7. package/.claude/skills/qe-browser/scripts/smoke-test.sh +56 -25
  8. package/.claude/skills/qe-browser/scripts/visual-diff.js +24 -15
  9. package/.claude/skills/skills-manifest.json +1 -1
  10. package/CHANGELOG.md +77 -0
  11. package/assets/skills/qe-browser/evals/qe-browser.yaml +30 -41
  12. package/assets/skills/qe-browser/fixtures/serve-skills.js +37 -0
  13. package/assets/skills/qe-browser/scripts/lib/vibium.js +1 -1
  14. package/assets/skills/qe-browser/scripts/smoke-test.sh +56 -25
  15. package/assets/skills/qe-browser/scripts/visual-diff.js +24 -15
  16. package/assets/skills/skills-manifest.json +1 -1
  17. package/dist/cli/bundle.js +7 -7
  18. package/dist/cli/chunks/adapter-I2N7PEKG.js +2 -0
  19. package/dist/cli/chunks/{agent-booster-wasm-JZO6VUW4.js → agent-booster-wasm-OY5Y2CUM.js} +2 -2
  20. package/dist/cli/chunks/{agent-handler-534KFGEJ.js → agent-handler-TUOH55LD.js} +2 -2
  21. package/dist/cli/chunks/{agent-memory-branch-B7KWLWY4.js → agent-memory-branch-XM3IYKT3.js} +2 -2
  22. package/dist/cli/chunks/aqe-learning-engine-U4ALUH6A.js +2 -0
  23. package/dist/cli/chunks/{arena-OW5MELJX.js → arena-DOCLIEBL.js} +4 -4
  24. package/dist/cli/chunks/{arena-7CCD3S3I.js → arena-UMFJZKG7.js} +2 -2
  25. package/dist/cli/chunks/{audit-BHVKN4E2.js → audit-KZLU5VLW.js} +3 -3
  26. package/dist/cli/chunks/base-RCYIBNHM.js +2 -0
  27. package/dist/cli/chunks/{better-sqlite3-P5FA6WFK.js → better-sqlite3-MIEZBNUI.js} +2 -2
  28. package/dist/cli/chunks/{brain-handler-WNW5LOV7.js → brain-handler-6PZN46B7.js} +3 -3
  29. package/dist/cli/chunks/{branch-enumerator-TVZ2ODKH.js → branch-enumerator-XCETHA4F.js} +2 -2
  30. package/dist/cli/chunks/{browser-TCEB2W2F.js → browser-UEXISDCJ.js} +2 -2
  31. package/dist/cli/chunks/browser-workflow-L6TDB5O5.js +2 -0
  32. package/dist/cli/chunks/{chunk-IQ3JFHZN.js → chunk-3AYNHOWS.js} +1 -1
  33. package/dist/cli/chunks/{chunk-3QT6S3A3.js → chunk-3BRR2FLH.js} +3 -3
  34. package/dist/cli/chunks/{chunk-43GPSYAL.js → chunk-3FFMUB3B.js} +2 -2
  35. package/dist/cli/chunks/{chunk-E4NU4BJA.js → chunk-3JMSXOU4.js} +2 -2
  36. package/dist/cli/chunks/{chunk-IQLRA4FV.js → chunk-3TMUCJNJ.js} +1 -1
  37. package/dist/cli/chunks/{chunk-AR6SATU3.js → chunk-3WSH4HD2.js} +2 -2
  38. package/dist/cli/chunks/{chunk-7OUMJCJT.js → chunk-3XRXUVUI.js} +1 -1
  39. package/dist/cli/chunks/{chunk-ZQSXG7FA.js → chunk-45S5553E.js} +2 -2
  40. package/dist/cli/chunks/{chunk-LKR7T3OZ.js → chunk-4MT62HKK.js} +1 -1
  41. package/dist/cli/chunks/{chunk-SUSMHSXT.js → chunk-4ZLFUO4I.js} +2 -2
  42. package/dist/cli/chunks/{chunk-QMMDN4WX.js → chunk-5F5V4QYU.js} +3 -3
  43. package/dist/cli/chunks/{chunk-I3VHXA2W.js → chunk-5KP62DC3.js} +2 -2
  44. package/dist/cli/chunks/{chunk-OONCRNFA.js → chunk-5NSSJUWW.js} +2 -2
  45. package/dist/cli/chunks/{chunk-T3BZAFLP.js → chunk-5T6PAUZD.js} +1 -1
  46. package/dist/cli/chunks/{chunk-VOSISOFD.js → chunk-5TYGSQOL.js} +1 -1
  47. package/dist/cli/chunks/{chunk-L4C42WYI.js → chunk-5Y2QFSVZ.js} +2 -2
  48. package/dist/cli/chunks/{chunk-RKUYVVGJ.js → chunk-6B77GPWL.js} +2 -2
  49. package/dist/cli/chunks/{chunk-LZHTCUCO.js → chunk-6DDMHZWH.js} +2 -2
  50. package/dist/cli/chunks/{chunk-SROZXIMT.js → chunk-6HMNN2Y2.js} +54 -54
  51. package/dist/cli/chunks/{chunk-7RAB2BZY.js → chunk-6YIMLUH6.js} +2 -2
  52. package/dist/cli/chunks/{chunk-NKWO2X3T.js → chunk-6Z6Y3YBX.js} +1 -1
  53. package/dist/cli/chunks/{chunk-4MK2G6TK.js → chunk-75SC3GEX.js} +2 -2
  54. package/dist/cli/chunks/{chunk-ZBOWR4XT.js → chunk-7AF55H2D.js} +2 -2
  55. package/dist/cli/chunks/{chunk-WKNWRDA5.js → chunk-7AYTM426.js} +1 -1
  56. package/dist/cli/chunks/{chunk-JAK5UUWH.js → chunk-7GF6IRSU.js} +2 -2
  57. package/dist/cli/chunks/{chunk-4ZVGSVHV.js → chunk-7XL2D56F.js} +4 -4
  58. package/dist/cli/chunks/{chunk-2NO4H35K.js → chunk-A6RB34Y6.js} +1 -1
  59. package/dist/cli/chunks/{chunk-ZI3UO7QR.js → chunk-AESYVAPH.js} +2 -2
  60. package/dist/cli/chunks/{chunk-GKNDP5VK.js → chunk-AZUC7E5S.js} +2 -2
  61. package/dist/cli/chunks/{chunk-B3H4K7CY.js → chunk-B6Y6AF4M.js} +2 -2
  62. package/dist/cli/chunks/{chunk-ECTPFCON.js → chunk-C3XNFIOM.js} +2 -2
  63. package/dist/cli/chunks/{chunk-QZPFUFZG.js → chunk-CBWF42ET.js} +2 -2
  64. package/dist/cli/chunks/{chunk-JMKMDSXG.js → chunk-CCZZZBAO.js} +2 -2
  65. package/dist/cli/chunks/{chunk-6IZQSLYZ.js → chunk-CGDW47WP.js} +2 -2
  66. package/dist/cli/chunks/chunk-CGZ7LTUK.js +2 -0
  67. package/dist/cli/chunks/{chunk-FRL3X2QA.js → chunk-D6RCRTTR.js} +2 -2
  68. package/dist/cli/chunks/{chunk-DOWCOZDO.js → chunk-DFXQLHQM.js} +2 -2
  69. package/dist/cli/chunks/{chunk-QQCENKCX.js → chunk-DKSLJZVA.js} +1 -1
  70. package/dist/cli/chunks/{chunk-YKWMKRYB.js → chunk-DKUKGBJE.js} +1 -1
  71. package/dist/cli/chunks/{chunk-ENGKLFLY.js → chunk-DKXSJDII.js} +2 -2
  72. package/dist/cli/chunks/chunk-EEJP3WTQ.js +4 -0
  73. package/dist/cli/chunks/{chunk-PEW6FZ47.js → chunk-EHW62JL2.js} +1 -1
  74. package/dist/cli/chunks/{chunk-5LEAGKX5.js → chunk-EPBWFTHH.js} +2 -2
  75. package/dist/cli/chunks/{chunk-ZAAYOENS.js → chunk-ERTGGFXZ.js} +2 -2
  76. package/dist/cli/chunks/{chunk-TKYEP7OR.js → chunk-F7TRO2OM.js} +1 -1
  77. package/dist/cli/chunks/{chunk-HJIAVR6P.js → chunk-FFRKTZYP.js} +2 -2
  78. package/dist/cli/chunks/{chunk-S5YVLPXU.js → chunk-FH7SCX2I.js} +2 -2
  79. package/dist/cli/chunks/{chunk-N2YAUDAV.js → chunk-FHBGALBG.js} +2 -2
  80. package/dist/cli/chunks/{chunk-WWWX76QB.js → chunk-FOAFRC2W.js} +2 -2
  81. package/dist/cli/chunks/{chunk-KTSCZ7AW.js → chunk-FPBQ7BXU.js} +2 -2
  82. package/dist/cli/chunks/{chunk-JTWJR2KY.js → chunk-FRRRDCXY.js} +2 -2
  83. package/dist/cli/chunks/{chunk-2HYVOX6N.js → chunk-FZ47ZCRL.js} +1 -1
  84. package/dist/cli/chunks/{chunk-H3YDDKBW.js → chunk-GH3NJOTC.js} +3 -3
  85. package/dist/cli/chunks/{chunk-5VDVYTO5.js → chunk-GO66DCIZ.js} +2 -2
  86. package/dist/cli/chunks/{chunk-H6NFDOMK.js → chunk-GRVR3Y6I.js} +1 -1
  87. package/dist/cli/chunks/chunk-GYTWUOKU.js +65 -0
  88. package/dist/cli/chunks/{chunk-O2MZZL54.js → chunk-H2DX36SC.js} +2 -2
  89. package/dist/cli/chunks/{chunk-NOPVFBQM.js → chunk-H5LSXVWY.js} +2 -2
  90. package/dist/cli/chunks/{chunk-DDPJUAXQ.js → chunk-HBAQVJDP.js} +2 -2
  91. package/dist/cli/chunks/{chunk-R6WJF4D5.js → chunk-HCCILQGN.js} +2 -2
  92. package/dist/cli/chunks/{chunk-CIZ6LSNV.js → chunk-HJD52N32.js} +2 -2
  93. package/dist/cli/chunks/{chunk-4FEJEVG7.js → chunk-HKU5PPS7.js} +1 -1
  94. package/dist/cli/chunks/{chunk-M3HUZD2I.js → chunk-HPQU6XZH.js} +1 -1
  95. package/dist/cli/chunks/{chunk-IL6QRXRP.js → chunk-HRUQWABO.js} +10 -10
  96. package/dist/cli/chunks/{chunk-BZ4QVFP2.js → chunk-IGRTQ6VT.js} +2 -2
  97. package/dist/cli/chunks/{chunk-HQ7243G3.js → chunk-IIBXGHZT.js} +2 -2
  98. package/dist/cli/chunks/{chunk-LCSVROU7.js → chunk-IYB3GRXF.js} +10 -10
  99. package/dist/cli/chunks/{chunk-CIUOC5F3.js → chunk-IYIMLLUV.js} +1 -1
  100. package/dist/cli/chunks/{chunk-6AOZU3UN.js → chunk-J2VF7ZO7.js} +2 -2
  101. package/dist/cli/chunks/{chunk-2D7UBX5S.js → chunk-J33LKXVH.js} +1 -1
  102. package/dist/cli/chunks/{chunk-JY4VZ6BN.js → chunk-J7VAD4RG.js} +2 -2
  103. package/dist/cli/chunks/{chunk-A2WZEMWT.js → chunk-JJ4GUO4K.js} +1 -1
  104. package/dist/cli/chunks/{chunk-RGVD6ZUX.js → chunk-JMULRLD4.js} +1 -1
  105. package/dist/cli/chunks/{chunk-JRKEBESE.js → chunk-JNSTKE3K.js} +2 -2
  106. package/dist/cli/chunks/{chunk-3RYTAYR6.js → chunk-JZUWPDVS.js} +1 -1
  107. package/dist/cli/chunks/{chunk-5XGVSQS2.js → chunk-KHUO4NCW.js} +2 -2
  108. package/dist/cli/chunks/{chunk-AFGT26NR.js → chunk-KXMW7XTJ.js} +2 -2
  109. package/dist/cli/chunks/{chunk-6DPAMYLU.js → chunk-KXTN3FR4.js} +2 -2
  110. package/dist/cli/chunks/{chunk-VXU53F7Z.js → chunk-L4WATX6B.js} +2 -2
  111. package/dist/cli/chunks/{chunk-SSV6KSFT.js → chunk-L66BWYQH.js} +1 -1
  112. package/dist/cli/chunks/{chunk-FOHYBR3O.js → chunk-LJ63HPPN.js} +1 -1
  113. package/dist/cli/chunks/{chunk-6IJMD2ZL.js → chunk-LMPK63PO.js} +3 -3
  114. package/dist/cli/chunks/{chunk-IL4AEB3J.js → chunk-LQDFWLKK.js} +2 -2
  115. package/dist/cli/chunks/{chunk-IE5LC7MB.js → chunk-LSXQPMPI.js} +2 -2
  116. package/dist/cli/chunks/{chunk-UI6WSPEK.js → chunk-MDLLEUFN.js} +3 -3
  117. package/dist/cli/chunks/{chunk-A7SKM6JL.js → chunk-MFAN5W27.js} +1 -1
  118. package/dist/cli/chunks/{chunk-J3XSHJGK.js → chunk-MZ2PJUN6.js} +2 -2
  119. package/dist/cli/chunks/{chunk-VPVZHJSU.js → chunk-N22LMACN.js} +2 -2
  120. package/dist/cli/chunks/{chunk-XITTURP2.js → chunk-NAJCQJSK.js} +2 -2
  121. package/dist/cli/chunks/{chunk-VYENTZ45.js → chunk-ND6JBUVH.js} +2 -2
  122. package/dist/cli/chunks/{chunk-AVLA5PBJ.js → chunk-NEEZ6M4W.js} +2 -2
  123. package/dist/cli/chunks/{chunk-HNKPLVYS.js → chunk-NNJ63W77.js} +1 -1
  124. package/dist/cli/chunks/{chunk-NDPQ2WPU.js → chunk-O7KF3GBV.js} +1 -1
  125. package/dist/cli/chunks/{chunk-YEAC3DC6.js → chunk-OBKMLOHU.js} +2 -2
  126. package/dist/cli/chunks/{chunk-NYARYONH.js → chunk-OBLHI4HA.js} +1 -1
  127. package/dist/cli/chunks/{chunk-5MZF4N4Q.js → chunk-ODNLKYOM.js} +1 -1
  128. package/dist/cli/chunks/{chunk-6W42XWLL.js → chunk-PMREFRPP.js} +2 -2
  129. package/dist/cli/chunks/{chunk-7BOPFN3Y.js → chunk-PMUF7WU6.js} +2 -2
  130. package/dist/cli/chunks/{chunk-52DFCV57.js → chunk-PS5NIMWJ.js} +2 -2
  131. package/dist/cli/chunks/{chunk-ZBKGX72B.js → chunk-PS6Y662P.js} +3 -3
  132. package/dist/cli/chunks/{chunk-YW4RNZWT.js → chunk-PYAH4K2U.js} +2 -2
  133. package/dist/cli/chunks/{chunk-E722WNWC.js → chunk-PZZX57ZA.js} +2 -2
  134. package/dist/cli/chunks/{chunk-YKZV7O65.js → chunk-QAE4BOIV.js} +2 -2
  135. package/dist/cli/chunks/{chunk-FF43SRP6.js → chunk-QIY43XQJ.js} +1 -1
  136. package/dist/cli/chunks/{chunk-HLNQDRHA.js → chunk-QM6EJHP5.js} +1 -1
  137. package/dist/cli/chunks/{chunk-7RVAHJQZ.js → chunk-QMTBWHGR.js} +3 -3
  138. package/dist/cli/chunks/{chunk-3EM2MK3Z.js → chunk-RCHDSUVU.js} +2 -2
  139. package/dist/cli/chunks/{chunk-K6CGQR5R.js → chunk-RUEHSOE6.js} +1 -1
  140. package/dist/cli/chunks/{chunk-ZNSMVQCG.js → chunk-RVCMZUSJ.js} +2 -2
  141. package/dist/cli/chunks/{chunk-OIYUSWHX.js → chunk-RXHI6CKK.js} +1 -1
  142. package/dist/cli/chunks/{chunk-KDIZQHG5.js → chunk-RXPHQ4ZE.js} +2 -2
  143. package/dist/cli/chunks/{chunk-XXFKN7LB.js → chunk-RYHCYTFE.js} +1 -1
  144. package/dist/cli/chunks/{chunk-WTHAVFIC.js → chunk-S4WIAKPL.js} +1 -1
  145. package/dist/cli/chunks/{chunk-GVEJP5T7.js → chunk-S53ZUAVI.js} +2 -2
  146. package/dist/cli/chunks/{chunk-UUJ5VQJM.js → chunk-SEKOMKNG.js} +1 -1
  147. package/dist/cli/chunks/{chunk-2O4DDPEA.js → chunk-SZRDEPUY.js} +3 -3
  148. package/dist/cli/chunks/{chunk-3GUO4ERR.js → chunk-T7XYQX5G.js} +2 -2
  149. package/dist/cli/chunks/{chunk-U4GZWPKM.js → chunk-TF33GKWA.js} +2 -2
  150. package/dist/cli/chunks/{chunk-6AYO3IR2.js → chunk-TGFJUL6M.js} +2 -2
  151. package/dist/cli/chunks/{chunk-ZCVJCCQQ.js → chunk-TLD727EF.js} +2 -2
  152. package/dist/cli/chunks/{chunk-QSPRQPEL.js → chunk-TQ2JZVZ3.js} +2 -2
  153. package/dist/cli/chunks/{chunk-BQCTO7UB.js → chunk-TT7DF2GX.js} +2 -2
  154. package/dist/cli/chunks/{chunk-DJITEQYS.js → chunk-UCJEAK7D.js} +2 -2
  155. package/dist/cli/chunks/{chunk-4XTHRAUV.js → chunk-UN7EHLRV.js} +1 -1
  156. package/dist/cli/chunks/{chunk-Q73RRTLE.js → chunk-UUE5CBZQ.js} +2 -2
  157. package/dist/cli/chunks/{chunk-JGROLJ33.js → chunk-UWRMPRY5.js} +1 -1
  158. package/dist/cli/chunks/{chunk-EJ6IP7DE.js → chunk-VEWYUEVY.js} +2 -2
  159. package/dist/cli/chunks/{chunk-VESOYP6A.js → chunk-VUXHJPUS.js} +2 -2
  160. package/dist/cli/chunks/{chunk-HQHLHSJO.js → chunk-VVP2ROXD.js} +2 -2
  161. package/dist/cli/chunks/{chunk-H76TV4UU.js → chunk-WFJKLM6Z.js} +3 -3
  162. package/dist/cli/chunks/{chunk-TGOGCA74.js → chunk-X5G3UDWP.js} +2 -2
  163. package/dist/cli/chunks/{chunk-QKQZ4IJF.js → chunk-Y63V33M6.js} +5 -5
  164. package/dist/cli/chunks/{chunk-3JIJBR4V.js → chunk-YXN47QOI.js} +2 -2
  165. package/dist/cli/chunks/{chunk-MO7EITJK.js → chunk-Z5YU2TDS.js} +2 -2
  166. package/dist/cli/chunks/{chunk-TQJE7DNL.js → chunk-ZAHCVRR7.js} +2 -2
  167. package/dist/cli/chunks/{chunk-VRRG66XB.js → chunk-ZC3HC6FO.js} +1 -1
  168. package/dist/cli/chunks/{ci-B432UH6N.js → ci-Q2VX75PS.js} +2 -2
  169. package/dist/cli/chunks/{ci-output-GTHH7WYG.js → ci-output-MD5GTVR2.js} +2 -2
  170. package/dist/cli/chunks/{circuit-breaker-VW75DLME.js → circuit-breaker-JMRLG2XI.js} +2 -2
  171. package/dist/cli/chunks/{claude-flow-setup-RE3IVT7U.js → claude-flow-setup-IMXYALBU.js} +2 -2
  172. package/dist/cli/chunks/client-L4PIXCGV.js +2 -0
  173. package/dist/cli/chunks/{cline-installer-NUBZZ55N.js → cline-installer-HWFASEGE.js} +2 -2
  174. package/dist/cli/chunks/{code-K6JCWKNW.js → code-3V37TCAD.js} +2 -2
  175. package/dist/cli/chunks/{code-index-extractor-I4ILB5JN.js → code-index-extractor-5V54WGFL.js} +2 -2
  176. package/dist/cli/chunks/codex-installer-UCA5AVE6.js +14 -0
  177. package/dist/cli/chunks/{completions-V3KJVJF4.js → completions-2DMRCQU6.js} +2 -2
  178. package/dist/cli/chunks/{complexity-analyzer-HRG7OOY3.js → complexity-analyzer-MMQRXBTD.js} +2 -2
  179. package/dist/cli/chunks/{continuedev-installer-CNTDONWG.js → continuedev-installer-FAARXP3S.js} +2 -2
  180. package/dist/cli/chunks/{copilot-installer-XPWWIWYA.js → copilot-installer-AKQALMB5.js} +2 -2
  181. package/dist/cli/chunks/core-handlers-KROSXP4V.js +2 -0
  182. package/dist/cli/chunks/{cost-tracker-MFNLQ56K.js → cost-tracker-AXWHDND5.js} +2 -2
  183. package/dist/cli/chunks/{coverage-KOIK654V.js → coverage-ZLSKKCG5.js} +3 -3
  184. package/dist/cli/chunks/cross-domain-router-WMTYBOON.js +2 -0
  185. package/dist/cli/chunks/{cursor-installer-S5MKLRQQ.js → cursor-installer-UALCQKVD.js} +2 -2
  186. package/dist/cli/chunks/{daemon-DUS6JYW6.js → daemon-4LNOPJGN.js} +3 -3
  187. package/dist/cli/chunks/{daemon-Z7VPGWHY.js → daemon-K3DFGCXC.js} +4 -4
  188. package/dist/cli/chunks/{dag-attention-scheduler-7CQ3ARNI.js → dag-attention-scheduler-LCQ7MYKC.js} +2 -2
  189. package/dist/cli/chunks/{detect-WORBCAYF.js → detect-P7PEN3MZ.js} +2 -2
  190. package/dist/cli/chunks/{dist-node-KRNI6OYW.js → dist-node-I72BJC2D.js} +2 -2
  191. package/dist/cli/chunks/{domain-handler-KRUR2VQG.js → domain-handler-LROF6KWN.js} +2 -2
  192. package/dist/cli/chunks/{domain-transfer-VEOVLV54.js → domain-transfer-M2ZSSTPV.js} +2 -2
  193. package/dist/cli/chunks/dream-AV63YQ2Y.js +2 -0
  194. package/dist/cli/chunks/{embed-and-insert-pattern-QU3NQVA5.js → embed-and-insert-pattern-MTBPUGO4.js} +2 -2
  195. package/dist/cli/chunks/{eval-AYQ7BSUP.js → eval-O24ALB3W.js} +2 -2
  196. package/dist/cli/chunks/{experience-capture-middleware-AWQBL6LT.js → experience-capture-middleware-7JXEOGRE.js} +3 -3
  197. package/dist/cli/chunks/{fast-paths-V5EL4BYJ.js → fast-paths-4CFYJV4U.js} +2 -2
  198. package/dist/cli/chunks/{feature-flags-P34BPRWU.js → feature-flags-CHPUA7IM.js} +2 -2
  199. package/dist/cli/chunks/{feature-flags-BXX7BP22.js → feature-flags-E6PIM6ZB.js} +2 -2
  200. package/dist/cli/chunks/{file-discovery-MS6BKQ2U.js → file-discovery-2ANIAUCP.js} +2 -2
  201. package/dist/cli/chunks/{fleet-7WVVPA4W.js → fleet-2MQ3OGCP.js} +3 -3
  202. package/dist/cli/chunks/{gnn-wrapper-7WQ3LEPG.js → gnn-wrapper-P7JW3622.js} +2 -2
  203. package/dist/cli/chunks/{heartbeat-handler-P7QD3BZH.js → heartbeat-handler-WWWZSA7V.js} +4 -4
  204. package/dist/cli/chunks/heartbeat-scheduler-5IZUGMC2.js +2 -0
  205. package/dist/cli/chunks/hnsw-adapter-NV2NNBJL.js +2 -0
  206. package/dist/cli/chunks/hnsw-index-GRJ3KA2O.js +2 -0
  207. package/dist/cli/chunks/{hnsw-legacy-bridge-Y3GAR3UP.js → hnsw-legacy-bridge-W634ZOTV.js} +2 -2
  208. package/dist/cli/chunks/{hnswlib-node-5QUXZQWQ.js → hnswlib-node-SLZDLMKM.js} +2 -2
  209. package/dist/cli/chunks/{hooks-2D64KPRY.js → hooks-3BFAZGG7.js} +10 -10
  210. package/dist/cli/chunks/{hypergraph-engine-5INXEZDP.js → hypergraph-engine-XJSGXP2J.js} +2 -2
  211. package/dist/cli/chunks/{hypergraph-handler-YJJJ3ESZ.js → hypergraph-handler-RVUWZMOX.js} +3 -3
  212. package/dist/cli/chunks/impact-analyzer-YM4QUWVH.js +2 -0
  213. package/dist/cli/chunks/{init-handler-QSFYJN5Q.js → init-handler-FYOZNNNO.js} +9 -8
  214. package/dist/cli/chunks/init-wizard-YESXGIK6.js +2 -0
  215. package/dist/cli/chunks/kernel-VH5SKESU.js +2 -0
  216. package/dist/cli/chunks/{kilocode-installer-3N3QGTJU.js → kilocode-installer-MAAKFVSB.js} +2 -2
  217. package/dist/cli/chunks/{kiro-installer-GIWVTFZQ.js → kiro-installer-GX3TLZC5.js} +2 -2
  218. package/dist/cli/chunks/knowledge-graph-F3NL4WJV.js +2 -0
  219. package/dist/cli/chunks/{learning-SGO2DQ5Q.js → learning-T4QZ6C26.js} +3 -3
  220. package/dist/cli/chunks/{llm-router-HBBULO65.js → llm-router-N2M4WXOC.js} +4 -4
  221. package/dist/cli/chunks/llm-router-service-HQYCJMPK.js +2 -0
  222. package/dist/cli/chunks/{load-B5OFYB4H.js → load-6RU3G4P2.js} +2 -2
  223. package/dist/cli/chunks/load-test-GWRGKWMN.js +2 -0
  224. package/dist/cli/chunks/{mcp-FG3LNQR4.js → mcp-EFBO7BAU.js} +2 -2
  225. package/dist/cli/chunks/{memory-SPS7ZWLC.js → memory-AXU2M3DN.js} +5 -5
  226. package/dist/cli/chunks/memory-backend-7A2PFKPV.js +2 -0
  227. package/dist/cli/chunks/{memory-handlers-P7FTPWP3.js → memory-handlers-65CXN76C.js} +2 -2
  228. package/dist/cli/chunks/{multi-model-executor-PUB7E6KH.js → multi-model-executor-W7AFGVNH.js} +2 -2
  229. package/dist/cli/chunks/{opencode-installer-TGCSGVG2.js → opencode-installer-KJE2RLCH.js} +2 -2
  230. package/dist/cli/chunks/{orchestrator-S5FTJFGB.js → orchestrator-CL6MLGVU.js} +22 -21
  231. package/dist/cli/chunks/pattern-null-store-K2WPRYCP.js +2 -0
  232. package/dist/cli/chunks/{pattern-usage-recorder-LCXXGRAB.js → pattern-usage-recorder-7SNSJ7K2.js} +2 -2
  233. package/dist/cli/chunks/{pipeline-ENOSRHKW.js → pipeline-3UU6ON3F.js} +2 -2
  234. package/dist/cli/chunks/platform-SNMPIDIT.js +2 -0
  235. package/dist/cli/chunks/{plugin-JZ5ODJSU.js → plugin-65IIUUCU.js} +2 -2
  236. package/dist/cli/chunks/{prime-radiant-advanced-wasm-DPJUPNCG.js → prime-radiant-advanced-wasm-WWWJRLRP.js} +2 -2
  237. package/dist/cli/chunks/protocol-executor-TJDLEHND.js +2 -0
  238. package/dist/cli/chunks/{protocol-handler-IP4NLVY3.js → protocol-handler-SEBHCLLJ.js} +2 -2
  239. package/dist/cli/chunks/{prove-P6FM4RU7.js → prove-N4X7CCJ4.js} +2 -2
  240. package/dist/cli/chunks/qe-reasoning-bank-CGRMFPDM.js +2 -0
  241. package/dist/cli/chunks/{quality-UHP4XO26.js → quality-LBCJWXMU.js} +2 -2
  242. package/dist/cli/chunks/quality-gate-KZIQI7QT.js +7 -0
  243. package/dist/cli/chunks/queen-coordinator-FKP6QZAQ.js +2 -0
  244. package/dist/cli/chunks/{real-embeddings-6SO5MFRQ.js → real-embeddings-XCZFHFME.js} +2 -2
  245. package/dist/cli/chunks/{roocode-installer-WTWUOFCH.js → roocode-installer-P3O6B7PT.js} +2 -2
  246. package/dist/cli/chunks/router-KZ5BISAM.js +2 -0
  247. package/dist/cli/chunks/routing-feedback-O4Y5TTR6.js +2 -0
  248. package/dist/cli/chunks/{routing-handler-IK7HYERQ.js → routing-handler-OXZ4DOV4.js} +2 -2
  249. package/dist/cli/chunks/{ruvector-commands-THLB4NIM.js → ruvector-commands-PSY5IDSL.js} +2 -2
  250. package/dist/cli/chunks/rvf-dual-writer-NG3UF3D5.js +2 -0
  251. package/dist/cli/chunks/rvf-migration-adapter-PUHVTKQY.js +2 -0
  252. package/dist/cli/chunks/{rvf-migration-coordinator-BUKCSHBD.js → rvf-migration-coordinator-4SUT7GTJ.js} +2 -2
  253. package/dist/cli/chunks/rvf-native-adapter-ODXFKZ6G.js +2 -0
  254. package/dist/cli/chunks/{rvf-store-integrity-ECTADZIN.js → rvf-store-integrity-TCKC22FH.js} +2 -2
  255. package/dist/cli/chunks/safe-db-BUQDNH2R.js +2 -0
  256. package/dist/cli/chunks/schedule-ZXNDZNNB.js +2 -0
  257. package/dist/cli/chunks/scheduler-YUQQWWW3.js +2 -0
  258. package/dist/cli/chunks/{security-HN4UXFXX.js → security-RQGUQGSI.js} +3 -3
  259. package/dist/cli/chunks/{shared-rvf-adapter-XJCPX5SN.js → shared-rvf-adapter-ZJFN52C2.js} +2 -2
  260. package/dist/cli/chunks/{shared-rvf-dual-writer-23X5PNY5.js → shared-rvf-dual-writer-V2R37HWV.js} +2 -2
  261. package/dist/cli/chunks/sqlite-persistence-HVSX46C7.js +2 -0
  262. package/dist/cli/chunks/{status-handler-ZXANTHKT.js → status-handler-XEKWNVDR.js} +2 -2
  263. package/dist/cli/chunks/{structural-health-LR6WI3AH.js → structural-health-QMIW6WUN.js} +2 -2
  264. package/dist/cli/chunks/{sync-4OEI3BC2.js → sync-GDYJ2ULT.js} +2 -2
  265. package/dist/cli/chunks/{sync-I5IUJF33.js → sync-H5SXWXPP.js} +2 -2
  266. package/dist/cli/chunks/{task-handler-R3ATJKU5.js → task-handler-EPLKCQHY.js} +2 -2
  267. package/dist/cli/chunks/{task-handlers-4X357AEW.js → task-handlers-22NTLWTC.js} +3 -3
  268. package/dist/cli/chunks/{test-PR2B5H2F.js → test-WHJFRZ3F.js} +4 -4
  269. package/dist/cli/chunks/{test-scheduling-ZNOSQVLD.js → test-scheduling-KZVFZOQN.js} +3 -3
  270. package/dist/cli/chunks/{token-bootstrap-LYXOI72S.js → token-bootstrap-BW5WA6PY.js} +2 -2
  271. package/dist/cli/chunks/{token-usage-R6EQZBX2.js → token-usage-4A4O57R6.js} +2 -2
  272. package/dist/cli/chunks/{transformers-COQWK27J.js → transformers-FYTBRV46.js} +2 -2
  273. package/dist/cli/chunks/{tree-sitter-wasm-parser-LLIW2X3M.js → tree-sitter-wasm-parser-TZIJPLF3.js} +2 -2
  274. package/dist/cli/chunks/{types-MEYTZITK.js → types-B2L6LKFA.js} +2 -2
  275. package/dist/cli/chunks/unified-memory-AHN4RVBP.js +2 -0
  276. package/dist/cli/chunks/unified-memory-hnsw-XB7JPF74.js +2 -0
  277. package/dist/cli/chunks/unified-persistence-53KWNFQJ.js +2 -0
  278. package/dist/cli/chunks/{upgrade-DVIJ456A.js → upgrade-O6U7EA7V.js} +2 -2
  279. package/dist/cli/chunks/{validate-UYTSMJ5X.js → validate-FHNZ5XL3.js} +2 -2
  280. package/dist/cli/chunks/{validate-swarm-P32WCJR6.js → validate-swarm-YOLLUEHE.js} +2 -2
  281. package/dist/cli/chunks/{vibium-JGVOLM6X.js → vibium-UXRPEIXB.js} +2 -2
  282. package/dist/cli/chunks/visual-security-CRPYS7L7.js +2 -0
  283. package/dist/cli/chunks/{web-tree-sitter-5ZGNCTPN.js → web-tree-sitter-JJ5UIYFD.js} +2 -2
  284. package/dist/cli/chunks/{windsurf-installer-IILSSQAE.js → windsurf-installer-I4QMQPIL.js} +2 -2
  285. package/dist/cli/chunks/witness-chain-5WCR2CAS.js +2 -0
  286. package/dist/cli/chunks/{witness-chain-JZMXCG3B.js → witness-chain-BIJ7WDGS.js} +2 -2
  287. package/dist/cli/chunks/{witness-key-manager-UUTLNUIH.js → witness-key-manager-3SMMLJLP.js} +2 -2
  288. package/dist/cli/chunks/{workflow-NS7HXVHZ.js → workflow-33PUXXJV.js} +4 -4
  289. package/dist/cli/chunks/workflow-orchestrator-RZWCLTT5.js +2 -0
  290. package/dist/cli/chunks/{wrappers-XKEDSV5W.js → wrappers-ASAU36VK.js} +2 -2
  291. package/dist/cli/commands/platform.d.ts +1 -0
  292. package/dist/cli/commands/platform.js +28 -6
  293. package/dist/cli/commands/quality-gate.js +25 -3
  294. package/dist/cli/handlers/init-handler.d.ts +5 -0
  295. package/dist/cli/handlers/init-handler.js +6 -0
  296. package/dist/cli/index.js +4 -1
  297. package/dist/contracts/verdicts.d.ts +625 -0
  298. package/dist/contracts/verdicts.js +202 -14
  299. package/dist/coordination/handlers/coverage-handlers.js +8 -1
  300. package/dist/domains/chaos-resilience/diagnosis/corpus.d.ts +5 -0
  301. package/dist/domains/chaos-resilience/diagnosis/corpus.js +141 -0
  302. package/dist/domains/chaos-resilience/diagnosis/detectors.d.ts +11 -0
  303. package/dist/domains/chaos-resilience/diagnosis/detectors.js +109 -0
  304. package/dist/domains/chaos-resilience/diagnosis/index.d.ts +5 -0
  305. package/dist/domains/chaos-resilience/diagnosis/index.js +5 -0
  306. package/dist/domains/chaos-resilience/diagnosis/scorer.d.ts +8 -0
  307. package/dist/domains/chaos-resilience/diagnosis/scorer.js +128 -0
  308. package/dist/domains/chaos-resilience/diagnosis/types.d.ts +171 -0
  309. package/dist/domains/chaos-resilience/diagnosis/types.js +3 -0
  310. package/dist/domains/chaos-resilience/index.d.ts +1 -0
  311. package/dist/domains/chaos-resilience/index.js +1 -0
  312. package/dist/domains/index.d.ts +1 -0
  313. package/dist/domains/index.js +1 -0
  314. package/dist/early-exit/early-exit-controller.d.ts +4 -2
  315. package/dist/early-exit/early-exit-controller.js +95 -7
  316. package/dist/early-exit/index.d.ts +1 -1
  317. package/dist/early-exit/speculative-executor.js +3 -0
  318. package/dist/early-exit/types.d.ts +51 -0
  319. package/dist/early-exit/types.js +3 -0
  320. package/dist/index.d.ts +4 -2
  321. package/dist/index.js +2 -1
  322. package/dist/init/browser-engine-installer.d.ts +11 -0
  323. package/dist/init/browser-engine-installer.js +35 -5
  324. package/dist/init/codex-installer.d.ts +11 -1
  325. package/dist/init/codex-installer.js +90 -24
  326. package/dist/init/init-wizard-hooks.js +11 -11
  327. package/dist/init/orchestrator.js +2 -0
  328. package/dist/init/phases/07-hooks.d.ts +3 -3
  329. package/dist/init/phases/07-hooks.js +19 -18
  330. package/dist/init/phases/09-assets.d.ts +4 -0
  331. package/dist/init/phases/09-assets.js +13 -10
  332. package/dist/init/phases/phase-interface.d.ts +2 -0
  333. package/dist/init/types.d.ts +4 -0
  334. package/dist/learning/index.d.ts +3 -0
  335. package/dist/learning/index.js +2 -0
  336. package/dist/learning/pattern-mutation-error.d.ts +9 -0
  337. package/dist/learning/pattern-mutation-error.js +14 -0
  338. package/dist/learning/pattern-store.js +24 -2
  339. package/dist/learning/qe-reasoning-bank.js +24 -5
  340. package/dist/learning/rvf-pattern-store.js +23 -5
  341. package/dist/learning/structural-retrieval/corpus.d.ts +5 -0
  342. package/dist/learning/structural-retrieval/corpus.js +97 -0
  343. package/dist/learning/structural-retrieval/evaluate.d.ts +7 -0
  344. package/dist/learning/structural-retrieval/evaluate.js +124 -0
  345. package/dist/learning/structural-retrieval/index.d.ts +6 -0
  346. package/dist/learning/structural-retrieval/index.js +4 -0
  347. package/dist/learning/structural-retrieval/receipt.d.ts +14 -0
  348. package/dist/learning/structural-retrieval/receipt.js +36 -0
  349. package/dist/learning/structural-retrieval/types.d.ts +83 -0
  350. package/dist/learning/structural-retrieval/types.js +2 -0
  351. package/dist/mcp/bundle.js +423 -423
  352. package/dist/mcp/services/session-resume.d.ts +15 -19
  353. package/dist/mcp/services/session-resume.js +204 -194
  354. package/dist/mcp/tools/quality-assessment/gate.d.ts +8 -5
  355. package/dist/mcp/tools/quality-assessment/gate.js +9 -4
  356. package/dist/skills/qe-court/cli.js +0 -0
  357. package/dist/validation/quality-gate-runner.d.ts +27 -4
  358. package/dist/validation/quality-gate-runner.js +33 -4
  359. package/dist/validation/verification-reach.d.ts +90 -0
  360. package/dist/validation/verification-reach.js +187 -0
  361. package/dist/verification/adversarial-verify/index.d.ts +1 -1
  362. package/dist/verification/adversarial-verify/measurement-receipt.d.ts +13 -0
  363. package/dist/verification/adversarial-verify/measurement-receipt.js +136 -0
  364. package/dist/verification/adversarial-verify/synthesize.js +7 -10
  365. package/dist/verification/adversarial-verify/types.d.ts +35 -0
  366. package/dist/verification/adversarial-verify/verify.js +6 -1
  367. package/package.json +7 -4
  368. package/schemas/coverage-gap.schema.json +41 -0
  369. package/schemas/finding-verdict.schema.json +470 -0
  370. package/schemas/risk-decision.schema.json +41 -0
  371. package/dist/cli/chunks/adapter-3VBXL7DO.js +0 -2
  372. package/dist/cli/chunks/aqe-learning-engine-NXRNKJNA.js +0 -2
  373. package/dist/cli/chunks/base-F6GMOKU2.js +0 -2
  374. package/dist/cli/chunks/browser-workflow-QRDC46LR.js +0 -2
  375. package/dist/cli/chunks/chunk-R2B6EE45.js +0 -2
  376. package/dist/cli/chunks/chunk-TRDEULS7.js +0 -4
  377. package/dist/cli/chunks/chunk-WJXHE52V.js +0 -65
  378. package/dist/cli/chunks/client-HNBZUEVV.js +0 -2
  379. package/dist/cli/chunks/codex-installer-AKQ5BCHU.js +0 -15
  380. package/dist/cli/chunks/core-handlers-TB7NLYXL.js +0 -2
  381. package/dist/cli/chunks/cross-domain-router-MDSI553U.js +0 -2
  382. package/dist/cli/chunks/dream-X7ISHFEE.js +0 -2
  383. package/dist/cli/chunks/heartbeat-scheduler-2C5XGFQT.js +0 -2
  384. package/dist/cli/chunks/hnsw-adapter-KCVMXLUL.js +0 -2
  385. package/dist/cli/chunks/hnsw-index-OGWZS6MP.js +0 -2
  386. package/dist/cli/chunks/impact-analyzer-IBJ43GQL.js +0 -2
  387. package/dist/cli/chunks/init-wizard-6XMFD5LP.js +0 -2
  388. package/dist/cli/chunks/kernel-UDUMUPB3.js +0 -2
  389. package/dist/cli/chunks/knowledge-graph-JRYTUG3W.js +0 -2
  390. package/dist/cli/chunks/llm-router-service-KF5ZALUQ.js +0 -2
  391. package/dist/cli/chunks/load-test-LHMBCNCH.js +0 -2
  392. package/dist/cli/chunks/memory-backend-WZHKHBZK.js +0 -2
  393. package/dist/cli/chunks/pattern-null-store-UZSHCRL2.js +0 -2
  394. package/dist/cli/chunks/platform-WCRBO3Z7.js +0 -2
  395. package/dist/cli/chunks/protocol-executor-42NLVDTC.js +0 -2
  396. package/dist/cli/chunks/qe-reasoning-bank-W74RSMMU.js +0 -2
  397. package/dist/cli/chunks/quality-gate-63DDBSGM.js +0 -7
  398. package/dist/cli/chunks/queen-coordinator-XELKSRMS.js +0 -2
  399. package/dist/cli/chunks/router-GTW2EQZV.js +0 -2
  400. package/dist/cli/chunks/routing-feedback-NVOBWEMK.js +0 -2
  401. package/dist/cli/chunks/rvf-dual-writer-5OPVMXNL.js +0 -2
  402. package/dist/cli/chunks/rvf-migration-adapter-5S4YFTX4.js +0 -2
  403. package/dist/cli/chunks/rvf-native-adapter-LYSJHEVX.js +0 -2
  404. package/dist/cli/chunks/safe-db-AEB3JMLD.js +0 -2
  405. package/dist/cli/chunks/schedule-4QNPCQNT.js +0 -2
  406. package/dist/cli/chunks/scheduler-S3DFHX6A.js +0 -2
  407. package/dist/cli/chunks/sqlite-persistence-L2KISU2H.js +0 -2
  408. package/dist/cli/chunks/unified-memory-5KQMA7FV.js +0 -2
  409. package/dist/cli/chunks/unified-memory-hnsw-PQRPTYOD.js +0 -2
  410. package/dist/cli/chunks/unified-persistence-YDONVPJB.js +0 -2
  411. package/dist/cli/chunks/visual-security-RJ7RTNGJ.js +0 -2
  412. package/dist/cli/chunks/witness-chain-YXXXNGAM.js +0 -2
  413. package/dist/cli/chunks/workflow-orchestrator-5KUAVSTH.js +0 -2
@@ -8,8 +8,10 @@
8
8
  * 1. loads the pinned, hash-checked ADR-117 anchor via `loadAnchorSet` (which
9
9
  * throws on drift — the frozen checklist can't be silently edited),
10
10
  * 2. selects the constant-denominator checklist for `checklistId`,
11
- * 3. runs the two-gate, three-valued `computeQualityVerdict` with the injected
12
- * frontier judge.
11
+ * 3. evaluates the revision-bound failure-mode reach manifest before any
12
+ * judge call (missing legacy manifests remain explicitly inconclusive),
13
+ * 4. runs the two-gate, three-valued `computeQualityVerdict` with the injected
14
+ * frontier judge and combines the independent verdicts fail-closed.
13
15
  *
14
16
  * The oracle result and the judge are injected — this module owns no LLM and no
15
17
  * mutation runner, so it is deterministic and unit-testable with a fake judge.
@@ -18,21 +20,48 @@ import path from 'node:path';
18
20
  import { loadAnchorSet } from './anchor-set.js';
19
21
  import { computeQualityVerdict, } from './quality-verdict.js';
20
22
  import { findProjectRoot } from '../kernel/unified-memory.js';
23
+ import { computeVerificationArtifactDigest, evaluateVerificationReach, } from './verification-reach.js';
21
24
  /** Default frozen anchor location, relative to the project root (ADR-117). */
22
25
  export const DEFAULT_ANCHOR_RELATIVE_PATH = 'verification/anchors/qe-anchor-v1.json';
23
26
  /**
24
27
  * Run the two-gate quality gate for one artifact against one pinned checklist.
25
28
  * Throws only for caller error (unknown checklist id, unloadable/drifted anchor);
26
- * every judgement outcome is returned as a three-valued `QualityVerdictResult`.
29
+ * every judgement outcome is returned as a three-valued reach-aware result.
27
30
  */
28
31
  export async function runQualityGate(req) {
29
32
  const checklist = loadChecklist(req.checklistId, req.anchorPath);
30
- return computeQualityVerdict({
33
+ if (req.verificationManifest
34
+ && req.verificationManifest.artifact.digest !== computeVerificationArtifactDigest(req.artifact)) {
35
+ throw new Error('Verification reach manifest artifact digest does not match the judged artifact');
36
+ }
37
+ const verification = req.verificationManifest
38
+ ? { kind: 'verified', ...evaluateVerificationReach(req.verificationManifest) }
39
+ : {
40
+ kind: 'legacy-unknown',
41
+ coverageVerdict: 'inconclusive',
42
+ reason: 'legacy quality-gate request has no verification reach manifest',
43
+ };
44
+ const coverageVerdict = verification.coverageVerdict;
45
+ const quality = await computeQualityVerdict({
31
46
  oracle: req.oracleResult,
32
47
  artifact: req.artifact,
33
48
  checklist,
34
49
  judge: req.judge,
35
50
  });
51
+ return {
52
+ ...quality,
53
+ qualityVerdict: quality.verdict,
54
+ coverageVerdict,
55
+ verdict: combineVerdicts(quality.verdict, coverageVerdict),
56
+ verification,
57
+ };
58
+ }
59
+ function combineVerdicts(quality, coverage) {
60
+ if (quality === 'fail' || coverage === 'fail')
61
+ return 'fail';
62
+ if (quality === 'pass' && coverage === 'pass')
63
+ return 'pass';
64
+ return 'inconclusive';
36
65
  }
37
66
  /**
38
67
  * Load the pinned checklist for `checklistId` from the frozen anchor. Exposed so
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Failure-mode verification reach contracts (#651).
3
+ *
4
+ * Quality evidence is useful only within the boundary it actually observed.
5
+ * This module keeps that boundary revision-bound and fail-closed: direct,
6
+ * executed, fresh evidence with the required oracle can cover a risk; partial,
7
+ * inferred, stale, unavailable, and wrong-target evidence remains visible but
8
+ * cannot silently produce a passing coverage verdict.
9
+ */
10
+ export type FailureModeSeverity = 'critical' | 'high' | 'medium' | 'low';
11
+ export type VerificationChannel = 'static' | 'build' | 'runtime' | 'api' | 'browser' | 'telemetry' | 'hardware' | 'human';
12
+ export type VerificationReachLevel = 'direct' | 'partial' | 'none';
13
+ export type VerificationEvidenceClass = 'EXECUTED' | 'STATIC' | 'INFERRED' | 'UNKNOWN';
14
+ export type VerificationExecutionStatus = 'passed' | 'failed' | 'not-run' | 'unavailable';
15
+ export type UncoveredDisposition = 'fail' | 'inconclusive' | 'human-review';
16
+ export type VerificationCoverageVerdict = 'pass' | UncoveredDisposition;
17
+ export interface VerificationTarget {
18
+ revision: string;
19
+ digest: string;
20
+ environment: string;
21
+ }
22
+ export interface VerificationCost {
23
+ tokens?: number;
24
+ durationMs?: number;
25
+ monetary?: number;
26
+ }
27
+ export interface VerificationReach {
28
+ checkId: string;
29
+ channel: VerificationChannel;
30
+ reach: VerificationReachLevel;
31
+ evidenceClass: VerificationEvidenceClass;
32
+ executionStatus: VerificationExecutionStatus;
33
+ target: VerificationTarget;
34
+ oracleRef?: string;
35
+ observedAt?: string;
36
+ limitations: string[];
37
+ cost?: VerificationCost;
38
+ }
39
+ export interface FailureModeRequirement {
40
+ riskId: string;
41
+ failureMode: string;
42
+ severity: FailureModeSeverity;
43
+ requiredOracle: string;
44
+ requiredObservations: VerificationChannel[];
45
+ checks: VerificationReach[];
46
+ dispositionWhenUncovered: UncoveredDisposition;
47
+ }
48
+ export interface VerificationReachManifest {
49
+ id: string;
50
+ systemUnderTest: string;
51
+ artifact: VerificationTarget;
52
+ risks: FailureModeRequirement[];
53
+ generatedAt: string;
54
+ expiresAt?: string;
55
+ manifestHash: string;
56
+ }
57
+ export type VerificationReachManifestInput = Omit<VerificationReachManifest, 'manifestHash'>;
58
+ export interface FailureModeReachResult {
59
+ riskId: string;
60
+ failureMode: string;
61
+ severity: FailureModeSeverity;
62
+ verdict: VerificationCoverageVerdict;
63
+ directCheckIds: string[];
64
+ partialCheckIds: string[];
65
+ failedCheckIds: string[];
66
+ uncoveredObservations: VerificationChannel[];
67
+ limitations: string[];
68
+ reason: string;
69
+ }
70
+ export interface VerificationReachResult {
71
+ manifestId: string;
72
+ manifestHash: string;
73
+ systemUnderTest: string;
74
+ artifact: VerificationTarget;
75
+ coverageVerdict: VerificationCoverageVerdict;
76
+ risks: FailureModeReachResult[];
77
+ evaluatedAt: string;
78
+ }
79
+ export interface VerificationReachEvaluationOptions {
80
+ now?: Date;
81
+ }
82
+ /** Create a manifest whose hash binds its target, risks, checks, and lifetime. */
83
+ export declare function createVerificationReachManifest(input: VerificationReachManifestInput): VerificationReachManifest;
84
+ /** Compute the canonical SHA-256 identity for all manifest content except the hash itself. */
85
+ export declare function computeVerificationReachManifestHash(manifest: VerificationReachManifest | VerificationReachManifestInput): string;
86
+ /** Bind a reach manifest to the exact artifact bytes submitted to the gate. */
87
+ export declare function computeVerificationArtifactDigest(artifact: string): string;
88
+ /** Evaluate whether the declared evidence can directly observe every required failure mode. */
89
+ export declare function evaluateVerificationReach(manifest: VerificationReachManifest, options?: VerificationReachEvaluationOptions): VerificationReachResult;
90
+ //# sourceMappingURL=verification-reach.d.ts.map
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Failure-mode verification reach contracts (#651).
3
+ *
4
+ * Quality evidence is useful only within the boundary it actually observed.
5
+ * This module keeps that boundary revision-bound and fail-closed: direct,
6
+ * executed, fresh evidence with the required oracle can cover a risk; partial,
7
+ * inferred, stale, unavailable, and wrong-target evidence remains visible but
8
+ * cannot silently produce a passing coverage verdict.
9
+ */
10
+ import { createHash } from 'node:crypto';
11
+ /** Create a manifest whose hash binds its target, risks, checks, and lifetime. */
12
+ export function createVerificationReachManifest(input) {
13
+ validateManifestShape(input);
14
+ const manifest = structuredClone(input);
15
+ return {
16
+ ...manifest,
17
+ manifestHash: computeVerificationReachManifestHash(manifest),
18
+ };
19
+ }
20
+ /** Compute the canonical SHA-256 identity for all manifest content except the hash itself. */
21
+ export function computeVerificationReachManifestHash(manifest) {
22
+ const { manifestHash: _ignored, ...content } = manifest;
23
+ return `sha256:${createHash('sha256').update(canonicalJson(content)).digest('hex')}`;
24
+ }
25
+ /** Bind a reach manifest to the exact artifact bytes submitted to the gate. */
26
+ export function computeVerificationArtifactDigest(artifact) {
27
+ return `sha256:${createHash('sha256').update(artifact).digest('hex')}`;
28
+ }
29
+ /** Evaluate whether the declared evidence can directly observe every required failure mode. */
30
+ export function evaluateVerificationReach(manifest, options = {}) {
31
+ validateManifestShape(manifest);
32
+ const expectedHash = computeVerificationReachManifestHash(manifest);
33
+ if (manifest.manifestHash !== expectedHash) {
34
+ throw new Error(`Verification reach manifestHash mismatch: expected ${expectedHash}`);
35
+ }
36
+ const now = options.now ?? new Date();
37
+ const evaluatedAt = now.toISOString();
38
+ const manifestExpired = manifest.expiresAt != null
39
+ && now.getTime() > parseTimestamp(manifest.expiresAt, 'expiresAt');
40
+ const risks = manifest.risks.map((requirement) => evaluateRisk(requirement, manifest, manifestExpired, now.getTime()));
41
+ return {
42
+ manifestId: manifest.id,
43
+ manifestHash: manifest.manifestHash,
44
+ systemUnderTest: manifest.systemUnderTest,
45
+ artifact: structuredClone(manifest.artifact),
46
+ coverageVerdict: aggregateVerdicts(risks.map((risk) => risk.verdict)),
47
+ risks,
48
+ evaluatedAt,
49
+ };
50
+ }
51
+ function evaluateRisk(requirement, manifest, manifestExpired, evaluatedAt) {
52
+ const direct = new Set();
53
+ const partial = new Set();
54
+ const failed = new Set();
55
+ const covered = new Set();
56
+ const limitations = new Set();
57
+ for (const check of requirement.checks) {
58
+ for (const limitation of check.limitations)
59
+ limitations.add(limitation);
60
+ if (!isUsableObservation(check, manifest, manifestExpired, evaluatedAt))
61
+ continue;
62
+ if (check.reach === 'partial') {
63
+ partial.add(check.checkId);
64
+ continue;
65
+ }
66
+ if (check.reach !== 'direct')
67
+ continue;
68
+ if (!requirement.requiredObservations.includes(check.channel))
69
+ continue;
70
+ if (check.oracleRef !== requirement.requiredOracle)
71
+ continue;
72
+ if (check.executionStatus === 'failed') {
73
+ failed.add(check.checkId);
74
+ continue;
75
+ }
76
+ if (check.executionStatus === 'passed') {
77
+ direct.add(check.checkId);
78
+ covered.add(check.channel);
79
+ }
80
+ }
81
+ const uncoveredObservations = requirement.requiredObservations.filter((channel) => !covered.has(channel));
82
+ const verdict = failed.size > 0
83
+ ? 'fail'
84
+ : uncoveredObservations.length === 0
85
+ ? 'pass'
86
+ : requirement.dispositionWhenUncovered;
87
+ return {
88
+ riskId: requirement.riskId,
89
+ failureMode: requirement.failureMode,
90
+ severity: requirement.severity,
91
+ verdict,
92
+ directCheckIds: [...direct],
93
+ partialCheckIds: [...partial],
94
+ failedCheckIds: [...failed],
95
+ uncoveredObservations,
96
+ limitations: [...limitations],
97
+ reason: buildRiskReason(verdict, failed, uncoveredObservations, manifestExpired),
98
+ };
99
+ }
100
+ function isUsableObservation(check, manifest, manifestExpired, evaluatedAt) {
101
+ if (manifestExpired)
102
+ return false;
103
+ if (!sameTarget(check.target, manifest.artifact))
104
+ return false;
105
+ if (check.evidenceClass !== 'EXECUTED')
106
+ return false;
107
+ if (check.executionStatus === 'not-run' || check.executionStatus === 'unavailable')
108
+ return false;
109
+ if (!check.observedAt)
110
+ return false;
111
+ const observedAt = parseTimestamp(check.observedAt, `check ${check.checkId} observedAt`);
112
+ const generatedAt = parseTimestamp(manifest.generatedAt, 'generatedAt');
113
+ if (observedAt < generatedAt)
114
+ return false;
115
+ if (observedAt > evaluatedAt)
116
+ return false;
117
+ if (manifest.expiresAt && observedAt > parseTimestamp(manifest.expiresAt, 'expiresAt'))
118
+ return false;
119
+ return true;
120
+ }
121
+ function sameTarget(actual, expected) {
122
+ return actual.revision === expected.revision
123
+ && actual.digest === expected.digest
124
+ && actual.environment === expected.environment;
125
+ }
126
+ function aggregateVerdicts(verdicts) {
127
+ if (verdicts.some((verdict) => verdict === 'fail'))
128
+ return 'fail';
129
+ if (verdicts.some((verdict) => verdict === 'human-review'))
130
+ return 'human-review';
131
+ if (verdicts.some((verdict) => verdict === 'inconclusive'))
132
+ return 'inconclusive';
133
+ return 'pass';
134
+ }
135
+ function buildRiskReason(verdict, failed, uncovered, manifestExpired) {
136
+ if (manifestExpired)
137
+ return `verification manifest expired; uncovered: ${uncovered.join(', ')}`;
138
+ if (failed.size > 0)
139
+ return `direct check failed: ${[...failed].join(', ')}`;
140
+ if (verdict === 'pass')
141
+ return 'all required observation channels have direct executed reach';
142
+ return `required reach is uncovered (${uncovered.join(', ')}); disposition: ${verdict}`;
143
+ }
144
+ function validateManifestShape(manifest) {
145
+ if (!manifest.id || !manifest.systemUnderTest) {
146
+ throw new Error('Verification reach manifest requires id and systemUnderTest');
147
+ }
148
+ if (!manifest.artifact.revision || !manifest.artifact.digest || !manifest.artifact.environment) {
149
+ throw new Error('Verification reach manifest artifact requires revision, digest, and environment');
150
+ }
151
+ parseTimestamp(manifest.generatedAt, 'generatedAt');
152
+ if (manifest.expiresAt)
153
+ parseTimestamp(manifest.expiresAt, 'expiresAt');
154
+ if (manifest.risks.length === 0) {
155
+ throw new Error('Verification reach manifest requires at least one failure mode');
156
+ }
157
+ const riskIds = new Set();
158
+ for (const risk of manifest.risks) {
159
+ if (riskIds.has(risk.riskId))
160
+ throw new Error(`Duplicate riskId: ${risk.riskId}`);
161
+ riskIds.add(risk.riskId);
162
+ if (!risk.riskId || !risk.failureMode || !risk.requiredOracle) {
163
+ throw new Error('Each failure mode requires riskId, failureMode, and requiredOracle');
164
+ }
165
+ if (risk.requiredObservations.length === 0) {
166
+ throw new Error(`Failure mode ${risk.riskId} requires at least one observation channel`);
167
+ }
168
+ }
169
+ }
170
+ function parseTimestamp(value, field) {
171
+ const timestamp = Date.parse(value);
172
+ if (!Number.isFinite(timestamp))
173
+ throw new Error(`Invalid ${field} timestamp: ${value}`);
174
+ return timestamp;
175
+ }
176
+ function canonicalJson(value) {
177
+ if (Array.isArray(value))
178
+ return `[${value.map(canonicalJson).join(',')}]`;
179
+ if (value && typeof value === 'object') {
180
+ const entries = Object.entries(value)
181
+ .filter(([, entry]) => entry !== undefined)
182
+ .sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0);
183
+ return `{${entries.map(([key, entry]) => `${JSON.stringify(key)}:${canonicalJson(entry)}`).join(',')}}`;
184
+ }
185
+ return JSON.stringify(value);
186
+ }
187
+ //# sourceMappingURL=verification-reach.js.map
@@ -11,7 +11,7 @@
11
11
  * const verdicts = await adversarialVerify(findings, { judge, refuters: 3 });
12
12
  * const { confirmed, killed } = partitionVerdicts(verdicts);
13
13
  */
14
- export type { Finding, FindingVerdict, FindingSeverity, FindingOutcome, RefuterVote, Judge, AdversarialVerifyOptions, } from './types.js';
14
+ export type { Finding, FindingVerdict, FindingSeverity, FindingOutcome, RefuterVote, JudgeMeasurementReceipt, EndpointClass, SnapshotIdentityLevel, ReceiptSemantics, CacheStatus, Judge, AdversarialVerifyOptions, } from './types.js';
15
15
  export { adversarialVerify, partitionVerdicts } from './verify.js';
16
16
  export { synthesizeVerdict, majorityKill, isFindingVerdict } from './synthesize.js';
17
17
  export { refuterPrompt, DEFAULT_LENSES } from './prompts.js';
@@ -0,0 +1,13 @@
1
+ import type { JudgeMeasurementReceipt } from './types.js';
2
+ export type ReceiptIdentifierField = 'provider' | 'requestedModel' | 'resolvedModel' | 'fingerprint' | 'windowId' | 'requestId';
3
+ export declare const RECEIPT_IDENTIFIER_PATTERN = "^(?:UNKNOWN|[A-Za-z0-9][A-Za-z0-9._:/@+-]{0,255})$";
4
+ export declare const RECEIPT_SENSITIVE_IDENTIFIER_PATTERN = "(?:^|[._:/@+\\-])(?:(?:[sS][kK]|[rR][kK]|[gG][hH][pPoOuUsSrR]|[gG][iI][tT][hH][uU][bB]_[pP][aA][tT]|[xX][oO][xX][bBaApPrRsS]|[nN][pP][mM]|[gG][lL][pP][aA][tT]|[pP][aA][tT])(?:[-_][A-Za-z0-9_-]*|(?=$|[.:/@+\\-]))|(?:[aA][kK][iI][aA]|[aA][sS][iI][aA]|[aA][iI][zZ][aA])[A-Za-z0-9]*)";
5
+ export declare const RECEIPT_JWT_PATTERN = "(?:^|[^A-Za-z0-9_-])(?:eyJ[A-Za-z0-9_-]*|e30|ew[A-Za-z0-9_-]*)\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+(?:$|[^A-Za-z0-9_-])";
6
+ export declare const RECEIPT_OPAQUE_DESCRIPTOR_PATTERN = "(?:^|[._:/@+\\-])[A-Za-z0-9]{32,}(?:$|[._:/@+\\-])";
7
+ export declare const RECEIPT_OPAQUE_CORRELATION_PATTERN = "(?:(?:^|[.:@\\-])[A-Za-z0-9+/]{32,}={0,2}(?:$|[.:@\\-])|(?:^|[.:/@+\\-])[A-Za-z0-9_-]{48,}(?:$|[.:/@+\\-]))";
8
+ export declare const RECEIPT_KNOWN_TIMESTAMP_PATTERN = "^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d{1,9})?Z$";
9
+ export declare function isSanitizedReceiptIdentifier(candidate: unknown, field: ReceiptIdentifierField): candidate is string;
10
+ export declare function isSanitizedReceiptTimestamp(candidate: unknown): candidate is string;
11
+ /** Convert adapter-supplied receipt evidence into the content-free public contract. */
12
+ export declare function sanitizeJudgeMeasurementReceipt(value: unknown): JudgeMeasurementReceipt;
13
+ //# sourceMappingURL=measurement-receipt.d.ts.map
@@ -0,0 +1,136 @@
1
+ const ENDPOINT_CLASSES = new Set(['shared', 'dedicated', 'local', 'UNKNOWN']);
2
+ const SNAPSHOT_LEVELS = new Set(['L0_UNKNOWN', 'L1_NAMED', 'L2_CONTENT_BOUND']);
3
+ const SEMANTICS = new Set(['verified', 'provider-asserted', 'UNKNOWN']);
4
+ const CACHE_STATUSES = new Set(['hit', 'miss', 'bypass', 'UNKNOWN']);
5
+ export const RECEIPT_IDENTIFIER_PATTERN = '^(?:UNKNOWN|[A-Za-z0-9][A-Za-z0-9._:/@+-]{0,255})$';
6
+ export const RECEIPT_SENSITIVE_IDENTIFIER_PATTERN = '(?:^|[._:/@+\\-])(?:(?:[sS][kK]|[rR][kK]|[gG][hH][pPoOuUsSrR]|[gG][iI][tT][hH][uU][bB]_[pP][aA][tT]|[xX][oO][xX][bBaApPrRsS]|[nN][pP][mM]|[gG][lL][pP][aA][tT]|[pP][aA][tT])(?:[-_][A-Za-z0-9_-]*|(?=$|[.:/@+\\-]))|(?:[aA][kK][iI][aA]|[aA][sS][iI][aA]|[aA][iI][zZ][aA])[A-Za-z0-9]*)';
7
+ export const RECEIPT_JWT_PATTERN = '(?:^|[^A-Za-z0-9_-])(?:eyJ[A-Za-z0-9_-]*|e30|ew[A-Za-z0-9_-]*)\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+(?:$|[^A-Za-z0-9_-])';
8
+ export const RECEIPT_OPAQUE_DESCRIPTOR_PATTERN = '(?:^|[._:/@+\\-])[A-Za-z0-9]{32,}(?:$|[._:/@+\\-])';
9
+ export const RECEIPT_OPAQUE_CORRELATION_PATTERN = '(?:(?:^|[.:@\\-])[A-Za-z0-9+/]{32,}={0,2}(?:$|[.:@\\-])|(?:^|[.:/@+\\-])[A-Za-z0-9_-]{48,}(?:$|[.:/@+\\-]))';
10
+ export const RECEIPT_KNOWN_TIMESTAMP_PATTERN = '^\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d{1,9})?Z$';
11
+ const SAFE_IDENTIFIER = new RegExp(RECEIPT_IDENTIFIER_PATTERN);
12
+ const SENSITIVE_IDENTIFIER = new RegExp(RECEIPT_SENSITIVE_IDENTIFIER_PATTERN);
13
+ const JWT = new RegExp(RECEIPT_JWT_PATTERN);
14
+ const OPAQUE_DESCRIPTOR = new RegExp(RECEIPT_OPAQUE_DESCRIPTOR_PATTERN);
15
+ const OPAQUE_CORRELATION = new RegExp(RECEIPT_OPAQUE_CORRELATION_PATTERN);
16
+ const KNOWN_TIMESTAMP = new RegExp(RECEIPT_KNOWN_TIMESTAMP_PATTERN);
17
+ const RECEIPT_HASH_FIELDS = [
18
+ 'requestHash', 'promptHash', 'configHash', 'parserSchemaHash', 'outputHash', 'parsedVoteHash',
19
+ ];
20
+ function isRecord(value) {
21
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
22
+ }
23
+ function looksLikeOpaqueCredential(value, field) {
24
+ if (SENSITIVE_IDENTIFIER.test(value) || JWT.test(value))
25
+ return true;
26
+ if (field === 'provider' || field === 'requestedModel' || field === 'resolvedModel') {
27
+ return OPAQUE_DESCRIPTOR.test(value);
28
+ }
29
+ return OPAQUE_CORRELATION.test(value);
30
+ }
31
+ export function isSanitizedReceiptIdentifier(candidate, field) {
32
+ return typeof candidate === 'string'
33
+ && SAFE_IDENTIFIER.test(candidate)
34
+ && !looksLikeOpaqueCredential(candidate, field);
35
+ }
36
+ function identifier(candidate, field) {
37
+ return typeof candidate === 'string'
38
+ && isSanitizedReceiptIdentifier(candidate, field)
39
+ ? candidate
40
+ : 'UNKNOWN';
41
+ }
42
+ export function isSanitizedReceiptTimestamp(candidate) {
43
+ if (candidate === 'UNKNOWN')
44
+ return true;
45
+ if (typeof candidate !== 'string' || !KNOWN_TIMESTAMP.test(candidate))
46
+ return false;
47
+ const [date] = candidate.split('T');
48
+ const [yearText, monthText, dayText] = date.split('-');
49
+ const year = Number(yearText);
50
+ const month = Number(monthText);
51
+ const day = Number(dayText);
52
+ const leapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
53
+ const daysInMonth = [31, leapYear ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
54
+ return day <= daysInMonth[month - 1];
55
+ }
56
+ function timestamp(candidate) {
57
+ return isSanitizedReceiptTimestamp(candidate) ? candidate : 'UNKNOWN';
58
+ }
59
+ function hash(candidate) {
60
+ return typeof candidate === 'string' && /^(?:sha256:)?[a-f\d]{64}$/i.test(candidate)
61
+ ? `sha256:${candidate.replace(/^sha256:/i, '').toLowerCase()}`
62
+ : 'UNKNOWN';
63
+ }
64
+ function enumOr(candidate, allowed, fallback) {
65
+ return typeof candidate === 'string' && allowed.has(candidate) ? candidate : fallback;
66
+ }
67
+ function finiteNonNegativeOrNull(value) {
68
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : null;
69
+ }
70
+ function unitOrNull(value) {
71
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0 && value <= 1 ? value : null;
72
+ }
73
+ function unknownReceipt() {
74
+ return {
75
+ contract: 'judge-measurement@1',
76
+ provider: 'UNKNOWN', requestedModel: 'UNKNOWN', resolvedModel: 'UNKNOWN',
77
+ endpointClass: 'UNKNOWN', snapshotIdentity: 'L0_UNKNOWN', semantics: 'UNKNOWN',
78
+ fingerprint: 'UNKNOWN', requestHash: 'UNKNOWN', promptHash: 'UNKNOWN', configHash: 'UNKNOWN',
79
+ parserSchemaHash: 'UNKNOWN', outputHash: 'UNKNOWN', parsedVoteHash: 'UNKNOWN',
80
+ temperature: null, topP: null, seed: null, deterministic: null, cacheStatus: 'UNKNOWN',
81
+ retryCount: 0, timestamp: 'UNKNOWN', windowId: 'UNKNOWN', latencyMs: null, requestId: 'UNKNOWN',
82
+ };
83
+ }
84
+ /** Convert adapter-supplied receipt evidence into the content-free public contract. */
85
+ export function sanitizeJudgeMeasurementReceipt(value) {
86
+ if (!isRecord(value))
87
+ return unknownReceipt();
88
+ try {
89
+ const sanitized = {
90
+ contract: 'judge-measurement@1',
91
+ provider: identifier(value.provider, 'provider'),
92
+ requestedModel: identifier(value.requestedModel, 'requestedModel'),
93
+ resolvedModel: identifier(value.resolvedModel, 'resolvedModel'),
94
+ endpointClass: enumOr(value.endpointClass, ENDPOINT_CLASSES, 'UNKNOWN'),
95
+ snapshotIdentity: enumOr(value.snapshotIdentity, SNAPSHOT_LEVELS, 'L0_UNKNOWN'),
96
+ semantics: enumOr(value.semantics, SEMANTICS, 'UNKNOWN'),
97
+ fingerprint: identifier(value.fingerprint, 'fingerprint'),
98
+ requestHash: hash(value.requestHash),
99
+ promptHash: hash(value.promptHash),
100
+ configHash: hash(value.configHash),
101
+ parserSchemaHash: hash(value.parserSchemaHash),
102
+ outputHash: hash(value.outputHash),
103
+ parsedVoteHash: hash(value.parsedVoteHash),
104
+ temperature: finiteNonNegativeOrNull(value.temperature),
105
+ topP: unitOrNull(value.topP),
106
+ seed: typeof value.seed === 'number' && Number.isSafeInteger(value.seed) ? value.seed : null,
107
+ deterministic: typeof value.deterministic === 'boolean' ? value.deterministic : null,
108
+ cacheStatus: enumOr(value.cacheStatus, CACHE_STATUSES, 'UNKNOWN'),
109
+ retryCount: typeof value.retryCount === 'number' && Number.isSafeInteger(value.retryCount) && value.retryCount >= 0
110
+ ? value.retryCount
111
+ : 0,
112
+ timestamp: timestamp(value.timestamp),
113
+ windowId: identifier(value.windowId, 'windowId'),
114
+ latencyMs: finiteNonNegativeOrNull(value.latencyMs),
115
+ requestId: identifier(value.requestId, 'requestId'),
116
+ };
117
+ const contentBound = sanitized.fingerprint !== 'UNKNOWN'
118
+ && RECEIPT_HASH_FIELDS.every((field) => sanitized[field] !== 'UNKNOWN');
119
+ const namedSnapshot = sanitized.resolvedModel !== 'UNKNOWN';
120
+ if ((sanitized.snapshotIdentity === 'L2_CONTENT_BOUND' && !contentBound)
121
+ || (sanitized.snapshotIdentity === 'L1_NAMED' && !namedSnapshot)) {
122
+ sanitized.snapshotIdentity = 'L0_UNKNOWN';
123
+ }
124
+ if (sanitized.snapshotIdentity === 'L0_UNKNOWN'
125
+ || sanitized.fingerprint === 'UNKNOWN'
126
+ || (sanitized.semantics === 'verified'
127
+ && (sanitized.snapshotIdentity !== 'L2_CONTENT_BOUND' || !contentBound))) {
128
+ sanitized.semantics = 'UNKNOWN';
129
+ }
130
+ return sanitized;
131
+ }
132
+ catch {
133
+ return unknownReceipt();
134
+ }
135
+ }
136
+ //# sourceMappingURL=measurement-receipt.js.map
@@ -1,3 +1,5 @@
1
+ import { validateFindingVerdict } from '../../contracts/verdicts.js';
2
+ import { sanitizeJudgeMeasurementReceipt } from './measurement-receipt.js';
1
3
  /** Default kill threshold: simple majority of cast votes (2-of-3, 1-of-1, 2-of-2). */
2
4
  export const majorityKill = (castVotes) => Math.ceil(castVotes / 2);
3
5
  /**
@@ -6,6 +8,9 @@ export const majorityKill = (castVotes) => Math.ceil(castVotes / 2);
6
8
  */
7
9
  export function synthesizeVerdict(finding, votes, killThreshold = majorityKill) {
8
10
  const refutations = votes.filter((v) => v.refuted).map((v) => v.reasoning);
11
+ const measurementReceipts = votes.flatMap((v) => v.measurementReceipt
12
+ ? [sanitizeJudgeMeasurementReceipt(v.measurementReceipt)]
13
+ : []);
9
14
  const killed = votes.length > 0 && refutations.length >= killThreshold(votes.length);
10
15
  return {
11
16
  contract: 'finding-verdict@1',
@@ -17,19 +22,11 @@ export function synthesizeVerdict(finding, votes, killThreshold = majorityKill)
17
22
  evidence: finding.evidence,
18
23
  verdict: votes.length === 0 ? 'uncertain' : killed ? 'refuted' : 'upheld',
19
24
  refutations,
25
+ ...(measurementReceipts.length > 0 ? { measurementReceipts } : {}),
20
26
  };
21
27
  }
22
28
  /** Runtime guard: does `x` conform to finding-verdict@1 at the boundary? */
23
29
  export function isFindingVerdict(x) {
24
- if (!x || typeof x !== 'object')
25
- return false;
26
- const v = x;
27
- return (v.contract === 'finding-verdict@1' &&
28
- typeof v.id === 'string' &&
29
- typeof v.title === 'string' &&
30
- typeof v.confidence === 'number' &&
31
- Array.isArray(v.evidence) &&
32
- Array.isArray(v.refutations) &&
33
- (v.verdict === 'upheld' || v.verdict === 'refuted' || v.verdict === 'uncertain'));
30
+ return validateFindingVerdict(x).valid;
34
31
  }
35
32
  //# sourceMappingURL=synthesize.js.map
@@ -8,6 +8,10 @@
8
8
  */
9
9
  export type FindingSeverity = 'critical' | 'high' | 'medium' | 'low' | 'info';
10
10
  export type FindingOutcome = 'upheld' | 'refuted' | 'uncertain';
11
+ export type EndpointClass = 'shared' | 'dedicated' | 'local' | 'UNKNOWN';
12
+ export type SnapshotIdentityLevel = 'L0_UNKNOWN' | 'L1_NAMED' | 'L2_CONTENT_BOUND';
13
+ export type ReceiptSemantics = 'verified' | 'provider-asserted' | 'UNKNOWN';
14
+ export type CacheStatus = 'hit' | 'miss' | 'bypass' | 'UNKNOWN';
11
15
  /** A claim to be adversarially verified (input). */
12
16
  export interface Finding {
13
17
  /** Stable id; the verdict carries it verbatim (callers compose any prefix). */
@@ -23,6 +27,35 @@ export interface Finding {
23
27
  export interface RefuterVote {
24
28
  refuted: boolean;
25
29
  reasoning: string;
30
+ /** Optional sanitized identity/configuration evidence supplied by a real adapter. */
31
+ measurementReceipt?: JudgeMeasurementReceipt;
32
+ }
33
+ /** Hash-bound, content-free evidence for one judge request and parsed vote. */
34
+ export interface JudgeMeasurementReceipt {
35
+ contract: 'judge-measurement@1';
36
+ provider: string;
37
+ requestedModel: string;
38
+ resolvedModel: string;
39
+ endpointClass: EndpointClass;
40
+ snapshotIdentity: SnapshotIdentityLevel;
41
+ semantics: ReceiptSemantics;
42
+ fingerprint: string;
43
+ requestHash: string;
44
+ promptHash: string;
45
+ configHash: string;
46
+ parserSchemaHash: string;
47
+ outputHash: string;
48
+ parsedVoteHash: string;
49
+ temperature: number | null;
50
+ topP: number | null;
51
+ seed: number | null;
52
+ deterministic: boolean | null;
53
+ cacheStatus: CacheStatus;
54
+ retryCount: number;
55
+ timestamp: string;
56
+ windowId: string;
57
+ latencyMs: number | null;
58
+ requestId: string;
26
59
  }
27
60
  /**
28
61
  * The injected LLM refuter. Returns a vote, or `null`/throws on failure (failed
@@ -42,6 +75,8 @@ export interface FindingVerdict {
42
75
  verdict: FindingOutcome;
43
76
  /** One entry per refuter that voted to refute (empty when none). */
44
77
  refutations: string[];
78
+ /** Sanitized receipts for cast votes whose adapters supplied measurement evidence. */
79
+ measurementReceipts?: JudgeMeasurementReceipt[];
45
80
  }
46
81
  export interface AdversarialVerifyOptions {
47
82
  /** The injected LLM refuter. Required. */
@@ -1,10 +1,15 @@
1
1
  import { DEFAULT_LENSES, refuterPrompt } from './prompts.js';
2
2
  import { majorityKill, synthesizeVerdict } from './synthesize.js';
3
+ import { sanitizeJudgeMeasurementReceipt } from './measurement-receipt.js';
3
4
  /** Call one refuter; a thrown/`null` result is a failed vote (excluded). */
4
5
  async function castVote(judge, finding, lens) {
5
6
  try {
6
7
  const v = await judge(refuterPrompt(finding, lens));
7
- return v && typeof v.refuted === 'boolean' ? { refuted: v.refuted, reasoning: String(v.reasoning ?? '') } : null;
8
+ return v && typeof v.refuted === 'boolean' ? {
9
+ refuted: v.refuted,
10
+ reasoning: String(v.reasoning ?? ''),
11
+ ...(v.measurementReceipt ? { measurementReceipt: sanitizeJudgeMeasurementReceipt(v.measurementReceipt) } : {}),
12
+ } : null;
8
13
  }
9
14
  catch {
10
15
  return null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-qe",
3
- "version": "3.14.0",
3
+ "version": "3.14.1",
4
4
  "description": "Agentic Quality Engineering V3 - Domain-Driven Design Architecture with 13 Bounded Contexts, O(log n) coverage analysis, ReasoningBank learning, 60 specialized QE agents, mathematical Coherence verification, deep Claude Flow integration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -258,13 +258,15 @@
258
258
  "@huggingface/transformers": "^4.2.0",
259
259
  "@types/better-sqlite3": "^7.6.13",
260
260
  "@types/cli-progress": "^3.11.6",
261
- "@types/node": "^25.8.0",
261
+ "@types/node": "^22.0.0",
262
262
  "@types/pg": "^8.16.0",
263
263
  "@types/uuid": "^10.0.0",
264
264
  "@types/ws": "^8.18.1",
265
265
  "@typescript-eslint/eslint-plugin": "^8.59.3",
266
266
  "@typescript-eslint/parser": "^8.59.3",
267
267
  "@vitest/coverage-v8": "^4.0.16",
268
+ "ajv": "^8.20.0",
269
+ "ajv-formats": "^3.0.1",
268
270
  "dotenv": "^17.2.3",
269
271
  "esbuild": "^0.28.0",
270
272
  "eslint": "^8.55.0",
@@ -275,8 +277,8 @@
275
277
  "vitest": "^4.0.16"
276
278
  },
277
279
  "engines": {
278
- "node": ">=18.0.0",
279
- "npm": ">=8.0.0"
280
+ "node": ">=22.13.0",
281
+ "npm": ">=10.0.0"
280
282
  },
281
283
  "repository": {
282
284
  "type": "git",
@@ -292,6 +294,7 @@
292
294
  "dist/**/*.json",
293
295
  "dist/**/*.node",
294
296
  "assets/**",
297
+ "schemas/**",
295
298
  "scripts/postinstall.cjs",
296
299
  "scripts/preinstall.cjs",
297
300
  "scripts/fetch-content.cjs",