agentic-qe 3.15.5 → 3.15.6

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 (536) hide show
  1. package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/README.md +9 -2
  2. package/.claude/skills/qe-court/evals/qe-court.yaml +3 -2
  3. package/.claude/skills/qe-quality-assessment/schemas/output.json +12 -2
  4. package/.claude/skills/skills-manifest.json +1 -1
  5. package/CHANGELOG.md +121 -0
  6. package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/README.md +9 -2
  7. package/assets/skills/qe-court/evals/qe-court.yaml +3 -2
  8. package/assets/skills/qe-quality-assessment/schemas/output.json +12 -2
  9. package/assets/skills/skills-manifest.json +1 -1
  10. package/dist/cli/bundle.js +5 -5
  11. package/dist/cli/chunks/adapter-PP3XIXDV.js +2 -0
  12. package/dist/cli/chunks/{agent-booster-wasm-CCTTGCQS.js → agent-booster-wasm-SY7UCLBL.js} +2 -2
  13. package/dist/cli/chunks/{agent-handler-DHYUF3NX.js → agent-handler-KAMYBU3S.js} +2 -2
  14. package/dist/cli/chunks/{agent-memory-branch-642W7CYX.js → agent-memory-branch-2CAW3KUM.js} +2 -2
  15. package/dist/cli/chunks/aqe-learning-engine-VDUQJKKY.js +2 -0
  16. package/dist/cli/chunks/{arena-NW2JVAFY.js → arena-4OFLJ3R2.js} +2 -2
  17. package/dist/cli/chunks/{arena-MUCC7UUN.js → arena-QCCVIOAH.js} +4 -4
  18. package/dist/cli/chunks/{audit-VKQTZJAA.js → audit-RBDQJQJB.js} +3 -3
  19. package/dist/cli/chunks/base-QSYWWPCE.js +2 -0
  20. package/dist/cli/chunks/{better-sqlite3-7ZUFVWLQ.js → better-sqlite3-5JRACCDQ.js} +2 -2
  21. package/dist/cli/chunks/{brain-handler-7LKAWSBI.js → brain-handler-W4QIIRT4.js} +3 -3
  22. package/dist/cli/chunks/{branch-enumerator-HUNXJKM4.js → branch-enumerator-IBNGI572.js} +2 -2
  23. package/dist/cli/chunks/{browser-ZSZEYUDP.js → browser-GMSCVAOI.js} +2 -2
  24. package/dist/cli/chunks/browser-workflow-WXXPBSCM.js +2 -0
  25. package/dist/cli/chunks/{chunk-RUSLEOMC.js → chunk-22OZIJAD.js} +2 -2
  26. package/dist/cli/chunks/{chunk-WR64BKUE.js → chunk-24ZSGYC6.js} +1 -1
  27. package/dist/cli/chunks/{chunk-CR2JUANW.js → chunk-2CIDFR2H.js} +3 -3
  28. package/dist/cli/chunks/{chunk-SDWMLT7B.js → chunk-2IWPJUVV.js} +5 -5
  29. package/dist/cli/chunks/{chunk-VYDNLQJN.js → chunk-2ZTWPMTK.js} +2 -2
  30. package/dist/cli/chunks/{chunk-WN55MNZ2.js → chunk-34MDMFET.js} +2 -2
  31. package/dist/cli/chunks/{chunk-D3G2NN7F.js → chunk-3DJNKNBR.js} +66 -65
  32. package/dist/cli/chunks/{chunk-XQRE2HWM.js → chunk-3NJ7O3OH.js} +2 -2
  33. package/dist/cli/chunks/chunk-45MVRQG4.js +2 -0
  34. package/dist/cli/chunks/chunk-46HBVDMU.js +2 -0
  35. package/dist/cli/chunks/{chunk-MNQ36MAF.js → chunk-47Q7JL3V.js} +2 -2
  36. package/dist/cli/chunks/chunk-4CLDYT36.js +2 -0
  37. package/dist/cli/chunks/{chunk-ORTBRO7F.js → chunk-4KOVHQXK.js} +2 -2
  38. package/dist/cli/chunks/{chunk-B2UHTA4Q.js → chunk-4POOJYXA.js} +1 -1
  39. package/dist/cli/chunks/{chunk-QXY3IRBW.js → chunk-5DH5QI7G.js} +26 -26
  40. package/dist/cli/chunks/{chunk-7BIYJRQJ.js → chunk-5GIJU2ZY.js} +2 -2
  41. package/dist/cli/chunks/{chunk-6LG5UEQE.js → chunk-5HAPS6VD.js} +2 -2
  42. package/dist/cli/chunks/{chunk-OU4ZAWCC.js → chunk-5LST62QR.js} +2 -2
  43. package/dist/cli/chunks/{chunk-Y2E3IJ53.js → chunk-5MT7DMD7.js} +2 -2
  44. package/dist/cli/chunks/{chunk-6UYN5PHA.js → chunk-5NC7QEJ6.js} +4 -4
  45. package/dist/cli/chunks/{chunk-3DTEQHFB.js → chunk-5UPIL62W.js} +3 -3
  46. package/dist/cli/chunks/{chunk-YINFES3E.js → chunk-5VUIXDY2.js} +2 -2
  47. package/dist/cli/chunks/chunk-5VZVMO7B.js +3 -0
  48. package/dist/cli/chunks/{chunk-JCC7QEKZ.js → chunk-624QRKQX.js} +1 -1
  49. package/dist/cli/chunks/{chunk-HIUNCO2W.js → chunk-66NW3ZB4.js} +2 -2
  50. package/dist/cli/chunks/{chunk-4AZP7ZCW.js → chunk-6HWARQWV.js} +2 -2
  51. package/dist/cli/chunks/{chunk-LNO5IWGH.js → chunk-6MXAJBEA.js} +1 -1
  52. package/dist/cli/chunks/{chunk-XNEEYXR2.js → chunk-6R3FBFCJ.js} +2 -2
  53. package/dist/cli/chunks/{chunk-ZT3GUYM5.js → chunk-6RDVY26I.js} +2 -2
  54. package/dist/cli/chunks/{chunk-W3ZGNNDV.js → chunk-6T6AHVLF.js} +1 -1
  55. package/dist/cli/chunks/{chunk-JANLATHN.js → chunk-6WOZUSSN.js} +2 -2
  56. package/dist/cli/chunks/chunk-72MQCZSM.js +2 -0
  57. package/dist/cli/chunks/chunk-7QVPMH25.js +3 -0
  58. package/dist/cli/chunks/{chunk-HLFDC4SF.js → chunk-7SAMMQVS.js} +1 -1
  59. package/dist/cli/chunks/{chunk-644DFAGS.js → chunk-7TJZDRDU.js} +1 -1
  60. package/dist/cli/chunks/{chunk-BYXNHGQC.js → chunk-7TVIX4WL.js} +2 -2
  61. package/dist/cli/chunks/{chunk-FBEXG4HD.js → chunk-7VTKR44N.js} +2 -2
  62. package/dist/cli/chunks/{chunk-UE22ODHN.js → chunk-7XTANLTN.js} +1 -1
  63. package/dist/cli/chunks/chunk-7XUB7U6Z.js +4 -0
  64. package/dist/cli/chunks/{chunk-HPLMX62I.js → chunk-A74J23QB.js} +2 -2
  65. package/dist/cli/chunks/{chunk-VRJPH3LG.js → chunk-A7ANPS4E.js} +2 -2
  66. package/dist/cli/chunks/{chunk-IHFUEPZH.js → chunk-AJT3XDRD.js} +2 -2
  67. package/dist/cli/chunks/{chunk-EUEHBERE.js → chunk-ALCIUWFC.js} +1 -1
  68. package/dist/cli/chunks/{chunk-NMJVG22Z.js → chunk-AUN4FG7V.js} +1 -1
  69. package/dist/cli/chunks/{chunk-DWZI3IVB.js → chunk-AUOSHM63.js} +2 -2
  70. package/dist/cli/chunks/{chunk-7EZLOC4K.js → chunk-AX26QJ6T.js} +2 -2
  71. package/dist/cli/chunks/{chunk-PDPEMBFV.js → chunk-B7RHBKHL.js} +2 -2
  72. package/dist/cli/chunks/{chunk-DEGWCUMY.js → chunk-BAYGQRNP.js} +2 -2
  73. package/dist/cli/chunks/{chunk-ONCH5AXU.js → chunk-BIXRTOH3.js} +18 -18
  74. package/dist/cli/chunks/{chunk-U4TV75AC.js → chunk-BO7UFNYV.js} +2 -2
  75. package/dist/cli/chunks/{chunk-FNAYDITO.js → chunk-BUTGIVKW.js} +1 -1
  76. package/dist/cli/chunks/{chunk-HBYQYGXP.js → chunk-BXATKI5S.js} +2 -2
  77. package/dist/cli/chunks/{chunk-BO4PKNYP.js → chunk-CCL436IU.js} +32 -27
  78. package/dist/cli/chunks/{chunk-XIE7OHML.js → chunk-CEXNW5TR.js} +1 -1
  79. package/dist/cli/chunks/{chunk-663ZFPUL.js → chunk-CLAMMGY3.js} +2 -2
  80. package/dist/cli/chunks/{chunk-PVAE65B4.js → chunk-CR66HNAE.js} +1 -1
  81. package/dist/cli/chunks/{chunk-LRASYSGV.js → chunk-CZBIREL5.js} +2 -2
  82. package/dist/cli/chunks/{chunk-WLIYWBQR.js → chunk-D5N2O5EH.js} +2 -2
  83. package/dist/cli/chunks/{chunk-A337MD3C.js → chunk-DA7DGDTI.js} +2 -2
  84. package/dist/cli/chunks/{chunk-WC47GICZ.js → chunk-DLSFT6PO.js} +2 -2
  85. package/dist/cli/chunks/{chunk-KHCALIFP.js → chunk-DQNUPEY5.js} +2 -2
  86. package/dist/cli/chunks/{chunk-GTSOFCMQ.js → chunk-EECF4CMA.js} +1 -1
  87. package/dist/cli/chunks/{chunk-5BOZCMXZ.js → chunk-EF5UHDCG.js} +1 -1
  88. package/dist/cli/chunks/{chunk-L6SVCNXK.js → chunk-EJ4KZFZN.js} +1 -1
  89. package/dist/cli/chunks/{chunk-CFPR24YK.js → chunk-ELI4GDQO.js} +2 -2
  90. package/dist/cli/chunks/{chunk-KJ3KBP24.js → chunk-F3KS3TAB.js} +2 -2
  91. package/dist/cli/chunks/{chunk-RMJ7PJOS.js → chunk-F7A2UBZO.js} +2 -2
  92. package/dist/cli/chunks/{chunk-U6OVPMQX.js → chunk-FOJRPEIP.js} +2 -2
  93. package/dist/cli/chunks/{chunk-JYY7AYGA.js → chunk-FQ5N666N.js} +1 -1
  94. package/dist/cli/chunks/{chunk-4XSCZVON.js → chunk-FU7LNUD7.js} +2 -2
  95. package/dist/cli/chunks/{chunk-OW42F2TX.js → chunk-GFB6BZWU.js} +2 -2
  96. package/dist/cli/chunks/{chunk-JI77KJP7.js → chunk-GI5HWS4H.js} +1 -1
  97. package/dist/cli/chunks/{chunk-4UXPDV7E.js → chunk-GNYOHZVV.js} +1 -1
  98. package/dist/cli/chunks/{chunk-VCKDVOPD.js → chunk-GVRFSXY6.js} +2 -2
  99. package/dist/cli/chunks/{chunk-PURHGLEC.js → chunk-GWM4M5NF.js} +1 -1
  100. package/dist/cli/chunks/{chunk-BY646JOM.js → chunk-HAN4MS5T.js} +2 -2
  101. package/dist/cli/chunks/{chunk-OGYWWZU7.js → chunk-HEGGV2PT.js} +2 -2
  102. package/dist/cli/chunks/{chunk-FHUJCVT3.js → chunk-HOEWMEF2.js} +2 -2
  103. package/dist/cli/chunks/{chunk-CXOXUBYU.js → chunk-HZFK2Z2Z.js} +1 -1
  104. package/dist/cli/chunks/chunk-I7WAW7TM.js +2 -0
  105. package/dist/cli/chunks/{chunk-E4VIVMDL.js → chunk-IEPWO4XP.js} +2 -2
  106. package/dist/cli/chunks/{chunk-DTJODGCE.js → chunk-ITIJ23K2.js} +2 -2
  107. package/dist/cli/chunks/{chunk-AQN5EDBM.js → chunk-IVJIHZSM.js} +1 -1
  108. package/dist/cli/chunks/{chunk-PHP4UJYP.js → chunk-JAPBSSFY.js} +1 -1
  109. package/dist/cli/chunks/{chunk-A2WOQO2N.js → chunk-JCE76MPP.js} +2 -2
  110. package/dist/cli/chunks/{chunk-A5J4XJS6.js → chunk-JPJEAK4G.js} +1 -1
  111. package/dist/cli/chunks/{chunk-3OAQPN2N.js → chunk-JYKQVYX2.js} +2 -2
  112. package/dist/cli/chunks/{chunk-MQGEZA2A.js → chunk-K55EAWZ5.js} +2 -2
  113. package/dist/cli/chunks/chunk-KCB6P463.js +3 -0
  114. package/dist/cli/chunks/{chunk-L375O3CZ.js → chunk-KIDOBLUO.js} +2 -2
  115. package/dist/cli/chunks/{chunk-NLDFNAOS.js → chunk-KYVIOC3C.js} +2 -2
  116. package/dist/cli/chunks/{chunk-CQMHDAJS.js → chunk-L2TDHJR3.js} +2 -2
  117. package/dist/cli/chunks/{chunk-FE3AIZI6.js → chunk-L4D3TPFP.js} +1 -1
  118. package/dist/cli/chunks/{chunk-VLOIEVER.js → chunk-LAY7NCQK.js} +3 -3
  119. package/dist/cli/chunks/{chunk-WT3JC4A6.js → chunk-LCCTJ2PC.js} +2 -2
  120. package/dist/cli/chunks/{chunk-VML4SG3X.js → chunk-LJCEDTUM.js} +3 -3
  121. package/dist/cli/chunks/{chunk-NF6AFIAX.js → chunk-LMAEMVPA.js} +1 -1
  122. package/dist/cli/chunks/{chunk-2XYTS2WY.js → chunk-LZWJ5BMP.js} +2 -2
  123. package/dist/cli/chunks/{chunk-PHAQWAEV.js → chunk-MP3FSUNB.js} +2 -2
  124. package/dist/cli/chunks/{chunk-IJ2EXSMO.js → chunk-MQCTLTGE.js} +2 -2
  125. package/dist/cli/chunks/{chunk-GRIPCYW5.js → chunk-MQTA6KIO.js} +1 -1
  126. package/dist/cli/chunks/{chunk-GGDKOJVF.js → chunk-NBUXM5X6.js} +10 -6
  127. package/dist/cli/chunks/{chunk-DPYDUKVZ.js → chunk-NHRF3V4B.js} +2 -2
  128. package/dist/cli/chunks/chunk-NMY4KTWA.js +16 -0
  129. package/dist/cli/chunks/chunk-NYS2GUNO.js +2 -0
  130. package/dist/cli/chunks/{chunk-AUZXRFOX.js → chunk-ONPPBLRB.js} +2 -2
  131. package/dist/cli/chunks/{chunk-HGBJ2QQ4.js → chunk-OPDZBRIL.js} +2 -2
  132. package/dist/cli/chunks/{chunk-DXVZBJE4.js → chunk-OQ4S6B7P.js} +1 -1
  133. package/dist/cli/chunks/{chunk-Y2WMPEUP.js → chunk-ORBODZSO.js} +2 -2
  134. package/dist/cli/chunks/{chunk-IJOFZBXD.js → chunk-ORFL3YXB.js} +2 -2
  135. package/dist/cli/chunks/{chunk-BMWAWZAN.js → chunk-P7DXVL2S.js} +2 -2
  136. package/dist/cli/chunks/chunk-PEMSXSP2.js +4 -0
  137. package/dist/cli/chunks/chunk-PS6WFCA4.js +6 -0
  138. package/dist/cli/chunks/{chunk-DPV33C77.js → chunk-Q2RBOC7V.js} +2 -2
  139. package/dist/cli/chunks/{chunk-3AYYGR6W.js → chunk-QLKUCMZC.js} +1 -1
  140. package/dist/cli/chunks/{chunk-EVCFUYYK.js → chunk-QLYO3H7E.js} +9 -9
  141. package/dist/cli/chunks/{chunk-3SH23PS3.js → chunk-QS5KZYUZ.js} +2 -2
  142. package/dist/cli/chunks/{chunk-3YNP33GB.js → chunk-R363XXGH.js} +2 -2
  143. package/dist/cli/chunks/chunk-RD5BYLN7.js +2 -0
  144. package/dist/cli/chunks/{chunk-MS3Z2CP5.js → chunk-RFDFET3O.js} +2 -2
  145. package/dist/cli/chunks/{chunk-ZLBBX24Q.js → chunk-RHIQ6QO5.js} +357 -351
  146. package/dist/cli/chunks/chunk-RLB7K7QP.js +2 -0
  147. package/dist/cli/chunks/{chunk-3YASZPLO.js → chunk-RUTO67PT.js} +2 -2
  148. package/dist/cli/chunks/{chunk-V7GNUVYI.js → chunk-RV6HSMKJ.js} +1 -1
  149. package/dist/cli/chunks/{chunk-4PT5KNXL.js → chunk-SOSJWM3E.js} +4 -4
  150. package/dist/cli/chunks/{chunk-6ZIDZ4TJ.js → chunk-SV5BUYHH.js} +2 -2
  151. package/dist/cli/chunks/{chunk-ZTC5FBL6.js → chunk-TL5GV3PR.js} +8 -8
  152. package/dist/cli/chunks/{chunk-GKPRECLL.js → chunk-TLUIO37P.js} +2 -2
  153. package/dist/cli/chunks/{chunk-FWYJ6UDX.js → chunk-TUDENMAE.js} +2 -2
  154. package/dist/cli/chunks/chunk-TVLOED6O.js +2 -0
  155. package/dist/cli/chunks/{chunk-3QD7U3FY.js → chunk-UB6DQGWM.js} +2 -2
  156. package/dist/cli/chunks/{chunk-SAPIRK2G.js → chunk-UHHMAKPE.js} +1 -1
  157. package/dist/cli/chunks/{chunk-35MDATQE.js → chunk-ULCHPPW2.js} +1 -1
  158. package/dist/cli/chunks/chunk-V3OLS2NG.js +2 -0
  159. package/dist/cli/chunks/{chunk-UXZEVIFX.js → chunk-VAYZ5QIE.js} +1 -1
  160. package/dist/cli/chunks/{chunk-VH3EB6ZG.js → chunk-VCONCVSY.js} +3 -3
  161. package/dist/cli/chunks/{chunk-QPV3OKX2.js → chunk-VVF337SV.js} +2 -2
  162. package/dist/cli/chunks/{chunk-XNHB6TLC.js → chunk-WKDWRRDT.js} +2 -2
  163. package/dist/cli/chunks/{chunk-RUJLVJDE.js → chunk-X2DR27AY.js} +2 -2
  164. package/dist/cli/chunks/{chunk-47GEI2LT.js → chunk-X33F7NXH.js} +3 -3
  165. package/dist/cli/chunks/{chunk-MB4VFAJC.js → chunk-XBEI2JBA.js} +2 -2
  166. package/dist/cli/chunks/{chunk-OQDC7GCM.js → chunk-XBFQJZWX.js} +2 -2
  167. package/dist/cli/chunks/{chunk-EAYQCBXL.js → chunk-XFPQIWEH.js} +3 -3
  168. package/dist/cli/chunks/{chunk-2KWI3MT3.js → chunk-XPB5BVU6.js} +2 -2
  169. package/dist/cli/chunks/{chunk-DL5JENWD.js → chunk-XQ53PZEF.js} +3 -3
  170. package/dist/cli/chunks/{chunk-BZFT4QDQ.js → chunk-XZ46CI35.js} +2 -2
  171. package/dist/cli/chunks/chunk-YLNYPQDR.js +2 -0
  172. package/dist/cli/chunks/{chunk-EOR3RECZ.js → chunk-YNG7E26C.js} +2 -2
  173. package/dist/cli/chunks/{chunk-6JFGB2JB.js → chunk-YXU35GGD.js} +1 -1
  174. package/dist/cli/chunks/{chunk-JNMUVBAJ.js → chunk-ZCP4P6O2.js} +2 -2
  175. package/dist/cli/chunks/{chunk-Y7GPLOXB.js → chunk-ZL5LJT7D.js} +2 -2
  176. package/dist/cli/chunks/{chunk-PCCIZFD7.js → chunk-ZOUEQ6DL.js} +1 -1
  177. package/dist/cli/chunks/{chunk-FQKEZVN6.js → chunk-ZSBD4FUX.js} +2 -2
  178. package/dist/cli/chunks/chunk-ZTB32K5N.js +5 -0
  179. package/dist/cli/chunks/{chunk-X52TMBHU.js → chunk-ZUTFHGEO.js} +1 -1
  180. package/dist/cli/chunks/ci-GEJCXMBK.js +81 -0
  181. package/dist/cli/chunks/{ci-config-XDDZOOEI.js → ci-config-2ZVV4OXL.js} +2 -2
  182. package/dist/cli/chunks/{ci-output-7ZUQI4U6.js → ci-output-E45OGVPR.js} +2 -2
  183. package/dist/cli/chunks/{circuit-breaker-ALXKCFAL.js → circuit-breaker-X73ITYZC.js} +2 -2
  184. package/dist/cli/chunks/{claude-flow-setup-RL7K2NI2.js → claude-flow-setup-W4PPH46C.js} +2 -2
  185. package/dist/cli/chunks/client-6XKSQ4JT.js +2 -0
  186. package/dist/cli/chunks/{cline-installer-2Z2QQKC3.js → cline-installer-NUEPMWDE.js} +2 -2
  187. package/dist/cli/chunks/{code-QSZTDINQ.js → code-6WQHBS7G.js} +3 -3
  188. package/dist/cli/chunks/{code-index-extractor-5CGR5D3Y.js → code-index-extractor-BXQIFIFT.js} +2 -2
  189. package/dist/cli/chunks/{codex-installer-7JLSEDE5.js → codex-installer-Z337R2KH.js} +2 -2
  190. package/dist/cli/chunks/{completions-U4NBSXEB.js → completions-F5DMYFHV.js} +2 -2
  191. package/dist/cli/chunks/{complexity-analyzer-WYZD2YSY.js → complexity-analyzer-W2SYPZDI.js} +2 -2
  192. package/dist/cli/chunks/{continuedev-installer-UPXINJFT.js → continuedev-installer-ZCHUIFTN.js} +2 -2
  193. package/dist/cli/chunks/{copilot-installer-WIVYQRIF.js → copilot-installer-M5JNODXF.js} +2 -2
  194. package/dist/cli/chunks/core-handlers-OJYW4Y6M.js +2 -0
  195. package/dist/cli/chunks/{cost-tracker-RIN4JDDM.js → cost-tracker-LSYTHBHV.js} +2 -2
  196. package/dist/cli/chunks/coverage-PGMRS5SS.js +49 -0
  197. package/dist/cli/chunks/cross-domain-router-QVUPQ2SC.js +2 -0
  198. package/dist/cli/chunks/{cursor-installer-POM7NGCC.js → cursor-installer-XPUA73UW.js} +2 -2
  199. package/dist/cli/chunks/{daemon-HFGKQ6LB.js → daemon-ITKDIYMW.js} +5 -5
  200. package/dist/cli/chunks/daemon-QBYTCIMH.js +10 -0
  201. package/dist/cli/chunks/{dag-attention-scheduler-HJXM7Q5P.js → dag-attention-scheduler-T55AXLD6.js} +2 -2
  202. package/dist/cli/chunks/{detect-XKQGLZYN.js → detect-DR7J6K4O.js} +2 -2
  203. package/dist/cli/chunks/{dist-node-SSKB53QL.js → dist-node-LAJJBOUT.js} +2 -2
  204. package/dist/cli/chunks/{domain-handler-6BNDHATU.js → domain-handler-OMSHCRMK.js} +2 -2
  205. package/dist/cli/chunks/{domain-plugins-DOX54YE3.js → domain-plugins-EQXSKC5K.js} +2 -2
  206. package/dist/cli/chunks/{domain-transfer-FW4ZX3Z7.js → domain-transfer-FKRAGVSW.js} +2 -2
  207. package/dist/cli/chunks/dream-3UABDRZJ.js +2 -0
  208. package/dist/cli/chunks/embed-and-insert-pattern-JZFPCNL3.js +3 -0
  209. package/dist/cli/chunks/{eval-K7E4XXBS.js → eval-JSNNASBW.js} +2 -2
  210. package/dist/cli/chunks/experience-capture-middleware-UPD3IZBK.js +40 -0
  211. package/dist/cli/chunks/{fast-paths-5JXXTYAG.js → fast-paths-YNMIBS2E.js} +2 -2
  212. package/dist/cli/chunks/{feature-flags-2CR3CO23.js → feature-flags-SRLXDKBI.js} +2 -2
  213. package/dist/cli/chunks/{feature-flags-RB72LHOJ.js → feature-flags-VIR7O4L7.js} +2 -2
  214. package/dist/cli/chunks/file-discovery-ZFGZTKZ4.js +2 -0
  215. package/dist/cli/chunks/{fleet-SDU7QEOA.js → fleet-K2ED46EL.js} +3 -3
  216. package/dist/cli/chunks/{gnn-wrapper-AWCFODUV.js → gnn-wrapper-QCU4ZRYW.js} +2 -2
  217. package/dist/cli/chunks/{heartbeat-handler-A4PJ3NFP.js → heartbeat-handler-YYQI4WZM.js} +4 -4
  218. package/dist/cli/chunks/heartbeat-scheduler-MJ6MTPDF.js +2 -0
  219. package/dist/cli/chunks/hnsw-adapter-FQWJCFVW.js +2 -0
  220. package/dist/cli/chunks/hnsw-index-NJYKJUHC.js +2 -0
  221. package/dist/cli/chunks/{hnsw-legacy-bridge-KRS7SSFM.js → hnsw-legacy-bridge-C5TJSWTZ.js} +2 -2
  222. package/dist/cli/chunks/{hnswlib-node-OGGCPKPO.js → hnswlib-node-SE3MJJYS.js} +2 -2
  223. package/dist/cli/chunks/{hooks-XNRNMUBW.js → hooks-C572SRDH.js} +43 -43
  224. package/dist/cli/chunks/hybrid-backend-SL7RFID7.js +2 -0
  225. package/dist/cli/chunks/{hypergraph-engine-X35LTXYT.js → hypergraph-engine-35A6G3M5.js} +2 -2
  226. package/dist/cli/chunks/{hypergraph-handler-M6THKAG6.js → hypergraph-handler-U2756CWI.js} +3 -3
  227. package/dist/cli/chunks/impact-analyzer-5ZJTXPVC.js +2 -0
  228. package/dist/cli/chunks/init-handler-PCLYQUSB.js +88 -0
  229. package/dist/cli/chunks/init-wizard-MQMDSIOF.js +2 -0
  230. package/dist/cli/chunks/kernel-MEJ5GMRH.js +2 -0
  231. package/dist/cli/chunks/{kilocode-installer-TEPR2ZJD.js → kilocode-installer-32PX5YH7.js} +2 -2
  232. package/dist/cli/chunks/{kiro-installer-RUKHGDEE.js → kiro-installer-C4ROMMUS.js} +2 -2
  233. package/dist/cli/chunks/knowledge-graph-XUBZSEZE.js +2 -0
  234. package/dist/cli/chunks/learning-GEPVZGJQ.js +122 -0
  235. package/dist/cli/chunks/{llm-router-7GECMDCP.js → llm-router-XRKTTJTX.js} +4 -4
  236. package/dist/cli/chunks/llm-router-service-QZAPAEPX.js +2 -0
  237. package/dist/cli/chunks/{load-NTJ4Y4ZR.js → load-XVH6HW7E.js} +2 -2
  238. package/dist/cli/chunks/load-test-OVXIQ3AF.js +2 -0
  239. package/dist/cli/chunks/{mcp-4335GTTG.js → mcp-IULSTM4Z.js} +2 -2
  240. package/dist/cli/chunks/{memory-HYC4M4XS.js → memory-6K7IAU4T.js} +5 -5
  241. package/dist/cli/chunks/memory-backend-TRPOMPK4.js +2 -0
  242. package/dist/cli/chunks/memory-handlers-CG6DRLAW.js +2 -0
  243. package/dist/cli/chunks/{multi-model-executor-T7FYKM6T.js → multi-model-executor-VZDUYPLX.js} +2 -2
  244. package/dist/cli/chunks/{opencode-installer-3USXVT5M.js → opencode-installer-QUTXKNH4.js} +2 -2
  245. package/dist/cli/chunks/orchestrator-PCKKUWOP.js +452 -0
  246. package/dist/cli/chunks/pattern-null-store-JWYBRBZG.js +2 -0
  247. package/dist/cli/chunks/{pattern-usage-recorder-CMZLPX2K.js → pattern-usage-recorder-PX5HQVRL.js} +2 -2
  248. package/dist/cli/chunks/{pipeline-BTRZOVSL.js → pipeline-O562GTOG.js} +2 -2
  249. package/dist/cli/chunks/{platform-2MCRKC25.js → platform-PM7Q2AZS.js} +2 -2
  250. package/dist/cli/chunks/plugin-OTYTFGPY.js +27 -0
  251. package/dist/cli/chunks/{prime-radiant-advanced-wasm-TXFEMBP6.js → prime-radiant-advanced-wasm-6CFXTHC2.js} +2 -2
  252. package/dist/cli/chunks/project-root-VVSTHIP4.js +2 -0
  253. package/dist/cli/chunks/protocol-executor-PXZCLZD3.js +2 -0
  254. package/dist/cli/chunks/{protocol-handler-DZ26OYVZ.js → protocol-handler-PPGNSAOS.js} +2 -2
  255. package/dist/cli/chunks/{prove-QWONEJWX.js → prove-WQ3BKRZG.js} +2 -2
  256. package/dist/cli/chunks/qe-reasoning-bank-42FRS5V3.js +2 -0
  257. package/dist/cli/chunks/{quality-WFH54FY7.js → quality-C5WUU3AA.js} +2 -2
  258. package/dist/cli/chunks/{quality-gate-ONJB7XU7.js → quality-gate-WSSRKD5U.js} +3 -3
  259. package/dist/cli/chunks/queen-coordinator-UI3B7DI6.js +2 -0
  260. package/dist/cli/chunks/real-embeddings-CFQE7IRQ.js +2 -0
  261. package/dist/cli/chunks/{ref-validation-HW5Y55ZC.js → ref-validation-DHKHXVZT.js} +2 -2
  262. package/dist/cli/chunks/{roocode-installer-5OABDNZT.js → roocode-installer-3PPODABV.js} +2 -2
  263. package/dist/cli/chunks/router-HYRPWLAY.js +2 -0
  264. package/dist/cli/chunks/routing-feedback-BPZ5R6F3.js +2 -0
  265. package/dist/cli/chunks/{routing-handler-CVHVOQTC.js → routing-handler-JNXTGT6T.js} +2 -2
  266. package/dist/cli/chunks/{ruvector-commands-KKDKFGIQ.js → ruvector-commands-6YLROPVP.js} +2 -2
  267. package/dist/cli/chunks/rvf-dual-writer-DEKDQ6KO.js +2 -0
  268. package/dist/cli/chunks/rvf-migration-adapter-L53VBS7I.js +2 -0
  269. package/dist/cli/chunks/rvf-migration-coordinator-4DWB4WRK.js +2 -0
  270. package/dist/cli/chunks/rvf-native-adapter-I6RUGD2D.js +2 -0
  271. package/dist/cli/chunks/{rvf-store-integrity-UGUXKIFX.js → rvf-store-integrity-YKR2ZNBF.js} +2 -2
  272. package/dist/cli/chunks/safe-db-KS65XDCP.js +2 -0
  273. package/dist/cli/chunks/schedule-KD2VN6GB.js +2 -0
  274. package/dist/cli/chunks/scheduler-ZH3RMUHY.js +2 -0
  275. package/dist/cli/chunks/{security-7723AZZ4.js → security-PWQTGDRU.js} +3 -3
  276. package/dist/cli/chunks/shared-rvf-adapter-LNRLFP5I.js +2 -0
  277. package/dist/cli/chunks/{shared-rvf-dual-writer-ZSHYG5IA.js → shared-rvf-dual-writer-GWU6YQNS.js} +2 -2
  278. package/dist/cli/chunks/sqlite-persistence-6DTVME5D.js +2 -0
  279. package/dist/cli/chunks/{standalone-memory-MHZEEYMK.js → standalone-memory-46KKBSSV.js} +2 -2
  280. package/dist/cli/chunks/{status-handler-JKXPJ22K.js → status-handler-35T5FTDQ.js} +2 -2
  281. package/dist/cli/chunks/{structural-health-J4RKCYWF.js → structural-health-P7QPQWLO.js} +2 -2
  282. package/dist/cli/chunks/{sync-PDPORHVN.js → sync-W6Z4R4PL.js} +2 -2
  283. package/dist/cli/chunks/sync-Y43EWBSY.js +2 -0
  284. package/dist/cli/chunks/{task-handler-VERADM44.js → task-handler-5CX3ZYT7.js} +2 -2
  285. package/dist/cli/chunks/{task-handlers-4RUCWUR2.js → task-handlers-DQZGOJNE.js} +3 -3
  286. package/dist/cli/chunks/{test-DMBJFQNL.js → test-TPP53VVV.js} +12 -12
  287. package/dist/cli/chunks/{test-scheduling-LUPTVGCD.js → test-scheduling-WBV4UMQH.js} +3 -3
  288. package/dist/cli/chunks/token-bootstrap-GIIDXHLC.js +2 -0
  289. package/dist/cli/chunks/{token-usage-VOA34IKM.js → token-usage-AKK37RB7.js} +2 -2
  290. package/dist/cli/chunks/{transformers-GU4TYAN5.js → transformers-7MASPELS.js} +2 -2
  291. package/dist/cli/chunks/{tree-sitter-wasm-parser-MZPXAH7C.js → tree-sitter-wasm-parser-YZKD6UGB.js} +2 -2
  292. package/dist/cli/chunks/{types-K4FLXR2K.js → types-AZ3BTXDP.js} +2 -2
  293. package/dist/cli/chunks/unified-memory-FCX7NLFZ.js +2 -0
  294. package/dist/cli/chunks/unified-memory-hnsw-VU5QJK37.js +2 -0
  295. package/dist/cli/chunks/unified-persistence-FM376LGE.js +2 -0
  296. package/dist/cli/chunks/{upgrade-M3ATDRMK.js → upgrade-L7OTDKEK.js} +2 -2
  297. package/dist/cli/chunks/{validate-AAP773B3.js → validate-O3QVFIGP.js} +2 -2
  298. package/dist/cli/chunks/{validate-swarm-7RGAZX5F.js → validate-swarm-2UGBGLTX.js} +2 -2
  299. package/dist/cli/chunks/visual-security-EU7Y3X46.js +2 -0
  300. package/dist/cli/chunks/{web-tree-sitter-GQMRHGGI.js → web-tree-sitter-J75IYPRO.js} +2 -2
  301. package/dist/cli/chunks/{windsurf-installer-HG6HF2GF.js → windsurf-installer-FQ5DBFCG.js} +2 -2
  302. package/dist/cli/chunks/witness-chain-CSEBT52D.js +2 -0
  303. package/dist/cli/chunks/{witness-chain-WKU3ZIBQ.js → witness-chain-I7TN4MXZ.js} +2 -2
  304. package/dist/cli/chunks/witness-chain-repair-D3NE3NQK.js +2 -0
  305. package/dist/cli/chunks/{witness-chain-verifier-Q2KW3QEQ.js → witness-chain-verifier-RU2WOP5M.js} +2 -2
  306. package/dist/cli/chunks/witness-key-manager-IHQB2FR5.js +2 -0
  307. package/dist/cli/chunks/{workflow-CX6SHFBW.js → workflow-6BWTNVV6.js} +28 -28
  308. package/dist/cli/chunks/workflow-orchestrator-ALNKOM3N.js +2 -0
  309. package/dist/cli/chunks/wrappers-URVP25VU.js +2 -0
  310. package/dist/cli/commands/ci.js +47 -25
  311. package/dist/cli/commands/coverage.d.ts +1 -28
  312. package/dist/cli/commands/coverage.js +63 -134
  313. package/dist/cli/commands/daemon.js +7 -1
  314. package/dist/cli/commands/hooks-handlers/stats-hooks.d.ts +15 -0
  315. package/dist/cli/commands/hooks-handlers/stats-hooks.js +54 -2
  316. package/dist/cli/commands/learning.js +47 -7
  317. package/dist/cli/commands/test.js +6 -7
  318. package/dist/cli/commands/workflow.js +9 -5
  319. package/dist/cli/handlers/init-guard.d.ts +13 -0
  320. package/dist/cli/handlers/init-guard.js +23 -0
  321. package/dist/cli/handlers/init-handler.d.ts +3 -0
  322. package/dist/cli/handlers/init-handler.js +9 -0
  323. package/dist/cli/handlers/interfaces.js +5 -1
  324. package/dist/cli/scheduler/persistent-scheduler.d.ts +6 -2
  325. package/dist/cli/scheduler/persistent-scheduler.js +107 -41
  326. package/dist/cli/utils/ci-output.d.ts +8 -1
  327. package/dist/cli/utils/ci-output.js +13 -2
  328. package/dist/cli/utils/coverage-data.d.ts +3 -0
  329. package/dist/cli/utils/coverage-data.js +14 -39
  330. package/dist/cli/utils/coverage-verdict.d.ts +130 -0
  331. package/dist/cli/utils/coverage-verdict.js +193 -0
  332. package/dist/cli/utils/file-discovery.js +5 -0
  333. package/dist/coordination/deterministic-actions.js +24 -13
  334. package/dist/coordination/handlers/code-intelligence-handlers.d.ts +8 -0
  335. package/dist/coordination/handlers/code-intelligence-handlers.js +39 -0
  336. package/dist/coordination/handlers/coverage-handlers.js +34 -6
  337. package/dist/coordination/handlers/coverage-runner.d.ts +22 -0
  338. package/dist/coordination/handlers/coverage-runner.js +105 -10
  339. package/dist/coordination/handlers/coverage-target.d.ts +1 -0
  340. package/dist/coordination/handlers/coverage-target.js +4 -1
  341. package/dist/coordination/handlers/handler-types.d.ts +9 -0
  342. package/dist/coordination/handlers/handler-utils.d.ts +14 -1
  343. package/dist/coordination/handlers/handler-utils.js +46 -22
  344. package/dist/coordination/handlers/quality-handlers.js +108 -18
  345. package/dist/coordination/handlers/test-execution-handlers.js +4 -1
  346. package/dist/coordination/protocols/defect-investigation.d.ts +2 -1
  347. package/dist/coordination/protocols/defect-investigation.js +6 -3
  348. package/dist/coordination/protocols/quality-gate.js +10 -6
  349. package/dist/coordination/result-saver.d.ts +22 -0
  350. package/dist/coordination/result-saver.js +113 -43
  351. package/dist/coordination/task-executor.d.ts +7 -0
  352. package/dist/coordination/task-executor.js +32 -3
  353. package/dist/domains/code-intelligence/plugin.js +4 -0
  354. package/dist/domains/code-intelligence/services/metric-collector/index.js +9 -2
  355. package/dist/domains/code-intelligence/services/metric-collector/interfaces.d.ts +21 -0
  356. package/dist/domains/code-intelligence/services/metric-collector/interfaces.js +25 -0
  357. package/dist/domains/code-intelligence/services/metric-collector/loc-counter.d.ts +12 -0
  358. package/dist/domains/code-intelligence/services/metric-collector/loc-counter.js +69 -3
  359. package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +4 -1
  360. package/dist/domains/coverage-analysis/collected-metrics.d.ts +33 -0
  361. package/dist/domains/coverage-analysis/collected-metrics.js +36 -0
  362. package/dist/domains/coverage-analysis/coordinator.js +18 -6
  363. package/dist/domains/coverage-analysis/interfaces.d.ts +44 -0
  364. package/dist/domains/coverage-analysis/interfaces.js +6 -1
  365. package/dist/domains/coverage-analysis/services/coverage-analyzer.js +61 -34
  366. package/dist/domains/coverage-analysis/services/gap-detector.js +7 -2
  367. package/dist/domains/defect-intelligence/plugin.js +4 -0
  368. package/dist/domains/defect-intelligence/services/defect-predictor.js +6 -4
  369. package/dist/domains/learning-optimization/coordinator.js +4 -0
  370. package/dist/domains/learning-optimization/plugin.js +4 -0
  371. package/dist/domains/quality-assessment/coordinator-rl-integration.d.ts +14 -0
  372. package/dist/domains/quality-assessment/coordinator-rl-integration.js +54 -16
  373. package/dist/domains/quality-assessment/coordinator.js +10 -6
  374. package/dist/domains/quality-assessment/coverage-report-event.d.ts +32 -8
  375. package/dist/domains/quality-assessment/coverage-report-event.js +28 -6
  376. package/dist/domains/quality-assessment/index.d.ts +1 -1
  377. package/dist/domains/quality-assessment/interfaces.d.ts +46 -0
  378. package/dist/domains/quality-assessment/quality-evidence.d.ts +48 -2
  379. package/dist/domains/quality-assessment/quality-evidence.js +62 -0
  380. package/dist/domains/quality-assessment/services/quality-analyzer.d.ts +23 -2
  381. package/dist/domains/quality-assessment/services/quality-analyzer.js +192 -109
  382. package/dist/domains/security-compliance/services/scanners/dast-scanner.js +22 -16
  383. package/dist/domains/test-execution/interfaces.d.ts +10 -6
  384. package/dist/domains/test-execution/plugin.js +4 -0
  385. package/dist/domains/test-execution/services/test-executor.js +152 -102
  386. package/dist/domains/test-generation/coordinator.js +4 -0
  387. package/dist/domains/test-generation/plugin.js +4 -0
  388. package/dist/feedback/coverage-learner.js +4 -1
  389. package/dist/feedback/coverage-session-provenance.d.ts +29 -0
  390. package/dist/feedback/coverage-session-provenance.js +39 -0
  391. package/dist/init/orchestrator.js +2 -0
  392. package/dist/init/phases/09-assets.d.ts +4 -0
  393. package/dist/init/phases/09-assets.js +35 -0
  394. package/dist/init/retired-assets.d.ts +86 -0
  395. package/dist/init/retired-assets.js +230 -0
  396. package/dist/init/skills-installer.d.ts +2 -0
  397. package/dist/init/skills-installer.js +4 -0
  398. package/dist/init/types.d.ts +3 -0
  399. package/dist/integrations/ruvector/rvf-native-adapter.d.ts +2 -0
  400. package/dist/integrations/ruvector/rvf-native-adapter.js +5 -0
  401. package/dist/integrations/ruvector/server-client.js +4 -12
  402. package/dist/kernel/project-root.d.ts +17 -0
  403. package/dist/kernel/project-root.js +54 -2
  404. package/dist/kernel/shared-dirs.d.ts +66 -0
  405. package/dist/kernel/shared-dirs.js +168 -0
  406. package/dist/learning/daily-log.js +2 -1
  407. package/dist/learning/experience-capture-middleware.d.ts +22 -0
  408. package/dist/learning/experience-capture-middleware.js +35 -0
  409. package/dist/learning/learnable-result.d.ts +16 -0
  410. package/dist/learning/learnable-result.js +24 -0
  411. package/dist/learning/pattern-mutation-error.d.ts +8 -0
  412. package/dist/learning/pattern-mutation-error.js +12 -0
  413. package/dist/learning/qe-reasoning-bank.d.ts +10 -0
  414. package/dist/learning/qe-reasoning-bank.js +50 -1
  415. package/dist/learning/rvf-reconcile.d.ts +39 -0
  416. package/dist/learning/rvf-reconcile.js +40 -0
  417. package/dist/learning/sqlite-persistence.d.ts +14 -0
  418. package/dist/learning/sqlite-persistence.js +36 -0
  419. package/dist/mcp/bundle.js +516 -504
  420. package/dist/mcp/handlers/domain-handler-configs.d.ts +31 -1
  421. package/dist/mcp/handlers/domain-handler-configs.js +37 -3
  422. package/dist/mcp/handlers/handler-factory.js +40 -14
  423. package/dist/mcp/protocol-server.js +27 -2
  424. package/dist/mcp/tool-cache-scope.d.ts +31 -0
  425. package/dist/mcp/tool-cache-scope.js +71 -0
  426. package/dist/mcp/tools/code-intelligence/analyze.js +5 -3
  427. package/dist/mcp/types.d.ts +4 -0
  428. package/dist/optimization/session-cache.d.ts +19 -1
  429. package/dist/optimization/session-cache.js +36 -2
  430. package/dist/plugins/cache.js +2 -1
  431. package/dist/plugins/sources/github.js +2 -1
  432. package/dist/plugins/sources/npm.js +2 -1
  433. package/dist/shared/aqe-managed-dirs.d.ts +24 -0
  434. package/dist/shared/aqe-managed-dirs.js +56 -0
  435. package/dist/shared/events/domain-events.d.ts +18 -3
  436. package/dist/shared/events/domain-events.js +4 -0
  437. package/dist/shared/http/http-client.d.ts +6 -0
  438. package/dist/shared/http/http-client.js +13 -15
  439. package/dist/shared/io/file-reader.d.ts +26 -0
  440. package/dist/shared/io/file-reader.js +111 -17
  441. package/dist/shared/llm/providers/response-deadline.d.ts +7 -2
  442. package/dist/shared/llm/providers/response-deadline.js +17 -5
  443. package/dist/shared/metrics/code-metrics.d.ts +24 -0
  444. package/dist/shared/metrics/code-metrics.js +93 -6
  445. package/dist/shared/metrics/index.d.ts +1 -1
  446. package/dist/workers/interfaces.d.ts +9 -1
  447. package/dist/workers/quality-daemon/coverage-delta.d.ts +4 -3
  448. package/dist/workers/quality-daemon/coverage-delta.js +13 -6
  449. package/dist/workers/quality-daemon/index.js +6 -5
  450. package/dist/workers/quality-daemon/notification-service.js +3 -3
  451. package/dist/workers/quality-daemon/persistent-memory.d.ts +2 -2
  452. package/dist/workers/quality-daemon/persistent-memory.js +2 -2
  453. package/dist/workers/worker-manager.js +5 -1
  454. package/dist/workers/workers/coverage-tracker.js +69 -33
  455. package/dist/workers/workers/regression-monitor.d.ts +18 -1
  456. package/dist/workers/workers/regression-monitor.js +276 -117
  457. package/package.json +1 -1
  458. package/dist/cli/chunks/adapter-EGIPTX5H.js +0 -2
  459. package/dist/cli/chunks/aqe-learning-engine-WP4GCBDT.js +0 -2
  460. package/dist/cli/chunks/base-6ORFD62I.js +0 -2
  461. package/dist/cli/chunks/browser-workflow-PIXGERWP.js +0 -2
  462. package/dist/cli/chunks/chunk-2WFTZSRT.js +0 -2
  463. package/dist/cli/chunks/chunk-7YB2KELI.js +0 -5
  464. package/dist/cli/chunks/chunk-BBL6YXD3.js +0 -2
  465. package/dist/cli/chunks/chunk-BJ5P4IV2.js +0 -2
  466. package/dist/cli/chunks/chunk-DFPL5N3Q.js +0 -16
  467. package/dist/cli/chunks/chunk-DLY4YEN3.js +0 -2
  468. package/dist/cli/chunks/chunk-ERGWWI4Y.js +0 -3
  469. package/dist/cli/chunks/chunk-KZVJW2SD.js +0 -2
  470. package/dist/cli/chunks/chunk-L336HFFE.js +0 -2
  471. package/dist/cli/chunks/chunk-N2TJNIHA.js +0 -2
  472. package/dist/cli/chunks/chunk-RCXMUEZN.js +0 -3
  473. package/dist/cli/chunks/chunk-SEZLYRCS.js +0 -2
  474. package/dist/cli/chunks/chunk-TDLKXLJC.js +0 -4
  475. package/dist/cli/chunks/chunk-WOZIXXY5.js +0 -7
  476. package/dist/cli/chunks/ci-KP4GZKJ7.js +0 -81
  477. package/dist/cli/chunks/client-C3KHVRM6.js +0 -2
  478. package/dist/cli/chunks/core-handlers-KSQM6Q6S.js +0 -2
  479. package/dist/cli/chunks/coverage-SPFVHRRU.js +0 -43
  480. package/dist/cli/chunks/coverage-target-GSRBNHXE.js +0 -2
  481. package/dist/cli/chunks/cross-domain-router-CTGNOVCF.js +0 -2
  482. package/dist/cli/chunks/daemon-M5TD5Y6T.js +0 -10
  483. package/dist/cli/chunks/dream-MIK2E4UL.js +0 -2
  484. package/dist/cli/chunks/embed-and-insert-pattern-QST77T2B.js +0 -3
  485. package/dist/cli/chunks/experience-capture-middleware-X66IYSRV.js +0 -40
  486. package/dist/cli/chunks/file-discovery-3NHRUQQB.js +0 -2
  487. package/dist/cli/chunks/heartbeat-scheduler-OCKRACUW.js +0 -2
  488. package/dist/cli/chunks/hnsw-adapter-X67XG73C.js +0 -2
  489. package/dist/cli/chunks/hnsw-index-I7KCQBQR.js +0 -2
  490. package/dist/cli/chunks/hybrid-backend-FOUHTKAK.js +0 -2
  491. package/dist/cli/chunks/impact-analyzer-GXYVX46O.js +0 -2
  492. package/dist/cli/chunks/init-handler-2AXMXHYF.js +0 -86
  493. package/dist/cli/chunks/init-wizard-C2MRX2QG.js +0 -2
  494. package/dist/cli/chunks/kernel-Q2IUDIDC.js +0 -2
  495. package/dist/cli/chunks/knowledge-graph-E2Z6K5EE.js +0 -2
  496. package/dist/cli/chunks/learning-BEA26RNA.js +0 -122
  497. package/dist/cli/chunks/llm-router-service-YATYFEDD.js +0 -2
  498. package/dist/cli/chunks/load-test-LV77JXWA.js +0 -2
  499. package/dist/cli/chunks/memory-backend-XME3X3QX.js +0 -2
  500. package/dist/cli/chunks/memory-handlers-VG47X5DX.js +0 -2
  501. package/dist/cli/chunks/orchestrator-VHUXUYIM.js +0 -452
  502. package/dist/cli/chunks/pattern-null-store-TAXMLENP.js +0 -2
  503. package/dist/cli/chunks/plugin-2VAYWAO3.js +0 -27
  504. package/dist/cli/chunks/project-root-CFFPBGPX.js +0 -2
  505. package/dist/cli/chunks/protocol-executor-ML76QAVQ.js +0 -2
  506. package/dist/cli/chunks/qe-reasoning-bank-LUZH6RYV.js +0 -2
  507. package/dist/cli/chunks/queen-coordinator-EWXNIXB6.js +0 -2
  508. package/dist/cli/chunks/real-embeddings-GZV4VKK4.js +0 -2
  509. package/dist/cli/chunks/router-MXOBVEBF.js +0 -2
  510. package/dist/cli/chunks/routing-feedback-T6CCRUEK.js +0 -2
  511. package/dist/cli/chunks/rvf-dual-writer-WHXVT3V3.js +0 -2
  512. package/dist/cli/chunks/rvf-migration-adapter-JFPWIRCG.js +0 -2
  513. package/dist/cli/chunks/rvf-migration-coordinator-D4KUBNRZ.js +0 -2
  514. package/dist/cli/chunks/rvf-native-adapter-KOXR7TJL.js +0 -2
  515. package/dist/cli/chunks/safe-db-CI6IPSIN.js +0 -2
  516. package/dist/cli/chunks/schedule-X4HW6TVJ.js +0 -2
  517. package/dist/cli/chunks/scheduler-KCNJ2ON3.js +0 -2
  518. package/dist/cli/chunks/shared-rvf-adapter-KEQ5CLNI.js +0 -2
  519. package/dist/cli/chunks/sqlite-persistence-PGHU6VUR.js +0 -2
  520. package/dist/cli/chunks/sync-EFWXMA2H.js +0 -2
  521. package/dist/cli/chunks/token-bootstrap-S346YBVO.js +0 -2
  522. package/dist/cli/chunks/unified-memory-6CK3TUNQ.js +0 -2
  523. package/dist/cli/chunks/unified-memory-hnsw-A7BWBGYN.js +0 -2
  524. package/dist/cli/chunks/unified-persistence-GEPMDBQZ.js +0 -2
  525. package/dist/cli/chunks/visual-security-L4J7LQWT.js +0 -2
  526. package/dist/cli/chunks/witness-chain-CDUMX623.js +0 -2
  527. package/dist/cli/chunks/witness-chain-repair-WNYH6O4L.js +0 -2
  528. package/dist/cli/chunks/witness-key-manager-NQ5DAAC4.js +0 -2
  529. package/dist/cli/chunks/workflow-orchestrator-USJDWVDR.js +0 -2
  530. package/dist/cli/chunks/wrappers-CZDI6Z3X.js +0 -2
  531. /package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.test.ts → budget-tests.ts.fixture} +0 -0
  532. /package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.ts → budget.ts.fixture} +0 -0
  533. /package/.claude/skills/testability-scoring/resources/templates/{testability-scoring.spec.template.js → testability-scoring-spec.template.js} +0 -0
  534. /package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.test.ts → budget-tests.ts.fixture} +0 -0
  535. /package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.ts → budget.ts.fixture} +0 -0
  536. /package/assets/skills/testability-scoring/resources/templates/{testability-scoring.spec.template.js → testability-scoring-spec.template.js} +0 -0
