agentic-qe 3.15.16 → 3.15.18

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 (539) hide show
  1. package/.claude/helpers/brain-checkpoint.cjs +107 -10
  2. package/.claude/skills/agentic-quality-engineering/SKILL.md +67 -44
  3. package/.claude/skills/brutal-honesty-review/SKILL.md +12 -7
  4. package/.claude/skills/brutal-honesty-review/evals/brutal-honesty-review.yaml +120 -0
  5. package/.claude/skills/brutal-honesty-review/schemas/output.json +9 -3
  6. package/.claude/skills/code-review-quality/SKILL.md +2 -2
  7. package/.claude/skills/holistic-testing-pact/SKILL.md +11 -11
  8. package/.claude/skills/sherlock-review/SKILL.md +4 -2
  9. package/.claude/skills/sherlock-review/evals/sherlock-review.yaml +124 -0
  10. package/.claude/skills/skills-manifest.json +1 -1
  11. package/.claude/skills/technical-writing/SKILL.md +12 -6
  12. package/.claude/skills/technical-writing/evals/technical-writing.yaml +96 -0
  13. package/.opencode/skills/qe-agentic-quality-engineering.yaml +2 -2
  14. package/.opencode/skills/qe-holistic-testing-pact.yaml +2 -2
  15. package/CHANGELOG.md +201 -0
  16. package/assets/skills/agentic-quality-engineering/SKILL.md +67 -44
  17. package/assets/skills/brutal-honesty-review/SKILL.md +12 -8
  18. package/assets/skills/brutal-honesty-review/evals/brutal-honesty-review.yaml +120 -0
  19. package/assets/skills/brutal-honesty-review/schemas/output.json +9 -3
  20. package/assets/skills/code-review-quality/SKILL.md +2 -2
  21. package/assets/skills/holistic-testing-pact/SKILL.md +11 -11
  22. package/assets/skills/sherlock-review/SKILL.md +4 -3
  23. package/assets/skills/sherlock-review/evals/sherlock-review.yaml +124 -0
  24. package/assets/skills/skills-manifest.json +1 -1
  25. package/assets/skills/technical-writing/SKILL.md +12 -6
  26. package/assets/skills/technical-writing/evals/technical-writing.yaml +96 -0
  27. package/dist/cli/brain-commands.d.ts +5 -0
  28. package/dist/cli/brain-commands.js +4 -0
  29. package/dist/cli/bundle.js +6 -6
  30. package/dist/cli/chunks/adapter-WRSDXLOT.js +2 -0
  31. package/dist/cli/chunks/{agent-booster-wasm-45NWEKVS.js → agent-booster-wasm-UFNJNF3M.js} +2 -2
  32. package/dist/cli/chunks/{agent-handler-LVHMYFEF.js → agent-handler-EAYVRJXN.js} +2 -2
  33. package/dist/cli/chunks/{agent-memory-branch-YDWOJFEQ.js → agent-memory-branch-M65C6WAQ.js} +2 -2
  34. package/dist/cli/chunks/aqe-learning-engine-O6NJBCCM.js +2 -0
  35. package/dist/cli/chunks/{arena-ELDZH3CZ.js → arena-2GDICP6R.js} +4 -4
  36. package/dist/cli/chunks/{arena-CZKHXDDS.js → arena-CG3X67OE.js} +2 -2
  37. package/dist/cli/chunks/{audit-5MT4T47Z.js → audit-F4FSPJPL.js} +3 -3
  38. package/dist/cli/chunks/base-J2FXOE77.js +2 -0
  39. package/dist/cli/chunks/{better-sqlite3-6TGYPC2B.js → better-sqlite3-2MCFXW4J.js} +2 -2
  40. package/dist/cli/chunks/brain-handler-WGTJNYNB.js +95 -0
  41. package/dist/cli/chunks/{branch-enumerator-WVILM4SO.js → branch-enumerator-KL7C535H.js} +2 -2
  42. package/dist/cli/chunks/{browser-RX5ALU3H.js → browser-SJEXDVHS.js} +2 -2
  43. package/dist/cli/chunks/browser-workflow-LXGER6ZD.js +2 -0
  44. package/dist/cli/chunks/{chunk-2H4XH6FT.js → chunk-244RKAEP.js} +2 -2
  45. package/dist/cli/chunks/{chunk-SI6DPU5D.js → chunk-27TUMXPD.js} +1 -1
  46. package/dist/cli/chunks/{chunk-YNMJEDN5.js → chunk-2MBYDPCP.js} +2 -2
  47. package/dist/cli/chunks/{chunk-24QHCVX6.js → chunk-2Q6DTBMT.js} +1 -1
  48. package/dist/cli/chunks/{chunk-XWUWX7BV.js → chunk-355MI7RV.js} +13 -13
  49. package/dist/cli/chunks/{chunk-NQXXI77K.js → chunk-3LX5OKBD.js} +2 -2
  50. package/dist/cli/chunks/{chunk-63GMRQ25.js → chunk-3RPDKJGV.js} +1 -1
  51. package/dist/cli/chunks/chunk-3YMIT73A.js +4 -0
  52. package/dist/cli/chunks/{chunk-P3EYRILV.js → chunk-43KUVBSU.js} +2 -2
  53. package/dist/cli/chunks/chunk-477FKXSS.js +2 -0
  54. package/dist/cli/chunks/{chunk-HGWXF45W.js → chunk-4BIMTRRX.js} +1 -1
  55. package/dist/cli/chunks/{chunk-SSUAAX3F.js → chunk-4CVNVBX5.js} +2 -2
  56. package/dist/cli/chunks/{chunk-5V3TI2LG.js → chunk-4HL3SD4A.js} +1 -1
  57. package/dist/cli/chunks/{chunk-KKU2QGSJ.js → chunk-4PEG4DU2.js} +2 -2
  58. package/dist/cli/chunks/{chunk-J4ELZNLY.js → chunk-4QSQKFED.js} +2 -2
  59. package/dist/cli/chunks/chunk-53ZBETYR.js +16 -0
  60. package/dist/cli/chunks/{chunk-7TE5ONQQ.js → chunk-544KDWL4.js} +1 -1
  61. package/dist/cli/chunks/chunk-54RCGMLB.js +8 -0
  62. package/dist/cli/chunks/{chunk-KU2AUFGX.js → chunk-5AGXIZQ5.js} +2 -2
  63. package/dist/cli/chunks/{chunk-LQLPB2T6.js → chunk-5M24X6W7.js} +2 -2
  64. package/dist/cli/chunks/{chunk-YU2BDRSD.js → chunk-5O5T4LEU.js} +1 -1
  65. package/dist/cli/chunks/{chunk-NAEWCFQT.js → chunk-5RFXX4IF.js} +2 -2
  66. package/dist/cli/chunks/{chunk-MD43XRX5.js → chunk-62MLAQRJ.js} +1 -1
  67. package/dist/cli/chunks/{chunk-PEQDY4BO.js → chunk-6D6TGL2E.js} +2 -2
  68. package/dist/cli/chunks/{chunk-IOYG4VFL.js → chunk-6IHZDSDL.js} +2 -2
  69. package/dist/cli/chunks/{chunk-C5FP5GW3.js → chunk-6P3Y45QL.js} +2 -2
  70. package/dist/cli/chunks/{chunk-4LQFBY5L.js → chunk-6TEVM3X3.js} +10 -10
  71. package/dist/cli/chunks/{chunk-YPBSUGMI.js → chunk-7XTUKKRA.js} +1 -1
  72. package/dist/cli/chunks/chunk-A3GDX6UF.js +2 -0
  73. package/dist/cli/chunks/{chunk-HLUXXCHF.js → chunk-A5YTKKNA.js} +1 -1
  74. package/dist/cli/chunks/{chunk-Y4PFUMOU.js → chunk-ADNGZAT2.js} +1 -1
  75. package/dist/cli/chunks/{chunk-KNSRL6NO.js → chunk-AWQAE3SW.js} +2 -2
  76. package/dist/cli/chunks/{chunk-BY5OF7OH.js → chunk-AXDBQFR4.js} +2 -2
  77. package/dist/cli/chunks/{chunk-525CFDUE.js → chunk-AXVD7O3F.js} +2 -2
  78. package/dist/cli/chunks/{chunk-JHQCRRJI.js → chunk-B52ULNYO.js} +2 -2
  79. package/dist/cli/chunks/chunk-B6S4FC7M.js +3 -0
  80. package/dist/cli/chunks/{chunk-AJMJNQMP.js → chunk-BDVFSMOQ.js} +1 -1
  81. package/dist/cli/chunks/{chunk-DXD6K2ZP.js → chunk-BGXXMX3Y.js} +2 -2
  82. package/dist/cli/chunks/{chunk-EK7OLYOZ.js → chunk-BKMQQY5T.js} +2 -2
  83. package/dist/cli/chunks/{chunk-VWPM27GU.js → chunk-BN2FROBQ.js} +2 -2
  84. package/dist/cli/chunks/{chunk-J7I6PABJ.js → chunk-BO6EQNOC.js} +2 -2
  85. package/dist/cli/chunks/{chunk-4D4DENG6.js → chunk-BOVAKCDC.js} +2 -2
  86. package/dist/cli/chunks/{chunk-ZFL436FN.js → chunk-BSXKZDKO.js} +2 -2
  87. package/dist/cli/chunks/{chunk-J442IZLE.js → chunk-C5QVJ5XQ.js} +1 -1
  88. package/dist/cli/chunks/{chunk-ZB3LEFYG.js → chunk-CFQLLF3D.js} +2 -2
  89. package/dist/cli/chunks/{chunk-UHEOGZLX.js → chunk-DUCVLT3F.js} +7 -7
  90. package/dist/cli/chunks/{chunk-TVGI32MB.js → chunk-E4RMJCGA.js} +3 -3
  91. package/dist/cli/chunks/{chunk-TIUKLYAI.js → chunk-EONDCWY4.js} +1 -1
  92. package/dist/cli/chunks/{chunk-ZJH5MU2I.js → chunk-F4AGNKL2.js} +2 -2
  93. package/dist/cli/chunks/{chunk-N7HL5PHH.js → chunk-F6YD3BOW.js} +1 -1
  94. package/dist/cli/chunks/{chunk-5VZL4UVN.js → chunk-FQRS7WVA.js} +2 -2
  95. package/dist/cli/chunks/{chunk-SHKOCGNK.js → chunk-FT24SSDG.js} +2 -2
  96. package/dist/cli/chunks/chunk-FV4YNSAJ.js +5 -0
  97. package/dist/cli/chunks/{chunk-KXCLACFG.js → chunk-FVDM3X42.js} +2 -2
  98. package/dist/cli/chunks/{chunk-32BPDLRZ.js → chunk-FVH7TXWU.js} +2 -2
  99. package/dist/cli/chunks/{chunk-72XSEQMW.js → chunk-FWR5QY37.js} +2 -2
  100. package/dist/cli/chunks/chunk-FYINK2B7.js +6 -0
  101. package/dist/cli/chunks/{chunk-5JZRZI4S.js → chunk-GGISVPOZ.js} +2 -2
  102. package/dist/cli/chunks/{chunk-5LAVKGLH.js → chunk-GPIJIZJQ.js} +2 -2
  103. package/dist/cli/chunks/{chunk-5QO3R3TU.js → chunk-GXEVOT5F.js} +2 -2
  104. package/dist/cli/chunks/{chunk-IHRXZZQM.js → chunk-GZ4VB5RI.js} +1 -1
  105. package/dist/cli/chunks/chunk-HBDSCYSK.js +2 -0
  106. package/dist/cli/chunks/{chunk-GSKMOPL7.js → chunk-HGG4HR7C.js} +2 -2
  107. package/dist/cli/chunks/{chunk-AR67RJPY.js → chunk-HSCKWWO2.js} +2 -2
  108. package/dist/cli/chunks/{chunk-6XXZDV2C.js → chunk-HSQ3GUYJ.js} +2 -2
  109. package/dist/cli/chunks/{chunk-AAMLQ2LF.js → chunk-HZQBW5EM.js} +3 -3
  110. package/dist/cli/chunks/{chunk-O5W3FIO6.js → chunk-IGIYANVT.js} +2 -2
  111. package/dist/cli/chunks/{chunk-C6D5AHBO.js → chunk-IPWMSXBF.js} +2 -2
  112. package/dist/cli/chunks/{chunk-NDJ7P2EP.js → chunk-IWVNC7VY.js} +1 -1
  113. package/dist/cli/chunks/{chunk-FDDC72IA.js → chunk-IZODXKZD.js} +2 -2
  114. package/dist/cli/chunks/{chunk-NO3IV5Q5.js → chunk-J2MT2OJV.js} +1 -1
  115. package/dist/cli/chunks/{chunk-GQ6TUIKY.js → chunk-JKIJVVSP.js} +1 -1
  116. package/dist/cli/chunks/{chunk-LE4QJREF.js → chunk-JMRDT2XK.js} +1 -1
  117. package/dist/cli/chunks/{chunk-2YZ4G6NW.js → chunk-JR2UMTKG.js} +1 -1
  118. package/dist/cli/chunks/{chunk-RJIEG3NA.js → chunk-K6CH4CFF.js} +2 -2
  119. package/dist/cli/chunks/{chunk-5NNNEWLS.js → chunk-K7KW5QB5.js} +81 -88
  120. package/dist/cli/chunks/chunk-KFCQP434.js +2 -0
  121. package/dist/cli/chunks/{chunk-A5GBXCP5.js → chunk-KH4T6STG.js} +2 -2
  122. package/dist/cli/chunks/{chunk-VMDFFTCK.js → chunk-KJBYZO57.js} +1 -1
  123. package/dist/cli/chunks/{chunk-GJYHWYXR.js → chunk-KP4OKOKV.js} +2 -2
  124. package/dist/cli/chunks/chunk-L2MBKVSE.js +2 -0
  125. package/dist/cli/chunks/{chunk-XIQW7EFL.js → chunk-L3IPUIT3.js} +2 -2
  126. package/dist/cli/chunks/{chunk-W5HQUIML.js → chunk-L7PSU2YN.js} +2 -2
  127. package/dist/cli/chunks/{chunk-6DPYNAOK.js → chunk-LA3JPGQA.js} +2 -2
  128. package/dist/cli/chunks/{chunk-5PBLPQ5T.js → chunk-LC2QRN7V.js} +14 -13
  129. package/dist/cli/chunks/{chunk-SSYAQZXA.js → chunk-LHY7TMTM.js} +2 -2
  130. package/dist/cli/chunks/{chunk-QQWBWEJS.js → chunk-LLQ2UMF6.js} +3 -3
  131. package/dist/cli/chunks/{chunk-DTMAS2GB.js → chunk-LOJ7OO6W.js} +2 -2
  132. package/dist/cli/chunks/{chunk-32GN3JKR.js → chunk-LPUSH3VF.js} +1 -1
  133. package/dist/cli/chunks/{chunk-SDLWKRVL.js → chunk-LSEC2BU7.js} +2 -2
  134. package/dist/cli/chunks/{chunk-IOKYCMTJ.js → chunk-LTGB7OIU.js} +2 -2
  135. package/dist/cli/chunks/{chunk-6ZBXSOX6.js → chunk-LUG7YNVZ.js} +2 -2
  136. package/dist/cli/chunks/{chunk-CAKMOVZ6.js → chunk-LWAFRYKE.js} +2 -2
  137. package/dist/cli/chunks/{chunk-FLNAW7C4.js → chunk-M24ZAZ4U.js} +2 -2
  138. package/dist/cli/chunks/{chunk-L2DWPVNJ.js → chunk-MKRKRXTX.js} +1 -1
  139. package/dist/cli/chunks/{chunk-YTHTQPWR.js → chunk-MNNLONAD.js} +1 -1
  140. package/dist/cli/chunks/{chunk-V5NHZV7S.js → chunk-MQM37KAR.js} +2 -2
  141. package/dist/cli/chunks/{chunk-PPUZWYUG.js → chunk-MSX2OHYT.js} +2 -2
  142. package/dist/cli/chunks/{chunk-YRAX7SFJ.js → chunk-MVYQRVLP.js} +2 -2
  143. package/dist/cli/chunks/{chunk-QVDCVD5D.js → chunk-MZC5WM2P.js} +2 -2
  144. package/dist/cli/chunks/{chunk-S75SOOZL.js → chunk-MZRBNBB3.js} +2 -2
  145. package/dist/cli/chunks/{chunk-FL64OUBA.js → chunk-N3KQU4UC.js} +2 -2
  146. package/dist/cli/chunks/{chunk-G5RHFBAY.js → chunk-NKU3FFM4.js} +2 -2
  147. package/dist/cli/chunks/chunk-O5EWFR76.js +2 -0
  148. package/dist/cli/chunks/{chunk-63ZKI4PX.js → chunk-O5RDHD5T.js} +2 -2
  149. package/dist/cli/chunks/chunk-O6UWIXME.js +3 -0
  150. package/dist/cli/chunks/{chunk-HCH4Y6XX.js → chunk-OA4EQDC4.js} +2 -2
  151. package/dist/cli/chunks/{chunk-QPEOLAAS.js → chunk-OBCXCRXK.js} +1 -1
  152. package/dist/cli/chunks/{chunk-6ICX3FEG.js → chunk-OHU5P25N.js} +22 -22
  153. package/dist/cli/chunks/{chunk-GFWHUQSF.js → chunk-OOSV2RIA.js} +2 -2
  154. package/dist/cli/chunks/{chunk-MO55CVMT.js → chunk-OW23N2Y5.js} +14 -14
  155. package/dist/cli/chunks/{chunk-M7WJCTG3.js → chunk-OXOO3YDL.js} +2 -2
  156. package/dist/cli/chunks/{chunk-KQYJ4VQ5.js → chunk-OYGKSSSI.js} +1 -1
  157. package/dist/cli/chunks/chunk-PGO46IIW.js +2 -0
  158. package/dist/cli/chunks/{chunk-NVEWF4JV.js → chunk-PZOYQHWS.js} +1 -1
  159. package/dist/cli/chunks/{chunk-IESR7TNB.js → chunk-Q2BZSG7Z.js} +2 -2
  160. package/dist/cli/chunks/{chunk-XIIQ5QTT.js → chunk-Q7V722K5.js} +2 -2
  161. package/dist/cli/chunks/{chunk-F742SZAX.js → chunk-QZU6M5IO.js} +2 -2
  162. package/dist/cli/chunks/{chunk-PINSJCM3.js → chunk-R55Y76SJ.js} +1 -1
  163. package/dist/cli/chunks/{chunk-5B5QPCNU.js → chunk-RMEQYJPU.js} +4 -4
  164. package/dist/cli/chunks/{chunk-ZQ2XW3IP.js → chunk-RTYXFXTI.js} +2 -2
  165. package/dist/cli/chunks/{chunk-DVYHMDFR.js → chunk-SJF3O4FX.js} +374 -371
  166. package/dist/cli/chunks/{chunk-AG2EWGXS.js → chunk-SOUS7Z2H.js} +2 -2
  167. package/dist/cli/chunks/{chunk-3HD7E6HN.js → chunk-SRVNR3R3.js} +2 -2
  168. package/dist/cli/chunks/{chunk-KITOPKRG.js → chunk-SU3SXMVG.js} +2 -2
  169. package/dist/cli/chunks/chunk-SWGPLXWW.js +32 -0
  170. package/dist/cli/chunks/{chunk-ZR2TKVXQ.js → chunk-TRB3EVH3.js} +2 -2
  171. package/dist/cli/chunks/{chunk-OCV2XEWQ.js → chunk-TVBDUMKT.js} +2 -2
  172. package/dist/cli/chunks/{chunk-IOQ6ZQ5W.js → chunk-TWTXPSFU.js} +1 -1
  173. package/dist/cli/chunks/{chunk-CJSHWQXP.js → chunk-ULYUVUL2.js} +2 -2
  174. package/dist/cli/chunks/{chunk-PHT5N7SC.js → chunk-UNTBVJ5X.js} +2 -2
  175. package/dist/cli/chunks/{chunk-LKTTUHLF.js → chunk-UQAA4PHU.js} +2 -2
  176. package/dist/cli/chunks/{chunk-SR52XP5F.js → chunk-UWSJVKTE.js} +1 -1
  177. package/dist/cli/chunks/{chunk-L6QSTQME.js → chunk-V2LJ54KP.js} +2 -2
  178. package/dist/cli/chunks/{chunk-FBDVGRSC.js → chunk-VCCTTKP3.js} +7 -7
  179. package/dist/cli/chunks/{chunk-YLMNVLDK.js → chunk-VEGUYUVS.js} +1 -1
  180. package/dist/cli/chunks/{chunk-ASEOFRIG.js → chunk-VUQPVWNK.js} +2 -2
  181. package/dist/cli/chunks/{chunk-VXFLJNCA.js → chunk-VVGUE2T2.js} +2 -2
  182. package/dist/cli/chunks/{chunk-4NFQLP6R.js → chunk-W5ASDHJQ.js} +1 -1
  183. package/dist/cli/chunks/{chunk-I7MQIM2U.js → chunk-WGXT5NWQ.js} +1 -1
  184. package/dist/cli/chunks/chunk-WJN3V7QB.js +7 -0
  185. package/dist/cli/chunks/chunk-WPCRQIIF.js +29 -0
  186. package/dist/cli/chunks/{chunk-SASBO5Y5.js → chunk-WQNLXUWA.js} +6 -6
  187. package/dist/cli/chunks/{chunk-5SPCGMBB.js → chunk-WZVRMKG2.js} +2 -2
  188. package/dist/cli/chunks/{chunk-MI5MFHRA.js → chunk-X27IUWTD.js} +2 -2
  189. package/dist/cli/chunks/{chunk-HJ6ZGVTB.js → chunk-X4B345B6.js} +2 -2
  190. package/dist/cli/chunks/{chunk-HVRRLYX6.js → chunk-X5I2Y4VO.js} +2 -2
  191. package/dist/cli/chunks/{chunk-SUDMM5SO.js → chunk-X7IQIFTS.js} +2 -2
  192. package/dist/cli/chunks/chunk-XJN3RKUD.js +3 -0
  193. package/dist/cli/chunks/{chunk-E3D4GPLP.js → chunk-XQMGXTHJ.js} +3 -3
  194. package/dist/cli/chunks/{chunk-67Z5R7RJ.js → chunk-XTSAMB2Q.js} +2 -2
  195. package/dist/cli/chunks/{chunk-KVF4NXGQ.js → chunk-XZLIF4O2.js} +2 -2
  196. package/dist/cli/chunks/{chunk-EA4YQVKS.js → chunk-Y4LSEOZ3.js} +1 -1
  197. package/dist/cli/chunks/{chunk-OAEE6JWQ.js → chunk-Y4YN2RXR.js} +2 -2
  198. package/dist/cli/chunks/{chunk-CEYSYSK5.js → chunk-YDI56L35.js} +2 -2
  199. package/dist/cli/chunks/{chunk-JDIYMZCQ.js → chunk-YFILS5D5.js} +2 -2
  200. package/dist/cli/chunks/{chunk-GAHNO6JJ.js → chunk-YISDX6WB.js} +2 -2
  201. package/dist/cli/chunks/{chunk-AGRV5B3T.js → chunk-YP2GHQSV.js} +2 -2
  202. package/dist/cli/chunks/{chunk-UNGBRZDK.js → chunk-YSX756AM.js} +4 -4
  203. package/dist/cli/chunks/{chunk-BEKDKVQT.js → chunk-YWANOASW.js} +2 -2
  204. package/dist/cli/chunks/{chunk-JQ3DYUMS.js → chunk-YYIJLG7S.js} +2 -2
  205. package/dist/cli/chunks/{chunk-CRPIYUTJ.js → chunk-Z7SD7LXM.js} +2 -2
  206. package/dist/cli/chunks/{chunk-U2A7NHZA.js → chunk-ZDWD73UF.js} +2 -2
  207. package/dist/cli/chunks/{chunk-WP4RETKG.js → chunk-ZFT3RLA4.js} +2 -2
  208. package/dist/cli/chunks/{chunk-VJCIEHEF.js → chunk-ZNTHX5G3.js} +1 -1
  209. package/dist/cli/chunks/{chunk-PF7RBAYL.js → chunk-ZS27R7VL.js} +2 -2
  210. package/dist/cli/chunks/{chunk-24OX5TQJ.js → chunk-ZXHHHR7K.js} +1 -1
  211. package/dist/cli/chunks/{ci-MFUR4CWV.js → ci-N5MOMNXH.js} +2 -2
  212. package/dist/cli/chunks/{ci-config-PNDLQ6XV.js → ci-config-6L2ROQCW.js} +2 -2
  213. package/dist/cli/chunks/{ci-output-PFZ4M7NC.js → ci-output-DSRBYEIK.js} +2 -2
  214. package/dist/cli/chunks/{circuit-breaker-5HH6NLZN.js → circuit-breaker-VRPTNBL7.js} +2 -2
  215. package/dist/cli/chunks/{claude-flow-setup-QCKYLGLC.js → claude-flow-setup-4YFG3FU5.js} +2 -2
  216. package/dist/cli/chunks/client-I3L6BKRQ.js +2 -0
  217. package/dist/cli/chunks/{cline-installer-EASVPFXR.js → cline-installer-7RGYJWGN.js} +2 -2
  218. package/dist/cli/chunks/{code-UJXDVYRK.js → code-ISC6NW2K.js} +3 -3
  219. package/dist/cli/chunks/{code-index-extractor-BZJ3UDP4.js → code-index-extractor-2FID75YV.js} +2 -2
  220. package/dist/cli/chunks/{codex-installer-XSQZUVOZ.js → codex-installer-DZ7OG6KM.js} +2 -2
  221. package/dist/cli/chunks/{completions-OWOOJFI2.js → completions-SM3LICWK.js} +2 -2
  222. package/dist/cli/chunks/{complexity-analyzer-KP5TOHDT.js → complexity-analyzer-ZWD2CTAD.js} +2 -2
  223. package/dist/cli/chunks/{continuedev-installer-IFKQXLHM.js → continuedev-installer-AGASOA26.js} +2 -2
  224. package/dist/cli/chunks/copilot-installer-CLPZYTQC.js +3 -0
  225. package/dist/cli/chunks/core-handlers-5EFOJ37H.js +2 -0
  226. package/dist/cli/chunks/{cost-tracker-MMDDNKZB.js → cost-tracker-7PIGQYDV.js} +2 -2
  227. package/dist/cli/chunks/{coverage-LUH2B7NT.js → coverage-T2GEBTYS.js} +9 -9
  228. package/dist/cli/chunks/cross-domain-router-65WJAKVD.js +2 -0
  229. package/dist/cli/chunks/{cursor-installer-4YLM5GWM.js → cursor-installer-KXBID4MB.js} +2 -2
  230. package/dist/cli/chunks/daemon-43MXIVH3.js +18 -0
  231. package/dist/cli/chunks/{daemon-MZKVM4CJ.js → daemon-VAMJLQJ5.js} +3 -3
  232. package/dist/cli/chunks/{dag-attention-scheduler-X4CYW665.js → dag-attention-scheduler-UBP4VHTA.js} +2 -2
  233. package/dist/cli/chunks/{detect-7BM2XINO.js → detect-QWFIQRKI.js} +2 -2
  234. package/dist/cli/chunks/{dist-node-Y5APLEYB.js → dist-node-I2GICS3W.js} +2 -2
  235. package/dist/cli/chunks/{domain-handler-X3ZRJNAH.js → domain-handler-Z66ISB2A.js} +2 -2
  236. package/dist/cli/chunks/{domain-plugins-2UW5KQJB.js → domain-plugins-KHMD3FKT.js} +2 -2
  237. package/dist/cli/chunks/{domain-transfer-35W4CIBV.js → domain-transfer-JWGNNA6K.js} +2 -2
  238. package/dist/cli/chunks/dream-VQ2PZCVR.js +2 -0
  239. package/dist/cli/chunks/embed-and-insert-pattern-F5P5B6JX.js +3 -0
  240. package/dist/cli/chunks/{embedding-space-SBM2MZD2.js → embedding-space-KHG6TITM.js} +2 -2
  241. package/dist/cli/chunks/{eval-4QA2SROK.js → eval-43OHU7EI.js} +2 -2
  242. package/dist/cli/chunks/{experience-capture-middleware-Z6BF6KYM.js → experience-capture-middleware-KXD47H6P.js} +3 -3
  243. package/dist/cli/chunks/{fast-paths-FIORX6GN.js → fast-paths-6D75D5KD.js} +2 -2
  244. package/dist/cli/chunks/{feature-flags-6LYI2T4G.js → feature-flags-IE35Y55N.js} +2 -2
  245. package/dist/cli/chunks/{feature-flags-ZOO7LMIC.js → feature-flags-OYYHY7LS.js} +2 -2
  246. package/dist/cli/chunks/file-discovery-LGBTY3ID.js +2 -0
  247. package/dist/cli/chunks/{fleet-7WF53H4F.js → fleet-AGVJMFGD.js} +16 -16
  248. package/dist/cli/chunks/{gnn-wrapper-KJ6B7BRM.js → gnn-wrapper-5L66A7LW.js} +2 -2
  249. package/dist/cli/chunks/{heartbeat-handler-DEKKMOVW.js → heartbeat-handler-2BY6YYOT.js} +5 -5
  250. package/dist/cli/chunks/heartbeat-scheduler-3DU3M5AT.js +2 -0
  251. package/dist/cli/chunks/hnsw-adapter-N2IMSRPV.js +2 -0
  252. package/dist/cli/chunks/hnsw-index-DVU7TTJE.js +2 -0
  253. package/dist/cli/chunks/{hnsw-legacy-bridge-L27WS27N.js → hnsw-legacy-bridge-RYMWFNAH.js} +2 -2
  254. package/dist/cli/chunks/{hnswlib-node-4YOQC6L4.js → hnswlib-node-GG47HP2P.js} +2 -2
  255. package/dist/cli/chunks/{hooks-TAOKV4EJ.js → hooks-FQNACS24.js} +10 -10
  256. package/dist/cli/chunks/hybrid-backend-AS2PNHOD.js +2 -0
  257. package/dist/cli/chunks/{hypergraph-engine-BODRJLHL.js → hypergraph-engine-6BYNJQEP.js} +2 -2
  258. package/dist/cli/chunks/{hypergraph-handler-RKMYJNTU.js → hypergraph-handler-CYTAXZKJ.js} +3 -3
  259. package/dist/cli/chunks/impact-analyzer-Y4OONLFP.js +2 -0
  260. package/dist/cli/chunks/{init-guard-MXHSLSB2.js → init-guard-METTAV5O.js} +2 -2
  261. package/dist/cli/chunks/{init-handler-HUE57IFW.js → init-handler-GFT74U5Y.js} +6 -6
  262. package/dist/cli/chunks/init-wizard-HLNUBJQN.js +2 -0
  263. package/dist/cli/chunks/kernel-XKFWCL7Y.js +2 -0
  264. package/dist/cli/chunks/{kilocode-installer-S333IKYQ.js → kilocode-installer-GZV2D3FF.js} +2 -2
  265. package/dist/cli/chunks/{kiro-installer-WM5DLQWC.js → kiro-installer-Q4ZXUFC7.js} +2 -2
  266. package/dist/cli/chunks/knowledge-graph-CNL77CSZ.js +2 -0
  267. package/dist/cli/chunks/{learning-LNHMQLH5.js → learning-WA2QEYL7.js} +35 -34
  268. package/dist/cli/chunks/{llm-router-EWFXYZZR.js → llm-router-GRTCHWH7.js} +4 -4
  269. package/dist/cli/chunks/llm-router-service-UIYTYKP6.js +2 -0
  270. package/dist/cli/chunks/{load-FGYGWVDK.js → load-WXN3Q7Y5.js} +2 -2
  271. package/dist/cli/chunks/load-test-PXLW4A5B.js +2 -0
  272. package/dist/cli/chunks/{mcp-2FHNAAOM.js → mcp-LIQCPSJN.js} +2 -2
  273. package/dist/cli/chunks/{memory-DZMQ73AB.js → memory-OP6CHRFH.js} +5 -5
  274. package/dist/cli/chunks/memory-backend-XYOSO73Q.js +2 -0
  275. package/dist/cli/chunks/memory-handlers-PQFYVNVG.js +2 -0
  276. package/dist/cli/chunks/{multi-model-executor-6F2UAEUW.js → multi-model-executor-H54DEVRZ.js} +2 -2
  277. package/dist/cli/chunks/{opencode-installer-XY3BGOTZ.js → opencode-installer-BSQV6UAT.js} +2 -2
  278. package/dist/cli/chunks/{orchestrator-B4CNKUOS.js → orchestrator-TJDPQ4VL.js} +122 -35
  279. package/dist/cli/chunks/pattern-null-store-BKGTQFNF.js +2 -0
  280. package/dist/cli/chunks/{pattern-usage-recorder-R4GUFNMD.js → pattern-usage-recorder-FOVS4M5L.js} +2 -2
  281. package/dist/cli/chunks/{pipeline-FG5RKVRO.js → pipeline-4AY2ZIC6.js} +2 -2
  282. package/dist/cli/chunks/{platform-3BT4KEVJ.js → platform-FCSITYMR.js} +2 -2
  283. package/dist/cli/chunks/{plugin-WI4RIN7O.js → plugin-E56TV5S2.js} +2 -2
  284. package/dist/cli/chunks/{prime-radiant-advanced-wasm-7ECDNQFS.js → prime-radiant-advanced-wasm-ACOPC533.js} +2 -2
  285. package/dist/cli/chunks/project-root-MPX7CN2C.js +2 -0
  286. package/dist/cli/chunks/protocol-executor-CRQOCC4A.js +2 -0
  287. package/dist/cli/chunks/{protocol-handler-WNODKPGW.js → protocol-handler-KRVXF4LS.js} +2 -2
  288. package/dist/cli/chunks/{prove-5RHAEPYZ.js → prove-KMFPSKGD.js} +2 -2
  289. package/dist/cli/chunks/qe-reasoning-bank-UEGQ3O7F.js +2 -0
  290. package/dist/cli/chunks/{quality-WPHR7BGQ.js → quality-6DBI3HLB.js} +2 -2
  291. package/dist/cli/chunks/{quality-gate-4RKTEZMX.js → quality-gate-3ROZMEIL.js} +3 -3
  292. package/dist/cli/chunks/queen-coordinator-32574XSG.js +2 -0
  293. package/dist/cli/chunks/real-embeddings-MIGZNKK3.js +2 -0
  294. package/dist/cli/chunks/{ref-validation-TPAWHOHH.js → ref-validation-EYIP7DHW.js} +2 -2
  295. package/dist/cli/chunks/{roocode-installer-7AVHFNDI.js → roocode-installer-IGGZHR2Y.js} +2 -2
  296. package/dist/cli/chunks/router-CZJY5WX6.js +2 -0
  297. package/dist/cli/chunks/routing-feedback-RC3UBNFX.js +2 -0
  298. package/dist/cli/chunks/{routing-handler-YKEDVJSH.js → routing-handler-BWNHBYDC.js} +2 -2
  299. package/dist/cli/chunks/{ruvector-commands-JUAMM354.js → ruvector-commands-PXIHF432.js} +2 -2
  300. package/dist/cli/chunks/rvf-dual-writer-OG7OV2AK.js +2 -0
  301. package/dist/cli/chunks/rvf-migration-adapter-THYMW7ZO.js +2 -0
  302. package/dist/cli/chunks/rvf-migration-coordinator-3H6CLFU7.js +2 -0
  303. package/dist/cli/chunks/rvf-native-adapter-6JQJIKKW.js +2 -0
  304. package/dist/cli/chunks/{rvf-store-integrity-VJDUIRTX.js → rvf-store-integrity-CVB3NMSL.js} +2 -2
  305. package/dist/cli/chunks/safe-db-QFKCVTIJ.js +2 -0
  306. package/dist/cli/chunks/schedule-6JLVMMYB.js +2 -0
  307. package/dist/cli/chunks/scheduler-3MPZRMJD.js +2 -0
  308. package/dist/cli/chunks/{security-ORDN3RD2.js → security-DCRGOTWU.js} +3 -3
  309. package/dist/cli/chunks/{shared-rvf-adapter-CF4BCIO7.js → shared-rvf-adapter-GKD74QUB.js} +2 -2
  310. package/dist/cli/chunks/{shared-rvf-dual-writer-C32UBR6D.js → shared-rvf-dual-writer-HVAAVEOH.js} +2 -2
  311. package/dist/cli/chunks/sqlite-persistence-LGTIKAEX.js +2 -0
  312. package/dist/cli/chunks/{standalone-memory-OXRJYZXN.js → standalone-memory-O7O2U5N4.js} +2 -2
  313. package/dist/cli/chunks/{status-handler-BCX5D4HY.js → status-handler-BQTPJJTL.js} +2 -2
  314. package/dist/cli/chunks/{structural-health-LFG7RUU6.js → structural-health-4H6J4OHK.js} +2 -2
  315. package/dist/cli/chunks/sync-DJ4TF6QX.js +2 -0
  316. package/dist/cli/chunks/{sync-YJEE2K2L.js → sync-WW5TAVYW.js} +2 -2
  317. package/dist/cli/chunks/{task-handler-6LXKPTXJ.js → task-handler-HEM4IEOW.js} +2 -2
  318. package/dist/cli/chunks/{task-handlers-CILP36I7.js → task-handlers-JRA3NXIR.js} +3 -3
  319. package/dist/cli/chunks/test-772ZXVG2.js +34 -0
  320. package/dist/cli/chunks/test-runner-process-XGF2U3NG.js +2 -0
  321. package/dist/cli/chunks/{test-scheduling-ISI2O4Q5.js → test-scheduling-4TRB7LZ7.js} +3 -3
  322. package/dist/cli/chunks/token-bootstrap-CICBIJ7T.js +2 -0
  323. package/dist/cli/chunks/{token-usage-XOC5KG7S.js → token-usage-B7PEKE2G.js} +2 -2
  324. package/dist/cli/chunks/{transformers-LSLQAARK.js → transformers-V7X7BDZX.js} +2 -2
  325. package/dist/cli/chunks/tree-sitter-wasm-parser-OXPFKFZS.js +2 -0
  326. package/dist/cli/chunks/{types-5BLCGLCR.js → types-AHHTUY3I.js} +2 -2
  327. package/dist/cli/chunks/unified-memory-GUR3IUI6.js +2 -0
  328. package/dist/cli/chunks/unified-memory-hnsw-NJP2F2RY.js +2 -0
  329. package/dist/cli/chunks/unified-persistence-NILBWXDP.js +2 -0
  330. package/dist/cli/chunks/{upgrade-RQJYLK3J.js → upgrade-DZ4DLUQ5.js} +2 -2
  331. package/dist/cli/chunks/{validate-QBHWXXCK.js → validate-4DTLIDJE.js} +2 -2
  332. package/dist/cli/chunks/{validate-swarm-IKXBKFB5.js → validate-swarm-A26UFVIS.js} +2 -2
  333. package/dist/cli/chunks/visual-security-YECYZ27X.js +2 -0
  334. package/dist/cli/chunks/{web-tree-sitter-ZF6FIE5R.js → web-tree-sitter-F2C7QRYT.js} +2 -2
  335. package/dist/cli/chunks/{windsurf-installer-HQGDZT5D.js → windsurf-installer-OOBTDA6W.js} +2 -2
  336. package/dist/cli/chunks/{witness-chain-DCHCAMSQ.js → witness-chain-KGFZJP32.js} +2 -2
  337. package/dist/cli/chunks/witness-chain-LYBXFLJB.js +2 -0
  338. package/dist/cli/chunks/witness-chain-repair-CNTXOGPN.js +2 -0
  339. package/dist/cli/chunks/{witness-chain-verifier-PX2OQ6XT.js → witness-chain-verifier-OB7ZZOI3.js} +2 -2
  340. package/dist/cli/chunks/{witness-key-manager-RXYQNFJB.js → witness-key-manager-YCKGKGQI.js} +2 -2
  341. package/dist/cli/chunks/{workflow-FBKCA4H6.js → workflow-PRERHWKY.js} +4 -4
  342. package/dist/cli/chunks/workflow-orchestrator-UIBGWCU3.js +2 -0
  343. package/dist/cli/chunks/wrappers-L4UY4V63.js +2 -0
  344. package/dist/cli/commands/coverage.js +4 -1
  345. package/dist/cli/commands/learning-prune.js +9 -1
  346. package/dist/cli/commands/test.js +26 -4
  347. package/dist/cli/handlers/brain-handler.js +32 -2
  348. package/dist/cli/handlers/heartbeat-handler.js +3 -1
  349. package/dist/cli/utils/coverage-data.js +5 -1
  350. package/dist/cli/utils/coverage-verdict.d.ts +10 -2
  351. package/dist/cli/utils/coverage-verdict.js +23 -8
  352. package/dist/cli/utils/fleet-operation.js +9 -3
  353. package/dist/coordination/handlers/code-intelligence-handlers.js +17 -3
  354. package/dist/coordination/handlers/coverage-handlers.js +22 -9
  355. package/dist/coordination/handlers/coverage-target.d.ts +22 -2
  356. package/dist/coordination/handlers/coverage-target.js +45 -9
  357. package/dist/coordination/handlers/handler-utils.d.ts +19 -0
  358. package/dist/coordination/handlers/handler-utils.js +22 -8
  359. package/dist/coordination/handlers/test-execution-handlers.js +64 -20
  360. package/dist/coordination/protocols/code-intelligence-index.js +6 -3
  361. package/dist/coordination/protocols/learning-consolidation-archive.d.ts +6 -3
  362. package/dist/coordination/protocols/learning-consolidation-archive.js +4 -3
  363. package/dist/coordination/workflow-builtin.js +1 -0
  364. package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +8 -3
  365. package/dist/domains/code-intelligence/services/semantic-analyzer.js +39 -25
  366. package/dist/domains/code-intelligence/services/text-relevance.d.ts +32 -0
  367. package/dist/domains/code-intelligence/services/text-relevance.js +63 -0
  368. package/dist/domains/defect-intelligence/interfaces.d.ts +2 -0
  369. package/dist/domains/defect-intelligence/prediction-history.d.ts +15 -1
  370. package/dist/domains/defect-intelligence/prediction-history.js +63 -7
  371. package/dist/domains/defect-intelligence/services/defect-predictor.d.ts +1 -0
  372. package/dist/domains/defect-intelligence/services/defect-predictor.js +33 -13
  373. package/dist/domains/learning-optimization/coordinator.js +17 -10
  374. package/dist/domains/learning-optimization/domain-ranking.d.ts +26 -0
  375. package/dist/domains/learning-optimization/domain-ranking.js +28 -0
  376. package/dist/domains/learning-optimization/interfaces.d.ts +5 -0
  377. package/dist/domains/learning-optimization/pattern-archive.d.ts +55 -8
  378. package/dist/domains/learning-optimization/pattern-archive.js +90 -17
  379. package/dist/domains/learning-optimization/pattern-consolidation.js +18 -2
  380. package/dist/domains/learning-optimization/pattern-merge.d.ts +26 -0
  381. package/dist/domains/learning-optimization/pattern-merge.js +127 -0
  382. package/dist/domains/learning-optimization/services/learning-coordinator.js +21 -35
  383. package/dist/domains/test-execution/coordinator.d.ts +3 -1
  384. package/dist/domains/test-execution/coordinator.js +13 -4
  385. package/dist/domains/test-execution/interfaces.d.ts +5 -0
  386. package/dist/domains/test-execution/plugin.js +2 -0
  387. package/dist/domains/test-execution/services/flaky-detector.d.ts +9 -1
  388. package/dist/domains/test-execution/services/flaky-detector.js +26 -8
  389. package/dist/domains/test-execution/services/retry-handler.d.ts +7 -1
  390. package/dist/domains/test-execution/services/retry-handler.js +44 -5
  391. package/dist/domains/test-execution/services/runner-test-cases.d.ts +2 -0
  392. package/dist/domains/test-execution/services/runner-test-cases.js +7 -3
  393. package/dist/domains/test-execution/services/test-executor.d.ts +5 -1
  394. package/dist/domains/test-execution/services/test-executor.js +85 -17
  395. package/dist/init/copilot-installer.d.ts +6 -0
  396. package/dist/init/copilot-installer.js +37 -17
  397. package/dist/init/init-wizard-steps.js +3 -1
  398. package/dist/init/phases/07-hooks.js +97 -10
  399. package/dist/init/platform-config-generator.d.ts +10 -0
  400. package/dist/init/platform-config-generator.js +26 -1
  401. package/dist/integrations/embeddings/cache/EmbeddingCache.js +1 -1
  402. package/dist/integrations/ruvector/brain-rvf-exporter.d.ts +16 -1
  403. package/dist/integrations/ruvector/brain-rvf-exporter.js +18 -32
  404. package/dist/integrations/ruvector/brain-rvf-richness.d.ts +75 -0
  405. package/dist/integrations/ruvector/brain-rvf-richness.js +127 -0
  406. package/dist/kernel/unified-memory-migration.js +1 -1
  407. package/dist/kernel/unified-memory.d.ts +8 -0
  408. package/dist/kernel/unified-memory.js +13 -0
  409. package/dist/learning/checkpoint-shrink-ack.d.ts +25 -0
  410. package/dist/learning/checkpoint-shrink-ack.js +57 -0
  411. package/dist/learning/dream/dream-engine.d.ts +44 -3
  412. package/dist/learning/dream/dream-engine.js +6 -2
  413. package/dist/learning/embedder-endpoint-client.d.ts +45 -0
  414. package/dist/learning/embedder-endpoint-client.js +98 -3
  415. package/dist/learning/embedder-identity-store.js +3 -1
  416. package/dist/learning/embedding-space-legacy-adoption.d.ts +53 -0
  417. package/dist/learning/embedding-space-legacy-adoption.js +115 -0
  418. package/dist/learning/embedding-space-registry.d.ts +90 -0
  419. package/dist/learning/embedding-space-registry.js +181 -0
  420. package/dist/learning/experience-capture.d.ts +3 -1
  421. package/dist/learning/experience-capture.js +15 -5
  422. package/dist/learning/experience-space-verification.d.ts +2 -0
  423. package/dist/learning/experience-space-verification.js +3 -2
  424. package/dist/learning/learning-retention.js +4 -0
  425. package/dist/learning/pattern-promotion.d.ts +7 -0
  426. package/dist/learning/pattern-promotion.js +64 -12
  427. package/dist/learning/real-embeddings.d.ts +3 -0
  428. package/dist/learning/real-embeddings.js +73 -11
  429. package/dist/learning/rvf-pattern-store.js +6 -1
  430. package/dist/mcp/bundle.js +558 -537
  431. package/dist/mcp/handlers/domain-handler-configs.d.ts +3 -0
  432. package/dist/mcp/handlers/domain-handler-configs.js +1 -0
  433. package/dist/mcp/handlers/heartbeat-handlers.d.ts +4 -2
  434. package/dist/mcp/protocol-server.js +1 -1
  435. package/dist/mcp/tools/learning-optimization/optimize.d.ts +6 -1
  436. package/dist/mcp/tools/learning-optimization/optimize.js +20 -11
  437. package/dist/planning/goap-planner.js +4 -0
  438. package/dist/planning/plan-executor.js +6 -2
  439. package/dist/shared/embeddings/index.d.ts +2 -2
  440. package/dist/shared/embeddings/index.js +1 -1
  441. package/dist/shared/embeddings/nomic-embedder.d.ts +8 -2
  442. package/dist/shared/embeddings/nomic-embedder.js +19 -11
  443. package/dist/shared/embeddings/ollama-client.d.ts +28 -2
  444. package/dist/shared/embeddings/ollama-client.js +84 -22
  445. package/dist/shared/embeddings/types.d.ts +15 -0
  446. package/dist/shared/embeddings/types.js +4 -0
  447. package/dist/shared/git/git-analyzer.d.ts +30 -11
  448. package/dist/shared/git/git-analyzer.js +95 -48
  449. package/dist/shared/io/confined-read.d.ts +32 -7
  450. package/dist/shared/io/confined-read.js +58 -25
  451. package/dist/shared/io/file-reader.js +4 -1
  452. package/dist/shared/pytest-junit-report.d.ts +93 -0
  453. package/dist/shared/pytest-junit-report.js +241 -0
  454. package/dist/shared/safe-db.d.ts +1 -1
  455. package/dist/shared/safe-db.js +20 -5
  456. package/dist/shared/sqlite-journal-mode.d.ts +39 -0
  457. package/dist/shared/sqlite-journal-mode.js +53 -0
  458. package/dist/shared/test-runner-project.d.ts +51 -1
  459. package/dist/shared/test-runner-project.js +140 -25
  460. package/dist/sync/claude-flow-bridge.js +1 -1
  461. package/dist/sync/readers/sqlite-reader.js +3 -4
  462. package/dist/sync/writers/sqlite-writer.js +1 -1
  463. package/dist/workers/interfaces.d.ts +2 -2
  464. package/dist/workers/quality-daemon/git-watcher.d.ts +8 -0
  465. package/dist/workers/quality-daemon/git-watcher.js +54 -12
  466. package/dist/workers/quality-daemon/index.js +1 -1
  467. package/dist/workers/quality-daemon/priority-queue.d.ts +2 -1
  468. package/dist/workers/workers/defect-predictor.d.ts +9 -4
  469. package/dist/workers/workers/defect-predictor.js +98 -37
  470. package/package.json +1 -1
  471. package/dist/cli/chunks/adapter-6CQ2PIP5.js +0 -2
  472. package/dist/cli/chunks/aqe-learning-engine-73RR52VS.js +0 -2
  473. package/dist/cli/chunks/base-SMCMMVGP.js +0 -2
  474. package/dist/cli/chunks/brain-handler-HQWZFO52.js +0 -95
  475. package/dist/cli/chunks/browser-workflow-A2MEZ66K.js +0 -2
  476. package/dist/cli/chunks/chunk-CGGUM2YJ.js +0 -3
  477. package/dist/cli/chunks/chunk-D6COXLYE.js +0 -8
  478. package/dist/cli/chunks/chunk-EGYE5UPQ.js +0 -2
  479. package/dist/cli/chunks/chunk-IUBJVHNB.js +0 -3
  480. package/dist/cli/chunks/chunk-KL7OKSU2.js +0 -4
  481. package/dist/cli/chunks/chunk-KPRCB5LT.js +0 -7
  482. package/dist/cli/chunks/chunk-LRSX2FJM.js +0 -2
  483. package/dist/cli/chunks/chunk-M4FRQ4TE.js +0 -12
  484. package/dist/cli/chunks/chunk-MAFQV4U4.js +0 -16
  485. package/dist/cli/chunks/chunk-NZU4ACBZ.js +0 -2
  486. package/dist/cli/chunks/chunk-RV74I3YO.js +0 -3
  487. package/dist/cli/chunks/chunk-SJ6Y4725.js +0 -5
  488. package/dist/cli/chunks/chunk-UE5ZOZR2.js +0 -2
  489. package/dist/cli/chunks/chunk-VSIKHWZ4.js +0 -29
  490. package/dist/cli/chunks/chunk-YAPLJR7K.js +0 -2
  491. package/dist/cli/chunks/client-MHQRTZM4.js +0 -2
  492. package/dist/cli/chunks/copilot-installer-IGJ6KGQY.js +0 -3
  493. package/dist/cli/chunks/core-handlers-UAK3LLJE.js +0 -2
  494. package/dist/cli/chunks/cross-domain-router-WTRZQPNQ.js +0 -2
  495. package/dist/cli/chunks/daemon-CAVZ7OFV.js +0 -18
  496. package/dist/cli/chunks/dream-EJY24JN6.js +0 -2
  497. package/dist/cli/chunks/embed-and-insert-pattern-COG4C7ZI.js +0 -3
  498. package/dist/cli/chunks/file-discovery-UZSFSS4V.js +0 -2
  499. package/dist/cli/chunks/heartbeat-scheduler-NVR356I7.js +0 -2
  500. package/dist/cli/chunks/hnsw-adapter-LFMPLUJU.js +0 -2
  501. package/dist/cli/chunks/hnsw-index-POCPMVJH.js +0 -2
  502. package/dist/cli/chunks/hybrid-backend-4STAO7CV.js +0 -2
  503. package/dist/cli/chunks/impact-analyzer-3VIIISBQ.js +0 -2
  504. package/dist/cli/chunks/init-wizard-PL6QN6RQ.js +0 -2
  505. package/dist/cli/chunks/kernel-CCDWT7KS.js +0 -2
  506. package/dist/cli/chunks/knowledge-graph-KFOMEN3H.js +0 -2
  507. package/dist/cli/chunks/llm-router-service-7NBE2EX6.js +0 -2
  508. package/dist/cli/chunks/load-test-UNZUWY3F.js +0 -2
  509. package/dist/cli/chunks/memory-backend-DFGKWA2Q.js +0 -2
  510. package/dist/cli/chunks/memory-handlers-MP426XRJ.js +0 -2
  511. package/dist/cli/chunks/pattern-null-store-SSVF5TE5.js +0 -2
  512. package/dist/cli/chunks/project-root-BEANNYWU.js +0 -2
  513. package/dist/cli/chunks/protocol-executor-FQVIHXZ7.js +0 -2
  514. package/dist/cli/chunks/qe-reasoning-bank-5TFYSE24.js +0 -2
  515. package/dist/cli/chunks/queen-coordinator-Y2OUL7IN.js +0 -2
  516. package/dist/cli/chunks/real-embeddings-OXLYU7JW.js +0 -2
  517. package/dist/cli/chunks/router-EP34O3KB.js +0 -2
  518. package/dist/cli/chunks/routing-feedback-FJCRKXNG.js +0 -2
  519. package/dist/cli/chunks/rvf-dual-writer-ILITJSFG.js +0 -2
  520. package/dist/cli/chunks/rvf-migration-adapter-XF6W4C2N.js +0 -2
  521. package/dist/cli/chunks/rvf-migration-coordinator-CMKG56AR.js +0 -2
  522. package/dist/cli/chunks/rvf-native-adapter-7YFW6S4Y.js +0 -2
  523. package/dist/cli/chunks/safe-db-TCAU4FUT.js +0 -2
  524. package/dist/cli/chunks/schedule-NB5KV435.js +0 -2
  525. package/dist/cli/chunks/scheduler-JKXGKVK6.js +0 -2
  526. package/dist/cli/chunks/sqlite-persistence-IXCNZRTW.js +0 -2
  527. package/dist/cli/chunks/sync-OSF7C2NL.js +0 -2
  528. package/dist/cli/chunks/test-SD457QJ6.js +0 -34
  529. package/dist/cli/chunks/test-runner-process-VKD65QQU.js +0 -2
  530. package/dist/cli/chunks/token-bootstrap-VUELSBOS.js +0 -2
  531. package/dist/cli/chunks/tree-sitter-wasm-parser-YAIPHRIL.js +0 -2
  532. package/dist/cli/chunks/unified-memory-GI76TXFV.js +0 -2
  533. package/dist/cli/chunks/unified-memory-hnsw-GXJ5BTZO.js +0 -2
  534. package/dist/cli/chunks/unified-persistence-OP7FDQPD.js +0 -2
  535. package/dist/cli/chunks/visual-security-GZ2MOKWB.js +0 -2
  536. package/dist/cli/chunks/witness-chain-P3XXXA62.js +0 -2
  537. package/dist/cli/chunks/witness-chain-repair-PUX2NFDL.js +0 -2
  538. package/dist/cli/chunks/workflow-orchestrator-P2APAJAA.js +0 -2
  539. package/dist/cli/chunks/wrappers-TWSKBTWD.js +0 -2
