agentic-qe 3.15.17 → 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 (495) 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 +123 -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-6BUOFQZA.js → agent-booster-wasm-UFNJNF3M.js} +2 -2
  32. package/dist/cli/chunks/{agent-handler-HPDK3JI3.js → agent-handler-EAYVRJXN.js} +2 -2
  33. package/dist/cli/chunks/{agent-memory-branch-5QKUTWK5.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-HZ35LESR.js → arena-2GDICP6R.js} +4 -4
  36. package/dist/cli/chunks/{arena-7OKPMNHD.js → arena-CG3X67OE.js} +2 -2
  37. package/dist/cli/chunks/{audit-XI575SVK.js → audit-F4FSPJPL.js} +3 -3
  38. package/dist/cli/chunks/base-J2FXOE77.js +2 -0
  39. package/dist/cli/chunks/{better-sqlite3-YO5X7ZJS.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-N6G44UU2.js → branch-enumerator-KL7C535H.js} +2 -2
  42. package/dist/cli/chunks/{browser-EVKPTLOI.js → browser-SJEXDVHS.js} +2 -2
  43. package/dist/cli/chunks/browser-workflow-LXGER6ZD.js +2 -0
  44. package/dist/cli/chunks/{chunk-VLTDW7XJ.js → chunk-244RKAEP.js} +2 -2
  45. package/dist/cli/chunks/{chunk-CVPXHDQU.js → chunk-27TUMXPD.js} +1 -1
  46. package/dist/cli/chunks/{chunk-FBBPRVNF.js → chunk-2MBYDPCP.js} +2 -2
  47. package/dist/cli/chunks/{chunk-P3D7SEHW.js → chunk-2Q6DTBMT.js} +1 -1
  48. package/dist/cli/chunks/{chunk-NE3LRUNC.js → chunk-355MI7RV.js} +13 -13
  49. package/dist/cli/chunks/{chunk-YCVLKU6H.js → chunk-3LX5OKBD.js} +2 -2
  50. package/dist/cli/chunks/{chunk-74MDUIAZ.js → chunk-3RPDKJGV.js} +1 -1
  51. package/dist/cli/chunks/{chunk-OWIQR6N2.js → chunk-3YMIT73A.js} +2 -2
  52. package/dist/cli/chunks/{chunk-VKREKVFI.js → chunk-43KUVBSU.js} +2 -2
  53. package/dist/cli/chunks/chunk-477FKXSS.js +2 -0
  54. package/dist/cli/chunks/{chunk-XPTCQKVE.js → chunk-4BIMTRRX.js} +1 -1
  55. package/dist/cli/chunks/{chunk-HD6W6PHV.js → chunk-4CVNVBX5.js} +2 -2
  56. package/dist/cli/chunks/{chunk-CQER6IJ5.js → chunk-4HL3SD4A.js} +1 -1
  57. package/dist/cli/chunks/{chunk-ZNXM6WVL.js → chunk-4PEG4DU2.js} +2 -2
  58. package/dist/cli/chunks/{chunk-BSIWI4ES.js → chunk-4QSQKFED.js} +2 -2
  59. package/dist/cli/chunks/chunk-53ZBETYR.js +16 -0
  60. package/dist/cli/chunks/{chunk-BHQ2DLJU.js → chunk-544KDWL4.js} +1 -1
  61. package/dist/cli/chunks/chunk-54RCGMLB.js +8 -0
  62. package/dist/cli/chunks/{chunk-TDZ6N43D.js → chunk-5AGXIZQ5.js} +2 -2
  63. package/dist/cli/chunks/{chunk-RKCN4B26.js → chunk-5M24X6W7.js} +2 -2
  64. package/dist/cli/chunks/{chunk-GG7PMTHD.js → chunk-5O5T4LEU.js} +1 -1
  65. package/dist/cli/chunks/{chunk-OWIZBZLN.js → chunk-5RFXX4IF.js} +2 -2
  66. package/dist/cli/chunks/{chunk-VQFV2IPV.js → chunk-62MLAQRJ.js} +1 -1
  67. package/dist/cli/chunks/{chunk-PCL5JRKN.js → chunk-6D6TGL2E.js} +2 -2
  68. package/dist/cli/chunks/{chunk-WBDWHHKP.js → chunk-6IHZDSDL.js} +2 -2
  69. package/dist/cli/chunks/{chunk-UOVCTK5L.js → chunk-6P3Y45QL.js} +2 -2
  70. package/dist/cli/chunks/{chunk-45223KK6.js → chunk-6TEVM3X3.js} +10 -10
  71. package/dist/cli/chunks/{chunk-K7WAI662.js → chunk-7XTUKKRA.js} +1 -1
  72. package/dist/cli/chunks/chunk-A3GDX6UF.js +2 -0
  73. package/dist/cli/chunks/{chunk-GN6OE3JT.js → chunk-A5YTKKNA.js} +1 -1
  74. package/dist/cli/chunks/{chunk-KR2TAAF6.js → chunk-ADNGZAT2.js} +1 -1
  75. package/dist/cli/chunks/{chunk-J7Q5TXFZ.js → chunk-AWQAE3SW.js} +2 -2
  76. package/dist/cli/chunks/{chunk-ZN35XSKF.js → chunk-AXDBQFR4.js} +2 -2
  77. package/dist/cli/chunks/{chunk-ND72UDVH.js → chunk-AXVD7O3F.js} +2 -2
  78. package/dist/cli/chunks/{chunk-SAEECT23.js → chunk-B52ULNYO.js} +2 -2
  79. package/dist/cli/chunks/chunk-B6S4FC7M.js +3 -0
  80. package/dist/cli/chunks/{chunk-Z7SKUC6P.js → chunk-BDVFSMOQ.js} +1 -1
  81. package/dist/cli/chunks/{chunk-CXCMATZ6.js → chunk-BGXXMX3Y.js} +2 -2
  82. package/dist/cli/chunks/{chunk-R3KBOQ3O.js → chunk-BKMQQY5T.js} +2 -2
  83. package/dist/cli/chunks/{chunk-SAZ4PJBR.js → chunk-BN2FROBQ.js} +2 -2
  84. package/dist/cli/chunks/{chunk-G2X3OLMN.js → chunk-BO6EQNOC.js} +2 -2
  85. package/dist/cli/chunks/{chunk-776K4ZLE.js → chunk-BOVAKCDC.js} +2 -2
  86. package/dist/cli/chunks/{chunk-QSQNXBD2.js → chunk-BSXKZDKO.js} +2 -2
  87. package/dist/cli/chunks/{chunk-MGZ6XZHU.js → chunk-C5QVJ5XQ.js} +1 -1
  88. package/dist/cli/chunks/{chunk-LOLSZG5J.js → chunk-CFQLLF3D.js} +2 -2
  89. package/dist/cli/chunks/{chunk-J6QRNQJF.js → chunk-DUCVLT3F.js} +7 -7
  90. package/dist/cli/chunks/{chunk-QTQDX4TZ.js → chunk-E4RMJCGA.js} +3 -3
  91. package/dist/cli/chunks/{chunk-MLMD3I75.js → chunk-EONDCWY4.js} +1 -1
  92. package/dist/cli/chunks/{chunk-7BSOO3CY.js → chunk-F4AGNKL2.js} +2 -2
  93. package/dist/cli/chunks/{chunk-IKB3M7OF.js → chunk-F6YD3BOW.js} +1 -1
  94. package/dist/cli/chunks/{chunk-LIF6UWHV.js → chunk-FQRS7WVA.js} +2 -2
  95. package/dist/cli/chunks/{chunk-QJSSUBO3.js → chunk-FT24SSDG.js} +2 -2
  96. package/dist/cli/chunks/chunk-FV4YNSAJ.js +5 -0
  97. package/dist/cli/chunks/{chunk-VITV7AEC.js → chunk-FVDM3X42.js} +2 -2
  98. package/dist/cli/chunks/{chunk-LN7NKE3N.js → chunk-FVH7TXWU.js} +2 -2
  99. package/dist/cli/chunks/{chunk-FBSBXCZS.js → chunk-FWR5QY37.js} +2 -2
  100. package/dist/cli/chunks/{chunk-X2DWHGCC.js → chunk-FYINK2B7.js} +2 -2
  101. package/dist/cli/chunks/{chunk-ECKHDHR2.js → chunk-GGISVPOZ.js} +2 -2
  102. package/dist/cli/chunks/{chunk-SRBCBVSI.js → chunk-GPIJIZJQ.js} +2 -2
  103. package/dist/cli/chunks/{chunk-YR5QBUHZ.js → chunk-GXEVOT5F.js} +2 -2
  104. package/dist/cli/chunks/{chunk-ZTP3DQ5M.js → chunk-GZ4VB5RI.js} +1 -1
  105. package/dist/cli/chunks/{chunk-HWQPMUSN.js → chunk-HBDSCYSK.js} +2 -2
  106. package/dist/cli/chunks/{chunk-XBTGEYED.js → chunk-HGG4HR7C.js} +2 -2
  107. package/dist/cli/chunks/{chunk-YD2C6EPN.js → chunk-HSCKWWO2.js} +2 -2
  108. package/dist/cli/chunks/{chunk-LOMT4UC2.js → chunk-HSQ3GUYJ.js} +2 -2
  109. package/dist/cli/chunks/{chunk-ZC3KDNJW.js → chunk-HZQBW5EM.js} +3 -3
  110. package/dist/cli/chunks/{chunk-SUAZ5Z47.js → chunk-IGIYANVT.js} +2 -2
  111. package/dist/cli/chunks/{chunk-IHQGNDMX.js → chunk-IPWMSXBF.js} +2 -2
  112. package/dist/cli/chunks/{chunk-6V6BD6PH.js → chunk-IWVNC7VY.js} +1 -1
  113. package/dist/cli/chunks/{chunk-M2YI5YUR.js → chunk-IZODXKZD.js} +2 -2
  114. package/dist/cli/chunks/{chunk-LG5PPJT7.js → chunk-J2MT2OJV.js} +1 -1
  115. package/dist/cli/chunks/{chunk-6LSZCEW2.js → chunk-JKIJVVSP.js} +1 -1
  116. package/dist/cli/chunks/{chunk-REY52O7J.js → chunk-JMRDT2XK.js} +1 -1
  117. package/dist/cli/chunks/{chunk-XEYFZLIT.js → chunk-JR2UMTKG.js} +1 -1
  118. package/dist/cli/chunks/{chunk-DJDVD6RM.js → chunk-K6CH4CFF.js} +2 -2
  119. package/dist/cli/chunks/{chunk-2PCEMDIX.js → chunk-K7KW5QB5.js} +78 -87
  120. package/dist/cli/chunks/{chunk-EPVPXHL7.js → chunk-KFCQP434.js} +2 -2
  121. package/dist/cli/chunks/{chunk-TWBZONKT.js → chunk-KH4T6STG.js} +2 -2
  122. package/dist/cli/chunks/{chunk-JI33PMPZ.js → chunk-KJBYZO57.js} +1 -1
  123. package/dist/cli/chunks/{chunk-PK34KJH7.js → chunk-KP4OKOKV.js} +2 -2
  124. package/dist/cli/chunks/chunk-L2MBKVSE.js +2 -0
  125. package/dist/cli/chunks/{chunk-JVWZAE2H.js → chunk-L3IPUIT3.js} +2 -2
  126. package/dist/cli/chunks/{chunk-KT2QCXO6.js → chunk-L7PSU2YN.js} +2 -2
  127. package/dist/cli/chunks/{chunk-HAQJFUAQ.js → chunk-LA3JPGQA.js} +2 -2
  128. package/dist/cli/chunks/{chunk-LV7UIK4Q.js → chunk-LC2QRN7V.js} +14 -13
  129. package/dist/cli/chunks/{chunk-KTORRIX3.js → chunk-LHY7TMTM.js} +2 -2
  130. package/dist/cli/chunks/{chunk-IJSROBM6.js → chunk-LLQ2UMF6.js} +3 -3
  131. package/dist/cli/chunks/{chunk-NKUHMA4T.js → chunk-LOJ7OO6W.js} +2 -2
  132. package/dist/cli/chunks/{chunk-OJIUIEI4.js → chunk-LPUSH3VF.js} +1 -1
  133. package/dist/cli/chunks/{chunk-WAOEQA3W.js → chunk-LSEC2BU7.js} +2 -2
  134. package/dist/cli/chunks/{chunk-YMUY3TES.js → chunk-LTGB7OIU.js} +2 -2
  135. package/dist/cli/chunks/{chunk-CVYPMGUM.js → chunk-LUG7YNVZ.js} +2 -2
  136. package/dist/cli/chunks/{chunk-YAJOBZE5.js → chunk-LWAFRYKE.js} +2 -2
  137. package/dist/cli/chunks/{chunk-ZP5AWQRO.js → chunk-M24ZAZ4U.js} +2 -2
  138. package/dist/cli/chunks/{chunk-HFZD5KLR.js → chunk-MKRKRXTX.js} +1 -1
  139. package/dist/cli/chunks/{chunk-4YM45Z5B.js → chunk-MNNLONAD.js} +1 -1
  140. package/dist/cli/chunks/{chunk-CMN7PU2H.js → chunk-MQM37KAR.js} +2 -2
  141. package/dist/cli/chunks/{chunk-COTQ44YO.js → chunk-MSX2OHYT.js} +2 -2
  142. package/dist/cli/chunks/{chunk-4UKTIQDT.js → chunk-MVYQRVLP.js} +2 -2
  143. package/dist/cli/chunks/{chunk-HRUHHHVR.js → chunk-MZC5WM2P.js} +2 -2
  144. package/dist/cli/chunks/{chunk-YKRLUTK7.js → chunk-MZRBNBB3.js} +2 -2
  145. package/dist/cli/chunks/{chunk-XEMCHGAJ.js → chunk-N3KQU4UC.js} +2 -2
  146. package/dist/cli/chunks/{chunk-DS5IFRY6.js → chunk-NKU3FFM4.js} +2 -2
  147. package/dist/cli/chunks/chunk-O5EWFR76.js +2 -0
  148. package/dist/cli/chunks/{chunk-J3QFJI2Y.js → chunk-O5RDHD5T.js} +2 -2
  149. package/dist/cli/chunks/chunk-O6UWIXME.js +3 -0
  150. package/dist/cli/chunks/{chunk-Q6F3DYZN.js → chunk-OA4EQDC4.js} +2 -2
  151. package/dist/cli/chunks/{chunk-NQFDJ6BT.js → chunk-OBCXCRXK.js} +1 -1
  152. package/dist/cli/chunks/{chunk-S3TBOKAZ.js → chunk-OHU5P25N.js} +4 -4
  153. package/dist/cli/chunks/{chunk-DNVRTJKB.js → chunk-OOSV2RIA.js} +2 -2
  154. package/dist/cli/chunks/{chunk-NZJVDOUN.js → chunk-OW23N2Y5.js} +2 -2
  155. package/dist/cli/chunks/{chunk-ZWUF27P4.js → chunk-OXOO3YDL.js} +2 -2
  156. package/dist/cli/chunks/{chunk-4L6WX5KC.js → chunk-OYGKSSSI.js} +1 -1
  157. package/dist/cli/chunks/{chunk-DCDSN67A.js → chunk-PGO46IIW.js} +1 -1
  158. package/dist/cli/chunks/{chunk-C7QLLMYI.js → chunk-PZOYQHWS.js} +1 -1
  159. package/dist/cli/chunks/{chunk-BKHEQIRZ.js → chunk-Q2BZSG7Z.js} +2 -2
  160. package/dist/cli/chunks/{chunk-5FSPELOG.js → chunk-Q7V722K5.js} +2 -2
  161. package/dist/cli/chunks/{chunk-2EQK7B5L.js → chunk-QZU6M5IO.js} +2 -2
  162. package/dist/cli/chunks/{chunk-HVT7RMGV.js → chunk-R55Y76SJ.js} +1 -1
  163. package/dist/cli/chunks/{chunk-POPSZDI2.js → chunk-RMEQYJPU.js} +4 -4
  164. package/dist/cli/chunks/{chunk-H2LHWZRE.js → chunk-RTYXFXTI.js} +2 -2
  165. package/dist/cli/chunks/{chunk-QN7HP2UW.js → chunk-SJF3O4FX.js} +236 -236
  166. package/dist/cli/chunks/{chunk-2YWYW7NU.js → chunk-SOUS7Z2H.js} +2 -2
  167. package/dist/cli/chunks/{chunk-U5SMBJ6F.js → chunk-SRVNR3R3.js} +2 -2
  168. package/dist/cli/chunks/{chunk-ZAQMRFBB.js → chunk-SU3SXMVG.js} +2 -2
  169. package/dist/cli/chunks/chunk-SWGPLXWW.js +32 -0
  170. package/dist/cli/chunks/{chunk-S3DT5TPR.js → chunk-TRB3EVH3.js} +2 -2
  171. package/dist/cli/chunks/{chunk-IJZFJPHS.js → chunk-TVBDUMKT.js} +2 -2
  172. package/dist/cli/chunks/{chunk-7SNSI4VY.js → chunk-TWTXPSFU.js} +1 -1
  173. package/dist/cli/chunks/{chunk-ORQ2YBRR.js → chunk-ULYUVUL2.js} +2 -2
  174. package/dist/cli/chunks/{chunk-MVVVGQJ6.js → chunk-UNTBVJ5X.js} +2 -2
  175. package/dist/cli/chunks/{chunk-5WATBVU6.js → chunk-UQAA4PHU.js} +2 -2
  176. package/dist/cli/chunks/{chunk-5WYZVSL2.js → chunk-UWSJVKTE.js} +1 -1
  177. package/dist/cli/chunks/{chunk-JHKKIJT2.js → chunk-V2LJ54KP.js} +2 -2
  178. package/dist/cli/chunks/{chunk-2UUZCQSD.js → chunk-VCCTTKP3.js} +2 -2
  179. package/dist/cli/chunks/{chunk-P4OB6WDJ.js → chunk-VEGUYUVS.js} +1 -1
  180. package/dist/cli/chunks/{chunk-WX4PO65Q.js → chunk-VUQPVWNK.js} +2 -2
  181. package/dist/cli/chunks/{chunk-IQL6XRF5.js → chunk-VVGUE2T2.js} +2 -2
  182. package/dist/cli/chunks/{chunk-HZ5O7G2P.js → chunk-W5ASDHJQ.js} +1 -1
  183. package/dist/cli/chunks/{chunk-U4S74IIZ.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-AGCS5GSO.js → chunk-WQNLXUWA.js} +6 -6
  187. package/dist/cli/chunks/{chunk-LRY6UIRI.js → chunk-WZVRMKG2.js} +2 -2
  188. package/dist/cli/chunks/{chunk-KPIPVSIP.js → chunk-X27IUWTD.js} +2 -2
  189. package/dist/cli/chunks/{chunk-VDEKVIP5.js → chunk-X4B345B6.js} +2 -2
  190. package/dist/cli/chunks/{chunk-ERYADKMZ.js → chunk-X5I2Y4VO.js} +2 -2
  191. package/dist/cli/chunks/{chunk-EUWG2JG4.js → chunk-X7IQIFTS.js} +2 -2
  192. package/dist/cli/chunks/chunk-XJN3RKUD.js +3 -0
  193. package/dist/cli/chunks/{chunk-JRIJM4LE.js → chunk-XQMGXTHJ.js} +3 -3
  194. package/dist/cli/chunks/{chunk-VYPVU3JF.js → chunk-XTSAMB2Q.js} +2 -2
  195. package/dist/cli/chunks/{chunk-4NKZU2JZ.js → chunk-XZLIF4O2.js} +2 -2
  196. package/dist/cli/chunks/{chunk-XFTX3KLE.js → chunk-Y4LSEOZ3.js} +1 -1
  197. package/dist/cli/chunks/{chunk-ZVMSSCTH.js → chunk-Y4YN2RXR.js} +2 -2
  198. package/dist/cli/chunks/{chunk-X5QD76IU.js → chunk-YDI56L35.js} +2 -2
  199. package/dist/cli/chunks/{chunk-LRKLATSH.js → chunk-YFILS5D5.js} +2 -2
  200. package/dist/cli/chunks/{chunk-AVHYJ3XP.js → chunk-YISDX6WB.js} +2 -2
  201. package/dist/cli/chunks/{chunk-GPPTRKEM.js → chunk-YP2GHQSV.js} +2 -2
  202. package/dist/cli/chunks/{chunk-OO2M2QUV.js → chunk-YSX756AM.js} +4 -4
  203. package/dist/cli/chunks/{chunk-E7XIMOKW.js → chunk-YWANOASW.js} +2 -2
  204. package/dist/cli/chunks/{chunk-UHJVZEQA.js → chunk-YYIJLG7S.js} +2 -2
  205. package/dist/cli/chunks/{chunk-LCWEQRZI.js → chunk-Z7SD7LXM.js} +2 -2
  206. package/dist/cli/chunks/{chunk-TM75GAXG.js → chunk-ZDWD73UF.js} +2 -2
  207. package/dist/cli/chunks/{chunk-IRHXGCQR.js → chunk-ZFT3RLA4.js} +2 -2
  208. package/dist/cli/chunks/{chunk-ZGV7L4MW.js → chunk-ZNTHX5G3.js} +1 -1
  209. package/dist/cli/chunks/{chunk-D75GLKEL.js → chunk-ZS27R7VL.js} +2 -2
  210. package/dist/cli/chunks/{chunk-INI3Q4CN.js → chunk-ZXHHHR7K.js} +1 -1
  211. package/dist/cli/chunks/{ci-3RTTTS2D.js → ci-N5MOMNXH.js} +2 -2
  212. package/dist/cli/chunks/{ci-config-XRUR3I4K.js → ci-config-6L2ROQCW.js} +2 -2
  213. package/dist/cli/chunks/{ci-output-E5IAMU2U.js → ci-output-DSRBYEIK.js} +2 -2
  214. package/dist/cli/chunks/{circuit-breaker-SHR2P44P.js → circuit-breaker-VRPTNBL7.js} +2 -2
  215. package/dist/cli/chunks/{claude-flow-setup-ZDDILFMF.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-BGYVUM6G.js → cline-installer-7RGYJWGN.js} +2 -2
  218. package/dist/cli/chunks/{code-PJ4MC3MC.js → code-ISC6NW2K.js} +3 -3
  219. package/dist/cli/chunks/{code-index-extractor-IW2P22YG.js → code-index-extractor-2FID75YV.js} +2 -2
  220. package/dist/cli/chunks/{codex-installer-A7WZ6OGL.js → codex-installer-DZ7OG6KM.js} +2 -2
  221. package/dist/cli/chunks/{completions-KS23WD5J.js → completions-SM3LICWK.js} +2 -2
  222. package/dist/cli/chunks/{complexity-analyzer-Q7GLSR2E.js → complexity-analyzer-ZWD2CTAD.js} +2 -2
  223. package/dist/cli/chunks/{continuedev-installer-SK55BFW2.js → continuedev-installer-AGASOA26.js} +2 -2
  224. package/dist/cli/chunks/{copilot-installer-3N5J3WTM.js → copilot-installer-CLPZYTQC.js} +2 -2
  225. package/dist/cli/chunks/core-handlers-5EFOJ37H.js +2 -0
  226. package/dist/cli/chunks/{cost-tracker-NENVSO4A.js → cost-tracker-7PIGQYDV.js} +2 -2
  227. package/dist/cli/chunks/{coverage-5L7UQWDH.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-XXBO2ZE6.js → cursor-installer-KXBID4MB.js} +2 -2
  230. package/dist/cli/chunks/daemon-43MXIVH3.js +18 -0
  231. package/dist/cli/chunks/{daemon-CDCQU3LR.js → daemon-VAMJLQJ5.js} +3 -3
  232. package/dist/cli/chunks/{dag-attention-scheduler-HOMMF7FA.js → dag-attention-scheduler-UBP4VHTA.js} +2 -2
  233. package/dist/cli/chunks/{detect-FXCOUG6X.js → detect-QWFIQRKI.js} +2 -2
  234. package/dist/cli/chunks/{dist-node-GXQ7FMTY.js → dist-node-I2GICS3W.js} +2 -2
  235. package/dist/cli/chunks/{domain-handler-TI3JBAPC.js → domain-handler-Z66ISB2A.js} +2 -2
  236. package/dist/cli/chunks/{domain-plugins-R7LTUM32.js → domain-plugins-KHMD3FKT.js} +2 -2
  237. package/dist/cli/chunks/{domain-transfer-LBIAFHIQ.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-HHLWTBF5.js → embedding-space-KHG6TITM.js} +2 -2
  241. package/dist/cli/chunks/{eval-KDOZMAXJ.js → eval-43OHU7EI.js} +2 -2
  242. package/dist/cli/chunks/{experience-capture-middleware-X45PECQN.js → experience-capture-middleware-KXD47H6P.js} +3 -3
  243. package/dist/cli/chunks/{fast-paths-462V6UUB.js → fast-paths-6D75D5KD.js} +2 -2
  244. package/dist/cli/chunks/{feature-flags-NIRQ4YDM.js → feature-flags-IE35Y55N.js} +2 -2
  245. package/dist/cli/chunks/{feature-flags-G66OT3AS.js → feature-flags-OYYHY7LS.js} +2 -2
  246. package/dist/cli/chunks/file-discovery-LGBTY3ID.js +2 -0
  247. package/dist/cli/chunks/{fleet-PXWGB7CU.js → fleet-AGVJMFGD.js} +16 -16
  248. package/dist/cli/chunks/{gnn-wrapper-7MUW3M5M.js → gnn-wrapper-5L66A7LW.js} +2 -2
  249. package/dist/cli/chunks/{heartbeat-handler-5237PB35.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-OSQPW7JP.js → hnsw-legacy-bridge-RYMWFNAH.js} +2 -2
  254. package/dist/cli/chunks/{hnswlib-node-GX6WG2GB.js → hnswlib-node-GG47HP2P.js} +2 -2
  255. package/dist/cli/chunks/{hooks-GUWHL7VC.js → hooks-FQNACS24.js} +10 -10
  256. package/dist/cli/chunks/hybrid-backend-AS2PNHOD.js +2 -0
  257. package/dist/cli/chunks/{hypergraph-engine-SRWLLCU3.js → hypergraph-engine-6BYNJQEP.js} +2 -2
  258. package/dist/cli/chunks/{hypergraph-handler-AVOPRHHO.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-P4N6EVZS.js → init-guard-METTAV5O.js} +2 -2
  261. package/dist/cli/chunks/{init-handler-LRGWOJMD.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-7R2EPOQ6.js → kilocode-installer-GZV2D3FF.js} +2 -2
  265. package/dist/cli/chunks/{kiro-installer-QNM7DPOB.js → kiro-installer-Q4ZXUFC7.js} +2 -2
  266. package/dist/cli/chunks/knowledge-graph-CNL77CSZ.js +2 -0
  267. package/dist/cli/chunks/{learning-7OIZBPXZ.js → learning-WA2QEYL7.js} +35 -34
  268. package/dist/cli/chunks/{llm-router-SIDXES23.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-EI2E2C3S.js → load-WXN3Q7Y5.js} +2 -2
  271. package/dist/cli/chunks/load-test-PXLW4A5B.js +2 -0
  272. package/dist/cli/chunks/{mcp-IOE5WOCS.js → mcp-LIQCPSJN.js} +2 -2
  273. package/dist/cli/chunks/{memory-DLYGJAP7.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-WHH4YCHM.js → multi-model-executor-H54DEVRZ.js} +2 -2
  277. package/dist/cli/chunks/{opencode-installer-63FDZAMS.js → opencode-installer-BSQV6UAT.js} +2 -2
  278. package/dist/cli/chunks/{orchestrator-3LA776KK.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-NW54QUGI.js → pattern-usage-recorder-FOVS4M5L.js} +2 -2
  281. package/dist/cli/chunks/{pipeline-P3TYX6J6.js → pipeline-4AY2ZIC6.js} +2 -2
  282. package/dist/cli/chunks/{platform-FNA2WLI6.js → platform-FCSITYMR.js} +2 -2
  283. package/dist/cli/chunks/{plugin-NJS7BC2S.js → plugin-E56TV5S2.js} +2 -2
  284. package/dist/cli/chunks/{prime-radiant-advanced-wasm-NIAVL2OT.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-JU5C4JHY.js → protocol-handler-KRVXF4LS.js} +2 -2
  288. package/dist/cli/chunks/{prove-35VOSLYP.js → prove-KMFPSKGD.js} +2 -2
  289. package/dist/cli/chunks/qe-reasoning-bank-UEGQ3O7F.js +2 -0
  290. package/dist/cli/chunks/{quality-ET74X7HN.js → quality-6DBI3HLB.js} +2 -2
  291. package/dist/cli/chunks/{quality-gate-FEDQISNB.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-DTBPYCEB.js → ref-validation-EYIP7DHW.js} +2 -2
  295. package/dist/cli/chunks/{roocode-installer-LYQEMR4J.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-DJOJFPII.js → routing-handler-BWNHBYDC.js} +2 -2
  299. package/dist/cli/chunks/{ruvector-commands-VXYGJDPW.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-GA2ZYOEG.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-MM6YOECX.js → security-DCRGOTWU.js} +3 -3
  309. package/dist/cli/chunks/{shared-rvf-adapter-6AHPA3V5.js → shared-rvf-adapter-GKD74QUB.js} +2 -2
  310. package/dist/cli/chunks/{shared-rvf-dual-writer-EYAVY2GZ.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-A3PLB4CZ.js → standalone-memory-O7O2U5N4.js} +2 -2
  313. package/dist/cli/chunks/{status-handler-OSSFAP4Z.js → status-handler-BQTPJJTL.js} +2 -2
  314. package/dist/cli/chunks/{structural-health-PGY5XUNO.js → structural-health-4H6J4OHK.js} +2 -2
  315. package/dist/cli/chunks/sync-DJ4TF6QX.js +2 -0
  316. package/dist/cli/chunks/{sync-CWEHYGNN.js → sync-WW5TAVYW.js} +2 -2
  317. package/dist/cli/chunks/{task-handler-LHMQ75W4.js → task-handler-HEM4IEOW.js} +2 -2
  318. package/dist/cli/chunks/{task-handlers-S2TX5FTR.js → task-handlers-JRA3NXIR.js} +3 -3
  319. package/dist/cli/chunks/{test-4EGZZ6NJ.js → test-772ZXVG2.js} +4 -4
  320. package/dist/cli/chunks/test-runner-process-XGF2U3NG.js +2 -0
  321. package/dist/cli/chunks/{test-scheduling-YJQHH3XE.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-WPNOJR6H.js → token-usage-B7PEKE2G.js} +2 -2
  324. package/dist/cli/chunks/{transformers-4MRPXCPU.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-6P5FB4EB.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-4ICTN63Y.js → upgrade-DZ4DLUQ5.js} +2 -2
  331. package/dist/cli/chunks/{validate-HQF5GZ7L.js → validate-4DTLIDJE.js} +2 -2
  332. package/dist/cli/chunks/{validate-swarm-45JYG7VW.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-UOTWZLNH.js → web-tree-sitter-F2C7QRYT.js} +2 -2
  335. package/dist/cli/chunks/{windsurf-installer-WDWSBXGN.js → windsurf-installer-OOBTDA6W.js} +2 -2
  336. package/dist/cli/chunks/{witness-chain-DOYMNPC7.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-JB42X62J.js → witness-chain-verifier-OB7ZZOI3.js} +2 -2
  340. package/dist/cli/chunks/{witness-key-manager-LXXO6L2G.js → witness-key-manager-YCKGKGQI.js} +2 -2
  341. package/dist/cli/chunks/{workflow-6ARK47NF.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/handlers/brain-handler.js +32 -2
  347. package/dist/cli/handlers/heartbeat-handler.js +3 -1
  348. package/dist/cli/utils/coverage-data.js +5 -1
  349. package/dist/cli/utils/coverage-verdict.d.ts +10 -2
  350. package/dist/cli/utils/coverage-verdict.js +23 -8
  351. package/dist/cli/utils/fleet-operation.js +9 -3
  352. package/dist/coordination/handlers/code-intelligence-handlers.js +17 -3
  353. package/dist/coordination/handlers/coverage-handlers.js +22 -9
  354. package/dist/coordination/handlers/coverage-target.d.ts +22 -2
  355. package/dist/coordination/handlers/coverage-target.js +45 -9
  356. package/dist/coordination/handlers/handler-utils.d.ts +19 -0
  357. package/dist/coordination/handlers/handler-utils.js +22 -8
  358. package/dist/coordination/protocols/code-intelligence-index.js +6 -3
  359. package/dist/coordination/protocols/learning-consolidation-archive.d.ts +6 -3
  360. package/dist/coordination/protocols/learning-consolidation-archive.js +4 -3
  361. package/dist/coordination/workflow-builtin.js +1 -0
  362. package/dist/domains/defect-intelligence/interfaces.d.ts +2 -0
  363. package/dist/domains/defect-intelligence/prediction-history.d.ts +15 -1
  364. package/dist/domains/defect-intelligence/prediction-history.js +63 -7
  365. package/dist/domains/defect-intelligence/services/defect-predictor.d.ts +1 -0
  366. package/dist/domains/defect-intelligence/services/defect-predictor.js +33 -13
  367. package/dist/domains/learning-optimization/coordinator.js +17 -10
  368. package/dist/domains/learning-optimization/domain-ranking.d.ts +26 -0
  369. package/dist/domains/learning-optimization/domain-ranking.js +28 -0
  370. package/dist/domains/learning-optimization/interfaces.d.ts +5 -0
  371. package/dist/domains/learning-optimization/pattern-archive.d.ts +55 -8
  372. package/dist/domains/learning-optimization/pattern-archive.js +90 -17
  373. package/dist/domains/learning-optimization/pattern-consolidation.js +18 -2
  374. package/dist/domains/learning-optimization/pattern-merge.d.ts +26 -0
  375. package/dist/domains/learning-optimization/pattern-merge.js +127 -0
  376. package/dist/domains/learning-optimization/services/learning-coordinator.js +21 -35
  377. package/dist/domains/test-execution/services/test-executor.js +6 -2
  378. package/dist/init/init-wizard-steps.js +3 -1
  379. package/dist/init/phases/07-hooks.js +97 -10
  380. package/dist/integrations/embeddings/cache/EmbeddingCache.js +1 -1
  381. package/dist/integrations/ruvector/brain-rvf-exporter.d.ts +16 -1
  382. package/dist/integrations/ruvector/brain-rvf-exporter.js +18 -32
  383. package/dist/integrations/ruvector/brain-rvf-richness.d.ts +75 -0
  384. package/dist/integrations/ruvector/brain-rvf-richness.js +127 -0
  385. package/dist/kernel/unified-memory-migration.js +1 -1
  386. package/dist/learning/checkpoint-shrink-ack.d.ts +25 -0
  387. package/dist/learning/checkpoint-shrink-ack.js +57 -0
  388. package/dist/learning/dream/dream-engine.d.ts +44 -3
  389. package/dist/learning/dream/dream-engine.js +6 -2
  390. package/dist/learning/embedder-identity-store.js +3 -1
  391. package/dist/learning/embedding-space-legacy-adoption.d.ts +53 -0
  392. package/dist/learning/embedding-space-legacy-adoption.js +115 -0
  393. package/dist/learning/embedding-space-registry.d.ts +15 -0
  394. package/dist/learning/embedding-space-registry.js +50 -11
  395. package/dist/learning/experience-capture.d.ts +3 -1
  396. package/dist/learning/experience-capture.js +15 -5
  397. package/dist/learning/experience-space-verification.d.ts +2 -0
  398. package/dist/learning/experience-space-verification.js +3 -2
  399. package/dist/learning/learning-retention.js +4 -0
  400. package/dist/learning/pattern-promotion.d.ts +7 -0
  401. package/dist/learning/pattern-promotion.js +64 -12
  402. package/dist/learning/real-embeddings.js +31 -7
  403. package/dist/learning/rvf-pattern-store.js +6 -1
  404. package/dist/mcp/bundle.js +570 -558
  405. package/dist/mcp/handlers/domain-handler-configs.d.ts +3 -0
  406. package/dist/mcp/handlers/domain-handler-configs.js +1 -0
  407. package/dist/mcp/handlers/heartbeat-handlers.d.ts +4 -2
  408. package/dist/mcp/tools/learning-optimization/optimize.d.ts +6 -1
  409. package/dist/mcp/tools/learning-optimization/optimize.js +20 -11
  410. package/dist/planning/goap-planner.js +4 -0
  411. package/dist/planning/plan-executor.js +6 -2
  412. package/dist/shared/git/git-analyzer.d.ts +30 -11
  413. package/dist/shared/git/git-analyzer.js +95 -48
  414. package/dist/shared/io/confined-read.d.ts +32 -7
  415. package/dist/shared/io/confined-read.js +58 -25
  416. package/dist/shared/io/file-reader.js +4 -1
  417. package/dist/shared/safe-db.d.ts +1 -1
  418. package/dist/shared/safe-db.js +20 -5
  419. package/dist/shared/sqlite-journal-mode.d.ts +39 -0
  420. package/dist/shared/sqlite-journal-mode.js +53 -0
  421. package/dist/sync/claude-flow-bridge.js +1 -1
  422. package/dist/sync/readers/sqlite-reader.js +3 -4
  423. package/dist/sync/writers/sqlite-writer.js +1 -1
  424. package/dist/workers/interfaces.d.ts +2 -2
  425. package/dist/workers/quality-daemon/git-watcher.d.ts +8 -0
  426. package/dist/workers/quality-daemon/git-watcher.js +54 -12
  427. package/dist/workers/quality-daemon/index.js +1 -1
  428. package/dist/workers/quality-daemon/priority-queue.d.ts +2 -1
  429. package/dist/workers/workers/defect-predictor.d.ts +9 -4
  430. package/dist/workers/workers/defect-predictor.js +98 -37
  431. package/package.json +1 -1
  432. package/dist/cli/chunks/adapter-OMILP6KH.js +0 -2
  433. package/dist/cli/chunks/aqe-learning-engine-OXH5CCOS.js +0 -2
  434. package/dist/cli/chunks/base-MAK2BLTG.js +0 -2
  435. package/dist/cli/chunks/brain-handler-GCQZFZGQ.js +0 -95
  436. package/dist/cli/chunks/browser-workflow-IR3VF2TL.js +0 -2
  437. package/dist/cli/chunks/chunk-4EJLHNER.js +0 -12
  438. package/dist/cli/chunks/chunk-A4BVDYIL.js +0 -2
  439. package/dist/cli/chunks/chunk-BE7ZHM34.js +0 -3
  440. package/dist/cli/chunks/chunk-DHKSPOUQ.js +0 -16
  441. package/dist/cli/chunks/chunk-FAQ24UHB.js +0 -29
  442. package/dist/cli/chunks/chunk-IOWEBPXJ.js +0 -5
  443. package/dist/cli/chunks/chunk-KB34MTFZ.js +0 -3
  444. package/dist/cli/chunks/chunk-MCXW3DKE.js +0 -8
  445. package/dist/cli/chunks/chunk-O7VJ3VKD.js +0 -2
  446. package/dist/cli/chunks/chunk-PIWGKGWP.js +0 -3
  447. package/dist/cli/chunks/chunk-SFITYZLV.js +0 -7
  448. package/dist/cli/chunks/chunk-TIVKDIF7.js +0 -2
  449. package/dist/cli/chunks/client-NO5FOWT4.js +0 -2
  450. package/dist/cli/chunks/core-handlers-JNAZPXE2.js +0 -2
  451. package/dist/cli/chunks/cross-domain-router-HEBM767Z.js +0 -2
  452. package/dist/cli/chunks/daemon-JEBJGEUK.js +0 -18
  453. package/dist/cli/chunks/dream-GQDCEJMS.js +0 -2
  454. package/dist/cli/chunks/embed-and-insert-pattern-33KLHDD5.js +0 -3
  455. package/dist/cli/chunks/file-discovery-33USPLB5.js +0 -2
  456. package/dist/cli/chunks/heartbeat-scheduler-LIXLC5IH.js +0 -2
  457. package/dist/cli/chunks/hnsw-adapter-62D5UH27.js +0 -2
  458. package/dist/cli/chunks/hnsw-index-GSGUMQQC.js +0 -2
  459. package/dist/cli/chunks/hybrid-backend-FRWP4BOY.js +0 -2
  460. package/dist/cli/chunks/impact-analyzer-7KF3AQXV.js +0 -2
  461. package/dist/cli/chunks/init-wizard-XWWAXY25.js +0 -2
  462. package/dist/cli/chunks/kernel-ZEJPNDBW.js +0 -2
  463. package/dist/cli/chunks/knowledge-graph-RRZQS7KY.js +0 -2
  464. package/dist/cli/chunks/llm-router-service-3OSW67LC.js +0 -2
  465. package/dist/cli/chunks/load-test-7TRIH2WJ.js +0 -2
  466. package/dist/cli/chunks/memory-backend-G7ZW6Q2B.js +0 -2
  467. package/dist/cli/chunks/memory-handlers-TPF3KCO5.js +0 -2
  468. package/dist/cli/chunks/pattern-null-store-OU3ZC3NR.js +0 -2
  469. package/dist/cli/chunks/project-root-GMOFJEKD.js +0 -2
  470. package/dist/cli/chunks/protocol-executor-AD345XRO.js +0 -2
  471. package/dist/cli/chunks/qe-reasoning-bank-NLTP26RC.js +0 -2
  472. package/dist/cli/chunks/queen-coordinator-2TB4FWS6.js +0 -2
  473. package/dist/cli/chunks/real-embeddings-II6CXTCI.js +0 -2
  474. package/dist/cli/chunks/router-PLM3MWME.js +0 -2
  475. package/dist/cli/chunks/routing-feedback-I7VOX2HU.js +0 -2
  476. package/dist/cli/chunks/rvf-dual-writer-GQZHFWO2.js +0 -2
  477. package/dist/cli/chunks/rvf-migration-adapter-3TVKBCAM.js +0 -2
  478. package/dist/cli/chunks/rvf-migration-coordinator-XUHKLMT6.js +0 -2
  479. package/dist/cli/chunks/rvf-native-adapter-5GUTYOWS.js +0 -2
  480. package/dist/cli/chunks/safe-db-RZPQGLGQ.js +0 -2
  481. package/dist/cli/chunks/schedule-G7JMQDUX.js +0 -2
  482. package/dist/cli/chunks/scheduler-4SEGPCKD.js +0 -2
  483. package/dist/cli/chunks/sqlite-persistence-IVE4SQXR.js +0 -2
  484. package/dist/cli/chunks/sync-PM6D7EQF.js +0 -2
  485. package/dist/cli/chunks/test-runner-process-72YACW6M.js +0 -2
  486. package/dist/cli/chunks/token-bootstrap-DJNETMVW.js +0 -2
  487. package/dist/cli/chunks/tree-sitter-wasm-parser-UVWSDXFR.js +0 -2
  488. package/dist/cli/chunks/unified-memory-2VMGSGQL.js +0 -2
  489. package/dist/cli/chunks/unified-memory-hnsw-3KULVD3N.js +0 -2
  490. package/dist/cli/chunks/unified-persistence-QCSLU2SV.js +0 -2
  491. package/dist/cli/chunks/visual-security-ZYP2KPH7.js +0 -2
  492. package/dist/cli/chunks/witness-chain-5QRT7EMX.js +0 -2
  493. package/dist/cli/chunks/witness-chain-repair-CUF2AFQB.js +0 -2
  494. package/dist/cli/chunks/workflow-orchestrator-RYDDWIXN.js +0 -2
  495. package/dist/cli/chunks/wrappers-CYQBOMPL.js +0 -2
@@ -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). */
@@ -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