agentic-qe 3.15.13 → 3.15.14

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 (409) hide show
  1. package/.claude/helpers/brain-checkpoint.cjs +124 -5
  2. package/.claude/skills/skills-manifest.json +1 -1
  3. package/CHANGELOG.md +78 -0
  4. package/assets/skills/skills-manifest.json +1 -1
  5. package/dist/cli/bundle.js +6 -6
  6. package/dist/cli/chunks/adapter-23KA2YW7.js +2 -0
  7. package/dist/cli/chunks/{agent-booster-wasm-6RRQWMNE.js → agent-booster-wasm-2DLAEZK6.js} +2 -2
  8. package/dist/cli/chunks/{agent-handler-AOH6TV7W.js → agent-handler-P3IY7XEE.js} +2 -2
  9. package/dist/cli/chunks/{agent-memory-branch-2P54SF5N.js → agent-memory-branch-WWKC2H3G.js} +2 -2
  10. package/dist/cli/chunks/aqe-learning-engine-MUICAXW5.js +2 -0
  11. package/dist/cli/chunks/{arena-X6MOGQHA.js → arena-4BMFF6BS.js} +4 -4
  12. package/dist/cli/chunks/{arena-NSVFCAF5.js → arena-EIV5OALF.js} +2 -2
  13. package/dist/cli/chunks/{audit-27DJLQNM.js → audit-DNTI453H.js} +3 -3
  14. package/dist/cli/chunks/base-XPWGYDKD.js +2 -0
  15. package/dist/cli/chunks/{better-sqlite3-BU5GXILS.js → better-sqlite3-TQBQGNC6.js} +2 -2
  16. package/dist/cli/chunks/brain-handler-HY57CNAO.js +95 -0
  17. package/dist/cli/chunks/{branch-enumerator-5CLULOCU.js → branch-enumerator-THPMZPHQ.js} +2 -2
  18. package/dist/cli/chunks/{browser-R4DMU3LN.js → browser-O6JJOZCK.js} +2 -2
  19. package/dist/cli/chunks/browser-workflow-UMQVBVGK.js +2 -0
  20. package/dist/cli/chunks/{chunk-VU5TBX2V.js → chunk-2HPNGK7A.js} +2 -2
  21. package/dist/cli/chunks/{chunk-5FKWCZNF.js → chunk-2IJO3657.js} +2 -2
  22. package/dist/cli/chunks/{chunk-K3TLLJMX.js → chunk-2QLE6NDW.js} +1 -1
  23. package/dist/cli/chunks/{chunk-J2ZIFFM6.js → chunk-2UZBLC5H.js} +2 -2
  24. package/dist/cli/chunks/{chunk-HD7YIFOI.js → chunk-2W5MQDHM.js} +2 -2
  25. package/dist/cli/chunks/{chunk-F3YS57NF.js → chunk-3FITMWWJ.js} +2 -2
  26. package/dist/cli/chunks/{chunk-K4CZA77U.js → chunk-3TF27MG5.js} +2 -2
  27. package/dist/cli/chunks/{chunk-BLSLEVDI.js → chunk-3XACRXBY.js} +2 -2
  28. package/dist/cli/chunks/{chunk-A64JFBWI.js → chunk-43XHGWYH.js} +2 -2
  29. package/dist/cli/chunks/{chunk-42J34YG4.js → chunk-4RPBODN5.js} +2 -2
  30. package/dist/cli/chunks/{chunk-W26B7ERY.js → chunk-4T7XV5KQ.js} +1 -1
  31. package/dist/cli/chunks/{chunk-SSU73QAX.js → chunk-4WLIOPHX.js} +2 -2
  32. package/dist/cli/chunks/{chunk-P7A4NKTZ.js → chunk-52KOPIMI.js} +2 -2
  33. package/dist/cli/chunks/{chunk-HQZGPJYG.js → chunk-56NSE3LJ.js} +2 -2
  34. package/dist/cli/chunks/{chunk-AQSVJNEH.js → chunk-57DRT6UA.js} +2 -2
  35. package/dist/cli/chunks/{chunk-M6AAGIG7.js → chunk-57FX3GP6.js} +1 -1
  36. package/dist/cli/chunks/{chunk-O6FGXMHD.js → chunk-5PLBQZ5J.js} +1 -1
  37. package/dist/cli/chunks/{chunk-ASQYASNV.js → chunk-5Y7UFHJD.js} +1 -1
  38. package/dist/cli/chunks/{chunk-5VMAV6T6.js → chunk-5Z4MO2F3.js} +1 -1
  39. package/dist/cli/chunks/chunk-65EE2EST.js +8 -0
  40. package/dist/cli/chunks/{chunk-7CMTY45A.js → chunk-6NIGSY5L.js} +2 -2
  41. package/dist/cli/chunks/chunk-6O63ZTVX.js +3 -0
  42. package/dist/cli/chunks/{chunk-FZ76G4QJ.js → chunk-6OI5SK7M.js} +1 -1
  43. package/dist/cli/chunks/{chunk-5ZGM3RMH.js → chunk-6P4Q4RTC.js} +1 -1
  44. package/dist/cli/chunks/{chunk-LUZNKJE6.js → chunk-7724KXM2.js} +3 -3
  45. package/dist/cli/chunks/{chunk-XPRVF4YE.js → chunk-7MISCSL5.js} +2 -2
  46. package/dist/cli/chunks/{chunk-TCBBNUBP.js → chunk-7MUO4DEH.js} +3 -3
  47. package/dist/cli/chunks/{chunk-NT4DBXSX.js → chunk-7QUSNBAA.js} +2 -2
  48. package/dist/cli/chunks/{chunk-TWDW32W2.js → chunk-7SQTLUEN.js} +2 -2
  49. package/dist/cli/chunks/{chunk-QPNG5ZN2.js → chunk-7T6L3LFN.js} +2 -2
  50. package/dist/cli/chunks/{chunk-E56B6IDX.js → chunk-7TH4PJSU.js} +2 -2
  51. package/dist/cli/chunks/{chunk-LZYQHVD4.js → chunk-7Y3LXH57.js} +2 -2
  52. package/dist/cli/chunks/{chunk-YQFLQE53.js → chunk-A2T56XVL.js} +2 -2
  53. package/dist/cli/chunks/{chunk-KV4T4MXK.js → chunk-AJVLVF7V.js} +2 -2
  54. package/dist/cli/chunks/{chunk-VTDFVFST.js → chunk-ARRBXCII.js} +2 -2
  55. package/dist/cli/chunks/{chunk-G6WDYBLQ.js → chunk-AYLEH2UF.js} +1 -1
  56. package/dist/cli/chunks/{chunk-526QYFJU.js → chunk-BBYJBZHG.js} +2 -2
  57. package/dist/cli/chunks/{chunk-CM4LSLKR.js → chunk-BM3EJLMV.js} +2 -2
  58. package/dist/cli/chunks/{chunk-DVGRPK7A.js → chunk-BNG4J3CE.js} +2 -2
  59. package/dist/cli/chunks/{chunk-BK577VL7.js → chunk-BPDAQB3F.js} +2 -2
  60. package/dist/cli/chunks/{chunk-C6JTLKG7.js → chunk-BQJ7CV53.js} +9 -9
  61. package/dist/cli/chunks/{chunk-GB6HBNH2.js → chunk-C3OIBFAA.js} +2 -2
  62. package/dist/cli/chunks/{chunk-RF7HWBHN.js → chunk-CAZM63TP.js} +2 -2
  63. package/dist/cli/chunks/{chunk-KWYH3FI4.js → chunk-CIINJHOX.js} +1 -1
  64. package/dist/cli/chunks/{chunk-ARJW4I2O.js → chunk-CPPYZYXC.js} +2 -2
  65. package/dist/cli/chunks/{chunk-CRWPZT74.js → chunk-D3ZZ2NLL.js} +2 -2
  66. package/dist/cli/chunks/{chunk-Q3UDLV5Z.js → chunk-D5GB5PUU.js} +1 -1
  67. package/dist/cli/chunks/{chunk-7PLIEBY7.js → chunk-DLTB5KCR.js} +2 -2
  68. package/dist/cli/chunks/{chunk-YZWBNBTW.js → chunk-DRLSJJIC.js} +2 -2
  69. package/dist/cli/chunks/{chunk-BEGR4D6N.js → chunk-DSQESXL4.js} +2 -2
  70. package/dist/cli/chunks/{chunk-72ASBE35.js → chunk-E2JLAW3U.js} +3 -3
  71. package/dist/cli/chunks/{chunk-MAMQA43L.js → chunk-E3QIQMMN.js} +1 -1
  72. package/dist/cli/chunks/{chunk-WOCGL4QP.js → chunk-E7OR6V3V.js} +2 -2
  73. package/dist/cli/chunks/{chunk-MVVB7C2E.js → chunk-E7QTWGPI.js} +156 -156
  74. package/dist/cli/chunks/{chunk-JQGMW45H.js → chunk-EC65UZ77.js} +1 -1
  75. package/dist/cli/chunks/{chunk-YXRASAPI.js → chunk-EIEEST4T.js} +2 -2
  76. package/dist/cli/chunks/{chunk-AL6FBH3E.js → chunk-FHPNWHY7.js} +2 -2
  77. package/dist/cli/chunks/{chunk-C7JM7CD3.js → chunk-FJOIBZUB.js} +2 -2
  78. package/dist/cli/chunks/{chunk-LL7LDPXS.js → chunk-FTYRPEJS.js} +1 -1
  79. package/dist/cli/chunks/{chunk-MFW5HSG4.js → chunk-G7HGUQAE.js} +2 -2
  80. package/dist/cli/chunks/{chunk-WQL7WCIZ.js → chunk-GY4P7KAI.js} +1 -1
  81. package/dist/cli/chunks/{chunk-3YNLWPBF.js → chunk-H3C5FJRH.js} +2 -2
  82. package/dist/cli/chunks/{chunk-W3INMZZ6.js → chunk-H4LYXLAT.js} +1 -1
  83. package/dist/cli/chunks/{chunk-W3PPFHI5.js → chunk-HAYKLXCT.js} +52 -50
  84. package/dist/cli/chunks/{chunk-XNBOGCF3.js → chunk-HEDGFKC5.js} +2 -2
  85. package/dist/cli/chunks/{chunk-SYV2V3PL.js → chunk-HHBF2BZC.js} +4 -4
  86. package/dist/cli/chunks/{chunk-75RDHBAX.js → chunk-HSDWPQQY.js} +3 -3
  87. package/dist/cli/chunks/{chunk-6KATY3KS.js → chunk-HTVGHHX2.js} +2 -2
  88. package/dist/cli/chunks/{chunk-VRVMIPTM.js → chunk-HV43NX4A.js} +2 -2
  89. package/dist/cli/chunks/{chunk-RFNW2LGD.js → chunk-IDBA5GK2.js} +2 -2
  90. package/dist/cli/chunks/{chunk-DNDL7SOS.js → chunk-INGXD5IX.js} +2 -2
  91. package/dist/cli/chunks/{chunk-IJUHSJ2U.js → chunk-IQRPR4KB.js} +2 -2
  92. package/dist/cli/chunks/{chunk-UOC3O6RP.js → chunk-IRPNEXOU.js} +2 -2
  93. package/dist/cli/chunks/{chunk-KDVZND5Q.js → chunk-J35JWDJE.js} +1 -1
  94. package/dist/cli/chunks/{chunk-CV77DMDQ.js → chunk-J6ASX536.js} +2 -2
  95. package/dist/cli/chunks/{chunk-7YTGHGK4.js → chunk-JAOCHPYX.js} +2 -2
  96. package/dist/cli/chunks/{chunk-HZ5NXFXH.js → chunk-JB7R77SH.js} +2 -2
  97. package/dist/cli/chunks/{chunk-PB6J6HAA.js → chunk-JI67T6Q2.js} +2 -2
  98. package/dist/cli/chunks/{chunk-E7CLYGS7.js → chunk-JJHLGGPP.js} +1 -1
  99. package/dist/cli/chunks/{chunk-3Y7TJFHU.js → chunk-JK6PMLQQ.js} +2 -2
  100. package/dist/cli/chunks/{chunk-CCMKSHAT.js → chunk-JO26SG47.js} +2 -2
  101. package/dist/cli/chunks/{chunk-NU3W5WFT.js → chunk-JSSU4RIK.js} +2 -2
  102. package/dist/cli/chunks/{chunk-756CGMEH.js → chunk-K2SMP4OD.js} +1 -1
  103. package/dist/cli/chunks/{chunk-OCAEXYFA.js → chunk-K7GFYFBO.js} +2 -2
  104. package/dist/cli/chunks/{chunk-VRHRBAEM.js → chunk-K7RT6ITZ.js} +1 -1
  105. package/dist/cli/chunks/{chunk-LFJALJOA.js → chunk-KJ5A54ZH.js} +2 -2
  106. package/dist/cli/chunks/{chunk-3Y2ROSCL.js → chunk-L5VSLPMW.js} +2 -2
  107. package/dist/cli/chunks/{chunk-WKGTGOYS.js → chunk-L752CNG3.js} +3 -3
  108. package/dist/cli/chunks/{chunk-IC3TQEOA.js → chunk-L7PC675Y.js} +1 -1
  109. package/dist/cli/chunks/{chunk-TOQWL2ZF.js → chunk-LTGQJYYO.js} +2 -2
  110. package/dist/cli/chunks/{chunk-SVLQRAMF.js → chunk-M2TG7VDK.js} +1 -1
  111. package/dist/cli/chunks/{chunk-X7N2JF2X.js → chunk-M5JEA6ZY.js} +2 -2
  112. package/dist/cli/chunks/{chunk-GHM6MQNK.js → chunk-MB4UKUBV.js} +2 -2
  113. package/dist/cli/chunks/{chunk-R7SYRCRP.js → chunk-MKYOE7NE.js} +1 -1
  114. package/dist/cli/chunks/{chunk-3AN5TNGD.js → chunk-MQXWG55U.js} +3 -3
  115. package/dist/cli/chunks/{chunk-3QZEGE67.js → chunk-MR2OPUSA.js} +1 -1
  116. package/dist/cli/chunks/{chunk-6Z7PRBSG.js → chunk-N736GLWZ.js} +2 -2
  117. package/dist/cli/chunks/{chunk-PIDQVU3L.js → chunk-NHEG2DLN.js} +2 -2
  118. package/dist/cli/chunks/chunk-NKOLILT7.js +86 -0
  119. package/dist/cli/chunks/{chunk-UXZSUMEA.js → chunk-NPCXGX7N.js} +2 -2
  120. package/dist/cli/chunks/{chunk-XEAEYC6Y.js → chunk-NZQYJCO6.js} +1 -1
  121. package/dist/cli/chunks/{chunk-G77ERMUD.js → chunk-O2AAYJUV.js} +1 -1
  122. package/dist/cli/chunks/{chunk-H4GG2NLO.js → chunk-O32BFQV4.js} +2 -2
  123. package/dist/cli/chunks/{chunk-3LJ7LQMV.js → chunk-O3ERGUXH.js} +1 -1
  124. package/dist/cli/chunks/{chunk-QDEJ4CI2.js → chunk-O5CEL447.js} +2 -2
  125. package/dist/cli/chunks/{chunk-W2QWSQVE.js → chunk-O756AOUX.js} +2 -2
  126. package/dist/cli/chunks/{chunk-PSFSPGUD.js → chunk-OCN53CCK.js} +2 -2
  127. package/dist/cli/chunks/{chunk-KCW47QR5.js → chunk-OGEIHS76.js} +1 -1
  128. package/dist/cli/chunks/{chunk-3RZV5DGO.js → chunk-OLUOVNUF.js} +2 -2
  129. package/dist/cli/chunks/{chunk-KADFXPPN.js → chunk-P2TPH3TC.js} +2 -2
  130. package/dist/cli/chunks/{chunk-7NA7JXNB.js → chunk-PCQZIAXB.js} +2 -2
  131. package/dist/cli/chunks/{chunk-HOAJUIBQ.js → chunk-PGN4TARY.js} +2 -2
  132. package/dist/cli/chunks/{chunk-KB56CPU4.js → chunk-PNRPVQGI.js} +2 -2
  133. package/dist/cli/chunks/{chunk-CE7B5LU7.js → chunk-PWQWKYBG.js} +1 -1
  134. package/dist/cli/chunks/{chunk-DLD7RUZ4.js → chunk-QNQE3EOH.js} +2 -2
  135. package/dist/cli/chunks/chunk-QP2HLKTS.js +2 -0
  136. package/dist/cli/chunks/{chunk-H4H2YSFH.js → chunk-QP6GL3O5.js} +1 -1
  137. package/dist/cli/chunks/{chunk-LWR3FV3Y.js → chunk-QUZ745UQ.js} +2 -2
  138. package/dist/cli/chunks/{chunk-X2Z7F4EU.js → chunk-R5RRWLRI.js} +2 -2
  139. package/dist/cli/chunks/{chunk-NURIILUB.js → chunk-RE6JTSDM.js} +1 -1
  140. package/dist/cli/chunks/{chunk-YSZ5OE3Z.js → chunk-TOJF3ZG4.js} +2 -2
  141. package/dist/cli/chunks/{chunk-7JUC2MVZ.js → chunk-TSP6SU5V.js} +2 -2
  142. package/dist/cli/chunks/{chunk-NW7IBHJA.js → chunk-TW6Z6W4X.js} +4 -4
  143. package/dist/cli/chunks/{chunk-UDQSYWVF.js → chunk-TWOV3I3A.js} +1 -1
  144. package/dist/cli/chunks/chunk-U4TML2VD.js +3 -0
  145. package/dist/cli/chunks/{chunk-WO274FRI.js → chunk-U6IOQKCT.js} +2 -2
  146. package/dist/cli/chunks/{chunk-KDNJ4F3P.js → chunk-UDSB3XCG.js} +2 -2
  147. package/dist/cli/chunks/{chunk-SG3NX7QE.js → chunk-UFP7SN5V.js} +2 -2
  148. package/dist/cli/chunks/{chunk-UTRV7T2N.js → chunk-UMHFTQTR.js} +2 -2
  149. package/dist/cli/chunks/{chunk-4OVC4RIL.js → chunk-UNYTHZDZ.js} +1 -1
  150. package/dist/cli/chunks/{chunk-32ZMWEP3.js → chunk-UPWLMIDY.js} +2 -2
  151. package/dist/cli/chunks/{chunk-T3PGQFDI.js → chunk-USAKCGHC.js} +2 -2
  152. package/dist/cli/chunks/{chunk-2G7TVT6W.js → chunk-V3MGY76S.js} +2 -2
  153. package/dist/cli/chunks/{chunk-ZAKQLAHT.js → chunk-V6SE2ZU2.js} +1 -1
  154. package/dist/cli/chunks/{chunk-SE4VNN4I.js → chunk-VCVRZD4Y.js} +3 -3
  155. package/dist/cli/chunks/{chunk-PHP5UBT4.js → chunk-VG32EEUG.js} +2 -2
  156. package/dist/cli/chunks/{chunk-YZEXYO4W.js → chunk-VGZOPQQY.js} +1 -1
  157. package/dist/cli/chunks/{chunk-OFACHK5O.js → chunk-VJBJRFUO.js} +2 -2
  158. package/dist/cli/chunks/{chunk-NZ3GUMB2.js → chunk-WBC6WB32.js} +2 -2
  159. package/dist/cli/chunks/{chunk-GHY6Z6KO.js → chunk-WCM6WE7G.js} +3 -3
  160. package/dist/cli/chunks/{chunk-NZD4DPSU.js → chunk-WCPSR4MJ.js} +2 -2
  161. package/dist/cli/chunks/{chunk-I3C7JOXC.js → chunk-WKI46WWN.js} +2 -2
  162. package/dist/cli/chunks/{chunk-5K26BEYB.js → chunk-WM2QRIRD.js} +2 -2
  163. package/dist/cli/chunks/{chunk-U2FUXDDJ.js → chunk-WRC3HLUY.js} +3 -3
  164. package/dist/cli/chunks/{chunk-GII6UM3F.js → chunk-WUGXXNK4.js} +1 -1
  165. package/dist/cli/chunks/{chunk-JGZ722G3.js → chunk-WZQADC5R.js} +2 -2
  166. package/dist/cli/chunks/{chunk-GU5HNCWI.js → chunk-X6NJOT3V.js} +1 -1
  167. package/dist/cli/chunks/{chunk-DFUASIKA.js → chunk-X6Q2N5S5.js} +2 -2
  168. package/dist/cli/chunks/{chunk-G2Q66Z23.js → chunk-X7CUI7KH.js} +2 -2
  169. package/dist/cli/chunks/{chunk-5MDERQH3.js → chunk-XMCSKYDE.js} +1 -1
  170. package/dist/cli/chunks/{chunk-VTOBUZL6.js → chunk-XN3KCKAM.js} +2 -2
  171. package/dist/cli/chunks/{chunk-KUAKV3IW.js → chunk-XSPMLJCQ.js} +1 -1
  172. package/dist/cli/chunks/{chunk-YBQH2VOP.js → chunk-XTZGAG6P.js} +2 -2
  173. package/dist/cli/chunks/{chunk-MGZ5FJUW.js → chunk-YE54T2NQ.js} +2 -2
  174. package/dist/cli/chunks/{chunk-BTVEYBW2.js → chunk-YEFTK4HD.js} +2 -2
  175. package/dist/cli/chunks/{chunk-CT6SAVXQ.js → chunk-YGC5QKQ4.js} +2 -2
  176. package/dist/cli/chunks/{chunk-TWJTK4CC.js → chunk-YGOSSVY5.js} +2 -2
  177. package/dist/cli/chunks/chunk-YKQWIXUY.js +2 -0
  178. package/dist/cli/chunks/{chunk-TSQC2KKZ.js → chunk-Z2S7DNFP.js} +2 -2
  179. package/dist/cli/chunks/{chunk-JRRXCODW.js → chunk-Z54G2YOL.js} +2 -2
  180. package/dist/cli/chunks/{chunk-EXGMJFAT.js → chunk-ZJGFQK27.js} +1 -1
  181. package/dist/cli/chunks/{chunk-WNQS4WTS.js → chunk-ZUE524JL.js} +2 -2
  182. package/dist/cli/chunks/{ci-ENOASTYB.js → ci-UMA2SMNW.js} +2 -2
  183. package/dist/cli/chunks/{ci-config-B26OXHQM.js → ci-config-UQSILJFQ.js} +2 -2
  184. package/dist/cli/chunks/{ci-output-JTCLLNOQ.js → ci-output-U6YZLLKH.js} +2 -2
  185. package/dist/cli/chunks/{circuit-breaker-23JMFNM5.js → circuit-breaker-ATYQP6X2.js} +2 -2
  186. package/dist/cli/chunks/{claude-flow-setup-ON6L462G.js → claude-flow-setup-6YHFD7AN.js} +2 -2
  187. package/dist/cli/chunks/client-E43GWLQH.js +2 -0
  188. package/dist/cli/chunks/{cline-installer-OWQ4D2FQ.js → cline-installer-EPE7IOZE.js} +2 -2
  189. package/dist/cli/chunks/{code-2ZRL7SEU.js → code-NUEJ4XYO.js} +3 -3
  190. package/dist/cli/chunks/{code-index-extractor-JXSQVM67.js → code-index-extractor-D4DBT6OL.js} +2 -2
  191. package/dist/cli/chunks/{codex-installer-7LXZYBSQ.js → codex-installer-633SM4LR.js} +2 -2
  192. package/dist/cli/chunks/{completions-C2LR623C.js → completions-WUKVIW3L.js} +2 -2
  193. package/dist/cli/chunks/{complexity-analyzer-TGQLHCYJ.js → complexity-analyzer-F73ACR5H.js} +2 -2
  194. package/dist/cli/chunks/{continuedev-installer-RUGD24D2.js → continuedev-installer-QH42TKMS.js} +2 -2
  195. package/dist/cli/chunks/{copilot-installer-ZLFVLEJP.js → copilot-installer-Y3XC7BTT.js} +2 -2
  196. package/dist/cli/chunks/core-handlers-R5A3SQDY.js +2 -0
  197. package/dist/cli/chunks/{cost-tracker-RT4QL745.js → cost-tracker-57QPV7E3.js} +2 -2
  198. package/dist/cli/chunks/coverage-IBCHMBCR.js +51 -0
  199. package/dist/cli/chunks/cross-domain-router-LLYVPZF6.js +2 -0
  200. package/dist/cli/chunks/{cursor-installer-LJKLNFF6.js → cursor-installer-F4UYQHIN.js} +2 -2
  201. package/dist/cli/chunks/{daemon-FBH3IRYN.js → daemon-BYYPIJ7G.js} +4 -4
  202. package/dist/cli/chunks/{daemon-BMDXCQT5.js → daemon-XR4Q6YZF.js} +3 -3
  203. package/dist/cli/chunks/{dag-attention-scheduler-JGDED55I.js → dag-attention-scheduler-ZR5ZD3TW.js} +2 -2
  204. package/dist/cli/chunks/{detect-SZIHIVCJ.js → detect-GEGYURLL.js} +2 -2
  205. package/dist/cli/chunks/{dist-node-FV3KWXQ6.js → dist-node-JU3KT2JO.js} +2 -2
  206. package/dist/cli/chunks/{domain-handler-GI5JWQOV.js → domain-handler-7QI3FJGE.js} +2 -2
  207. package/dist/cli/chunks/{domain-plugins-BUWY36TL.js → domain-plugins-O2YRM2PD.js} +2 -2
  208. package/dist/cli/chunks/{domain-transfer-GCY7W5DA.js → domain-transfer-7J3S2OS6.js} +2 -2
  209. package/dist/cli/chunks/dream-6C4NURSE.js +2 -0
  210. package/dist/cli/chunks/{embed-and-insert-pattern-GPRR3ZGD.js → embed-and-insert-pattern-URES5Q6J.js} +2 -2
  211. package/dist/cli/chunks/{eval-XPB3IGAP.js → eval-RVMCIUOR.js} +2 -2
  212. package/dist/cli/chunks/{experience-capture-middleware-2E554UB3.js → experience-capture-middleware-SYJQSBKE.js} +3 -3
  213. package/dist/cli/chunks/{fast-paths-ZSMWZPUC.js → fast-paths-QUKPKWKZ.js} +2 -2
  214. package/dist/cli/chunks/{feature-flags-N7EOGE5P.js → feature-flags-5JCSKL2P.js} +2 -2
  215. package/dist/cli/chunks/{feature-flags-GIWVDVVC.js → feature-flags-K7JXNKJI.js} +2 -2
  216. package/dist/cli/chunks/file-discovery-J5IE5KP7.js +2 -0
  217. package/dist/cli/chunks/{fleet-HCHDOUCX.js → fleet-II4Q6HXK.js} +3 -3
  218. package/dist/cli/chunks/{gnn-wrapper-CZNCNXXZ.js → gnn-wrapper-M7VO2EMS.js} +2 -2
  219. package/dist/cli/chunks/{heartbeat-handler-6YUIF2YQ.js → heartbeat-handler-ND5CY26N.js} +4 -4
  220. package/dist/cli/chunks/heartbeat-scheduler-FC5PBTMN.js +2 -0
  221. package/dist/cli/chunks/hnsw-adapter-47UIVOBG.js +2 -0
  222. package/dist/cli/chunks/hnsw-index-3AKVLOZQ.js +2 -0
  223. package/dist/cli/chunks/{hnsw-legacy-bridge-J3M3IK24.js → hnsw-legacy-bridge-N3AUUUU7.js} +2 -2
  224. package/dist/cli/chunks/{hnswlib-node-ULGTGDZW.js → hnswlib-node-NZY3E5EN.js} +2 -2
  225. package/dist/cli/chunks/{hooks-C4BUGYUQ.js → hooks-QVJDTII5.js} +10 -10
  226. package/dist/cli/chunks/hybrid-backend-YAOSNX47.js +2 -0
  227. package/dist/cli/chunks/{hypergraph-engine-WINGVMPG.js → hypergraph-engine-ZRY6MTDV.js} +2 -2
  228. package/dist/cli/chunks/{hypergraph-handler-GADMWKAU.js → hypergraph-handler-56DO4XZQ.js} +3 -3
  229. package/dist/cli/chunks/impact-analyzer-4FMJXM4M.js +2 -0
  230. package/dist/cli/chunks/{init-guard-K2T4QWAO.js → init-guard-DTF4EVUY.js} +2 -2
  231. package/dist/cli/chunks/{init-handler-PCZTDZYI.js → init-handler-M6CNQHMX.js} +6 -6
  232. package/dist/cli/chunks/init-wizard-RTLCRWDT.js +2 -0
  233. package/dist/cli/chunks/kernel-2OWIGGGT.js +2 -0
  234. package/dist/cli/chunks/{kilocode-installer-XENXNEIU.js → kilocode-installer-IJN7XKBH.js} +2 -2
  235. package/dist/cli/chunks/{kiro-installer-3PG2TJ67.js → kiro-installer-UKKPGPDC.js} +2 -2
  236. package/dist/cli/chunks/knowledge-graph-25XXKDJN.js +2 -0
  237. package/dist/cli/chunks/learning-W2HETWQ4.js +131 -0
  238. package/dist/cli/chunks/{llm-router-RKVDEWU2.js → llm-router-Y546K4VX.js} +4 -4
  239. package/dist/cli/chunks/llm-router-service-G3EIN4UB.js +2 -0
  240. package/dist/cli/chunks/{load-ITHC564X.js → load-MKAB2AXE.js} +2 -2
  241. package/dist/cli/chunks/load-test-D6QYNIVT.js +2 -0
  242. package/dist/cli/chunks/{mcp-TCL5UW3N.js → mcp-AZKUS6K3.js} +2 -2
  243. package/dist/cli/chunks/{memory-BKDAY2N2.js → memory-ZDOQN2KU.js} +5 -5
  244. package/dist/cli/chunks/memory-backend-LDFFZMEQ.js +2 -0
  245. package/dist/cli/chunks/{memory-handlers-WN4FXFOA.js → memory-handlers-3SQVY7FE.js} +2 -2
  246. package/dist/cli/chunks/{multi-model-executor-VHAT7ZPF.js → multi-model-executor-WWVXDHG4.js} +2 -2
  247. package/dist/cli/chunks/{opencode-installer-E3VM3EEY.js → opencode-installer-YUJNXXWS.js} +2 -2
  248. package/dist/cli/chunks/{orchestrator-BMQ6X762.js → orchestrator-Z6PWPLRE.js} +109 -25
  249. package/dist/cli/chunks/pattern-null-store-KDVRM7PW.js +2 -0
  250. package/dist/cli/chunks/{pattern-usage-recorder-GOOR2BV5.js → pattern-usage-recorder-TPWPX32U.js} +2 -2
  251. package/dist/cli/chunks/{pipeline-5NSFQQIX.js → pipeline-4BBGTE4M.js} +2 -2
  252. package/dist/cli/chunks/{platform-SQM34J5G.js → platform-5GSHXCV5.js} +2 -2
  253. package/dist/cli/chunks/{plugin-UQJZRMZG.js → plugin-OFDVF5HS.js} +2 -2
  254. package/dist/cli/chunks/{prime-radiant-advanced-wasm-WMDJOL4S.js → prime-radiant-advanced-wasm-NC6MUYGJ.js} +2 -2
  255. package/dist/cli/chunks/project-root-DDGBWDP6.js +2 -0
  256. package/dist/cli/chunks/protocol-executor-KBOLLCWA.js +2 -0
  257. package/dist/cli/chunks/{protocol-handler-OBDCVY6X.js → protocol-handler-MPOAAEPA.js} +2 -2
  258. package/dist/cli/chunks/{prove-XDC7I4XT.js → prove-CDKMAIVM.js} +2 -2
  259. package/dist/cli/chunks/qe-reasoning-bank-GRXBT7FC.js +2 -0
  260. package/dist/cli/chunks/{quality-L4GQ6WX4.js → quality-ZH4F7R7R.js} +2 -2
  261. package/dist/cli/chunks/{quality-gate-MJG66LKN.js → quality-gate-IDRMW6OE.js} +3 -3
  262. package/dist/cli/chunks/queen-coordinator-L2QWMJ5Q.js +2 -0
  263. package/dist/cli/chunks/{real-embeddings-HW4G2LWL.js → real-embeddings-I2UVNNB3.js} +2 -2
  264. package/dist/cli/chunks/{ref-validation-FC7JOJ2C.js → ref-validation-Z5GCGVXK.js} +2 -2
  265. package/dist/cli/chunks/{roocode-installer-KWS4CEIC.js → roocode-installer-IZ2S7PH2.js} +2 -2
  266. package/dist/cli/chunks/router-FT5WJPUH.js +2 -0
  267. package/dist/cli/chunks/routing-feedback-EO2MKOUX.js +2 -0
  268. package/dist/cli/chunks/{routing-handler-QF4WVB2S.js → routing-handler-NAX35VUW.js} +2 -2
  269. package/dist/cli/chunks/{ruvector-commands-2MTCOUK6.js → ruvector-commands-5YW2SOFF.js} +2 -2
  270. package/dist/cli/chunks/rvf-dual-writer-WHBFQJVU.js +2 -0
  271. package/dist/cli/chunks/rvf-migration-adapter-YT3APF2I.js +2 -0
  272. package/dist/cli/chunks/{rvf-migration-coordinator-BREJCXWN.js → rvf-migration-coordinator-VUIZHTVG.js} +2 -2
  273. package/dist/cli/chunks/rvf-native-adapter-37PUFKQD.js +2 -0
  274. package/dist/cli/chunks/{rvf-store-integrity-KKC6HOJD.js → rvf-store-integrity-IPGCAT6C.js} +2 -2
  275. package/dist/cli/chunks/safe-db-TDZKUOZJ.js +2 -0
  276. package/dist/cli/chunks/schedule-CRKTRY2A.js +2 -0
  277. package/dist/cli/chunks/scheduler-6ZBDVQWN.js +2 -0
  278. package/dist/cli/chunks/{security-OSAE7VAP.js → security-3IH4BO5Z.js} +3 -3
  279. package/dist/cli/chunks/{shared-rvf-adapter-COUOS665.js → shared-rvf-adapter-ABY7PAY2.js} +2 -2
  280. package/dist/cli/chunks/{shared-rvf-dual-writer-YXMPZKQE.js → shared-rvf-dual-writer-6KENLN2W.js} +2 -2
  281. package/dist/cli/chunks/sqlite-persistence-FFJQAIKW.js +2 -0
  282. package/dist/cli/chunks/{standalone-memory-E6JBMOIL.js → standalone-memory-RLFAUGOW.js} +2 -2
  283. package/dist/cli/chunks/{status-handler-AFTCIYIX.js → status-handler-FCOZBPE5.js} +2 -2
  284. package/dist/cli/chunks/{structural-health-2FROCEI4.js → structural-health-4RDA5UUM.js} +2 -2
  285. package/dist/cli/chunks/{sync-VAYTOWDC.js → sync-54LUAUTK.js} +2 -2
  286. package/dist/cli/chunks/{sync-YIQYOFGW.js → sync-KGEEXXCC.js} +2 -2
  287. package/dist/cli/chunks/{task-handler-KVQHDEX3.js → task-handler-K3OXHYKU.js} +2 -2
  288. package/dist/cli/chunks/{task-handlers-MVVECQA6.js → task-handlers-6H7L2UT4.js} +3 -3
  289. package/dist/cli/chunks/{test-5JSVTOMY.js → test-S7IG6EIX.js} +4 -4
  290. package/dist/cli/chunks/test-runner-process-OTQDAJLN.js +2 -0
  291. package/dist/cli/chunks/{test-scheduling-HBOHVLI3.js → test-scheduling-7XYXI4L2.js} +3 -3
  292. package/dist/cli/chunks/{token-bootstrap-5VEPTPFA.js → token-bootstrap-3QMABE45.js} +2 -2
  293. package/dist/cli/chunks/{token-usage-TBJHDLY6.js → token-usage-Y2YTPOFE.js} +2 -2
  294. package/dist/cli/chunks/{transformers-VAWYMHMZ.js → transformers-UCJ3HHHC.js} +2 -2
  295. package/dist/cli/chunks/tree-sitter-wasm-parser-D6JTTHTP.js +2 -0
  296. package/dist/cli/chunks/{types-R5SDZU2E.js → types-6CMFPETH.js} +2 -2
  297. package/dist/cli/chunks/unified-memory-QARWQKJ2.js +2 -0
  298. package/dist/cli/chunks/unified-memory-hnsw-LHY3DXCP.js +2 -0
  299. package/dist/cli/chunks/unified-persistence-WEYYGLHM.js +2 -0
  300. package/dist/cli/chunks/{upgrade-K5PIHXRB.js → upgrade-K25DN6WU.js} +2 -2
  301. package/dist/cli/chunks/{validate-RPTS7RYJ.js → validate-T4V3TBY3.js} +2 -2
  302. package/dist/cli/chunks/{validate-swarm-B2ZL556X.js → validate-swarm-XSRC576T.js} +2 -2
  303. package/dist/cli/chunks/visual-security-O4ALMCXQ.js +2 -0
  304. package/dist/cli/chunks/{web-tree-sitter-K4DUJC32.js → web-tree-sitter-YOZXHRTN.js} +2 -2
  305. package/dist/cli/chunks/{windsurf-installer-OK2AJN35.js → windsurf-installer-ITPU2IYL.js} +2 -2
  306. package/dist/cli/chunks/witness-chain-B3YW5NMS.js +2 -0
  307. package/dist/cli/chunks/witness-chain-PIYR72HJ.js +2 -0
  308. package/dist/cli/chunks/{witness-chain-repair-L6Y5RFXR.js → witness-chain-repair-YUG7E3UX.js} +2 -2
  309. package/dist/cli/chunks/{witness-chain-verifier-N4CW7FZX.js → witness-chain-verifier-DTDSVKOG.js} +2 -2
  310. package/dist/cli/chunks/{witness-key-manager-TDNPS3WD.js → witness-key-manager-EWACWGAW.js} +2 -2
  311. package/dist/cli/chunks/{workflow-XRZA3YCY.js → workflow-ZIQ4FV42.js} +4 -4
  312. package/dist/cli/chunks/workflow-orchestrator-3ZN2BCGY.js +2 -0
  313. package/dist/cli/chunks/{wrappers-5JIFWKN6.js → wrappers-PW2O27LL.js} +2 -2
  314. package/dist/cli/commands/coverage.js +6 -0
  315. package/dist/cli/commands/learning-prune.d.ts +14 -0
  316. package/dist/cli/commands/learning-prune.js +105 -0
  317. package/dist/cli/commands/learning.js +9 -0
  318. package/dist/cli/handlers/brain-handler.js +12 -1
  319. package/dist/cli/utils/coverage-verdict.js +14 -3
  320. package/dist/context/compaction/index.d.ts +7 -0
  321. package/dist/context/compaction/index.js +30 -6
  322. package/dist/coordination/handlers/coverage-evidence.d.ts +19 -0
  323. package/dist/coordination/handlers/coverage-evidence.js +31 -2
  324. package/dist/coordination/handlers/coverage-handlers.js +5 -1
  325. package/dist/coordination/handlers/coverage-target.js +8 -1
  326. package/dist/coordination/handlers/quality-handlers.js +9 -1
  327. package/dist/coordination/result-saver-adapters.js +1 -0
  328. package/dist/coordination/result-saver.js +9 -5
  329. package/dist/domains/chaos-resilience/services/chaos-engineer.d.ts +1 -0
  330. package/dist/domains/chaos-resilience/services/chaos-engineer.js +23 -45
  331. package/dist/domains/coverage-analysis/collected-metrics.d.ts +22 -6
  332. package/dist/domains/coverage-analysis/collected-metrics.js +37 -12
  333. package/dist/domains/coverage-analysis/services/coverage-analyzer.js +2 -0
  334. package/dist/domains/defect-intelligence/services/defect-predictor.js +3 -6
  335. package/dist/domains/quality-assessment/coverage-report-event.d.ts +8 -0
  336. package/dist/domains/quality-assessment/coverage-report-event.js +22 -1
  337. package/dist/domains/quality-assessment/interfaces.d.ts +6 -0
  338. package/dist/domains/quality-assessment/services/quality-analyzer.d.ts +4 -0
  339. package/dist/domains/quality-assessment/services/quality-analyzer.js +63 -17
  340. package/dist/domains/test-execution/interfaces.d.ts +5 -0
  341. package/dist/domains/test-execution/services/test-executor.js +6 -0
  342. package/dist/init/phases/07-hooks.js +90 -6
  343. package/dist/integrations/ruvector/brain-rvf-exporter.d.ts +25 -0
  344. package/dist/integrations/ruvector/brain-rvf-exporter.js +154 -61
  345. package/dist/learning/dream/dream-engine.d.ts +24 -1
  346. package/dist/learning/dream/dream-engine.js +57 -6
  347. package/dist/learning/learning-retention.d.ts +103 -0
  348. package/dist/learning/learning-retention.js +213 -0
  349. package/dist/mcp/bundle.js +494 -489
  350. package/dist/mcp/handlers/domain-handler-configs.d.ts +9 -1
  351. package/dist/mcp/handlers/domain-handler-configs.js +24 -14
  352. package/dist/mcp/protocol-server.js +1 -1
  353. package/dist/mcp/tools/chaos-resilience/inject.d.ts +3 -4
  354. package/dist/mcp/tools/chaos-resilience/inject.js +11 -81
  355. package/dist/mcp/tools/learning-optimization/dream.d.ts +8 -0
  356. package/dist/mcp/tools/learning-optimization/dream.js +4 -0
  357. package/package.json +1 -1
  358. package/dist/cli/chunks/adapter-KCQDVYY2.js +0 -2
  359. package/dist/cli/chunks/aqe-learning-engine-SAQOHSGN.js +0 -2
  360. package/dist/cli/chunks/base-WCACU3FN.js +0 -2
  361. package/dist/cli/chunks/brain-handler-GTQNHHZS.js +0 -94
  362. package/dist/cli/chunks/browser-workflow-G6IASEAP.js +0 -2
  363. package/dist/cli/chunks/chunk-K65CGKLD.js +0 -8
  364. package/dist/cli/chunks/chunk-MB46UBGY.js +0 -3
  365. package/dist/cli/chunks/chunk-N4CYAKOX.js +0 -79
  366. package/dist/cli/chunks/chunk-PT4FMJPQ.js +0 -3
  367. package/dist/cli/chunks/chunk-S5AZCIZS.js +0 -2
  368. package/dist/cli/chunks/chunk-UT2VZ33P.js +0 -2
  369. package/dist/cli/chunks/client-TV3V2YZ5.js +0 -2
  370. package/dist/cli/chunks/core-handlers-PZT4OLWR.js +0 -2
  371. package/dist/cli/chunks/coverage-NV3C4IMM.js +0 -50
  372. package/dist/cli/chunks/cross-domain-router-QOFCZ7G4.js +0 -2
  373. package/dist/cli/chunks/dream-TRFBGDSQ.js +0 -2
  374. package/dist/cli/chunks/file-discovery-WCKGMSPZ.js +0 -2
  375. package/dist/cli/chunks/heartbeat-scheduler-P44A2OX3.js +0 -2
  376. package/dist/cli/chunks/hnsw-adapter-ZJQIQJKC.js +0 -2
  377. package/dist/cli/chunks/hnsw-index-HMG2GH3Z.js +0 -2
  378. package/dist/cli/chunks/hybrid-backend-B7M74PZG.js +0 -2
  379. package/dist/cli/chunks/impact-analyzer-PZYOVKQO.js +0 -2
  380. package/dist/cli/chunks/init-wizard-TZDJQK3U.js +0 -2
  381. package/dist/cli/chunks/kernel-Y6RRIOKW.js +0 -2
  382. package/dist/cli/chunks/knowledge-graph-BVD5Z66M.js +0 -2
  383. package/dist/cli/chunks/learning-6KDH7FK4.js +0 -122
  384. package/dist/cli/chunks/llm-router-service-KHCAMSUU.js +0 -2
  385. package/dist/cli/chunks/load-test-RUF7DZA5.js +0 -2
  386. package/dist/cli/chunks/memory-backend-7ZLFOVGG.js +0 -2
  387. package/dist/cli/chunks/pattern-null-store-RY6CVYHP.js +0 -2
  388. package/dist/cli/chunks/project-root-IO5KRNGL.js +0 -2
  389. package/dist/cli/chunks/protocol-executor-U2CUDWDE.js +0 -2
  390. package/dist/cli/chunks/qe-reasoning-bank-DQSSX2IP.js +0 -2
  391. package/dist/cli/chunks/queen-coordinator-6FN4BZIX.js +0 -2
  392. package/dist/cli/chunks/router-YUO3I7RU.js +0 -2
  393. package/dist/cli/chunks/routing-feedback-36SLQGJE.js +0 -2
  394. package/dist/cli/chunks/rvf-dual-writer-FRYZH3WZ.js +0 -2
  395. package/dist/cli/chunks/rvf-migration-adapter-XXNITL5I.js +0 -2
  396. package/dist/cli/chunks/rvf-native-adapter-D2WWKJIV.js +0 -2
  397. package/dist/cli/chunks/safe-db-4RRIGRXD.js +0 -2
  398. package/dist/cli/chunks/schedule-25RTO4DQ.js +0 -2
  399. package/dist/cli/chunks/scheduler-BPIOJZ5P.js +0 -2
  400. package/dist/cli/chunks/sqlite-persistence-EDF47DDX.js +0 -2
  401. package/dist/cli/chunks/test-runner-process-LEPF2OSS.js +0 -2
  402. package/dist/cli/chunks/tree-sitter-wasm-parser-TSZTCMFV.js +0 -2
  403. package/dist/cli/chunks/unified-memory-TLGSSLMI.js +0 -2
  404. package/dist/cli/chunks/unified-memory-hnsw-MSUR7ZOO.js +0 -2
  405. package/dist/cli/chunks/unified-persistence-VFFOTWK7.js +0 -2
  406. package/dist/cli/chunks/visual-security-6Q44XNLB.js +0 -2
  407. package/dist/cli/chunks/witness-chain-KDOMXDQX.js +0 -2
  408. package/dist/cli/chunks/witness-chain-N3OY2RMH.js +0 -2
  409. package/dist/cli/chunks/workflow-orchestrator-CVNNT2RJ.js +0 -2
