agentic-qe 3.15.17 → 3.15.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/helpers/brain-checkpoint.cjs +107 -10
- package/.claude/skills/agentic-quality-engineering/SKILL.md +67 -44
- package/.claude/skills/brutal-honesty-review/SKILL.md +12 -7
- package/.claude/skills/brutal-honesty-review/evals/brutal-honesty-review.yaml +120 -0
- package/.claude/skills/brutal-honesty-review/schemas/output.json +9 -3
- package/.claude/skills/code-review-quality/SKILL.md +2 -2
- package/.claude/skills/holistic-testing-pact/SKILL.md +11 -11
- package/.claude/skills/sherlock-review/SKILL.md +4 -2
- package/.claude/skills/sherlock-review/evals/sherlock-review.yaml +124 -0
- package/.claude/skills/skills-manifest.json +1 -1
- package/.claude/skills/technical-writing/SKILL.md +12 -6
- package/.claude/skills/technical-writing/evals/technical-writing.yaml +96 -0
- package/.opencode/skills/qe-agentic-quality-engineering.yaml +2 -2
- package/.opencode/skills/qe-holistic-testing-pact.yaml +2 -2
- package/CHANGELOG.md +123 -0
- package/assets/skills/agentic-quality-engineering/SKILL.md +67 -44
- package/assets/skills/brutal-honesty-review/SKILL.md +12 -8
- package/assets/skills/brutal-honesty-review/evals/brutal-honesty-review.yaml +120 -0
- package/assets/skills/brutal-honesty-review/schemas/output.json +9 -3
- package/assets/skills/code-review-quality/SKILL.md +2 -2
- package/assets/skills/holistic-testing-pact/SKILL.md +11 -11
- package/assets/skills/sherlock-review/SKILL.md +4 -3
- package/assets/skills/sherlock-review/evals/sherlock-review.yaml +124 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/assets/skills/technical-writing/SKILL.md +12 -6
- package/assets/skills/technical-writing/evals/technical-writing.yaml +96 -0
- package/dist/cli/brain-commands.d.ts +5 -0
- package/dist/cli/brain-commands.js +4 -0
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-WRSDXLOT.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-6BUOFQZA.js → agent-booster-wasm-UFNJNF3M.js} +2 -2
- package/dist/cli/chunks/{agent-handler-HPDK3JI3.js → agent-handler-EAYVRJXN.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-5QKUTWK5.js → agent-memory-branch-M65C6WAQ.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-O6NJBCCM.js +2 -0
- package/dist/cli/chunks/{arena-HZ35LESR.js → arena-2GDICP6R.js} +4 -4
- package/dist/cli/chunks/{arena-7OKPMNHD.js → arena-CG3X67OE.js} +2 -2
- package/dist/cli/chunks/{audit-XI575SVK.js → audit-F4FSPJPL.js} +3 -3
- package/dist/cli/chunks/base-J2FXOE77.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-YO5X7ZJS.js → better-sqlite3-2MCFXW4J.js} +2 -2
- package/dist/cli/chunks/brain-handler-WGTJNYNB.js +95 -0
- package/dist/cli/chunks/{branch-enumerator-N6G44UU2.js → branch-enumerator-KL7C535H.js} +2 -2
- package/dist/cli/chunks/{browser-EVKPTLOI.js → browser-SJEXDVHS.js} +2 -2
- package/dist/cli/chunks/browser-workflow-LXGER6ZD.js +2 -0
- package/dist/cli/chunks/{chunk-VLTDW7XJ.js → chunk-244RKAEP.js} +2 -2
- package/dist/cli/chunks/{chunk-CVPXHDQU.js → chunk-27TUMXPD.js} +1 -1
- package/dist/cli/chunks/{chunk-FBBPRVNF.js → chunk-2MBYDPCP.js} +2 -2
- package/dist/cli/chunks/{chunk-P3D7SEHW.js → chunk-2Q6DTBMT.js} +1 -1
- package/dist/cli/chunks/{chunk-NE3LRUNC.js → chunk-355MI7RV.js} +13 -13
- package/dist/cli/chunks/{chunk-YCVLKU6H.js → chunk-3LX5OKBD.js} +2 -2
- package/dist/cli/chunks/{chunk-74MDUIAZ.js → chunk-3RPDKJGV.js} +1 -1
- package/dist/cli/chunks/{chunk-OWIQR6N2.js → chunk-3YMIT73A.js} +2 -2
- package/dist/cli/chunks/{chunk-VKREKVFI.js → chunk-43KUVBSU.js} +2 -2
- package/dist/cli/chunks/chunk-477FKXSS.js +2 -0
- package/dist/cli/chunks/{chunk-XPTCQKVE.js → chunk-4BIMTRRX.js} +1 -1
- package/dist/cli/chunks/{chunk-HD6W6PHV.js → chunk-4CVNVBX5.js} +2 -2
- package/dist/cli/chunks/{chunk-CQER6IJ5.js → chunk-4HL3SD4A.js} +1 -1
- package/dist/cli/chunks/{chunk-ZNXM6WVL.js → chunk-4PEG4DU2.js} +2 -2
- package/dist/cli/chunks/{chunk-BSIWI4ES.js → chunk-4QSQKFED.js} +2 -2
- package/dist/cli/chunks/chunk-53ZBETYR.js +16 -0
- package/dist/cli/chunks/{chunk-BHQ2DLJU.js → chunk-544KDWL4.js} +1 -1
- package/dist/cli/chunks/chunk-54RCGMLB.js +8 -0
- package/dist/cli/chunks/{chunk-TDZ6N43D.js → chunk-5AGXIZQ5.js} +2 -2
- package/dist/cli/chunks/{chunk-RKCN4B26.js → chunk-5M24X6W7.js} +2 -2
- package/dist/cli/chunks/{chunk-GG7PMTHD.js → chunk-5O5T4LEU.js} +1 -1
- package/dist/cli/chunks/{chunk-OWIZBZLN.js → chunk-5RFXX4IF.js} +2 -2
- package/dist/cli/chunks/{chunk-VQFV2IPV.js → chunk-62MLAQRJ.js} +1 -1
- package/dist/cli/chunks/{chunk-PCL5JRKN.js → chunk-6D6TGL2E.js} +2 -2
- package/dist/cli/chunks/{chunk-WBDWHHKP.js → chunk-6IHZDSDL.js} +2 -2
- package/dist/cli/chunks/{chunk-UOVCTK5L.js → chunk-6P3Y45QL.js} +2 -2
- package/dist/cli/chunks/{chunk-45223KK6.js → chunk-6TEVM3X3.js} +10 -10
- package/dist/cli/chunks/{chunk-K7WAI662.js → chunk-7XTUKKRA.js} +1 -1
- package/dist/cli/chunks/chunk-A3GDX6UF.js +2 -0
- package/dist/cli/chunks/{chunk-GN6OE3JT.js → chunk-A5YTKKNA.js} +1 -1
- package/dist/cli/chunks/{chunk-KR2TAAF6.js → chunk-ADNGZAT2.js} +1 -1
- package/dist/cli/chunks/{chunk-J7Q5TXFZ.js → chunk-AWQAE3SW.js} +2 -2
- package/dist/cli/chunks/{chunk-ZN35XSKF.js → chunk-AXDBQFR4.js} +2 -2
- package/dist/cli/chunks/{chunk-ND72UDVH.js → chunk-AXVD7O3F.js} +2 -2
- package/dist/cli/chunks/{chunk-SAEECT23.js → chunk-B52ULNYO.js} +2 -2
- package/dist/cli/chunks/chunk-B6S4FC7M.js +3 -0
- package/dist/cli/chunks/{chunk-Z7SKUC6P.js → chunk-BDVFSMOQ.js} +1 -1
- package/dist/cli/chunks/{chunk-CXCMATZ6.js → chunk-BGXXMX3Y.js} +2 -2
- package/dist/cli/chunks/{chunk-R3KBOQ3O.js → chunk-BKMQQY5T.js} +2 -2
- package/dist/cli/chunks/{chunk-SAZ4PJBR.js → chunk-BN2FROBQ.js} +2 -2
- package/dist/cli/chunks/{chunk-G2X3OLMN.js → chunk-BO6EQNOC.js} +2 -2
- package/dist/cli/chunks/{chunk-776K4ZLE.js → chunk-BOVAKCDC.js} +2 -2
- package/dist/cli/chunks/{chunk-QSQNXBD2.js → chunk-BSXKZDKO.js} +2 -2
- package/dist/cli/chunks/{chunk-MGZ6XZHU.js → chunk-C5QVJ5XQ.js} +1 -1
- package/dist/cli/chunks/{chunk-LOLSZG5J.js → chunk-CFQLLF3D.js} +2 -2
- package/dist/cli/chunks/{chunk-J6QRNQJF.js → chunk-DUCVLT3F.js} +7 -7
- package/dist/cli/chunks/{chunk-QTQDX4TZ.js → chunk-E4RMJCGA.js} +3 -3
- package/dist/cli/chunks/{chunk-MLMD3I75.js → chunk-EONDCWY4.js} +1 -1
- package/dist/cli/chunks/{chunk-7BSOO3CY.js → chunk-F4AGNKL2.js} +2 -2
- package/dist/cli/chunks/{chunk-IKB3M7OF.js → chunk-F6YD3BOW.js} +1 -1
- package/dist/cli/chunks/{chunk-LIF6UWHV.js → chunk-FQRS7WVA.js} +2 -2
- package/dist/cli/chunks/{chunk-QJSSUBO3.js → chunk-FT24SSDG.js} +2 -2
- package/dist/cli/chunks/chunk-FV4YNSAJ.js +5 -0
- package/dist/cli/chunks/{chunk-VITV7AEC.js → chunk-FVDM3X42.js} +2 -2
- package/dist/cli/chunks/{chunk-LN7NKE3N.js → chunk-FVH7TXWU.js} +2 -2
- package/dist/cli/chunks/{chunk-FBSBXCZS.js → chunk-FWR5QY37.js} +2 -2
- package/dist/cli/chunks/{chunk-X2DWHGCC.js → chunk-FYINK2B7.js} +2 -2
- package/dist/cli/chunks/{chunk-ECKHDHR2.js → chunk-GGISVPOZ.js} +2 -2
- package/dist/cli/chunks/{chunk-SRBCBVSI.js → chunk-GPIJIZJQ.js} +2 -2
- package/dist/cli/chunks/{chunk-YR5QBUHZ.js → chunk-GXEVOT5F.js} +2 -2
- package/dist/cli/chunks/{chunk-ZTP3DQ5M.js → chunk-GZ4VB5RI.js} +1 -1
- package/dist/cli/chunks/{chunk-HWQPMUSN.js → chunk-HBDSCYSK.js} +2 -2
- package/dist/cli/chunks/{chunk-XBTGEYED.js → chunk-HGG4HR7C.js} +2 -2
- package/dist/cli/chunks/{chunk-YD2C6EPN.js → chunk-HSCKWWO2.js} +2 -2
- package/dist/cli/chunks/{chunk-LOMT4UC2.js → chunk-HSQ3GUYJ.js} +2 -2
- package/dist/cli/chunks/{chunk-ZC3KDNJW.js → chunk-HZQBW5EM.js} +3 -3
- package/dist/cli/chunks/{chunk-SUAZ5Z47.js → chunk-IGIYANVT.js} +2 -2
- package/dist/cli/chunks/{chunk-IHQGNDMX.js → chunk-IPWMSXBF.js} +2 -2
- package/dist/cli/chunks/{chunk-6V6BD6PH.js → chunk-IWVNC7VY.js} +1 -1
- package/dist/cli/chunks/{chunk-M2YI5YUR.js → chunk-IZODXKZD.js} +2 -2
- package/dist/cli/chunks/{chunk-LG5PPJT7.js → chunk-J2MT2OJV.js} +1 -1
- package/dist/cli/chunks/{chunk-6LSZCEW2.js → chunk-JKIJVVSP.js} +1 -1
- package/dist/cli/chunks/{chunk-REY52O7J.js → chunk-JMRDT2XK.js} +1 -1
- package/dist/cli/chunks/{chunk-XEYFZLIT.js → chunk-JR2UMTKG.js} +1 -1
- package/dist/cli/chunks/{chunk-DJDVD6RM.js → chunk-K6CH4CFF.js} +2 -2
- package/dist/cli/chunks/{chunk-2PCEMDIX.js → chunk-K7KW5QB5.js} +78 -87
- package/dist/cli/chunks/{chunk-EPVPXHL7.js → chunk-KFCQP434.js} +2 -2
- package/dist/cli/chunks/{chunk-TWBZONKT.js → chunk-KH4T6STG.js} +2 -2
- package/dist/cli/chunks/{chunk-JI33PMPZ.js → chunk-KJBYZO57.js} +1 -1
- package/dist/cli/chunks/{chunk-PK34KJH7.js → chunk-KP4OKOKV.js} +2 -2
- package/dist/cli/chunks/chunk-L2MBKVSE.js +2 -0
- package/dist/cli/chunks/{chunk-JVWZAE2H.js → chunk-L3IPUIT3.js} +2 -2
- package/dist/cli/chunks/{chunk-KT2QCXO6.js → chunk-L7PSU2YN.js} +2 -2
- package/dist/cli/chunks/{chunk-HAQJFUAQ.js → chunk-LA3JPGQA.js} +2 -2
- package/dist/cli/chunks/{chunk-LV7UIK4Q.js → chunk-LC2QRN7V.js} +14 -13
- package/dist/cli/chunks/{chunk-KTORRIX3.js → chunk-LHY7TMTM.js} +2 -2
- package/dist/cli/chunks/{chunk-IJSROBM6.js → chunk-LLQ2UMF6.js} +3 -3
- package/dist/cli/chunks/{chunk-NKUHMA4T.js → chunk-LOJ7OO6W.js} +2 -2
- package/dist/cli/chunks/{chunk-OJIUIEI4.js → chunk-LPUSH3VF.js} +1 -1
- package/dist/cli/chunks/{chunk-WAOEQA3W.js → chunk-LSEC2BU7.js} +2 -2
- package/dist/cli/chunks/{chunk-YMUY3TES.js → chunk-LTGB7OIU.js} +2 -2
- package/dist/cli/chunks/{chunk-CVYPMGUM.js → chunk-LUG7YNVZ.js} +2 -2
- package/dist/cli/chunks/{chunk-YAJOBZE5.js → chunk-LWAFRYKE.js} +2 -2
- package/dist/cli/chunks/{chunk-ZP5AWQRO.js → chunk-M24ZAZ4U.js} +2 -2
- package/dist/cli/chunks/{chunk-HFZD5KLR.js → chunk-MKRKRXTX.js} +1 -1
- package/dist/cli/chunks/{chunk-4YM45Z5B.js → chunk-MNNLONAD.js} +1 -1
- package/dist/cli/chunks/{chunk-CMN7PU2H.js → chunk-MQM37KAR.js} +2 -2
- package/dist/cli/chunks/{chunk-COTQ44YO.js → chunk-MSX2OHYT.js} +2 -2
- package/dist/cli/chunks/{chunk-4UKTIQDT.js → chunk-MVYQRVLP.js} +2 -2
- package/dist/cli/chunks/{chunk-HRUHHHVR.js → chunk-MZC5WM2P.js} +2 -2
- package/dist/cli/chunks/{chunk-YKRLUTK7.js → chunk-MZRBNBB3.js} +2 -2
- package/dist/cli/chunks/{chunk-XEMCHGAJ.js → chunk-N3KQU4UC.js} +2 -2
- package/dist/cli/chunks/{chunk-DS5IFRY6.js → chunk-NKU3FFM4.js} +2 -2
- package/dist/cli/chunks/chunk-O5EWFR76.js +2 -0
- package/dist/cli/chunks/{chunk-J3QFJI2Y.js → chunk-O5RDHD5T.js} +2 -2
- package/dist/cli/chunks/chunk-O6UWIXME.js +3 -0
- package/dist/cli/chunks/{chunk-Q6F3DYZN.js → chunk-OA4EQDC4.js} +2 -2
- package/dist/cli/chunks/{chunk-NQFDJ6BT.js → chunk-OBCXCRXK.js} +1 -1
- package/dist/cli/chunks/{chunk-S3TBOKAZ.js → chunk-OHU5P25N.js} +4 -4
- package/dist/cli/chunks/{chunk-DNVRTJKB.js → chunk-OOSV2RIA.js} +2 -2
- package/dist/cli/chunks/{chunk-NZJVDOUN.js → chunk-OW23N2Y5.js} +2 -2
- package/dist/cli/chunks/{chunk-ZWUF27P4.js → chunk-OXOO3YDL.js} +2 -2
- package/dist/cli/chunks/{chunk-4L6WX5KC.js → chunk-OYGKSSSI.js} +1 -1
- package/dist/cli/chunks/{chunk-DCDSN67A.js → chunk-PGO46IIW.js} +1 -1
- package/dist/cli/chunks/{chunk-C7QLLMYI.js → chunk-PZOYQHWS.js} +1 -1
- package/dist/cli/chunks/{chunk-BKHEQIRZ.js → chunk-Q2BZSG7Z.js} +2 -2
- package/dist/cli/chunks/{chunk-5FSPELOG.js → chunk-Q7V722K5.js} +2 -2
- package/dist/cli/chunks/{chunk-2EQK7B5L.js → chunk-QZU6M5IO.js} +2 -2
- package/dist/cli/chunks/{chunk-HVT7RMGV.js → chunk-R55Y76SJ.js} +1 -1
- package/dist/cli/chunks/{chunk-POPSZDI2.js → chunk-RMEQYJPU.js} +4 -4
- package/dist/cli/chunks/{chunk-H2LHWZRE.js → chunk-RTYXFXTI.js} +2 -2
- package/dist/cli/chunks/{chunk-QN7HP2UW.js → chunk-SJF3O4FX.js} +236 -236
- package/dist/cli/chunks/{chunk-2YWYW7NU.js → chunk-SOUS7Z2H.js} +2 -2
- package/dist/cli/chunks/{chunk-U5SMBJ6F.js → chunk-SRVNR3R3.js} +2 -2
- package/dist/cli/chunks/{chunk-ZAQMRFBB.js → chunk-SU3SXMVG.js} +2 -2
- package/dist/cli/chunks/chunk-SWGPLXWW.js +32 -0
- package/dist/cli/chunks/{chunk-S3DT5TPR.js → chunk-TRB3EVH3.js} +2 -2
- package/dist/cli/chunks/{chunk-IJZFJPHS.js → chunk-TVBDUMKT.js} +2 -2
- package/dist/cli/chunks/{chunk-7SNSI4VY.js → chunk-TWTXPSFU.js} +1 -1
- package/dist/cli/chunks/{chunk-ORQ2YBRR.js → chunk-ULYUVUL2.js} +2 -2
- package/dist/cli/chunks/{chunk-MVVVGQJ6.js → chunk-UNTBVJ5X.js} +2 -2
- package/dist/cli/chunks/{chunk-5WATBVU6.js → chunk-UQAA4PHU.js} +2 -2
- package/dist/cli/chunks/{chunk-5WYZVSL2.js → chunk-UWSJVKTE.js} +1 -1
- package/dist/cli/chunks/{chunk-JHKKIJT2.js → chunk-V2LJ54KP.js} +2 -2
- package/dist/cli/chunks/{chunk-2UUZCQSD.js → chunk-VCCTTKP3.js} +2 -2
- package/dist/cli/chunks/{chunk-P4OB6WDJ.js → chunk-VEGUYUVS.js} +1 -1
- package/dist/cli/chunks/{chunk-WX4PO65Q.js → chunk-VUQPVWNK.js} +2 -2
- package/dist/cli/chunks/{chunk-IQL6XRF5.js → chunk-VVGUE2T2.js} +2 -2
- package/dist/cli/chunks/{chunk-HZ5O7G2P.js → chunk-W5ASDHJQ.js} +1 -1
- package/dist/cli/chunks/{chunk-U4S74IIZ.js → chunk-WGXT5NWQ.js} +1 -1
- package/dist/cli/chunks/chunk-WJN3V7QB.js +7 -0
- package/dist/cli/chunks/chunk-WPCRQIIF.js +29 -0
- package/dist/cli/chunks/{chunk-AGCS5GSO.js → chunk-WQNLXUWA.js} +6 -6
- package/dist/cli/chunks/{chunk-LRY6UIRI.js → chunk-WZVRMKG2.js} +2 -2
- package/dist/cli/chunks/{chunk-KPIPVSIP.js → chunk-X27IUWTD.js} +2 -2
- package/dist/cli/chunks/{chunk-VDEKVIP5.js → chunk-X4B345B6.js} +2 -2
- package/dist/cli/chunks/{chunk-ERYADKMZ.js → chunk-X5I2Y4VO.js} +2 -2
- package/dist/cli/chunks/{chunk-EUWG2JG4.js → chunk-X7IQIFTS.js} +2 -2
- package/dist/cli/chunks/chunk-XJN3RKUD.js +3 -0
- package/dist/cli/chunks/{chunk-JRIJM4LE.js → chunk-XQMGXTHJ.js} +3 -3
- package/dist/cli/chunks/{chunk-VYPVU3JF.js → chunk-XTSAMB2Q.js} +2 -2
- package/dist/cli/chunks/{chunk-4NKZU2JZ.js → chunk-XZLIF4O2.js} +2 -2
- package/dist/cli/chunks/{chunk-XFTX3KLE.js → chunk-Y4LSEOZ3.js} +1 -1
- package/dist/cli/chunks/{chunk-ZVMSSCTH.js → chunk-Y4YN2RXR.js} +2 -2
- package/dist/cli/chunks/{chunk-X5QD76IU.js → chunk-YDI56L35.js} +2 -2
- package/dist/cli/chunks/{chunk-LRKLATSH.js → chunk-YFILS5D5.js} +2 -2
- package/dist/cli/chunks/{chunk-AVHYJ3XP.js → chunk-YISDX6WB.js} +2 -2
- package/dist/cli/chunks/{chunk-GPPTRKEM.js → chunk-YP2GHQSV.js} +2 -2
- package/dist/cli/chunks/{chunk-OO2M2QUV.js → chunk-YSX756AM.js} +4 -4
- package/dist/cli/chunks/{chunk-E7XIMOKW.js → chunk-YWANOASW.js} +2 -2
- package/dist/cli/chunks/{chunk-UHJVZEQA.js → chunk-YYIJLG7S.js} +2 -2
- package/dist/cli/chunks/{chunk-LCWEQRZI.js → chunk-Z7SD7LXM.js} +2 -2
- package/dist/cli/chunks/{chunk-TM75GAXG.js → chunk-ZDWD73UF.js} +2 -2
- package/dist/cli/chunks/{chunk-IRHXGCQR.js → chunk-ZFT3RLA4.js} +2 -2
- package/dist/cli/chunks/{chunk-ZGV7L4MW.js → chunk-ZNTHX5G3.js} +1 -1
- package/dist/cli/chunks/{chunk-D75GLKEL.js → chunk-ZS27R7VL.js} +2 -2
- package/dist/cli/chunks/{chunk-INI3Q4CN.js → chunk-ZXHHHR7K.js} +1 -1
- package/dist/cli/chunks/{ci-3RTTTS2D.js → ci-N5MOMNXH.js} +2 -2
- package/dist/cli/chunks/{ci-config-XRUR3I4K.js → ci-config-6L2ROQCW.js} +2 -2
- package/dist/cli/chunks/{ci-output-E5IAMU2U.js → ci-output-DSRBYEIK.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-SHR2P44P.js → circuit-breaker-VRPTNBL7.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-ZDDILFMF.js → claude-flow-setup-4YFG3FU5.js} +2 -2
- package/dist/cli/chunks/client-I3L6BKRQ.js +2 -0
- package/dist/cli/chunks/{cline-installer-BGYVUM6G.js → cline-installer-7RGYJWGN.js} +2 -2
- package/dist/cli/chunks/{code-PJ4MC3MC.js → code-ISC6NW2K.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-IW2P22YG.js → code-index-extractor-2FID75YV.js} +2 -2
- package/dist/cli/chunks/{codex-installer-A7WZ6OGL.js → codex-installer-DZ7OG6KM.js} +2 -2
- package/dist/cli/chunks/{completions-KS23WD5J.js → completions-SM3LICWK.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-Q7GLSR2E.js → complexity-analyzer-ZWD2CTAD.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-SK55BFW2.js → continuedev-installer-AGASOA26.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-3N5J3WTM.js → copilot-installer-CLPZYTQC.js} +2 -2
- package/dist/cli/chunks/core-handlers-5EFOJ37H.js +2 -0
- package/dist/cli/chunks/{cost-tracker-NENVSO4A.js → cost-tracker-7PIGQYDV.js} +2 -2
- package/dist/cli/chunks/{coverage-5L7UQWDH.js → coverage-T2GEBTYS.js} +9 -9
- package/dist/cli/chunks/cross-domain-router-65WJAKVD.js +2 -0
- package/dist/cli/chunks/{cursor-installer-XXBO2ZE6.js → cursor-installer-KXBID4MB.js} +2 -2
- package/dist/cli/chunks/daemon-43MXIVH3.js +18 -0
- package/dist/cli/chunks/{daemon-CDCQU3LR.js → daemon-VAMJLQJ5.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-HOMMF7FA.js → dag-attention-scheduler-UBP4VHTA.js} +2 -2
- package/dist/cli/chunks/{detect-FXCOUG6X.js → detect-QWFIQRKI.js} +2 -2
- package/dist/cli/chunks/{dist-node-GXQ7FMTY.js → dist-node-I2GICS3W.js} +2 -2
- package/dist/cli/chunks/{domain-handler-TI3JBAPC.js → domain-handler-Z66ISB2A.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-R7LTUM32.js → domain-plugins-KHMD3FKT.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-LBIAFHIQ.js → domain-transfer-JWGNNA6K.js} +2 -2
- package/dist/cli/chunks/dream-VQ2PZCVR.js +2 -0
- package/dist/cli/chunks/embed-and-insert-pattern-F5P5B6JX.js +3 -0
- package/dist/cli/chunks/{embedding-space-HHLWTBF5.js → embedding-space-KHG6TITM.js} +2 -2
- package/dist/cli/chunks/{eval-KDOZMAXJ.js → eval-43OHU7EI.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-X45PECQN.js → experience-capture-middleware-KXD47H6P.js} +3 -3
- package/dist/cli/chunks/{fast-paths-462V6UUB.js → fast-paths-6D75D5KD.js} +2 -2
- package/dist/cli/chunks/{feature-flags-NIRQ4YDM.js → feature-flags-IE35Y55N.js} +2 -2
- package/dist/cli/chunks/{feature-flags-G66OT3AS.js → feature-flags-OYYHY7LS.js} +2 -2
- package/dist/cli/chunks/file-discovery-LGBTY3ID.js +2 -0
- package/dist/cli/chunks/{fleet-PXWGB7CU.js → fleet-AGVJMFGD.js} +16 -16
- package/dist/cli/chunks/{gnn-wrapper-7MUW3M5M.js → gnn-wrapper-5L66A7LW.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-5237PB35.js → heartbeat-handler-2BY6YYOT.js} +5 -5
- package/dist/cli/chunks/heartbeat-scheduler-3DU3M5AT.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-N2IMSRPV.js +2 -0
- package/dist/cli/chunks/hnsw-index-DVU7TTJE.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-OSQPW7JP.js → hnsw-legacy-bridge-RYMWFNAH.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-GX6WG2GB.js → hnswlib-node-GG47HP2P.js} +2 -2
- package/dist/cli/chunks/{hooks-GUWHL7VC.js → hooks-FQNACS24.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-AS2PNHOD.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-SRWLLCU3.js → hypergraph-engine-6BYNJQEP.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-AVOPRHHO.js → hypergraph-handler-CYTAXZKJ.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-Y4OONLFP.js +2 -0
- package/dist/cli/chunks/{init-guard-P4N6EVZS.js → init-guard-METTAV5O.js} +2 -2
- package/dist/cli/chunks/{init-handler-LRGWOJMD.js → init-handler-GFT74U5Y.js} +6 -6
- package/dist/cli/chunks/init-wizard-HLNUBJQN.js +2 -0
- package/dist/cli/chunks/kernel-XKFWCL7Y.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-7R2EPOQ6.js → kilocode-installer-GZV2D3FF.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-QNM7DPOB.js → kiro-installer-Q4ZXUFC7.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-CNL77CSZ.js +2 -0
- package/dist/cli/chunks/{learning-7OIZBPXZ.js → learning-WA2QEYL7.js} +35 -34
- package/dist/cli/chunks/{llm-router-SIDXES23.js → llm-router-GRTCHWH7.js} +4 -4
- package/dist/cli/chunks/llm-router-service-UIYTYKP6.js +2 -0
- package/dist/cli/chunks/{load-EI2E2C3S.js → load-WXN3Q7Y5.js} +2 -2
- package/dist/cli/chunks/load-test-PXLW4A5B.js +2 -0
- package/dist/cli/chunks/{mcp-IOE5WOCS.js → mcp-LIQCPSJN.js} +2 -2
- package/dist/cli/chunks/{memory-DLYGJAP7.js → memory-OP6CHRFH.js} +5 -5
- package/dist/cli/chunks/memory-backend-XYOSO73Q.js +2 -0
- package/dist/cli/chunks/memory-handlers-PQFYVNVG.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-WHH4YCHM.js → multi-model-executor-H54DEVRZ.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-63FDZAMS.js → opencode-installer-BSQV6UAT.js} +2 -2
- package/dist/cli/chunks/{orchestrator-3LA776KK.js → orchestrator-TJDPQ4VL.js} +122 -35
- package/dist/cli/chunks/pattern-null-store-BKGTQFNF.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-NW54QUGI.js → pattern-usage-recorder-FOVS4M5L.js} +2 -2
- package/dist/cli/chunks/{pipeline-P3TYX6J6.js → pipeline-4AY2ZIC6.js} +2 -2
- package/dist/cli/chunks/{platform-FNA2WLI6.js → platform-FCSITYMR.js} +2 -2
- package/dist/cli/chunks/{plugin-NJS7BC2S.js → plugin-E56TV5S2.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-NIAVL2OT.js → prime-radiant-advanced-wasm-ACOPC533.js} +2 -2
- package/dist/cli/chunks/project-root-MPX7CN2C.js +2 -0
- package/dist/cli/chunks/protocol-executor-CRQOCC4A.js +2 -0
- package/dist/cli/chunks/{protocol-handler-JU5C4JHY.js → protocol-handler-KRVXF4LS.js} +2 -2
- package/dist/cli/chunks/{prove-35VOSLYP.js → prove-KMFPSKGD.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-UEGQ3O7F.js +2 -0
- package/dist/cli/chunks/{quality-ET74X7HN.js → quality-6DBI3HLB.js} +2 -2
- package/dist/cli/chunks/{quality-gate-FEDQISNB.js → quality-gate-3ROZMEIL.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-32574XSG.js +2 -0
- package/dist/cli/chunks/real-embeddings-MIGZNKK3.js +2 -0
- package/dist/cli/chunks/{ref-validation-DTBPYCEB.js → ref-validation-EYIP7DHW.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-LYQEMR4J.js → roocode-installer-IGGZHR2Y.js} +2 -2
- package/dist/cli/chunks/router-CZJY5WX6.js +2 -0
- package/dist/cli/chunks/routing-feedback-RC3UBNFX.js +2 -0
- package/dist/cli/chunks/{routing-handler-DJOJFPII.js → routing-handler-BWNHBYDC.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-VXYGJDPW.js → ruvector-commands-PXIHF432.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-OG7OV2AK.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-THYMW7ZO.js +2 -0
- package/dist/cli/chunks/rvf-migration-coordinator-3H6CLFU7.js +2 -0
- package/dist/cli/chunks/rvf-native-adapter-6JQJIKKW.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-GA2ZYOEG.js → rvf-store-integrity-CVB3NMSL.js} +2 -2
- package/dist/cli/chunks/safe-db-QFKCVTIJ.js +2 -0
- package/dist/cli/chunks/schedule-6JLVMMYB.js +2 -0
- package/dist/cli/chunks/scheduler-3MPZRMJD.js +2 -0
- package/dist/cli/chunks/{security-MM6YOECX.js → security-DCRGOTWU.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-6AHPA3V5.js → shared-rvf-adapter-GKD74QUB.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-EYAVY2GZ.js → shared-rvf-dual-writer-HVAAVEOH.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-LGTIKAEX.js +2 -0
- package/dist/cli/chunks/{standalone-memory-A3PLB4CZ.js → standalone-memory-O7O2U5N4.js} +2 -2
- package/dist/cli/chunks/{status-handler-OSSFAP4Z.js → status-handler-BQTPJJTL.js} +2 -2
- package/dist/cli/chunks/{structural-health-PGY5XUNO.js → structural-health-4H6J4OHK.js} +2 -2
- package/dist/cli/chunks/sync-DJ4TF6QX.js +2 -0
- package/dist/cli/chunks/{sync-CWEHYGNN.js → sync-WW5TAVYW.js} +2 -2
- package/dist/cli/chunks/{task-handler-LHMQ75W4.js → task-handler-HEM4IEOW.js} +2 -2
- package/dist/cli/chunks/{task-handlers-S2TX5FTR.js → task-handlers-JRA3NXIR.js} +3 -3
- package/dist/cli/chunks/{test-4EGZZ6NJ.js → test-772ZXVG2.js} +4 -4
- package/dist/cli/chunks/test-runner-process-XGF2U3NG.js +2 -0
- package/dist/cli/chunks/{test-scheduling-YJQHH3XE.js → test-scheduling-4TRB7LZ7.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-CICBIJ7T.js +2 -0
- package/dist/cli/chunks/{token-usage-WPNOJR6H.js → token-usage-B7PEKE2G.js} +2 -2
- package/dist/cli/chunks/{transformers-4MRPXCPU.js → transformers-V7X7BDZX.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-OXPFKFZS.js +2 -0
- package/dist/cli/chunks/{types-6P5FB4EB.js → types-AHHTUY3I.js} +2 -2
- package/dist/cli/chunks/unified-memory-GUR3IUI6.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-NJP2F2RY.js +2 -0
- package/dist/cli/chunks/unified-persistence-NILBWXDP.js +2 -0
- package/dist/cli/chunks/{upgrade-4ICTN63Y.js → upgrade-DZ4DLUQ5.js} +2 -2
- package/dist/cli/chunks/{validate-HQF5GZ7L.js → validate-4DTLIDJE.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-45JYG7VW.js → validate-swarm-A26UFVIS.js} +2 -2
- package/dist/cli/chunks/visual-security-YECYZ27X.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-UOTWZLNH.js → web-tree-sitter-F2C7QRYT.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-WDWSBXGN.js → windsurf-installer-OOBTDA6W.js} +2 -2
- package/dist/cli/chunks/{witness-chain-DOYMNPC7.js → witness-chain-KGFZJP32.js} +2 -2
- package/dist/cli/chunks/witness-chain-LYBXFLJB.js +2 -0
- package/dist/cli/chunks/witness-chain-repair-CNTXOGPN.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-JB42X62J.js → witness-chain-verifier-OB7ZZOI3.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-LXXO6L2G.js → witness-key-manager-YCKGKGQI.js} +2 -2
- package/dist/cli/chunks/{workflow-6ARK47NF.js → workflow-PRERHWKY.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-UIBGWCU3.js +2 -0
- package/dist/cli/chunks/wrappers-L4UY4V63.js +2 -0
- package/dist/cli/commands/coverage.js +4 -1
- package/dist/cli/commands/learning-prune.js +9 -1
- package/dist/cli/handlers/brain-handler.js +32 -2
- package/dist/cli/handlers/heartbeat-handler.js +3 -1
- package/dist/cli/utils/coverage-data.js +5 -1
- package/dist/cli/utils/coverage-verdict.d.ts +10 -2
- package/dist/cli/utils/coverage-verdict.js +23 -8
- package/dist/cli/utils/fleet-operation.js +9 -3
- package/dist/coordination/handlers/code-intelligence-handlers.js +17 -3
- package/dist/coordination/handlers/coverage-handlers.js +22 -9
- package/dist/coordination/handlers/coverage-target.d.ts +22 -2
- package/dist/coordination/handlers/coverage-target.js +45 -9
- package/dist/coordination/handlers/handler-utils.d.ts +19 -0
- package/dist/coordination/handlers/handler-utils.js +22 -8
- package/dist/coordination/protocols/code-intelligence-index.js +6 -3
- package/dist/coordination/protocols/learning-consolidation-archive.d.ts +6 -3
- package/dist/coordination/protocols/learning-consolidation-archive.js +4 -3
- package/dist/coordination/workflow-builtin.js +1 -0
- package/dist/domains/defect-intelligence/interfaces.d.ts +2 -0
- package/dist/domains/defect-intelligence/prediction-history.d.ts +15 -1
- package/dist/domains/defect-intelligence/prediction-history.js +63 -7
- package/dist/domains/defect-intelligence/services/defect-predictor.d.ts +1 -0
- package/dist/domains/defect-intelligence/services/defect-predictor.js +33 -13
- package/dist/domains/learning-optimization/coordinator.js +17 -10
- package/dist/domains/learning-optimization/domain-ranking.d.ts +26 -0
- package/dist/domains/learning-optimization/domain-ranking.js +28 -0
- package/dist/domains/learning-optimization/interfaces.d.ts +5 -0
- package/dist/domains/learning-optimization/pattern-archive.d.ts +55 -8
- package/dist/domains/learning-optimization/pattern-archive.js +90 -17
- package/dist/domains/learning-optimization/pattern-consolidation.js +18 -2
- package/dist/domains/learning-optimization/pattern-merge.d.ts +26 -0
- package/dist/domains/learning-optimization/pattern-merge.js +127 -0
- package/dist/domains/learning-optimization/services/learning-coordinator.js +21 -35
- package/dist/domains/test-execution/services/test-executor.js +6 -2
- package/dist/init/init-wizard-steps.js +3 -1
- package/dist/init/phases/07-hooks.js +97 -10
- package/dist/integrations/embeddings/cache/EmbeddingCache.js +1 -1
- package/dist/integrations/ruvector/brain-rvf-exporter.d.ts +16 -1
- package/dist/integrations/ruvector/brain-rvf-exporter.js +18 -32
- package/dist/integrations/ruvector/brain-rvf-richness.d.ts +75 -0
- package/dist/integrations/ruvector/brain-rvf-richness.js +127 -0
- package/dist/kernel/unified-memory-migration.js +1 -1
- package/dist/learning/checkpoint-shrink-ack.d.ts +25 -0
- package/dist/learning/checkpoint-shrink-ack.js +57 -0
- package/dist/learning/dream/dream-engine.d.ts +44 -3
- package/dist/learning/dream/dream-engine.js +6 -2
- package/dist/learning/embedder-identity-store.js +3 -1
- package/dist/learning/embedding-space-legacy-adoption.d.ts +53 -0
- package/dist/learning/embedding-space-legacy-adoption.js +115 -0
- package/dist/learning/embedding-space-registry.d.ts +15 -0
- package/dist/learning/embedding-space-registry.js +50 -11
- package/dist/learning/experience-capture.d.ts +3 -1
- package/dist/learning/experience-capture.js +15 -5
- package/dist/learning/experience-space-verification.d.ts +2 -0
- package/dist/learning/experience-space-verification.js +3 -2
- package/dist/learning/learning-retention.js +4 -0
- package/dist/learning/pattern-promotion.d.ts +7 -0
- package/dist/learning/pattern-promotion.js +64 -12
- package/dist/learning/real-embeddings.js +31 -7
- package/dist/learning/rvf-pattern-store.js +6 -1
- package/dist/mcp/bundle.js +570 -558
- package/dist/mcp/handlers/domain-handler-configs.d.ts +3 -0
- package/dist/mcp/handlers/domain-handler-configs.js +1 -0
- package/dist/mcp/handlers/heartbeat-handlers.d.ts +4 -2
- package/dist/mcp/tools/learning-optimization/optimize.d.ts +6 -1
- package/dist/mcp/tools/learning-optimization/optimize.js +20 -11
- package/dist/planning/goap-planner.js +4 -0
- package/dist/planning/plan-executor.js +6 -2
- package/dist/shared/git/git-analyzer.d.ts +30 -11
- package/dist/shared/git/git-analyzer.js +95 -48
- package/dist/shared/io/confined-read.d.ts +32 -7
- package/dist/shared/io/confined-read.js +58 -25
- package/dist/shared/io/file-reader.js +4 -1
- package/dist/shared/safe-db.d.ts +1 -1
- package/dist/shared/safe-db.js +20 -5
- package/dist/shared/sqlite-journal-mode.d.ts +39 -0
- package/dist/shared/sqlite-journal-mode.js +53 -0
- package/dist/sync/claude-flow-bridge.js +1 -1
- package/dist/sync/readers/sqlite-reader.js +3 -4
- package/dist/sync/writers/sqlite-writer.js +1 -1
- package/dist/workers/interfaces.d.ts +2 -2
- package/dist/workers/quality-daemon/git-watcher.d.ts +8 -0
- package/dist/workers/quality-daemon/git-watcher.js +54 -12
- package/dist/workers/quality-daemon/index.js +1 -1
- package/dist/workers/quality-daemon/priority-queue.d.ts +2 -1
- package/dist/workers/workers/defect-predictor.d.ts +9 -4
- package/dist/workers/workers/defect-predictor.js +98 -37
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-OMILP6KH.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-OXH5CCOS.js +0 -2
- package/dist/cli/chunks/base-MAK2BLTG.js +0 -2
- package/dist/cli/chunks/brain-handler-GCQZFZGQ.js +0 -95
- package/dist/cli/chunks/browser-workflow-IR3VF2TL.js +0 -2
- package/dist/cli/chunks/chunk-4EJLHNER.js +0 -12
- package/dist/cli/chunks/chunk-A4BVDYIL.js +0 -2
- package/dist/cli/chunks/chunk-BE7ZHM34.js +0 -3
- package/dist/cli/chunks/chunk-DHKSPOUQ.js +0 -16
- package/dist/cli/chunks/chunk-FAQ24UHB.js +0 -29
- package/dist/cli/chunks/chunk-IOWEBPXJ.js +0 -5
- package/dist/cli/chunks/chunk-KB34MTFZ.js +0 -3
- package/dist/cli/chunks/chunk-MCXW3DKE.js +0 -8
- package/dist/cli/chunks/chunk-O7VJ3VKD.js +0 -2
- package/dist/cli/chunks/chunk-PIWGKGWP.js +0 -3
- package/dist/cli/chunks/chunk-SFITYZLV.js +0 -7
- package/dist/cli/chunks/chunk-TIVKDIF7.js +0 -2
- package/dist/cli/chunks/client-NO5FOWT4.js +0 -2
- package/dist/cli/chunks/core-handlers-JNAZPXE2.js +0 -2
- package/dist/cli/chunks/cross-domain-router-HEBM767Z.js +0 -2
- package/dist/cli/chunks/daemon-JEBJGEUK.js +0 -18
- package/dist/cli/chunks/dream-GQDCEJMS.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-33KLHDD5.js +0 -3
- package/dist/cli/chunks/file-discovery-33USPLB5.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-LIXLC5IH.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-62D5UH27.js +0 -2
- package/dist/cli/chunks/hnsw-index-GSGUMQQC.js +0 -2
- package/dist/cli/chunks/hybrid-backend-FRWP4BOY.js +0 -2
- package/dist/cli/chunks/impact-analyzer-7KF3AQXV.js +0 -2
- package/dist/cli/chunks/init-wizard-XWWAXY25.js +0 -2
- package/dist/cli/chunks/kernel-ZEJPNDBW.js +0 -2
- package/dist/cli/chunks/knowledge-graph-RRZQS7KY.js +0 -2
- package/dist/cli/chunks/llm-router-service-3OSW67LC.js +0 -2
- package/dist/cli/chunks/load-test-7TRIH2WJ.js +0 -2
- package/dist/cli/chunks/memory-backend-G7ZW6Q2B.js +0 -2
- package/dist/cli/chunks/memory-handlers-TPF3KCO5.js +0 -2
- package/dist/cli/chunks/pattern-null-store-OU3ZC3NR.js +0 -2
- package/dist/cli/chunks/project-root-GMOFJEKD.js +0 -2
- package/dist/cli/chunks/protocol-executor-AD345XRO.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-NLTP26RC.js +0 -2
- package/dist/cli/chunks/queen-coordinator-2TB4FWS6.js +0 -2
- package/dist/cli/chunks/real-embeddings-II6CXTCI.js +0 -2
- package/dist/cli/chunks/router-PLM3MWME.js +0 -2
- package/dist/cli/chunks/routing-feedback-I7VOX2HU.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-GQZHFWO2.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-3TVKBCAM.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-XUHKLMT6.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-5GUTYOWS.js +0 -2
- package/dist/cli/chunks/safe-db-RZPQGLGQ.js +0 -2
- package/dist/cli/chunks/schedule-G7JMQDUX.js +0 -2
- package/dist/cli/chunks/scheduler-4SEGPCKD.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-IVE4SQXR.js +0 -2
- package/dist/cli/chunks/sync-PM6D7EQF.js +0 -2
- package/dist/cli/chunks/test-runner-process-72YACW6M.js +0 -2
- package/dist/cli/chunks/token-bootstrap-DJNETMVW.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-UVWSDXFR.js +0 -2
- package/dist/cli/chunks/unified-memory-2VMGSGQL.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-3KULVD3N.js +0 -2
- package/dist/cli/chunks/unified-persistence-QCSLU2SV.js +0 -2
- package/dist/cli/chunks/visual-security-ZYP2KPH7.js +0 -2
- package/dist/cli/chunks/witness-chain-5QRT7EMX.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-CUF2AFQB.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-RYDDWIXN.js +0 -2
- package/dist/cli/chunks/wrappers-CYQBOMPL.js +0 -2
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
* ADR-051: LLM enhancement for AI-powered defect risk analysis
|
|
7
7
|
*/
|
|
8
8
|
import { v4 as uuidv4 } from 'uuid';
|
|
9
|
-
import { prunePredictionHistory } from '../prediction-history.js';
|
|
9
|
+
import { predictionTargetForFiles, prunePredictionHistory } from '../prediction-history.js';
|
|
10
10
|
import { LoggerFactory } from '../../../logging/index.js';
|
|
11
11
|
import { ok, err } from '../../../shared/types/index.js';
|
|
12
12
|
import { GitAnalyzer } from '../../../shared/git/index.js';
|
|
13
13
|
import { FileReader } from '../../../shared/io/index.js';
|
|
14
14
|
import { findProjectRoot } from '../../../kernel/project-root.js';
|
|
15
15
|
import { TypeScriptParser } from '../../../shared/parsers/index.js';
|
|
16
|
-
import { toError } from '../../../shared/error-utils.js';
|
|
16
|
+
import { toError, toErrorMessage } from '../../../shared/error-utils.js';
|
|
17
17
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
18
18
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
19
19
|
import { measuredFileCoverage } from '../../quality-assessment/coverage-report-event.js';
|
|
@@ -55,8 +55,8 @@ const DEFAULT_FEATURES = [
|
|
|
55
55
|
* ADR-051: Added LLM enhancement for AI-powered defect risk analysis
|
|
56
56
|
*/
|
|
57
57
|
const logger = LoggerFactory.create('defect-intelligence/defect-predictor');
|
|
58
|
-
const GIT_TIMEOUT_WARNING = 'Git history timed out for this file: change frequency, developer experience,
|
|
59
|
-
'use their "no git data" defaults, so this prediction is incomplete.';
|
|
58
|
+
const GIT_TIMEOUT_WARNING = 'Git history timed out or was too large to read for this file: change frequency, developer experience, ' +
|
|
59
|
+
'code age and bug history use their "no git data" defaults, so this prediction is incomplete.';
|
|
60
60
|
export class DefectPredictorService {
|
|
61
61
|
config;
|
|
62
62
|
memory;
|
|
@@ -298,7 +298,7 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
298
298
|
}
|
|
299
299
|
}
|
|
300
300
|
// Store prediction for potential feedback
|
|
301
|
-
await this.storePrediction(predictions);
|
|
301
|
+
const retained = await this.storePrediction(predictions, files);
|
|
302
302
|
// Update metrics
|
|
303
303
|
this.modelMetrics.totalPredictions += predictions.length;
|
|
304
304
|
this.modelMetrics.lastUpdated = new Date();
|
|
@@ -308,6 +308,7 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
308
308
|
factors: Array.from(factors),
|
|
309
309
|
// ADR-051: Include LLM analysis in result if available
|
|
310
310
|
llmAnalysis: llmAnalysis ?? undefined,
|
|
311
|
+
...(retained ? {} : { retention: 'failed' }),
|
|
311
312
|
});
|
|
312
313
|
}
|
|
313
314
|
catch (error) {
|
|
@@ -477,13 +478,17 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
477
478
|
codeAge: await this.getCodeAge(file),
|
|
478
479
|
bugHistory: await this.getBugHistory(file),
|
|
479
480
|
});
|
|
480
|
-
// #1115: the git-based metrics of one file share one deadline.
|
|
481
|
-
const metrics = this.gitAnalyzer.withFileDeadline
|
|
482
|
-
? await this.gitAnalyzer.withFileDeadline(file, measure)
|
|
483
|
-
: await measure();
|
|
484
481
|
// #1115: a git timeout left defaults in the git-based metrics; do not
|
|
485
|
-
// cache them as this file's measured metrics.
|
|
486
|
-
|
|
482
|
+
// cache them as this file's measured metrics. #1165: read the flag inside
|
|
483
|
+
// the deadline call, so another prediction on the same file cannot take it.
|
|
484
|
+
const measureOnce = async () => ({
|
|
485
|
+
metrics: await measure(),
|
|
486
|
+
gitTimedOut: this.gitAnalyzer.consumeTimeout?.(file) === true,
|
|
487
|
+
});
|
|
488
|
+
// #1115: the git-based metrics of one file share one deadline.
|
|
489
|
+
const { metrics, gitTimedOut } = this.gitAnalyzer.withFileDeadline
|
|
490
|
+
? await this.gitAnalyzer.withFileDeadline(file, measureOnce)
|
|
491
|
+
: await measureOnce();
|
|
487
492
|
if (!gitTimedOut) {
|
|
488
493
|
await this.memory.set(`${this.config.modelNamespace}:file-metrics:${file}`, metrics, { namespace: 'defect-intelligence', ttl: 3600 } // 1 hour cache
|
|
489
494
|
);
|
|
@@ -899,6 +904,11 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
899
904
|
// More predictions generally mean better confidence
|
|
900
905
|
if (predictions.length > 10)
|
|
901
906
|
confidence *= 1.05;
|
|
907
|
+
// #1165: git defaults stand in for most features of a prediction whose
|
|
908
|
+
// git history timed out; such predictions halve their share of confidence.
|
|
909
|
+
const incomplete = predictions.filter((p) => p.warnings?.includes(GIT_TIMEOUT_WARNING)).length;
|
|
910
|
+
if (predictions.length > 0)
|
|
911
|
+
confidence *= 1 - incomplete / predictions.length / 2;
|
|
902
912
|
return Math.min(1, Math.max(0, confidence));
|
|
903
913
|
}
|
|
904
914
|
calculateVariance(values) {
|
|
@@ -908,15 +918,25 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
908
918
|
const squareDiffs = values.map((v) => Math.pow(v - mean, 2));
|
|
909
919
|
return squareDiffs.reduce((a, b) => a + b, 0) / values.length;
|
|
910
920
|
}
|
|
911
|
-
|
|
921
|
+
/** Records the run; `false` when it was stored but older runs could not be pruned (#1137). */
|
|
922
|
+
async storePrediction(predictions, files) {
|
|
912
923
|
const predictionId = uuidv4();
|
|
913
924
|
await this.memory.set(`${this.config.modelNamespace}:prediction:${predictionId}`, {
|
|
914
925
|
id: predictionId,
|
|
926
|
+
target: predictionTargetForFiles(files),
|
|
915
927
|
predictions,
|
|
916
928
|
timestamp: new Date().toISOString(),
|
|
917
929
|
}, { namespace: 'defect-intelligence', ttl: 86400 * 7 } // 7 days
|
|
918
930
|
);
|
|
919
|
-
|
|
931
|
+
try {
|
|
932
|
+
await prunePredictionHistory(this.memory, this.config.modelNamespace);
|
|
933
|
+
return true;
|
|
934
|
+
}
|
|
935
|
+
catch (error) {
|
|
936
|
+
// The run is stored; retention catches up on the next run or the TTL.
|
|
937
|
+
logger.warn('Defect prediction stored, but pruning older runs failed', { error: toErrorMessage(error) });
|
|
938
|
+
return false;
|
|
939
|
+
}
|
|
920
940
|
}
|
|
921
941
|
async recalculateMetrics(feedback) {
|
|
922
942
|
// Simple online update of accuracy
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { LoggerFactory } from '../../logging/index.js';
|
|
6
6
|
import { readActivePatterns, LEARNING_NS } from './active-patterns.js';
|
|
7
7
|
import { partitionByRewardSource } from './reward-source.js';
|
|
8
|
+
import { measuredSuccessRate, rankTopPerformingDomains } from './domain-ranking.js';
|
|
8
9
|
import { searchAllKeys } from '../../shared/utils/namespaced-search.js';
|
|
9
10
|
import { v4 as uuidv4 } from 'uuid';
|
|
10
11
|
import { toError } from '../../shared/error-utils.js';
|
|
@@ -362,6 +363,7 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
|
|
|
362
363
|
let knowledgeShared = 0;
|
|
363
364
|
const domainsUpdated = [];
|
|
364
365
|
let newPatternsCreated = 0;
|
|
366
|
+
const mergeFailures = [];
|
|
365
367
|
let totalTransfers = 0;
|
|
366
368
|
let successfulTransfers = 0;
|
|
367
369
|
// Get all knowledge items
|
|
@@ -404,6 +406,12 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
|
|
|
404
406
|
if (consolidateResult.success) {
|
|
405
407
|
newPatternsCreated++;
|
|
406
408
|
}
|
|
409
|
+
else {
|
|
410
|
+
// #1149: a merge failure is reported, never dropped.
|
|
411
|
+
const failure = { sourcePatternIds: group.map((p) => p.id), error: consolidateResult.error.message };
|
|
412
|
+
mergeFailures.push(failure);
|
|
413
|
+
logger.warn('Pattern merge failed during cross-domain sharing', failure);
|
|
414
|
+
}
|
|
407
415
|
}
|
|
408
416
|
}
|
|
409
417
|
}
|
|
@@ -415,6 +423,7 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
|
|
|
415
423
|
// #1121: with no transfer attempted there is no rate, not 100%.
|
|
416
424
|
transferSuccessRate: totalTransfers > 0 ? successfulTransfers / totalTransfers : null,
|
|
417
425
|
newPatternsCreated,
|
|
426
|
+
...(mergeFailures.length > 0 ? { mergeFailures } : {}),
|
|
418
427
|
};
|
|
419
428
|
// Publish event
|
|
420
429
|
if (this.config.publishEvents && knowledgeShared > 0) {
|
|
@@ -447,10 +456,14 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
|
|
|
447
456
|
// Get experiences from last 24h
|
|
448
457
|
const timeRange = TimeRange.lastNDays(1);
|
|
449
458
|
let experiencesLast24h = 0;
|
|
459
|
+
const domainRates = [];
|
|
450
460
|
for (const domain of ALL_DOMAINS) {
|
|
451
|
-
|
|
461
|
+
// #1147: read through the learning service, which reads the
|
|
462
|
+
// learning-optimization namespace the experiences are stored in.
|
|
463
|
+
const expResult = await this.learningService.getExperiences(domain, timeRange);
|
|
452
464
|
if (expResult.success) {
|
|
453
465
|
experiencesLast24h += expResult.value.length;
|
|
466
|
+
domainRates.push({ domain, successRate: measuredSuccessRate(expResult.value) });
|
|
454
467
|
}
|
|
455
468
|
}
|
|
456
469
|
// Get production health for trends
|
|
@@ -467,15 +480,9 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
|
|
|
467
480
|
const overallLearningRate = patternStats && patternStats.totalPatterns > 0
|
|
468
481
|
? patternStats.avgSuccessRate * 0.6 + (patternStats.avgConfidence * 0.4)
|
|
469
482
|
: null;
|
|
470
|
-
//
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
const domainScores = Object.entries(patternStats.byDomain)
|
|
474
|
-
.filter(([_, count]) => count > 0)
|
|
475
|
-
.map(([domain, count]) => ({ domain: domain, score: count }))
|
|
476
|
-
.sort((a, b) => b.score - a.score);
|
|
477
|
-
topPerformingDomains.push(...domainScores.slice(0, 3).map((d) => d.domain));
|
|
478
|
-
}
|
|
483
|
+
// #1147: rank by measured success over the same 24h, not by pattern
|
|
484
|
+
// count; a domain with no measured outcome or at 0% is left out.
|
|
485
|
+
const { topPerformingDomains } = rankTopPerformingDomains(domainRates);
|
|
479
486
|
const dashboard = {
|
|
480
487
|
overallLearningRate,
|
|
481
488
|
totalPatterns: patternStats?.totalPatterns || 0,
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Ranking domains by measured success (#1147)
|
|
3
|
+
*
|
|
4
|
+
* Pure: no reads or writes. Both learning dashboards (the MCP
|
|
5
|
+
* `qe/learning/optimize` tool and the domain coordinator) rank domains with
|
|
6
|
+
* this one rule:
|
|
7
|
+
* - a domain with no measured outcome has no rate and is left out;
|
|
8
|
+
* - a domain whose measured runs all failed (0%) is not top-performing;
|
|
9
|
+
* - the rest are ordered by measured success rate, highest first.
|
|
10
|
+
*/
|
|
11
|
+
import type { DomainName } from '../../shared/types/index.js';
|
|
12
|
+
import type { Experience } from './interfaces.js';
|
|
13
|
+
export interface DomainSuccessRate {
|
|
14
|
+
readonly domain: DomainName;
|
|
15
|
+
/** Measured success rate, or null when the domain has no measured outcome. */
|
|
16
|
+
readonly successRate: number | null;
|
|
17
|
+
}
|
|
18
|
+
export interface TopPerformingDomains {
|
|
19
|
+
readonly topPerformingDomains: DomainName[];
|
|
20
|
+
/** Domains with at least one measured outcome (ranked or not). */
|
|
21
|
+
readonly measuredDomains: number;
|
|
22
|
+
}
|
|
23
|
+
/** Measured success rate of a domain's experiences; null when none is measured. */
|
|
24
|
+
export declare function measuredSuccessRate(experiences: readonly Experience[]): number | null;
|
|
25
|
+
export declare function rankTopPerformingDomains(rates: readonly DomainSuccessRate[], limit?: number): TopPerformingDomains;
|
|
26
|
+
//# sourceMappingURL=domain-ranking.d.ts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Ranking domains by measured success (#1147)
|
|
3
|
+
*
|
|
4
|
+
* Pure: no reads or writes. Both learning dashboards (the MCP
|
|
5
|
+
* `qe/learning/optimize` tool and the domain coordinator) rank domains with
|
|
6
|
+
* this one rule:
|
|
7
|
+
* - a domain with no measured outcome has no rate and is left out;
|
|
8
|
+
* - a domain whose measured runs all failed (0%) is not top-performing;
|
|
9
|
+
* - the rest are ordered by measured success rate, highest first.
|
|
10
|
+
*/
|
|
11
|
+
import { partitionByRewardSource } from './reward-source.js';
|
|
12
|
+
/** Measured success rate of a domain's experiences; null when none is measured. */
|
|
13
|
+
export function measuredSuccessRate(experiences) {
|
|
14
|
+
const { measured } = partitionByRewardSource(experiences);
|
|
15
|
+
if (measured.length === 0)
|
|
16
|
+
return null;
|
|
17
|
+
return measured.filter((e) => e.result.success).length / measured.length;
|
|
18
|
+
}
|
|
19
|
+
export function rankTopPerformingDomains(rates, limit = 3) {
|
|
20
|
+
const measured = rates.filter((r) => r.successRate !== null);
|
|
21
|
+
const topPerformingDomains = measured
|
|
22
|
+
.filter((r) => r.successRate > 0)
|
|
23
|
+
.sort((a, b) => b.successRate - a.successRate)
|
|
24
|
+
.slice(0, limit)
|
|
25
|
+
.map((r) => r.domain);
|
|
26
|
+
return { topPerformingDomains, measuredDomains: measured.length };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=domain-ranking.js.map
|
|
@@ -493,6 +493,11 @@ export interface CrossDomainSharingReport {
|
|
|
493
493
|
/** Null when no transfer was attempted (#1121). */
|
|
494
494
|
readonly transferSuccessRate: number | null;
|
|
495
495
|
readonly newPatternsCreated: number;
|
|
496
|
+
/** Pattern merges that failed; absent when none did (#1149). */
|
|
497
|
+
readonly mergeFailures?: ReadonlyArray<{
|
|
498
|
+
readonly sourcePatternIds: string[];
|
|
499
|
+
readonly error: string;
|
|
500
|
+
}>;
|
|
496
501
|
}
|
|
497
502
|
export interface LearningDashboard {
|
|
498
503
|
/** Null when pattern stats are unavailable or no measured pattern exists (#1121). */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Agentic QE v3 - Archiving one learned pattern (#1071, #1106)
|
|
2
|
+
* Agentic QE v3 - Archiving one learned pattern (#1071, #1106, #1149)
|
|
3
3
|
*
|
|
4
4
|
* Archiving is a move inside the `learning-optimization` namespace:
|
|
5
5
|
*
|
|
@@ -12,20 +12,67 @@
|
|
|
12
12
|
* - Only the active key of the given pattern is deleted.
|
|
13
13
|
* - The active record must still be that pattern (same id, and the same scores
|
|
14
14
|
* and last use) when the archive runs, or nothing is written or deleted.
|
|
15
|
-
* - The archive copy is
|
|
16
|
-
* failed or partial write
|
|
15
|
+
* - The archive copy is the stored active record. It is read back and compared
|
|
16
|
+
* in full before the active key is deleted, so a failed or partial write
|
|
17
|
+
* never loses the pattern (#1149).
|
|
18
|
+
* - Compare-and-delete: the active key is deleted only while the active record
|
|
19
|
+
* still equals the archive copy. An update made after the copy keeps the
|
|
20
|
+
* pattern active (#1149).
|
|
21
|
+
* - A copy that is not followed by a delete is removed again, so no archive
|
|
22
|
+
* row is left for a pattern that is still active (#1149).
|
|
23
|
+
* - Moves on one backend run one at a time (`withPatternMoveLock`), so two
|
|
24
|
+
* merges of the same patterns cannot both succeed (#1149). The lock is
|
|
25
|
+
* per process; the backend has no transactions to lock across processes.
|
|
17
26
|
*/
|
|
18
27
|
import type { MemoryBackend } from '../../kernel/interfaces.js';
|
|
19
28
|
import type { LearnedPattern } from './interfaces.js';
|
|
20
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Outcome of one move:
|
|
31
|
+
* - `archived`: copied, verified, and removed from the active set
|
|
32
|
+
* - `missing`: the active record is gone; nothing was written
|
|
33
|
+
* - `changed`: the active record changed since it was selected, or during
|
|
34
|
+
* the move; it stays active and no archive copy is kept
|
|
35
|
+
* - `failed`: the archive copy could not be verified; the pattern stays active
|
|
36
|
+
*/
|
|
37
|
+
export type ArchiveOutcome = 'archived' | 'missing' | 'changed' | 'failed';
|
|
38
|
+
/**
|
|
39
|
+
* Outcome of removing the active key after a copy:
|
|
40
|
+
* - `removed`: the active record equalled the archive copy and was deleted
|
|
41
|
+
* - `missing`: the active record was already gone
|
|
42
|
+
* - `changed`: the active record changed after the copy; left active
|
|
43
|
+
* - `failed`: the archive copy is gone or no longer verifies; left active
|
|
44
|
+
*/
|
|
45
|
+
export type RemoveOutcome = 'removed' | 'missing' | 'changed' | 'failed';
|
|
46
|
+
/**
|
|
47
|
+
* JSON with object keys sorted, so two records compare equal exactly when
|
|
48
|
+
* they store the same values. Dates serialize as ISO strings, as they do in
|
|
49
|
+
* the backend.
|
|
50
|
+
*/
|
|
51
|
+
export declare function canonicalJson(value: unknown): string;
|
|
21
52
|
/**
|
|
22
53
|
* Write the archive copy of one pattern and read it back, without touching
|
|
23
|
-
* the active key. `copied` means the copy is verified and the active
|
|
24
|
-
* is still the given pattern.
|
|
54
|
+
* the active key. `copied` means the copy is verified in full and the active
|
|
55
|
+
* record is still the given pattern. On `failed` the unverified copy has been
|
|
56
|
+
* removed again.
|
|
25
57
|
*/
|
|
26
58
|
export declare function copyPatternToArchive(memory: MemoryBackend, pattern: LearnedPattern, archivedAt?: Date): Promise<'copied' | Exclude<ArchiveOutcome, 'archived'>>;
|
|
27
|
-
/**
|
|
28
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Compare-and-delete the active key of a pattern whose archive copy was
|
|
61
|
+
* verified: delete only while the active record still equals the copy.
|
|
62
|
+
*/
|
|
63
|
+
export declare function removeArchivedPattern(memory: MemoryBackend, pattern: LearnedPattern): Promise<RemoveOutcome>;
|
|
64
|
+
/**
|
|
65
|
+
* Remove the archive copy of a pattern that is still active, after a move
|
|
66
|
+
* that did not complete. The copy is kept when the active record is gone, so
|
|
67
|
+
* a pattern is never left without either record.
|
|
68
|
+
*/
|
|
69
|
+
export declare function discardArchiveCopy(memory: MemoryBackend, pattern: LearnedPattern): Promise<boolean>;
|
|
29
70
|
/** Move one pattern to its archive key in the learning namespace. */
|
|
30
71
|
export declare function archiveSelectedPattern(memory: MemoryBackend, pattern: LearnedPattern, archivedAt?: Date): Promise<ArchiveOutcome>;
|
|
72
|
+
/**
|
|
73
|
+
* Run `fn` after every earlier pattern move on the same backend has settled.
|
|
74
|
+
* Not re-entrant: `fn` must not call `withPatternMoveLock` (or
|
|
75
|
+
* `archiveSelectedPattern`) on the same backend.
|
|
76
|
+
*/
|
|
77
|
+
export declare function withPatternMoveLock<T>(memory: MemoryBackend, fn: () => Promise<T>): Promise<T>;
|
|
31
78
|
//# sourceMappingURL=pattern-archive.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Agentic QE v3 - Archiving one learned pattern (#1071, #1106)
|
|
2
|
+
* Agentic QE v3 - Archiving one learned pattern (#1071, #1106, #1149)
|
|
3
3
|
*
|
|
4
4
|
* Archiving is a move inside the `learning-optimization` namespace:
|
|
5
5
|
*
|
|
@@ -12,38 +12,111 @@
|
|
|
12
12
|
* - Only the active key of the given pattern is deleted.
|
|
13
13
|
* - The active record must still be that pattern (same id, and the same scores
|
|
14
14
|
* and last use) when the archive runs, or nothing is written or deleted.
|
|
15
|
-
* - The archive copy is
|
|
16
|
-
* failed or partial write
|
|
15
|
+
* - The archive copy is the stored active record. It is read back and compared
|
|
16
|
+
* in full before the active key is deleted, so a failed or partial write
|
|
17
|
+
* never loses the pattern (#1149).
|
|
18
|
+
* - Compare-and-delete: the active key is deleted only while the active record
|
|
19
|
+
* still equals the archive copy. An update made after the copy keeps the
|
|
20
|
+
* pattern active (#1149).
|
|
21
|
+
* - A copy that is not followed by a delete is removed again, so no archive
|
|
22
|
+
* row is left for a pattern that is still active (#1149).
|
|
23
|
+
* - Moves on one backend run one at a time (`withPatternMoveLock`), so two
|
|
24
|
+
* merges of the same patterns cannot both succeed (#1149). The lock is
|
|
25
|
+
* per process; the backend has no transactions to lock across processes.
|
|
17
26
|
*/
|
|
18
27
|
import { LEARNING_NS, LEARNING_PATTERN_KEY_PREFIX, isActivePatternKey } from './active-patterns.js';
|
|
28
|
+
const activeKeyOf = (id) => `${LEARNING_PATTERN_KEY_PREFIX}${id}`;
|
|
29
|
+
const archiveKeyOf = (id) => `${LEARNING_PATTERN_KEY_PREFIX}archived:${id}`;
|
|
30
|
+
/**
|
|
31
|
+
* JSON with object keys sorted, so two records compare equal exactly when
|
|
32
|
+
* they store the same values. Dates serialize as ISO strings, as they do in
|
|
33
|
+
* the backend.
|
|
34
|
+
*/
|
|
35
|
+
export function canonicalJson(value) {
|
|
36
|
+
return JSON.stringify(value, (_key, v) => v && typeof v === 'object' && !Array.isArray(v)
|
|
37
|
+
? Object.fromEntries(Object.entries(v).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)))
|
|
38
|
+
: v);
|
|
39
|
+
}
|
|
40
|
+
/** The archive copy without its `archivedAt` stamp, i.e. the record that was archived. */
|
|
41
|
+
function archivedRecord(copy) {
|
|
42
|
+
const { archivedAt: _archivedAt, ...record } = copy;
|
|
43
|
+
return record;
|
|
44
|
+
}
|
|
19
45
|
/**
|
|
20
46
|
* Write the archive copy of one pattern and read it back, without touching
|
|
21
|
-
* the active key. `copied` means the copy is verified and the active
|
|
22
|
-
* is still the given pattern.
|
|
47
|
+
* the active key. `copied` means the copy is verified in full and the active
|
|
48
|
+
* record is still the given pattern. On `failed` the unverified copy has been
|
|
49
|
+
* removed again.
|
|
23
50
|
*/
|
|
24
51
|
export async function copyPatternToArchive(memory, pattern, archivedAt = new Date()) {
|
|
25
|
-
const activeKey =
|
|
52
|
+
const activeKey = activeKeyOf(pattern.id);
|
|
26
53
|
if (!isActivePatternKey(activeKey))
|
|
27
54
|
return 'missing';
|
|
28
55
|
const current = await memory.get(activeKey, LEARNING_NS);
|
|
29
|
-
if (!current || current.id !== pattern.id
|
|
56
|
+
if (!current || current.id !== pattern.id)
|
|
30
57
|
return 'missing';
|
|
31
|
-
|
|
32
|
-
|
|
58
|
+
if (changedSinceSelection(current, pattern))
|
|
59
|
+
return 'changed';
|
|
60
|
+
const archiveKey = archiveKeyOf(pattern.id);
|
|
61
|
+
const expected = { ...current, archivedAt };
|
|
62
|
+
await memory.set(archiveKey, expected, { ...LEARNING_NS, persist: true });
|
|
33
63
|
const copy = await memory.get(archiveKey, LEARNING_NS);
|
|
34
|
-
|
|
64
|
+
if (copy && canonicalJson(copy) === canonicalJson(expected))
|
|
65
|
+
return 'copied';
|
|
66
|
+
await discardArchiveCopy(memory, pattern);
|
|
67
|
+
return 'failed';
|
|
35
68
|
}
|
|
36
|
-
/**
|
|
69
|
+
/**
|
|
70
|
+
* Compare-and-delete the active key of a pattern whose archive copy was
|
|
71
|
+
* verified: delete only while the active record still equals the copy.
|
|
72
|
+
*/
|
|
37
73
|
export async function removeArchivedPattern(memory, pattern) {
|
|
38
|
-
|
|
74
|
+
const activeKey = activeKeyOf(pattern.id);
|
|
75
|
+
const active = await memory.get(activeKey, LEARNING_NS);
|
|
76
|
+
if (!active)
|
|
77
|
+
return 'missing';
|
|
78
|
+
const copy = await memory.get(archiveKeyOf(pattern.id), LEARNING_NS);
|
|
79
|
+
if (!copy || typeof copy !== 'object' || copy.id !== pattern.id)
|
|
80
|
+
return 'failed';
|
|
81
|
+
if (canonicalJson(active) !== canonicalJson(archivedRecord(copy)))
|
|
82
|
+
return 'changed';
|
|
83
|
+
await memory.delete(activeKey, LEARNING_NS);
|
|
84
|
+
return 'removed';
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Remove the archive copy of a pattern that is still active, after a move
|
|
88
|
+
* that did not complete. The copy is kept when the active record is gone, so
|
|
89
|
+
* a pattern is never left without either record.
|
|
90
|
+
*/
|
|
91
|
+
export async function discardArchiveCopy(memory, pattern) {
|
|
92
|
+
if (!(await memory.get(activeKeyOf(pattern.id), LEARNING_NS)))
|
|
93
|
+
return false;
|
|
94
|
+
return memory.delete(archiveKeyOf(pattern.id), LEARNING_NS);
|
|
39
95
|
}
|
|
40
96
|
/** Move one pattern to its archive key in the learning namespace. */
|
|
41
97
|
export async function archiveSelectedPattern(memory, pattern, archivedAt = new Date()) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
98
|
+
return withPatternMoveLock(memory, async () => {
|
|
99
|
+
const copied = await copyPatternToArchive(memory, pattern, archivedAt);
|
|
100
|
+
if (copied !== 'copied')
|
|
101
|
+
return copied;
|
|
102
|
+
const removed = await removeArchivedPattern(memory, pattern);
|
|
103
|
+
if (removed === 'removed')
|
|
104
|
+
return 'archived';
|
|
105
|
+
await discardArchiveCopy(memory, pattern);
|
|
106
|
+
return removed;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
const moveQueues = new WeakMap();
|
|
110
|
+
/**
|
|
111
|
+
* Run `fn` after every earlier pattern move on the same backend has settled.
|
|
112
|
+
* Not re-entrant: `fn` must not call `withPatternMoveLock` (or
|
|
113
|
+
* `archiveSelectedPattern`) on the same backend.
|
|
114
|
+
*/
|
|
115
|
+
export function withPatternMoveLock(memory, fn) {
|
|
116
|
+
const previous = moveQueues.get(memory) ?? Promise.resolve();
|
|
117
|
+
const run = previous.then(fn, fn);
|
|
118
|
+
moveQueues.set(memory, run.then(() => undefined, () => undefined));
|
|
119
|
+
return run;
|
|
47
120
|
}
|
|
48
121
|
/** True when the stored record's scores or last use differ from the selected snapshot. */
|
|
49
122
|
function changedSinceSelection(current, selected) {
|
|
@@ -6,12 +6,27 @@
|
|
|
6
6
|
* to predict the merged pattern, so a dry run selects the same trims as a
|
|
7
7
|
* real run.
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
9
|
+
import { patternEvidenceOf } from './reward-source.js';
|
|
10
10
|
/** Usage-weighted mean of one score (equal weights when nothing was used). */
|
|
11
11
|
function usageWeighted(patterns, score) {
|
|
12
12
|
const totalUsage = patterns.reduce((sum, p) => sum + p.usageCount, 0);
|
|
13
13
|
return patterns.reduce((sum, p) => sum + score(p) * (totalUsage > 0 ? p.usageCount / totalUsage : 1 / patterns.length), 0);
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* #1147: a merge keeps the most conservative evidence of its sources:
|
|
17
|
+
* `assigned` if any source is, else `pre-1120` if any source is, else
|
|
18
|
+
* `measured`. `pre-1120` has no tag of its own; the merge is left untagged,
|
|
19
|
+
* which `patternEvidenceOf` reads as `pre-1120` (the kept template is a
|
|
20
|
+
* source's, so it is not read as assigned unless a source was).
|
|
21
|
+
*/
|
|
22
|
+
function mergedEvidence(patterns) {
|
|
23
|
+
const evidence = new Set(patterns.map(patternEvidenceOf));
|
|
24
|
+
if (evidence.has('assigned'))
|
|
25
|
+
return 'assigned';
|
|
26
|
+
if (evidence.has('pre-1120'))
|
|
27
|
+
return 'pre-1120';
|
|
28
|
+
return 'measured';
|
|
29
|
+
}
|
|
15
30
|
/** Merge similar patterns: best template, combined contexts, weighted scores. */
|
|
16
31
|
export function buildConsolidatedPattern(patterns, id, now = new Date()) {
|
|
17
32
|
const bestPattern = patterns.reduce((best, current) => current.successRate > best.successRate ? current : best);
|
|
@@ -22,6 +37,7 @@ export function buildConsolidatedPattern(patterns, id, now = new Date()) {
|
|
|
22
37
|
codeContext: bestPattern.context.codeContext,
|
|
23
38
|
tags: [...new Set(patterns.flatMap((p) => p.context.tags))],
|
|
24
39
|
};
|
|
40
|
+
const evidence = mergedEvidence(patterns);
|
|
25
41
|
return {
|
|
26
42
|
id,
|
|
27
43
|
type: bestPattern.type,
|
|
@@ -35,7 +51,7 @@ export function buildConsolidatedPattern(patterns, id, now = new Date()) {
|
|
|
35
51
|
template: bestPattern.template,
|
|
36
52
|
createdAt: now,
|
|
37
53
|
lastUsedAt: now,
|
|
38
|
-
|
|
54
|
+
...(evidence === 'pre-1120' ? {} : { rewardSource: evidence }),
|
|
39
55
|
};
|
|
40
56
|
}
|
|
41
57
|
//# sourceMappingURL=pattern-consolidation.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Committing one pattern merge (#1106, #1149)
|
|
3
|
+
*
|
|
4
|
+
* `LearningCoordinatorService.consolidatePatterns` builds the consolidated
|
|
5
|
+
* pattern; this module moves the sources out of the active set:
|
|
6
|
+
*
|
|
7
|
+
* 1. Every source pattern's archive copy is written and verified.
|
|
8
|
+
* 2. The consolidated pattern is stored and read back in full.
|
|
9
|
+
* 3. The sources are removed one by one with compare-and-delete.
|
|
10
|
+
*
|
|
11
|
+
* A failure in steps 1-2, or before the first source is removed, rolls the
|
|
12
|
+
* merge back: the consolidated pattern and the archive copies are deleted and
|
|
13
|
+
* every source stays active. A failure after a source was removed keeps the
|
|
14
|
+
* consolidated pattern (it now holds that source's data) and reports each
|
|
15
|
+
* source's real state. Callers run this under `withPatternMoveLock`.
|
|
16
|
+
*/
|
|
17
|
+
import type { MemoryBackend } from '../../kernel/interfaces.js';
|
|
18
|
+
import { type Result } from '../../shared/types/index.js';
|
|
19
|
+
import type { LearnedPattern } from './interfaces.js';
|
|
20
|
+
/**
|
|
21
|
+
* Archive `sources`, store `consolidated` with `store`, then remove the
|
|
22
|
+
* sources. Returns the consolidated pattern only when every source left the
|
|
23
|
+
* active set.
|
|
24
|
+
*/
|
|
25
|
+
export declare function commitPatternMerge(memory: MemoryBackend, sources: readonly LearnedPattern[], consolidated: LearnedPattern, store: (pattern: LearnedPattern) => Promise<void>, archivedAt?: Date): Promise<Result<LearnedPattern>>;
|
|
26
|
+
//# sourceMappingURL=pattern-merge.d.ts.map
|