agentic-qe 3.15.6 → 3.15.8

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 (441) hide show
  1. package/.claude/skills/skills-manifest.json +1 -1
  2. package/CHANGELOG.md +263 -0
  3. package/README.md +2 -0
  4. package/assets/skills/skills-manifest.json +1 -1
  5. package/dist/cli/bundle.js +8 -6
  6. package/dist/cli/chunks/adapter-FC4EY447.js +2 -0
  7. package/dist/cli/chunks/{agent-booster-wasm-SY7UCLBL.js → agent-booster-wasm-W3V5P7LE.js} +2 -2
  8. package/dist/cli/chunks/{agent-handler-KAMYBU3S.js → agent-handler-2NQFHAWE.js} +2 -2
  9. package/dist/cli/chunks/{agent-memory-branch-2CAW3KUM.js → agent-memory-branch-457ECHHK.js} +2 -2
  10. package/dist/cli/chunks/aqe-learning-engine-AUAL6UBL.js +2 -0
  11. package/dist/cli/chunks/{arena-QCCVIOAH.js → arena-IYBQ3GPY.js} +4 -4
  12. package/dist/cli/chunks/{arena-4OFLJ3R2.js → arena-JV3WSEHU.js} +2 -2
  13. package/dist/cli/chunks/{audit-RBDQJQJB.js → audit-5OS3T3K6.js} +3 -3
  14. package/dist/cli/chunks/base-2XML4WH7.js +2 -0
  15. package/dist/cli/chunks/{better-sqlite3-5JRACCDQ.js → better-sqlite3-IQKBFVAO.js} +2 -2
  16. package/dist/cli/chunks/{brain-handler-W4QIIRT4.js → brain-handler-KA3SGAFM.js} +3 -3
  17. package/dist/cli/chunks/{branch-enumerator-IBNGI572.js → branch-enumerator-QZDU2VOQ.js} +2 -2
  18. package/dist/cli/chunks/{browser-GMSCVAOI.js → browser-ZL7OLKJQ.js} +2 -2
  19. package/dist/cli/chunks/browser-workflow-2IFEUAAK.js +2 -0
  20. package/dist/cli/chunks/{chunk-6HWARQWV.js → chunk-22DOS3PM.js} +2 -2
  21. package/dist/cli/chunks/{chunk-VCONCVSY.js → chunk-2DPHFCMW.js} +2 -2
  22. package/dist/cli/chunks/{chunk-ALCIUWFC.js → chunk-2GSAAUW3.js} +1 -1
  23. package/dist/cli/chunks/{chunk-AX26QJ6T.js → chunk-2JCLACCS.js} +2 -2
  24. package/dist/cli/chunks/{chunk-7XTANLTN.js → chunk-2QRGIEQV.js} +1 -1
  25. package/dist/cli/chunks/{chunk-MP3FSUNB.js → chunk-2UN4JOTN.js} +2 -2
  26. package/dist/cli/chunks/{chunk-CR66HNAE.js → chunk-2ZRNXEVI.js} +1 -1
  27. package/dist/cli/chunks/{chunk-WKDWRRDT.js → chunk-3LFLO2WK.js} +2 -2
  28. package/dist/cli/chunks/{chunk-QLYO3H7E.js → chunk-3N627QRU.js} +2 -2
  29. package/dist/cli/chunks/{chunk-VVF337SV.js → chunk-4C3RYBTT.js} +2 -2
  30. package/dist/cli/chunks/{chunk-MQCTLTGE.js → chunk-4C7KE2EL.js} +2 -2
  31. package/dist/cli/chunks/{chunk-AUN4FG7V.js → chunk-4GUVVGJX.js} +1 -1
  32. package/dist/cli/chunks/{chunk-ZOUEQ6DL.js → chunk-4GYFONJB.js} +1 -1
  33. package/dist/cli/chunks/{chunk-24ZSGYC6.js → chunk-4I35ARWW.js} +1 -1
  34. package/dist/cli/chunks/{chunk-6MXAJBEA.js → chunk-4NTLGGXO.js} +1 -1
  35. package/dist/cli/chunks/{chunk-EF5UHDCG.js → chunk-4TZLZRZ4.js} +1 -1
  36. package/dist/cli/chunks/{chunk-RD5BYLN7.js → chunk-4YUBWU3E.js} +1 -1
  37. package/dist/cli/chunks/{chunk-7TVIX4WL.js → chunk-52YRSWPS.js} +2 -2
  38. package/dist/cli/chunks/{chunk-LAY7NCQK.js → chunk-5DZDLOY6.js} +3 -3
  39. package/dist/cli/chunks/{chunk-34MDMFET.js → chunk-5MBNRTT5.js} +2 -2
  40. package/dist/cli/chunks/{chunk-VAYZ5QIE.js → chunk-5ONJ7AV6.js} +1 -1
  41. package/dist/cli/chunks/{chunk-RV6HSMKJ.js → chunk-5YOO5QSE.js} +1 -1
  42. package/dist/cli/chunks/{chunk-BUTGIVKW.js → chunk-62T7U25U.js} +1 -1
  43. package/dist/cli/chunks/{chunk-66NW3ZB4.js → chunk-6CKTLVYV.js} +2 -2
  44. package/dist/cli/chunks/{chunk-TUDENMAE.js → chunk-6E7EOHMN.js} +2 -2
  45. package/dist/cli/chunks/{chunk-GVRFSXY6.js → chunk-6GIC2263.js} +2 -2
  46. package/dist/cli/chunks/{chunk-KIDOBLUO.js → chunk-767SR7WH.js} +2 -2
  47. package/dist/cli/chunks/{chunk-NBUXM5X6.js → chunk-7C6FMLQR.js} +2 -2
  48. package/dist/cli/chunks/{chunk-4POOJYXA.js → chunk-7CVMT64N.js} +1 -1
  49. package/dist/cli/chunks/{chunk-R363XXGH.js → chunk-7DHSHD5B.js} +2 -2
  50. package/dist/cli/chunks/{chunk-IEPWO4XP.js → chunk-7H3GNRNA.js} +2 -2
  51. package/dist/cli/chunks/{chunk-DQNUPEY5.js → chunk-7SLEUVPZ.js} +2 -2
  52. package/dist/cli/chunks/{chunk-YNG7E26C.js → chunk-7XGM7Q2N.js} +2 -2
  53. package/dist/cli/chunks/{chunk-5MT7DMD7.js → chunk-A2UGPKCS.js} +2 -2
  54. package/dist/cli/chunks/{chunk-2CIDFR2H.js → chunk-A6GCO6ZU.js} +2 -2
  55. package/dist/cli/chunks/{chunk-XFPQIWEH.js → chunk-BEVWCF3Q.js} +3 -3
  56. package/dist/cli/chunks/{chunk-LCCTJ2PC.js → chunk-BLZEOGQE.js} +2 -2
  57. package/dist/cli/chunks/{chunk-6R3FBFCJ.js → chunk-BQUIZ5QT.js} +2 -2
  58. package/dist/cli/chunks/{chunk-ZUTFHGEO.js → chunk-BTMEOZYY.js} +1 -1
  59. package/dist/cli/chunks/{chunk-FU7LNUD7.js → chunk-CDLG3Q2O.js} +2 -2
  60. package/dist/cli/chunks/{chunk-NYS2GUNO.js → chunk-CQ3SBRDP.js} +2 -2
  61. package/dist/cli/chunks/chunk-CQ5G64EA.js +3 -0
  62. package/dist/cli/chunks/{chunk-JCE76MPP.js → chunk-CRUQ6RXU.js} +2 -2
  63. package/dist/cli/chunks/{chunk-XBFQJZWX.js → chunk-D4IBIMWI.js} +2 -2
  64. package/dist/cli/chunks/{chunk-LZWJ5BMP.js → chunk-D4O3TJI7.js} +2 -2
  65. package/dist/cli/chunks/{chunk-AUOSHM63.js → chunk-DAFMHM64.js} +2 -2
  66. package/dist/cli/chunks/{chunk-V3OLS2NG.js → chunk-DCYUHCPK.js} +2 -2
  67. package/dist/cli/chunks/{chunk-F7A2UBZO.js → chunk-DKFSCJEF.js} +2 -2
  68. package/dist/cli/chunks/{chunk-5LST62QR.js → chunk-DN3AKAPY.js} +2 -2
  69. package/dist/cli/chunks/{chunk-OQ4S6B7P.js → chunk-DY37YMMQ.js} +1 -1
  70. package/dist/cli/chunks/{chunk-XQ53PZEF.js → chunk-EUVSSIGR.js} +3 -3
  71. package/dist/cli/chunks/{chunk-6WOZUSSN.js → chunk-FAYXES7R.js} +2 -2
  72. package/dist/cli/chunks/{chunk-GNYOHZVV.js → chunk-FEN2DHFM.js} +1 -1
  73. package/dist/cli/chunks/{chunk-BAYGQRNP.js → chunk-FEPFXXI7.js} +2 -2
  74. package/dist/cli/chunks/{chunk-DLSFT6PO.js → chunk-FJAO4UX2.js} +2 -2
  75. package/dist/cli/chunks/{chunk-22OZIJAD.js → chunk-FWXNFPLS.js} +2 -2
  76. package/dist/cli/chunks/{chunk-X33F7NXH.js → chunk-G6CLO74Q.js} +3 -3
  77. package/dist/cli/chunks/{chunk-HAN4MS5T.js → chunk-G77Q22EN.js} +2 -2
  78. package/dist/cli/chunks/{chunk-5DH5QI7G.js → chunk-GENNJRNK.js} +3 -3
  79. package/dist/cli/chunks/{chunk-LMAEMVPA.js → chunk-GGSTLKY5.js} +1 -1
  80. package/dist/cli/chunks/{chunk-EJ4KZFZN.js → chunk-GSOK4M6V.js} +1 -1
  81. package/dist/cli/chunks/{chunk-DA7DGDTI.js → chunk-HI6OBDDY.js} +2 -2
  82. package/dist/cli/chunks/{chunk-XZ46CI35.js → chunk-HNGNRIZZ.js} +2 -2
  83. package/dist/cli/chunks/{chunk-CLAMMGY3.js → chunk-HXCGV5UJ.js} +2 -2
  84. package/dist/cli/chunks/{chunk-5UPIL62W.js → chunk-I4U7YCXG.js} +3 -3
  85. package/dist/cli/chunks/{chunk-RFDFET3O.js → chunk-I77D65X5.js} +2 -2
  86. package/dist/cli/chunks/{chunk-HEGGV2PT.js → chunk-IJSFZO7P.js} +2 -2
  87. package/dist/cli/chunks/{chunk-GWM4M5NF.js → chunk-IMSRWNWF.js} +1 -1
  88. package/dist/cli/chunks/{chunk-B7RHBKHL.js → chunk-J6LL25QJ.js} +2 -2
  89. package/dist/cli/chunks/{chunk-KYVIOC3C.js → chunk-J7FLNP5L.js} +2 -2
  90. package/dist/cli/chunks/{chunk-YLNYPQDR.js → chunk-J7RCI25Q.js} +1 -1
  91. package/dist/cli/chunks/{chunk-72MQCZSM.js → chunk-JFWQFB3S.js} +2 -2
  92. package/dist/cli/chunks/{chunk-SV5BUYHH.js → chunk-JLTGO5BB.js} +2 -2
  93. package/dist/cli/chunks/{chunk-CCL436IU.js → chunk-JWPYMRIX.js} +14 -6
  94. package/dist/cli/chunks/{chunk-ONPPBLRB.js → chunk-K4N2MBCE.js} +2 -2
  95. package/dist/cli/chunks/{chunk-7SAMMQVS.js → chunk-K5R3WUJP.js} +1 -1
  96. package/dist/cli/chunks/{chunk-GI5HWS4H.js → chunk-KITKQUBX.js} +1 -1
  97. package/dist/cli/chunks/{chunk-7TJZDRDU.js → chunk-KJNUETCB.js} +1 -1
  98. package/dist/cli/chunks/{chunk-JYKQVYX2.js → chunk-KMVFBYJO.js} +2 -2
  99. package/dist/cli/chunks/{chunk-ZSBD4FUX.js → chunk-KMZW2P3R.js} +2 -2
  100. package/dist/cli/chunks/{chunk-PEMSXSP2.js → chunk-KNHLOANK.js} +2 -2
  101. package/dist/cli/chunks/{chunk-47Q7JL3V.js → chunk-KNQUHGNY.js} +2 -2
  102. package/dist/cli/chunks/{chunk-A7ANPS4E.js → chunk-KVMKYUOE.js} +2 -2
  103. package/dist/cli/chunks/{chunk-XBEI2JBA.js → chunk-LHRVSK44.js} +2 -2
  104. package/dist/cli/chunks/{chunk-AJT3XDRD.js → chunk-LPSMVBB3.js} +2 -2
  105. package/dist/cli/chunks/{chunk-ORBODZSO.js → chunk-LVHZK7GW.js} +2 -2
  106. package/dist/cli/chunks/{chunk-ZTB32K5N.js → chunk-LZWBUVCK.js} +3 -3
  107. package/dist/cli/chunks/{chunk-OPDZBRIL.js → chunk-MMY52Y6R.js} +2 -2
  108. package/dist/cli/chunks/{chunk-MQTA6KIO.js → chunk-MUDBF2JC.js} +1 -1
  109. package/dist/cli/chunks/{chunk-GFB6BZWU.js → chunk-MV4S3TEC.js} +2 -2
  110. package/dist/cli/chunks/{chunk-UB6DQGWM.js → chunk-NF63NHJH.js} +2 -2
  111. package/dist/cli/chunks/{chunk-D5N2O5EH.js → chunk-NHOMVBCI.js} +2 -2
  112. package/dist/cli/chunks/{chunk-3NJ7O3OH.js → chunk-NLYUC63R.js} +2 -2
  113. package/dist/cli/chunks/{chunk-4CLDYT36.js → chunk-NQDYOF35.js} +2 -2
  114. package/dist/cli/chunks/{chunk-ORFL3YXB.js → chunk-NW7HTOSN.js} +2 -2
  115. package/dist/cli/chunks/{chunk-FQ5N666N.js → chunk-NWFBF3KT.js} +1 -1
  116. package/dist/cli/chunks/{chunk-P7DXVL2S.js → chunk-NZATJ2C6.js} +2 -2
  117. package/dist/cli/chunks/{chunk-HOEWMEF2.js → chunk-O4RRVTXN.js} +2 -2
  118. package/dist/cli/chunks/{chunk-4KOVHQXK.js → chunk-OCLAMZJG.js} +2 -2
  119. package/dist/cli/chunks/{chunk-TLUIO37P.js → chunk-OJWEZYLR.js} +2 -2
  120. package/dist/cli/chunks/{chunk-A74J23QB.js → chunk-OWBFVAEH.js} +2 -2
  121. package/dist/cli/chunks/{chunk-6T6AHVLF.js → chunk-P2EA62YS.js} +1 -1
  122. package/dist/cli/chunks/{chunk-TL5GV3PR.js → chunk-P4UT4LBE.js} +3 -3
  123. package/dist/cli/chunks/{chunk-IVJIHZSM.js → chunk-PICEGWGB.js} +1 -1
  124. package/dist/cli/chunks/{chunk-ITIJ23K2.js → chunk-PIEKGKW6.js} +2 -2
  125. package/dist/cli/chunks/{chunk-2ZTWPMTK.js → chunk-PJGQ2TKN.js} +2 -2
  126. package/dist/cli/chunks/{chunk-KCB6P463.js → chunk-PPIM7B5G.js} +2 -2
  127. package/dist/cli/chunks/{chunk-L2TDHJR3.js → chunk-PUYQ6EKC.js} +2 -2
  128. package/dist/cli/chunks/{chunk-2IWPJUVV.js → chunk-PWA6XBW4.js} +8 -8
  129. package/dist/cli/chunks/{chunk-XPB5BVU6.js → chunk-PZ7FJ4UG.js} +2 -2
  130. package/dist/cli/chunks/{chunk-SOSJWM3E.js → chunk-QFYUZYRA.js} +4 -4
  131. package/dist/cli/chunks/{chunk-RUTO67PT.js → chunk-R2NHGESM.js} +2 -2
  132. package/dist/cli/chunks/{chunk-K55EAWZ5.js → chunk-RG42LDOB.js} +2 -2
  133. package/dist/cli/chunks/{chunk-JAPBSSFY.js → chunk-RSMPJWQH.js} +1 -1
  134. package/dist/cli/chunks/{chunk-46HBVDMU.js → chunk-SFPGLUXS.js} +1 -1
  135. package/dist/cli/chunks/{chunk-TVLOED6O.js → chunk-SHEVM5PF.js} +2 -2
  136. package/dist/cli/chunks/{chunk-6RDVY26I.js → chunk-SJMZZMHP.js} +2 -2
  137. package/dist/cli/chunks/{chunk-3DJNKNBR.js → chunk-ST7ASEJO.js} +57 -57
  138. package/dist/cli/chunks/{chunk-QS5KZYUZ.js → chunk-SWY6KGMF.js} +2 -2
  139. package/dist/cli/chunks/{chunk-UHHMAKPE.js → chunk-T2TDTBFV.js} +1 -1
  140. package/dist/cli/chunks/{chunk-5HAPS6VD.js → chunk-TC52M542.js} +2 -2
  141. package/dist/cli/chunks/chunk-TMNEK7TP.js +2 -0
  142. package/dist/cli/chunks/{chunk-ELI4GDQO.js → chunk-U3BWBP6B.js} +2 -2
  143. package/dist/cli/chunks/{chunk-CZBIREL5.js → chunk-U7CIY3YR.js} +2 -2
  144. package/dist/cli/chunks/{chunk-X2DR27AY.js → chunk-UDCYQLTD.js} +2 -2
  145. package/dist/cli/chunks/{chunk-CEXNW5TR.js → chunk-UKKFZJME.js} +1 -1
  146. package/dist/cli/chunks/{chunk-5NC7QEJ6.js → chunk-UQLAN5TX.js} +4 -4
  147. package/dist/cli/chunks/{chunk-BIXRTOH3.js → chunk-UTFMMZ57.js} +3 -3
  148. package/dist/cli/chunks/{chunk-YXU35GGD.js → chunk-UTNKMPTC.js} +1 -1
  149. package/dist/cli/chunks/{chunk-HZFK2Z2Z.js → chunk-V4QJ3MMT.js} +1 -1
  150. package/dist/cli/chunks/{chunk-LJCEDTUM.js → chunk-V7VZSNDK.js} +3 -3
  151. package/dist/cli/chunks/{chunk-RLB7K7QP.js → chunk-VKFVJCIH.js} +1 -1
  152. package/dist/cli/chunks/{chunk-5GIJU2ZY.js → chunk-VQRBBR27.js} +2 -2
  153. package/dist/cli/chunks/{chunk-Q2RBOC7V.js → chunk-VVK4ECVJ.js} +2 -2
  154. package/dist/cli/chunks/{chunk-624QRKQX.js → chunk-VWRNG3UK.js} +1 -1
  155. package/dist/cli/chunks/{chunk-F3KS3TAB.js → chunk-VWSGWYRB.js} +2 -2
  156. package/dist/cli/chunks/{chunk-I7WAW7TM.js → chunk-W5A36V3Z.js} +2 -2
  157. package/dist/cli/chunks/chunk-WAWKAYPY.js +2 -0
  158. package/dist/cli/chunks/{chunk-NMY4KTWA.js → chunk-WLXGUQOZ.js} +2 -2
  159. package/dist/cli/chunks/{chunk-7VTKR44N.js → chunk-X3HM7SV4.js} +2 -2
  160. package/dist/cli/chunks/chunk-X6VYQVUM.js +2 -0
  161. package/dist/cli/chunks/{chunk-ZL5LJT7D.js → chunk-X7ZQIFES.js} +2 -2
  162. package/dist/cli/chunks/{chunk-5VUIXDY2.js → chunk-XOOBLZXR.js} +2 -2
  163. package/dist/cli/chunks/{chunk-L4D3TPFP.js → chunk-XZQVC3GD.js} +1 -1
  164. package/dist/cli/chunks/{chunk-BO7UFNYV.js → chunk-Y5ZBF7MA.js} +2 -2
  165. package/dist/cli/chunks/{chunk-ULCHPPW2.js → chunk-YNQPHRUZ.js} +1 -1
  166. package/dist/cli/chunks/{chunk-ZCP4P6O2.js → chunk-YRH7KMTU.js} +2 -2
  167. package/dist/cli/chunks/{chunk-QLKUCMZC.js → chunk-YTYS2XSY.js} +1 -1
  168. package/dist/cli/chunks/{chunk-JPJEAK4G.js → chunk-YUP3APSN.js} +1 -1
  169. package/dist/cli/chunks/{chunk-BXATKI5S.js → chunk-YVWMJZ6O.js} +2 -2
  170. package/dist/cli/chunks/{chunk-PS6WFCA4.js → chunk-Z3LDUPLQ.js} +2 -2
  171. package/dist/cli/chunks/{chunk-FOJRPEIP.js → chunk-ZBI7PJFX.js} +2 -2
  172. package/dist/cli/chunks/{chunk-NHRF3V4B.js → chunk-ZG7UKWBB.js} +2 -2
  173. package/dist/cli/chunks/{chunk-7XUB7U6Z.js → chunk-ZOHS32SI.js} +2 -2
  174. package/dist/cli/chunks/{chunk-RHIQ6QO5.js → chunk-ZOVAZTXE.js} +430 -430
  175. package/dist/cli/chunks/{chunk-7QVPMH25.js → chunk-ZWMFKZEQ.js} +2 -2
  176. package/dist/cli/chunks/{ci-GEJCXMBK.js → ci-7NUCRGWO.js} +2 -2
  177. package/dist/cli/chunks/{ci-config-2ZVV4OXL.js → ci-config-VQVECCFI.js} +2 -2
  178. package/dist/cli/chunks/{ci-output-E45OGVPR.js → ci-output-P7GQ6TKF.js} +2 -2
  179. package/dist/cli/chunks/{circuit-breaker-X73ITYZC.js → circuit-breaker-5YP6N6HE.js} +2 -2
  180. package/dist/cli/chunks/{claude-flow-setup-W4PPH46C.js → claude-flow-setup-W5H7CMU6.js} +2 -2
  181. package/dist/cli/chunks/client-RFUSQRUZ.js +2 -0
  182. package/dist/cli/chunks/{cline-installer-NUEPMWDE.js → cline-installer-OYANSZ54.js} +2 -2
  183. package/dist/cli/chunks/{code-6WQHBS7G.js → code-OMT4UEZI.js} +3 -3
  184. package/dist/cli/chunks/{code-index-extractor-BXQIFIFT.js → code-index-extractor-M2JEWKNF.js} +2 -2
  185. package/dist/cli/chunks/{codex-installer-Z337R2KH.js → codex-installer-YBS6N5O3.js} +2 -2
  186. package/dist/cli/chunks/{completions-F5DMYFHV.js → completions-U7GS5RG6.js} +2 -2
  187. package/dist/cli/chunks/{complexity-analyzer-W2SYPZDI.js → complexity-analyzer-QSXPIUIU.js} +2 -2
  188. package/dist/cli/chunks/{continuedev-installer-ZCHUIFTN.js → continuedev-installer-W5TTT743.js} +2 -2
  189. package/dist/cli/chunks/{copilot-installer-M5JNODXF.js → copilot-installer-KC2RT24C.js} +2 -2
  190. package/dist/cli/chunks/core-handlers-ZC7QB432.js +2 -0
  191. package/dist/cli/chunks/{cost-tracker-LSYTHBHV.js → cost-tracker-OQPVR6V4.js} +2 -2
  192. package/dist/cli/chunks/{coverage-PGMRS5SS.js → coverage-TCO2A2NX.js} +3 -3
  193. package/dist/cli/chunks/cross-domain-router-GRBK7YFZ.js +2 -0
  194. package/dist/cli/chunks/{cursor-installer-XPUA73UW.js → cursor-installer-MH7GWD4L.js} +2 -2
  195. package/dist/cli/chunks/daemon-JER6HE2J.js +12 -0
  196. package/dist/cli/chunks/{daemon-ITKDIYMW.js → daemon-UJEARJZ2.js} +3 -3
  197. package/dist/cli/chunks/{dag-attention-scheduler-T55AXLD6.js → dag-attention-scheduler-F3SUJU5O.js} +2 -2
  198. package/dist/cli/chunks/{detect-DR7J6K4O.js → detect-5QTCRB32.js} +2 -2
  199. package/dist/cli/chunks/{dist-node-LAJJBOUT.js → dist-node-XKZPHDBO.js} +2 -2
  200. package/dist/cli/chunks/{domain-handler-OMSHCRMK.js → domain-handler-V3UEADKW.js} +2 -2
  201. package/dist/cli/chunks/{domain-plugins-EQXSKC5K.js → domain-plugins-7PES4UHZ.js} +2 -2
  202. package/dist/cli/chunks/{domain-transfer-FKRAGVSW.js → domain-transfer-NF7UJW7B.js} +2 -2
  203. package/dist/cli/chunks/dream-VALD726W.js +2 -0
  204. package/dist/cli/chunks/{embed-and-insert-pattern-JZFPCNL3.js → embed-and-insert-pattern-D2HWORHF.js} +2 -2
  205. package/dist/cli/chunks/{eval-JSNNASBW.js → eval-UF2UBAUC.js} +2 -2
  206. package/dist/cli/chunks/{experience-capture-middleware-UPD3IZBK.js → experience-capture-middleware-2OUCEHHM.js} +3 -3
  207. package/dist/cli/chunks/{fast-paths-YNMIBS2E.js → fast-paths-KV5DKKHC.js} +2 -2
  208. package/dist/cli/chunks/{feature-flags-SRLXDKBI.js → feature-flags-6YWMTNO5.js} +2 -2
  209. package/dist/cli/chunks/{feature-flags-VIR7O4L7.js → feature-flags-MTW6NMR3.js} +2 -2
  210. package/dist/cli/chunks/file-discovery-VL73ASNI.js +2 -0
  211. package/dist/cli/chunks/{fleet-K2ED46EL.js → fleet-GJ66QFXK.js} +3 -3
  212. package/dist/cli/chunks/{gnn-wrapper-QCU4ZRYW.js → gnn-wrapper-52V6ANOY.js} +2 -2
  213. package/dist/cli/chunks/{heartbeat-handler-YYQI4WZM.js → heartbeat-handler-X7NHNRC7.js} +4 -4
  214. package/dist/cli/chunks/heartbeat-scheduler-FSX7A3ZA.js +2 -0
  215. package/dist/cli/chunks/hnsw-adapter-UX2QT6RL.js +2 -0
  216. package/dist/cli/chunks/hnsw-index-WRDDAMXH.js +2 -0
  217. package/dist/cli/chunks/{hnsw-legacy-bridge-C5TJSWTZ.js → hnsw-legacy-bridge-DZBE3KMK.js} +2 -2
  218. package/dist/cli/chunks/{hnswlib-node-SE3MJJYS.js → hnswlib-node-2AWWUJAZ.js} +2 -2
  219. package/dist/cli/chunks/{hooks-C572SRDH.js → hooks-XLPVROL3.js} +10 -10
  220. package/dist/cli/chunks/hybrid-backend-O67NGIB5.js +2 -0
  221. package/dist/cli/chunks/{hypergraph-engine-35A6G3M5.js → hypergraph-engine-6TI7YP6P.js} +2 -2
  222. package/dist/cli/chunks/{hypergraph-handler-U2756CWI.js → hypergraph-handler-DBIBBOXS.js} +3 -3
  223. package/dist/cli/chunks/impact-analyzer-6VXWWYWM.js +2 -0
  224. package/dist/cli/chunks/init-guard-OSO6MIDD.js +2 -0
  225. package/dist/cli/chunks/init-handler-7S7IHMUF.js +88 -0
  226. package/dist/cli/chunks/init-wizard-VH34J4TL.js +2 -0
  227. package/dist/cli/chunks/kernel-KJD24NO7.js +2 -0
  228. package/dist/cli/chunks/{kilocode-installer-32PX5YH7.js → kilocode-installer-2KBRFXMA.js} +2 -2
  229. package/dist/cli/chunks/{kiro-installer-C4ROMMUS.js → kiro-installer-5VFR4OQZ.js} +2 -2
  230. package/dist/cli/chunks/knowledge-graph-343O2HEZ.js +2 -0
  231. package/dist/cli/chunks/{learning-GEPVZGJQ.js → learning-G5NHL3DV.js} +20 -20
  232. package/dist/cli/chunks/{llm-router-XRKTTJTX.js → llm-router-4EAPPMHS.js} +4 -4
  233. package/dist/cli/chunks/llm-router-service-2M4BT2AO.js +2 -0
  234. package/dist/cli/chunks/{load-XVH6HW7E.js → load-UYMZPEY6.js} +2 -2
  235. package/dist/cli/chunks/load-test-OTQ2JQ5F.js +2 -0
  236. package/dist/cli/chunks/{mcp-IULSTM4Z.js → mcp-NOTDZBW5.js} +2 -2
  237. package/dist/cli/chunks/{memory-6K7IAU4T.js → memory-QL53YIHP.js} +5 -5
  238. package/dist/cli/chunks/memory-backend-4QSNRRV6.js +2 -0
  239. package/dist/cli/chunks/{memory-handlers-CG6DRLAW.js → memory-handlers-YFFYRSM6.js} +2 -2
  240. package/dist/cli/chunks/{multi-model-executor-VZDUYPLX.js → multi-model-executor-PDDDXF2B.js} +2 -2
  241. package/dist/cli/chunks/{opencode-installer-QUTXKNH4.js → opencode-installer-75D2SKOT.js} +2 -2
  242. package/dist/cli/chunks/{orchestrator-PCKKUWOP.js → orchestrator-3WIZBV4T.js} +5 -5
  243. package/dist/cli/chunks/pattern-null-store-5USH5MNR.js +2 -0
  244. package/dist/cli/chunks/{pattern-usage-recorder-PX5HQVRL.js → pattern-usage-recorder-TEX2JGHA.js} +2 -2
  245. package/dist/cli/chunks/{pipeline-O562GTOG.js → pipeline-7ATPA6LU.js} +2 -2
  246. package/dist/cli/chunks/{platform-PM7Q2AZS.js → platform-WPSKRJE7.js} +2 -2
  247. package/dist/cli/chunks/{plugin-OTYTFGPY.js → plugin-UUFOVVMU.js} +2 -2
  248. package/dist/cli/chunks/{prime-radiant-advanced-wasm-6CFXTHC2.js → prime-radiant-advanced-wasm-PDFSYWKZ.js} +2 -2
  249. package/dist/cli/chunks/project-root-SRTA6TBL.js +2 -0
  250. package/dist/cli/chunks/protocol-executor-4WYPCNBS.js +2 -0
  251. package/dist/cli/chunks/{protocol-handler-PPGNSAOS.js → protocol-handler-3VRYRIQB.js} +2 -2
  252. package/dist/cli/chunks/{prove-WQ3BKRZG.js → prove-2NAUROGF.js} +2 -2
  253. package/dist/cli/chunks/qe-reasoning-bank-I4D6SFS4.js +2 -0
  254. package/dist/cli/chunks/{quality-C5WUU3AA.js → quality-ZIEI2WGA.js} +2 -2
  255. package/dist/cli/chunks/{quality-gate-WSSRKD5U.js → quality-gate-KWJO4SWQ.js} +3 -3
  256. package/dist/cli/chunks/queen-coordinator-24UMTZTE.js +2 -0
  257. package/dist/cli/chunks/{real-embeddings-CFQE7IRQ.js → real-embeddings-TSZ4UIAE.js} +2 -2
  258. package/dist/cli/chunks/{ref-validation-DHKHXVZT.js → ref-validation-DWFFRETJ.js} +2 -2
  259. package/dist/cli/chunks/{roocode-installer-3PPODABV.js → roocode-installer-XTZHLUBO.js} +2 -2
  260. package/dist/cli/chunks/router-AUD4GATI.js +2 -0
  261. package/dist/cli/chunks/routing-feedback-2FE6SIKQ.js +2 -0
  262. package/dist/cli/chunks/{routing-handler-JNXTGT6T.js → routing-handler-GG525TDM.js} +2 -2
  263. package/dist/cli/chunks/{ruvector-commands-6YLROPVP.js → ruvector-commands-QKRJDM7Z.js} +2 -2
  264. package/dist/cli/chunks/rvf-dual-writer-P5LEUF25.js +2 -0
  265. package/dist/cli/chunks/rvf-migration-adapter-ZCYD5YJS.js +2 -0
  266. package/dist/cli/chunks/{rvf-migration-coordinator-4DWB4WRK.js → rvf-migration-coordinator-FF52OS6Q.js} +2 -2
  267. package/dist/cli/chunks/rvf-native-adapter-QGV6BW2W.js +2 -0
  268. package/dist/cli/chunks/{rvf-store-integrity-YKR2ZNBF.js → rvf-store-integrity-M6DXTAZ4.js} +2 -2
  269. package/dist/cli/chunks/safe-db-Q6JUKG2A.js +2 -0
  270. package/dist/cli/chunks/schedule-44OSMGE5.js +2 -0
  271. package/dist/cli/chunks/scheduler-V3HO2QQT.js +2 -0
  272. package/dist/cli/chunks/security-EHXSW22U.js +18 -0
  273. package/dist/cli/chunks/{shared-rvf-adapter-LNRLFP5I.js → shared-rvf-adapter-6EH7UVJL.js} +2 -2
  274. package/dist/cli/chunks/{shared-rvf-dual-writer-GWU6YQNS.js → shared-rvf-dual-writer-WML274E7.js} +2 -2
  275. package/dist/cli/chunks/sqlite-persistence-N5T7DWMR.js +2 -0
  276. package/dist/cli/chunks/{standalone-memory-46KKBSSV.js → standalone-memory-C7QKAXS4.js} +2 -2
  277. package/dist/cli/chunks/{status-handler-35T5FTDQ.js → status-handler-VLI7MRLM.js} +2 -2
  278. package/dist/cli/chunks/{structural-health-P7QPQWLO.js → structural-health-3LPG6MQN.js} +2 -2
  279. package/dist/cli/chunks/{sync-Y43EWBSY.js → sync-4IMMQEPT.js} +2 -2
  280. package/dist/cli/chunks/{sync-W6Z4R4PL.js → sync-JFJEJBVK.js} +2 -2
  281. package/dist/cli/chunks/{task-handler-5CX3ZYT7.js → task-handler-IED3K6E4.js} +2 -2
  282. package/dist/cli/chunks/{task-handlers-DQZGOJNE.js → task-handlers-FH6DNTHW.js} +3 -3
  283. package/dist/cli/chunks/{test-TPP53VVV.js → test-GPKT3CKZ.js} +4 -4
  284. package/dist/cli/chunks/{test-scheduling-WBV4UMQH.js → test-scheduling-Z42XXZP6.js} +3 -3
  285. package/dist/cli/chunks/{token-bootstrap-GIIDXHLC.js → token-bootstrap-HMM3AHXM.js} +2 -2
  286. package/dist/cli/chunks/{token-usage-AKK37RB7.js → token-usage-6Y2ERYIY.js} +2 -2
  287. package/dist/cli/chunks/{transformers-7MASPELS.js → transformers-MB63T2XO.js} +2 -2
  288. package/dist/cli/chunks/{tree-sitter-wasm-parser-YZKD6UGB.js → tree-sitter-wasm-parser-56GDQCMR.js} +2 -2
  289. package/dist/cli/chunks/{types-AZ3BTXDP.js → types-J4J6QV3I.js} +2 -2
  290. package/dist/cli/chunks/unified-memory-RQ3Q4CU3.js +2 -0
  291. package/dist/cli/chunks/unified-memory-hnsw-ZOP5FEYX.js +2 -0
  292. package/dist/cli/chunks/unified-persistence-72OCJJKK.js +2 -0
  293. package/dist/cli/chunks/{upgrade-L7OTDKEK.js → upgrade-U4XU7LFM.js} +2 -2
  294. package/dist/cli/chunks/{validate-O3QVFIGP.js → validate-B57HA4YK.js} +2 -2
  295. package/dist/cli/chunks/{validate-swarm-2UGBGLTX.js → validate-swarm-UPPA4M6T.js} +2 -2
  296. package/dist/cli/chunks/visual-security-7F5UV23J.js +2 -0
  297. package/dist/cli/chunks/{web-tree-sitter-J75IYPRO.js → web-tree-sitter-GDZMUKOZ.js} +2 -2
  298. package/dist/cli/chunks/{windsurf-installer-FQ5DBFCG.js → windsurf-installer-VJRWCHXP.js} +2 -2
  299. package/dist/cli/chunks/witness-chain-KZ57QUFE.js +2 -0
  300. package/dist/cli/chunks/{witness-chain-I7TN4MXZ.js → witness-chain-LFASSMZK.js} +2 -2
  301. package/dist/cli/chunks/{witness-chain-repair-D3NE3NQK.js → witness-chain-repair-TPHN4DXN.js} +2 -2
  302. package/dist/cli/chunks/{witness-chain-verifier-RU2WOP5M.js → witness-chain-verifier-Z23FVABW.js} +2 -2
  303. package/dist/cli/chunks/{witness-key-manager-IHQB2FR5.js → witness-key-manager-745MJ7WO.js} +2 -2
  304. package/dist/cli/chunks/{workflow-6BWTNVV6.js → workflow-T245QNQM.js} +4 -4
  305. package/dist/cli/chunks/workflow-orchestrator-ZNWEUYBN.js +2 -0
  306. package/dist/cli/chunks/{wrappers-URVP25VU.js → wrappers-WCAYIQUX.js} +2 -2
  307. package/dist/cli/commands/learning.js +3 -2
  308. package/dist/cli/commands/security.d.ts +16 -0
  309. package/dist/cli/commands/security.js +76 -9
  310. package/dist/cli/handlers/init-guard.d.ts +21 -1
  311. package/dist/cli/handlers/init-guard.js +51 -8
  312. package/dist/cli/handlers/init-handler.js +57 -56
  313. package/dist/cli/index.js +11 -0
  314. package/dist/cli/utils/ci-output.d.ts +5 -0
  315. package/dist/cli/utils/ci-output.js +8 -0
  316. package/dist/coordination/handlers/security-handlers.js +22 -6
  317. package/dist/coordination/protocols/defect-investigation.js +7 -1
  318. package/dist/coordination/protocols/learning-consolidation.js +6 -12
  319. package/dist/coordination/protocols/security-audit.js +11 -0
  320. package/dist/coordination/result-saver.d.ts +9 -0
  321. package/dist/coordination/result-saver.js +34 -4
  322. package/dist/domains/coverage-analysis/collected-metrics.d.ts +2 -0
  323. package/dist/domains/coverage-analysis/collected-metrics.js +8 -1
  324. package/dist/domains/defect-intelligence/services/defect-predictor.js +9 -6
  325. package/dist/domains/learning-optimization/active-patterns.d.ts +55 -0
  326. package/dist/domains/learning-optimization/active-patterns.js +77 -0
  327. package/dist/domains/learning-optimization/coordinator.js +12 -9
  328. package/dist/domains/learning-optimization/services/learning-coordinator.js +15 -17
  329. package/dist/domains/quality-assessment/interfaces.d.ts +4 -0
  330. package/dist/domains/quality-assessment/quality-evidence.d.ts +1 -1
  331. package/dist/domains/quality-assessment/services/quality-analyzer.js +7 -5
  332. package/dist/domains/quality-assessment/services/quality-gate.js +12 -3
  333. package/dist/domains/security-compliance/dependency-advisory-engine.d.ts +52 -0
  334. package/dist/domains/security-compliance/dependency-advisory-engine.js +113 -0
  335. package/dist/domains/security-compliance/interfaces.d.ts +30 -0
  336. package/dist/domains/security-compliance/plugin.d.ts +7 -1
  337. package/dist/domains/security-compliance/plugin.js +19 -0
  338. package/dist/domains/security-compliance/services/scanners/dependency-resolver.d.ts +71 -0
  339. package/dist/domains/security-compliance/services/scanners/dependency-resolver.js +232 -0
  340. package/dist/domains/security-compliance/services/scanners/dependency-scanner.d.ts +21 -6
  341. package/dist/domains/security-compliance/services/scanners/dependency-scanner.js +142 -64
  342. package/dist/domains/security-compliance/services/scanners/lockfile-versions.d.ts +43 -0
  343. package/dist/domains/security-compliance/services/scanners/lockfile-versions.js +248 -0
  344. package/dist/domains/security-compliance/services/scanners/scanner-types.d.ts +30 -2
  345. package/dist/domains/security-compliance/services/security-auditor.d.ts +19 -6
  346. package/dist/domains/security-compliance/services/security-auditor.js +133 -92
  347. package/dist/domains/test-execution/services/retry-handler.js +34 -7
  348. package/dist/domains/test-execution/services/test-executor.d.ts +1 -0
  349. package/dist/domains/test-execution/services/test-executor.js +87 -7
  350. package/dist/kernel/shared-dirs.js +17 -5
  351. package/dist/learning/dream/dream-engine.d.ts +27 -1
  352. package/dist/learning/dream/dream-engine.js +56 -2
  353. package/dist/learning/dream/rvcow-branch-manager.d.ts +8 -0
  354. package/dist/learning/dream/rvcow-branch-manager.js +8 -0
  355. package/dist/learning/dream/speculative-dreamer.d.ts +8 -0
  356. package/dist/learning/dream/speculative-dreamer.js +8 -0
  357. package/dist/mcp/background-workers.d.ts +15 -0
  358. package/dist/mcp/background-workers.js +71 -0
  359. package/dist/mcp/bundle.js +881 -878
  360. package/dist/mcp/entry.js +4 -49
  361. package/dist/mcp/handlers/domain-handler-configs.d.ts +4 -0
  362. package/dist/mcp/handlers/domain-handler-configs.js +5 -1
  363. package/dist/mcp/protocol-server.js +2 -1
  364. package/dist/mcp/types.d.ts +6 -0
  365. package/dist/shared/security/index.d.ts +2 -2
  366. package/dist/shared/security/index.js +1 -1
  367. package/dist/shared/security/osv-client.d.ts +79 -132
  368. package/dist/shared/security/osv-client.js +344 -167
  369. package/dist/shared/security/osv-lookup.d.ts +124 -0
  370. package/dist/shared/security/osv-lookup.js +246 -0
  371. package/dist/shared/security/osv-types.d.ts +119 -0
  372. package/dist/shared/security/osv-types.js +6 -0
  373. package/dist/workers/daemon.d.ts +5 -0
  374. package/dist/workers/daemon.js +16 -2
  375. package/dist/workers/interfaces.d.ts +6 -1
  376. package/dist/workers/namespaced-keys.d.ts +16 -0
  377. package/dist/workers/namespaced-keys.js +24 -0
  378. package/dist/workers/quality-daemon/persistent-memory.d.ts +1 -1
  379. package/dist/workers/quality-daemon/persistent-memory.js +2 -2
  380. package/dist/workers/worker-env.d.ts +45 -0
  381. package/dist/workers/worker-env.js +76 -0
  382. package/dist/workers/worker-manager.js +5 -2
  383. package/dist/workers/workers/defect-predictor.d.ts +25 -8
  384. package/dist/workers/workers/defect-predictor.js +223 -216
  385. package/dist/workers/workers/learning-consolidation.d.ts +20 -0
  386. package/dist/workers/workers/learning-consolidation.js +53 -22
  387. package/dist/workers/workers/performance-baseline.d.ts +24 -9
  388. package/dist/workers/workers/performance-baseline.js +187 -230
  389. package/dist/workers/workers/quality-gate.d.ts +11 -9
  390. package/dist/workers/workers/quality-gate.js +125 -267
  391. package/dist/workers/workers/security-scan-records.d.ts +111 -0
  392. package/dist/workers/workers/security-scan-records.js +128 -0
  393. package/dist/workers/workers/security-scan.d.ts +25 -7
  394. package/dist/workers/workers/security-scan.js +187 -164
  395. package/package.json +2 -2
  396. package/dist/cli/chunks/adapter-PP3XIXDV.js +0 -2
  397. package/dist/cli/chunks/aqe-learning-engine-VDUQJKKY.js +0 -2
  398. package/dist/cli/chunks/base-QSYWWPCE.js +0 -2
  399. package/dist/cli/chunks/browser-workflow-WXXPBSCM.js +0 -2
  400. package/dist/cli/chunks/chunk-45MVRQG4.js +0 -2
  401. package/dist/cli/chunks/chunk-5VZVMO7B.js +0 -3
  402. package/dist/cli/chunks/chunk-EECF4CMA.js +0 -2
  403. package/dist/cli/chunks/client-6XKSQ4JT.js +0 -2
  404. package/dist/cli/chunks/core-handlers-OJYW4Y6M.js +0 -2
  405. package/dist/cli/chunks/cross-domain-router-QVUPQ2SC.js +0 -2
  406. package/dist/cli/chunks/daemon-QBYTCIMH.js +0 -10
  407. package/dist/cli/chunks/dream-3UABDRZJ.js +0 -2
  408. package/dist/cli/chunks/file-discovery-ZFGZTKZ4.js +0 -2
  409. package/dist/cli/chunks/heartbeat-scheduler-MJ6MTPDF.js +0 -2
  410. package/dist/cli/chunks/hnsw-adapter-FQWJCFVW.js +0 -2
  411. package/dist/cli/chunks/hnsw-index-NJYKJUHC.js +0 -2
  412. package/dist/cli/chunks/hybrid-backend-SL7RFID7.js +0 -2
  413. package/dist/cli/chunks/impact-analyzer-5ZJTXPVC.js +0 -2
  414. package/dist/cli/chunks/init-handler-PCLYQUSB.js +0 -88
  415. package/dist/cli/chunks/init-wizard-MQMDSIOF.js +0 -2
  416. package/dist/cli/chunks/kernel-MEJ5GMRH.js +0 -2
  417. package/dist/cli/chunks/knowledge-graph-XUBZSEZE.js +0 -2
  418. package/dist/cli/chunks/llm-router-service-QZAPAEPX.js +0 -2
  419. package/dist/cli/chunks/load-test-OVXIQ3AF.js +0 -2
  420. package/dist/cli/chunks/memory-backend-TRPOMPK4.js +0 -2
  421. package/dist/cli/chunks/pattern-null-store-JWYBRBZG.js +0 -2
  422. package/dist/cli/chunks/project-root-VVSTHIP4.js +0 -2
  423. package/dist/cli/chunks/protocol-executor-PXZCLZD3.js +0 -2
  424. package/dist/cli/chunks/qe-reasoning-bank-42FRS5V3.js +0 -2
  425. package/dist/cli/chunks/queen-coordinator-UI3B7DI6.js +0 -2
  426. package/dist/cli/chunks/router-HYRPWLAY.js +0 -2
  427. package/dist/cli/chunks/routing-feedback-BPZ5R6F3.js +0 -2
  428. package/dist/cli/chunks/rvf-dual-writer-DEKDQ6KO.js +0 -2
  429. package/dist/cli/chunks/rvf-migration-adapter-L53VBS7I.js +0 -2
  430. package/dist/cli/chunks/rvf-native-adapter-I6RUGD2D.js +0 -2
  431. package/dist/cli/chunks/safe-db-KS65XDCP.js +0 -2
  432. package/dist/cli/chunks/schedule-KD2VN6GB.js +0 -2
  433. package/dist/cli/chunks/scheduler-ZH3RMUHY.js +0 -2
  434. package/dist/cli/chunks/security-PWQTGDRU.js +0 -13
  435. package/dist/cli/chunks/sqlite-persistence-6DTVME5D.js +0 -2
  436. package/dist/cli/chunks/unified-memory-FCX7NLFZ.js +0 -2
  437. package/dist/cli/chunks/unified-memory-hnsw-VU5QJK37.js +0 -2
  438. package/dist/cli/chunks/unified-persistence-FM376LGE.js +0 -2
  439. package/dist/cli/chunks/visual-security-EU7Y3X46.js +0 -2
  440. package/dist/cli/chunks/witness-chain-CSEBT52D.js +0 -2
  441. package/dist/cli/chunks/workflow-orchestrator-ALNKOM3N.js +0 -2