@@ -6,12 +6,15 @@ import { createHash } from 'node:crypto';
6
6
  import { ok, err } from '../../../shared/types/index.js';
7
7
  import { NomicEmbedder, EMBEDDING_CONFIG, } from '../../../shared/embeddings/index.js';
8
8
  import { toError } from '../../../shared/error-utils.js';
9
+ import { compareTextRelevance, textRelevance } from './text-relevance.js';
9
10
  /**
10
11
  * #1224: the message for a search over an empty index. "No results" is only
11
12
  * reported after searching an index that holds code.
12
13
  */
13
14
  export const NOTHING_INDEXED_FOR_SEARCH = 'No code is indexed for search yet, so the search was not run. ' +
14
15
  'Index the project first (MCP code_index, or `aqe code index <path>`), then search again.';
16
+ /** Highest score first; equal scores by text relevance (#1287). */
17
+ const byScoreThenRelevance = (a, b) => b.hit.score - a.hit.score || compareTextRelevance(a.relevance, b.relevance);
15
18
  /** Upper bound on indexed files one exact/fuzzy search reads. */
16
19
  const MAX_INDEXED_FILES_SCANNED = 100_000;
17
20
  const DEFAULT_CONFIG = {
@@ -60,17 +63,17 @@ export class SemanticAnalyzerService {
60
63
  ...this.config.nomicConfig,
61
64
  enableFallback: false,
62
65
  });
