agentic-qe 3.15.6 → 3.15.8
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/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +263 -0
- package/README.md +2 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +8 -6
- package/dist/cli/chunks/adapter-FC4EY447.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-SY7UCLBL.js → agent-booster-wasm-W3V5P7LE.js} +2 -2
- package/dist/cli/chunks/{agent-handler-KAMYBU3S.js → agent-handler-2NQFHAWE.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-2CAW3KUM.js → agent-memory-branch-457ECHHK.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-AUAL6UBL.js +2 -0
- package/dist/cli/chunks/{arena-QCCVIOAH.js → arena-IYBQ3GPY.js} +4 -4
- package/dist/cli/chunks/{arena-4OFLJ3R2.js → arena-JV3WSEHU.js} +2 -2
- package/dist/cli/chunks/{audit-RBDQJQJB.js → audit-5OS3T3K6.js} +3 -3
- package/dist/cli/chunks/base-2XML4WH7.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-5JRACCDQ.js → better-sqlite3-IQKBFVAO.js} +2 -2
- package/dist/cli/chunks/{brain-handler-W4QIIRT4.js → brain-handler-KA3SGAFM.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-IBNGI572.js → branch-enumerator-QZDU2VOQ.js} +2 -2
- package/dist/cli/chunks/{browser-GMSCVAOI.js → browser-ZL7OLKJQ.js} +2 -2
- package/dist/cli/chunks/browser-workflow-2IFEUAAK.js +2 -0
- package/dist/cli/chunks/{chunk-6HWARQWV.js → chunk-22DOS3PM.js} +2 -2
- package/dist/cli/chunks/{chunk-VCONCVSY.js → chunk-2DPHFCMW.js} +2 -2
- package/dist/cli/chunks/{chunk-ALCIUWFC.js → chunk-2GSAAUW3.js} +1 -1
- package/dist/cli/chunks/{chunk-AX26QJ6T.js → chunk-2JCLACCS.js} +2 -2
- package/dist/cli/chunks/{chunk-7XTANLTN.js → chunk-2QRGIEQV.js} +1 -1
- package/dist/cli/chunks/{chunk-MP3FSUNB.js → chunk-2UN4JOTN.js} +2 -2
- package/dist/cli/chunks/{chunk-CR66HNAE.js → chunk-2ZRNXEVI.js} +1 -1
- package/dist/cli/chunks/{chunk-WKDWRRDT.js → chunk-3LFLO2WK.js} +2 -2
- package/dist/cli/chunks/{chunk-QLYO3H7E.js → chunk-3N627QRU.js} +2 -2
- package/dist/cli/chunks/{chunk-VVF337SV.js → chunk-4C3RYBTT.js} +2 -2
- package/dist/cli/chunks/{chunk-MQCTLTGE.js → chunk-4C7KE2EL.js} +2 -2
- package/dist/cli/chunks/{chunk-AUN4FG7V.js → chunk-4GUVVGJX.js} +1 -1
- package/dist/cli/chunks/{chunk-ZOUEQ6DL.js → chunk-4GYFONJB.js} +1 -1
- package/dist/cli/chunks/{chunk-24ZSGYC6.js → chunk-4I35ARWW.js} +1 -1
- package/dist/cli/chunks/{chunk-6MXAJBEA.js → chunk-4NTLGGXO.js} +1 -1
- package/dist/cli/chunks/{chunk-EF5UHDCG.js → chunk-4TZLZRZ4.js} +1 -1
- package/dist/cli/chunks/{chunk-RD5BYLN7.js → chunk-4YUBWU3E.js} +1 -1
- package/dist/cli/chunks/{chunk-7TVIX4WL.js → chunk-52YRSWPS.js} +2 -2
- package/dist/cli/chunks/{chunk-LAY7NCQK.js → chunk-5DZDLOY6.js} +3 -3
- package/dist/cli/chunks/{chunk-34MDMFET.js → chunk-5MBNRTT5.js} +2 -2
- package/dist/cli/chunks/{chunk-VAYZ5QIE.js → chunk-5ONJ7AV6.js} +1 -1
- package/dist/cli/chunks/{chunk-RV6HSMKJ.js → chunk-5YOO5QSE.js} +1 -1
- package/dist/cli/chunks/{chunk-BUTGIVKW.js → chunk-62T7U25U.js} +1 -1
- package/dist/cli/chunks/{chunk-66NW3ZB4.js → chunk-6CKTLVYV.js} +2 -2
- package/dist/cli/chunks/{chunk-TUDENMAE.js → chunk-6E7EOHMN.js} +2 -2
- package/dist/cli/chunks/{chunk-GVRFSXY6.js → chunk-6GIC2263.js} +2 -2
- package/dist/cli/chunks/{chunk-KIDOBLUO.js → chunk-767SR7WH.js} +2 -2
- package/dist/cli/chunks/{chunk-NBUXM5X6.js → chunk-7C6FMLQR.js} +2 -2
- package/dist/cli/chunks/{chunk-4POOJYXA.js → chunk-7CVMT64N.js} +1 -1
- package/dist/cli/chunks/{chunk-R363XXGH.js → chunk-7DHSHD5B.js} +2 -2
- package/dist/cli/chunks/{chunk-IEPWO4XP.js → chunk-7H3GNRNA.js} +2 -2
- package/dist/cli/chunks/{chunk-DQNUPEY5.js → chunk-7SLEUVPZ.js} +2 -2
- package/dist/cli/chunks/{chunk-YNG7E26C.js → chunk-7XGM7Q2N.js} +2 -2
- package/dist/cli/chunks/{chunk-5MT7DMD7.js → chunk-A2UGPKCS.js} +2 -2
- package/dist/cli/chunks/{chunk-2CIDFR2H.js → chunk-A6GCO6ZU.js} +2 -2
- package/dist/cli/chunks/{chunk-XFPQIWEH.js → chunk-BEVWCF3Q.js} +3 -3
- package/dist/cli/chunks/{chunk-LCCTJ2PC.js → chunk-BLZEOGQE.js} +2 -2
- package/dist/cli/chunks/{chunk-6R3FBFCJ.js → chunk-BQUIZ5QT.js} +2 -2
- package/dist/cli/chunks/{chunk-ZUTFHGEO.js → chunk-BTMEOZYY.js} +1 -1
- package/dist/cli/chunks/{chunk-FU7LNUD7.js → chunk-CDLG3Q2O.js} +2 -2
- package/dist/cli/chunks/{chunk-NYS2GUNO.js → chunk-CQ3SBRDP.js} +2 -2
- package/dist/cli/chunks/chunk-CQ5G64EA.js +3 -0
- package/dist/cli/chunks/{chunk-JCE76MPP.js → chunk-CRUQ6RXU.js} +2 -2
- package/dist/cli/chunks/{chunk-XBFQJZWX.js → chunk-D4IBIMWI.js} +2 -2
- package/dist/cli/chunks/{chunk-LZWJ5BMP.js → chunk-D4O3TJI7.js} +2 -2
- package/dist/cli/chunks/{chunk-AUOSHM63.js → chunk-DAFMHM64.js} +2 -2
- package/dist/cli/chunks/{chunk-V3OLS2NG.js → chunk-DCYUHCPK.js} +2 -2
- package/dist/cli/chunks/{chunk-F7A2UBZO.js → chunk-DKFSCJEF.js} +2 -2
- package/dist/cli/chunks/{chunk-5LST62QR.js → chunk-DN3AKAPY.js} +2 -2
- package/dist/cli/chunks/{chunk-OQ4S6B7P.js → chunk-DY37YMMQ.js} +1 -1
- package/dist/cli/chunks/{chunk-XQ53PZEF.js → chunk-EUVSSIGR.js} +3 -3
- package/dist/cli/chunks/{chunk-6WOZUSSN.js → chunk-FAYXES7R.js} +2 -2
- package/dist/cli/chunks/{chunk-GNYOHZVV.js → chunk-FEN2DHFM.js} +1 -1
- package/dist/cli/chunks/{chunk-BAYGQRNP.js → chunk-FEPFXXI7.js} +2 -2
- package/dist/cli/chunks/{chunk-DLSFT6PO.js → chunk-FJAO4UX2.js} +2 -2
- package/dist/cli/chunks/{chunk-22OZIJAD.js → chunk-FWXNFPLS.js} +2 -2
- package/dist/cli/chunks/{chunk-X33F7NXH.js → chunk-G6CLO74Q.js} +3 -3
- package/dist/cli/chunks/{chunk-HAN4MS5T.js → chunk-G77Q22EN.js} +2 -2
- package/dist/cli/chunks/{chunk-5DH5QI7G.js → chunk-GENNJRNK.js} +3 -3
- package/dist/cli/chunks/{chunk-LMAEMVPA.js → chunk-GGSTLKY5.js} +1 -1
- package/dist/cli/chunks/{chunk-EJ4KZFZN.js → chunk-GSOK4M6V.js} +1 -1
- package/dist/cli/chunks/{chunk-DA7DGDTI.js → chunk-HI6OBDDY.js} +2 -2
- package/dist/cli/chunks/{chunk-XZ46CI35.js → chunk-HNGNRIZZ.js} +2 -2
- package/dist/cli/chunks/{chunk-CLAMMGY3.js → chunk-HXCGV5UJ.js} +2 -2
- package/dist/cli/chunks/{chunk-5UPIL62W.js → chunk-I4U7YCXG.js} +3 -3
- package/dist/cli/chunks/{chunk-RFDFET3O.js → chunk-I77D65X5.js} +2 -2
- package/dist/cli/chunks/{chunk-HEGGV2PT.js → chunk-IJSFZO7P.js} +2 -2
- package/dist/cli/chunks/{chunk-GWM4M5NF.js → chunk-IMSRWNWF.js} +1 -1
- package/dist/cli/chunks/{chunk-B7RHBKHL.js → chunk-J6LL25QJ.js} +2 -2
- package/dist/cli/chunks/{chunk-KYVIOC3C.js → chunk-J7FLNP5L.js} +2 -2
- package/dist/cli/chunks/{chunk-YLNYPQDR.js → chunk-J7RCI25Q.js} +1 -1
- package/dist/cli/chunks/{chunk-72MQCZSM.js → chunk-JFWQFB3S.js} +2 -2
- package/dist/cli/chunks/{chunk-SV5BUYHH.js → chunk-JLTGO5BB.js} +2 -2
- package/dist/cli/chunks/{chunk-CCL436IU.js → chunk-JWPYMRIX.js} +14 -6
- package/dist/cli/chunks/{chunk-ONPPBLRB.js → chunk-K4N2MBCE.js} +2 -2
- package/dist/cli/chunks/{chunk-7SAMMQVS.js → chunk-K5R3WUJP.js} +1 -1
- package/dist/cli/chunks/{chunk-GI5HWS4H.js → chunk-KITKQUBX.js} +1 -1
- package/dist/cli/chunks/{chunk-7TJZDRDU.js → chunk-KJNUETCB.js} +1 -1
- package/dist/cli/chunks/{chunk-JYKQVYX2.js → chunk-KMVFBYJO.js} +2 -2
- package/dist/cli/chunks/{chunk-ZSBD4FUX.js → chunk-KMZW2P3R.js} +2 -2
- package/dist/cli/chunks/{chunk-PEMSXSP2.js → chunk-KNHLOANK.js} +2 -2
- package/dist/cli/chunks/{chunk-47Q7JL3V.js → chunk-KNQUHGNY.js} +2 -2
- package/dist/cli/chunks/{chunk-A7ANPS4E.js → chunk-KVMKYUOE.js} +2 -2
- package/dist/cli/chunks/{chunk-XBEI2JBA.js → chunk-LHRVSK44.js} +2 -2
- package/dist/cli/chunks/{chunk-AJT3XDRD.js → chunk-LPSMVBB3.js} +2 -2
- package/dist/cli/chunks/{chunk-ORBODZSO.js → chunk-LVHZK7GW.js} +2 -2
- package/dist/cli/chunks/{chunk-ZTB32K5N.js → chunk-LZWBUVCK.js} +3 -3
- package/dist/cli/chunks/{chunk-OPDZBRIL.js → chunk-MMY52Y6R.js} +2 -2
- package/dist/cli/chunks/{chunk-MQTA6KIO.js → chunk-MUDBF2JC.js} +1 -1
- package/dist/cli/chunks/{chunk-GFB6BZWU.js → chunk-MV4S3TEC.js} +2 -2
- package/dist/cli/chunks/{chunk-UB6DQGWM.js → chunk-NF63NHJH.js} +2 -2
- package/dist/cli/chunks/{chunk-D5N2O5EH.js → chunk-NHOMVBCI.js} +2 -2
- package/dist/cli/chunks/{chunk-3NJ7O3OH.js → chunk-NLYUC63R.js} +2 -2
- package/dist/cli/chunks/{chunk-4CLDYT36.js → chunk-NQDYOF35.js} +2 -2
- package/dist/cli/chunks/{chunk-ORFL3YXB.js → chunk-NW7HTOSN.js} +2 -2
- package/dist/cli/chunks/{chunk-FQ5N666N.js → chunk-NWFBF3KT.js} +1 -1
- package/dist/cli/chunks/{chunk-P7DXVL2S.js → chunk-NZATJ2C6.js} +2 -2
- package/dist/cli/chunks/{chunk-HOEWMEF2.js → chunk-O4RRVTXN.js} +2 -2
- package/dist/cli/chunks/{chunk-4KOVHQXK.js → chunk-OCLAMZJG.js} +2 -2
- package/dist/cli/chunks/{chunk-TLUIO37P.js → chunk-OJWEZYLR.js} +2 -2
- package/dist/cli/chunks/{chunk-A74J23QB.js → chunk-OWBFVAEH.js} +2 -2
- package/dist/cli/chunks/{chunk-6T6AHVLF.js → chunk-P2EA62YS.js} +1 -1
- package/dist/cli/chunks/{chunk-TL5GV3PR.js → chunk-P4UT4LBE.js} +3 -3
- package/dist/cli/chunks/{chunk-IVJIHZSM.js → chunk-PICEGWGB.js} +1 -1
- package/dist/cli/chunks/{chunk-ITIJ23K2.js → chunk-PIEKGKW6.js} +2 -2
- package/dist/cli/chunks/{chunk-2ZTWPMTK.js → chunk-PJGQ2TKN.js} +2 -2
- package/dist/cli/chunks/{chunk-KCB6P463.js → chunk-PPIM7B5G.js} +2 -2
- package/dist/cli/chunks/{chunk-L2TDHJR3.js → chunk-PUYQ6EKC.js} +2 -2
- package/dist/cli/chunks/{chunk-2IWPJUVV.js → chunk-PWA6XBW4.js} +8 -8
- package/dist/cli/chunks/{chunk-XPB5BVU6.js → chunk-PZ7FJ4UG.js} +2 -2
- package/dist/cli/chunks/{chunk-SOSJWM3E.js → chunk-QFYUZYRA.js} +4 -4
- package/dist/cli/chunks/{chunk-RUTO67PT.js → chunk-R2NHGESM.js} +2 -2
- package/dist/cli/chunks/{chunk-K55EAWZ5.js → chunk-RG42LDOB.js} +2 -2
- package/dist/cli/chunks/{chunk-JAPBSSFY.js → chunk-RSMPJWQH.js} +1 -1
- package/dist/cli/chunks/{chunk-46HBVDMU.js → chunk-SFPGLUXS.js} +1 -1
- package/dist/cli/chunks/{chunk-TVLOED6O.js → chunk-SHEVM5PF.js} +2 -2
- package/dist/cli/chunks/{chunk-6RDVY26I.js → chunk-SJMZZMHP.js} +2 -2
- package/dist/cli/chunks/{chunk-3DJNKNBR.js → chunk-ST7ASEJO.js} +57 -57
- package/dist/cli/chunks/{chunk-QS5KZYUZ.js → chunk-SWY6KGMF.js} +2 -2
- package/dist/cli/chunks/{chunk-UHHMAKPE.js → chunk-T2TDTBFV.js} +1 -1
- package/dist/cli/chunks/{chunk-5HAPS6VD.js → chunk-TC52M542.js} +2 -2
- package/dist/cli/chunks/chunk-TMNEK7TP.js +2 -0
- package/dist/cli/chunks/{chunk-ELI4GDQO.js → chunk-U3BWBP6B.js} +2 -2
- package/dist/cli/chunks/{chunk-CZBIREL5.js → chunk-U7CIY3YR.js} +2 -2
- package/dist/cli/chunks/{chunk-X2DR27AY.js → chunk-UDCYQLTD.js} +2 -2
- package/dist/cli/chunks/{chunk-CEXNW5TR.js → chunk-UKKFZJME.js} +1 -1
- package/dist/cli/chunks/{chunk-5NC7QEJ6.js → chunk-UQLAN5TX.js} +4 -4
- package/dist/cli/chunks/{chunk-BIXRTOH3.js → chunk-UTFMMZ57.js} +3 -3
- package/dist/cli/chunks/{chunk-YXU35GGD.js → chunk-UTNKMPTC.js} +1 -1
- package/dist/cli/chunks/{chunk-HZFK2Z2Z.js → chunk-V4QJ3MMT.js} +1 -1
- package/dist/cli/chunks/{chunk-LJCEDTUM.js → chunk-V7VZSNDK.js} +3 -3
- package/dist/cli/chunks/{chunk-RLB7K7QP.js → chunk-VKFVJCIH.js} +1 -1
- package/dist/cli/chunks/{chunk-5GIJU2ZY.js → chunk-VQRBBR27.js} +2 -2
- package/dist/cli/chunks/{chunk-Q2RBOC7V.js → chunk-VVK4ECVJ.js} +2 -2
- package/dist/cli/chunks/{chunk-624QRKQX.js → chunk-VWRNG3UK.js} +1 -1
- package/dist/cli/chunks/{chunk-F3KS3TAB.js → chunk-VWSGWYRB.js} +2 -2
- package/dist/cli/chunks/{chunk-I7WAW7TM.js → chunk-W5A36V3Z.js} +2 -2
- package/dist/cli/chunks/chunk-WAWKAYPY.js +2 -0
- package/dist/cli/chunks/{chunk-NMY4KTWA.js → chunk-WLXGUQOZ.js} +2 -2
- package/dist/cli/chunks/{chunk-7VTKR44N.js → chunk-X3HM7SV4.js} +2 -2
- package/dist/cli/chunks/chunk-X6VYQVUM.js +2 -0
- package/dist/cli/chunks/{chunk-ZL5LJT7D.js → chunk-X7ZQIFES.js} +2 -2
- package/dist/cli/chunks/{chunk-5VUIXDY2.js → chunk-XOOBLZXR.js} +2 -2
- package/dist/cli/chunks/{chunk-L4D3TPFP.js → chunk-XZQVC3GD.js} +1 -1
- package/dist/cli/chunks/{chunk-BO7UFNYV.js → chunk-Y5ZBF7MA.js} +2 -2
- package/dist/cli/chunks/{chunk-ULCHPPW2.js → chunk-YNQPHRUZ.js} +1 -1
- package/dist/cli/chunks/{chunk-ZCP4P6O2.js → chunk-YRH7KMTU.js} +2 -2
- package/dist/cli/chunks/{chunk-QLKUCMZC.js → chunk-YTYS2XSY.js} +1 -1
- package/dist/cli/chunks/{chunk-JPJEAK4G.js → chunk-YUP3APSN.js} +1 -1
- package/dist/cli/chunks/{chunk-BXATKI5S.js → chunk-YVWMJZ6O.js} +2 -2
- package/dist/cli/chunks/{chunk-PS6WFCA4.js → chunk-Z3LDUPLQ.js} +2 -2
- package/dist/cli/chunks/{chunk-FOJRPEIP.js → chunk-ZBI7PJFX.js} +2 -2
- package/dist/cli/chunks/{chunk-NHRF3V4B.js → chunk-ZG7UKWBB.js} +2 -2
- package/dist/cli/chunks/{chunk-7XUB7U6Z.js → chunk-ZOHS32SI.js} +2 -2
- package/dist/cli/chunks/{chunk-RHIQ6QO5.js → chunk-ZOVAZTXE.js} +430 -430
- package/dist/cli/chunks/{chunk-7QVPMH25.js → chunk-ZWMFKZEQ.js} +2 -2
- package/dist/cli/chunks/{ci-GEJCXMBK.js → ci-7NUCRGWO.js} +2 -2
- package/dist/cli/chunks/{ci-config-2ZVV4OXL.js → ci-config-VQVECCFI.js} +2 -2
- package/dist/cli/chunks/{ci-output-E45OGVPR.js → ci-output-P7GQ6TKF.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-X73ITYZC.js → circuit-breaker-5YP6N6HE.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-W4PPH46C.js → claude-flow-setup-W5H7CMU6.js} +2 -2
- package/dist/cli/chunks/client-RFUSQRUZ.js +2 -0
- package/dist/cli/chunks/{cline-installer-NUEPMWDE.js → cline-installer-OYANSZ54.js} +2 -2
- package/dist/cli/chunks/{code-6WQHBS7G.js → code-OMT4UEZI.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-BXQIFIFT.js → code-index-extractor-M2JEWKNF.js} +2 -2
- package/dist/cli/chunks/{codex-installer-Z337R2KH.js → codex-installer-YBS6N5O3.js} +2 -2
- package/dist/cli/chunks/{completions-F5DMYFHV.js → completions-U7GS5RG6.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-W2SYPZDI.js → complexity-analyzer-QSXPIUIU.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-ZCHUIFTN.js → continuedev-installer-W5TTT743.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-M5JNODXF.js → copilot-installer-KC2RT24C.js} +2 -2
- package/dist/cli/chunks/core-handlers-ZC7QB432.js +2 -0
- package/dist/cli/chunks/{cost-tracker-LSYTHBHV.js → cost-tracker-OQPVR6V4.js} +2 -2
- package/dist/cli/chunks/{coverage-PGMRS5SS.js → coverage-TCO2A2NX.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-GRBK7YFZ.js +2 -0
- package/dist/cli/chunks/{cursor-installer-XPUA73UW.js → cursor-installer-MH7GWD4L.js} +2 -2
- package/dist/cli/chunks/daemon-JER6HE2J.js +12 -0
- package/dist/cli/chunks/{daemon-ITKDIYMW.js → daemon-UJEARJZ2.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-T55AXLD6.js → dag-attention-scheduler-F3SUJU5O.js} +2 -2
- package/dist/cli/chunks/{detect-DR7J6K4O.js → detect-5QTCRB32.js} +2 -2
- package/dist/cli/chunks/{dist-node-LAJJBOUT.js → dist-node-XKZPHDBO.js} +2 -2
- package/dist/cli/chunks/{domain-handler-OMSHCRMK.js → domain-handler-V3UEADKW.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-EQXSKC5K.js → domain-plugins-7PES4UHZ.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-FKRAGVSW.js → domain-transfer-NF7UJW7B.js} +2 -2
- package/dist/cli/chunks/dream-VALD726W.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-JZFPCNL3.js → embed-and-insert-pattern-D2HWORHF.js} +2 -2
- package/dist/cli/chunks/{eval-JSNNASBW.js → eval-UF2UBAUC.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-UPD3IZBK.js → experience-capture-middleware-2OUCEHHM.js} +3 -3
- package/dist/cli/chunks/{fast-paths-YNMIBS2E.js → fast-paths-KV5DKKHC.js} +2 -2
- package/dist/cli/chunks/{feature-flags-SRLXDKBI.js → feature-flags-6YWMTNO5.js} +2 -2
- package/dist/cli/chunks/{feature-flags-VIR7O4L7.js → feature-flags-MTW6NMR3.js} +2 -2
- package/dist/cli/chunks/file-discovery-VL73ASNI.js +2 -0
- package/dist/cli/chunks/{fleet-K2ED46EL.js → fleet-GJ66QFXK.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-QCU4ZRYW.js → gnn-wrapper-52V6ANOY.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-YYQI4WZM.js → heartbeat-handler-X7NHNRC7.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-FSX7A3ZA.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-UX2QT6RL.js +2 -0
- package/dist/cli/chunks/hnsw-index-WRDDAMXH.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-C5TJSWTZ.js → hnsw-legacy-bridge-DZBE3KMK.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-SE3MJJYS.js → hnswlib-node-2AWWUJAZ.js} +2 -2
- package/dist/cli/chunks/{hooks-C572SRDH.js → hooks-XLPVROL3.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-O67NGIB5.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-35A6G3M5.js → hypergraph-engine-6TI7YP6P.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-U2756CWI.js → hypergraph-handler-DBIBBOXS.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-6VXWWYWM.js +2 -0
- package/dist/cli/chunks/init-guard-OSO6MIDD.js +2 -0
- package/dist/cli/chunks/init-handler-7S7IHMUF.js +88 -0
- package/dist/cli/chunks/init-wizard-VH34J4TL.js +2 -0
- package/dist/cli/chunks/kernel-KJD24NO7.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-32PX5YH7.js → kilocode-installer-2KBRFXMA.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-C4ROMMUS.js → kiro-installer-5VFR4OQZ.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-343O2HEZ.js +2 -0
- package/dist/cli/chunks/{learning-GEPVZGJQ.js → learning-G5NHL3DV.js} +20 -20
- package/dist/cli/chunks/{llm-router-XRKTTJTX.js → llm-router-4EAPPMHS.js} +4 -4
- package/dist/cli/chunks/llm-router-service-2M4BT2AO.js +2 -0
- package/dist/cli/chunks/{load-XVH6HW7E.js → load-UYMZPEY6.js} +2 -2
- package/dist/cli/chunks/load-test-OTQ2JQ5F.js +2 -0
- package/dist/cli/chunks/{mcp-IULSTM4Z.js → mcp-NOTDZBW5.js} +2 -2
- package/dist/cli/chunks/{memory-6K7IAU4T.js → memory-QL53YIHP.js} +5 -5
- package/dist/cli/chunks/memory-backend-4QSNRRV6.js +2 -0
- package/dist/cli/chunks/{memory-handlers-CG6DRLAW.js → memory-handlers-YFFYRSM6.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-VZDUYPLX.js → multi-model-executor-PDDDXF2B.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-QUTXKNH4.js → opencode-installer-75D2SKOT.js} +2 -2
- package/dist/cli/chunks/{orchestrator-PCKKUWOP.js → orchestrator-3WIZBV4T.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-5USH5MNR.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-PX5HQVRL.js → pattern-usage-recorder-TEX2JGHA.js} +2 -2
- package/dist/cli/chunks/{pipeline-O562GTOG.js → pipeline-7ATPA6LU.js} +2 -2
- package/dist/cli/chunks/{platform-PM7Q2AZS.js → platform-WPSKRJE7.js} +2 -2
- package/dist/cli/chunks/{plugin-OTYTFGPY.js → plugin-UUFOVVMU.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-6CFXTHC2.js → prime-radiant-advanced-wasm-PDFSYWKZ.js} +2 -2
- package/dist/cli/chunks/project-root-SRTA6TBL.js +2 -0
- package/dist/cli/chunks/protocol-executor-4WYPCNBS.js +2 -0
- package/dist/cli/chunks/{protocol-handler-PPGNSAOS.js → protocol-handler-3VRYRIQB.js} +2 -2
- package/dist/cli/chunks/{prove-WQ3BKRZG.js → prove-2NAUROGF.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-I4D6SFS4.js +2 -0
- package/dist/cli/chunks/{quality-C5WUU3AA.js → quality-ZIEI2WGA.js} +2 -2
- package/dist/cli/chunks/{quality-gate-WSSRKD5U.js → quality-gate-KWJO4SWQ.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-24UMTZTE.js +2 -0
- package/dist/cli/chunks/{real-embeddings-CFQE7IRQ.js → real-embeddings-TSZ4UIAE.js} +2 -2
- package/dist/cli/chunks/{ref-validation-DHKHXVZT.js → ref-validation-DWFFRETJ.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-3PPODABV.js → roocode-installer-XTZHLUBO.js} +2 -2
- package/dist/cli/chunks/router-AUD4GATI.js +2 -0
- package/dist/cli/chunks/routing-feedback-2FE6SIKQ.js +2 -0
- package/dist/cli/chunks/{routing-handler-JNXTGT6T.js → routing-handler-GG525TDM.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-6YLROPVP.js → ruvector-commands-QKRJDM7Z.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-P5LEUF25.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-ZCYD5YJS.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-4DWB4WRK.js → rvf-migration-coordinator-FF52OS6Q.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-QGV6BW2W.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-YKR2ZNBF.js → rvf-store-integrity-M6DXTAZ4.js} +2 -2
- package/dist/cli/chunks/safe-db-Q6JUKG2A.js +2 -0
- package/dist/cli/chunks/schedule-44OSMGE5.js +2 -0
- package/dist/cli/chunks/scheduler-V3HO2QQT.js +2 -0
- package/dist/cli/chunks/security-EHXSW22U.js +18 -0
- package/dist/cli/chunks/{shared-rvf-adapter-LNRLFP5I.js → shared-rvf-adapter-6EH7UVJL.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-GWU6YQNS.js → shared-rvf-dual-writer-WML274E7.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-N5T7DWMR.js +2 -0
- package/dist/cli/chunks/{standalone-memory-46KKBSSV.js → standalone-memory-C7QKAXS4.js} +2 -2
- package/dist/cli/chunks/{status-handler-35T5FTDQ.js → status-handler-VLI7MRLM.js} +2 -2
- package/dist/cli/chunks/{structural-health-P7QPQWLO.js → structural-health-3LPG6MQN.js} +2 -2
- package/dist/cli/chunks/{sync-Y43EWBSY.js → sync-4IMMQEPT.js} +2 -2
- package/dist/cli/chunks/{sync-W6Z4R4PL.js → sync-JFJEJBVK.js} +2 -2
- package/dist/cli/chunks/{task-handler-5CX3ZYT7.js → task-handler-IED3K6E4.js} +2 -2
- package/dist/cli/chunks/{task-handlers-DQZGOJNE.js → task-handlers-FH6DNTHW.js} +3 -3
- package/dist/cli/chunks/{test-TPP53VVV.js → test-GPKT3CKZ.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-WBV4UMQH.js → test-scheduling-Z42XXZP6.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-GIIDXHLC.js → token-bootstrap-HMM3AHXM.js} +2 -2
- package/dist/cli/chunks/{token-usage-AKK37RB7.js → token-usage-6Y2ERYIY.js} +2 -2
- package/dist/cli/chunks/{transformers-7MASPELS.js → transformers-MB63T2XO.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-YZKD6UGB.js → tree-sitter-wasm-parser-56GDQCMR.js} +2 -2
- package/dist/cli/chunks/{types-AZ3BTXDP.js → types-J4J6QV3I.js} +2 -2
- package/dist/cli/chunks/unified-memory-RQ3Q4CU3.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-ZOP5FEYX.js +2 -0
- package/dist/cli/chunks/unified-persistence-72OCJJKK.js +2 -0
- package/dist/cli/chunks/{upgrade-L7OTDKEK.js → upgrade-U4XU7LFM.js} +2 -2
- package/dist/cli/chunks/{validate-O3QVFIGP.js → validate-B57HA4YK.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-2UGBGLTX.js → validate-swarm-UPPA4M6T.js} +2 -2
- package/dist/cli/chunks/visual-security-7F5UV23J.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-J75IYPRO.js → web-tree-sitter-GDZMUKOZ.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-FQ5DBFCG.js → windsurf-installer-VJRWCHXP.js} +2 -2
- package/dist/cli/chunks/witness-chain-KZ57QUFE.js +2 -0
- package/dist/cli/chunks/{witness-chain-I7TN4MXZ.js → witness-chain-LFASSMZK.js} +2 -2
- package/dist/cli/chunks/{witness-chain-repair-D3NE3NQK.js → witness-chain-repair-TPHN4DXN.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-RU2WOP5M.js → witness-chain-verifier-Z23FVABW.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-IHQB2FR5.js → witness-key-manager-745MJ7WO.js} +2 -2
- package/dist/cli/chunks/{workflow-6BWTNVV6.js → workflow-T245QNQM.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-ZNWEUYBN.js +2 -0
- package/dist/cli/chunks/{wrappers-URVP25VU.js → wrappers-WCAYIQUX.js} +2 -2
- package/dist/cli/commands/learning.js +3 -2
- package/dist/cli/commands/security.d.ts +16 -0
- package/dist/cli/commands/security.js +76 -9
- package/dist/cli/handlers/init-guard.d.ts +21 -1
- package/dist/cli/handlers/init-guard.js +51 -8
- package/dist/cli/handlers/init-handler.js +57 -56
- package/dist/cli/index.js +11 -0
- package/dist/cli/utils/ci-output.d.ts +5 -0
- package/dist/cli/utils/ci-output.js +8 -0
- package/dist/coordination/handlers/security-handlers.js +22 -6
- package/dist/coordination/protocols/defect-investigation.js +7 -1
- package/dist/coordination/protocols/learning-consolidation.js +6 -12
- package/dist/coordination/protocols/security-audit.js +11 -0
- package/dist/coordination/result-saver.d.ts +9 -0
- package/dist/coordination/result-saver.js +34 -4
- package/dist/domains/coverage-analysis/collected-metrics.d.ts +2 -0
- package/dist/domains/coverage-analysis/collected-metrics.js +8 -1
- package/dist/domains/defect-intelligence/services/defect-predictor.js +9 -6
- package/dist/domains/learning-optimization/active-patterns.d.ts +55 -0
- package/dist/domains/learning-optimization/active-patterns.js +77 -0
- package/dist/domains/learning-optimization/coordinator.js +12 -9
- package/dist/domains/learning-optimization/services/learning-coordinator.js +15 -17
- package/dist/domains/quality-assessment/interfaces.d.ts +4 -0
- package/dist/domains/quality-assessment/quality-evidence.d.ts +1 -1
- package/dist/domains/quality-assessment/services/quality-analyzer.js +7 -5
- package/dist/domains/quality-assessment/services/quality-gate.js +12 -3
- package/dist/domains/security-compliance/dependency-advisory-engine.d.ts +52 -0
- package/dist/domains/security-compliance/dependency-advisory-engine.js +113 -0
- package/dist/domains/security-compliance/interfaces.d.ts +30 -0
- package/dist/domains/security-compliance/plugin.d.ts +7 -1
- package/dist/domains/security-compliance/plugin.js +19 -0
- package/dist/domains/security-compliance/services/scanners/dependency-resolver.d.ts +71 -0
- package/dist/domains/security-compliance/services/scanners/dependency-resolver.js +232 -0
- package/dist/domains/security-compliance/services/scanners/dependency-scanner.d.ts +21 -6
- package/dist/domains/security-compliance/services/scanners/dependency-scanner.js +142 -64
- package/dist/domains/security-compliance/services/scanners/lockfile-versions.d.ts +43 -0
- package/dist/domains/security-compliance/services/scanners/lockfile-versions.js +248 -0
- package/dist/domains/security-compliance/services/scanners/scanner-types.d.ts +30 -2
- package/dist/domains/security-compliance/services/security-auditor.d.ts +19 -6
- package/dist/domains/security-compliance/services/security-auditor.js +133 -92
- package/dist/domains/test-execution/services/retry-handler.js +34 -7
- package/dist/domains/test-execution/services/test-executor.d.ts +1 -0
- package/dist/domains/test-execution/services/test-executor.js +87 -7
- package/dist/kernel/shared-dirs.js +17 -5
- package/dist/learning/dream/dream-engine.d.ts +27 -1
- package/dist/learning/dream/dream-engine.js +56 -2
- package/dist/learning/dream/rvcow-branch-manager.d.ts +8 -0
- package/dist/learning/dream/rvcow-branch-manager.js +8 -0
- package/dist/learning/dream/speculative-dreamer.d.ts +8 -0
- package/dist/learning/dream/speculative-dreamer.js +8 -0
- package/dist/mcp/background-workers.d.ts +15 -0
- package/dist/mcp/background-workers.js +71 -0
- package/dist/mcp/bundle.js +881 -878
- package/dist/mcp/entry.js +4 -49
- package/dist/mcp/handlers/domain-handler-configs.d.ts +4 -0
- package/dist/mcp/handlers/domain-handler-configs.js +5 -1
- package/dist/mcp/protocol-server.js +2 -1
- package/dist/mcp/types.d.ts +6 -0
- package/dist/shared/security/index.d.ts +2 -2
- package/dist/shared/security/index.js +1 -1
- package/dist/shared/security/osv-client.d.ts +79 -132
- package/dist/shared/security/osv-client.js +344 -167
- package/dist/shared/security/osv-lookup.d.ts +124 -0
- package/dist/shared/security/osv-lookup.js +246 -0
- package/dist/shared/security/osv-types.d.ts +119 -0
- package/dist/shared/security/osv-types.js +6 -0
- package/dist/workers/daemon.d.ts +5 -0
- package/dist/workers/daemon.js +16 -2
- package/dist/workers/interfaces.d.ts +6 -1
- package/dist/workers/namespaced-keys.d.ts +16 -0
- package/dist/workers/namespaced-keys.js +24 -0
- package/dist/workers/quality-daemon/persistent-memory.d.ts +1 -1
- package/dist/workers/quality-daemon/persistent-memory.js +2 -2
- package/dist/workers/worker-env.d.ts +45 -0
- package/dist/workers/worker-env.js +76 -0
- package/dist/workers/worker-manager.js +5 -2
- package/dist/workers/workers/defect-predictor.d.ts +25 -8
- package/dist/workers/workers/defect-predictor.js +223 -216
- package/dist/workers/workers/learning-consolidation.d.ts +20 -0
- package/dist/workers/workers/learning-consolidation.js +53 -22
- package/dist/workers/workers/performance-baseline.d.ts +24 -9
- package/dist/workers/workers/performance-baseline.js +187 -230
- package/dist/workers/workers/quality-gate.d.ts +11 -9
- package/dist/workers/workers/quality-gate.js +125 -267
- package/dist/workers/workers/security-scan-records.d.ts +111 -0
- package/dist/workers/workers/security-scan-records.js +128 -0
- package/dist/workers/workers/security-scan.d.ts +25 -7
- package/dist/workers/workers/security-scan.js +187 -164
- package/package.json +2 -2
- package/dist/cli/chunks/adapter-PP3XIXDV.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-VDUQJKKY.js +0 -2
- package/dist/cli/chunks/base-QSYWWPCE.js +0 -2
- package/dist/cli/chunks/browser-workflow-WXXPBSCM.js +0 -2
- package/dist/cli/chunks/chunk-45MVRQG4.js +0 -2
- package/dist/cli/chunks/chunk-5VZVMO7B.js +0 -3
- package/dist/cli/chunks/chunk-EECF4CMA.js +0 -2
- package/dist/cli/chunks/client-6XKSQ4JT.js +0 -2
- package/dist/cli/chunks/core-handlers-OJYW4Y6M.js +0 -2
- package/dist/cli/chunks/cross-domain-router-QVUPQ2SC.js +0 -2
- package/dist/cli/chunks/daemon-QBYTCIMH.js +0 -10
- package/dist/cli/chunks/dream-3UABDRZJ.js +0 -2
- package/dist/cli/chunks/file-discovery-ZFGZTKZ4.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-MJ6MTPDF.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-FQWJCFVW.js +0 -2
- package/dist/cli/chunks/hnsw-index-NJYKJUHC.js +0 -2
- package/dist/cli/chunks/hybrid-backend-SL7RFID7.js +0 -2
- package/dist/cli/chunks/impact-analyzer-5ZJTXPVC.js +0 -2
- package/dist/cli/chunks/init-handler-PCLYQUSB.js +0 -88
- package/dist/cli/chunks/init-wizard-MQMDSIOF.js +0 -2
- package/dist/cli/chunks/kernel-MEJ5GMRH.js +0 -2
- package/dist/cli/chunks/knowledge-graph-XUBZSEZE.js +0 -2
- package/dist/cli/chunks/llm-router-service-QZAPAEPX.js +0 -2
- package/dist/cli/chunks/load-test-OVXIQ3AF.js +0 -2
- package/dist/cli/chunks/memory-backend-TRPOMPK4.js +0 -2
- package/dist/cli/chunks/pattern-null-store-JWYBRBZG.js +0 -2
- package/dist/cli/chunks/project-root-VVSTHIP4.js +0 -2
- package/dist/cli/chunks/protocol-executor-PXZCLZD3.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-42FRS5V3.js +0 -2
- package/dist/cli/chunks/queen-coordinator-UI3B7DI6.js +0 -2
- package/dist/cli/chunks/router-HYRPWLAY.js +0 -2
- package/dist/cli/chunks/routing-feedback-BPZ5R6F3.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-DEKDQ6KO.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-L53VBS7I.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-I6RUGD2D.js +0 -2
- package/dist/cli/chunks/safe-db-KS65XDCP.js +0 -2
- package/dist/cli/chunks/schedule-KD2VN6GB.js +0 -2
- package/dist/cli/chunks/scheduler-ZH3RMUHY.js +0 -2
- package/dist/cli/chunks/security-PWQTGDRU.js +0 -13
- package/dist/cli/chunks/sqlite-persistence-6DTVME5D.js +0 -2
- package/dist/cli/chunks/unified-memory-FCX7NLFZ.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-VU5QJK37.js +0 -2
- package/dist/cli/chunks/unified-persistence-FM376LGE.js +0 -2
- package/dist/cli/chunks/visual-security-EU7Y3X46.js +0 -2
- package/dist/cli/chunks/witness-chain-CSEBT52D.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-ALNKOM3N.js +0 -2
|
@@ -2,24 +2,39 @@
|
|
|
2
2
|
* Agentic QE v3 - Performance Baseline Worker
|
|
3
3
|
* ADR-014: Background Workers for QE Monitoring
|
|
4
4
|
*
|
|
5
|
-
* Tracks
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
*
|
|
5
|
+
* Tracks test execution time against a baseline built from measured runs.
|
|
6
|
+
*
|
|
7
|
+
* #1043: every figure comes from a recorded test run — the run behind the
|
|
8
|
+
* latest usable testsPassing evidence (`test-run:<runId>` in `test-execution`),
|
|
9
|
+
* read the same way the regression monitor reads it (#1028). Build and
|
|
10
|
+
* resource figures have no measured source and are reported unmeasured.
|
|
11
|
+
* Nothing measured → nothing stored or compared. A baseline without the
|
|
12
|
+
* measured stamp (the invented one written by <= 3.15.6) is ignored and
|
|
13
|
+
* replaced by the next measured run.
|
|
10
14
|
*/
|
|
11
15
|
import { BaseWorker } from '../base-worker';
|
|
12
16
|
import { WorkerContext, WorkerResult } from '../interfaces';
|
|
13
17
|
export declare class PerformanceBaselineWorker extends BaseWorker {
|
|
14
18
|
constructor();
|
|
15
19
|
protected doExecute(context: WorkerContext): Promise<WorkerResult>;
|
|
16
|
-
private
|
|
17
|
-
|
|
20
|
+
private baselineStatus;
|
|
21
|
+
/**
|
|
22
|
+
* #1043: the run behind the latest usable testsPassing evidence, with its
|
|
23
|
+
* recorded wall time and test count. `null` when there is no such evidence
|
|
24
|
+
* or the run's result was not recorded.
|
|
25
|
+
*/
|
|
26
|
+
private collectMeasuredRun;
|
|
27
|
+
/**
|
|
28
|
+
* Compare a measured run with the measured baseline of the same test set.
|
|
29
|
+
* The recorded duration is the run's wall time; per-test time across
|
|
30
|
+
* different test sets would mostly measure runner overhead (#1028 N1).
|
|
31
|
+
*/
|
|
18
32
|
private detectAnomalies;
|
|
19
33
|
private analyzeAnomalies;
|
|
20
34
|
private formatMetricName;
|
|
21
|
-
|
|
22
|
-
private
|
|
35
|
+
/** Blend a measured run into a comparable baseline, or start a new one from it. */
|
|
36
|
+
private nextBaseline;
|
|
37
|
+
private appendHistory;
|
|
23
38
|
private calculateHealthScore;
|
|
24
39
|
}
|
|
25
40
|
//# sourceMappingURL=performance-baseline.d.ts.map
|
|
@@ -2,13 +2,18 @@
|
|
|
2
2
|
* Agentic QE v3 - Performance Baseline Worker
|
|
3
3
|
* ADR-014: Background Workers for QE Monitoring
|
|
4
4
|
*
|
|
5
|
-
* Tracks
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
*
|
|
5
|
+
* Tracks test execution time against a baseline built from measured runs.
|
|
6
|
+
*
|
|
7
|
+
* #1043: every figure comes from a recorded test run — the run behind the
|
|
8
|
+
* latest usable testsPassing evidence (`test-run:<runId>` in `test-execution`),
|
|
9
|
+
* read the same way the regression monitor reads it (#1028). Build and
|
|
10
|
+
* resource figures have no measured source and are reported unmeasured.
|
|
11
|
+
* Nothing measured → nothing stored or compared. A baseline without the
|
|
12
|
+
* measured stamp (the invented one written by <= 3.15.6) is ignored and
|
|
13
|
+
* replaced by the next measured run.
|
|
10
14
|
*/
|
|
11
15
|
import { BaseWorker } from '../base-worker.js';
|
|
16
|
+
import { readQualityEvidenceRecord } from '../../domains/quality-assessment/quality-evidence.js';
|
|
12
17
|
const CONFIG = {
|
|
13
18
|
id: 'performance-baseline',
|
|
14
19
|
name: 'Performance Baseline Tracker',
|
|
@@ -21,6 +26,57 @@ const CONFIG = {
|
|
|
21
26
|
retryCount: 2,
|
|
22
27
|
retryDelayMs: 30000,
|
|
23
28
|
};
|
|
29
|
+
const BASELINE_KEY = 'performance:baseline';
|
|
30
|
+
const HISTORY_KEY = 'performance:history';
|
|
31
|
+
const SCHEMA_VERSION = 1;
|
|
32
|
+
/** Allowed slowdown before a measured run is an anomaly (30%). */
|
|
33
|
+
const DURATION_THRESHOLD = 1.3;
|
|
34
|
+
/** Weight of a new measured run in the baseline average. */
|
|
35
|
+
const EMA_ALPHA = 0.1;
|
|
36
|
+
/** Keep the last 168 measured runs. */
|
|
37
|
+
const MAX_HISTORY = 168;
|
|
38
|
+
const isNonNegative = (v) => typeof v === 'number' && Number.isFinite(v) && v >= 0;
|
|
39
|
+
const round = (v) => Math.round(v * 100) / 100;
|
|
40
|
+
/** A recorded test set `{ total, files }`, or `null`. */
|
|
41
|
+
function parseTestSet(raw) {
|
|
42
|
+
if (!raw || typeof raw !== 'object')
|
|
43
|
+
return null;
|
|
44
|
+
const { total, files } = raw;
|
|
45
|
+
if (typeof total !== 'number' || !Number.isInteger(total) || total <= 0)
|
|
46
|
+
return null;
|
|
47
|
+
if (!Array.isArray(files) || files.length === 0 || !files.every((f) => typeof f === 'string'))
|
|
48
|
+
return null;
|
|
49
|
+
return { total, files: [...new Set(files)].sort() };
|
|
50
|
+
}
|
|
51
|
+
const sameTestSet = (a, b) => a !== null && b !== null && a.total === b.total
|
|
52
|
+
&& a.files.length === b.files.length && a.files.every((f, i) => f === b.files[i]);
|
|
53
|
+
/** The stored baseline when it carries the measured stamp and is well-formed, else `null`. */
|
|
54
|
+
function measuredBaseline(raw) {
|
|
55
|
+
if (!raw || typeof raw !== 'object')
|
|
56
|
+
return null;
|
|
57
|
+
const r = raw;
|
|
58
|
+
if (r.measured !== true || r.schemaVersion !== SCHEMA_VERSION)
|
|
59
|
+
return null;
|
|
60
|
+
const t = r.testExecution;
|
|
61
|
+
if (!t || typeof t !== 'object')
|
|
62
|
+
return null;
|
|
63
|
+
if (!isNonNegative(t.avgTestDurationMs) || !isNonNegative(t.totalDurationMs)
|
|
64
|
+
|| typeof t.samples !== 'number' || !Number.isInteger(t.samples) || t.samples < 1
|
|
65
|
+
|| typeof t.lastRunId !== 'string')
|
|
66
|
+
return null;
|
|
67
|
+
return {
|
|
68
|
+
measured: true,
|
|
69
|
+
schemaVersion: SCHEMA_VERSION,
|
|
70
|
+
updatedAt: typeof r.updatedAt === 'string' ? r.updatedAt : '',
|
|
71
|
+
testExecution: {
|
|
72
|
+
avgTestDurationMs: t.avgTestDurationMs,
|
|
73
|
+
totalDurationMs: t.totalDurationMs,
|
|
74
|
+
samples: t.samples,
|
|
75
|
+
lastRunId: t.lastRunId,
|
|
76
|
+
testSet: parseTestSet(t.testSet),
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
24
80
|
export class PerformanceBaselineWorker extends BaseWorker {
|
|
25
81
|
constructor() {
|
|
26
82
|
super(CONFIG);
|
|
@@ -30,170 +86,133 @@ export class PerformanceBaselineWorker extends BaseWorker {
|
|
|
30
86
|
context.logger.info('Starting performance baseline tracking');
|
|
31
87
|
const findings = [];
|
|
32
88
|
const recommendations = [];
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
89
|
+
const current = await this.collectMeasuredRun(context);
|
|
90
|
+
const stored = await context.memory.get(BASELINE_KEY);
|
|
91
|
+
const baseline = measuredBaseline(stored);
|
|
92
|
+
const baselineStatus = this.baselineStatus(stored, baseline);
|
|
93
|
+
if (baselineStatus === 'legacy-ignored') {
|
|
94
|
+
context.logger.info('Ignoring a performance:baseline without the measured stamp (written by <= 3.15.6)');
|
|
95
|
+
}
|
|
96
|
+
else if (baselineStatus === 'invalid-ignored') {
|
|
97
|
+
context.logger.warn('Ignoring a malformed measured performance:baseline');
|
|
98
|
+
}
|
|
99
|
+
let anomalies = [];
|
|
100
|
+
let compared = false;
|
|
101
|
+
if (!current) {
|
|
102
|
+
findings.push({
|
|
103
|
+
type: 'performance-unmeasured',
|
|
104
|
+
severity: 'info',
|
|
105
|
+
domain: 'test-execution',
|
|
106
|
+
title: 'Performance Baseline Unmeasured',
|
|
107
|
+
description: 'No recorded test run backs the current testsPassing evidence, so no timing was stored or ' +
|
|
108
|
+
'compared. Run the test suite (test_execute_parallel, or `aqe test execute`) to start tracking. ' +
|
|
109
|
+
'Build and resource figures are not measured by AQE.',
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
else if (baseline?.testExecution.lastRunId === current.runId) {
|
|
113
|
+
// The same run was already blended in on an earlier tick.
|
|
114
|
+
context.logger.debug('Latest measured run already in the performance baseline', { runId: current.runId });
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
if (baseline && sameTestSet(baseline.testExecution.testSet, current.testSet)) {
|
|
118
|
+
compared = true;
|
|
119
|
+
anomalies = this.detectAnomalies(current, baseline);
|
|
120
|
+
this.analyzeAnomalies(anomalies, findings, recommendations);
|
|
121
|
+
}
|
|
122
|
+
await context.memory.set(BASELINE_KEY, this.nextBaseline(current, compared ? baseline : null));
|
|
123
|
+
await this.appendHistory(context, current);
|
|
124
|
+
}
|
|
45
125
|
const healthScore = this.calculateHealthScore(anomalies);
|
|
46
126
|
context.logger.info('Performance baseline tracking complete', {
|
|
47
127
|
healthScore,
|
|
128
|
+
measured: current !== null,
|
|
129
|
+
baselineStatus,
|
|
48
130
|
anomaliesDetected: anomalies.length,
|
|
49
131
|
});
|
|
50
132
|
return this.createResult(Date.now() - startTime, {
|
|
51
|
-
itemsAnalyzed:
|
|
133
|
+
itemsAnalyzed: compared ? 2 : 0,
|
|
52
134
|
issuesFound: anomalies.length,
|
|
53
135
|
healthScore,
|
|
54
|
-
trend: anomalies.length >
|
|
136
|
+
trend: anomalies.length > 0 ? 'degrading' : 'stable',
|
|
55
137
|
domainMetrics: {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
138
|
+
baselineStatus,
|
|
139
|
+
avgTestDuration: current ? `${round(current.avgTestDurationMs)}ms` : 'unmeasured',
|
|
140
|
+
totalTestDuration: current ? `${round(current.totalDurationMs)}ms` : 'unmeasured',
|
|
141
|
+
compileDuration: 'unmeasured',
|
|
142
|
+
bundleSize: 'unmeasured',
|
|
143
|
+
peakMemory: 'unmeasured',
|
|
61
144
|
anomalies: anomalies.length,
|
|
62
145
|
},
|
|
63
146
|
}, findings, recommendations);
|
|
64
147
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
slowestTestMs: 3500,
|
|
73
|
-
slowestTestName: 'workflow-orchestrator.test.ts::complex scenario',
|
|
74
|
-
p50DurationMs: 120,
|
|
75
|
-
p95DurationMs: 800,
|
|
76
|
-
p99DurationMs: 2500,
|
|
77
|
-
},
|
|
78
|
-
build: {
|
|
79
|
-
compileDurationMs: 12000,
|
|
80
|
-
bundleSizeKb: 2500,
|
|
81
|
-
dependencyCount: 45,
|
|
82
|
-
},
|
|
83
|
-
resources: {
|
|
84
|
-
peakMemoryMb: 512,
|
|
85
|
-
avgCpuPercent: 65,
|
|
86
|
-
diskReadMb: 150,
|
|
87
|
-
diskWriteMb: 50,
|
|
88
|
-
},
|
|
89
|
-
};
|
|
148
|
+
baselineStatus(stored, baseline) {
|
|
149
|
+
if (baseline)
|
|
150
|
+
return 'measured';
|
|
151
|
+
if (stored === undefined || stored === null)
|
|
152
|
+
return 'none';
|
|
153
|
+
const stamped = typeof stored === 'object' && stored.measured === true;
|
|
154
|
+
return stamped ? 'invalid-ignored' : 'legacy-ignored';
|
|
90
155
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
156
|
+
/**
|
|
157
|
+
* #1043: the run behind the latest usable testsPassing evidence, with its
|
|
158
|
+
* recorded wall time and test count. `null` when there is no such evidence
|
|
159
|
+
* or the run's result was not recorded.
|
|
160
|
+
*/
|
|
161
|
+
async collectMeasuredRun(context) {
|
|
162
|
+
const evidence = await readQualityEvidenceRecord(context.memory, 'testsPassing');
|
|
163
|
+
if (!evidence?.runId)
|
|
164
|
+
return null;
|
|
165
|
+
const run = await context.memory.get(`test-run:${evidence.runId}`, {
|
|
166
|
+
namespace: 'test-execution',
|
|
167
|
+
});
|
|
168
|
+
if (!run || typeof run !== 'object')
|
|
169
|
+
return null;
|
|
170
|
+
const { total, duration } = run;
|
|
171
|
+
if (typeof total !== 'number' || !Number.isInteger(total) || total <= 0 || !isNonNegative(duration))
|
|
172
|
+
return null;
|
|
97
173
|
return {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
avgBundleSizeKb: 2400,
|
|
106
|
-
threshold: 1.2, // 20% deviation allowed
|
|
107
|
-
},
|
|
108
|
-
resources: {
|
|
109
|
-
avgMemoryMb: 450,
|
|
110
|
-
avgCpuPercent: 60,
|
|
111
|
-
threshold: 1.25, // 25% deviation allowed
|
|
112
|
-
},
|
|
174
|
+
measured: true,
|
|
175
|
+
runId: evidence.runId,
|
|
176
|
+
measuredAt: evidence.measuredAt,
|
|
177
|
+
totalDurationMs: duration,
|
|
178
|
+
testCount: total,
|
|
179
|
+
avgTestDurationMs: duration / total,
|
|
180
|
+
testSet: parseTestSet({ total, files: run.testFiles }),
|
|
113
181
|
};
|
|
114
182
|
}
|
|
115
|
-
|
|
183
|
+
/**
|
|
184
|
+
* Compare a measured run with the measured baseline of the same test set.
|
|
185
|
+
* The recorded duration is the run's wall time; per-test time across
|
|
186
|
+
* different test sets would mostly measure runner overhead (#1028 N1).
|
|
187
|
+
*/
|
|
188
|
+
detectAnomalies(current, baseline) {
|
|
116
189
|
const anomalies = [];
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
category: 'test',
|
|
134
|
-
currentValue: metrics.testExecution.p95DurationMs,
|
|
135
|
-
baselineValue: baseline.testExecution.p95DurationMs,
|
|
136
|
-
deviationPercent: (p95Deviation - 1) * 100,
|
|
137
|
-
severity: p95Deviation > 1.5 ? 'high' : 'medium',
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
// Build anomalies
|
|
141
|
-
const compileDeviation = metrics.build.compileDurationMs / baseline.build.avgCompileMs;
|
|
142
|
-
if (compileDeviation > baseline.build.threshold) {
|
|
143
|
-
anomalies.push({
|
|
144
|
-
metric: 'compileDuration',
|
|
145
|
-
category: 'build',
|
|
146
|
-
currentValue: metrics.build.compileDurationMs,
|
|
147
|
-
baselineValue: baseline.build.avgCompileMs,
|
|
148
|
-
deviationPercent: (compileDeviation - 1) * 100,
|
|
149
|
-
severity: compileDeviation > 1.5 ? 'high' : 'medium',
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
const bundleDeviation = metrics.build.bundleSizeKb / baseline.build.avgBundleSizeKb;
|
|
153
|
-
if (bundleDeviation > baseline.build.threshold) {
|
|
154
|
-
anomalies.push({
|
|
155
|
-
metric: 'bundleSize',
|
|
156
|
-
category: 'build',
|
|
157
|
-
currentValue: metrics.build.bundleSizeKb,
|
|
158
|
-
baselineValue: baseline.build.avgBundleSizeKb,
|
|
159
|
-
deviationPercent: (bundleDeviation - 1) * 100,
|
|
160
|
-
severity: bundleDeviation > 1.3 ? 'high' : 'medium',
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
// Resource anomalies
|
|
164
|
-
const memoryDeviation = metrics.resources.peakMemoryMb / baseline.resources.avgMemoryMb;
|
|
165
|
-
if (memoryDeviation > baseline.resources.threshold) {
|
|
166
|
-
anomalies.push({
|
|
167
|
-
metric: 'peakMemory',
|
|
168
|
-
category: 'resource',
|
|
169
|
-
currentValue: metrics.resources.peakMemoryMb,
|
|
170
|
-
baselineValue: baseline.resources.avgMemoryMb,
|
|
171
|
-
deviationPercent: (memoryDeviation - 1) * 100,
|
|
172
|
-
severity: memoryDeviation > 1.5 ? 'critical' : memoryDeviation > 1.3 ? 'high' : 'medium',
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
const cpuDeviation = metrics.resources.avgCpuPercent / baseline.resources.avgCpuPercent;
|
|
176
|
-
if (cpuDeviation > baseline.resources.threshold) {
|
|
177
|
-
anomalies.push({
|
|
178
|
-
metric: 'avgCpu',
|
|
179
|
-
category: 'resource',
|
|
180
|
-
currentValue: metrics.resources.avgCpuPercent,
|
|
181
|
-
baselineValue: baseline.resources.avgCpuPercent,
|
|
182
|
-
deviationPercent: (cpuDeviation - 1) * 100,
|
|
183
|
-
severity: cpuDeviation > 1.4 ? 'high' : 'medium',
|
|
184
|
-
});
|
|
185
|
-
}
|
|
190
|
+
const check = (metric, value, base) => {
|
|
191
|
+
if (base <= 0)
|
|
192
|
+
return;
|
|
193
|
+
const ratio = value / base;
|
|
194
|
+
if (ratio > DURATION_THRESHOLD) {
|
|
195
|
+
anomalies.push({
|
|
196
|
+
metric,
|
|
197
|
+
currentValue: round(value),
|
|
198
|
+
baselineValue: round(base),
|
|
199
|
+
deviationPercent: (ratio - 1) * 100,
|
|
200
|
+
severity: ratio > 1.5 ? 'high' : 'medium',
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
check('avgTestDuration', current.avgTestDurationMs, baseline.testExecution.avgTestDurationMs);
|
|
205
|
+
check('totalTestDuration', current.totalDurationMs, baseline.testExecution.totalDurationMs);
|
|
186
206
|
return anomalies;
|
|
187
207
|
}
|
|
188
208
|
analyzeAnomalies(anomalies, findings, recommendations) {
|
|
189
209
|
for (const anomaly of anomalies) {
|
|
190
|
-
const domain = anomaly.category === 'test' ? 'test-execution' : 'chaos-resilience';
|
|
191
210
|
findings.push({
|
|
192
|
-
type:
|
|
211
|
+
type: 'performance-anomaly-test',
|
|
193
212
|
severity: anomaly.severity,
|
|
194
|
-
domain,
|
|
213
|
+
domain: 'test-execution',
|
|
195
214
|
title: `Performance Anomaly: ${this.formatMetricName(anomaly.metric)}`,
|
|
196
|
-
description: `${this.formatMetricName(anomaly.metric)} is ${anomaly.deviationPercent.toFixed(1)}% above baseline`,
|
|
215
|
+
description: `${this.formatMetricName(anomaly.metric)} is ${anomaly.deviationPercent.toFixed(1)}% above the measured baseline`,
|
|
197
216
|
context: {
|
|
198
217
|
currentValue: anomaly.currentValue,
|
|
199
218
|
baselineValue: anomaly.baselineValue,
|
|
@@ -201,11 +220,9 @@ export class PerformanceBaselineWorker extends BaseWorker {
|
|
|
201
220
|
},
|
|
202
221
|
});
|
|
203
222
|
}
|
|
204
|
-
|
|
205
|
-
const testAnomalies = anomalies.filter(a => a.category === 'test');
|
|
206
|
-
if (testAnomalies.length > 0) {
|
|
223
|
+
if (anomalies.length > 0) {
|
|
207
224
|
recommendations.push({
|
|
208
|
-
priority:
|
|
225
|
+
priority: anomalies.some(a => a.severity === 'high') ? 'p1' : 'p2',
|
|
209
226
|
domain: 'test-execution',
|
|
210
227
|
action: 'Investigate Test Performance Degradation',
|
|
211
228
|
description: 'Test execution times have increased. Review for slow tests or infrastructure issues.',
|
|
@@ -214,100 +231,40 @@ export class PerformanceBaselineWorker extends BaseWorker {
|
|
|
214
231
|
autoFixable: false,
|
|
215
232
|
});
|
|
216
233
|
}
|
|
217
|
-
const buildAnomalies = anomalies.filter(a => a.category === 'build');
|
|
218
|
-
if (buildAnomalies.length > 0) {
|
|
219
|
-
const bundleAnomaly = buildAnomalies.find(a => a.metric === 'bundleSize');
|
|
220
|
-
if (bundleAnomaly) {
|
|
221
|
-
recommendations.push({
|
|
222
|
-
priority: 'p2',
|
|
223
|
-
domain: 'chaos-resilience',
|
|
224
|
-
action: 'Analyze Bundle Size Increase',
|
|
225
|
-
description: 'Bundle size has grown. Review for unnecessary dependencies or unoptimized imports.',
|
|
226
|
-
estimatedImpact: 'medium',
|
|
227
|
-
effort: 'low',
|
|
228
|
-
autoFixable: true,
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
const resourceAnomalies = anomalies.filter(a => a.category === 'resource');
|
|
233
|
-
if (resourceAnomalies.length > 0) {
|
|
234
|
-
const memoryAnomaly = resourceAnomalies.find(a => a.metric === 'peakMemory');
|
|
235
|
-
if (memoryAnomaly && memoryAnomaly.severity === 'critical') {
|
|
236
|
-
recommendations.push({
|
|
237
|
-
priority: 'p0',
|
|
238
|
-
domain: 'chaos-resilience',
|
|
239
|
-
action: 'Investigate Memory Usage Spike',
|
|
240
|
-
description: 'Memory usage is significantly above baseline. Check for memory leaks.',
|
|
241
|
-
estimatedImpact: 'high',
|
|
242
|
-
effort: 'high',
|
|
243
|
-
autoFixable: false,
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
234
|
}
|
|
248
235
|
formatMetricName(metric) {
|
|
249
|
-
|
|
250
|
-
avgTestDuration: 'Average Test Duration',
|
|
251
|
-
p95TestDuration: 'P95 Test Duration',
|
|
252
|
-
compileDuration: 'Compile Duration',
|
|
253
|
-
bundleSize: 'Bundle Size',
|
|
254
|
-
peakMemory: 'Peak Memory Usage',
|
|
255
|
-
avgCpu: 'Average CPU Usage',
|
|
256
|
-
};
|
|
257
|
-
return names[metric] || metric;
|
|
236
|
+
return metric === 'avgTestDuration' ? 'Average Test Duration' : 'Total Test Duration';
|
|
258
237
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
const
|
|
262
|
-
const
|
|
238
|
+
/** Blend a measured run into a comparable baseline, or start a new one from it. */
|
|
239
|
+
nextBaseline(current, comparable) {
|
|
240
|
+
const prev = comparable?.testExecution;
|
|
241
|
+
const blend = (base, value) => base * (1 - EMA_ALPHA) + value * EMA_ALPHA;
|
|
242
|
+
return {
|
|
243
|
+
measured: true,
|
|
244
|
+
schemaVersion: SCHEMA_VERSION,
|
|
245
|
+
updatedAt: new Date().toISOString(),
|
|
263
246
|
testExecution: {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
},
|
|
270
|
-
build: {
|
|
271
|
-
avgCompileMs: baseline.build.avgCompileMs * (1 - alpha) +
|
|
272
|
-
metrics.build.compileDurationMs * alpha,
|
|
273
|
-
avgBundleSizeKb: baseline.build.avgBundleSizeKb * (1 - alpha) +
|
|
274
|
-
metrics.build.bundleSizeKb * alpha,
|
|
275
|
-
threshold: baseline.build.threshold,
|
|
276
|
-
},
|
|
277
|
-
resources: {
|
|
278
|
-
avgMemoryMb: baseline.resources.avgMemoryMb * (1 - alpha) +
|
|
279
|
-
metrics.resources.peakMemoryMb * alpha,
|
|
280
|
-
avgCpuPercent: baseline.resources.avgCpuPercent * (1 - alpha) +
|
|
281
|
-
metrics.resources.avgCpuPercent * alpha,
|
|
282
|
-
threshold: baseline.resources.threshold,
|
|
247
|
+
avgTestDurationMs: prev ? round(blend(prev.avgTestDurationMs, current.avgTestDurationMs)) : current.avgTestDurationMs,
|
|
248
|
+
totalDurationMs: prev ? round(blend(prev.totalDurationMs, current.totalDurationMs)) : current.totalDurationMs,
|
|
249
|
+
samples: prev ? prev.samples + 1 : 1,
|
|
250
|
+
lastRunId: current.runId,
|
|
251
|
+
testSet: current.testSet,
|
|
283
252
|
},
|
|
284
253
|
};
|
|
285
|
-
await context.memory.set('performance:baseline', updatedBaseline);
|
|
286
254
|
}
|
|
287
|
-
async
|
|
288
|
-
const
|
|
289
|
-
history.
|
|
290
|
-
|
|
291
|
-
while (history.length >
|
|
255
|
+
async appendHistory(context, run) {
|
|
256
|
+
const stored = await context.memory.get(HISTORY_KEY);
|
|
257
|
+
const history = Array.isArray(stored) ? stored : [];
|
|
258
|
+
history.push(run);
|
|
259
|
+
while (history.length > MAX_HISTORY)
|
|
292
260
|
history.shift();
|
|
293
|
-
|
|
294
|
-
await context.memory.set('performance:history', history);
|
|
261
|
+
await context.memory.set(HISTORY_KEY, history);
|
|
295
262
|
}
|
|
296
263
|
calculateHealthScore(anomalies) {
|
|
297
|
-
if (anomalies.length === 0)
|
|
298
|
-
return 100;
|
|
299
264
|
let score = 100;
|
|
300
265
|
for (const anomaly of anomalies) {
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
critical: 25,
|
|
304
|
-
high: 15,
|
|
305
|
-
medium: 8,
|
|
306
|
-
low: 3,
|
|
307
|
-
}[anomaly.severity];
|
|
308
|
-
// Additional penalty for large deviations
|
|
309
|
-
const deviationPenalty = Math.min(10, anomaly.deviationPercent / 10);
|
|
310
|
-
score -= basePenalty + deviationPenalty;
|
|
266
|
+
const basePenalty = anomaly.severity === 'high' ? 15 : 8;
|
|
267
|
+
score -= basePenalty + Math.min(10, anomaly.deviationPercent / 10);
|
|
311
268
|
}
|
|
312
269
|
return Math.max(0, Math.round(score));
|
|
313
270
|
}
|
|
@@ -2,22 +2,24 @@
|
|
|
2
2
|
* Agentic QE v3 - Quality Gate Worker
|
|
3
3
|
* ADR-014: Background Workers for QE Monitoring
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
5
|
+
* Continuously evaluates the measured quality gate and tracks its verdict.
|
|
6
|
+
*
|
|
7
|
+
* #1043: the gate is the canonical measured gate — the same evidence
|
|
8
|
+
* validation (`inspectQualityEvidence`) and thresholds
|
|
9
|
+
* (`evaluateQualityEvidence` / `resolveQualityThresholds`) the quality_assess
|
|
10
|
+
* tool uses. When any metric lacks usable evidence (absent, stale, malformed)
|
|
11
|
+
* the gate is not evaluated: nothing is stored and an info finding names the
|
|
12
|
+
* unmeasured metrics. A status without the measured stamp (the invented one
|
|
13
|
+
* written by <= 3.15.6) is ignored and replaced by the next measured verdict.
|
|
10
14
|
*/
|
|
11
15
|
import { BaseWorker } from '../base-worker';
|
|
12
16
|
import { WorkerContext, WorkerResult } from '../interfaces';
|
|
13
17
|
export declare class QualityGateWorker extends BaseWorker {
|
|
14
18
|
constructor();
|
|
15
19
|
protected doExecute(context: WorkerContext): Promise<WorkerResult>;
|
|
16
|
-
private evaluateQualityGates;
|
|
17
|
-
private evaluateRule;
|
|
18
20
|
private analyzeGateResults;
|
|
19
|
-
|
|
20
|
-
private
|
|
21
|
+
/** Compare with the previous verdict — only a measured one (#1043). */
|
|
22
|
+
private compareToPrevious;
|
|
21
23
|
private calculateHealthScore;
|
|
22
24
|
}
|
|
23
25
|
//# sourceMappingURL=quality-gate.d.ts.map
|