@@ -137,6 +137,12 @@ export class SecurityAuditProtocol {
137
137
  if (depResult.success) {
138
138
  this.currentAudit = { ...this.currentAudit, dependencyResult: depResult.value };
139
139
  await this.publishDependencyVulnerabilities(depResult.value.vulnerabilities);
140
+ // #1049: a failed or partial advisory lookup (or a result without a
141
+ // status, which cannot show it was complete) is not a clean dependency scan.
142
+ if (depResult.value.status !== 'complete') {
143
+ this.recordIncompleteCheck(depResult.value.error
144
+ ?? `Dependency advisories could not be checked for ${depResult.value.uncheckedPackages?.length ?? 'unknown number of'} package(s)`);
145
+ }
140
146
  }
141
147
  else {
142
148
  this.recordIncompleteCheck('Dependency scan did not complete');
@@ -280,6 +286,11 @@ export class SecurityAuditProtocol {
280
286
  vulnerabilities: scanResult.value.vulnerabilities,
281
287
  outdatedPackages: [],
282
288
  summary: scanResult.value.summary,
289
+ status: scanResult.value.status,
290
+ measured: scanResult.value.measured,
291
+ packagesChecked: scanResult.value.packagesChecked,
292
+ uncheckedPackages: scanResult.value.uncheckedPackages,
293
+ ...(scanResult.value.error ? { error: scanResult.value.error } : {}),
283
294
  });
284
295
  }