@@ -9,6 +9,26 @@ import { getCodeMetricsAnalyzer } from '../../../shared/metrics/index.js';
9
9
  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
+ import { measuredCoverageSummary, measuredFileCoverage } from '../coverage-report-event.js';
13
+ /** Metrics the static analyzer produces when the caller asks for all of them. */
14
+ const ANALYZER_METRICS = ['coverage', 'complexity', 'maintainability', 'duplication', 'testability'];
15
+ /** Metrics computed from parsing each source file. */
16
+ const PARSED_METRICS = new Set(['complexity', 'maintainability', 'testability']);
17
+ /**
18
+ * #1021: a parsed metric with read/parse failures is still evidence when at
19
+ * least this share of the analysable files (in-scope minus excluded) was
20
+ * analysed. Below it, the unseen files are too large a blind spot for an
21
+ * average to describe the target, so the metric is unmeasured. 95% keeps one
22
+ * failure in a 20-file scope acceptable but not one in 10.
23
+ */
24
+ export const MIN_ANALYSED_SHARE = 0.95;
25
+ /** #1011: the sentinel for "not measured" in score and complexity fields. */
26
+ const UNMEASURED = -1;
27
+ /** First reasons of a failure list, for a one-line explanation. */
28
+ function summariseFailures(failures) {
29
+ return failures.slice(0, 3).map((f) => f.reason).join('; ')
30
+ + (failures.length > 3 ? `; and ${failures.length - 3} more` : '');
31
+ }
12
32
  const DEFAULT_CONFIG = {
13
33
  enableTrendAnalysis: true,
14
34
  trendDataPointsMin: 3,
@@ -52,14 +72,15 @@ export class QualityAnalyzerService {
52
72
  */
53
73
  constructor(memoryOrDependencies, config = {}) {
54
74
  this.config = { ...DEFAULT_CONFIG, ...config };
55
- this.metricsAnalyzer = getCodeMetricsAnalyzer();
56
75
  // Support both old and new constructor signatures
57
76
  if ('memory' in memoryOrDependencies) {
58
77
  // New signature: dependencies object
59
78
  this.memory = memoryOrDependencies.memory;
60
79
  this.llmRouter = memoryOrDependencies.llmRouter;
80
+ this.metricsAnalyzer = memoryOrDependencies.metricsAnalyzer ?? getCodeMetricsAnalyzer();
61
81
  }
62
82
  else {
83
+ this.metricsAnalyzer = getCodeMetricsAnalyzer();
63
84
  // Old signature: direct MemoryBackend
64
85
  this.memory = memoryOrDependencies;
65
86
  this.llmRouter = undefined;
@@ -84,11 +105,11 @@ export class QualityAnalyzerService {
84
105
  * Generate quality insights using LLM
85
106
  * Provides AI-powered explanation and prioritized recommendations
86
107
  */
87
- async generateQualityInsightsWithLLM(metrics, score, codeContext) {
108
+ async generateQualityInsightsWithLLM(metrics, score, codeContext, unmeasured = []) {
88
109
  if (!this.llmRouter)
89
110
  return null;
90
111
  try {
91
- const prompt = this.buildQualityInsightsPrompt(metrics, score, codeContext);
112
+ const prompt = this.buildQualityInsightsPrompt(metrics, score, codeContext, unmeasured);
92
113
  const modelId = this.getModelForTier(this.config.llmModelTier ?? 2);
93
114
  const response = await this.llmRouter.chat({
94
115
  messages: [
@@ -144,13 +165,18 @@ Focus on:
144
165
  /**
145
166
  * Build prompt for quality insights generation
146
167
  */
147
- buildQualityInsightsPrompt(metrics, score, codeContext) {
168
+ buildQualityInsightsPrompt(metrics, score, codeContext, unmeasured = []) {
148
169
  let prompt = `## Quality Analysis Results\n\n`;
149
- prompt += `### Overall Score: ${score.overall}/100\n\n`;
170
+ prompt += score.overall >= 0
171
+ ? `### Overall Score: ${score.overall}/100\n\n`
172
+ : `### Overall Score: not measured\n\n`;
150
173
  prompt += `### Detailed Metrics:\n`;
151
174
  for (const metric of metrics) {
152
175
  prompt += `- **${metric.name}**: ${metric.value} (Rating: ${metric.rating}, Trend: ${metric.trend})\n`;
153
176
  }
177
+ for (const missing of unmeasured) {
178
+ prompt += `- **${missing.metric}**: not measured (${missing.reason})\n`;
179
+ }
154
180
  prompt += `\n`;
155
181
  // #996: -1 means "not measured"; never present it to the model as a value.
156
182
  const show = (value, unit = '') => (value >= 0 ? `${value}${unit}` : 'not measured');
@@ -234,8 +260,8 @@ Focus on:
234
260
  if (sourceFiles.length === 0) {
235
261
  return err(new Error('No source files provided for analysis'));
236
262
  }
237
- // Analyze metrics for each file
238
- const fileMetrics = await this.collectFileMetrics(sourceFiles, includeMetrics);
263
+ // Analyze metrics for each file; failures become unmeasured (#1011)
264
+ const { fileMetrics, unmeasured, excluded, partial } = await this.collectFileMetrics(sourceFiles, includeMetrics, request.explicitFiles ?? []);
239
265
  // Calculate aggregated metrics
240
266
  const metricDetails = this.aggregateMetrics(fileMetrics);
241
267
  // Calculate overall quality score
@@ -249,7 +275,7 @@ Focus on:
249
275
  // ADR-051: Generate LLM insights if enabled
250
276
  let llmInsights;
251
277
  if (this.isLLMInsightsAvailable()) {
252
- const insights = await this.generateQualityInsightsWithLLM(metricDetails, score);
278
+ const insights = await this.generateQualityInsightsWithLLM(metricDetails, score, undefined, unmeasured);
253
279
  if (insights) {
254
280
  llmInsights = insights;
255
281
  }
@@ -260,6 +286,9 @@ Focus on:
260
286
  trends,
261
287
  recommendations,
262
288
  llmInsights,
289
+ unmeasured,
290
+ excluded,
291
+ partial,
263
292
  };
264
293
  // Store the report
265
294
  await this.storeReport(report, sourceFiles);
@@ -344,88 +373,148 @@ Focus on:
344
373
  // ============================================================================
345
374
  // Private Helper Methods
346
375
  // ============================================================================
347
- async collectFileMetrics(files, includeMetrics) {
376
+ /**
377
+ * Collect per-file metric values. #1011 / #1021:
378
+ * - excluded files (binary, generated, minified, declarations, refused by
379
+ * reader policy) leave the scope with a reason;
380
+ * - failed files (unreadable, unparseable) make a parsed metric partial, or
381
+ * unmeasured below MIN_ANALYSED_SHARE or when a failed file was named
382
+ * explicitly;
383
+ * - failed duplication detection and missing coverage are unmeasured.
384
+ * Never a fixed fallback value.
385
+ */
386
+ async collectFileMetrics(files, includeMetrics, explicitFiles) {
387
+ const requested = includeMetrics.length === 0 ? [...ANALYZER_METRICS] : includeMetrics;
388
+ const wants = (metric) => requested.includes(metric);
348
389
  const fileMetrics = new Map();
349
- const includeAll = includeMetrics.length === 0;
350
- // Collect duplication across all files if requested
351
- let duplicationPercentage = 0;
352
- if (includeAll || includeMetrics.includes('duplication')) {
353
- try {
354
- const duplicationResult = await this.metricsAnalyzer.detectDuplication(files);
355
- duplicationPercentage = duplicationResult.percentage;
356
- }
357
- catch {
358
- duplicationPercentage = 0;
359
- }
360
- }
390
+ const unmeasured = [];
391
+ const excluded = [];
392
+ const partial = [];
393
+ const parseFailed = [];
394
+ const unreadable = [];
395
+ const readable = [];
396
+ const missingCoverage = [];
397
+ const explicit = new Set(explicitFiles);
398
+ const needsAnalysis = requested.some((m) => PARSED_METRICS.has(m) || m === 'duplication');
361
399
  for (const file of files) {
362
400
  const metrics = {};
363
- // Analyze the file using CodeMetricsAnalyzer
364
- const fileAnalysis = await this.metricsAnalyzer.analyzeFile(file);
365
- if (fileAnalysis) {
366
- // Real metrics from analysis
367
- if (includeAll || includeMetrics.includes('complexity')) {
368
- metrics.complexity = fileAnalysis.cyclomaticComplexity;
369
- }
370
- if (includeAll || includeMetrics.includes('maintainability')) {
371
- metrics.maintainability = fileAnalysis.maintainabilityIndex;
401
+ if (needsAnalysis) {
402
+ const outcome = await this.metricsAnalyzer.analyzeFileDetailed(file);
403
+ const reason = outcome.reason ?? `${file} could not be analysed`;
404
+ if (outcome.status === 'excluded') {
405
+ excluded.push({ file, reason });
406
+ continue;
372
407
  }
373
- if (includeAll || includeMetrics.includes('duplication')) {
374
- metrics.duplication = duplicationPercentage;
408
+ if (outcome.metrics)
409
+ readable.push(file);
410
+ if (outcome.status === 'failed') {
411
+ (outcome.metrics ? parseFailed : unreadable).push({ file, reason });
375
412
  }
376
- if (includeAll || includeMetrics.includes('testability')) {
377
- // Testability is derived from complexity and maintainability
378
- // Lower complexity and higher maintainability = higher testability
379
- const complexityFactor = Math.max(0, 100 - fileAnalysis.cyclomaticComplexity * 3);
380
- const maintainabilityFactor = fileAnalysis.maintainabilityIndex;
381
- metrics.testability = Math.round((complexityFactor * 0.4 + maintainabilityFactor * 0.6) * 100) / 100;
382
- }
383
- if (includeAll || includeMetrics.includes('coverage')) {
384
- // Coverage requires external data (from test runners)
385
- // Only use real stored coverage — never fabricate a number
386
- const storedCoverage = await this.getStoredCoverage(file);
387
- if (storedCoverage !== null) {
388
- metrics.coverage = storedCoverage;
413
+ else if (outcome.metrics) {
414
+ const analysis = outcome.metrics;
415
+ if (wants('complexity'))
416
+ metrics.complexity = analysis.cyclomaticComplexity;
417
+ if (wants('maintainability'))
418
+ metrics.maintainability = analysis.maintainabilityIndex;
419
+ if (wants('testability')) {
420
+ // Testability is derived from complexity and maintainability
421
+ // Lower complexity and higher maintainability = higher testability
422
+ const complexityFactor = Math.max(0, 100 - analysis.cyclomaticComplexity * 3);
423
+ const maintainabilityFactor = analysis.maintainabilityIndex;
424
+ metrics.testability = Math.round((complexityFactor * 0.4 + maintainabilityFactor * 0.6) * 100) / 100;
389
425
  }
390
- // If no coverage data exists, omit the metric rather than guessing
391
426
  }
392
427
  }
393
- else {
394
- // Fallback for files that couldn't be analyzed
395
- if (includeAll || includeMetrics.includes('coverage')) {
396
- // Only use real stored coverage — never fabricate a number
397
- const storedCoverage = await this.getStoredCoverage(file);
398
- if (storedCoverage !== null) {
399
- metrics.coverage = storedCoverage;
400
- }
401
- }
402
- if (includeAll || includeMetrics.includes('complexity')) {
403
- metrics.complexity = 10;
404
- }
405
- if (includeAll || includeMetrics.includes('maintainability')) {
406
- metrics.maintainability = 70;
407
- }
408
- if (includeAll || includeMetrics.includes('duplication')) {
409
- metrics.duplication = duplicationPercentage;
428
+ if (wants('coverage')) {
429
+ // Coverage requires external data (from test runners) — never fabricate a number
430
+ const storedCoverage = await this.getStoredCoverage(file);
431
+ if (storedCoverage !== null) {
432
+ metrics.coverage = storedCoverage;
410
433
  }
411
- if (includeAll || includeMetrics.includes('testability')) {
412
- metrics.testability = 70;
434
+ else {
435
+ missingCoverage.push(file);
413
436
  }
414
437
  }
415
438
  fileMetrics.set(file, metrics);
416
439
  }
417
- return fileMetrics;
440
+ const total = fileMetrics.size;
441
+ if (missingCoverage.length > 0) {
442
+ for (const metrics of fileMetrics.values())
443
+ delete metrics.coverage;
444
+ unmeasured.push({
445
+ metric: 'coverage',
446
+ reason: `no measured coverage recorded for ${missingCoverage.length} of ${total} file(s)`,
447
+ });
448
+ }
449
+ /** Decide whether a metric with these failures is measured, partial or unmeasured. */
450
+ const judge = (metric, failures) => {
451
+ const analysed = total - failures.length;
452
+ if (analysed === 0) {
453
+ unmeasured.push({
454
+ metric,
455
+ reason: total === 0
456
+ ? `no analysable files: ${excluded.length} file(s) excluded (${summariseFailures(excluded)})`
457
+ : `none of ${total} file(s) could be analysed: ${summariseFailures(failures)}`,
458
+ ...(failures.length > 0 ? { files: failures.map((f) => f.file) } : {}),
459
+ });
460
+ return false;
461
+ }
462
+ if (failures.length === 0)
463
+ return true;
464
+ const share = analysed / total;
465
+ // Round DOWN so a partial scope never reads as 1 / 100% (#1021).
466
+ const permille = Math.floor((analysed * 1000) / total);
467
+ const coverageOfScope = permille / 1000;
468
+ const explicitFailure = failures.find((f) => explicit.has(f.file));
469
+ if (explicitFailure || share < MIN_ANALYSED_SHARE) {
470
+ const why = explicitFailure
471
+ ? `explicit target ${explicitFailure.file} could not be analysed`
472
+ : `${analysed} of ${total} file(s) analysed (${permille / 10}%, below ${MIN_ANALYSED_SHARE * 100}%)`;
473
+ unmeasured.push({
474
+ metric,
475
+ reason: `${why}: ${summariseFailures(failures)}`,
476
+ files: failures.map((f) => f.file),
477
+ });
478
+ return false;
479
+ }
480
+ partial.push({ metric, analysedFiles: analysed, totalFiles: total, coverageOfScope, failed: failures });
481
+ return true;
482
+ };
483
+ const failedToParse = [...unreadable, ...parseFailed];
484
+ for (const metric of requested.filter((m) => PARSED_METRICS.has(m))) {
485
+ if (!judge(metric, failedToParse)) {
486
+ for (const metrics of fileMetrics.values())
487
+ delete metrics[metric];
488
+ }
489
+ }
490
+ // Duplication needs readable text, not a parse (#1021 N2).
491
+ if (wants('duplication') && judge('duplication', unreadable)) {
492
+ try {
493
+ const { percentage } = await this.metricsAnalyzer.detectDuplication(readable);
494
+ for (const metrics of fileMetrics.values())
495
+ metrics.duplication = percentage;
496
+ }
497
+ catch (error) {
498
+ const index = partial.findIndex((p) => p.metric === 'duplication');
499
+ if (index >= 0)
500
+ partial.splice(index, 1);
501
+ unmeasured.push({ metric: 'duplication', reason: `duplication detection failed: ${toError(error).message}` });
502
+ }
503
+ }
504
+ return { fileMetrics, unmeasured, excluded, partial };
418
505
  }
419
506
  async getStoredCoverage(file) {
420
507
  try {
421
508
  // 1. Try per-file coverage stored by test executor
422
- const fileCoverage = await this.memory.get(`coverage:file:${file}`);
423
- if (fileCoverage && typeof fileCoverage.line === 'number') {
509
+ // #1014: only measured records count. Legacy unstamped estimate
510
+ // records (written by <= 3.15.4, never expiring) are ignored.
511
+ const fileCoverage = measuredFileCoverage(await this.memory.get(`coverage:file:${file}`));
512
+ if (fileCoverage) {
424
513
  return fileCoverage.line;
425
514
  }
426
515
  // 2. Fall back to project-wide summary from coverage-analyzer
427
- const summary = await this.memory.get('coverage:latest');
428
- if (summary && typeof summary.line === 'number') {
516
+ const summary = measuredCoverageSummary(await this.memory.get('coverage:latest'));
517
+ if (summary) {
429
518
  return summary.line;
430
519
  }
431
520
  // No coverage data available — return null (never fabricate)
@@ -480,17 +569,18 @@ Focus on:
480
569
  weightedSum += normalizedValue * weight;
481
570
  totalWeight += weight;
482
571
  }
483
- const overall = totalWeight > 0 ? Math.round(weightedSum / totalWeight) : 0;
572
+ // #1011: no measured metric means no score — -1, never 0.
573
+ const overall = totalWeight > 0 ? Math.round(weightedSum / totalWeight) : UNMEASURED;
484
574
  // Use -1 to signal "no data available" rather than 0 which implies "0% coverage"
485
575
  // (#996: the same holds for every score field — never fabricate a value).
486
- const valueOf = (name) => metrics.find((m) => m.name === name)?.value ?? -1;
576
+ const valueOf = (name) => metrics.find((m) => m.name === name)?.value ?? UNMEASURED;
487
577
  return {
488
578
  overall,
489
579
  coverage: valueOf('coverage'),
490
580
  complexity: valueOf('complexity'),
491
581
  maintainability: valueOf('maintainability'),
492
582
  // No security analysis runs here; -1 = not measured (was a fixed 85 placeholder).
493
- security: -1,
583
+ security: UNMEASURED,
494
584
  };
495
585
  }
496
586
  async generateTrends(currentMetrics, _compareBaseline) {
@@ -559,7 +649,7 @@ Focus on:
559
649
  });
560
650
  }
561
651
  // Overall score recommendation
562
- if (score.overall < 70) {
652
+ if (score.overall >= 0 && score.overall < 70) {
563
653
  recommendations.push({
564
654
  type: 'critical',
565
655
  title: 'Overall Quality Improvement Needed',
@@ -575,50 +665,43 @@ Focus on:
575
665
  }
576
666
  async analyzeFileComplexity(file, requestedMetrics) {
577
667
  const includesAll = requestedMetrics.length === 0;
668
+ const wants = (metric) => includesAll || requestedMetrics.includes(metric);
578
669
  // Use real CodeMetricsAnalyzer for file analysis
579
- const fileAnalysis = await this.metricsAnalyzer.analyzeFile(file);
580
- if (fileAnalysis) {
670
+ const { status, metrics: analysis, reason } = await this.metricsAnalyzer.analyzeFileDetailed(file);
671
+ if (status !== 'measured' || !analysis) {
672
+ // #1011: never invent values for a file that could not be analysed
581
673
  return {
582
674
  path: file,
583
- cyclomatic: includesAll || requestedMetrics.includes('cyclomatic')
584
- ? fileAnalysis.cyclomaticComplexity
585
- : 0,
586
- cognitive: includesAll || requestedMetrics.includes('cognitive')
587
- ? fileAnalysis.cognitiveComplexity
588
- : 0,
589
- maintainability: includesAll || requestedMetrics.includes('maintainability')
590
- ? fileAnalysis.maintainabilityIndex
591
- : 0,
592
- linesOfCode: fileAnalysis.linesOfCode,
675
+ cyclomatic: UNMEASURED,
676
+ cognitive: UNMEASURED,
677
+ maintainability: UNMEASURED,
678
+ linesOfCode: UNMEASURED,
679
+ unmeasuredReason: reason ?? `${file} could not be analysed`,
593
680
  };
594
681
  }
595
- // Fallback for files that couldn't be analyzed
682
+ // A metric that was not requested is not measured (-1), not 0 — a 0
683
+ // maintainability would otherwise be reported as a critical hotspot.
596
684
  return {
597
685
  path: file,
598
- cyclomatic: includesAll || requestedMetrics.includes('cyclomatic') ? 5 : 0,
599
- cognitive: includesAll || requestedMetrics.includes('cognitive') ? 8 : 0,
600
- maintainability: includesAll || requestedMetrics.includes('maintainability') ? 70 : 0,
601
- linesOfCode: 100,
686
+ cyclomatic: wants('cyclomatic') ? analysis.cyclomaticComplexity : UNMEASURED,
687
+ cognitive: wants('cognitive') ? analysis.cognitiveComplexity : UNMEASURED,
688
+ maintainability: wants('maintainability') ? analysis.maintainabilityIndex : UNMEASURED,
689
+ linesOfCode: analysis.linesOfCode,
602
690
  };
603
691
  }
604
692
  calculateComplexitySummary(files) {
605
- if (files.length === 0) {
606
- return {
607
- averageCyclomatic: 0,
608
- averageCognitive: 0,
609
- averageMaintainability: 0,
610
- totalLinesOfCode: 0,
611
- };
612
- }
613
- const sumCyclomatic = files.reduce((sum, f) => sum + f.cyclomatic, 0);
614
- const sumCognitive = files.reduce((sum, f) => sum + f.cognitive, 0);
615
- const sumMaintainability = files.reduce((sum, f) => sum + f.maintainability, 0);
616
- const totalLOC = files.reduce((sum, f) => sum + f.linesOfCode, 0);
693
+ // #1011: average measured values only; -1 when nothing was measured.
694
+ const average = (values) => {
695
+ const measured = values.filter((v) => v >= 0);
696
+ if (measured.length === 0)
697
+ return UNMEASURED;
698
+ return Math.round((measured.reduce((sum, v) => sum + v, 0) / measured.length) * 100) / 100;
699
+ };
617
700
  return {
618
- averageCyclomatic: Math.round((sumCyclomatic / files.length) * 100) / 100,
619
- averageCognitive: Math.round((sumCognitive / files.length) * 100) / 100,
620
- averageMaintainability: Math.round((sumMaintainability / files.length) * 100) / 100,
621
- totalLinesOfCode: totalLOC,
701
+ averageCyclomatic: average(files.map((f) => f.cyclomatic)),
702
+ averageCognitive: average(files.map((f) => f.cognitive)),
703
+ averageMaintainability: average(files.map((f) => f.maintainability)),
704
+ totalLinesOfCode: files.reduce((sum, f) => sum + Math.max(0, f.linesOfCode), 0),
622
705
  };
623
706
  }
624
707
  identifyHotspots(files) {
@@ -647,8 +730,8 @@ Focus on:
647
730
  : 'Simplify control flow and reduce nesting depth.',
648
731
  });
649
732
  }
650
- // Check maintainability (lower is worse)
651
- if (file.maintainability <= thresholds.maintainability.warning) {
733
+ // Check maintainability (lower is worse); -1 = not measured, never a hotspot
734
+ if (file.maintainability >= 0 && file.maintainability <= thresholds.maintainability.warning) {
652
735
  hotspots.push({
653
736
  file: file.path,
654
737
  function: 'unknown',
@@ -6,6 +6,7 @@ import { LoggerFactory } from '../../../../logging/index.js';
6
6
  import { v4 as uuidv4 } from 'uuid';
7
7
  import { ok, err } from '../../../../shared/types/index.js';
8
8
  import { toError } from '../../../../shared/error-utils.js';
9
+ import { fetchWithResponseDeadline } from '../../../../shared/llm/providers/response-deadline.js';
9
10
  import { analyzeSecurityHeaders, analyzeCookieSecurity, analyzeServerHeaders, scanSensitiveFiles, analyzeCORS, extractAndCrawlLinks, testXSS, testSQLi, analyzeFormsForSecurityIssues, testAuthorizationBypass, testIDOR, validateCredentials, buildAuthHeaders, handleFetchError, calculateSummary, storeScanResults, } from './dast-helpers.js';
10
11
  // ============================================================================
11
12
  // DAST Scanner Service
@@ -144,20 +145,19 @@ export class DASTScanner {
144
145
  }
145
146
  const timeout = options.timeout ?? this.config.timeout;
146
147
  const maxDepth = options.maxDepth ?? this.config.dastMaxDepth;
147
- // Perform main page scan
148
- const controller = new AbortController();
149
- const timeoutId = setTimeout(() => controller.abort(), Math.min(timeout, 30000));
148
+ // Perform main page scan. #980: the deadline must cover the body too —
149
+ // the target is untrusted and may send headers and then stall the body,
150
+ // so it stays armed until `response.clone().text()` below has finished.
151
+ const deadlineMs = Math.min(timeout, 30000);
150
152
  try {
151
- const response = await fetch(targetUrl, {
153
+ const response = await fetchWithResponseDeadline(targetUrl, {
152
154
  method: 'GET',
153
155
  headers: {
154
156
  'User-Agent': 'AgenticQE-DAST-Scanner/3.0',
155
157
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
156
158
  },
157
- signal: controller.signal,
158
159
  redirect: 'follow',
159
- });
160
- clearTimeout(timeoutId);
160
+ }, deadlineMs, () => new Error(`DAST request timeout after ${deadlineMs}ms: ${targetUrl}`));
161
161
  crawledUrls++;
162
162
  // Security header analysis
163
163
  analyzeSecurityHeaders(response.headers, targetUrl, vulnerabilities);
@@ -171,19 +171,25 @@ export class DASTScanner {
171
171
  analyzeServerHeaders(response.headers, targetUrl, vulnerabilities);
172
172
  // Active scanning features
173
173
  if (options.activeScanning ?? this.config.dastActiveScanning) {
174
+ // Read the page body first, inside the request deadline (#980), so the
175
+ // slower probes below cannot use up the deadline of a healthy target.
176
+ const responseText = await response.text();
174
177
  crawledUrls = await scanSensitiveFiles(parsedUrl, crawledUrls, maxDepth, vulnerabilities);
175
178
  await analyzeCORS(targetUrl, vulnerabilities);
176
179
  // Enhanced DAST: Link crawling, injection testing, form analysis
177
- const responseText = await response.clone().text();
178
180
  crawledUrls = await extractAndCrawlLinks(responseText, parsedUrl, crawledUrls, maxDepth, vulnerabilities);
179
181
  if (parsedUrl.search) {
180
182
  await this.testInjectionVulnerabilities(targetUrl, parsedUrl, vulnerabilities);
181
183
  }
182
184
  analyzeFormsForSecurityIssues(responseText, targetUrl, vulnerabilities);
183
185
  }
186
+ else {
187
+ // Passive scan: headers only. Release the connection instead of
188
+ // leaving an unread body to the deadline timer.
189
+ await response.body?.cancel().catch(() => undefined);
190
+ }
184
191
  }
185
192
  catch (fetchError) {
186
- clearTimeout(timeoutId);
187
193
  handleFetchError(fetchError, targetUrl, vulnerabilities);
188
194
  }
189
195
  }
@@ -210,20 +216,21 @@ export class DASTScanner {
210
216
  }
211
217
  const timeout = options.timeout ?? this.config.timeout;
212
218
  const maxDepth = options.maxDepth ?? this.config.dastMaxDepth;
213
- const controller = new AbortController();
214
- const timeoutId = setTimeout(() => controller.abort(), Math.min(timeout, 30000));
219
+ // #980 review N8: same deadline treatment as the unauthenticated scan.
220
+ // This path reads headers only; the unread body is cancelled below so
221
+ // a target that stalls it cannot hold the connection open.
222
+ const deadlineMs = Math.min(timeout, 30000);
215
223
  try {
216
- const response = await fetch(targetUrl, {
224
+ const response = await fetchWithResponseDeadline(targetUrl, {
217
225
  method: 'GET',
218
226
  headers: {
219
227
  'User-Agent': 'AgenticQE-DAST-Scanner/3.0',
220
228
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
221
229
  ...authHeaders,
222
230
  },
223
- signal: controller.signal,
224
231
  redirect: 'follow',
225
- });
226
- clearTimeout(timeoutId);
232
+ }, deadlineMs, () => new Error(`DAST request timeout after ${deadlineMs}ms: ${targetUrl}`));
233
+ await response.body?.cancel().catch(() => undefined);
227
234
  crawledUrls++;
228
235
  // Check if authentication was successful
229
236
  if (response.status === 401 || response.status === 403) {
@@ -244,7 +251,6 @@ export class DASTScanner {
244
251
  analyzeCookieSecurity(response.headers, targetUrl, vulnerabilities, true);
245
252
  }
246
253
  catch (fetchError) {
247
- clearTimeout(timeoutId);
248
254
  handleFetchError(fetchError, targetUrl, vulnerabilities);
249
255
  }
250
256
  }
@@ -76,9 +76,11 @@ export interface ITestRunResult {
76
76
  export interface IFileCoverageData {
77
77
  path: string;
78
78
  line: number;
79
- branch: number;
80
- function: number;
81
- statement: number;
79
+ /** `null` = no branches in the file (istanbul 0/0): not collected, not 100% (#1015). */
80
+ branch: number | null;
81
+ /** `null` = no functions in the file (istanbul 0/0): not collected, not 100% (#1015). */
82
+ function: number | null;
83
+ statement: number | null;
82
84
  }
83
85
  export interface IFailedTest {
84
86
  testId: string;
@@ -90,9 +92,11 @@ export interface IFailedTest {
90
92
  }
91
93
  export interface ICoverageData {
92
94
  line: number;
93
- branch: number;
94
- function: number;
95
- statement: number;
95
+ /** `null` = not collected (no branches anywhere), never a fake 0 or 100 (#1015). */
96
+ branch: number | null;
97
+ /** `null` = not collected (no functions anywhere), never a fake 0 or 100 (#1015). */
98
+ function: number | null;
99
+ statement: number | null;
96
100
  }
97
101
  export interface IFlakyDetectionRequest {
98
102
  testFiles: string[];
@@ -6,6 +6,7 @@ import { err } from '../../shared/types/index.js';
6
6
  import { BaseDomainPlugin } from '../domain-interface.js';
7
7
  import { createTestExecutionCoordinator } from './coordinator.js';
8
8
  import { getGlobalInfraHealing } from '../../strange-loop/infra-healing/global-instance.js';
9
+ import { isMeasuredGapPayload } from '../../shared/events/domain-events.js';
9
10
  // ============================================================================
10
11
  // Plugin Implementation
11
12
  // ============================================================================
@@ -200,6 +201,9 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
200
201
  });
201
202
  }
202
203
  async handleCoverageGapDetected(event) {
204
+ // #1014: only a gap found in MEASURED coverage is acted on / learned from.
205
+ if (!isMeasuredGapPayload(event.payload))
206
+ return;
203
207
  const payload = event.payload;
204
208
  // Could trigger targeted test execution for high-risk gaps
205
209
  if (payload.riskScore > 0.7) {