63
- // Check if Ollama is available
64
- const isAvailable = await nomicEmbedder.healthCheck();
65
- if (isAvailable) {
66
+ // #1229: Ollama lists the model under its own name (all-minilm:22m);
67
+ // the reason says whether Ollama is down or lacks the model.
68
+ const check = await nomicEmbedder.checkModel();
69
+ if (check.status === 'available') {
66
70
  this.embedder = nomicEmbedder;
67
71
  // Update dimension to match Nomic's output
68
72
  this.config.embeddingDimension =
69
73
  EMBEDDING_CONFIG.DIMENSIONS;
70
74
  }
71
75
  else {
72
- this.embedderUnavailableReason =
73
- `no embedding model available (Ollama model '${EMBEDDING_CONFIG.MODEL}' is not reachable)`;
76
+ this.embedderUnavailableReason = `no embedding model available (${check.reason})`;
74
77
  }
75
78
  }
76
79
  else {
@@ -276,7 +279,7 @@ export class SemanticAnalyzerService {
276
279
  }
277
280
  /** Identifies the model behind stored vectors, so vectors from another model are not compared. */
278
281
  embeddingModelId() {
279
- return this.embedder instanceof NomicEmbedder ? EMBEDDING_CONFIG.MODEL : 'injected-provider';
282
+ return this.embedder instanceof NomicEmbedder ? this.embedder.getModelId() : 'injected-provider';
280
283
  }
281
284
  isCurrentModelVector(metadata) {
282
285
  return metadata.embeddingModel === this.embeddingModelId();
@@ -366,8 +369,9 @@ export class SemanticAnalyzerService {
366
369
  * vector, so vector search cannot rank them. Match those by text, label the
367
370
  * hits 'lexical', and report the result as 'partial-vector' with the counts.
368
371
  * Cosine and text-match scores are not comparable, so vector hits come
369
- * first (by cosine), then lexical hits (by share of query words found); the
370
- * reason says how many text matches the limit left out.
372
+ * first (by cosine), then lexical hits (by share of query words found, ties
373
+ * by text relevance, #1287); the reason says how many text matches the
374
+ * limit left out.
371
375
  */
372
376
  async withVectorlessFiles(query, vectorHits, limit, scope, filters) {
373
377
  const model = this.embeddingModelId();
@@ -383,16 +387,19 @@ export class SemanticAnalyzerService {
383
387
  withoutVector++;
384
388
  if (vectorFiles.has(stored.file))
385
389
  return;
386
- const hit = this.fuzzyMatch(queryTokens, stored, scope, filters);
387
- if (hit)
388
- lexicalHits.push({ ...hit, matchType: 'lexical' });
390
+ const match = this.fuzzyMatch(query, queryTokens, stored, scope, filters);
391
+ if (match)
392
+ lexicalHits.push({ ...match, hit: { ...match.hit, matchType: 'lexical' } });
389
393
  });
390
394
  const coverage = { indexedFiles, filesWithVector: indexedFiles - withoutVector };
391
395
  if (withoutVector === 0) {
392
396
  return { results: vectorHits, mode: 'vector', coverage };
393
397
  }
394
398
  const byScore = (a, b) => b.score - a.score;
395
- const results = [...[...vectorHits].sort(byScore), ...lexicalHits.sort(byScore)].slice(0, limit);
399
+ const results = [
400
+ ...[...vectorHits].sort(byScore),
401
+ ...lexicalHits.sort(byScoreThenRelevance).map((match) => match.hit),
402
+ ].slice(0, limit);
396
403
  const droppedLexical = vectorHits.length + lexicalHits.length - results.length;
397
404
  return {
398
405
  results,
@@ -449,18 +456,22 @@ export class SemanticAnalyzerService {
449
456
  return results;
450
457
  }
451
458
  async fuzzySearch(query, limit, scope, filters) {
452
- const results = [];
459
+ const matches = [];
453
460
  const queryTokens = this.tokenize(query.toLowerCase());
454
461
  await this.forEachIndexed((stored) => {
455
- const hit = this.fuzzyMatch(queryTokens, stored, scope, filters);
456
- if (hit)
457
- results.push(hit);
462
+ const match = this.fuzzyMatch(query, queryTokens, stored, scope, filters);
463
+ if (match)
464
+ matches.push(match);
458
465
  });
459
- // Sort by score and limit
460
- return results.sort((a, b) => b.score - a.score).slice(0, limit);
466
+ // Sort by score, ties by relevance (#1287), and limit
467
+ return matches.sort(byScoreThenRelevance).slice(0, limit).map((match) => match.hit);
461
468
  }
462
- /** Token-overlap match of one indexed file, or null when it is filtered out or scores too low. */
463
- fuzzyMatch(queryTokens, stored, scope, filters) {
469
+ /**
470
+ * Token-overlap match of one indexed file, or null when it is filtered out or
471
+ * scores too low. The score is the share of query words found; `relevance`
472
+ * only orders equal scores (#1287).
473
+ */
474
+ fuzzyMatch(query, queryTokens, stored, scope, filters) {
464
475
  // Apply scope filter
465
476
  if (scope && scope.length > 0 && !scope.some((s) => stored.file.includes(s))) {
466
477
  return null;
@@ -475,11 +486,14 @@ export class SemanticAnalyzerService {
475
486
  if (score < this.config.minScore)
476
487
  return null;
477
488
  return {
478
- file: stored.file,
479
- snippet: this.extractSnippet(stored.content, 200),
480
- score,
481
- highlights: queryTokens.filter((t) => contentTokens.some((ct) => this.tokensMatch(t, ct))),
482
- metadata: stored.metadata,
489
+ hit: {
490
+ file: stored.file,
491
+ snippet: this.extractSnippet(stored.content, 200),
492
+ score,
493
+ highlights: queryTokens.filter((t) => contentTokens.some((ct) => this.tokensMatch(t, ct))),
494
+ metadata: stored.metadata,
495
+ },
496
+ relevance: textRelevance(query, stored.content),
483
497
  };
484
498
  }
485
499
  // ============================================================================
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Agentic QE v3 - Text match relevance (#1287)
3
+ *
4
+ * Text matching scores a file by the share of query words it contains, so
5
+ * every file containing all of them scores 1.0. This ranks those ties by how
6
+ * well the file matches the query, without changing the score itself.
7
+ */
8
+ /** How well one file's text matches a query. Higher fields rank first, in this order. */
9
+ export interface TextRelevance {
10
+ /**
11
+ * 2: an identifier is exactly the query words (`processOrder`, `process_order`
12
+ * for "process order"); 1: the query words appear next to each other
13
+ * (`process the order` does not, `process order` and `processOrderItems` do);
14
+ * 0: scattered, or the query is a single word.
15
+ */
16
+ adjacency: number;
17
+ /** Share of query words found as a whole word (`order`), not only inside one (`orders`, `reorder`). */
18
+ exactWords: number;
19
+ /** Number of words in the file that contain a query word. */
20
+ occurrences: number;
21
+ }
22
+ /** Splits an identifier into lowercase words: `processOrder`, `process_order`, `PROCESS_ORDER` → process, order. */
23
+ export declare function identifierWords(identifier: string): string[];
24
+ /**
25
+ * Relevance of `content` to `query`. Words are compared case-insensitively,
26
+ * and identifiers are split into words, so the query `process order` matches
27
+ * the identifier `processOrder` as adjacent whole words.
28
+ */
29
+ export declare function textRelevance(query: string, content: string): TextRelevance;
30
+ /** Sort comparator: more relevant first. */
31
+ export declare function compareTextRelevance(a: TextRelevance, b: TextRelevance): number;
32
+ //# sourceMappingURL=text-relevance.d.ts.map
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Agentic QE v3 - Text match relevance (#1287)
3
+ *
4
+ * Text matching scores a file by the share of query words it contains, so
5
+ * every file containing all of them scores 1.0. This ranks those ties by how
6
+ * well the file matches the query, without changing the score itself.
7
+ */
8
+ /** Splits an identifier into lowercase words: `processOrder`, `process_order`, `PROCESS_ORDER` → process, order. */
9
+ export function identifierWords(identifier) {
10
+ return identifier
11
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
12
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
13
+ .split(/[^A-Za-z0-9]+/)
14
+ .filter((word) => word.length > 0)
15
+ .map((word) => word.toLowerCase());
16
+ }
17
+ function identifiers(text) {
18
+ return text.split(/[^\w]+/).filter((token) => token.length > 0);
19
+ }
20
+ /** Whether `words` appears in `stream` as consecutive entries. */
21
+ function containsRun(stream, words) {
22
+ outer: for (let i = 0; i + words.length <= stream.length; i++) {
23
+ for (let j = 0; j < words.length; j++) {
24
+ if (stream[i + j] !== words[j])
25
+ continue outer;
26
+ }
27
+ return true;
28
+ }
29
+ return false;
30
+ }
31
+ /**
32
+ * Relevance of `content` to `query`. Words are compared case-insensitively,
33
+ * and identifiers are split into words, so the query `process order` matches
34
+ * the identifier `processOrder` as adjacent whole words.
35
+ */
36
+ export function textRelevance(query, content) {
37
+ const queryWords = identifiers(query).flatMap(identifierWords);
38
+ const contentIdentifiers = identifiers(content);
39
+ const lowerIdentifiers = contentIdentifiers.map((token) => token.toLowerCase());
40
+ const splitIdentifiers = contentIdentifiers.map(identifierWords);
41
+ const contentWords = new Set([...lowerIdentifiers, ...splitIdentifiers.flat()]);
42
+ const queryTokens = identifiers(query.toLowerCase());
43
+ let adjacency = 0;
44
+ if (queryWords.length > 1) {
45
+ const phrase = queryWords.join(' ');
46
+ if (splitIdentifiers.some((words) => words.join(' ') === phrase))
47
+ adjacency = 2;
48
+ else if (containsRun(splitIdentifiers.flat(), queryWords))
49
+ adjacency = 1;
50
+ }
51
+ return {
52
+ adjacency,
53
+ exactWords: queryWords.length === 0
54
+ ? 0
55
+ : queryWords.filter((word) => contentWords.has(word)).length / queryWords.length,
56
+ occurrences: lowerIdentifiers.filter((token) => queryTokens.some((qt) => token.includes(qt))).length,
57
+ };
58
+ }
59
+ /** Sort comparator: more relevant first. */
60
+ export function compareTextRelevance(a, b) {
61
+ return b.adjacency - a.adjacency || b.exactWords - a.exactWords || b.occurrences - a.occurrences;
62
+ }
63
+ //# sourceMappingURL=text-relevance.js.map
@@ -30,6 +30,8 @@ export interface PredictionResult {
30
30
  factors: string[];
31
31
  /** ADR-051: LLM-enhanced analysis when enabled */
32
32
  llmAnalysis?: LLMDefectAnalysis;
33
+ /** #1137: the run was stored, but pruning older runs failed. */
34
+ retention?: 'failed';
33
35
  }
34
36
  /**
35
37
  * ADR-051: LLM-enhanced defect analysis result
@@ -1,5 +1,7 @@
1
1
  import type { MemoryBackend } from '../../kernel/interfaces.js';
2
2
  export declare const MAX_PREDICTION_HISTORY = 32;
3
+ /** Longest `target` a prediction run may name (Linux PATH_MAX) (#1137). */
4
+ export declare const MAX_PREDICTION_TARGET_LENGTH = 4096;
3
5
  type RiskLevel = 'critical' | 'high' | 'medium' | 'low' | 'info';
4
6
  /** One file prediction as the defect-intelligence predictor recorded it. */
5
7
  export interface DomainFilePrediction {
@@ -12,16 +14,28 @@ export interface DomainFilePrediction {
12
14
  }[];
13
15
  recommendations: string[];
14
16
  }
17
+ /**
18
+ * #1137: the target a run for an explicit file list covers. A list too long
19
+ * to store as a target is identified by its digest.
20
+ */
21
+ export declare function predictionTargetForFiles(files: readonly string[]): string;
15
22
  /** A recorded prediction run, or `null` when the record is not a usable one. */
16
23
  export declare function parsePredictionRecord(raw: unknown, now: number): {
17
24
  id: string;
18
25
  timestamp: string;
19
26
  predictions: DomainFilePrediction[];
27
+ /** What the run covered; '' for runs recorded before #1137. */
28
+ target: string;
20
29
  predictionMethod?: 'static-code-indicators';
21
30
  estimated?: true;
22
31
  filesSkipped?: number;
23
32
  } | null;
24
- /** Keep 32 usable immutable UUID runs, preserving tied-latest ambiguity. */
33
+ /**
34
+ * Bound the stored prediction runs: delete runs older than 7 days and usable
35
+ * runs beyond the cap. A row this version cannot parse (stamped ahead by
36
+ * another host's clock, or a riskLevel from a newer release) is left to its
37
+ * TTL rather than deleted on this version's schema (#1137).
38
+ */
25
39
  export declare function prunePredictionHistory(memory: Pick<MemoryBackend, 'search' | 'get' | 'delete'>, modelNamespace?: string): Promise<void>;
26
40
  export {};
27
41
  //# sourceMappingURL=prediction-history.d.ts.map
@@ -1,4 +1,7 @@
1
+ import { createHash } from 'node:crypto';
1
2
  export const MAX_PREDICTION_HISTORY = 32;
3
+ /** Longest `target` a prediction run may name (Linux PATH_MAX) (#1137). */
4
+ export const MAX_PREDICTION_TARGET_LENGTH = 4096;
2
5
  const MAX_PREDICTION_AGE_MS = 7 * 24 * 60 * 60 * 1000;
3
6
  const NAMESPACE = 'defect-intelligence';
4
7
  const RISK_LEVELS = ['critical', 'high', 'medium', 'low', 'info'];
@@ -21,6 +24,16 @@ function parseFilePrediction(raw) {
21
24
  : [];
22
25
  return { file, probability, riskLevel: riskLevel, factors, recommendations };
23
26
  }
27
+ /**
28
+ * #1137: the target a run for an explicit file list covers. A list too long
29
+ * to store as a target is identified by its digest.
30
+ */
31
+ export function predictionTargetForFiles(files) {
32
+ const target = `files:${[...new Set(files)].sort().join(',')}`;
33
+ return target.length <= MAX_PREDICTION_TARGET_LENGTH
34
+ ? target
35
+ : `files-sha256:${createHash('sha256').update(target).digest('hex')}`;
36
+ }
24
37
  /** A recorded prediction run, or `null` when the record is not a usable one. */
25
38
  export function parsePredictionRecord(raw, now) {
26
39
  if (!isRecord(raw) || typeof raw.id !== 'string' || typeof raw.timestamp !== 'string')
@@ -28,6 +41,8 @@ export function parsePredictionRecord(raw, now) {
28
41
  const t = Date.parse(raw.timestamp);
29
42
  if (!Number.isFinite(t) || t > now + 60_000 || now - t > MAX_PREDICTION_AGE_MS)
30
43
  return null;
44
+ if (raw.target !== undefined && (typeof raw.target !== 'string' || raw.target.length > MAX_PREDICTION_TARGET_LENGTH))
45
+ return null;
31
46
  if (!Array.isArray(raw.predictions) || raw.predictions.length === 0)
32
47
  return null;
33
48
  const predictions = raw.predictions.map(parseFilePrediction);
@@ -35,6 +50,7 @@ export function parsePredictionRecord(raw, now) {
35
50
  return null;
36
51
  return {
37
52
  id: raw.id, timestamp: raw.timestamp, predictions: predictions,
53
+ target: raw.target ?? '',
38
54
  ...(raw.predictionMethod === 'static-code-indicators' ? {
39
55
  predictionMethod: 'static-code-indicators', estimated: true,
40
56
  filesSkipped: typeof raw.filesSkipped === 'number' && Number.isSafeInteger(raw.filesSkipped) && raw.filesSkipped >= 0
@@ -42,26 +58,66 @@ export function parsePredictionRecord(raw, now) {
42
58
  } : {}),
43
59
  };
44
60
  }
45
- /** Keep 32 usable immutable UUID runs, preserving tied-latest ambiguity. */
61
+ /** Milliseconds since the epoch the record claims, or `null` when it names no parseable time. */
62
+ function recordTime(raw) {
63
+ if (!isRecord(raw) || typeof raw.timestamp !== 'string')
64
+ return null;
65
+ const t = Date.parse(raw.timestamp);
66
+ return Number.isFinite(t) ? t : null;
67
+ }
68
+ /**
69
+ * #1137: the latest run of every target stays (with any run tied with it, so
70
+ * the worker still sees the ambiguity), most recently predicted targets first;
71
+ * the newest other runs fill what is left. Never more than the cap in total.
72
+ */
73
+ function selectRetained(newestFirst) {
74
+ const latestAt = new Map();
75
+ const latest = [];
76
+ for (const run of newestFirst) {
77
+ const at = latestAt.get(run.target);
78
+ if (at === undefined)
79
+ latestAt.set(run.target, run.timestamp);
80
+ if (at === undefined || at === run.timestamp)
81
+ latest.push(run);
82
+ }
83
+ const keep = new Set(latest.slice(0, MAX_PREDICTION_HISTORY).map((run) => run.key));
84
+ for (const run of newestFirst) {
85
+ if (keep.size >= MAX_PREDICTION_HISTORY)
86
+ break;
87
+ keep.add(run.key);
88
+ }
89
+ return keep;
90
+ }
91
+ /**
92
+ * Bound the stored prediction runs: delete runs older than 7 days and usable
93
+ * runs beyond the cap. A row this version cannot parse (stamped ahead by
94
+ * another host's clock, or a riskLevel from a newer release) is left to its
95
+ * TTL rather than deleted on this version's schema (#1137).
96
+ */
46
97
  export async function prunePredictionHistory(memory, modelNamespace = 'defect-intelligence:predictor') {
47
98
  const prefix = `${modelNamespace}:prediction:`;
48
99
  const keys = await memory.search(`${prefix}*`, Number.MAX_SAFE_INTEGER, { namespace: NAMESPACE });
49
100
  const now = Date.now();
50
101
  const records = [];
51
- const invalid = [];
102
+ const expired = [];
52
103
  for (const found of keys) {
53
104
  const key = found.startsWith(`${NAMESPACE}:${prefix}`) ? found.slice(NAMESPACE.length + 1) : found;
54
105
  if (!key.startsWith(prefix))
55
106
  continue;
56
- const parsed = parsePredictionRecord(await memory.get(key, { namespace: NAMESPACE }), now);
107
+ const raw = await memory.get(key, { namespace: NAMESPACE });
108
+ const t = recordTime(raw);
109
+ if (t !== null && now - t > MAX_PREDICTION_AGE_MS) {
110
+ expired.push(key);
111
+ continue;
112
+ }
113
+ const parsed = parsePredictionRecord(raw, now);
57
114
  if (parsed)
58
- records.push({ key, timestamp: Date.parse(parsed.timestamp), id: parsed.id });
59
- else
60
- invalid.push(key);
115
+ records.push({ key, timestamp: Date.parse(parsed.timestamp), id: parsed.id, target: parsed.target });
61
116
  }
62
117
  records.sort((a, b) => b.timestamp - a.timestamp || (a.id === b.id ? (a.key === b.key ? 0 : a.key > b.key ? -1 : 1) : a.id > b.id ? -1 : 1));
118
+ const keep = selectRetained(records);
63
119
  // Only observed immutable keys are candidates; concurrent new runs are untouched.
64
- for (const key of [...invalid, ...records.slice(MAX_PREDICTION_HISTORY).map(record => record.key)]) {
120
+ for (const key of [...expired, ...records.filter((record) => !keep.has(record.key)).map((record) => record.key)]) {
65
121
  await memory.delete(key, { namespace: NAMESPACE });
66
122
  }
67
123
  }
@@ -188,6 +188,7 @@ export declare class DefectPredictorService implements IDefectPredictorService {
188
188
  private generateTestRecommendations;
189
189
  private calculateModelConfidence;
190
190
  private calculateVariance;
191
+ /** Records the run; `false` when it was stored but older runs could not be pruned (#1137). */
191
192
  private storePrediction;
192
193
  private recalculateMetrics;
193
194
  }
@@ -6,14 +6,14 @@
6
6
  * ADR-051: LLM enhancement for AI-powered defect risk analysis
7
7
  */
8
8
  import { v4 as uuidv4 } from 'uuid';
9
- import { prunePredictionHistory } from '../prediction-history.js';
9
+ import { predictionTargetForFiles, prunePredictionHistory } from '../prediction-history.js';
10
10
  import { LoggerFactory } from '../../../logging/index.js';
11
11
  import { ok, err } from '../../../shared/types/index.js';
12
12
  import { GitAnalyzer } from '../../../shared/git/index.js';
13
13
  import { FileReader } from '../../../shared/io/index.js';
14
14
  import { findProjectRoot } from '../../../kernel/project-root.js';
15
15
  import { TypeScriptParser } from '../../../shared/parsers/index.js';
16
- import { toError } from '../../../shared/error-utils.js';
16
+ import { toError, toErrorMessage } 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
19
  import { measuredFileCoverage } from '../../quality-assessment/coverage-report-event.js';
@@ -55,8 +55,8 @@ const DEFAULT_FEATURES = [
55
55
  * ADR-051: Added LLM enhancement for AI-powered defect risk analysis
56
56
  */
57
57
  const logger = LoggerFactory.create('defect-intelligence/defect-predictor');
58
- const GIT_TIMEOUT_WARNING = 'Git history timed out for this file: change frequency, developer experience, code age and bug history ' +
59
- 'use their "no git data" defaults, so this prediction is incomplete.';
58
+ const GIT_TIMEOUT_WARNING = 'Git history timed out or was too large to read for this file: change frequency, developer experience, ' +
59
+ 'code age and bug history use their "no git data" defaults, so this prediction is incomplete.';
60
60
  export class DefectPredictorService {
61
61
  config;
62
62
  memory;
@@ -298,7 +298,7 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
298
298
  }
299
299
  }
300
300
  // Store prediction for potential feedback
301
- await this.storePrediction(predictions);
301
+ const retained = await this.storePrediction(predictions, files);
302
302
  // Update metrics
303
303
  this.modelMetrics.totalPredictions += predictions.length;
304
304
  this.modelMetrics.lastUpdated = new Date();
@@ -308,6 +308,7 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
308
308
  factors: Array.from(factors),
309
309
  // ADR-051: Include LLM analysis in result if available
310
310
  llmAnalysis: llmAnalysis ?? undefined,
311
+ ...(retained ? {} : { retention: 'failed' }),
311
312
  });
312
313
  }
313
314
  catch (error) {
@@ -477,13 +478,17 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
477
478
  codeAge: await this.getCodeAge(file),
478
479
  bugHistory: await this.getBugHistory(file),
479
480
  });
480
- // #1115: the git-based metrics of one file share one deadline.
481
- const metrics = this.gitAnalyzer.withFileDeadline
482
- ? await this.gitAnalyzer.withFileDeadline(file, measure)
483
- : await measure();
484
481
  // #1115: a git timeout left defaults in the git-based metrics; do not
485
- // cache them as this file's measured metrics.
486
- const gitTimedOut = this.gitAnalyzer.consumeTimeout?.(file) === true;
482
+ // cache them as this file's measured metrics. #1165: read the flag inside
483
+ // the deadline call, so another prediction on the same file cannot take it.
484
+ const measureOnce = async () => ({
485
+ metrics: await measure(),
486
+ gitTimedOut: this.gitAnalyzer.consumeTimeout?.(file) === true,
487
+ });
488
+ // #1115: the git-based metrics of one file share one deadline.
489
+ const { metrics, gitTimedOut } = this.gitAnalyzer.withFileDeadline
490
+ ? await this.gitAnalyzer.withFileDeadline(file, measureOnce)
491
+ : await measureOnce();
487
492
  if (!gitTimedOut) {
488
493
  await this.memory.set(`${this.config.modelNamespace}:file-metrics:${file}`, metrics, { namespace: 'defect-intelligence', ttl: 3600 } // 1 hour cache
489
494
  );
@@ -899,6 +904,11 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
899
904
  // More predictions generally mean better confidence
900
905
  if (predictions.length > 10)
901
906
  confidence *= 1.05;
907
+ // #1165: git defaults stand in for most features of a prediction whose
908
+ // git history timed out; such predictions halve their share of confidence.
909
+ const incomplete = predictions.filter((p) => p.warnings?.includes(GIT_TIMEOUT_WARNING)).length;
910
+ if (predictions.length > 0)
911
+ confidence *= 1 - incomplete / predictions.length / 2;
902
912
  return Math.min(1, Math.max(0, confidence));
903
913
  }
904
914
  calculateVariance(values) {
@@ -908,15 +918,25 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
908
918
  const squareDiffs = values.map((v) => Math.pow(v - mean, 2));
909
919
  return squareDiffs.reduce((a, b) => a + b, 0) / values.length;
910
920
  }
911
- async storePrediction(predictions) {
921
+ /** Records the run; `false` when it was stored but older runs could not be pruned (#1137). */
922
+ async storePrediction(predictions, files) {
912
923
  const predictionId = uuidv4();
913
924
  await this.memory.set(`${this.config.modelNamespace}:prediction:${predictionId}`, {
914
925
  id: predictionId,
926
+ target: predictionTargetForFiles(files),
915
927
  predictions,
916
928
  timestamp: new Date().toISOString(),
917
929
  }, { namespace: 'defect-intelligence', ttl: 86400 * 7 } // 7 days
918
930
  );
919
- await prunePredictionHistory(this.memory, this.config.modelNamespace);
931
+ try {
932
+ await prunePredictionHistory(this.memory, this.config.modelNamespace);
933
+ return true;
934
+ }
935
+ catch (error) {
936
+ // The run is stored; retention catches up on the next run or the TTL.
937
+ logger.warn('Defect prediction stored, but pruning older runs failed', { error: toErrorMessage(error) });
938
+ return false;
939
+ }
920
940
  }
921
941
  async recalculateMetrics(feedback) {
922
942
  // Simple online update of accuracy
@@ -5,6 +5,7 @@
5
5
  import { LoggerFactory } from '../../logging/index.js';
6
6
  import { readActivePatterns, LEARNING_NS } from './active-patterns.js';
7
7
  import { partitionByRewardSource } from './reward-source.js';
8
+ import { measuredSuccessRate, rankTopPerformingDomains } from './domain-ranking.js';
8
9
  import { searchAllKeys } from '../../shared/utils/namespaced-search.js';
9
10
  import { v4 as uuidv4 } from 'uuid';
10
11
  import { toError } from '../../shared/error-utils.js';
@@ -362,6 +363,7 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
362
363
  let knowledgeShared = 0;
363
364
  const domainsUpdated = [];
364
365
  let newPatternsCreated = 0;
366
+ const mergeFailures = [];
365
367
  let totalTransfers = 0;
366
368
  let successfulTransfers = 0;
367
369
  // Get all knowledge items
@@ -404,6 +406,12 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
404
406
  if (consolidateResult.success) {
405
407
  newPatternsCreated++;
406
408
  }
409
+ else {
410
+ // #1149: a merge failure is reported, never dropped.
411
+ const failure = { sourcePatternIds: group.map((p) => p.id), error: consolidateResult.error.message };
412
+ mergeFailures.push(failure);
413
+ logger.warn('Pattern merge failed during cross-domain sharing', failure);
414
+ }
407
415
  }
408
416
  }
409
417
  }
@@ -415,6 +423,7 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
415
423
  // #1121: with no transfer attempted there is no rate, not 100%.
416
424
  transferSuccessRate: totalTransfers > 0 ? successfulTransfers / totalTransfers : null,
417
425
  newPatternsCreated,
426
+ ...(mergeFailures.length > 0 ? { mergeFailures } : {}),
418
427
  };
419
428
  // Publish event
420
429
  if (this.config.publishEvents && knowledgeShared > 0) {
@@ -447,10 +456,14 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
447
456
  // Get experiences from last 24h
448
457
  const timeRange = TimeRange.lastNDays(1);
449
458
  let experiencesLast24h = 0;
459
+ const domainRates = [];
450
460
  for (const domain of ALL_DOMAINS) {
451
- const expResult = await this.getExperiencesForDomain(domain, timeRange);
461
+ // #1147: read through the learning service, which reads the
462
+ // learning-optimization namespace the experiences are stored in.
463
+ const expResult = await this.learningService.getExperiences(domain, timeRange);
452
464
  if (expResult.success) {
453
465
  experiencesLast24h += expResult.value.length;
466
+ domainRates.push({ domain, successRate: measuredSuccessRate(expResult.value) });
454
467
  }
455
468
  }
456
469
  // Get production health for trends
@@ -467,15 +480,9 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
467
480
  const overallLearningRate = patternStats && patternStats.totalPatterns > 0
468
481
  ? patternStats.avgSuccessRate * 0.6 + (patternStats.avgConfidence * 0.4)
469
482
  : null;
470
- // Determine top performing domains
471
- const topPerformingDomains = [];
472
- if (patternStats) {
473
- const domainScores = Object.entries(patternStats.byDomain)
474
- .filter(([_, count]) => count > 0)
475
- .map(([domain, count]) => ({ domain: domain, score: count }))
476
- .sort((a, b) => b.score - a.score);
477
- topPerformingDomains.push(...domainScores.slice(0, 3).map((d) => d.domain));
478
- }
483
+ // #1147: rank by measured success over the same 24h, not by pattern
484
+ // count; a domain with no measured outcome or at 0% is left out.
485
+ const { topPerformingDomains } = rankTopPerformingDomains(domainRates);
479
486
  const dashboard = {
480
487
  overallLearningRate,
481
488
  totalPatterns: patternStats?.totalPatterns || 0,
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Agentic QE v3 - Ranking domains by measured success (#1147)
3
+ *
4
+ * Pure: no reads or writes. Both learning dashboards (the MCP
5
+ * `qe/learning/optimize` tool and the domain coordinator) rank domains with
6
+ * this one rule:
7
+ * - a domain with no measured outcome has no rate and is left out;
8
+ * - a domain whose measured runs all failed (0%) is not top-performing;
9
+ * - the rest are ordered by measured success rate, highest first.
10
+ */
11
+ import type { DomainName } from '../../shared/types/index.js';
12
+ import type { Experience } from './interfaces.js';
13
+ export interface DomainSuccessRate {
14
+ readonly domain: DomainName;
15
+ /** Measured success rate, or null when the domain has no measured outcome. */
16
+ readonly successRate: number | null;
17
+ }
18
+ export interface TopPerformingDomains {
19
+ readonly topPerformingDomains: DomainName[];
20
+ /** Domains with at least one measured outcome (ranked or not). */
21
+ readonly measuredDomains: number;
22
+ }
23
+ /** Measured success rate of a domain's experiences; null when none is measured. */
24
+ export declare function measuredSuccessRate(experiences: readonly Experience[]): number | null;
25
+ export declare function rankTopPerformingDomains(rates: readonly DomainSuccessRate[], limit?: number): TopPerformingDomains;
26
+ //# sourceMappingURL=domain-ranking.d.ts.map
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Agentic QE v3 - Ranking domains by measured success (#1147)
3
+ *
4
+ * Pure: no reads or writes. Both learning dashboards (the MCP
5
+ * `qe/learning/optimize` tool and the domain coordinator) rank domains with
6
+ * this one rule:
7
+ * - a domain with no measured outcome has no rate and is left out;
8
+ * - a domain whose measured runs all failed (0%) is not top-performing;
9
+ * - the rest are ordered by measured success rate, highest first.
10
+ */
11
+ import { partitionByRewardSource } from './reward-source.js';
12
+ /** Measured success rate of a domain's experiences; null when none is measured. */
13
+ export function measuredSuccessRate(experiences) {
14
+ const { measured } = partitionByRewardSource(experiences);
15
+ if (measured.length === 0)
16
+ return null;
17
+ return measured.filter((e) => e.result.success).length / measured.length;
18
+ }
19
+ export function rankTopPerformingDomains(rates, limit = 3) {
20
+ const measured = rates.filter((r) => r.successRate !== null);
21
+ const topPerformingDomains = measured
22
+ .filter((r) => r.successRate > 0)
23
+ .sort((a, b) => b.successRate - a.successRate)
24
+ .slice(0, limit)
25
+ .map((r) => r.domain);
26
+ return { topPerformingDomains, measuredDomains: measured.length };
27
+ }
28
+ //# sourceMappingURL=domain-ranking.js.map
@@ -493,6 +493,11 @@ export interface CrossDomainSharingReport {
493
493
  /** Null when no transfer was attempted (#1121). */
494
494
  readonly transferSuccessRate: number | null;
495
495
  readonly newPatternsCreated: number;
496
+ /** Pattern merges that failed; absent when none did (#1149). */
497
+ readonly mergeFailures?: ReadonlyArray<{
498
+ readonly sourcePatternIds: string[];
499
+ readonly error: string;
500
+ }>;
496
501
  }
497
502
  export interface LearningDashboard {
498
503
  /** Null when pattern stats are unavailable or no measured pattern exists (#1121). */