285
296
  }
@@ -88,6 +88,15 @@ export declare class ResultSaver {
88
88
  * `name-1.ext`, `name-2.ext`, … instead of replacing the earlier file (#1007).
89
89
  */
90
90
  private writeNewFile;
91
+ /**
92
+ * File name for a generated test source: the sanitized name capped at
93
+ * MAX_GENERATED_STEM_LENGTH characters (a long source file name would
94
+ * otherwise exceed the filesystem's 255-byte limit once the temp-file suffix
95
+ * is added) plus a short hash of the source path and full name. The hash keeps
96
+ * `src/one/math.ts` and `src/two/math.ts` (or a truncated long name) from
97
+ * overwriting each other, while the same test still maps to the same file.
98
+ */
99
+ private generatedTestFilename;
91
100
  private sanitizeFilename;
92
101
  private getTestExtension;
93
102
  private createFileEntry;
@@ -7,6 +7,8 @@ import * as path from 'path';
7
7
  import { createHash, randomBytes } from 'crypto';
8
8
  import { safeJsonParse } from '../shared/safe-json.js';
9
9
  import { getProjectStorePath } from '../kernel/project-root.js';
10
+ /** Cap on the sanitized stem of a generated test file name (see generatedTestFilename). */
11
+ const MAX_GENERATED_STEM_LENGTH = 100;
10
12
  function securityReportExecution(data) {
11
13
  return data.evidence?.completeness === 'complete' ? 'completed'
12
14
  : data.evidence?.completeness === 'partial' ? 'partial'
@@ -174,14 +176,26 @@ export class ResultSaver {
174
176
  // Save individual test files if code is provided
175
177
  if (data.tests) {
176
178
  for (const test of data.tests) {
177
- if (test.code) {
179
+ // The test-generation domain returns `testCode`; retain `code` for
180
+ // older callers of ResultSaver that already use that field.
181
+ const code = test.testCode ?? test.code;
182
+ if (code) {
178
183
  const ext = this.getTestExtension(options.language || 'typescript', options.framework || 'vitest');
179
- const testFilename = this.sanitizeFilename(test.name) + ext;
184
+ const testFilename = this.generatedTestFilename(test, ext);
180
185
  const testPath = path.join(testDir, testFilename);
181
186
  // Review of #1026 N7: a generated test keeps one file per test name
182
187
  // (replaced atomically), unlike reports, so numbered copies never
183
188
  // pile up for a test runner to collect.
184
- files.push(await this.replaceFile(testPath, test.code, 'source'));
189
+ //
190
+ // One unwritable source file (e.g. a name the filesystem rejects)
191
+ // must not discard the manifest and report, so a per-file failure is
192
+ // skipped; `files` then lists only what is actually on disk.
193
+ try {
194
+ files.push(await this.replaceFile(testPath, code, 'source'));
195
+ }
196
+ catch (error) {
197
+ console.warn(`ResultSaver: could not write generated test ${testFilename}: ${error.message}`);
198
+ }
185
199
  }
186
200
  }
187
201
  }
@@ -504,7 +518,7 @@ ${data.recommendations.length === 0 ? noRecommendations : data.recommendations.m
504
518
  // ==========================================================================
505
519
  // Utilities
506
520
  // ==========================================================================
507
- async ensureDirectories(taskType) {
521
+ async ensureDirectories(_taskType) {
508
522
  const dirs = [
509
523
  this.resultsDir,
510
524
  path.join(this.resultsDir, 'security'),
@@ -563,6 +577,22 @@ ${data.recommendations.length === 0 ? noRecommendations : data.recommendations.m
563
577
  }
564
578
  throw new Error(`ResultSaver: no free file name for ${filePath}`);
565
579
  }
580
+ /**
581
+ * File name for a generated test source: the sanitized name capped at
582
+ * MAX_GENERATED_STEM_LENGTH characters (a long source file name would
583
+ * otherwise exceed the filesystem's 255-byte limit once the temp-file suffix
584
+ * is added) plus a short hash of the source path and full name. The hash keeps
585
+ * `src/one/math.ts` and `src/two/math.ts` (or a truncated long name) from
586
+ * overwriting each other, while the same test still maps to the same file.
587
+ */
588
+ generatedTestFilename(test, ext) {
589
+ const stem = this.sanitizeFilename(test.name).slice(0, MAX_GENERATED_STEM_LENGTH) || 'test';
590
+ const hash = createHash('sha256')
591
+ .update(`${test.file ?? ''}\0${test.name}`)
592
+ .digest('hex')
593
+ .slice(0, 8);
594
+ return `${stem}-${hash}${ext}`;
595
+ }
566
596
  sanitizeFilename(name) {
567
597
  return name.replace(/[^a-zA-Z0-9_-]/g, '_').toLowerCase();
568
598
  }
@@ -14,6 +14,8 @@ import type { CoverageSummary, FileCoverage } from './interfaces';
14
14
  * (or the cwd when none is known), so one file never has two records.
15
15
  */
16
16
  export declare function fileCoverageKey(filePath: string, projectRoot?: string): string;
17
+ /** Read the canonical key first, then a measured legacy relative key if present. */
18
+ export declare function fileCoverageLookupKeys(filePath: string, projectRoot?: string): string[];
17
19
  export interface CollectedMetrics {
18
20
  branch: boolean;
19
21
  function: boolean;
@@ -7,6 +7,7 @@
7
7
  * null — never as 0% (a fake low figure) nor as istanbul's 0/0 = 100%.
8
8
  */
9
9
  import * as path from 'path';
10
+ import { findProjectRoot } from '../../kernel/project-root.js';
10
11
  /**
11
12
  * The ONE key form for per-file coverage records (#1027 N7): the absolute
12
13
  * path. Reports write absolute (istanbul) or project-relative (lcov
@@ -14,7 +15,13 @@ import * as path from 'path';
14
15
  * (or the cwd when none is known), so one file never has two records.
15
16
  */
16
17
  export function fileCoverageKey(filePath, projectRoot) {
17
- return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(projectRoot ?? process.cwd(), filePath);
18
+ return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(projectRoot ?? findProjectRoot(), filePath);
19
+ }
20
+ /** Read the canonical key first, then a measured legacy relative key if present. */
21
+ export function fileCoverageLookupKeys(filePath, projectRoot) {
22
+ const canonical = `coverage:file:${fileCoverageKey(filePath, projectRoot)}`;
23
+ const legacy = `coverage:file:${filePath}`;
24
+ return canonical === legacy ? [canonical] : [canonical, legacy];
18
25
  }
19
26
  /** Which optional metrics the files carry. Line coverage is always collected. */
20
27
  export function collectedMetrics(files) {
@@ -15,6 +15,7 @@ import { toError } from '../../../shared/error-utils.js';
15
15
  import { safeJsonParse } from '../../../shared/safe-json.js';
16
16
  import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
17
17
  import { measuredCoverageSummary, measuredFileCoverage } from '../../quality-assessment/coverage-report-event.js';
18
+ import { fileCoverageLookupKeys } from '../../coverage-analysis/collected-metrics.js';
18
19
  // LLMDefectAnalysis is imported from ../interfaces
19
20
  const DEFAULT_CONFIG = {
20
21
  defaultThreshold: 0.5,
@@ -161,7 +162,7 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
161
162
  }
162
163
  return null;
163
164
  }
164
- catch (error) {
165
+ catch {
165
166
  logger.warn('LLM analysis failed, using heuristics only');
166
167
  return null;
167
168
  }
@@ -498,7 +499,7 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
498
499
  // Count complexity indicators in code
499
500
  const content = fileResult.value;
500
501
  const ifCount = (content.match(/\bif\s*\(/g) || []).length;
501
- const loopCount = (content.match(/\b(for|while|do)\s*[\(\{]/g) || []).length;
502
+ const loopCount = (content.match(/\b(for|while|do)\s*[{(]/g) || []).length;
502
503
  const switchCount = (content.match(/\bswitch\s*\(/g) || []).length;
503
504
  const catchCount = (content.match(/\bcatch\s*\(/g) || []).length;
504
505
  const ternaryCount = (content.match(/\?[^?:]+:/g) || []).length;
@@ -592,10 +593,12 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
592
593
  try {
593
594
  // Try per-file coverage (written by coverage-analyzer and test-executor)
594
595
  // #1014: only measured records; legacy unstamped estimates are ignored.
595
- const fileCoverage = measuredFileCoverage(await this.memory.get(`coverage:file:${file}`));
596
- if (fileCoverage) {
597
- // Invert: low coverage = high defect risk
598
- return 1 - fileCoverage.line / 100;
596
+ for (const key of fileCoverageLookupKeys(file)) {
597
+ const fileCoverage = measuredFileCoverage(await this.memory.get(key));
598
+ if (fileCoverage) {
599
+ // Invert: low coverage = high defect risk
600
+ return 1 - fileCoverage.line / 100;
601
+ }
599
602
  }
600
603
  // Fall back to project-wide coverage
601
604
  const summary = measuredCoverageSummary(await this.memory.get('coverage:latest'));
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Agentic QE v3 - Active learned-pattern reads (#1055)
3
+ *
4
+ * Active learned patterns live at `learning:pattern:<id>`. The same prefix
5
+ * also holds records that are NOT active patterns:
6
+ *
7
+ * - `learning:pattern:creation:<id>`: creation provenance written by
8
+ * `LearningCoordinatorService.recordPatternCreation()` (no `context`)
9
+ * - `learning:pattern:archived:<id>`: archived patterns written by
10
+ * `LearningCoordinatorService.archivePattern()` and the
11
+ * learning-consolidation protocol (full pattern shape)
12
+ *
13
+ * Every reader of active patterns must go through this module so that
14
+ * provenance and archives are excluded before `get()`, and so that those rows
15
+ * cannot use up the search cap and push active patterns out. Records stay
16
+ * untouched; this is read-side classification only.
17
+ */
18
+ import type { MemoryBackend, RetrieveOptions } from '../../kernel/interfaces.js';
19
+ import type { LearnedPattern } from './interfaces.js';
20
+ export declare const LEARNING_PATTERN_KEY_PREFIX = "learning:pattern:";
21
+ /** Sub-key families under the pattern prefix that are not active patterns. */
22
+ export declare const NON_ACTIVE_PATTERN_SEGMENTS: readonly string[];
23
+ /**
24
+ * Key-scan cap for active pattern reads. Keys are cheap to list, and only
25
+ * active keys are fetched, so the cap is set well above realistic store
26
+ * sizes. When it is reached, `onTruncated` is called.
27
+ */
28
+ export declare const ACTIVE_PATTERN_KEY_SCAN_LIMIT = 10000;
29
+ /**
30
+ * True when the key is in the active pattern key family
31
+ * (`learning:pattern:<id>`), false for provenance, archives and any other
32
+ * non-active sub-key.
33
+ */
34
+ export declare function isActivePatternKey(key: string): boolean;
35
+ /**
36
+ * Shape guard for a record read from an active key: it must be an object
37
+ * whose own id maps back to that key, and it must carry a `context` object.
38
+ */
39
+ export declare function isActivePatternRecord(key: string, value: unknown): value is LearnedPattern;
40
+ export interface ReadActivePatternsOptions {
41
+ /** Namespace passed to `search()` and `get()`. Omit for the backend default. */
42
+ retrieve?: RetrieveOptions;
43
+ /** Override the key-scan cap (tests). */
44
+ scanLimit?: number;
45
+ /** Called when the key scan hit the cap, so results may be incomplete. */
46
+ onTruncated?: (scanned: number) => void;
47
+ }
48
+ /**
49
+ * Read every active learned pattern: list keys, drop non-active key families
50
+ * before `get()`, then drop records that fail the shape guard. Date fields
51
+ * come back from kv as ISO strings and are rehydrated (#491 Bug 3), so
52
+ * `TimeRange.contains(pattern.createdAt)` works for every reader.
53
+ */
54
+ export declare function readActivePatterns(memory: MemoryBackend, options?: ReadActivePatternsOptions): Promise<LearnedPattern[]>;
55
+ //# sourceMappingURL=active-patterns.d.ts.map
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Agentic QE v3 - Active learned-pattern reads (#1055)
3
+ *
4
+ * Active learned patterns live at `learning:pattern:<id>`. The same prefix
5
+ * also holds records that are NOT active patterns:
6
+ *
7
+ * - `learning:pattern:creation:<id>`: creation provenance written by
8
+ * `LearningCoordinatorService.recordPatternCreation()` (no `context`)
9
+ * - `learning:pattern:archived:<id>`: archived patterns written by
10
+ * `LearningCoordinatorService.archivePattern()` and the
11
+ * learning-consolidation protocol (full pattern shape)
12
+ *
13
+ * Every reader of active patterns must go through this module so that
14
+ * provenance and archives are excluded before `get()`, and so that those rows
15
+ * cannot use up the search cap and push active patterns out. Records stay
16
+ * untouched; this is read-side classification only.
17
+ */
18
+ import { rehydrateDates } from '../../shared/utils/kv-date-rehydrate.js';
19
+ export const LEARNING_PATTERN_KEY_PREFIX = 'learning:pattern:';
20
+ /** Sub-key families under the pattern prefix that are not active patterns. */
21
+ export const NON_ACTIVE_PATTERN_SEGMENTS = ['creation', 'archived'];
22
+ /**
23
+ * Key-scan cap for active pattern reads. Keys are cheap to list, and only
24
+ * active keys are fetched, so the cap is set well above realistic store
25
+ * sizes. When it is reached, `onTruncated` is called.
26
+ */
27
+ export const ACTIVE_PATTERN_KEY_SCAN_LIMIT = 10_000;
28
+ /**
29
+ * True when the key is in the active pattern key family
30
+ * (`learning:pattern:<id>`), false for provenance, archives and any other
31
+ * non-active sub-key.
32
+ */
33
+ export function isActivePatternKey(key) {
34
+ if (!key.startsWith(LEARNING_PATTERN_KEY_PREFIX))
35
+ return false;
36
+ const rest = key.slice(LEARNING_PATTERN_KEY_PREFIX.length);
37
+ if (rest.length === 0)
38
+ return false;
39
+ const firstSegment = rest.split(':', 1)[0];
40
+ return !NON_ACTIVE_PATTERN_SEGMENTS.includes(firstSegment);
41
+ }
42
+ /**
43
+ * Shape guard for a record read from an active key: it must be an object
44
+ * whose own id maps back to that key, and it must carry a `context` object.
45
+ */
46
+ export function isActivePatternRecord(key, value) {
47
+ if (!value || typeof value !== 'object')
48
+ return false;
49
+ const record = value;
50
+ if (typeof record.id !== 'string' || key !== `${LEARNING_PATTERN_KEY_PREFIX}${record.id}`) {
51
+ return false;
52
+ }
53
+ return !!record.context && typeof record.context === 'object';
54
+ }
55
+ /**
56
+ * Read every active learned pattern: list keys, drop non-active key families
57
+ * before `get()`, then drop records that fail the shape guard. Date fields
58
+ * come back from kv as ISO strings and are rehydrated (#491 Bug 3), so
59
+ * `TimeRange.contains(pattern.createdAt)` works for every reader.
60
+ */
61
+ export async function readActivePatterns(memory, options = {}) {
62
+ const limit = options.scanLimit ?? ACTIVE_PATTERN_KEY_SCAN_LIMIT;
63
+ const keys = await memory.search(`${LEARNING_PATTERN_KEY_PREFIX}*`, limit, options.retrieve);
64
+ if (keys.length >= limit)
65
+ options.onTruncated?.(keys.length);
66
+ const patterns = [];
67
+ for (const key of keys) {
68
+ if (!isActivePatternKey(key))
69
+ continue;
70
+ const value = await memory.get(key, options.retrieve);
71
+ if (isActivePatternRecord(key, value)) {
72
+ patterns.push(rehydrateDates(value, ['createdAt', 'lastUsedAt']));
73
+ }
74
+ }
75
+ return patterns;
76
+ }
77
+ //# sourceMappingURL=active-patterns.js.map
@@ -3,6 +3,7 @@
3
3
  * Orchestrates learning workflows across all QE domains
4
4
  */
5
5
  import { LoggerFactory } from '../../logging/index.js';
6
+ import { readActivePatterns } from './active-patterns.js';
6
7
  import { v4 as uuidv4 } from 'uuid';
7
8
  import { toError } from '../../shared/error-utils.js';
8
9
  import { rehydrateDates } from '../../shared/utils/kv-date-rehydrate.js';
@@ -739,17 +740,19 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
739
740
  const patterns = [];
740
741
  const knowledge = [];
741
742
  const strategies = [];
742
- // Export patterns
743
- for (const _domain of targetDomains) {
744
- const patternKeys = await this.memory.search(`learning:pattern:*`, 500);
745
- for (const key of patternKeys) {
746
- const pattern = await this.memory.get(key);
747
- if (pattern && targetDomains.includes(pattern.domain)) {
748
- patterns.push(pattern);
749
- }
743
+ // Export patterns (#1055: active patterns only — creation provenance
744
+ // and archives share the `learning:pattern:` prefix). One read covers
745
+ // every target domain; the previous per-domain loop exported each
746
+ // pattern once per target domain.
747
+ const activePatterns = await readActivePatterns(this.memory, {
748
+ onTruncated: (scanned) => logger.warn('Pattern export key scan hit its cap; export may be incomplete', { scanned }),
749
+ });
750
+ for (const pattern of activePatterns) {
751
+ if (targetDomains.includes(pattern.domain)) {
752
+ patterns.push(pattern);
750
753
  }
751
- this.updateWorkflowProgress(workflowId, Math.round((patterns.length / 100) * 30));
752
754
  }
755
+ this.updateWorkflowProgress(workflowId, 30);
753
756
  // Export knowledge
754
757
  const knowledgeResult = await this.transferService.queryKnowledge({
755
758
  limit: 1000,
@@ -7,6 +7,7 @@ import { v4 as uuidv4 } from 'uuid';
7
7
  import { ok, err } from '../../../shared/types/index.js';
8
8
  import { rehydrateDates } from '../../../shared/utils/kv-date-rehydrate.js';
9
9
  import { toError } from '../../../shared/error-utils.js';
10
+ import { readActivePatterns } from '../active-patterns.js';
10
11
  import { createQEFlashAttention, } from '../../../integrations/ruvector/wrappers.js';
11
12
  import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
12
13
  import { createSafeRecord } from '../../../shared/utils/safe-record.js';
@@ -33,6 +34,16 @@ const logger = LoggerFactory.create('learning-optimization/learning-coordinator'
33
34
  * domain even on installs with hundreds of indexed experiences.
34
35
  */
35
36
  const LEARNING_NS = { namespace: 'learning-optimization' };
37
+ /**
38
+ * #1055: active patterns only. `learning:pattern:*` also holds creation
39
+ * provenance and archived patterns written by this service.
40
+ */
41
+ function readActiveLearnedPatterns(memory) {
42
+ return readActivePatterns(memory, {
43
+ retrieve: LEARNING_NS,
44
+ onTruncated: (scanned) => logger.warn('Active pattern key scan hit its cap; results may be incomplete', { scanned }),
45
+ });
46
+ }
36
47
  export class LearningCoordinatorService {
37
48
  config;
38
49
  memory;
@@ -251,14 +262,7 @@ Provide:
251
262
  */
252
263
  async findMatchingPatterns(context, limit = 10) {
253
264
  try {
254
- const patterns = [];
255
- const keys = await this.memory.search('learning:pattern:*', 100, LEARNING_NS);
256
- for (const key of keys) {
257
- const pattern = await this.memory.get(key, LEARNING_NS);
258
- if (pattern && this.matchesContext(pattern, context)) {
259
- patterns.push(pattern);
260
- }
261
- }
265
+ const patterns = (await readActiveLearnedPatterns(this.memory)).filter((pattern) => this.matchesContext(pattern, context));
262
266
  // Sort by confidence and usage
263
267
  patterns.sort((a, b) => {
264
268
  const scoreA = a.confidence * 0.6 + (a.successRate * 0.4);
@@ -384,14 +388,7 @@ Provide:
384
388
  */
385
389
  async getPatternStats(domain) {
386
390
  try {
387
- const keys = await this.memory.search('learning:pattern:*', 500, LEARNING_NS);
388
- const patterns = [];
389
- for (const key of keys) {
390
- const pattern = await this.memory.get(key, LEARNING_NS);
391
- if (pattern && (!domain || pattern.domain === domain)) {
392
- patterns.push(pattern);
393
- }
394
- }
391
+ const patterns = (await readActiveLearnedPatterns(this.memory)).filter((pattern) => !domain || pattern.domain === domain);
395
392
  const byType = {
396
393
  'test-pattern': 0,
397
394
  'fix-pattern': 0,
@@ -761,7 +758,8 @@ Provide:
761
758
  return false;
762
759
  }
763
760
  if (context.tags.length > 0) {
764
- const hasMatchingTag = context.tags.some((tag) => pattern.context.tags.includes(tag));
761
+ const patternTags = Array.isArray(pattern.context.tags) ? pattern.context.tags : [];
762
+ const hasMatchingTag = context.tags.some((tag) => patternTags.includes(tag));
765
763
  if (!hasMatchingTag) {
766
764
  return false;
767
765
  }
@@ -56,6 +56,10 @@ export interface GateResult {
56
56
  checks: GateCheck[];
57
57
  overallScore: number;
58
58
  failedChecks: string[];
59
+ /** Gate service evidence state; absent for other gate implementations. */
60
+ evidenceStatus?: 'measured' | 'insufficient-evidence';
61
+ /** Configured checks whose input was missing, negative, or non-finite. */
62
+ unmeasured?: string[];
59
63
  }
60
64
  export interface GateCheck {
61
65
  name: string;
@@ -98,7 +98,7 @@ export declare class InsufficientQualityEvidenceError extends Error {
98
98
  * Inspect every canonical metric with the same validation, collecting each
99
99
  * absent, stale, future-dated or malformed record instead of stopping at the first.
100
100
  */
101
- export declare function inspectQualityEvidence(memory: MemoryBackend, options?: {
101
+ export declare function inspectQualityEvidence(memory: Pick<MemoryBackend, 'get'>, options?: {
102
102
  now?: number;
103
103
  maxAgeMs?: number;
104
104
  }): Promise<{
@@ -10,6 +10,7 @@ import { toError } from '../../../shared/error-utils.js';
10
10
  import { safeJsonParse } from '../../../shared/safe-json.js';
11
11
  import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
12
12
  import { measuredCoverageSummary, measuredFileCoverage } from '../coverage-report-event.js';
13
+ import { fileCoverageLookupKeys } from '../../coverage-analysis/collected-metrics.js';
13
14
  /** Metrics the static analyzer produces when the caller asks for all of them. */
14
15
  const ANALYZER_METRICS = ['coverage', 'complexity', 'maintainability', 'duplication', 'testability'];
15
16
  /** Metrics computed from parsing each source file. */
@@ -157,7 +158,7 @@ Focus on:
157
158
  }
158
159
  return null;
159
160
  }
160
- catch (error) {
161
+ catch {
161
162
  logger.warn('LLM insights generation failed:');
162
163
  return null;
163
164
  }
@@ -226,7 +227,7 @@ Focus on:
226
227
  }
227
228
  return null;
228
229
  }
229
- catch (error) {
230
+ catch {
230
231
  logger.warn('Failed to parse LLM insights response:');
231
232
  return null;
232
233
  }
@@ -508,9 +509,10 @@ Focus on:
508
509
  // 1. Try per-file coverage stored by test executor
509
510
  // #1014: only measured records count. Legacy unstamped estimate
510
511
  // records (written by <= 3.15.4, never expiring) are ignored.
511
- const fileCoverage = measuredFileCoverage(await this.memory.get(`coverage:file:${file}`));
512
- if (fileCoverage) {
513
- return fileCoverage.line;
512
+ for (const key of fileCoverageLookupKeys(file)) {
513
+ const fileCoverage = measuredFileCoverage(await this.memory.get(key));
514
+ if (fileCoverage)
515
+ return fileCoverage.line;
514
516
  }
515
517
  // 2. Fall back to project-wide summary from coverage-analyzer
516
518
  const summary = measuredCoverageSummary(await this.memory.get('coverage:latest'));
@@ -5,6 +5,7 @@
5
5
  import { v4 as uuidv4 } from 'uuid';
6
6
  import { ok, err } from '../../../shared/types/index.js';
7
7
  import { toError } from '../../../shared/error-utils.js';
8
+ import { isMeasuredMetricValue } from '../evidence-sufficiency.js';
8
9
  const DEFAULT_CONFIG = {
9
10
  strictMode: false,
10
11
  enableWarnings: true,
@@ -80,6 +81,12 @@ export class QualityGateService {
80
81
  // Evaluate each threshold
81
82
  checks.push(...this.evaluateMinThresholds(metrics, thresholds));
82
83
  checks.push(...this.evaluateMaxThresholds(metrics, thresholds));
84
+ if (checks.length === 0) {
85
+ return err(new Error('No thresholds configured for gate evaluation'));
86
+ }
87
+ const unmeasured = checks
88
+ .filter((check) => !isMeasuredMetricValue(check.value))
89
+ .map((check) => check.name);
83
90
  // Collect failed checks
84
91
  for (const check of checks) {
85
92
  if (!check.passed) {
@@ -89,13 +96,15 @@ export class QualityGateService {
89
96
  // Calculate overall score (0-100)
90
97
  const overallScore = this.calculateOverallScore(checks);
91
98
  // Determine pass/fail based on critical checks
92
- const passed = this.determineGateStatus(checks);
99
+ const passed = unmeasured.length === 0 && this.determineGateStatus(checks);
93
100
  const result = {
94
101
  gateName,
95
102
  passed,
96
103
  checks,
97
104
  overallScore,
98
105
  failedChecks,
106
+ evidenceStatus: unmeasured.length === 0 ? 'measured' : 'insufficient-evidence',
107
+ unmeasured,
99
108
  };
100
109
  // Store evaluation result in memory
101
110
  await this.storeEvaluationResult(result);
@@ -188,9 +197,9 @@ export class QualityGateService {
188
197
  return checks;
189
198
  }
190
199
  createCheck(name, value, threshold, type, severity) {
191
- const passed = type === 'min'
200
+ const passed = isMeasuredMetricValue(value) && (type === 'min'
192
201
  ? value >= threshold
193
- : value <= threshold;
202
+ : value <= threshold);
194
203
  return {
195
204
  name,
196
205
  passed,
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Dependency advisory (OSV) engine for the scan-security task (#1049).
3
+ *
4
+ * Runs the security-compliance DependencyScanner on the project's package.json
5
+ * and turns its outcome into an execution receipt. A failed or partial OSV
6
+ * lookup is a failed/partial engine with the unchecked packages listed, never
7
+ * a completed engine with zero findings.
8
+ */
9
+ import type { SecurityEngineEvidence } from './scan-evidence.js';
10
+ import type { Vulnerability, UncheckedDependency, LocalDependency } from './interfaces.js';
11
+ import type { DependencyScanResult } from './services/scanners/scanner-types.js';
12
+ import type { Result } from '../../shared/types/index.js';
13
+ export declare const DEPENDENCY_ADVISORY_ENGINE_ID = "osv-dependency-advisories";
14
+ /** The dependency scan as reported to MCP and CLI consumers. */
15
+ export interface DependencyScanReport {
16
+ status: 'complete' | 'incomplete' | 'failed' | 'not-run';
17
+ measured: boolean;
18
+ manifest?: string;
19
+ /** Lockfile the checked versions were resolved from, or null (exact specs only). */
20
+ lockfile?: string | null;
21
+ packagesRequested: number;
22
+ packagesChecked: number;
23
+ uncheckedPackages: UncheckedDependency[];
24
+ /** Local workspace / linked packages: not OSV subjects, excluded from the counts. */
25
+ localPackages: LocalDependency[];
26
+ /** Why the scan is not complete beyond individual packages (malformed lockfile, workspace root #1057). */
27
+ resolutionErrors: string[];
28
+ /** Only direct dependencies are checked; transitive dependencies are not. */
29
+ scope: 'direct';
30
+ vulnerabilities: number;
31
+ scanId?: string;
32
+ error?: string;
33
+ /** One plain sentence for humans; says when advisories could not be checked. */
34
+ message: string;
35
+ }
36
+ export interface DependencyAdvisoryOutcome {
37
+ engine: SecurityEngineEvidence;
38
+ vulnerabilities: Vulnerability[];
39
+ report: DependencyScanReport;
40
+ }
41
+ interface PackageJsonScanner {
42
+ scanPackageJson(packageJsonPath: string): Promise<Result<DependencyScanResult>>;
43
+ }
44
+ /** The package.json for a scan target: the target directory's, else the project root's. */
45
+ export declare function findPackageJson(targetPath: string, env?: NodeJS.ProcessEnv): Promise<string | null>;
46
+ /** Human message for a dependency scan outcome. */
47
+ export declare const DEPENDENCY_SCOPE_NOTE = "direct dependencies of this package.json only; workspace members and transitive dependencies are not checked";
48
+ export declare function dependencyScanMessage(report: Omit<DependencyScanReport, 'message'>): string;
49
+ /** Run the OSV dependency scan for a target and describe it as an engine receipt. */
50
+ export declare function runDependencyAdvisoryScan(scanner: PackageJsonScanner, targetPath: string): Promise<DependencyAdvisoryOutcome>;
51
+ export {};
52
+ //# sourceMappingURL=dependency-advisory-engine.d.ts.map