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
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Agentic QE v3 - Archiving one learned pattern (#1071, #1106)
2
+ * Agentic QE v3 - Archiving one learned pattern (#1071, #1106, #1149)
3
3
  *
4
4
  * Archiving is a move inside the `learning-optimization` namespace:
5
5
  *
@@ -12,20 +12,67 @@
12
12
  * - Only the active key of the given pattern is deleted.
13
13
  * - The active record must still be that pattern (same id, and the same scores
14
14
  * and last use) when the archive runs, or nothing is written or deleted.
15
- * - The archive copy is read back before the active key is deleted, so a
16
- * failed or partial write never loses the pattern.
15
+ * - The archive copy is the stored active record. It is read back and compared
16
+ * in full before the active key is deleted, so a failed or partial write
17
+ * never loses the pattern (#1149).
18
+ * - Compare-and-delete: the active key is deleted only while the active record
19
+ * still equals the archive copy. An update made after the copy keeps the
20
+ * pattern active (#1149).
21
+ * - A copy that is not followed by a delete is removed again, so no archive
22
+ * row is left for a pattern that is still active (#1149).
23
+ * - Moves on one backend run one at a time (`withPatternMoveLock`), so two
24
+ * merges of the same patterns cannot both succeed (#1149). The lock is
25
+ * per process; the backend has no transactions to lock across processes.
17
26
  */
18
27
  import type { MemoryBackend } from '../../kernel/interfaces.js';
19
28
  import type { LearnedPattern } from './interfaces.js';
20
- export type ArchiveOutcome = 'archived' | 'missing' | 'failed';
29
+ /**
30
+ * Outcome of one move:
31
+ * - `archived`: copied, verified, and removed from the active set
32
+ * - `missing`: the active record is gone; nothing was written
33
+ * - `changed`: the active record changed since it was selected, or during
34
+ * the move; it stays active and no archive copy is kept
35
+ * - `failed`: the archive copy could not be verified; the pattern stays active
36
+ */
37
+ export type ArchiveOutcome = 'archived' | 'missing' | 'changed' | 'failed';
38
+ /**
39
+ * Outcome of removing the active key after a copy:
40
+ * - `removed`: the active record equalled the archive copy and was deleted
41
+ * - `missing`: the active record was already gone
42
+ * - `changed`: the active record changed after the copy; left active
43
+ * - `failed`: the archive copy is gone or no longer verifies; left active
44
+ */
45
+ export type RemoveOutcome = 'removed' | 'missing' | 'changed' | 'failed';
46
+ /**
47
+ * JSON with object keys sorted, so two records compare equal exactly when
48
+ * they store the same values. Dates serialize as ISO strings, as they do in
49
+ * the backend.
50
+ */
51
+ export declare function canonicalJson(value: unknown): string;
21
52
  /**
22
53
  * Write the archive copy of one pattern and read it back, without touching
23
- * the active key. `copied` means the copy is verified and the active record
24
- * is still the given pattern.
54
+ * the active key. `copied` means the copy is verified in full and the active
55
+ * record is still the given pattern. On `failed` the unverified copy has been
56
+ * removed again.
25
57
  */
26
58
  export declare function copyPatternToArchive(memory: MemoryBackend, pattern: LearnedPattern, archivedAt?: Date): Promise<'copied' | Exclude<ArchiveOutcome, 'archived'>>;
27
- /** Remove the active key of a pattern whose archive copy was verified. */
28
- export declare function removeArchivedPattern(memory: MemoryBackend, pattern: LearnedPattern): Promise<void>;
59
+ /**
60
+ * Compare-and-delete the active key of a pattern whose archive copy was
61
+ * verified: delete only while the active record still equals the copy.
62
+ */
63
+ export declare function removeArchivedPattern(memory: MemoryBackend, pattern: LearnedPattern): Promise<RemoveOutcome>;
64
+ /**
65
+ * Remove the archive copy of a pattern that is still active, after a move
66
+ * that did not complete. The copy is kept when the active record is gone, so
67
+ * a pattern is never left without either record.
68
+ */
69
+ export declare function discardArchiveCopy(memory: MemoryBackend, pattern: LearnedPattern): Promise<boolean>;
29
70
  /** Move one pattern to its archive key in the learning namespace. */
30
71
  export declare function archiveSelectedPattern(memory: MemoryBackend, pattern: LearnedPattern, archivedAt?: Date): Promise<ArchiveOutcome>;
72
+ /**
73
+ * Run `fn` after every earlier pattern move on the same backend has settled.
74
+ * Not re-entrant: `fn` must not call `withPatternMoveLock` (or
75
+ * `archiveSelectedPattern`) on the same backend.
76
+ */
77
+ export declare function withPatternMoveLock<T>(memory: MemoryBackend, fn: () => Promise<T>): Promise<T>;
31
78
  //# sourceMappingURL=pattern-archive.d.ts.map
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Agentic QE v3 - Archiving one learned pattern (#1071, #1106)
2
+ * Agentic QE v3 - Archiving one learned pattern (#1071, #1106, #1149)
3
3
  *
4
4
  * Archiving is a move inside the `learning-optimization` namespace:
5
5
  *
@@ -12,38 +12,111 @@
12
12
  * - Only the active key of the given pattern is deleted.
13
13
  * - The active record must still be that pattern (same id, and the same scores
14
14
  * and last use) when the archive runs, or nothing is written or deleted.
15
- * - The archive copy is read back before the active key is deleted, so a
16
- * failed or partial write never loses the pattern.
15
+ * - The archive copy is the stored active record. It is read back and compared
16
+ * in full before the active key is deleted, so a failed or partial write
17
+ * never loses the pattern (#1149).
18
+ * - Compare-and-delete: the active key is deleted only while the active record
19
+ * still equals the archive copy. An update made after the copy keeps the
20
+ * pattern active (#1149).
21
+ * - A copy that is not followed by a delete is removed again, so no archive
22
+ * row is left for a pattern that is still active (#1149).
23
+ * - Moves on one backend run one at a time (`withPatternMoveLock`), so two
24
+ * merges of the same patterns cannot both succeed (#1149). The lock is
25
+ * per process; the backend has no transactions to lock across processes.
17
26
  */
18
27
  import { LEARNING_NS, LEARNING_PATTERN_KEY_PREFIX, isActivePatternKey } from './active-patterns.js';
28
+ const activeKeyOf = (id) => `${LEARNING_PATTERN_KEY_PREFIX}${id}`;
29
+ const archiveKeyOf = (id) => `${LEARNING_PATTERN_KEY_PREFIX}archived:${id}`;
30
+ /**
31
+ * JSON with object keys sorted, so two records compare equal exactly when
32
+ * they store the same values. Dates serialize as ISO strings, as they do in
33
+ * the backend.
34
+ */
35
+ export function canonicalJson(value) {
36
+ return JSON.stringify(value, (_key, v) => v && typeof v === 'object' && !Array.isArray(v)
37
+ ? Object.fromEntries(Object.entries(v).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)))
38
+ : v);
39
+ }
40
+ /** The archive copy without its `archivedAt` stamp, i.e. the record that was archived. */
41
+ function archivedRecord(copy) {
42
+ const { archivedAt: _archivedAt, ...record } = copy;
43
+ return record;
44
+ }
19
45
  /**
20
46
  * Write the archive copy of one pattern and read it back, without touching
21
- * the active key. `copied` means the copy is verified and the active record
22
- * is still the given pattern.
47
+ * the active key. `copied` means the copy is verified in full and the active
48
+ * record is still the given pattern. On `failed` the unverified copy has been
49
+ * removed again.
23
50
  */
24
51
  export async function copyPatternToArchive(memory, pattern, archivedAt = new Date()) {
25
- const activeKey = `${LEARNING_PATTERN_KEY_PREFIX}${pattern.id}`;
52
+ const activeKey = activeKeyOf(pattern.id);
26
53
  if (!isActivePatternKey(activeKey))
27
54
  return 'missing';
28
55
  const current = await memory.get(activeKey, LEARNING_NS);
29
- if (!current || current.id !== pattern.id || changedSinceSelection(current, pattern))
56
+ if (!current || current.id !== pattern.id)
30
57
  return 'missing';
31
- const archiveKey = `${LEARNING_PATTERN_KEY_PREFIX}archived:${pattern.id}`;
32
- await memory.set(archiveKey, { ...pattern, archivedAt }, { ...LEARNING_NS, persist: true });
58
+ if (changedSinceSelection(current, pattern))
59
+ return 'changed';
60
+ const archiveKey = archiveKeyOf(pattern.id);
61
+ const expected = { ...current, archivedAt };
62
+ await memory.set(archiveKey, expected, { ...LEARNING_NS, persist: true });
33
63
  const copy = await memory.get(archiveKey, LEARNING_NS);
34
- return copy && copy.id === pattern.id ? 'copied' : 'failed';
64
+ if (copy && canonicalJson(copy) === canonicalJson(expected))
65
+ return 'copied';
66
+ await discardArchiveCopy(memory, pattern);
67
+ return 'failed';
35
68
  }
36
- /** Remove the active key of a pattern whose archive copy was verified. */
69
+ /**
70
+ * Compare-and-delete the active key of a pattern whose archive copy was
71
+ * verified: delete only while the active record still equals the copy.
72
+ */
37
73
  export async function removeArchivedPattern(memory, pattern) {
38
- await memory.delete(`${LEARNING_PATTERN_KEY_PREFIX}${pattern.id}`, LEARNING_NS);
74
+ const activeKey = activeKeyOf(pattern.id);
75
+ const active = await memory.get(activeKey, LEARNING_NS);
76
+ if (!active)
77
+ return 'missing';
78
+ const copy = await memory.get(archiveKeyOf(pattern.id), LEARNING_NS);
79
+ if (!copy || typeof copy !== 'object' || copy.id !== pattern.id)
80
+ return 'failed';
81
+ if (canonicalJson(active) !== canonicalJson(archivedRecord(copy)))
82
+ return 'changed';
83
+ await memory.delete(activeKey, LEARNING_NS);
84
+ return 'removed';
85
+ }
86
+ /**
87
+ * Remove the archive copy of a pattern that is still active, after a move
88
+ * that did not complete. The copy is kept when the active record is gone, so
89
+ * a pattern is never left without either record.
90
+ */
91
+ export async function discardArchiveCopy(memory, pattern) {
92
+ if (!(await memory.get(activeKeyOf(pattern.id), LEARNING_NS)))
93
+ return false;
94
+ return memory.delete(archiveKeyOf(pattern.id), LEARNING_NS);
39
95
  }
40
96
  /** Move one pattern to its archive key in the learning namespace. */
41
97
  export async function archiveSelectedPattern(memory, pattern, archivedAt = new Date()) {
42
- const copied = await copyPatternToArchive(memory, pattern, archivedAt);
43
- if (copied !== 'copied')
44
- return copied;
45
- await removeArchivedPattern(memory, pattern);
46
- return 'archived';
98
+ return withPatternMoveLock(memory, async () => {
99
+ const copied = await copyPatternToArchive(memory, pattern, archivedAt);
100
+ if (copied !== 'copied')
101
+ return copied;
102
+ const removed = await removeArchivedPattern(memory, pattern);
103
+ if (removed === 'removed')
104
+ return 'archived';
105
+ await discardArchiveCopy(memory, pattern);
106
+ return removed;
107
+ });
108
+ }
109
+ const moveQueues = new WeakMap();
110
+ /**
111
+ * Run `fn` after every earlier pattern move on the same backend has settled.
112
+ * Not re-entrant: `fn` must not call `withPatternMoveLock` (or
113
+ * `archiveSelectedPattern`) on the same backend.
114
+ */
115
+ export function withPatternMoveLock(memory, fn) {
116
+ const previous = moveQueues.get(memory) ?? Promise.resolve();
117
+ const run = previous.then(fn, fn);
118
+ moveQueues.set(memory, run.then(() => undefined, () => undefined));
119
+ return run;
47
120
  }
48
121
  /** True when the stored record's scores or last use differ from the selected snapshot. */
49
122
  function changedSinceSelection(current, selected) {
@@ -6,12 +6,27 @@
6
6
  * to predict the merged pattern, so a dry run selects the same trims as a
7
7
  * real run.
8
8
  */
9
- import { isMeasuredPattern } from './reward-source.js';
9
+ import { patternEvidenceOf } from './reward-source.js';
10
10
  /** Usage-weighted mean of one score (equal weights when nothing was used). */
11
11
  function usageWeighted(patterns, score) {
12
12
  const totalUsage = patterns.reduce((sum, p) => sum + p.usageCount, 0);
13
13
  return patterns.reduce((sum, p) => sum + score(p) * (totalUsage > 0 ? p.usageCount / totalUsage : 1 / patterns.length), 0);
14
14
  }
15
+ /**
16
+ * #1147: a merge keeps the most conservative evidence of its sources:
17
+ * `assigned` if any source is, else `pre-1120` if any source is, else
18
+ * `measured`. `pre-1120` has no tag of its own; the merge is left untagged,
19
+ * which `patternEvidenceOf` reads as `pre-1120` (the kept template is a
20
+ * source's, so it is not read as assigned unless a source was).
21
+ */
22
+ function mergedEvidence(patterns) {
23
+ const evidence = new Set(patterns.map(patternEvidenceOf));
24
+ if (evidence.has('assigned'))
25
+ return 'assigned';
26
+ if (evidence.has('pre-1120'))
27
+ return 'pre-1120';
28
+ return 'measured';
29
+ }
15
30
  /** Merge similar patterns: best template, combined contexts, weighted scores. */
16
31
  export function buildConsolidatedPattern(patterns, id, now = new Date()) {
17
32
  const bestPattern = patterns.reduce((best, current) => current.successRate > best.successRate ? current : best);
@@ -22,6 +37,7 @@ export function buildConsolidatedPattern(patterns, id, now = new Date()) {
22
37
  codeContext: bestPattern.context.codeContext,
23
38
  tags: [...new Set(patterns.flatMap((p) => p.context.tags))],
24
39
  };
40
+ const evidence = mergedEvidence(patterns);
25
41
  return {
26
42
  id,
27
43
  type: bestPattern.type,
@@ -35,7 +51,7 @@ export function buildConsolidatedPattern(patterns, id, now = new Date()) {
35
51
  template: bestPattern.template,
36
52
  createdAt: now,
37
53
  lastUsedAt: now,
38
- rewardSource: patterns.every(isMeasuredPattern) ? 'measured' : 'assigned',
54
+ ...(evidence === 'pre-1120' ? {} : { rewardSource: evidence }),
39
55
  };
40
56
  }
41
57
  //# sourceMappingURL=pattern-consolidation.js.map
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Agentic QE v3 - Committing one pattern merge (#1106, #1149)
3
+ *
4
+ * `LearningCoordinatorService.consolidatePatterns` builds the consolidated
5
+ * pattern; this module moves the sources out of the active set:
6
+ *
7
+ * 1. Every source pattern's archive copy is written and verified.
8
+ * 2. The consolidated pattern is stored and read back in full.
9
+ * 3. The sources are removed one by one with compare-and-delete.
10
+ *
11
+ * A failure in steps 1-2, or before the first source is removed, rolls the
12
+ * merge back: the consolidated pattern and the archive copies are deleted and
13
+ * every source stays active. A failure after a source was removed keeps the
14
+ * consolidated pattern (it now holds that source's data) and reports each
15
+ * source's real state. Callers run this under `withPatternMoveLock`.
16
+ */
17
+ import type { MemoryBackend } from '../../kernel/interfaces.js';
18
+ import { type Result } from '../../shared/types/index.js';
19
+ import type { LearnedPattern } from './interfaces.js';
20
+ /**
21
+ * Archive `sources`, store `consolidated` with `store`, then remove the
22
+ * sources. Returns the consolidated pattern only when every source left the
23
+ * active set.
24
+ */
25
+ export declare function commitPatternMerge(memory: MemoryBackend, sources: readonly LearnedPattern[], consolidated: LearnedPattern, store: (pattern: LearnedPattern) => Promise<void>, archivedAt?: Date): Promise<Result<LearnedPattern>>;
26
+ //# sourceMappingURL=pattern-merge.d.ts.map
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Agentic QE v3 - Committing one pattern merge (#1106, #1149)
3
+ *
4
+ * `LearningCoordinatorService.consolidatePatterns` builds the consolidated
5
+ * pattern; this module moves the sources out of the active set:
6
+ *
7
+ * 1. Every source pattern's archive copy is written and verified.
8
+ * 2. The consolidated pattern is stored and read back in full.
9
+ * 3. The sources are removed one by one with compare-and-delete.
10
+ *
11
+ * A failure in steps 1-2, or before the first source is removed, rolls the
12
+ * merge back: the consolidated pattern and the archive copies are deleted and
13
+ * every source stays active. A failure after a source was removed keeps the
14
+ * consolidated pattern (it now holds that source's data) and reports each
15
+ * source's real state. Callers run this under `withPatternMoveLock`.
16
+ */
17
+ import { err, ok } from '../../shared/types/index.js';
18
+ import { toError } from '../../shared/error-utils.js';
19
+ import { LEARNING_NS, LEARNING_PATTERN_KEY_PREFIX } from './active-patterns.js';
20
+ import { canonicalJson, copyPatternToArchive, discardArchiveCopy, removeArchivedPattern, } from './pattern-archive.js';
21
+ const LEFT_ACTIVE = 'nothing was merged and every source pattern was left active';
22
+ const REMOVE_REASONS = {
23
+ changed: 'changed after its archive copy',
24
+ failed: 'archive copy no longer verifies',
25
+ };
26
+ /**
27
+ * Archive `sources`, store `consolidated` with `store`, then remove the
28
+ * sources. Returns the consolidated pattern only when every source left the
29
+ * active set.
30
+ */
31
+ export async function commitPatternMerge(memory, sources, consolidated, store, archivedAt = new Date()) {
32
+ const copied = [];
33
+ let storeAttempted = false;
34
+ const rollBack = async (reason) => {
35
+ const problems = await undoMerge(memory, copied, storeAttempted ? consolidated : undefined);
36
+ return err(new Error(`${reason}; ${LEFT_ACTIVE}${problems.length ? ` (rollback incomplete: ${problems.join('; ')})` : ''}`));
37
+ };
38
+ try {
39
+ let notCopied = 0;
40
+ for (const source of sources) {
41
+ if ((await copyPatternToArchive(memory, source, archivedAt)) === 'copied')
42
+ copied.push(source);
43
+ else
44
+ notCopied++;
45
+ }
46
+ if (notCopied > 0) {
47
+ return rollBack(`${notCopied} of ${sources.length} source patterns could not be archived (archive copy not verified)`);
48
+ }
49
+ storeAttempted = true;
50
+ await store(consolidated);
51
+ const stored = await memory.get(`${LEARNING_PATTERN_KEY_PREFIX}${consolidated.id}`, LEARNING_NS);
52
+ if (!stored || canonicalJson(stored) !== canonicalJson(consolidated)) {
53
+ return rollBack('Consolidated pattern could not be read back');
54
+ }
55
+ }
56
+ catch (error) {
57
+ return rollBack(`Merge failed before any source pattern was removed: ${toError(error).message}`);
58
+ }
59
+ const removed = [];
60
+ for (let i = 0; i < sources.length; i++) {
61
+ let reason;
62
+ try {
63
+ const outcome = await removeArchivedPattern(memory, sources[i]);
64
+ if (outcome === 'removed' || outcome === 'missing') {
65
+ removed.push(outcome === 'missing' ? `${sources[i].id} (already gone)` : sources[i].id);
66
+ continue;
67
+ }
68
+ reason = REMOVE_REASONS[outcome];
69
+ }
70
+ catch (error) {
71
+ // A delete can fail after it took effect: report what is stored.
72
+ if (await isGone(memory, sources[i])) {
73
+ removed.push(sources[i].id);
74
+ continue;
75
+ }
76
+ reason = `delete failed: ${toError(error).message}`;
77
+ }
78
+ if (removed.length === 0)
79
+ return rollBack(`Source pattern ${sources[i].id} was not removed (${reason})`);
80
+ const leftActive = sources.slice(i);
81
+ const problems = [];
82
+ for (const source of leftActive) {
83
+ try {
84
+ await discardArchiveCopy(memory, source);
85
+ }
86
+ catch (error) {
87
+ problems.push(`archive copy of ${source.id} not removed: ${toError(error).message}`);
88
+ }
89
+ }
90
+ const states = leftActive.map((s, j) => `${s.id} (${j === 0 ? reason : 'not attempted'})`);
91
+ return err(new Error(`Merge partially applied: consolidated pattern ${consolidated.id} is active; ` +
92
+ `removed: ${removed.join(', ')}; left active: ${states.join(', ')}` +
93
+ (problems.length ? `; ${problems.join('; ')}` : '')));
94
+ }
95
+ return ok(consolidated);
96
+ }
97
+ /** True only when the source's active key is confirmed absent. */
98
+ async function isGone(memory, source) {
99
+ try {
100
+ return !(await memory.get(`${LEARNING_PATTERN_KEY_PREFIX}${source.id}`, LEARNING_NS));
101
+ }
102
+ catch {
103
+ return false;
104
+ }
105
+ }
106
+ /** Delete the consolidated pattern and the archive copies of sources that are still active. */
107
+ async function undoMerge(memory, copied, consolidated) {
108
+ const problems = [];
109
+ if (consolidated) {
110
+ try {
111
+ await memory.delete(`${LEARNING_PATTERN_KEY_PREFIX}${consolidated.id}`, LEARNING_NS);
112
+ }
113
+ catch (error) {
114
+ problems.push(`consolidated pattern ${consolidated.id} not removed: ${toError(error).message}`);
115
+ }
116
+ }
117
+ for (const source of copied) {
118
+ try {
119
+ await discardArchiveCopy(memory, source);
120
+ }
121
+ catch (error) {
122
+ problems.push(`archive copy of ${source.id} not removed: ${toError(error).message}`);
123
+ }
124
+ }
125
+ return problems;
126
+ }
127
+ //# sourceMappingURL=pattern-merge.js.map
@@ -9,7 +9,8 @@ import { rehydrateDates } from '../../../shared/utils/kv-date-rehydrate.js';
9
9
  import { toError } from '../../../shared/error-utils.js';
10
10
  import { readActivePatterns } from '../active-patterns.js';
11
11
  import { isMeasuredPattern, partitionByRewardSource, patternEvidenceOf } from '../reward-source.js';
12
- import { copyPatternToArchive, removeArchivedPattern } from '../pattern-archive.js';
12
+ import { withPatternMoveLock } from '../pattern-archive.js';
13
+ import { commitPatternMerge } from '../pattern-merge.js';
13
14
  import { buildConsolidatedPattern } from '../pattern-consolidation.js';
14
15
  import { createQEFlashAttention, } from '../../../integrations/ruvector/wrappers.js';
15
16
  import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
@@ -346,41 +347,26 @@ Provide:
346
347
  if (patternIds.length < 2) {
347
348
  return err(new Error('Need at least 2 patterns to consolidate'));
348
349
  }
349
- const patterns = [];
350
- for (const id of patternIds) {
351
- const pattern = await this.memory.get(`learning:pattern:${id}`, LEARNING_NS);
352
- if (pattern) {
353
- patterns.push(pattern);
350
+ // #1149: one move at a time per backend. A second merge of the same ids
351
+ // reads its sources after the first has removed them, and stops.
352
+ return await withPatternMoveLock(this.memory, async () => {
353
+ const patterns = [];
354
+ for (const id of patternIds) {
355
+ const pattern = await this.memory.get(`learning:pattern:${id}`, LEARNING_NS);
356
+ if (pattern) {
357
+ patterns.push(pattern);
358
+ }
354
359
  }
355
- }
356
- if (patterns.length < 2) {
357
- return err(new Error('Not enough valid patterns found'));
358
- }
359
- // Merge patterns - take best template, combine contexts
360
- const consolidatedPattern = buildConsolidatedPattern(patterns, uuidv4());
361
- // #1106: all or nothing. Every source pattern's archive copy is written
362
- // and read back first; then the consolidated pattern is stored and read
363
- // back; only then are the source patterns removed from the active set.
364
- // If any step fails, no source pattern is deleted.
365
- const archivedAt = new Date();
366
- let notCopied = 0;
367
- for (const pattern of patterns) {
368
- if (await copyPatternToArchive(this.memory, pattern, archivedAt) !== 'copied')
369
- notCopied++;
370
- }
371
- if (notCopied > 0) {
372
- return err(new Error(`${notCopied} of ${patterns.length} source patterns could not be archived (archive copy not verified); ` +
373
- 'nothing was merged and every source pattern was left active'));
374
- }
375
- await this.storePattern(consolidatedPattern);
376
- const stored = await this.memory.get(`learning:pattern:${consolidatedPattern.id}`, LEARNING_NS);
377
- if (!stored || stored.id !== consolidatedPattern.id) {
378
- return err(new Error('Consolidated pattern could not be read back; nothing was merged and every source pattern was left active'));
379
- }
380
- for (const pattern of patterns) {
381
- await removeArchivedPattern(this.memory, pattern);
382
- }
383
- return ok(consolidatedPattern);
360
+ if (patterns.length < 2) {
361
+ return err(new Error('Not enough valid patterns found'));
362
+ }
363
+ // Merge patterns - take best template, combine contexts
364
+ const consolidatedPattern = buildConsolidatedPattern(patterns, uuidv4());
365
+ // #1106/#1149: every source is archived and verified, then the
366
+ // consolidated pattern is stored and verified, then the sources are
367
+ // removed with compare-and-delete; failures roll back (pattern-merge.ts).
368
+ return commitPatternMerge(this.memory, patterns, consolidatedPattern, (p) => this.storePattern(p));
369
+ });
384
370
  }
385
371
  catch (error) {
386
372
  return err(toError(error));
@@ -131,7 +131,9 @@ export declare class TestExecutionCoordinator extends BaseDomainCoordinator<Test
131
131
  */
132
132
  private retryFailures;
133
133
  /**
134
- * Detect test framework from file patterns and project configuration
134
+ * Fallback framework from file names. With no explicit framework, each
135
+ * runner project's own config still decides between jest and vitest (#1272),
136
+ * and Python files always run with pytest (#1248).
135
137
  */
136
138
  private detectFramework;
137
139
  /**
@@ -16,6 +16,7 @@ import { createDomainFinding, } from '../../coordination/consensus/domain-findin
16
16
  // CQ-002: Base domain coordinator
17
17
  import { BaseDomainCoordinator, } from '../base-domain-coordinator.js';
18
18
  import { toError } from '../../shared/error-utils.js';
19
+ import { isPythonTestFile } from '../../shared/pytest-junit-report.js';
19
20
  import { createMinCutTestOptimizer, } from './services/mincut-test-optimizer.js';
20
21
  // ============================================================================
21
22
  // Coordinator Configuration
@@ -146,6 +147,8 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
146
147
  });
147
148
  }
148
149
  const framework = request.framework ?? this.detectFramework(testsToRun);
150
+ // #1272: without an explicit framework, each runner project's config decides.
151
+ const frameworkFromConfig = request.framework === undefined;
149
152
  const workers = request.workers ?? Math.min(4, Math.max(1, testsToRun.length));
150
153
  // Batched runners own internal parallelism, so the timeout applies to the
151
154
  // whole discovered suite rather than one file.
@@ -157,6 +160,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
157
160
  return this.executeParallel({
158
161
  testFiles: testsToRun,
159
162
  framework,
163
+ frameworkFromConfig,
160
164
  workers,
161
165
  timeout,
162
166
  retryCount: request.retryCount,
@@ -167,6 +171,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
167
171
  return this.execute({
168
172
  testFiles: testsToRun,
169
173
  framework,
174
+ frameworkFromConfig,
170
175
  timeout,
171
176
  retryCount: request.retryCount,
172
177
  projectRoot: request.projectRoot,
@@ -198,9 +203,13 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
198
203
  await this.executor.recordFinalOutcome(run, testFiles);
199
204
  }
200
205
  /**
201
- * Detect test framework from file patterns and project configuration
206
+ * Fallback framework from file names. With no explicit framework, each
207
+ * runner project's own config still decides between jest and vitest (#1272),
208
+ * and Python files always run with pytest (#1248).
202
209
  */
203
210
  detectFramework(testFiles) {
211
+ if (testFiles.every(isPythonTestFile))
212
+ return 'pytest';
204
213
  // Check file patterns for common framework indicators
205
214
  const hasVitestPattern = testFiles.some(f => f.includes('.test.') || f.includes('.spec.'));
206
215
  const hasMochaPattern = testFiles.some(f => f.includes('_test.') || f.includes('.mocha.'));
@@ -209,7 +218,6 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
209
218
  return 'vitest';
210
219
  if (hasMochaPattern)
211
220
  return 'mocha';
212
- // Could add project config detection here (vitest.config.ts, jest.config.js, etc.)
213
221
  return 'vitest';
214
222
  }
215
223
  /**
@@ -299,7 +307,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
299
307
  if (this.config.infraHealing && result.value.failedTests.length > 0) {
300
308
  this.feedInfraHealingFromFailures(result.value.failedTests);
301
309
  // ADR-057: Attempt automatic recovery and re-run affected tests
302
- const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot });
310
+ const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot, frameworkFromConfig: request.frameworkFromConfig });
303
311
  if (rerunResult)
304
312
  return rerunResult;
305
313
  }
@@ -410,7 +418,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
410
418
  if (this.config.infraHealing && result.value.failedTests.length > 0) {
411
419
  this.feedInfraHealingFromFailures(result.value.failedTests);
412
420
  // ADR-057: Attempt automatic recovery and re-run affected tests
413
- const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot });
421
+ const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot, frameworkFromConfig: request.frameworkFromConfig });
414
422
  if (rerunResult)
415
423
  return rerunResult;
416
424
  }
@@ -631,6 +639,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
631
639
  return this.execute({
632
640
  testFiles: [...filesToRerun],
633
641
  framework,
642
+ frameworkFromConfig: originalRequest.frameworkFromConfig,
634
643
  timeout: originalRequest.timeout,
635
644
  env: originalRequest.env,
636
645
  retryCount: originalRequest.retryCount,
@@ -56,6 +56,11 @@ export interface ISimpleTestRequest {
56
56
  export interface IExecuteTestsRequest {
57
57
  testFiles: string[];
58
58
  framework: string;
59
+ /**
60
+ * #1272: the caller named no framework, so each runner project's own config
61
+ * chooses jest or vitest; `framework` is used where it names neither.
62
+ */
63
+ frameworkFromConfig?: boolean;
59
64
  timeout?: number;
60
65
  env?: Record<string, string>;
61
66
  reporters?: string[];
@@ -80,6 +80,8 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
80
80
  // Simple request format
81
81
  const request = {
82
82
  testFiles,
83
+ // #1272: an explicit framework wins over the project's config.
84
+ framework: typeof payload.framework === 'string' ? payload.framework : undefined,
83
85
  parallel: payload.parallel,
84
86
  retryCount: payload.retryCount,
85
87
  timeout: payload.timeout,
@@ -39,7 +39,8 @@ export interface FlakyDetectorConfig {
39
39
  */
40
40
  testRunnerArgs: string[];
41
41
  /**
42
- * Working directory for test execution.
42
+ * Working directory for test execution. When omitted, each file runs from
43
+ * its nearest runner project, as test_execute_parallel does (#1247, #1272).
43
44
  */
44
45
  cwd?: string;
45
46
  /**
@@ -112,6 +113,13 @@ export declare class FlakyDetectorService implements IFlakyTestDetector {
112
113
  /** Cache TTL for analysis results (1 hour) */
113
114
  private readonly ANALYSIS_CACHE_TTL_MS;
114
115
  constructor(memory: MemoryBackend, config?: Partial<FlakyDetectorConfig>);
116
+ /** True when the caller chose the runner command; else the project's config picks it. */
117
+ private readonly runnerConfigured;
118
+ /**
119
+ * #1272: the runner command for a run started in `cwd`. A configured command
120
+ * is used as given; the default runs Jest in a project configured for Jest.
121
+ */
122
+ private runnerCommandIn;
115
123
  /**
116
124
  * Detect flaky tests by running them multiple times
117
125
  */