agentic-qe 3.10.1 → 3.10.3

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 (412) hide show
  1. package/.claude/hooks/README.txt +17 -0
  2. package/.claude/hooks/aqe-hook.cjs +98 -0
  3. package/.claude/hooks/cross-phase-memory.yaml +296 -0
  4. package/.claude/hooks/post-task-sync.sh +113 -0
  5. package/.claude/hooks/v3-domain-workers.json +121 -0
  6. package/.claude/skills/release/SKILL.md +10 -10
  7. package/.claude/skills/skills-manifest.json +1 -1
  8. package/CHANGELOG.md +131 -0
  9. package/assets/grammars/tree-sitter-c_sharp.wasm +0 -0
  10. package/assets/grammars/tree-sitter-java.wasm +0 -0
  11. package/assets/grammars/tree-sitter-javascript.wasm +0 -0
  12. package/assets/grammars/tree-sitter-python.wasm +0 -0
  13. package/assets/grammars/tree-sitter-rust.wasm +0 -0
  14. package/assets/grammars/tree-sitter-swift.wasm +0 -0
  15. package/assets/grammars/tree-sitter-tsx.wasm +0 -0
  16. package/assets/grammars/tree-sitter-typescript.wasm +0 -0
  17. package/assets/skills/skills-manifest.json +1 -1
  18. package/dist/agents/claim-verifier/claim-verifier-service.js +4 -2
  19. package/dist/agents/claim-verifier/verifiers/test-verifier.js +31 -23
  20. package/dist/agents/devils-advocate/agent.js +1 -1
  21. package/dist/cli/bundle.js +5 -5
  22. package/dist/cli/chunks/adapter-BHPUKMJ5.js +2 -0
  23. package/dist/cli/chunks/{agent-booster-wasm-FZLWOPSX.js → agent-booster-wasm-NGC6LSQP.js} +2 -2
  24. package/dist/cli/chunks/{agent-handler-KAGRVCKS.js → agent-handler-P2IJE4GK.js} +2 -2
  25. package/dist/cli/chunks/{agent-memory-branch-JJKFEXQW.js → agent-memory-branch-JXRJ5GKQ.js} +2 -2
  26. package/dist/cli/chunks/aqe-learning-engine-JQ5WD2HM.js +2 -0
  27. package/dist/cli/chunks/{audit-DN5SY4JJ.js → audit-BMQ3VESB.js} +2 -2
  28. package/dist/cli/chunks/base-E32WLGY2.js +2 -0
  29. package/dist/cli/chunks/{hnswlib-node-YX6OOBN6.js → better-sqlite3-HP4JZS6K.js} +2 -2
  30. package/dist/cli/chunks/{brain-handler-O7MP5BGY.js → brain-handler-SACNDFSW.js} +3 -3
  31. package/dist/cli/chunks/{branch-enumerator-ZPTN5J6V.js → branch-enumerator-LFOTVUDA.js} +2 -2
  32. package/dist/cli/chunks/{browser-PAZE2JSD.js → browser-FK7PRF3W.js} +2 -2
  33. package/dist/cli/chunks/browser-workflow-LNNXXAJG.js +2 -0
  34. package/dist/cli/chunks/{chunk-BF7MUYWC.js → chunk-2EQVYYBF.js} +2 -2
  35. package/dist/cli/chunks/{chunk-BGBSYF3K.js → chunk-2L73WXA4.js} +2 -2
  36. package/dist/cli/chunks/{chunk-W2DT3CDE.js → chunk-2ULVCLOW.js} +2 -2
  37. package/dist/cli/chunks/{chunk-FJSR2U65.js → chunk-3HBWDG62.js} +2 -2
  38. package/dist/cli/chunks/{chunk-WPNZSL4S.js → chunk-3JAOFKEU.js} +2 -2
  39. package/dist/cli/chunks/{chunk-2TDWCXZ6.js → chunk-3LRK7PYN.js} +2 -2
  40. package/dist/cli/chunks/{chunk-MVGVD6LS.js → chunk-3RZL4QTT.js} +2 -2
  41. package/dist/cli/chunks/chunk-3VF3HCG4.js +2 -0
  42. package/dist/cli/chunks/{chunk-6E7GI2UB.js → chunk-3X2ZQ55B.js} +4 -4
  43. package/dist/cli/chunks/{chunk-6QFONVEE.js → chunk-4CYLSXA6.js} +2 -2
  44. package/dist/cli/chunks/{chunk-VOIWDPIU.js → chunk-4OUAHZX2.js} +2 -2
  45. package/dist/cli/chunks/{chunk-EIROAH6N.js → chunk-4QFAUSWQ.js} +2 -2
  46. package/dist/cli/chunks/{chunk-ZEMXMDD3.js → chunk-5ER3COX3.js} +2 -2
  47. package/dist/cli/chunks/{chunk-ECPB7IAH.js → chunk-5EWWA4QP.js} +4 -4
  48. package/dist/cli/chunks/{chunk-AUVC3DDB.js → chunk-5G5AAEFF.js} +2 -2
  49. package/dist/cli/chunks/{chunk-RRLQFFCO.js → chunk-5IBJURYB.js} +3 -3
  50. package/dist/cli/chunks/chunk-5LON3MLI.js +2 -0
  51. package/dist/cli/chunks/{chunk-WMG5F6R6.js → chunk-5SGEOO2F.js} +2 -2
  52. package/dist/cli/chunks/{chunk-SQBB2DC6.js → chunk-6B4S7PKP.js} +3 -3
  53. package/dist/cli/chunks/{chunk-H44WD7QX.js → chunk-6FL3GN4T.js} +2 -2
  54. package/dist/cli/chunks/{chunk-7MSYTHZM.js → chunk-6GCOIIHY.js} +2 -2
  55. package/dist/cli/chunks/{chunk-KKNBYXYA.js → chunk-6Q2PPOOF.js} +1 -1
  56. package/dist/cli/chunks/{chunk-K4T3RDCB.js → chunk-6ZK24V2Y.js} +2 -2
  57. package/dist/cli/chunks/{chunk-G3BQU3Q6.js → chunk-72LE6PHL.js} +3 -3
  58. package/dist/cli/chunks/{chunk-F3OVFA6W.js → chunk-7RMZAVGO.js} +2 -2
  59. package/dist/cli/chunks/{chunk-YYWIA5FX.js → chunk-7SEHQTYD.js} +1 -1
  60. package/dist/cli/chunks/{chunk-UU2Q6XWF.js → chunk-7YYTTWGY.js} +1 -1
  61. package/dist/cli/chunks/{chunk-XKOKMS5A.js → chunk-7ZSPCGTI.js} +2 -2
  62. package/dist/cli/chunks/{chunk-RWYW573C.js → chunk-ADV4DH3W.js} +5 -5
  63. package/dist/cli/chunks/{chunk-OC3OJWLB.js → chunk-AEJVOJPT.js} +2 -2
  64. package/dist/cli/chunks/{chunk-2UN4DOBJ.js → chunk-B5MMDMH6.js} +2 -2
  65. package/dist/cli/chunks/{chunk-WQEZKAUR.js → chunk-BO2OV2RH.js} +2 -2
  66. package/dist/cli/chunks/{chunk-NPSBMDVU.js → chunk-BT3QLWII.js} +2 -2
  67. package/dist/cli/chunks/{chunk-6VQ5MFJ6.js → chunk-BWP3UVPE.js} +7 -7
  68. package/dist/cli/chunks/{chunk-SLNGJW4G.js → chunk-C6BBRM2J.js} +1 -1
  69. package/dist/cli/chunks/{chunk-4AWJ5PE4.js → chunk-CAMEFWRK.js} +1 -1
  70. package/dist/cli/chunks/{chunk-BECU52UY.js → chunk-CNEWYJKT.js} +4 -4
  71. package/dist/cli/chunks/{chunk-EO4B5GS4.js → chunk-CTDO2UB2.js} +1 -1
  72. package/dist/cli/chunks/{chunk-GTGONWGX.js → chunk-D2FBUOAR.js} +1 -1
  73. package/dist/cli/chunks/{chunk-OQP5OFRR.js → chunk-DF3MJ2YL.js} +1 -1
  74. package/dist/cli/chunks/{chunk-KEC5FBAW.js → chunk-DY5KEOHX.js} +1 -1
  75. package/dist/cli/chunks/{chunk-EBQ6YKP2.js → chunk-E2BJT6A7.js} +3 -3
  76. package/dist/cli/chunks/{chunk-WDTCCPK4.js → chunk-EETVN2OJ.js} +1 -1
  77. package/dist/cli/chunks/{chunk-UDVX34ZG.js → chunk-ERYMAYJW.js} +20 -17
  78. package/dist/cli/chunks/{chunk-ELUERFGA.js → chunk-FJGSEPFL.js} +2 -2
  79. package/dist/cli/chunks/{chunk-BN7ERYXI.js → chunk-FLTPHVZ3.js} +1 -1
  80. package/dist/cli/chunks/{chunk-OVENSL64.js → chunk-FND6V2RV.js} +22 -22
  81. package/dist/cli/chunks/{chunk-5ZCVMR5E.js → chunk-FU77CDEM.js} +2 -2
  82. package/dist/cli/chunks/{chunk-VKRMVTWU.js → chunk-GELF4ILR.js} +37 -37
  83. package/dist/cli/chunks/{chunk-H22MMMYY.js → chunk-GHNNJHH3.js} +2 -2
  84. package/dist/cli/chunks/{chunk-32R7EA7B.js → chunk-GJUGSH7T.js} +3 -3
  85. package/dist/cli/chunks/{chunk-HPNEZ7YN.js → chunk-GL3HZN3O.js} +1 -1
  86. package/dist/cli/chunks/{chunk-WL2J6ECN.js → chunk-H56AROF2.js} +2 -2
  87. package/dist/cli/chunks/{chunk-GTRXZJNX.js → chunk-HAO3SPOE.js} +2 -2
  88. package/dist/cli/chunks/{chunk-PUXDXIUE.js → chunk-HM523MTQ.js} +1 -1
  89. package/dist/cli/chunks/{chunk-KRXKU54J.js → chunk-HMFEPKAR.js} +2 -2
  90. package/dist/cli/chunks/{chunk-3YOPJ7DY.js → chunk-HQJMCTWN.js} +2 -2
  91. package/dist/cli/chunks/{chunk-LF7URN2X.js → chunk-HRLXU4LH.js} +2 -2
  92. package/dist/cli/chunks/{chunk-TL5F2S3Z.js → chunk-HWM2XJ3P.js} +24 -24
  93. package/dist/cli/chunks/{chunk-6A2NIR2E.js → chunk-I42R57ON.js} +2 -2
  94. package/dist/cli/chunks/chunk-IL2KOW5W.js +2 -0
  95. package/dist/cli/chunks/{chunk-CR4ERDS2.js → chunk-IRR7YA3Q.js} +2 -2
  96. package/dist/cli/chunks/{chunk-Y2DPXMOR.js → chunk-JD2PG4KS.js} +1 -1
  97. package/dist/cli/chunks/{chunk-TFNLXAK5.js → chunk-JE3C7JYN.js} +1 -1
  98. package/dist/cli/chunks/{chunk-ZTMWJQTZ.js → chunk-JLL27IGU.js} +2 -2
  99. package/dist/cli/chunks/{chunk-YPOTBXPU.js → chunk-JOLDCS6X.js} +2 -2
  100. package/dist/cli/chunks/chunk-JP63XACW.js +62 -0
  101. package/dist/cli/chunks/{chunk-AABKTWXC.js → chunk-JSFYPLMQ.js} +2 -2
  102. package/dist/cli/chunks/{chunk-KCTH5MHE.js → chunk-JTF6D2RJ.js} +4 -4
  103. package/dist/cli/chunks/{chunk-GRG3OP34.js → chunk-JTZ3Q2QS.js} +2 -2
  104. package/dist/cli/chunks/chunk-JXIPRMAY.js +95 -0
  105. package/dist/cli/chunks/{chunk-TNGGVMPQ.js → chunk-KG5SM36Y.js} +1 -1
  106. package/dist/cli/chunks/{chunk-QNW335PD.js → chunk-KTRB3L53.js} +2 -2
  107. package/dist/cli/chunks/{chunk-XRK7FBTY.js → chunk-L74CHKFR.js} +2 -2
  108. package/dist/cli/chunks/{chunk-IHDUWPFY.js → chunk-LZ6TNTGO.js} +2 -2
  109. package/dist/cli/chunks/{chunk-Y357YFLF.js → chunk-M5CDW2ZH.js} +2 -2
  110. package/dist/cli/chunks/{chunk-GRYXNWPF.js → chunk-MBSJ5G4I.js} +12 -12
  111. package/dist/cli/chunks/{chunk-IPRDHKSI.js → chunk-MC7K44M4.js} +2 -2
  112. package/dist/cli/chunks/{chunk-TP77PNN6.js → chunk-MQOFFRTA.js} +2 -2
  113. package/dist/cli/chunks/{chunk-JLKHPIQF.js → chunk-N7IBYDW5.js} +1 -1
  114. package/dist/cli/chunks/{chunk-G5DTENO3.js → chunk-NEYYLAYS.js} +5 -5
  115. package/dist/cli/chunks/{chunk-TNVYKYTO.js → chunk-NNVXHC74.js} +3 -3
  116. package/dist/cli/chunks/{chunk-HRDGN3OK.js → chunk-NNZMEYLT.js} +1 -1
  117. package/dist/cli/chunks/{chunk-25QGPRWN.js → chunk-NRCL3WCP.js} +2 -2
  118. package/dist/cli/chunks/{chunk-NRLT44YB.js → chunk-NXPFGPHV.js} +1 -1
  119. package/dist/cli/chunks/{chunk-PXFQSVA2.js → chunk-NZHOKLII.js} +3 -3
  120. package/dist/cli/chunks/{chunk-7SQD2TTQ.js → chunk-OG7CWWFR.js} +1 -1
  121. package/dist/cli/chunks/{chunk-XGUQYVJR.js → chunk-OPDTDKN3.js} +2 -2
  122. package/dist/cli/chunks/{chunk-2KTRRSKD.js → chunk-OX4R55T3.js} +2 -2
  123. package/dist/cli/chunks/{chunk-COZDJLIL.js → chunk-PFCAMX6H.js} +1 -1
  124. package/dist/cli/chunks/{chunk-UDFLR7GR.js → chunk-PL5SLO2W.js} +1 -1
  125. package/dist/cli/chunks/{chunk-6ZRMQXVL.js → chunk-PZHZPX3O.js} +4 -4
  126. package/dist/cli/chunks/{chunk-57NJQV57.js → chunk-Q7EBD24B.js} +1 -1
  127. package/dist/cli/chunks/{chunk-6D57DWQ6.js → chunk-QEODION5.js} +2 -2
  128. package/dist/cli/chunks/{chunk-K22TPWOJ.js → chunk-QM65UGPV.js} +2 -2
  129. package/dist/cli/chunks/{chunk-2ETDES5W.js → chunk-QWG76RHA.js} +2 -2
  130. package/dist/cli/chunks/{chunk-GXJ4BCGC.js → chunk-R5ONQAQL.js} +2 -2
  131. package/dist/cli/chunks/{chunk-KZJXVIAW.js → chunk-RNF47IJ5.js} +4 -4
  132. package/dist/cli/chunks/{chunk-IK6AJX3C.js → chunk-RTDHWOAG.js} +1 -1
  133. package/dist/cli/chunks/{chunk-NQZYUH6S.js → chunk-RZCAA2PZ.js} +1 -1
  134. package/dist/cli/chunks/{chunk-DQIS6J77.js → chunk-SL6YZAT4.js} +2 -2
  135. package/dist/cli/chunks/{chunk-RPL6K623.js → chunk-SNTMAVPH.js} +5 -5
  136. package/dist/cli/chunks/{chunk-MQYTW2IN.js → chunk-SWOG3PBD.js} +2 -2
  137. package/dist/cli/chunks/{chunk-DMIYWPQQ.js → chunk-T63EK6GH.js} +2 -2
  138. package/dist/cli/chunks/chunk-U6UK3UMX.js +59 -0
  139. package/dist/cli/chunks/{chunk-2S4XHK26.js → chunk-U7NMPZE2.js} +2 -2
  140. package/dist/cli/chunks/{chunk-WS4XVJHI.js → chunk-UDV4YB42.js} +1 -1
  141. package/dist/cli/chunks/{chunk-P7T5Y735.js → chunk-UHDBM7QS.js} +2 -2
  142. package/dist/cli/chunks/{chunk-5EU2VQK3.js → chunk-UIJFU4KD.js} +2 -2
  143. package/dist/cli/chunks/{chunk-Q24OJX44.js → chunk-USFZ4IJD.js} +2 -2
  144. package/dist/cli/chunks/{chunk-Q5VHBI4U.js → chunk-UZL366ZI.js} +1 -1
  145. package/dist/cli/chunks/{chunk-GMKGLZJU.js → chunk-VDTFRMES.js} +2 -2
  146. package/dist/cli/chunks/{chunk-EUJHHXE6.js → chunk-VIWIO27R.js} +3 -3
  147. package/dist/cli/chunks/{chunk-PLRSKAFZ.js → chunk-VRXY4T22.js} +2 -2
  148. package/dist/cli/chunks/{chunk-NDCPEXDN.js → chunk-WPVCSFDA.js} +2 -2
  149. package/dist/cli/chunks/{chunk-TX7SNQKL.js → chunk-WWD5IWTV.js} +1 -1
  150. package/dist/cli/chunks/{chunk-T3UXMPXX.js → chunk-X2B7SANM.js} +1 -1
  151. package/dist/cli/chunks/{chunk-7CKVAYP3.js → chunk-X3RJ6SFC.js} +1 -1
  152. package/dist/cli/chunks/{chunk-6LRCMFLV.js → chunk-XTP2GHI7.js} +2 -2
  153. package/dist/cli/chunks/{chunk-W6ZF2CPN.js → chunk-YDDZJCKY.js} +1 -1
  154. package/dist/cli/chunks/{chunk-5KFCH7RH.js → chunk-YDKYLNKZ.js} +1 -1
  155. package/dist/cli/chunks/{chunk-ELZ67OHQ.js → chunk-YIYV2JB6.js} +2 -2
  156. package/dist/cli/chunks/{chunk-PW6MOFXG.js → chunk-YX2HY4MX.js} +2 -2
  157. package/dist/cli/chunks/{chunk-DVOH75S4.js → chunk-YXH2CVAF.js} +1 -1
  158. package/dist/cli/chunks/{chunk-IITKJCPK.js → chunk-YYAPO3CU.js} +3 -3
  159. package/dist/cli/chunks/{chunk-5OTYBWRL.js → chunk-Z2K5IZM6.js} +2 -2
  160. package/dist/cli/chunks/{chunk-NOCYYXK4.js → chunk-ZG4P3DTL.js} +2 -2
  161. package/dist/cli/chunks/{chunk-YGRTMAWB.js → chunk-ZXQNE4QV.js} +1 -1
  162. package/dist/cli/chunks/{ci-EHRUN7O6.js → ci-AWZ3S5OT.js} +6 -6
  163. package/dist/cli/chunks/{ci-output-EXDXVXKB.js → ci-output-JLCYTIMT.js} +2 -2
  164. package/dist/cli/chunks/{circuit-breaker-LM4QRAAL.js → circuit-breaker-BJDKBDIL.js} +2 -2
  165. package/dist/cli/chunks/{claude-flow-setup-ZHUCZVW7.js → claude-flow-setup-KKOP5ZMO.js} +2 -2
  166. package/dist/cli/chunks/client-2UKBYFX4.js +2 -0
  167. package/dist/cli/chunks/{cline-installer-WMFLQOW2.js → cline-installer-7M525SEA.js} +2 -2
  168. package/dist/cli/chunks/{code-L7KRLU5E.js → code-27SUVJDO.js} +20 -19
  169. package/dist/cli/chunks/{code-index-extractor-FTMUYQC6.js → code-index-extractor-TTQQZLAK.js} +2 -2
  170. package/dist/cli/chunks/{codex-installer-B3F6WI3Z.js → codex-installer-GHNGNPKP.js} +2 -2
  171. package/dist/cli/chunks/{completions-3JZQRNB6.js → completions-JPJD24DG.js} +2 -2
  172. package/dist/cli/chunks/{complexity-analyzer-LB2FFEKX.js → complexity-analyzer-Q74EJV33.js} +2 -2
  173. package/dist/cli/chunks/{continuedev-installer-WH6IMV7R.js → continuedev-installer-ULTRDIML.js} +2 -2
  174. package/dist/cli/chunks/{copilot-installer-NOIEOFJM.js → copilot-installer-EK52X4CG.js} +2 -2
  175. package/dist/cli/chunks/{cost-tracker-IKX2VYSA.js → cost-tracker-2GKBRYXL.js} +2 -2
  176. package/dist/cli/chunks/{coverage-TD37CYSY.js → coverage-YCLC3W2A.js} +3 -3
  177. package/dist/cli/chunks/cross-domain-router-FPM3L27L.js +2 -0
  178. package/dist/cli/chunks/{cursor-installer-4NSVGRM5.js → cursor-installer-B3ALFW5E.js} +2 -2
  179. package/dist/cli/chunks/{daemon-UWEBUIDT.js → daemon-YWINEHG4.js} +4 -4
  180. package/dist/cli/chunks/{daemon-LYDV7NRW.js → daemon-ZKEBVLJA.js} +3 -3
  181. package/dist/cli/chunks/{dag-attention-scheduler-NECJGCHC.js → dag-attention-scheduler-OQPJ6ULA.js} +2 -2
  182. package/dist/cli/chunks/{detect-4XGC7ILO.js → detect-YMYIQH3Q.js} +2 -2
  183. package/dist/cli/chunks/{dist-node-GGJDXRKJ.js → dist-node-R4FAYQRY.js} +2 -2
  184. package/dist/cli/chunks/{domain-handler-UOFONAUT.js → domain-handler-IGWXLF2S.js} +2 -2
  185. package/dist/cli/chunks/{domain-transfer-6JLNOYPA.js → domain-transfer-A7YNO76C.js} +2 -2
  186. package/dist/cli/chunks/dream-XM33US3V.js +2 -0
  187. package/dist/cli/chunks/{embed-and-insert-pattern-ZM75DQ4J.js → embed-and-insert-pattern-KODZAS7Y.js} +2 -2
  188. package/dist/cli/chunks/{eval-CYZJTHEB.js → eval-ALQW7Q2S.js} +3 -3
  189. package/dist/cli/chunks/{experience-capture-middleware-RBOJLDUB.js → experience-capture-middleware-3WK4RXWK.js} +3 -3
  190. package/dist/cli/chunks/{fast-paths-S5BWZR3L.js → fast-paths-PQWDFIJZ.js} +2 -2
  191. package/dist/cli/chunks/{feature-flags-DUNQPDU3.js → feature-flags-6X33B3WX.js} +2 -2
  192. package/dist/cli/chunks/{feature-flags-6E7H3NYP.js → feature-flags-JRUAZCND.js} +2 -2
  193. package/dist/cli/chunks/{file-discovery-PFFKDGYG.js → file-discovery-SA3YU3IH.js} +2 -2
  194. package/dist/cli/chunks/{fleet-RCDZZFXN.js → fleet-7TXCAOKQ.js} +3 -3
  195. package/dist/cli/chunks/{gnn-wrapper-5AG3WDWF.js → gnn-wrapper-ZKNYACEC.js} +2 -2
  196. package/dist/cli/chunks/{heartbeat-handler-O2KAEX4Y.js → heartbeat-handler-KRZRZ23F.js} +4 -4
  197. package/dist/cli/chunks/heartbeat-scheduler-GM3M2MTG.js +2 -0
  198. package/dist/cli/chunks/hnsw-adapter-K62GEHIL.js +2 -0
  199. package/dist/cli/chunks/hnsw-index-VCAK3TWN.js +2 -0
  200. package/dist/cli/chunks/{hnsw-legacy-bridge-C7FG6YGW.js → hnsw-legacy-bridge-LVHQ5SG7.js} +2 -2
  201. package/dist/cli/chunks/{better-sqlite3-XGPW4HK5.js → hnswlib-node-64EGGWIC.js} +2 -2
  202. package/dist/cli/chunks/{hooks-FUHNE2P7.js → hooks-6Y3UHYI2.js} +14 -14
  203. package/dist/cli/chunks/hybrid-router-432QNCNG.js +2 -0
  204. package/dist/cli/chunks/{hypergraph-engine-LQRYBNPV.js → hypergraph-engine-2EZBZMFK.js} +2 -2
  205. package/dist/cli/chunks/{hypergraph-handler-AFFNLZVD.js → hypergraph-handler-GLPWYII2.js} +3 -3
  206. package/dist/cli/chunks/impact-analyzer-VTSISNN4.js +2 -0
  207. package/dist/cli/chunks/{init-handler-BQ6IDBX4.js → init-handler-ZSDO5VMA.js} +6 -6
  208. package/dist/cli/chunks/init-wizard-COB5AH7Q.js +2 -0
  209. package/dist/cli/chunks/kernel-ROK7X5FM.js +2 -0
  210. package/dist/cli/chunks/{kilocode-installer-KS72HUSG.js → kilocode-installer-ATYSDWIV.js} +2 -2
  211. package/dist/cli/chunks/{kiro-installer-2ZEFLGRX.js → kiro-installer-K66YT6PC.js} +2 -2
  212. package/dist/cli/chunks/knowledge-graph-YUWIDIWW.js +2 -0
  213. package/dist/cli/chunks/{learning-GGHGJ6B6.js → learning-BVYCC4RI.js} +3 -3
  214. package/dist/cli/chunks/{llm-router-LP6K5BJF.js → llm-router-VBCXE6DN.js} +12 -12
  215. package/dist/cli/chunks/llm-router-service-7VLXJ7VE.js +2 -0
  216. package/dist/cli/chunks/{load-2MLKXOT2.js → load-AREDQE2U.js} +2 -2
  217. package/dist/cli/chunks/load-test-32524DL3.js +2 -0
  218. package/dist/cli/chunks/{mcp-CDJBJG5H.js → mcp-NG6H6UC5.js} +2 -2
  219. package/dist/cli/chunks/{memory-4LAX7JZS.js → memory-Y65EHG6N.js} +5 -5
  220. package/dist/cli/chunks/memory-backend-BI2V5AAB.js +2 -0
  221. package/dist/cli/chunks/memory-handlers-NSOFWVFN.js +2 -0
  222. package/dist/cli/chunks/{multi-model-executor-SLJV73HE.js → multi-model-executor-VRPRFUZT.js} +2 -2
  223. package/dist/cli/chunks/{opencode-installer-M76SONWV.js → opencode-installer-CKQXPM5R.js} +3 -3
  224. package/dist/cli/chunks/{orchestrator-TJPUDJMP.js → orchestrator-I7JBKD6G.js} +19 -19
  225. package/dist/cli/chunks/{pipeline-2PVNFT6J.js → pipeline-MV2RWCBI.js} +2 -2
  226. package/dist/cli/chunks/{platform-KCSEDKEE.js → platform-VU5P3SOG.js} +2 -2
  227. package/dist/cli/chunks/{plugin-QX47QF5U.js → plugin-6TERLKCB.js} +2 -2
  228. package/dist/cli/chunks/{prime-radiant-advanced-wasm-L6VWL7VR.js → prime-radiant-advanced-wasm-WIUIN2DL.js} +2 -2
  229. package/dist/cli/chunks/protocol-executor-2UPB7SPI.js +2 -0
  230. package/dist/cli/chunks/{protocol-handler-WDNJDEUE.js → protocol-handler-HKWBGARO.js} +2 -2
  231. package/dist/cli/chunks/{prove-3B75DA3S.js → prove-7CQPHBRJ.js} +2 -2
  232. package/dist/cli/chunks/provider-manager-PDT37MIJ.js +2 -0
  233. package/dist/cli/chunks/qe-reasoning-bank-AQQ2BI4V.js +2 -0
  234. package/dist/cli/chunks/{quality-UGASS5WM.js → quality-VLUVXKVG.js} +2 -2
  235. package/dist/cli/chunks/queen-coordinator-6DVDVEU4.js +2 -0
  236. package/dist/cli/chunks/{real-embeddings-COBP2LHS.js → real-embeddings-JPZ64KK2.js} +2 -2
  237. package/dist/cli/chunks/{roocode-installer-TOZ4VLFT.js → roocode-installer-NONVB3UE.js} +2 -2
  238. package/dist/cli/chunks/router-O2G4KQ6L.js +2 -0
  239. package/dist/cli/chunks/routing-feedback-TAGTD3KQ.js +2 -0
  240. package/dist/cli/chunks/{routing-handler-5TDVSILX.js → routing-handler-YYXDT4J2.js} +2 -2
  241. package/dist/cli/chunks/{ruvector-commands-AM63KWQN.js → ruvector-commands-5PFMNDLR.js} +2 -2
  242. package/dist/cli/chunks/{rvf-dual-writer-UANIFE2M.js → rvf-dual-writer-TF6H7AXH.js} +2 -2
  243. package/dist/cli/chunks/{rvf-migration-adapter-LNPYWAPI.js → rvf-migration-adapter-VNGIUZCO.js} +2 -2
  244. package/dist/cli/chunks/{rvf-migration-coordinator-U47L63DQ.js → rvf-migration-coordinator-VA52YAIY.js} +2 -2
  245. package/dist/cli/chunks/rvf-native-adapter-46GRWQJR.js +2 -0
  246. package/dist/cli/chunks/safe-db-LNIPXXHH.js +2 -0
  247. package/dist/cli/chunks/schedule-AUH3ZALY.js +2 -0
  248. package/dist/cli/chunks/scheduler-KK3OYPWW.js +2 -0
  249. package/dist/cli/chunks/{security-KDQ2AH7G.js → security-62HEETBF.js} +3 -3
  250. package/dist/cli/chunks/{shared-rvf-adapter-5MAGLLYJ.js → shared-rvf-adapter-XWTQPGCT.js} +2 -2
  251. package/dist/cli/chunks/{shared-rvf-dual-writer-GF2OPPM5.js → shared-rvf-dual-writer-JTZK7LRD.js} +2 -2
  252. package/dist/cli/chunks/sqlite-persistence-CYESP7NG.js +2 -0
  253. package/dist/cli/chunks/{status-handler-XZKEL7LO.js → status-handler-LSUPUKRF.js} +2 -2
  254. package/dist/cli/chunks/{structural-health-27QKWW25.js → structural-health-Z75A666N.js} +2 -2
  255. package/dist/cli/chunks/{sync-INNKS6UK.js → sync-M3O4T3A3.js} +2 -2
  256. package/dist/cli/chunks/{sync-V3HGPEJT.js → sync-VI37UHHH.js} +2 -2
  257. package/dist/cli/chunks/{task-handler-LDUVOM6G.js → task-handler-AQBSZAQC.js} +2 -2
  258. package/dist/cli/chunks/{task-handlers-HTCPV7OO.js → task-handlers-BOZP247V.js} +3 -3
  259. package/dist/cli/chunks/{test-PCUVGVJL.js → test-FTEGPNN2.js} +4 -4
  260. package/dist/cli/chunks/{test-scheduling-GYVXWCAA.js → test-scheduling-IGR4U2VQ.js} +4 -4
  261. package/dist/cli/chunks/{token-bootstrap-MJ2ANC4P.js → token-bootstrap-2DFRVMBM.js} +2 -2
  262. package/dist/cli/chunks/{token-usage-ZREHROTF.js → token-usage-VCHV47EO.js} +3 -3
  263. package/dist/cli/chunks/{transformers-6B3FWFYL.js → transformers-M27QSNFH.js} +2 -2
  264. package/dist/cli/chunks/tree-sitter-wasm-parser-IIGEJYFU.js +2 -0
  265. package/dist/cli/chunks/{types-MVZTJI2F.js → types-RQFPUUKA.js} +2 -2
  266. package/dist/cli/chunks/unified-memory-RISHEANP.js +2 -0
  267. package/dist/cli/chunks/unified-memory-hnsw-2IKXGMNZ.js +2 -0
  268. package/dist/cli/chunks/unified-persistence-ZTTUJNTU.js +2 -0
  269. package/dist/cli/chunks/{upgrade-MKTFEILD.js → upgrade-VJMYX3AL.js} +2 -2
  270. package/dist/cli/chunks/{validate-IABGALSW.js → validate-ML7HUAU5.js} +4 -4
  271. package/dist/cli/chunks/{validate-swarm-RHF53RF6.js → validate-swarm-RCR6EYRC.js} +7 -7
  272. package/dist/cli/chunks/{vibium-RAKW6FMF.js → vibium-ZOOS3W5L.js} +2 -2
  273. package/dist/cli/chunks/visual-security-D66DTAO5.js +2 -0
  274. package/dist/cli/chunks/{web-tree-sitter-PYK7F4JZ.js → web-tree-sitter-2YPGYLWK.js} +2 -2
  275. package/dist/cli/chunks/{windsurf-installer-S3U2HWZ4.js → windsurf-installer-GOJWUWC5.js} +2 -2
  276. package/dist/cli/chunks/{witness-chain-435NKQLB.js → witness-chain-3MGSS3Q4.js} +2 -2
  277. package/dist/cli/chunks/witness-chain-RHWHHDLV.js +2 -0
  278. package/dist/cli/chunks/{workflow-5UHJCZ6J.js → workflow-B5Q77BI4.js} +4 -4
  279. package/dist/cli/chunks/workflow-orchestrator-OQMFW2TC.js +2 -0
  280. package/dist/cli/chunks/{wrappers-RD3NCMLK.js → wrappers-MM5VLEPG.js} +2 -2
  281. package/dist/cli/commands/code.js +6 -0
  282. package/dist/cli/commands/hooks-handlers/command-hooks.js +1 -1
  283. package/dist/cli/commands/hooks-handlers/routing-hooks.js +1 -1
  284. package/dist/cli/commands/hooks-handlers/task-hooks.js +1 -1
  285. package/dist/cli/commands/learning.js +5 -5
  286. package/dist/cli/commands/llm-router.js +1 -1
  287. package/dist/cli/commands/workflow.js +1 -0
  288. package/dist/coordination/consensus/providers/native-learning-provider.d.ts +1 -1
  289. package/dist/coordination/consensus/providers/ollama-provider.d.ts +1 -1
  290. package/dist/coordination/consensus/providers/openrouter-provider.d.ts +1 -1
  291. package/dist/coordination/handlers/code-intelligence-handlers.js +6 -0
  292. package/dist/coordination/mincut/neural-goap.js +24 -20
  293. package/dist/coordination/protocols/code-intelligence-index.js +31 -25
  294. package/dist/coordination/queen-coordinator.js +4 -0
  295. package/dist/coordination/queen-work-stealing.js +1 -2
  296. package/dist/domains/chaos-resilience/coordinator.js +19 -15
  297. package/dist/domains/chaos-resilience/services/chaos-engineer.js +5 -2
  298. package/dist/domains/chaos-resilience/services/load-tester.js +15 -11
  299. package/dist/domains/code-intelligence/interfaces.d.ts +5 -0
  300. package/dist/domains/code-intelligence/services/c4-model/index.js +12 -6
  301. package/dist/domains/code-intelligence/services/impact-analyzer.js +6 -2
  302. package/dist/domains/code-intelligence/services/knowledge-graph.d.ts +42 -0
  303. package/dist/domains/code-intelligence/services/knowledge-graph.js +278 -93
  304. package/dist/domains/code-intelligence/services/semantic-analyzer.js +8 -2
  305. package/dist/domains/contract-testing/coordinator.js +1 -1
  306. package/dist/domains/coverage-analysis/coordinator.js +4 -2
  307. package/dist/domains/learning-optimization/coordinator.js +1 -0
  308. package/dist/domains/quality-assessment/coherence/gate-controller.js +32 -26
  309. package/dist/domains/requirements-validation/coordinator.js +1 -0
  310. package/dist/domains/test-execution/services/e2e/wait-condition-handler.js +1 -1
  311. package/dist/domains/test-execution/services/retry-handler.js +18 -12
  312. package/dist/domains/test-generation/coordinator.js +1 -1
  313. package/dist/domains/test-generation/services/pattern-matcher.js +7 -5
  314. package/dist/domains/test-generation/services/test-generator.js +3 -2
  315. package/dist/domains/visual-accessibility/coordinator.js +24 -20
  316. package/dist/index.d.ts +2 -2
  317. package/dist/index.js +2 -2
  318. package/dist/init/init-wizard-hooks.js +271 -271
  319. package/dist/init/phases/07-hooks.d.ts +7 -0
  320. package/dist/init/phases/07-hooks.js +132 -96
  321. package/dist/init/phases/12-verification.js +3 -3
  322. package/dist/integrations/agentic-flow/model-router/router.js +1 -1
  323. package/dist/integrations/embeddings/base/EmbeddingGenerator.js +11 -7
  324. package/dist/integrations/ruvector/hypergraph-engine.js +2 -2
  325. package/dist/integrations/ruvector/spectral-math.js +2 -2
  326. package/dist/integrations/ruvector/spectral-sparsifier.js +1 -1
  327. package/dist/kernel/kernel.js +1 -1
  328. package/dist/kernel/unified-memory-hnsw.js +1 -0
  329. package/dist/learning/agent-routing.d.ts +19 -0
  330. package/dist/learning/agent-routing.js +27 -1
  331. package/dist/learning/dream/dream-scheduler.d.ts +11 -36
  332. package/dist/learning/dream/dream-scheduler.js +44 -0
  333. package/dist/learning/experience-capture.js +1 -1
  334. package/dist/learning/experience-consolidation.d.ts +16 -0
  335. package/dist/learning/experience-consolidation.js +55 -11
  336. package/dist/learning/pattern-lifecycle.d.ts +21 -0
  337. package/dist/learning/pattern-lifecycle.js +70 -6
  338. package/dist/learning/qe-reasoning-bank.js +9 -1
  339. package/dist/learning/qe-unified-memory.js +8 -6
  340. package/dist/mcp/bundle.js +371 -368
  341. package/dist/mcp/handlers/core-handlers.js +2 -2
  342. package/dist/mcp/handlers/cross-phase-handlers.js +5 -3
  343. package/dist/mcp/handlers/handler-factory.d.ts +5 -0
  344. package/dist/mcp/handlers/handler-factory.js +44 -4
  345. package/dist/mcp/http-server.js +1 -0
  346. package/dist/mcp/protocol-server.js +15 -16
  347. package/dist/mcp/tools/code-intelligence/analyze.js +1 -1
  348. package/dist/mcp/tools/learning-optimization/optimize.js +1 -1
  349. package/dist/mcp/tools/qx-analysis/heuristics-engine.js +195 -173
  350. package/dist/mcp/tools/visual-accessibility/index.js +1 -1
  351. package/dist/mcp/transport/stdio.d.ts +20 -0
  352. package/dist/mcp/transport/stdio.js +35 -2
  353. package/dist/mcp/transport/websocket/websocket-transport.js +1 -0
  354. package/dist/optimization/auto-tuner.js +1 -1
  355. package/dist/planning/goap-planner.js +1 -0
  356. package/dist/routing/agent-dependency-graph.js +4 -1
  357. package/dist/shared/llm/router/config-store.js +1 -1
  358. package/dist/shared/metrics/system-metrics.js +6 -4
  359. package/dist/shared/parsers/tree-sitter-wasm-parser.d.ts +12 -0
  360. package/dist/shared/parsers/tree-sitter-wasm-parser.js +35 -0
  361. package/dist/shared/parsers/treesitter-ts-extractor.d.ts +39 -0
  362. package/dist/shared/parsers/treesitter-ts-extractor.js +196 -0
  363. package/dist/shared/utils/rabitq.d.ts +133 -0
  364. package/dist/shared/utils/rabitq.js +201 -0
  365. package/dist/shared/utils/safe-expression-evaluator.js +8 -5
  366. package/dist/sync/cloud/postgres-writer.js +2 -0
  367. package/dist/sync/readers/json-reader.js +1 -1
  368. package/dist/test-scheduling/git-aware/test-selector.js +1 -1
  369. package/dist/workers/quality-daemon/index.js +26 -24
  370. package/package.json +12 -5
  371. package/dist/cli/chunks/adapter-3JS2CN7C.js +0 -2
  372. package/dist/cli/chunks/aqe-learning-engine-Q4GFNGU6.js +0 -2
  373. package/dist/cli/chunks/base-Q3MAL22Y.js +0 -2
  374. package/dist/cli/chunks/browser-workflow-JX3M2UWG.js +0 -2
  375. package/dist/cli/chunks/chunk-622MIAOR.js +0 -59
  376. package/dist/cli/chunks/chunk-CKECJH2A.js +0 -2
  377. package/dist/cli/chunks/chunk-IJ4BUSJN.js +0 -95
  378. package/dist/cli/chunks/chunk-VPCE5CIT.js +0 -2
  379. package/dist/cli/chunks/chunk-WO7KYT3X.js +0 -62
  380. package/dist/cli/chunks/client-PA3UJIHH.js +0 -2
  381. package/dist/cli/chunks/cross-domain-router-BVJRP2ZX.js +0 -2
  382. package/dist/cli/chunks/dream-BXZUEIW2.js +0 -2
  383. package/dist/cli/chunks/heartbeat-scheduler-LEKAWFJF.js +0 -2
  384. package/dist/cli/chunks/hnsw-adapter-2TCEG5M2.js +0 -2
  385. package/dist/cli/chunks/hnsw-index-VDPUTEES.js +0 -2
  386. package/dist/cli/chunks/hybrid-router-2EMDIYIG.js +0 -2
  387. package/dist/cli/chunks/impact-analyzer-HFD6CPWC.js +0 -2
  388. package/dist/cli/chunks/init-wizard-552QIVRC.js +0 -2
  389. package/dist/cli/chunks/kernel-5DN6O6EE.js +0 -2
  390. package/dist/cli/chunks/knowledge-graph-76Y77MB6.js +0 -2
  391. package/dist/cli/chunks/llm-router-service-4O6GCEFH.js +0 -2
  392. package/dist/cli/chunks/load-test-FCI2IWRJ.js +0 -2
  393. package/dist/cli/chunks/memory-backend-MKNCBNDE.js +0 -2
  394. package/dist/cli/chunks/memory-handlers-OBAFR4WV.js +0 -2
  395. package/dist/cli/chunks/protocol-executor-IA7WNT23.js +0 -2
  396. package/dist/cli/chunks/provider-manager-3K5KB5A6.js +0 -2
  397. package/dist/cli/chunks/qe-reasoning-bank-V5Z3BBYY.js +0 -2
  398. package/dist/cli/chunks/queen-coordinator-QOMPA27Z.js +0 -2
  399. package/dist/cli/chunks/router-P5RZUPC4.js +0 -2
  400. package/dist/cli/chunks/routing-feedback-3PS3OZQC.js +0 -2
  401. package/dist/cli/chunks/rvf-native-adapter-TT7OJPKM.js +0 -2
  402. package/dist/cli/chunks/safe-db-PEW7VBAE.js +0 -2
  403. package/dist/cli/chunks/schedule-QHOTHBQE.js +0 -2
  404. package/dist/cli/chunks/scheduler-KXJBYTRT.js +0 -2
  405. package/dist/cli/chunks/sqlite-persistence-TPXJK34J.js +0 -2
  406. package/dist/cli/chunks/tree-sitter-wasm-parser-JVV234MN.js +0 -2
  407. package/dist/cli/chunks/unified-memory-ROS2NKR5.js +0 -2
  408. package/dist/cli/chunks/unified-memory-hnsw-FLEUF3XO.js +0 -2
  409. package/dist/cli/chunks/unified-persistence-QC5L7UNQ.js +0 -2
  410. package/dist/cli/chunks/visual-security-NLIOUQCR.js +0 -2
  411. package/dist/cli/chunks/witness-chain-U7X6JX5J.js +0 -2
  412. package/dist/cli/chunks/workflow-orchestrator-APE6BAXH.js +0 -2
