agentic-qe 3.10.1 → 3.10.2

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 (325) 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/skills-manifest.json +1 -1
  7. package/CHANGELOG.md +76 -0
  8. package/dist/cli/bundle.js +5 -5
  9. package/dist/cli/chunks/adapter-CR6J5C76.js +2 -0
  10. package/dist/cli/chunks/{agent-booster-wasm-FZLWOPSX.js → agent-booster-wasm-DHSIPFTH.js} +2 -2
  11. package/dist/cli/chunks/{agent-handler-KAGRVCKS.js → agent-handler-FPQVHGGT.js} +2 -2
  12. package/dist/cli/chunks/{agent-memory-branch-JJKFEXQW.js → agent-memory-branch-OLOF5ZHV.js} +2 -2
  13. package/dist/cli/chunks/aqe-learning-engine-2MNTHMB6.js +2 -0
  14. package/dist/cli/chunks/{audit-DN5SY4JJ.js → audit-ALRYPHGP.js} +2 -2
  15. package/dist/cli/chunks/base-AOQNGMTL.js +2 -0
  16. package/dist/cli/chunks/{hnswlib-node-YX6OOBN6.js → better-sqlite3-5BT5FO64.js} +2 -2
  17. package/dist/cli/chunks/{brain-handler-O7MP5BGY.js → brain-handler-ROZUHCOT.js} +3 -3
  18. package/dist/cli/chunks/{branch-enumerator-ZPTN5J6V.js → branch-enumerator-VK7G4NKJ.js} +2 -2
  19. package/dist/cli/chunks/{browser-PAZE2JSD.js → browser-Q2S75M2F.js} +2 -2
  20. package/dist/cli/chunks/browser-workflow-UJ4A2ZXO.js +2 -0
  21. package/dist/cli/chunks/{chunk-WDTCCPK4.js → chunk-2244IFZA.js} +1 -1
  22. package/dist/cli/chunks/{chunk-WPNZSL4S.js → chunk-22D6VBPD.js} +1 -1
  23. package/dist/cli/chunks/{chunk-2KTRRSKD.js → chunk-24LUQICS.js} +2 -2
  24. package/dist/cli/chunks/{chunk-IHDUWPFY.js → chunk-2EDWGHDA.js} +2 -2
  25. package/dist/cli/chunks/{chunk-TP77PNN6.js → chunk-2JDLQWSV.js} +2 -2
  26. package/dist/cli/chunks/{chunk-GTGONWGX.js → chunk-2OH3ALYB.js} +1 -1
  27. package/dist/cli/chunks/{chunk-WMG5F6R6.js → chunk-3RHHKYUR.js} +2 -2
  28. package/dist/cli/chunks/{chunk-6E7GI2UB.js → chunk-3Z4FHA2E.js} +1 -1
  29. package/dist/cli/chunks/{chunk-JLKHPIQF.js → chunk-4BXGVM2C.js} +1 -1
  30. package/dist/cli/chunks/{chunk-6D57DWQ6.js → chunk-4F3ZTXHP.js} +2 -2
  31. package/dist/cli/chunks/{chunk-3YOPJ7DY.js → chunk-4GTDW2XL.js} +2 -2
  32. package/dist/cli/chunks/{chunk-W2DT3CDE.js → chunk-5HB54RUS.js} +2 -2
  33. package/dist/cli/chunks/{chunk-LF7URN2X.js → chunk-5PL7WTCU.js} +2 -2
  34. package/dist/cli/chunks/{chunk-Y357YFLF.js → chunk-5PRFFHFV.js} +2 -2
  35. package/dist/cli/chunks/{chunk-GXJ4BCGC.js → chunk-5QHSLWLP.js} +2 -2
  36. package/dist/cli/chunks/{chunk-TL5F2S3Z.js → chunk-5WJ3FWL4.js} +2 -2
  37. package/dist/cli/chunks/{chunk-ZTMWJQTZ.js → chunk-6KSCXPPL.js} +2 -2
  38. package/dist/cli/chunks/{chunk-SQBB2DC6.js → chunk-6NZHEM4V.js} +1 -1
  39. package/dist/cli/chunks/{chunk-EUJHHXE6.js → chunk-6ZFHIKQG.js} +2 -2
  40. package/dist/cli/chunks/{chunk-YPOTBXPU.js → chunk-7DKYCVJI.js} +2 -2
  41. package/dist/cli/chunks/{chunk-DQIS6J77.js → chunk-7IVQ6OVR.js} +2 -2
  42. package/dist/cli/chunks/{chunk-DMIYWPQQ.js → chunk-7IZ2OPC2.js} +2 -2
  43. package/dist/cli/chunks/{chunk-VOIWDPIU.js → chunk-7QRMARM7.js} +2 -2
  44. package/dist/cli/chunks/{chunk-KEC5FBAW.js → chunk-7SJX4CFK.js} +1 -1
  45. package/dist/cli/chunks/{chunk-2S4XHK26.js → chunk-7SWD3D6Y.js} +2 -2
  46. package/dist/cli/chunks/{chunk-RRLQFFCO.js → chunk-7V5UHLNY.js} +2 -2
  47. package/dist/cli/chunks/{chunk-G3BQU3Q6.js → chunk-7Z46RDDV.js} +2 -2
  48. package/dist/cli/chunks/{chunk-TNVYKYTO.js → chunk-A5RMQG4N.js} +3 -3
  49. package/dist/cli/chunks/{chunk-PXFQSVA2.js → chunk-AH7FXNFE.js} +3 -3
  50. package/dist/cli/chunks/{chunk-K22TPWOJ.js → chunk-AIUSZC6K.js} +2 -2
  51. package/dist/cli/chunks/{chunk-IK6AJX3C.js → chunk-AOI67HA3.js} +1 -1
  52. package/dist/cli/chunks/{chunk-6VQ5MFJ6.js → chunk-AV7KYE5P.js} +7 -7
  53. package/dist/cli/chunks/{chunk-GTRXZJNX.js → chunk-AWFIEGR3.js} +2 -2
  54. package/dist/cli/chunks/{chunk-6A2NIR2E.js → chunk-BQCSCAUC.js} +2 -2
  55. package/dist/cli/chunks/{chunk-NQZYUH6S.js → chunk-C2M74HCN.js} +1 -1
  56. package/dist/cli/chunks/{chunk-5EU2VQK3.js → chunk-CIRPP7RQ.js} +2 -2
  57. package/dist/cli/chunks/{chunk-Q5VHBI4U.js → chunk-CMACGG4Z.js} +1 -1
  58. package/dist/cli/chunks/{chunk-YGRTMAWB.js → chunk-CTDLI2ON.js} +1 -1
  59. package/dist/cli/chunks/{chunk-P7T5Y735.js → chunk-CV2SBMBW.js} +2 -2
  60. package/dist/cli/chunks/{chunk-UDFLR7GR.js → chunk-DMQPO43S.js} +1 -1
  61. package/dist/cli/chunks/{chunk-XKOKMS5A.js → chunk-DRWGK3YO.js} +2 -2
  62. package/dist/cli/chunks/{chunk-EBQ6YKP2.js → chunk-DZZEHPSJ.js} +2 -2
  63. package/dist/cli/chunks/{chunk-7SQD2TTQ.js → chunk-EA7ZSN3V.js} +1 -1
  64. package/dist/cli/chunks/{chunk-KKNBYXYA.js → chunk-EQBEGDTG.js} +1 -1
  65. package/dist/cli/chunks/{chunk-2UN4DOBJ.js → chunk-ETN5563K.js} +2 -2
  66. package/dist/cli/chunks/{chunk-BECU52UY.js → chunk-EVCOCGVJ.js} +3 -3
  67. package/dist/cli/chunks/{chunk-OC3OJWLB.js → chunk-FO43SQXP.js} +2 -2
  68. package/dist/cli/chunks/{chunk-CKECJH2A.js → chunk-FO73PZVU.js} +2 -2
  69. package/dist/cli/chunks/{chunk-Y2DPXMOR.js → chunk-FPAW77XV.js} +1 -1
  70. package/dist/cli/chunks/{chunk-UDVX34ZG.js → chunk-FY3CUPNN.js} +20 -17
  71. package/dist/cli/chunks/{chunk-EIROAH6N.js → chunk-G5U6Q42D.js} +2 -2
  72. package/dist/cli/chunks/{chunk-VKRMVTWU.js → chunk-HA63NBFK.js} +9 -9
  73. package/dist/cli/chunks/{chunk-2ETDES5W.js → chunk-HHCYSAH3.js} +2 -2
  74. package/dist/cli/chunks/{chunk-57NJQV57.js → chunk-HJME6G5M.js} +1 -1
  75. package/dist/cli/chunks/{chunk-BN7ERYXI.js → chunk-HJORBNXW.js} +1 -1
  76. package/dist/cli/chunks/{chunk-5KFCH7RH.js → chunk-HO37VP4O.js} +1 -1
  77. package/dist/cli/chunks/{chunk-622MIAOR.js → chunk-I677W5BT.js} +3 -3
  78. package/dist/cli/chunks/chunk-IAZEDWRX.js +2 -0
  79. package/dist/cli/chunks/{chunk-KRXKU54J.js → chunk-IICTTDAA.js} +2 -2
  80. package/dist/cli/chunks/{chunk-BGBSYF3K.js → chunk-JF53LRBL.js} +2 -2
  81. package/dist/cli/chunks/{chunk-RPL6K623.js → chunk-KB5L5TTF.js} +3 -3
  82. package/dist/cli/chunks/{chunk-Q24OJX44.js → chunk-L7VIX22Y.js} +2 -2
  83. package/dist/cli/chunks/{chunk-TFNLXAK5.js → chunk-LQTWPSYL.js} +1 -1
  84. package/dist/cli/chunks/{chunk-ECPB7IAH.js → chunk-LZCBSFAU.js} +4 -4
  85. package/dist/cli/chunks/{chunk-G5DTENO3.js → chunk-MCOFJHSJ.js} +2 -2
  86. package/dist/cli/chunks/{chunk-XRK7FBTY.js → chunk-MCZHKXB4.js} +2 -2
  87. package/dist/cli/chunks/{chunk-H44WD7QX.js → chunk-MEY43PIQ.js} +2 -2
  88. package/dist/cli/chunks/{chunk-WL2J6ECN.js → chunk-MMIQ5DMA.js} +2 -2
  89. package/dist/cli/chunks/{chunk-PUXDXIUE.js → chunk-MNUTRAUV.js} +1 -1
  90. package/dist/cli/chunks/{chunk-KCTH5MHE.js → chunk-MNV3E5KY.js} +2 -2
  91. package/dist/cli/chunks/{chunk-EO4B5GS4.js → chunk-MYWQTCS4.js} +1 -1
  92. package/dist/cli/chunks/{chunk-32R7EA7B.js → chunk-NZO4WUSO.js} +3 -3
  93. package/dist/cli/chunks/{chunk-NOCYYXK4.js → chunk-OIEQF7PG.js} +2 -2
  94. package/dist/cli/chunks/{chunk-IPRDHKSI.js → chunk-OIRZJCZY.js} +2 -2
  95. package/dist/cli/chunks/{chunk-ELZ67OHQ.js → chunk-ON4D4TJ4.js} +2 -2
  96. package/dist/cli/chunks/chunk-OPFN5LFT.js +95 -0
  97. package/dist/cli/chunks/{chunk-4AWJ5PE4.js → chunk-ORF2UKQH.js} +1 -1
  98. package/dist/cli/chunks/{chunk-6LRCMFLV.js → chunk-OWQ6HEYI.js} +2 -2
  99. package/dist/cli/chunks/{chunk-GRG3OP34.js → chunk-OXCEUR5F.js} +2 -2
  100. package/dist/cli/chunks/{chunk-SLNGJW4G.js → chunk-PEK6NGVJ.js} +1 -1
  101. package/dist/cli/chunks/{chunk-5ZCVMR5E.js → chunk-PIZYRPMT.js} +2 -2
  102. package/dist/cli/chunks/{chunk-K4T3RDCB.js → chunk-PXTDEO65.js} +2 -2
  103. package/dist/cli/chunks/{chunk-GRYXNWPF.js → chunk-PYIHZXCI.js} +12 -12
  104. package/dist/cli/chunks/{chunk-HRDGN3OK.js → chunk-QBRHKTFT.js} +1 -1
  105. package/dist/cli/chunks/{chunk-COZDJLIL.js → chunk-QEPFXY6G.js} +1 -1
  106. package/dist/cli/chunks/{chunk-HPNEZ7YN.js → chunk-QJ2EHLJ2.js} +1 -1
  107. package/dist/cli/chunks/{chunk-GMKGLZJU.js → chunk-QQNCSEZG.js} +2 -2
  108. package/dist/cli/chunks/{chunk-CR4ERDS2.js → chunk-QSE67XJO.js} +2 -2
  109. package/dist/cli/chunks/{chunk-7CKVAYP3.js → chunk-R2O6OKT2.js} +1 -1
  110. package/dist/cli/chunks/{chunk-OVENSL64.js → chunk-RLXTBL3H.js} +8 -8
  111. package/dist/cli/chunks/{chunk-PW6MOFXG.js → chunk-RNREAOY4.js} +2 -2
  112. package/dist/cli/chunks/{chunk-YYWIA5FX.js → chunk-S3OZ7XSY.js} +1 -1
  113. package/dist/cli/chunks/{chunk-KZJXVIAW.js → chunk-S3ZO7JXS.js} +2 -2
  114. package/dist/cli/chunks/{chunk-ZEMXMDD3.js → chunk-SJH3HYNC.js} +2 -2
  115. package/dist/cli/chunks/{chunk-5OTYBWRL.js → chunk-STEGWLH5.js} +2 -2
  116. package/dist/cli/chunks/{chunk-F3OVFA6W.js → chunk-SVYTN2GT.js} +2 -2
  117. package/dist/cli/chunks/{chunk-QNW335PD.js → chunk-SW4OKUTC.js} +2 -2
  118. package/dist/cli/chunks/{chunk-WS4XVJHI.js → chunk-THRTUW4Z.js} +1 -1
  119. package/dist/cli/chunks/{chunk-NPSBMDVU.js → chunk-TJKDATEU.js} +2 -2
  120. package/dist/cli/chunks/{chunk-H22MMMYY.js → chunk-U3EUH6LX.js} +2 -2
  121. package/dist/cli/chunks/{chunk-FJSR2U65.js → chunk-UUFOHMUG.js} +2 -2
  122. package/dist/cli/chunks/{chunk-RWYW573C.js → chunk-UVU7XLJY.js} +3 -3
  123. package/dist/cli/chunks/{chunk-BF7MUYWC.js → chunk-UWXH2UQK.js} +2 -2
  124. package/dist/cli/chunks/{chunk-UU2Q6XWF.js → chunk-UYYBPWU3.js} +1 -1
  125. package/dist/cli/chunks/{chunk-AUVC3DDB.js → chunk-VSUTI4G6.js} +2 -2
  126. package/dist/cli/chunks/{chunk-25QGPRWN.js → chunk-WDMPJ2M2.js} +2 -2
  127. package/dist/cli/chunks/{chunk-MVGVD6LS.js → chunk-WNR2KAUH.js} +2 -2
  128. package/dist/cli/chunks/{chunk-NDCPEXDN.js → chunk-WSVUSIAZ.js} +2 -2
  129. package/dist/cli/chunks/{chunk-T3UXMPXX.js → chunk-WZJUMJ2S.js} +1 -1
  130. package/dist/cli/chunks/{chunk-TX7SNQKL.js → chunk-X2VAOIUY.js} +1 -1
  131. package/dist/cli/chunks/{chunk-DVOH75S4.js → chunk-XDSA7YUQ.js} +1 -1
  132. package/dist/cli/chunks/{chunk-TNGGVMPQ.js → chunk-XDU624HU.js} +1 -1
  133. package/dist/cli/chunks/{chunk-6ZRMQXVL.js → chunk-XGBAHAGC.js} +2 -2
  134. package/dist/cli/chunks/{chunk-IITKJCPK.js → chunk-XMJTTF5N.js} +2 -2
  135. package/dist/cli/chunks/{chunk-2TDWCXZ6.js → chunk-XPCNUX2U.js} +2 -2
  136. package/dist/cli/chunks/{chunk-W6ZF2CPN.js → chunk-XRJECWZE.js} +1 -1
  137. package/dist/cli/chunks/{chunk-MQYTW2IN.js → chunk-XTCUN36Z.js} +2 -2
  138. package/dist/cli/chunks/{chunk-7MSYTHZM.js → chunk-Y63MBMOV.js} +2 -2
  139. package/dist/cli/chunks/{chunk-6QFONVEE.js → chunk-YACT5WFC.js} +2 -2
  140. package/dist/cli/chunks/{chunk-PLRSKAFZ.js → chunk-YI6GNRQM.js} +2 -2
  141. package/dist/cli/chunks/chunk-YNNOY3XN.js +62 -0
  142. package/dist/cli/chunks/{chunk-XGUQYVJR.js → chunk-YWZHMXTO.js} +2 -2
  143. package/dist/cli/chunks/{chunk-OQP5OFRR.js → chunk-ZDHMZPSL.js} +1 -1
  144. package/dist/cli/chunks/{chunk-NRLT44YB.js → chunk-ZGNZJJFF.js} +1 -1
  145. package/dist/cli/chunks/{chunk-ELUERFGA.js → chunk-ZK2BH23O.js} +2 -2
  146. package/dist/cli/chunks/{chunk-AABKTWXC.js → chunk-ZQUXNG5X.js} +2 -2
  147. package/dist/cli/chunks/{chunk-WQEZKAUR.js → chunk-ZXTO4C7R.js} +2 -2
  148. package/dist/cli/chunks/{ci-EHRUN7O6.js → ci-PYCRCL7G.js} +2 -2
  149. package/dist/cli/chunks/{ci-output-EXDXVXKB.js → ci-output-EKQQFE2D.js} +2 -2
  150. package/dist/cli/chunks/{circuit-breaker-LM4QRAAL.js → circuit-breaker-RH3Q2MJO.js} +2 -2
  151. package/dist/cli/chunks/{claude-flow-setup-ZHUCZVW7.js → claude-flow-setup-DUDXB4VV.js} +2 -2
  152. package/dist/cli/chunks/client-RDPWGOSA.js +2 -0
  153. package/dist/cli/chunks/{cline-installer-WMFLQOW2.js → cline-installer-3Q4WIWUG.js} +2 -2
  154. package/dist/cli/chunks/{code-L7KRLU5E.js → code-E4Q6DGOO.js} +2 -2
  155. package/dist/cli/chunks/{code-index-extractor-FTMUYQC6.js → code-index-extractor-2PCISUOW.js} +2 -2
  156. package/dist/cli/chunks/{codex-installer-B3F6WI3Z.js → codex-installer-YNNNOLJ6.js} +2 -2
  157. package/dist/cli/chunks/{completions-3JZQRNB6.js → completions-2F7TUFBD.js} +2 -2
  158. package/dist/cli/chunks/{complexity-analyzer-LB2FFEKX.js → complexity-analyzer-2B6MHO7W.js} +2 -2
  159. package/dist/cli/chunks/{continuedev-installer-WH6IMV7R.js → continuedev-installer-ENOKRU5M.js} +2 -2
  160. package/dist/cli/chunks/{copilot-installer-NOIEOFJM.js → copilot-installer-6YD2KM5F.js} +2 -2
  161. package/dist/cli/chunks/{cost-tracker-IKX2VYSA.js → cost-tracker-FCH4QOEA.js} +2 -2
  162. package/dist/cli/chunks/{coverage-TD37CYSY.js → coverage-JTOXZE3T.js} +3 -3
  163. package/dist/cli/chunks/cross-domain-router-4K5ZVZEZ.js +2 -0
  164. package/dist/cli/chunks/{cursor-installer-4NSVGRM5.js → cursor-installer-QZFBUGLQ.js} +2 -2
  165. package/dist/cli/chunks/{daemon-LYDV7NRW.js → daemon-K4QFB5FQ.js} +3 -3
  166. package/dist/cli/chunks/{daemon-UWEBUIDT.js → daemon-M422U3ZA.js} +4 -4
  167. package/dist/cli/chunks/{dag-attention-scheduler-NECJGCHC.js → dag-attention-scheduler-BXAAW33V.js} +2 -2
  168. package/dist/cli/chunks/{detect-4XGC7ILO.js → detect-UGSWIOAD.js} +2 -2
  169. package/dist/cli/chunks/{dist-node-GGJDXRKJ.js → dist-node-FN3HX3OK.js} +2 -2
  170. package/dist/cli/chunks/{domain-handler-UOFONAUT.js → domain-handler-7PP7VYA7.js} +2 -2
  171. package/dist/cli/chunks/{domain-transfer-6JLNOYPA.js → domain-transfer-XZM44W7I.js} +2 -2
  172. package/dist/cli/chunks/dream-RPNWM7VS.js +2 -0
  173. package/dist/cli/chunks/{embed-and-insert-pattern-ZM75DQ4J.js → embed-and-insert-pattern-JZVERJ5L.js} +2 -2
  174. package/dist/cli/chunks/{eval-CYZJTHEB.js → eval-466NFF2D.js} +2 -2
  175. package/dist/cli/chunks/{experience-capture-middleware-RBOJLDUB.js → experience-capture-middleware-I7IQCC7V.js} +3 -3
  176. package/dist/cli/chunks/{fast-paths-S5BWZR3L.js → fast-paths-34OICNZA.js} +2 -2
  177. package/dist/cli/chunks/{feature-flags-6E7H3NYP.js → feature-flags-6UBIVTAD.js} +2 -2
  178. package/dist/cli/chunks/{feature-flags-DUNQPDU3.js → feature-flags-X5WBBWSO.js} +2 -2
  179. package/dist/cli/chunks/{file-discovery-PFFKDGYG.js → file-discovery-NLMDBWXX.js} +2 -2
  180. package/dist/cli/chunks/{fleet-RCDZZFXN.js → fleet-W7CYCHDI.js} +3 -3
  181. package/dist/cli/chunks/{gnn-wrapper-5AG3WDWF.js → gnn-wrapper-K4VTAG5X.js} +2 -2
  182. package/dist/cli/chunks/{heartbeat-handler-O2KAEX4Y.js → heartbeat-handler-ZGKF2Z6T.js} +4 -4
  183. package/dist/cli/chunks/heartbeat-scheduler-JBCXMMZO.js +2 -0
  184. package/dist/cli/chunks/hnsw-adapter-3SC2HZIG.js +2 -0
  185. package/dist/cli/chunks/hnsw-index-FQORAR6K.js +2 -0
  186. package/dist/cli/chunks/{hnsw-legacy-bridge-C7FG6YGW.js → hnsw-legacy-bridge-ELDRLKK5.js} +2 -2
  187. package/dist/cli/chunks/{better-sqlite3-XGPW4HK5.js → hnswlib-node-ZGSUMHDC.js} +2 -2
  188. package/dist/cli/chunks/{hooks-FUHNE2P7.js → hooks-T4CBINAV.js} +13 -13
  189. package/dist/cli/chunks/hybrid-router-6CBFDXPR.js +2 -0
  190. package/dist/cli/chunks/{hypergraph-engine-LQRYBNPV.js → hypergraph-engine-UWFW3XP5.js} +2 -2
  191. package/dist/cli/chunks/{hypergraph-handler-AFFNLZVD.js → hypergraph-handler-PK2BI46K.js} +3 -3
  192. package/dist/cli/chunks/impact-analyzer-SOEFVZWG.js +2 -0
  193. package/dist/cli/chunks/{init-handler-BQ6IDBX4.js → init-handler-HNG6KJOU.js} +6 -6
  194. package/dist/cli/chunks/init-wizard-3E4IU5M4.js +2 -0
  195. package/dist/cli/chunks/kernel-GFZP4G5J.js +2 -0
  196. package/dist/cli/chunks/{kilocode-installer-KS72HUSG.js → kilocode-installer-25V7FEJ4.js} +2 -2
  197. package/dist/cli/chunks/{kiro-installer-2ZEFLGRX.js → kiro-installer-7RMTTCQB.js} +2 -2
  198. package/dist/cli/chunks/knowledge-graph-BKRKBU26.js +2 -0
  199. package/dist/cli/chunks/{learning-GGHGJ6B6.js → learning-XQC2MG2R.js} +3 -3
  200. package/dist/cli/chunks/{llm-router-LP6K5BJF.js → llm-router-6KTTONH4.js} +4 -4
  201. package/dist/cli/chunks/llm-router-service-KE4IGZPP.js +2 -0
  202. package/dist/cli/chunks/{load-2MLKXOT2.js → load-BV64P3AL.js} +2 -2
  203. package/dist/cli/chunks/load-test-VSYJV2AO.js +2 -0
  204. package/dist/cli/chunks/{mcp-CDJBJG5H.js → mcp-U5ZN77TA.js} +2 -2
  205. package/dist/cli/chunks/{memory-4LAX7JZS.js → memory-WB5BNBK7.js} +5 -5
  206. package/dist/cli/chunks/memory-backend-B72RGHRF.js +2 -0
  207. package/dist/cli/chunks/{memory-handlers-OBAFR4WV.js → memory-handlers-NWCH7AUO.js} +2 -2
  208. package/dist/cli/chunks/{multi-model-executor-SLJV73HE.js → multi-model-executor-3X3W3UTY.js} +2 -2
  209. package/dist/cli/chunks/{opencode-installer-M76SONWV.js → opencode-installer-TTTMG7ZZ.js} +2 -2
  210. package/dist/cli/chunks/{orchestrator-TJPUDJMP.js → orchestrator-BLCGSHMZ.js} +18 -18
  211. package/dist/cli/chunks/{pipeline-2PVNFT6J.js → pipeline-DZPGMRG7.js} +2 -2
  212. package/dist/cli/chunks/{platform-KCSEDKEE.js → platform-EVMZAUNV.js} +2 -2
  213. package/dist/cli/chunks/{plugin-QX47QF5U.js → plugin-OR55K4HT.js} +2 -2
  214. package/dist/cli/chunks/{prime-radiant-advanced-wasm-L6VWL7VR.js → prime-radiant-advanced-wasm-4ODV27HD.js} +2 -2
  215. package/dist/cli/chunks/protocol-executor-V3F37FPO.js +2 -0
  216. package/dist/cli/chunks/{protocol-handler-WDNJDEUE.js → protocol-handler-ZOTI5PID.js} +2 -2
  217. package/dist/cli/chunks/{prove-3B75DA3S.js → prove-DIMBYJ7V.js} +2 -2
  218. package/dist/cli/chunks/provider-manager-2PN72TT6.js +2 -0
  219. package/dist/cli/chunks/qe-reasoning-bank-P665QNIR.js +2 -0
  220. package/dist/cli/chunks/{quality-UGASS5WM.js → quality-7MX4VL6M.js} +2 -2
  221. package/dist/cli/chunks/queen-coordinator-XD4F7BGB.js +2 -0
  222. package/dist/cli/chunks/{real-embeddings-COBP2LHS.js → real-embeddings-YPUHWRN2.js} +2 -2
  223. package/dist/cli/chunks/{roocode-installer-TOZ4VLFT.js → roocode-installer-WG5AU4QM.js} +2 -2
  224. package/dist/cli/chunks/router-4SSNWDJC.js +2 -0
  225. package/dist/cli/chunks/routing-feedback-O2JSIBW6.js +2 -0
  226. package/dist/cli/chunks/{routing-handler-5TDVSILX.js → routing-handler-LZB4MN2K.js} +2 -2
  227. package/dist/cli/chunks/{ruvector-commands-AM63KWQN.js → ruvector-commands-YE4ADBMC.js} +2 -2
  228. package/dist/cli/chunks/{rvf-dual-writer-UANIFE2M.js → rvf-dual-writer-QS5ATW4C.js} +2 -2
  229. package/dist/cli/chunks/{rvf-migration-adapter-LNPYWAPI.js → rvf-migration-adapter-YIGKSBD3.js} +2 -2
  230. package/dist/cli/chunks/{rvf-migration-coordinator-U47L63DQ.js → rvf-migration-coordinator-2NDCWP7F.js} +2 -2
  231. package/dist/cli/chunks/rvf-native-adapter-WIUHYXRB.js +2 -0
  232. package/dist/cli/chunks/safe-db-WL5Y7ZNS.js +2 -0
  233. package/dist/cli/chunks/schedule-U7QDGU5A.js +2 -0
  234. package/dist/cli/chunks/scheduler-LXKGQYXA.js +2 -0
  235. package/dist/cli/chunks/{security-KDQ2AH7G.js → security-HT4SUT24.js} +3 -3
  236. package/dist/cli/chunks/{shared-rvf-adapter-5MAGLLYJ.js → shared-rvf-adapter-4IZOJL33.js} +2 -2
  237. package/dist/cli/chunks/{shared-rvf-dual-writer-GF2OPPM5.js → shared-rvf-dual-writer-ZKFO7CBY.js} +2 -2
  238. package/dist/cli/chunks/sqlite-persistence-4KFO3SEB.js +2 -0
  239. package/dist/cli/chunks/{status-handler-XZKEL7LO.js → status-handler-AMEMKBI4.js} +2 -2
  240. package/dist/cli/chunks/{structural-health-27QKWW25.js → structural-health-RBADRLC3.js} +2 -2
  241. package/dist/cli/chunks/{sync-V3HGPEJT.js → sync-ARDDLQBS.js} +2 -2
  242. package/dist/cli/chunks/{sync-INNKS6UK.js → sync-PCB23M4K.js} +2 -2
  243. package/dist/cli/chunks/{task-handler-LDUVOM6G.js → task-handler-J26FSCH5.js} +2 -2
  244. package/dist/cli/chunks/{task-handlers-HTCPV7OO.js → task-handlers-AQRLR6BL.js} +3 -3
  245. package/dist/cli/chunks/{test-PCUVGVJL.js → test-YXWSIOSB.js} +4 -4
  246. package/dist/cli/chunks/{test-scheduling-GYVXWCAA.js → test-scheduling-XY532GI4.js} +3 -3
  247. package/dist/cli/chunks/{token-bootstrap-MJ2ANC4P.js → token-bootstrap-KL2QIQ36.js} +2 -2
  248. package/dist/cli/chunks/{token-usage-ZREHROTF.js → token-usage-2MJVE4DT.js} +2 -2
  249. package/dist/cli/chunks/{transformers-6B3FWFYL.js → transformers-QSNTOD2Z.js} +2 -2
  250. package/dist/cli/chunks/{tree-sitter-wasm-parser-JVV234MN.js → tree-sitter-wasm-parser-QJOKHOIW.js} +2 -2
  251. package/dist/cli/chunks/{types-MVZTJI2F.js → types-RNKRSYMO.js} +2 -2
  252. package/dist/cli/chunks/unified-memory-7AS4LIEF.js +2 -0
  253. package/dist/cli/chunks/unified-memory-hnsw-GREESNJX.js +2 -0
  254. package/dist/cli/chunks/unified-persistence-BPJOMZOA.js +2 -0
  255. package/dist/cli/chunks/{upgrade-MKTFEILD.js → upgrade-EKJHIFWP.js} +2 -2
  256. package/dist/cli/chunks/{validate-IABGALSW.js → validate-KS4T7LWC.js} +2 -2
  257. package/dist/cli/chunks/{validate-swarm-RHF53RF6.js → validate-swarm-SKKWRP2H.js} +2 -2
  258. package/dist/cli/chunks/{vibium-RAKW6FMF.js → vibium-FLUQO4IF.js} +2 -2
  259. package/dist/cli/chunks/visual-security-BW662FHQ.js +2 -0
  260. package/dist/cli/chunks/{web-tree-sitter-PYK7F4JZ.js → web-tree-sitter-UMC63DWD.js} +2 -2
  261. package/dist/cli/chunks/{windsurf-installer-S3U2HWZ4.js → windsurf-installer-V3FQGJIQ.js} +2 -2
  262. package/dist/cli/chunks/{witness-chain-435NKQLB.js → witness-chain-GE74TLSO.js} +2 -2
  263. package/dist/cli/chunks/witness-chain-OXVDLNVT.js +2 -0
  264. package/dist/cli/chunks/{workflow-5UHJCZ6J.js → workflow-4YZ2RPWA.js} +4 -4
  265. package/dist/cli/chunks/workflow-orchestrator-KKNR46XV.js +2 -0
  266. package/dist/cli/chunks/{wrappers-RD3NCMLK.js → wrappers-37NLMKPE.js} +2 -2
  267. package/dist/cli/commands/hooks-handlers/command-hooks.js +1 -1
  268. package/dist/cli/commands/hooks-handlers/routing-hooks.js +1 -1
  269. package/dist/cli/commands/hooks-handlers/task-hooks.js +1 -1
  270. package/dist/init/init-wizard-hooks.js +271 -271
  271. package/dist/init/phases/07-hooks.d.ts +7 -0
  272. package/dist/init/phases/07-hooks.js +132 -96
  273. package/dist/learning/agent-routing.d.ts +19 -0
  274. package/dist/learning/agent-routing.js +27 -1
  275. package/dist/learning/dream/dream-scheduler.d.ts +11 -36
  276. package/dist/learning/dream/dream-scheduler.js +44 -0
  277. package/dist/learning/experience-consolidation.d.ts +16 -0
  278. package/dist/learning/experience-consolidation.js +55 -11
  279. package/dist/learning/pattern-lifecycle.d.ts +21 -0
  280. package/dist/learning/pattern-lifecycle.js +70 -6
  281. package/dist/mcp/bundle.js +352 -349
  282. package/dist/mcp/protocol-server.js +13 -14
  283. package/dist/mcp/transport/stdio.d.ts +20 -0
  284. package/dist/mcp/transport/stdio.js +35 -2
  285. package/dist/shared/utils/rabitq.d.ts +133 -0
  286. package/dist/shared/utils/rabitq.js +201 -0
  287. package/package.json +8 -2
  288. package/dist/cli/chunks/adapter-3JS2CN7C.js +0 -2
  289. package/dist/cli/chunks/aqe-learning-engine-Q4GFNGU6.js +0 -2
  290. package/dist/cli/chunks/base-Q3MAL22Y.js +0 -2
  291. package/dist/cli/chunks/browser-workflow-JX3M2UWG.js +0 -2
  292. package/dist/cli/chunks/chunk-IJ4BUSJN.js +0 -95
  293. package/dist/cli/chunks/chunk-VPCE5CIT.js +0 -2
  294. package/dist/cli/chunks/chunk-WO7KYT3X.js +0 -62
  295. package/dist/cli/chunks/client-PA3UJIHH.js +0 -2
  296. package/dist/cli/chunks/cross-domain-router-BVJRP2ZX.js +0 -2
  297. package/dist/cli/chunks/dream-BXZUEIW2.js +0 -2
  298. package/dist/cli/chunks/heartbeat-scheduler-LEKAWFJF.js +0 -2
  299. package/dist/cli/chunks/hnsw-adapter-2TCEG5M2.js +0 -2
  300. package/dist/cli/chunks/hnsw-index-VDPUTEES.js +0 -2
  301. package/dist/cli/chunks/hybrid-router-2EMDIYIG.js +0 -2
  302. package/dist/cli/chunks/impact-analyzer-HFD6CPWC.js +0 -2
  303. package/dist/cli/chunks/init-wizard-552QIVRC.js +0 -2
  304. package/dist/cli/chunks/kernel-5DN6O6EE.js +0 -2
  305. package/dist/cli/chunks/knowledge-graph-76Y77MB6.js +0 -2
  306. package/dist/cli/chunks/llm-router-service-4O6GCEFH.js +0 -2
  307. package/dist/cli/chunks/load-test-FCI2IWRJ.js +0 -2
  308. package/dist/cli/chunks/memory-backend-MKNCBNDE.js +0 -2
  309. package/dist/cli/chunks/protocol-executor-IA7WNT23.js +0 -2
  310. package/dist/cli/chunks/provider-manager-3K5KB5A6.js +0 -2
  311. package/dist/cli/chunks/qe-reasoning-bank-V5Z3BBYY.js +0 -2
  312. package/dist/cli/chunks/queen-coordinator-QOMPA27Z.js +0 -2
  313. package/dist/cli/chunks/router-P5RZUPC4.js +0 -2
  314. package/dist/cli/chunks/routing-feedback-3PS3OZQC.js +0 -2
  315. package/dist/cli/chunks/rvf-native-adapter-TT7OJPKM.js +0 -2
  316. package/dist/cli/chunks/safe-db-PEW7VBAE.js +0 -2
  317. package/dist/cli/chunks/schedule-QHOTHBQE.js +0 -2
  318. package/dist/cli/chunks/scheduler-KXJBYTRT.js +0 -2
  319. package/dist/cli/chunks/sqlite-persistence-TPXJK34J.js +0 -2
  320. package/dist/cli/chunks/unified-memory-ROS2NKR5.js +0 -2
  321. package/dist/cli/chunks/unified-memory-hnsw-FLEUF3XO.js +0 -2
  322. package/dist/cli/chunks/unified-persistence-QC5L7UNQ.js +0 -2
  323. package/dist/cli/chunks/visual-security-NLIOUQCR.js +0 -2
  324. package/dist/cli/chunks/witness-chain-U7X6JX5J.js +0 -2
  325. package/dist/cli/chunks/workflow-orchestrator-APE6BAXH.js +0 -2
@@ -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
  // ============================================================================