@@ -16,6 +16,7 @@
16
16
  * Either one makes the evidence insufficient: no verdict may pass on it.
17
17
  */
18
18
  import type { FileCoverage } from '../../domains/coverage-analysis/interfaces';
19
+ import type { ExcludedCoverageEntry } from '../../domains/coverage-analysis/collected-metrics.js';
19
20
  /** The report is older than these source files. */
20
21
  export interface StaleReport {
21
22
  reportPath: string;
@@ -35,6 +36,17 @@ export interface CoverageEvidence {
35
36
  source: string;
36
37
  readable: boolean;
37
38
  };
39
+ /**
40
+ * #1219: report entries left out of the figures because they are not a
41
+ * measurement of a project file (outside the root, a Windows path on POSIX,
42
+ * or one file under two spellings).
43
+ */
44
+ excludedEntries?: ExcludedCoverageEntry[];
45
+ /**
46
+ * #1219: project files the report lists under two spellings. Which entry is
47
+ * right is unknown, so they are UNMEASURED and the evidence is insufficient.
48
+ */
49
+ conflictingFiles?: string[];
38
50
  }
39
51
  /**
40
52
  * Production source files under a directory `target` that the report has no
@@ -66,10 +78,17 @@ export declare function assessCoverageEvidence(report: {
66
78
  }, measuredFiles: FileCoverage[], projectRoot: string, target: string, options?: {
67
79
  reportPath?: string;
68
80
  checkCompleteness?: boolean;
81
+ excluded?: ExcludedCoverageEntry[];
69
82
  }): CoverageEvidence;
70
83
  /**
71
84
  * Why the evidence is insufficient, one sentence per problem; empty when it is
72
85
  * complete. Shared by MCP and CLI so the wording cannot drift.
73
86
  */