@@ -418,7 +418,7 @@ export class ExperienceCaptureService {
418
418
  * plus new { consolidated, archived } fields.
419
419
  */
420
420
  async cleanup() {
421
- let consolidated = 0;
421
+ const consolidated = 0;
422
422
  let archived = 0;
423
423
  for (const domain of this.stats.byDomain.keys()) {
424
424
  const count = this.stats.byDomain.get(domain) || 0;
@@ -18,6 +18,12 @@ import type { Database as DatabaseType } from 'better-sqlite3';
18
18
  export interface ConsolidationResult {
19
19
  /** Experiences merged into survivors */
20
20
  merged: number;
21
+ /**
22
+ * Experiences suppressed from retrieval because they CONTRADICT a
23
+ * higher-quality near-duplicate (similar context, opposite outcome).
24
+ * Soft-suppressed (consolidated_into = 'contradicted'), not deleted.
25
+ */
26
+ contradicted: number;
21
27
  /** Experiences with quality recalculated */
22
28
  qualityUpdated: number;
23
29
  /** Experiences soft-archived (Phase 3 valueless + Phase 4 safety valve) */
@@ -54,6 +60,16 @@ export interface ConsolidationConfig {
54
60
  archiveQualityThreshold: number;
55
61
  /** Quality boost per merged experience */
56
62
  mergeQualityBoost: number;
63
+ /**
64
+ * Contradiction detection (#510 item 7). Two experiences with cosine
65
+ * similarity >= this threshold but a quality delta >= contradictionQualityDelta
66
+ * are treated as "same context, opposite outcome" — a conflict, not a
67
+ * duplicate. The lower-quality loser is suppressed from retrieval instead of
68
+ * merged, so it can't poison recall.
69
+ */
70
+ contradictionSimilarityThreshold: number;
71
+ /** Min quality gap that turns a near-duplicate into a contradiction (0-1). */
72
+ contradictionQualityDelta: number;
57
73
  }
58
74
  export declare class ExperienceConsolidator {
59
75
  private readonly config;
@@ -25,6 +25,8 @@ const DEFAULT_CONFIG = {
25
25
  archiveMinAgeDays: 30,
26
26
  archiveQualityThreshold: 0.15,
27
27
  mergeQualityBoost: 0.02,
28
+ contradictionSimilarityThreshold: 0.85,
29
+ contradictionQualityDelta: 0.4,
28
30
  };
29
31
  // ============================================================================
30
32
  // ExperienceConsolidator
@@ -59,6 +61,7 @@ export class ExperienceConsolidator {
59
61
  this.ensureInitialized();
60
62
  const totalResult = {
61
63
  merged: 0,
64
+ contradicted: 0,
62
65
  qualityUpdated: 0,
63
66
  archived: 0,
64
67
  hardDeleted: 0,
@@ -73,6 +76,7 @@ export class ExperienceConsolidator {
73
76
  for (const { domain, cnt } of targetDomains) {
74
77
  const result = await this.consolidateDomain(domain, cnt);
75
78
  totalResult.merged += result.merged;
79
+ totalResult.contradicted += result.contradicted;
76
80
  totalResult.qualityUpdated += result.qualityUpdated;
77
81
  totalResult.archived += result.archived;
78
82
  totalResult.hardDeleted += result.hardDeleted;
@@ -81,8 +85,9 @@ export class ExperienceConsolidator {
81
85
  // Count total active remaining
82
86
  const activeCount = this.db.prepare("SELECT COUNT(*) as cnt FROM captured_experiences WHERE consolidated_into IS NULL").get();
83
87
  totalResult.activeRemaining = activeCount.cnt;
84
- if (totalResult.merged > 0 || totalResult.archived > 0) {
88
+ if (totalResult.merged > 0 || totalResult.archived > 0 || totalResult.contradicted > 0) {
85
89
  console.log(`[ExperienceConsolidator] Consolidated: ${totalResult.merged} merged, ` +
90
+ `${totalResult.contradicted} contradicted, ` +
86
91
  `${totalResult.archived} archived, ${totalResult.activeRemaining} active`);
87
92
  }
88
93
  return totalResult;
@@ -94,14 +99,17 @@ export class ExperienceConsolidator {
94
99
  this.ensureInitialized();
95
100
  const result = {
96
101
  merged: 0,
102
+ contradicted: 0,
97
103
  qualityUpdated: 0,
98
104
  archived: 0,
99
105
  hardDeleted: 0,
100
106
  activeRemaining: 0,
101
107
  domainsProcessed: [domain],
102
108
  };
103
- // Phase 1: Cluster & Merge
104
- result.merged = await this.clusterAndMerge(domain);
109
+ // Phase 1: Cluster & Merge (+ contradiction suppression)
110
+ const clusterResult = await this.clusterAndMerge(domain);
111
+ result.merged = clusterResult.merged;
112
+ result.contradicted = clusterResult.contradicted;
105
113
  // Phase 2: Quality Reinforcement
106
114
  result.qualityUpdated = this.reinforceQuality(domain);
107
115
  // Phase 3: Archive Valueless
@@ -129,7 +137,7 @@ export class ExperienceConsolidator {
129
137
  if (flag) {
130
138
  console.log(`[ExperienceConsolidator] Domain ${domain} already bootstrapped`);
131
139
  return {
132
- merged: 0, qualityUpdated: 0, archived: 0,
140
+ merged: 0, contradicted: 0, qualityUpdated: 0, archived: 0,
133
141
  hardDeleted: 0, activeRemaining: 0, domainsProcessed: [domain],
134
142
  };
135
143
  }
@@ -165,7 +173,7 @@ export class ExperienceConsolidator {
165
173
  ORDER BY quality DESC
166
174
  `).all(domain);
167
175
  if (candidates.length < 2)
168
- return 0;
176
+ return { merged: 0, contradicted: 0 };
169
177
  // Build a temporary HNSW index for this domain
170
178
  const hnswIndex = new HNSWEmbeddingIndex({
171
179
  dimension: 384,
@@ -196,7 +204,9 @@ export class ExperienceConsolidator {
196
204
  // Track which IDs have been absorbed
197
205
  const absorbed = new Set();
198
206
  let mergeCount = 0;
207
+ let contradictionCount = 0;
199
208
  const markConsolidated = this.db.prepare("UPDATE captured_experiences SET consolidated_into = ? WHERE id = ?");
209
+ const markContradicted = this.db.prepare("UPDATE captured_experiences SET consolidated_into = 'contradicted' WHERE id = ?");
200
210
  const boostSurvivor = this.db.prepare(`
201
211
  UPDATE captured_experiences
202
212
  SET consolidation_count = consolidation_count + ?,
@@ -210,7 +220,7 @@ export class ExperienceConsolidator {
210
220
  `);
211
221
  // Iterate experiences by quality DESC
212
222
  for (const row of candidates) {
213
- if (mergeCount >= this.config.maxMergesPerRun)
223
+ if (mergeCount + contradictionCount >= this.config.maxMergesPerRun)
214
224
  break;
215
225
  if (absorbed.has(row.id))
216
226
  continue;
@@ -232,21 +242,42 @@ export class ExperienceConsolidator {
232
242
  namespace: 'experiences',
233
243
  });
234
244
  const mergedIds = [];
245
+ const contradictedIds = [];
235
246
  for (const { id: hnswId, distance } of neighbors) {
236
- if (mergeCount >= this.config.maxMergesPerRun)
247
+ if (mergeCount + contradictionCount >= this.config.maxMergesPerRun)
237
248
  break;
238
249
  const neighborId = idMap.get(hnswId);
239
250
  if (!neighborId || neighborId === row.id || absorbed.has(neighborId))
240
251
  continue;
241
252
  const similarity = 1 - distance;
242
- if (similarity < this.config.mergeSimilarityThreshold)
253
+ // Gate on the lower of the two thresholds so neither merge nor
254
+ // contradiction detection is starved if they are configured differently.
255
+ if (similarity < Math.min(this.config.mergeSimilarityThreshold, this.config.contradictionSimilarityThreshold))
243
256
  continue;
244
257
  // Find the neighbor in candidates
245
258
  const neighbor = candidates.find(c => c.id === neighborId);
246
259
  if (!neighbor)
247
260
  continue;
248
- // Only merge lower-quality, unused neighbors into the survivor
249
- if (neighbor.quality <= row.quality && neighbor.application_count === 0) {
261
+ // Contradiction (#510 item 7): same context (high similarity) but
262
+ // opposite outcome (large quality delta) => a conflict, not a duplicate.
263
+ // Suppress the lower-quality loser from retrieval even if it was applied
264
+ // (a used-but-low-quality contradictory experience is exactly the
265
+ // recall-poisoning case). Candidates are sorted quality DESC and absorbed
266
+ // ones are skipped, so when a gap exists `neighbor` is the strict loser.
267
+ const qualityDelta = Math.abs(row.quality - neighbor.quality);
268
+ if (similarity >= this.config.contradictionSimilarityThreshold
269
+ && qualityDelta >= this.config.contradictionQualityDelta) {
270
+ if (neighbor.quality < row.quality) {
271
+ absorbed.add(neighborId);
272
+ contradictedIds.push(neighborId);
273
+ contradictionCount++;
274
+ }
275
+ continue; // never merge a contradictory pair
276
+ }
277
+ // Only merge lower-quality, unused neighbors into the survivor (requires
278
+ // the normal merge similarity threshold).
279
+ if (similarity >= this.config.mergeSimilarityThreshold
280
+ && neighbor.quality <= row.quality && neighbor.application_count === 0) {
250
281
  absorbed.add(neighborId);
251
282
  mergedIds.push(neighborId);
252
283
  mergeCount++;
@@ -264,10 +295,23 @@ export class ExperienceConsolidator {
264
295
  });
265
296
  transaction();
266
297
  }
298
+ // Apply contradiction suppressions in a transaction. The loser is
299
+ // soft-suppressed (consolidated_into = 'contradicted'), so it is excluded
300
+ // from retrieval (WHERE consolidated_into IS NULL) but not deleted. The
301
+ // survivor is NOT boosted — a contradiction is a conflict, not a duplicate.
302
+ if (contradictedIds.length > 0) {
303
+ const tx = this.db.transaction(() => {
304
+ for (const loserId of contradictedIds) {
305
+ markContradicted.run(loserId);
306
+ }
307
+ logConsolidation.run(uuidv4(), domain, 'contradiction', JSON.stringify(contradictedIds), row.id, JSON.stringify({ count: contradictedIds.length, survivorQuality: row.quality }));
308
+ });
309
+ tx();
310
+ }
267
311
  }
268
312
  // Clean up HNSW index
269
313
  hnswIndex.clearIndex('experiences');
270
- return mergeCount;
314
+ return { merged: mergeCount, contradicted: contradictionCount };
271
315
  }
272
316
  // ============================================================================
273
317
  // Phase 2: Quality Reinforcement
@@ -42,6 +42,27 @@ export interface PatternLifecycleConfig {
42
42
  * Default lifecycle configuration
43
43
  */
44
44
  export declare const DEFAULT_LIFECYCLE_CONFIG: PatternLifecycleConfig;
45
+ /** Minimum usage_count before success_rate is trusted as an importance signal. */
46
+ export declare const EWC_MIN_USAGE_FOR_PROTECTION = 5;
47
+ /**
48
+ * Fraction of the base decay rate a fully-important pattern is shielded from.
49
+ * 0.9 => a success_rate=1.0 pattern decays at 10% of the base rate.
50
+ * Low-importance patterns (importance 0) decay EXACTLY as before (no regression).
51
+ */
52
+ export declare const EWC_DECAY_PROTECTION = 0.9;
53
+ /**
54
+ * Multiplier extending the stale window by importance.
55
+ * effectiveStaleDays = staleDaysThreshold * (1 + importance * EWC_STALE_PROTECTION_BONUS).
56
+ * 2 => a fully-important pattern survives 3x longer unused (e.g. 30d -> 90d)
57
+ * before stale-deprecation; importance-0 patterns are unchanged.
58
+ */
59
+ export declare const EWC_STALE_PROTECTION_BONUS = 2;
60
+ /**
61
+ * Importance proxy in [0,1] for EWC++ forgetting protection.
62
+ * Returns 0 (no protection) until a pattern has been used enough to trust its
63
+ * success rate, then equals the clamped success rate.
64
+ */
65
+ export declare function patternImportance(successRate: number, usageCount: number): number;
45
66
  /**
46
67
  * Experience aggregation for pattern candidate identification
47
68
  */
@@ -30,6 +30,51 @@ export const DEFAULT_LIFECYCLE_CONFIG = {
30
30
  asymmetricLearning: {},
31
31
  };
32
32
  // ============================================================================
33
+ // EWC++ catastrophic-forgetting protection (#510 item 6)
34
+ // ----------------------------------------------------------------------------
35
+ // Confidence decay and stale/age deprecation were uniform: a proven,
36
+ // high-success pattern was forgotten at the same rate as noise, so an influx
37
+ // of new low-value patterns could crowd out historically valuable ones.
38
+ // Inspired by Elastic Weight Consolidation, we protect HIGH-IMPORTANCE
39
+ // patterns from being clobbered, weighted by an importance proxy.
40
+ //
41
+ // Honest framing (as in ruflo's EWC adapter): this is NOT true Fisher
42
+ // information — there are no model gradients here. Importance is a heuristic:
43
+ // success_rate gated on enough usage to trust it (and recency is already
44
+ // implied because only unused patterns decay / go stale).
45
+ //
46
+ // Protection applies ONLY to stale/age/decay forgetting. A high-importance
47
+ // pattern that STARTS failing or drops below minActiveConfidence is still
48
+ // deprecated — we blend retention, we don't permanently shield dead weight.
49
+ // ============================================================================
50
+ /** Minimum usage_count before success_rate is trusted as an importance signal. */
51
+ export const EWC_MIN_USAGE_FOR_PROTECTION = 5;
52
+ /**
53
+ * Fraction of the base decay rate a fully-important pattern is shielded from.
54
+ * 0.9 => a success_rate=1.0 pattern decays at 10% of the base rate.
55
+ * Low-importance patterns (importance 0) decay EXACTLY as before (no regression).
56
+ */
57
+ export const EWC_DECAY_PROTECTION = 0.9;
58
+ /**
59
+ * Multiplier extending the stale window by importance.
60
+ * effectiveStaleDays = staleDaysThreshold * (1 + importance * EWC_STALE_PROTECTION_BONUS).
61
+ * 2 => a fully-important pattern survives 3x longer unused (e.g. 30d -> 90d)
62
+ * before stale-deprecation; importance-0 patterns are unchanged.
63
+ */
64
+ export const EWC_STALE_PROTECTION_BONUS = 2;
65
+ /**
66
+ * Importance proxy in [0,1] for EWC++ forgetting protection.
67
+ * Returns 0 (no protection) until a pattern has been used enough to trust its
68
+ * success rate, then equals the clamped success rate.
69
+ */
70
+ export function patternImportance(successRate, usageCount) {
71
+ if (usageCount < EWC_MIN_USAGE_FOR_PROTECTION)
72
+ return 0;
73
+ if (!Number.isFinite(successRate))
74
+ return 0;
75
+ return Math.min(Math.max(successRate, 0), 1);
76
+ }
77
+ // ============================================================================
33
78
  // Pattern Lifecycle Manager
34
79
  // ============================================================================
35
80
  /**
@@ -402,12 +447,16 @@ Pattern extracted from ${exp.count} successful experiences.`;
402
447
  consecutiveFailures,
403
448
  };
404
449
  }
405
- // Check staleness
450
+ // Check staleness (EWC++ #510 item 6: high-importance patterns get a
451
+ // longer grace period before stale-deprecation, so a proven pattern that
452
+ // simply went unused isn't forgotten like noise. importance=0 => unchanged.)
406
453
  const lastUsedTime = pattern.lastUsedAt instanceof Date
407
454
  ? pattern.lastUsedAt.getTime()
408
455
  : new Date(pattern.lastUsedAt).getTime();
409
456
  const daysSinceLastUse = (Date.now() - lastUsedTime) / (1000 * 60 * 60 * 24);
410
- if (daysSinceLastUse >= this.config.staleDaysThreshold) {
457
+ const importance = patternImportance(pattern.successRate, pattern.usageCount);
458
+ const effectiveStaleDays = this.config.staleDaysThreshold * (1 + importance * EWC_STALE_PROTECTION_BONUS);
459
+ if (daysSinceLastUse >= effectiveStaleDays) {
411
460
  return {
412
461
  shouldDeprecate: true,
413
462
  reason: 'stale',
@@ -496,16 +545,25 @@ Pattern extracted from ${exp.count} successful experiences.`;
496
545
  * Apply confidence decay to patterns that haven't been used recently
497
546
  */
498
547
  applyConfidenceDecay(daysSinceLastRun = 1) {
499
- const decayFactor = 1 - (this.config.confidenceDecayRate * daysSinceLastRun);
548
+ // EWC++ (#510 item 6): per-row importance-weighted decay. The base decay
549
+ // amount is shielded by `EWC_DECAY_PROTECTION * importance`, where
550
+ // importance = success_rate (clamped) once usage_count >= the trust
551
+ // threshold, else 0. A pattern with importance 0 decays EXACTLY as before
552
+ // (1 - baseDecayAmount); a fully-proven pattern decays up to 10x slower,
553
+ // so it isn't forgotten as fast as new low-value patterns.
554
+ const baseDecayAmount = this.config.confidenceDecayRate * daysSinceLastRun;
500
555
  // Get patterns that haven't been used in the decay period
501
556
  const cutoffTime = Date.now() - (daysSinceLastRun * 24 * 60 * 60 * 1000);
502
557
  const result = this.db.prepare(`
503
558
  UPDATE qe_patterns
504
- SET confidence = MAX(?, confidence * ?),
559
+ SET confidence = MAX(?, confidence * (1 - ? * (1 - ? *
560
+ (CASE WHEN usage_count >= ?
561
+ THEN MIN(MAX(COALESCE(success_rate, 0.0), 0.0), 1.0)
562
+ ELSE 0.0 END)))),
505
563
  updated_at = datetime('now')
506
564
  WHERE deprecated_at IS NULL
507
565
  AND (last_used_at IS NULL OR datetime(last_used_at) < datetime(?, 'unixepoch'))
508
- `).run(this.config.minActiveConfidence, decayFactor, cutoffTime / 1000);
566
+ `).run(this.config.minActiveConfidence, baseDecayAmount, EWC_DECAY_PROTECTION, EWC_MIN_USAGE_FOR_PROTECTION, cutoffTime / 1000);
509
567
  return {
510
568
  updated: result.changes,
511
569
  decayed: result.changes,
@@ -765,7 +823,7 @@ Pattern extracted from ${exp.count} successful experiences.`;
765
823
  * Convert database row to QEPattern
766
824
  */
767
825
  rowToPattern(row) {
768
- return {
826
+ const pattern = {
769
827
  id: row.id,
770
828
  patternType: row.pattern_type,
771
829
  qeDomain: row.qe_domain,
@@ -785,7 +843,13 @@ Pattern extracted from ${exp.count} successful experiences.`;
785
843
  reusable: row.reusable === 1,
786
844
  reuseCount: row.reuse_count || 0,
787
845
  averageTokenSavings: row.average_token_savings || 0,
846
+ // Surface deprecation/failure columns so checkDeprecation() can read them
847
+ // (these live on qe_patterns via ensureSchema ALTERs but aren't part of
848
+ // the base QEPattern shape — see PatternWithDeprecation).
849
+ deprecated_at: row.deprecated_at ?? null,
850
+ consecutive_failures: row.consecutive_failures ?? 0,
788
851
  };
852
+ return pattern;
789
853
  }
790
854
  }
791
855
  // ============================================================================
@@ -132,10 +132,18 @@ export class QEReasoningBank {
132
132
  logger.warn('Failed to wire SQLitePatternStore into PatternStore', { error: toErrorMessage(e) });
133
133
  }
134
134
  signal?.throwIfAborted();
135
+ // Mark initialized BEFORE seeding patterns. Pattern seeding goes through
136
+ // storePattern(), which ensure-inits via `if (!this.initialized) await
137
+ // this.initialize()`. The core stores (patternStore + SQLite) are already up
138
+ // at this point, so the bank is functionally ready — setting the flag here
139
+ // stops storePattern() from recursively re-entering initialize(). With the
140
+ // flag set only AFTER seeding, that re-entry recursed without bound and hung
141
+ // every MCP domain tool on a fresh install the first time patterns were
142
+ // seeded (CPU spin via async self-recursion).
143
+ this.initialized = true;
135
144
  // Load any pre-trained patterns
136
145
  await this.loadPretrainedPatterns(signal);
137
146
  signal?.throwIfAborted();
138
- this.initialized = true;
139
147
  // Run cross-domain transfer ONCE per DB lifetime (not every init)
140
148
  // IMPORTANT: Set the flag BEFORE the transfer so that even if the transfer
141
149
  // times out (hooks.ts has a 10s timeout on initialize()), the flag persists
@@ -378,7 +378,7 @@ export class QEUnifiedMemory {
378
378
  let totalEntries = 0;
379
379
  let totalVectors = 0;
380
380
  let totalIndexSize = 0;
381
- let hnswHealthy = true;
381
+ const hnswHealthy = true;
382
382
  for (const domain of QE_MEMORY_DOMAINS) {
383
383
  let vectorCount = 0;
384
384
  let indexSize = 0;
@@ -469,7 +469,7 @@ export class QEUnifiedMemory {
469
469
  };
470
470
  }
471
471
  let itemsMigrated = 0;
472
- let itemsSkipped = 0;
472
+ const itemsSkipped = 0;
473
473
  const errors = [];
474
474
  try {
475
475
  switch (config.source) {
@@ -576,10 +576,12 @@ export class QEUnifiedMemory {
576
576
  extractRiskScore(domain, metadata) {
577
577
  switch (domain) {
578
578
  case 'defects':
579
- const defectMeta = metadata;
580
- // Map severity to risk score
581
- const severityMap = { critical: 1, high: 0.75, medium: 0.5, low: 0.25 };
582
- return severityMap[defectMeta.severity] * defectMeta.confidence;
579
+ {
580
+ const defectMeta = metadata;
581
+ // Map severity to risk score
582
+ const severityMap = { critical: 1, high: 0.75, medium: 0.5, low: 0.25 };
583
+ return severityMap[defectMeta.severity] * defectMeta.confidence;
584
+ }
583
585
  case 'quality':
584
586
  return 1 - metadata.qualityScore;
585
587
  case 'learning':