74
87
  export declare function describeEvidence(evidence: CoverageEvidence | undefined, projectRoot: string): string[];
88
+ /**
89
+ * #1219: one line naming the report entries left out of the figures as not
90
+ * project files (empty when none were). A note, not an evidence gap: those
91
+ * entries never were the project's coverage. Shared by MCP and CLI.
92
+ */
93
+ export declare function describeExcludedEntries(evidence: CoverageEvidence | undefined): string[];
75
94
  //# sourceMappingURL=coverage-evidence.d.ts.map
@@ -115,12 +115,16 @@ export function assessCoverageEvidence(report, measuredFiles, projectRoot, targe
115
115
  const stale = options.reportPath
116
116
  ? findStaleness(options.reportPath, [...sources].filter(file => fs.existsSync(file)))
117
117
  : undefined;
118
+ const excluded = options.excluded ?? [];
119
+ const conflicting = [...new Set(excluded.flatMap(e => (e.file ? [e.file] : [])))].sort();
118
120
  return {
119
- status: unmeasured.length > 0 || stale ? 'insufficient-evidence' : 'complete',
121
+ status: unmeasured.length > 0 || stale || conflicting.length > 0 ? 'insufficient-evidence' : 'complete',
120
122
  unmeasuredFiles: unmeasured,
121
- targetFiles: sources.size,
123
+ targetFiles: sources.size + conflicting.filter(file => !sources.has(file)).length,
122
124
  ...(stale ? { stale } : {}),
123
125
  ...(coverageScope ? { coverageScope } : {}),
126
+ ...(excluded.length > 0 ? { excludedEntries: excluded } : {}),
127
+ ...(conflicting.length > 0 ? { conflictingFiles: conflicting } : {}),
124
128
  };
125
129
  }
126
130
  const MAX_LISTED = 5;
@@ -148,6 +152,12 @@ export function describeEvidence(evidence, projectRoot) {
148
152
  'the report with coverage for the whole target, or exclude files that are not meant to be measured in the ' +
149
153
  `coverage tool's include/exclude config.${scopeNote}`);
150
154
  }
155
+ const conflicting = evidence.conflictingFiles ?? [];
156
+ if (conflicting.length > 0) {
157
+ reasons.push(`${conflicting.length} source file${conflicting.length === 1 ? ' is' : 's are'} listed in the coverage ` +
158
+ 'report under two spellings (e.g. `./src/a.ts` and `src/a.ts`), so which entry is right is unknown; ' +
159
+ `they are UNMEASURED and left out of the figures: ${listFiles(conflicting, projectRoot)}`);
160
+ }
151
161
  if (evidence.stale) {
152
162
  const m = evidence.stale.newerFiles.length;
153
163
  reasons.push(`the coverage report ${path.relative(projectRoot, evidence.stale.reportPath) || evidence.stale.reportPath} ` +
@@ -156,4 +166,23 @@ export function describeEvidence(evidence, projectRoot) {
156
166
  }
157
167
  return reasons;
158
168
  }
169
+ const EXCLUDED_WHY = {
170
+ 'outside-project': 'outside the project root',
171
+ 'windows-path': 'a Windows path, which cannot name a file here',
172
+ 'duplicate-spelling': 'a second spelling of a file the report already lists',
173
+ };
174
+ /**
175
+ * #1219: one line naming the report entries left out of the figures as not
176
+ * project files (empty when none were). A note, not an evidence gap: those
177
+ * entries never were the project's coverage. Shared by MCP and CLI.
178
+ */
179
+ export function describeExcludedEntries(evidence) {
180
+ const outside = (evidence?.excludedEntries ?? []).filter(e => e.reason !== 'duplicate-spelling');
181
+ if (outside.length === 0)
182
+ return [];
183
+ const shown = outside.slice(0, MAX_LISTED).map(e => `${e.path} (${EXCLUDED_WHY[e.reason]})`);
184
+ const more = outside.length > MAX_LISTED ? `, … ${outside.length - MAX_LISTED} more` : '';
185
+ return [`${outside.length} coverage report entr${outside.length === 1 ? 'y is' : 'ies are'} not a project file and ` +
186
+ `${outside.length === 1 ? 'is' : 'are'} left out of the figures: ${shown.join(', ')}${more}.`];
187
+ }
159
188
  //# sourceMappingURL=coverage-evidence.js.map
@@ -9,7 +9,7 @@ import { toError } from '../../shared/error-utils.js';
9
9
  import { requirePayloadPath } from '../../shared/io/payload-path-guard.js';
10
10
  import { buildEstimatedCoverage, collectRustCoverage, findCargoRoot, isCoverageExecDisabled, isRustProject, } from './coverage-collection.js';
11
11
  import { describeNoData, evaluateCoverageForTarget, isUnmeasured, packageFilterForTarget, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
12
- import { describeEvidence } from './coverage-evidence.js';
12
+ import { describeEvidence, describeExcludedEntries } from './coverage-evidence.js';
13
13
  import { randomUUID } from 'crypto';
14
14
  import * as path from 'path';
15
15
  import { describeRunFailure, runJsCoverage, testRunStatus } from './coverage-runner.js';
@@ -289,6 +289,8 @@ export function registerCoverageHandlers(ctx) {
289
289
  if (evidenceReasons.length > 0) {
290
290
  warnings.push(`INSUFFICIENT EVIDENCE — the threshold is not met on this report: ${evidenceReasons.join('; ').replace(/\.?$/, '.')}`);
291
291
  }
292
+ // #1219: entries that are not project files are named, not silently dropped.
293
+ warnings.push(...describeExcludedEntries(evidence));
292
294
  // #569: the analyzer generates recommendations from the summary numbers.
293
295
  // When branch or function data was never collected, those numbers are 0
294
296
  // by construction, and the resulting advice ("Branch coverage is
@@ -325,6 +327,8 @@ export function registerCoverageHandlers(ctx) {
325
327
  evidenceStatus: evidence.status,
326
328
  unmeasuredFiles: evidence.unmeasuredFiles,
327
329
  ...(evidence.stale ? { staleReport: evidence.stale } : {}),
330
+ ...(evidence.conflictingFiles ? { conflictingFiles: evidence.conflictingFiles } : {}),
331
+ ...(evidence.excludedEntries ? { excludedReportEntries: evidence.excludedEntries } : {}),
328
332
  } : {}),
329
333
  delta: report.delta,
330
334
  recommendations,
@@ -26,6 +26,7 @@ import { loadCoverageReport, parseCoberturaXml, parseCoverageJson, parseCoverage
26
26
  import { isTestPath } from './coverage-collection.js';
27
27
  import { assessCoverageEvidence } from './coverage-evidence.js';
28
28
  import { findProjectRoot } from '../../kernel/project-root.js';
29
+ import { classifyProjectCoveragePaths } from '../../domains/coverage-analysis/collected-metrics.js';
29
30
  // ============================================================================
30
31
  // Project root
31
32
  // ============================================================================
@@ -428,7 +429,12 @@ export function scopeCoverageToTarget(data, root, target) {
428
429
  export function evaluateCoverageForTarget(report, projectRoot, target, options = {}) {
429
430
  if (options.numTotalTests === 0)
430
431
  return { status: 'no-data', reason: 'no-tests-ran' };
431
- const scoped = scopeCoverageToTarget(report, projectRoot, target);
432
+ // #1219: an entry that is not a measurement of a project file (outside the
433
+ // root, a Windows path on POSIX, one file under two spellings) is not part
434
+ // of the figures — the same rule as the per-file records (#1030).
435
+ const inTarget = scopeCoverageToTarget(report, projectRoot, target);
436
+ const { keys, excluded } = classifyProjectCoveragePaths(inTarget.map(f => f.path), projectRoot);
437
+ const scoped = inTarget.filter(f => keys.has(f.path));
432
438
  if (scoped.length === 0)
433
439
  return { status: 'no-data', reason: 'target-not-covered' };
434
440
  // Coverage OF a test file is not production coverage (#569). A report with
@@ -438,6 +444,7 @@ export function evaluateCoverageForTarget(report, projectRoot, target, options =
438
444
  return { status: 'no-data', reason: 'test-only-report' };
439
445
  const evidence = assessCoverageEvidence(report, production, projectRoot, target, {
440
446
  reportPath: options.reportPath, checkCompleteness: options.checkCompleteness,
447
+ excluded: excluded.filter(e => !e.file || !isTestPath(e.file, projectRoot)),
441
448
  });
442
449
  return { status: 'measured', files: production, evidence };
443
450
  }
@@ -222,8 +222,16 @@ export function registerQualityHandlers(ctx) {
222
222
  const insufficient = sufficiency.evidenceStatus !== 'measured';
223
223
  const passed = !insufficient && measuredFailures.length === 0 && report.score.overall >= threshold;
224
224
  const recommendations = report.recommendations.map(r => `[${r.type}] ${r.title}: ${r.description}`);
225
+ // A score that leaves out unmeasured metrics is not the overall score:
226
+ // -1 with the reason, as the gate's overallScore since #1223. The score
227
+ // over the measured metrics stays available, labelled as a subset.
228
+ const subsetScore = report.subsetScore ?? report.score.overall;
225
229
  return ok({
226
- qualityScore: report.score.overall,
230
+ qualityScore: insufficient ? UNMEASURED : report.score.overall,
231
+ ...(insufficient ? {
232
+ qualityScoreReason: `not computed: ${sufficiency.unmeasured.join(', ')} unmeasured`,
233
+ ...(subsetScore >= 0 ? { subsetScore } : {}),
234
+ } : {}),
227
235
  passed,
228
236
  threshold,
229
237
  metrics: {
@@ -37,6 +37,7 @@ function qualityReport(result) {
37
37
  : [];
38
38
  return {
39
39
  ...(typeof score.overall === 'number' ? { qualityScore: score.overall } : {}),
40
+ ...(typeof data.subsetScore === 'number' ? { subsetScore: data.subsetScore } : {}),
40
41
  passed: false,
41
42
  gateEvaluated: false,
42
43
  metrics: Object.fromEntries(metrics.filter(m => m.name && typeof m.value === 'number').map(m => [m.name, m.value])),
@@ -501,11 +501,15 @@ ${data.recommendations.map((r, i) => `${i + 1}. ${r}`).join('\n')}
501
501
  ## Quality Score
502
502
 
503
503
  ${typeof data.qualityScore !== 'number' ? 'N/A — measured gate uses individual checks.'
504
- : data.qualityScore < 0 ? 'Not measured — no requested metric had measured data (#1011).'
505
- : data.evidenceStatus === 'insufficient-evidence'
506
- ? `Subset score over measured metrics: ${data.qualityScore.toFixed(1)} (not a verdict)`
507
- + (data.scoreBasis?.length ? `\nBased on: ${data.scoreBasis.join(', ')}` : '')
508
- : `**${data.qualityScore.toFixed(1)}** / 100`}
504
+ : data.qualityScore < 0 && typeof data.subsetScore === 'number'
505
+ ? `Not computed — unmeasured: ${data.unmeasured?.join(', ') || 'unknown'}.\n`
506
+ + `Subset score over measured metrics: ${data.subsetScore.toFixed(1)} (not a verdict)`
507
+ + (data.scoreBasis?.length ? `\nBased on: ${data.scoreBasis.join(', ')}` : '')
508
+ : data.qualityScore < 0 ? 'Not measured — no requested metric had measured data (#1011).'
509
+ : data.evidenceStatus === 'insufficient-evidence'
510
+ ? `Subset score over measured metrics: ${data.qualityScore.toFixed(1)} (not a verdict)`
511
+ + (data.scoreBasis?.length ? `\nBased on: ${data.scoreBasis.join(', ')}` : '')
512
+ : `**${data.qualityScore.toFixed(1)}** / 100`}
509
513
 
510
514
  ## Metrics
511
515
 
@@ -89,6 +89,7 @@ export declare class ChaosEngineerService implements IChaosEngineeringService {
89
89
  private executeCommandProbe;
90
90
  private executeMetricProbe;
91
91
  private performFaultInjection;
92
+ private notInjected;
92
93
  private injectLatency;
93
94
  private injectError;
94
95
  private injectTimeout;
@@ -609,32 +609,25 @@ Provide:
609
609
  }
610
610
  return err(new Error(`Unknown fault type: ${fault.type}`));
611
611
  }
612
+ // #1258: these fault types need infrastructure this process does not control
613
+ // (a network proxy, service mesh, firewall or DNS server). They used to log a
614
+ // note and return ok(1), so an experiment reported a fault that never ran.
615
+ // They now fail with the reason, and injectFault() records injected: false.
616
+ notInjected(fault, requirement) {
617
+ return err(new Error(`${fault.type} fault not injected into ${fault.target.selector}: requires ${requirement}, ` +
618
+ 'which this process does not control. Nothing was changed on the target.'));
619
+ }
612
620
  async injectLatency(fault) {
613
- // Latency injection is typically done at proxy/network level
614
- // For simulation, we store the config and check during probe execution
615
- const latencyMs = fault.parameters.latencyMs ?? 100;
616
- logger.info(`Latency injection configured: ${latencyMs}ms for ${fault.target.selector}`);
617
- logger.info(`Note: Actual latency injection requires network proxy (e.g., Toxiproxy, tc)`);
618
- return ok(1);
621
+ return this.notInjected(fault, 'a network proxy (e.g., Toxiproxy, tc)');
619
622
  }
620
623
  async injectError(fault) {
621
- // Error injection typically requires proxy/service mesh
622
- const errorCode = fault.parameters.errorCode ?? 500;
623
- logger.info(`Error injection configured: ${errorCode} for ${fault.target.selector}`);
624
- logger.info(`Note: Actual error injection requires service mesh (e.g., Istio, Linkerd)`);
625
- return ok(1);
624
+ return this.notInjected(fault, 'a service mesh or proxy (e.g., Istio, Linkerd, Toxiproxy)');
626
625
  }
627
626
  async injectTimeout(fault) {
628
- // Timeout injection via proxy configuration
629
- logger.info(`Timeout injection configured for ${fault.target.selector}`);
630
- logger.info(`Note: Actual timeout injection requires network proxy configuration`);
631
- return ok(1);
627
+ return this.notInjected(fault, 'a network proxy (e.g., Toxiproxy)');
632
628
  }
633
629
  async injectPacketLoss(fault) {
634
- const lossPercent = fault.parameters.packetLossPercent ?? 10;
635
- logger.info(`Packet loss configured: ${lossPercent}% for ${fault.target.selector}`);
636
- logger.info(`Note: Actual packet loss requires tc/iptables (Linux) or similar`);
637
- return ok(1);
630
+ return this.notInjected(fault, 'tc/iptables (Linux) or a network proxy');
638
631
  }
639
632
  async injectCpuStress(fault) {
640
633
  // Real CPU stress implementation using busy loops
@@ -689,34 +682,18 @@ Provide:
689
682
  }
690
683
  }
691
684
  async injectDiskStress(fault) {
692
- // Disk stress would require file system operations
693
- logger.info(`Disk stress configured for ${fault.target.selector}`);
694
- logger.info(`Note: Actual disk stress requires file system write permissions`);
695
- return ok(1);
685
+ return this.notInjected(fault, 'file system stress tooling (e.g., stress-ng)');
696
686
  }
697
687
  async injectNetworkPartition(fault) {
698
- // Network partition typically requires iptables or similar
699
- logger.info(`Network partition configured for ${fault.target.selector}`);
700
- logger.info(`Note: Actual network partition requires iptables/firewall rules`);
701
- return ok(1);
688
+ return this.notInjected(fault, 'iptables/firewall rules');
702
689
  }
703
690
  async injectDnsFailure(fault) {
704
- // DNS failure injection via /etc/hosts or DNS server configuration
705
- logger.info(`DNS failure configured for ${fault.target.selector}`);
706
- logger.info(`Note: Actual DNS failure requires DNS server or /etc/hosts modification`);
707
- return ok(1);
691
+ return this.notInjected(fault, 'a DNS server or /etc/hosts modification');
708
692
  }
709
693
  async injectProcessKill(fault) {
710
- // Process kill via system commands
711
- const processPattern = fault.target.selector;
712
- logger.info(`Process kill configured for pattern: ${processPattern}`);
713
- logger.info(`Note: Actual process kill requires appropriate permissions`);
714
- // In dry-run mode or without permissions, just log
715
- if (this.config.enableDryRun) {
716
- logger.info(`Would kill processes matching: ${processPattern}`);
717
- return ok(0);
718
- }
719
- return ok(1);
694
+ // No process is signalled here, so a dry run and a real run both report
695
+ // the fault as not injected rather than counting a target as affected.
696
+ return this.notInjected(fault, 'process signalling with appropriate permissions (e.g., Chaos Monkey, Litmus)');
720
697
  }
721
698
  async performFaultRemoval(fault) {
722
699
  logger.info(`Removing fault: ${fault.id} (${fault.type})`);
@@ -817,14 +794,15 @@ Provide:
817
794
  if (!finalSteadyState) {
818
795
  return 'failed';
819
796
  }
820
- if (execution.result.hypothesisValidated) {
821
- return 'completed';
822
- }
823
- // Check if any faults failed to inject
797
+ // #1258: a fault that was not injected means the experiment did not run as
798
+ // designed, so a hypothesis "validated" without it is not a completed run.
824
799
  const failedFaults = execution.result.faultResults.filter((f) => !f.injected);
825
800
  if (failedFaults.length > 0) {
826
801
  return 'failed';
827
802
  }
803
+ if (execution.result.hypothesisValidated) {
804
+ return 'completed';
805
+ }
828
806
  return 'completed';
829
807
  }
830
808
  async rollbackExperiment(experiment) {
@@ -14,15 +14,31 @@ 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
+ /** Why a report entry is not a measurement of a project file (#1030, #1219). */
18
+ export type ExcludedCoverageReason = 'outside-project' | 'windows-path' | 'duplicate-spelling';
19
+ /** A report entry left out of per-file records and of the report's summary. */
20
+ export interface ExcludedCoverageEntry {
21
+ /** The path as the report wrote it. */
22
+ path: string;
23
+ reason: ExcludedCoverageReason;
24
+ /** For `duplicate-spelling`: the project file both spellings name. */
25
+ file?: string;
26
+ }
17
27
  /**
18
- * #1030: the per-file record key of each path in ONE report, keyed by the
19
- * path as the report wrote it. A path is left out when its record would not
20
- * be a measurement of a project file: it resolves outside the project root
21
- * (lcov `SF:../../outside.ts`), it is a Windows absolute path read on POSIX
22
- * (it would resolve to a junk key), or the report lists the same file under
28
+ * #1030, #1219: sort the paths of ONE report into project files (with their
29
+ * per-file record key, keyed by the path as the report wrote it) and entries
30
+ * that are not a measurement of a project file: a path that resolves outside
31
+ * the project root (lcov `SF:../../outside.ts`), a Windows absolute path read
32
+ * on POSIX (it would resolve to a junk key), or a file the report lists under
23
33
  * two spellings (`./src/a.ts` and `src/a.ts`), so which entry is right is
24
- * unknown.
34
+ * unknown. A path under the root's realpath (macOS `/private/var` for
35
+ * `/var`) is inside.
25
36
  */
37
+ export declare function classifyProjectCoveragePaths(paths: readonly string[], projectRoot?: string): {
38
+ keys: Map<string, string>;
39
+ excluded: ExcludedCoverageEntry[];
40
+ };
41
+ /** #1030: the per-file record key of each project file in ONE report (see `classifyProjectCoveragePaths`). */
26
42
  export declare function projectFileCoverageKeys(paths: readonly string[], projectRoot?: string): Map<string, string>;
27
43
  /** Read the canonical key first, then a measured legacy relative key if present. */
28
44
  export declare function fileCoverageLookupKeys(filePath: string, projectRoot?: string): string[];
@@ -6,6 +6,7 @@
6
6
  * summary figure is 0 by construction, and must be reported AND persisted as
7
7
  * null — never as 0% (a fake low figure) nor as istanbul's 0/0 = 100%.
8
8
  */
9
+ import * as fs from 'fs';
9
10
  import * as path from 'path';
10
11
  import { findProjectRoot } from '../../kernel/project-root.js';
11
12
  /**
@@ -17,34 +18,58 @@ import { findProjectRoot } from '../../kernel/project-root.js';
17
18
  export function fileCoverageKey(filePath, projectRoot) {
18
19
  return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(projectRoot ?? findProjectRoot(), filePath);
19
20
  }
21
+ function isInside(root, key) {
22
+ const relative = path.relative(root, key);
23
+ return relative !== '' && relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
24
+ }
25
+ function realRoot(root) {
26
+ try {
27
+ return fs.realpathSync(root);
28
+ }
29
+ catch {
30
+ return root;
31
+ }
32
+ }
20
33
  /**
21
- * #1030: the per-file record key of each path in ONE report, keyed by the
22
- * path as the report wrote it. A path is left out when its record would not
23
- * be a measurement of a project file: it resolves outside the project root
24
- * (lcov `SF:../../outside.ts`), it is a Windows absolute path read on POSIX
25
- * (it would resolve to a junk key), or the report lists the same file under
34
+ * #1030, #1219: sort the paths of ONE report into project files (with their
35
+ * per-file record key, keyed by the path as the report wrote it) and entries
36
+ * that are not a measurement of a project file: a path that resolves outside
37
+ * the project root (lcov `SF:../../outside.ts`), a Windows absolute path read
38
+ * on POSIX (it would resolve to a junk key), or a file the report lists under
26
39
  * two spellings (`./src/a.ts` and `src/a.ts`), so which entry is right is
27
- * unknown.
40
+ * unknown. A path under the root's realpath (macOS `/private/var` for
41
+ * `/var`) is inside.
28
42
  */
29
- export function projectFileCoverageKeys(paths, projectRoot) {
43
+ export function classifyProjectCoveragePaths(paths, projectRoot) {
30
44
  const root = path.resolve(projectRoot ?? findProjectRoot());
45
+ const canonicalRoot = realRoot(root);
31
46
  const keys = new Map();
47
+ const excluded = [];
32
48
  const spellings = new Map();
33
49
  for (const filePath of paths) {
34
- if (!path.isAbsolute(filePath) && path.win32.isAbsolute(filePath))
50
+ if (!path.isAbsolute(filePath) && path.win32.isAbsolute(filePath)) {
51
+ excluded.push({ path: filePath, reason: 'windows-path' });
35
52
  continue;
53
+ }
36
54
  const key = fileCoverageKey(filePath, root);
37
- const relative = path.relative(root, key);
38
- if (relative === '' || relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))
55
+ if (!isInside(root, key) && !isInside(canonicalRoot, key)) {
56
+ excluded.push({ path: filePath, reason: 'outside-project' });
39
57
  continue;
58
+ }
40
59
  keys.set(filePath, key);
41
60
  spellings.set(key, (spellings.get(key) ?? 0) + 1);
42
61
  }
43
62
  for (const [filePath, key] of keys) {
44
- if ((spellings.get(key) ?? 0) > 1)
63
+ if ((spellings.get(key) ?? 0) > 1) {
45
64
  keys.delete(filePath);
65
+ excluded.push({ path: filePath, reason: 'duplicate-spelling', file: key });
66
+ }
46
67
  }
47
- return keys;
68
+ return { keys, excluded };
69
+ }
70
+ /** #1030: the per-file record key of each project file in ONE report (see `classifyProjectCoveragePaths`). */
71
+ export function projectFileCoverageKeys(paths, projectRoot) {
72
+ return classifyProjectCoveragePaths(paths, projectRoot).keys;
48
73
  }
49
74
  /** Read the canonical key first, then a measured legacy relative key if present. */
50
75
  export function fileCoverageLookupKeys(filePath, projectRoot) {
@@ -528,6 +528,8 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
528
528
  function: pct(file.functions),
529
529
  statement: pct(file.statements),
530
530
  measured: true,
531
+ // #1219: the counts behind `line`, so several files can be line-weighted.
532
+ lines: { covered: file.lines.covered, total: file.lines.total },
531
533
  ...(runStatus ? { runStatus } : {}),
532
534
  }, { persist: true });
533
535
  }
@@ -16,7 +16,7 @@ import { TypeScriptParser } from '../../../shared/parsers/index.js';
16
16
  import { toError } from '../../../shared/error-utils.js';
17
17
  import { safeJsonParse } from '../../../shared/safe-json.js';
18
18
  import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
19
- import { measuredCoverageSummary, measuredFileCoverage } from '../../quality-assessment/coverage-report-event.js';
19
+ import { measuredFileCoverage } from '../../quality-assessment/coverage-report-event.js';
20
20
  import { fileCoverageLookupKeys } from '../../coverage-analysis/collected-metrics.js';
21
21
  // LLMDefectAnalysis is imported from ../interfaces
22
22
  const DEFAULT_CONFIG = {
@@ -616,11 +616,8 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
616
616
  return 1 - fileCoverage.line / 100;
617
617
  }
618
618
  }
619
- // Fall back to project-wide coverage
620
- const summary = measuredCoverageSummary(await this.memory.get('coverage:latest'));
621
- if (summary) {
622
- return 1 - summary.line / 100;
623
- }
619
+ // #1219: no fallback to the project-wide summary — it is not this
620
+ // file's coverage. A file with no record of its own gets the prior below.
624
621
  }
625
622
  catch {
626
623
  // Non-critical lookup
@@ -34,6 +34,14 @@ export interface MeasuredFileCoverage {
34
34
  function: number | null;
35
35
  statement: number | null;
36
36
  measured: true;
37
+ /**
38
+ * #1219: the line counts behind `line`, so a reader can weight several
39
+ * files by size. Absent on records written before 3.15.13.
40
+ */
41
+ lines?: {
42
+ covered: number;
43
+ total: number;
44
+ };
37
45
  }
38
46
  /**
39
47
  * Return the measured summary to store, or `null` when the payload is not
@@ -53,6 +53,27 @@ export function measuredFileCoverage(record) {
53
53
  if (r.measured !== true || !isPercent(r.line))
54
54
  return null;
55
55
  const opt = (v) => (isPercent(v) ? v : null);
56
- return { line: r.line, branch: opt(r.branch), function: opt(r.function), statement: opt(r.statement), measured: true };
56
+ const lines = lineCounts(r.lines, r.line);
57
+ return {
58
+ line: r.line, branch: opt(r.branch), function: opt(r.function), statement: opt(r.statement), measured: true,
59
+ ...(lines ? { lines } : {}),
60
+ };
61
+ }
62
+ /**
63
+ * #1219: whole, consistent line counts (`covered / total` within rounding of
64
+ * the stored percentage), or `undefined` when the record has none or they do
65
+ * not describe its own percentage.
66
+ */
67
+ function lineCounts(value, line) {
68
+ if (!value || typeof value !== 'object')
69
+ return undefined;
70
+ const { covered, total } = value;
71
+ if (!Number.isSafeInteger(covered) || !Number.isSafeInteger(total))
72
+ return undefined;
73
+ const c = covered;
74
+ const t = total;
75
+ if (t <= 0 || c < 0 || c > t || Math.abs((c / t) * 100 - line) > 0.01)
76
+ return undefined;
77
+ return { covered: c, total: t };
57
78
  }
58
79
  //# sourceMappingURL=coverage-report-event.js.map
@@ -103,6 +103,12 @@ export interface QualityReport {
103
103
  * value covers `analysedFiles` of `totalFiles`; `failed` lists the gaps.
104
104
  */
105
105
  partial?: PartialQualityMetric[];
106
+ /**
107
+ * The weighted score over the measured metrics only, present when a
108
+ * requested metric is unmeasured. `score.overall` is then -1: a score that
109
+ * leaves out unmeasured metrics is not the overall score (#1223 convention).
110
+ */
111
+ subsetScore?: number;
106
112
  }
107
113
  /** #1021: a file excluded from static analysis, with the reason. */
108
114
  export interface ExcludedQualityFile {
@@ -126,6 +126,10 @@ export declare class QualityAnalyzerService implements IQualityAnalyzerService {
126
126
  * Never a fixed fallback value.
127
127
  */
128
128
  private collectFileMetrics;
129
+ /**
130
+ * The file's own measured coverage record, or `null`. #1219: never the
131
+ * project-wide `coverage:latest` summary — that is not this file's coverage.
132
+ */
129
133
  private getStoredCoverage;
130
134
  private aggregateMetrics;
131
135
  private calculateQualityScore;