agentic-qe 3.10.3 → 3.10.5
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/qcsd-development-swarm/SKILL.md +27 -6
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +104 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/arena/arena.d.ts +68 -0
- package/dist/arena/arena.js +169 -0
- package/dist/arena/mutator.d.ts +23 -0
- package/dist/arena/mutator.js +112 -0
- package/dist/arena/rng.d.ts +15 -0
- package/dist/arena/rng.js +34 -0
- package/dist/arena/runner.d.ts +44 -0
- package/dist/arena/runner.js +79 -0
- package/dist/cli/bundle.js +7 -7
- package/dist/cli/chunks/adapter-XZVL3DHO.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-NGC6LSQP.js → agent-booster-wasm-3BC5LIEB.js} +2 -2
- package/dist/cli/chunks/{agent-handler-P2IJE4GK.js → agent-handler-QLXWVZZF.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-JXRJ5GKQ.js → agent-memory-branch-3U5PDYW7.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-YIL25K6W.js +2 -0
- package/dist/cli/chunks/arena-BMJQK4RD.js +18 -0
- package/dist/cli/chunks/arena-XENAGV4I.js +4 -0
- package/dist/cli/chunks/audit-WPIRUJNZ.js +3 -0
- package/dist/cli/chunks/base-YCYV23Q3.js +2 -0
- package/dist/cli/chunks/{hnswlib-node-64EGGWIC.js → better-sqlite3-6AGIBSVE.js} +2 -2
- package/dist/cli/chunks/{brain-handler-SACNDFSW.js → brain-handler-PHSWG5PR.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-LFOTVUDA.js → branch-enumerator-LNSYT34I.js} +2 -2
- package/dist/cli/chunks/{browser-FK7PRF3W.js → browser-M5BVQMBI.js} +2 -2
- package/dist/cli/chunks/browser-workflow-ALCOCRA2.js +2 -0
- package/dist/cli/chunks/{chunk-ZXQNE4QV.js → chunk-24A7KD3D.js} +1 -1
- package/dist/cli/chunks/{chunk-6Q2PPOOF.js → chunk-253TDTPH.js} +1 -1
- package/dist/cli/chunks/{chunk-MC7K44M4.js → chunk-2RLRPKCG.js} +2 -2
- package/dist/cli/chunks/{chunk-VRXY4T22.js → chunk-2UQWVF4P.js} +2 -2
- package/dist/cli/chunks/{chunk-UDV4YB42.js → chunk-2Z7HIT5I.js} +1 -1
- package/dist/cli/chunks/{chunk-CTDO2UB2.js → chunk-3BGGNHHZ.js} +1 -1
- package/dist/cli/chunks/{chunk-HWM2XJ3P.js → chunk-3JWV4GE6.js} +2 -2
- package/dist/cli/chunks/{chunk-BT3QLWII.js → chunk-3KGUP2SD.js} +2 -2
- package/dist/cli/chunks/{chunk-T63EK6GH.js → chunk-3WOQY6UL.js} +2 -2
- package/dist/cli/chunks/{chunk-QM65UGPV.js → chunk-4FTO3TPH.js} +2 -2
- package/dist/cli/chunks/{chunk-WWD5IWTV.js → chunk-4K7T6AKM.js} +1 -1
- package/dist/cli/chunks/{chunk-XTP2GHI7.js → chunk-4Z7XH4JE.js} +2 -2
- package/dist/cli/chunks/{chunk-FND6V2RV.js → chunk-54IPDQIZ.js} +8 -8
- package/dist/cli/chunks/{chunk-KTRB3L53.js → chunk-56RA6YPN.js} +2 -2
- package/dist/cli/chunks/{chunk-7YYTTWGY.js → chunk-5D7GLMT3.js} +1 -1
- package/dist/cli/chunks/{chunk-M5CDW2ZH.js → chunk-66LOFIBP.js} +2 -2
- package/dist/cli/chunks/{chunk-3X2ZQ55B.js → chunk-6SAU7GXO.js} +3 -3
- package/dist/cli/chunks/{chunk-DF3MJ2YL.js → chunk-75MP7JMV.js} +1 -1
- package/dist/cli/chunks/{chunk-RTDHWOAG.js → chunk-7DU35D4M.js} +1 -1
- package/dist/cli/chunks/{chunk-Q7EBD24B.js → chunk-7JZCEQFR.js} +1 -1
- package/dist/cli/chunks/{chunk-JXIPRMAY.js → chunk-A3BDPU5F.js} +4 -4
- package/dist/cli/chunks/{chunk-I42R57ON.js → chunk-A7HGS7FW.js} +2 -2
- package/dist/cli/chunks/{chunk-NNZMEYLT.js → chunk-AMBIOEMO.js} +1 -1
- package/dist/cli/chunks/{chunk-BO2OV2RH.js → chunk-AVQD7KEN.js} +2 -2
- package/dist/cli/chunks/{chunk-6GCOIIHY.js → chunk-AZCKTAUI.js} +2 -2
- package/dist/cli/chunks/{chunk-GL3HZN3O.js → chunk-B4F5EPNR.js} +1 -1
- package/dist/cli/chunks/{chunk-HAO3SPOE.js → chunk-BB7MEGXD.js} +2 -2
- package/dist/cli/chunks/{chunk-VDTFRMES.js → chunk-BSRCL6RU.js} +2 -2
- package/dist/cli/chunks/{chunk-RZCAA2PZ.js → chunk-CS3UB2OL.js} +1 -1
- package/dist/cli/chunks/{chunk-4OUAHZX2.js → chunk-CTG3GJIM.js} +2 -2
- package/dist/cli/chunks/{chunk-BWP3UVPE.js → chunk-CUAM34RQ.js} +3 -3
- package/dist/cli/chunks/chunk-CUY2EUSQ.js +2 -0
- package/dist/cli/chunks/{chunk-X2B7SANM.js → chunk-D3Q4443B.js} +1 -1
- package/dist/cli/chunks/{chunk-5IBJURYB.js → chunk-D4WDJ4ZF.js} +2 -2
- package/dist/cli/chunks/chunk-D7NKRCIL.js +2 -0
- package/dist/cli/chunks/{chunk-JP63XACW.js → chunk-DBR4TQPK.js} +2 -2
- package/dist/cli/chunks/{chunk-FLTPHVZ3.js → chunk-DIJ74M7V.js} +1 -1
- package/dist/cli/chunks/{chunk-PFCAMX6H.js → chunk-DJQYZ4RZ.js} +1 -1
- package/dist/cli/chunks/{chunk-5LON3MLI.js → chunk-DN65ILSI.js} +2 -2
- package/dist/cli/chunks/{chunk-6ZK24V2Y.js → chunk-DWLGFYXV.js} +2 -2
- package/dist/cli/chunks/{chunk-5EWWA4QP.js → chunk-EIL7FQC4.js} +6 -6
- package/dist/cli/chunks/{chunk-IRR7YA3Q.js → chunk-FE3FGMNB.js} +2 -2
- package/dist/cli/chunks/{chunk-ADV4DH3W.js → chunk-FLYFNNSN.js} +3 -3
- package/dist/cli/chunks/{chunk-SWOG3PBD.js → chunk-FNJZBIR3.js} +2 -2
- package/dist/cli/chunks/chunk-FPWA73N6.js +2 -0
- package/dist/cli/chunks/{chunk-NEYYLAYS.js → chunk-FW3C4LWU.js} +2 -2
- package/dist/cli/chunks/{chunk-5G5AAEFF.js → chunk-G4GX6YKX.js} +2 -2
- package/dist/cli/chunks/{chunk-NNVXHC74.js → chunk-G5UIGH4C.js} +3 -3
- package/dist/cli/chunks/{chunk-QEODION5.js → chunk-G6FP3S3G.js} +2 -2
- package/dist/cli/chunks/{chunk-ZG4P3DTL.js → chunk-GDUGW6FZ.js} +2 -2
- package/dist/cli/chunks/{chunk-GJUGSH7T.js → chunk-GKG6IQP6.js} +3 -3
- package/dist/cli/chunks/chunk-GMU7P5O3.js +2 -0
- package/dist/cli/chunks/{chunk-NRCL3WCP.js → chunk-GTVXVYKE.js} +2 -2
- package/dist/cli/chunks/{chunk-2ULVCLOW.js → chunk-HHEHGERJ.js} +2 -2
- package/dist/cli/chunks/{chunk-6FL3GN4T.js → chunk-HKJ3LG3N.js} +2 -2
- package/dist/cli/chunks/{chunk-E2BJT6A7.js → chunk-HNYSBE5J.js} +2 -2
- package/dist/cli/chunks/{chunk-JTZ3Q2QS.js → chunk-HPKYIK7R.js} +2 -2
- package/dist/cli/chunks/{chunk-GHNNJHH3.js → chunk-HRORJ352.js} +2 -2
- package/dist/cli/chunks/{chunk-5ER3COX3.js → chunk-IIFCTJOF.js} +2 -2
- package/dist/cli/chunks/{chunk-UIJFU4KD.js → chunk-IOE6LDPF.js} +2 -2
- package/dist/cli/chunks/{chunk-JD2PG4KS.js → chunk-IRS4HKAR.js} +1 -1
- package/dist/cli/chunks/{chunk-VIWIO27R.js → chunk-IT7CEHAJ.js} +2 -2
- package/dist/cli/chunks/{chunk-JE3C7JYN.js → chunk-IUKERFLT.js} +1 -1
- package/dist/cli/chunks/{chunk-YDKYLNKZ.js → chunk-IVKSZNMI.js} +1 -1
- package/dist/cli/chunks/{chunk-3RZL4QTT.js → chunk-IWRORKD7.js} +2 -2
- package/dist/cli/chunks/{chunk-NZHOKLII.js → chunk-J533CJUN.js} +3 -3
- package/dist/cli/chunks/{chunk-5SGEOO2F.js → chunk-JPOEI7CJ.js} +2 -2
- package/dist/cli/chunks/{chunk-MBSJ5G4I.js → chunk-JY7T2AQQ.js} +4 -4
- package/dist/cli/chunks/{chunk-4QFAUSWQ.js → chunk-K5KKZWED.js} +2 -2
- package/dist/cli/chunks/{chunk-L74CHKFR.js → chunk-KIMJPTHD.js} +2 -2
- package/dist/cli/chunks/{chunk-N7IBYDW5.js → chunk-MEN3UW7W.js} +1 -1
- package/dist/cli/chunks/{chunk-UHDBM7QS.js → chunk-MFQIJ3HV.js} +2 -2
- package/dist/cli/chunks/{chunk-SL6YZAT4.js → chunk-MGCW5FWH.js} +2 -2
- package/dist/cli/chunks/{chunk-U6UK3UMX.js → chunk-MIMJVKJJ.js} +3 -3
- package/dist/cli/chunks/{chunk-7ZSPCGTI.js → chunk-MJRYHHOG.js} +2 -2
- package/dist/cli/chunks/{chunk-FU77CDEM.js → chunk-MRXKIXVV.js} +2 -2
- package/dist/cli/chunks/{chunk-DY5KEOHX.js → chunk-MWPFUBXS.js} +2 -2
- package/dist/cli/chunks/{chunk-C6BBRM2J.js → chunk-N2TJXGHG.js} +1 -1
- package/dist/cli/chunks/{chunk-MQOFFRTA.js → chunk-NGSA53GC.js} +2 -2
- package/dist/cli/chunks/{chunk-YXH2CVAF.js → chunk-NKW7VOZV.js} +1 -1
- package/dist/cli/chunks/{chunk-YIYV2JB6.js → chunk-O5OOUMBB.js} +2 -2
- package/dist/cli/chunks/{chunk-HM523MTQ.js → chunk-OATHXZYW.js} +1 -1
- package/dist/cli/chunks/{chunk-WPVCSFDA.js → chunk-OJNG6ZXG.js} +2 -2
- package/dist/cli/chunks/{chunk-7SEHQTYD.js → chunk-PGNQR2VM.js} +1 -1
- package/dist/cli/chunks/{chunk-UZL366ZI.js → chunk-PPM5D7LH.js} +1 -1
- package/dist/cli/chunks/{chunk-ERYMAYJW.js → chunk-PYBVFG6T.js} +2 -2
- package/dist/cli/chunks/{chunk-FJGSEPFL.js → chunk-Q6BKJZTG.js} +2 -2
- package/dist/cli/chunks/chunk-QAW6RVAR.js +699 -0
- package/dist/cli/chunks/chunk-QTDZS4U6.js +2 -0
- package/dist/cli/chunks/{chunk-USFZ4IJD.js → chunk-R573V37S.js} +15 -15
- package/dist/cli/chunks/{chunk-Z2K5IZM6.js → chunk-RCAIOTIF.js} +2 -2
- package/dist/cli/chunks/{chunk-7RMZAVGO.js → chunk-RFNEEDPQ.js} +2 -2
- package/dist/cli/chunks/{chunk-IL2KOW5W.js → chunk-RFVZMNYX.js} +2 -2
- package/dist/cli/chunks/{chunk-B5MMDMH6.js → chunk-RLU7764Y.js} +2 -2
- package/dist/cli/chunks/chunk-RLZDXQNM.js +2 -0
- package/dist/cli/chunks/{chunk-QWG76RHA.js → chunk-RONMVGCT.js} +2 -2
- package/dist/cli/chunks/{chunk-X3RJ6SFC.js → chunk-RR55MLD4.js} +1 -1
- package/dist/cli/chunks/{chunk-PL5SLO2W.js → chunk-RUQV3BTV.js} +1 -1
- package/dist/cli/chunks/{chunk-NXPFGPHV.js → chunk-RZ7D5SHS.js} +1 -1
- package/dist/cli/chunks/{chunk-3LRK7PYN.js → chunk-S73KENCH.js} +2 -2
- package/dist/cli/chunks/{chunk-3HBWDG62.js → chunk-S7FGTHFE.js} +2 -2
- package/dist/cli/chunks/{chunk-CAMEFWRK.js → chunk-S7HQOGVD.js} +1 -1
- package/dist/cli/chunks/{chunk-PZHZPX3O.js → chunk-SK6YRNXI.js} +2 -2
- package/dist/cli/chunks/{chunk-JTF6D2RJ.js → chunk-SXQIH2QA.js} +2 -2
- package/dist/cli/chunks/{chunk-6B4S7PKP.js → chunk-TISBFSDJ.js} +1 -1
- package/dist/cli/chunks/{chunk-72LE6PHL.js → chunk-TMD6IC6D.js} +2 -2
- package/dist/cli/chunks/{chunk-YDDZJCKY.js → chunk-TMTLWSSA.js} +1 -1
- package/dist/cli/chunks/{chunk-HQJMCTWN.js → chunk-UOIT5JZ6.js} +2 -2
- package/dist/cli/chunks/{chunk-OPDTDKN3.js → chunk-UTORITJT.js} +2 -2
- package/dist/cli/chunks/{chunk-3JAOFKEU.js → chunk-VB7DZVCI.js} +1 -1
- package/dist/cli/chunks/{chunk-2L73WXA4.js → chunk-VC256KH2.js} +2 -2
- package/dist/cli/chunks/{chunk-SNTMAVPH.js → chunk-VESYE5YO.js} +3 -3
- package/dist/cli/chunks/{chunk-YYAPO3CU.js → chunk-VKWDMOR4.js} +2 -2
- package/dist/cli/chunks/{chunk-HRLXU4LH.js → chunk-VWN66V7U.js} +2 -2
- package/dist/cli/chunks/{chunk-CNEWYJKT.js → chunk-W5C7R2LS.js} +3 -3
- package/dist/cli/chunks/{chunk-JLL27IGU.js → chunk-W7KGHW4T.js} +2 -2
- package/dist/cli/chunks/{chunk-H56AROF2.js → chunk-WFZ4DRIC.js} +2 -2
- package/dist/cli/chunks/{chunk-4CYLSXA6.js → chunk-WFZUKXV5.js} +2 -2
- package/dist/cli/chunks/{chunk-AEJVOJPT.js → chunk-X4B3R3ZZ.js} +2 -2
- package/dist/cli/chunks/{chunk-KG5SM36Y.js → chunk-XI6ZZMX7.js} +1 -1
- package/dist/cli/chunks/{chunk-R5ONQAQL.js → chunk-YEO2Z3UX.js} +2 -2
- package/dist/cli/chunks/{chunk-D2FBUOAR.js → chunk-YZD4VIE5.js} +1 -1
- package/dist/cli/chunks/{chunk-U7NMPZE2.js → chunk-YZFNPTGN.js} +2 -2
- package/dist/cli/chunks/{chunk-OX4R55T3.js → chunk-ZCYKWEAM.js} +2 -2
- package/dist/cli/chunks/{chunk-OG7CWWFR.js → chunk-ZG3DSWUA.js} +1 -1
- package/dist/cli/chunks/{chunk-EETVN2OJ.js → chunk-ZS4BGJJV.js} +1 -1
- package/dist/cli/chunks/{chunk-LZ6TNTGO.js → chunk-ZT7JSFGT.js} +2 -2
- package/dist/cli/chunks/{chunk-HMFEPKAR.js → chunk-ZTC64OJE.js} +2 -2
- package/dist/cli/chunks/{chunk-RNF47IJ5.js → chunk-ZUBJBAUD.js} +15 -15
- package/dist/cli/chunks/{ci-AWZ3S5OT.js → ci-M2BSQBLL.js} +2 -2
- package/dist/cli/chunks/{ci-output-JLCYTIMT.js → ci-output-Z4TMK6GZ.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-BJDKBDIL.js → circuit-breaker-E3G4GGWB.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-KKOP5ZMO.js → claude-flow-setup-MASRQU54.js} +2 -2
- package/dist/cli/chunks/client-RPB6RYVY.js +2 -0
- package/dist/cli/chunks/{cline-installer-7M525SEA.js → cline-installer-P3BWAKQA.js} +2 -2
- package/dist/cli/chunks/{code-27SUVJDO.js → code-7HY5HQAV.js} +2 -2
- package/dist/cli/chunks/{code-index-extractor-TTQQZLAK.js → code-index-extractor-MBVKLOEU.js} +2 -2
- package/dist/cli/chunks/{codex-installer-GHNGNPKP.js → codex-installer-WZ6QO2PH.js} +2 -2
- package/dist/cli/chunks/{completions-JPJD24DG.js → completions-TOJC2UFP.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-Q74EJV33.js → complexity-analyzer-QYVDIAAW.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-ULTRDIML.js → continuedev-installer-J72CV7P4.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-EK52X4CG.js → copilot-installer-ACDA3GEA.js} +2 -2
- package/dist/cli/chunks/core-handlers-QFJT5NX6.js +2 -0
- package/dist/cli/chunks/{cost-tracker-2GKBRYXL.js → cost-tracker-BAYQJELE.js} +2 -2
- package/dist/cli/chunks/{coverage-YCLC3W2A.js → coverage-QD3XJV6W.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-5GJ7WZKX.js +2 -0
- package/dist/cli/chunks/{cursor-installer-B3ALFW5E.js → cursor-installer-SPGZ4TQM.js} +2 -2
- package/dist/cli/chunks/{daemon-ZKEBVLJA.js → daemon-3EVOL2UH.js} +3 -3
- package/dist/cli/chunks/daemon-N4JKD5SO.js +10 -0
- package/dist/cli/chunks/{dag-attention-scheduler-OQPJ6ULA.js → dag-attention-scheduler-3BVLL3L5.js} +2 -2
- package/dist/cli/chunks/{detect-YMYIQH3Q.js → detect-SWACKB45.js} +2 -2
- package/dist/cli/chunks/{dist-node-R4FAYQRY.js → dist-node-LU4E7PI6.js} +2 -2
- package/dist/cli/chunks/{domain-handler-IGWXLF2S.js → domain-handler-5AKKAC43.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-A7YNO76C.js → domain-transfer-LB6H7RPX.js} +2 -2
- package/dist/cli/chunks/dream-C6VNLTON.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-KODZAS7Y.js → embed-and-insert-pattern-7RBA5NDK.js} +2 -2
- package/dist/cli/chunks/{eval-ALQW7Q2S.js → eval-ZZFPRENX.js} +5 -5
- package/dist/cli/chunks/{experience-capture-middleware-3WK4RXWK.js → experience-capture-middleware-HRO3EGIW.js} +3 -3
- package/dist/cli/chunks/{fast-paths-PQWDFIJZ.js → fast-paths-IRRNQBTY.js} +2 -2
- package/dist/cli/chunks/{feature-flags-JRUAZCND.js → feature-flags-R5N5IWI2.js} +2 -2
- package/dist/cli/chunks/{feature-flags-6X33B3WX.js → feature-flags-W54ABAUA.js} +2 -2
- package/dist/cli/chunks/{file-discovery-SA3YU3IH.js → file-discovery-6CIDLVID.js} +2 -2
- package/dist/cli/chunks/{fleet-7TXCAOKQ.js → fleet-YTFN64WE.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-ZKNYACEC.js → gnn-wrapper-RXMPLMV2.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-KRZRZ23F.js → heartbeat-handler-HQQWEEQQ.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-4SBO27BG.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-W7G6VNXW.js +2 -0
- package/dist/cli/chunks/hnsw-index-LENA5QML.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-LVHQ5SG7.js → hnsw-legacy-bridge-GPZIKYFD.js} +2 -2
- package/dist/cli/chunks/{better-sqlite3-HP4JZS6K.js → hnswlib-node-P6HSEFLW.js} +2 -2
- package/dist/cli/chunks/hooks-AYLAGFOK.js +285 -0
- package/dist/cli/chunks/hybrid-router-IXHIC45P.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-2EZBZMFK.js → hypergraph-engine-56FMXI3T.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-GLPWYII2.js → hypergraph-handler-APEVT5IE.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-DKGVMYU6.js +2 -0
- package/dist/cli/chunks/{init-handler-ZSDO5VMA.js → init-handler-5DWF4REQ.js} +6 -6
- package/dist/cli/chunks/init-wizard-BBY3LY3F.js +2 -0
- package/dist/cli/chunks/kernel-7CUW7G62.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-ATYSDWIV.js → kilocode-installer-XKAUA5VA.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-K66YT6PC.js → kiro-installer-NI2KIYJE.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-Q5CP47IP.js +2 -0
- package/dist/cli/chunks/{learning-BVYCC4RI.js → learning-ZIUMUNXZ.js} +3 -3
- package/dist/cli/chunks/{llm-router-VBCXE6DN.js → llm-router-IL52EF2V.js} +4 -4
- package/dist/cli/chunks/llm-router-service-MTXCX7TO.js +2 -0
- package/dist/cli/chunks/{load-AREDQE2U.js → load-B5LFYD6O.js} +2 -2
- package/dist/cli/chunks/load-test-YBWXASBO.js +2 -0
- package/dist/cli/chunks/{mcp-NG6H6UC5.js → mcp-K6GZLWBC.js} +2 -2
- package/dist/cli/chunks/{memory-Y65EHG6N.js → memory-NCQRVSN6.js} +5 -5
- package/dist/cli/chunks/memory-backend-52LANEA3.js +2 -0
- package/dist/cli/chunks/memory-handlers-KFW3HYAP.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-VRPRFUZT.js → multi-model-executor-R4LBSJWK.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-CKQXPM5R.js → opencode-installer-I6CBR3PV.js} +2 -2
- package/dist/cli/chunks/{orchestrator-I7JBKD6G.js → orchestrator-5FXUCES6.js} +10 -10
- package/dist/cli/chunks/{pipeline-MV2RWCBI.js → pipeline-GDKCTXJH.js} +2 -2
- package/dist/cli/chunks/{platform-VU5P3SOG.js → platform-ZFY3F4T3.js} +2 -2
- package/dist/cli/chunks/{plugin-6TERLKCB.js → plugin-HQMEN3OS.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-WIUIN2DL.js → prime-radiant-advanced-wasm-LSJGF4CV.js} +2 -2
- package/dist/cli/chunks/protocol-executor-TRYUS77M.js +2 -0
- package/dist/cli/chunks/{protocol-handler-HKWBGARO.js → protocol-handler-BMDNIGPP.js} +2 -2
- package/dist/cli/chunks/{prove-7CQPHBRJ.js → prove-ABVGAG4Z.js} +2 -2
- package/dist/cli/chunks/provider-manager-6XQQN7FX.js +2 -0
- package/dist/cli/chunks/qe-reasoning-bank-3IUPE4DJ.js +2 -0
- package/dist/cli/chunks/{quality-VLUVXKVG.js → quality-ENJXPNP5.js} +2 -2
- package/dist/cli/chunks/queen-coordinator-VWPH4XPX.js +2 -0
- package/dist/cli/chunks/{real-embeddings-JPZ64KK2.js → real-embeddings-W3GNAEJO.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-NONVB3UE.js → roocode-installer-4FJNQ7PU.js} +2 -2
- package/dist/cli/chunks/router-OIB6ODHA.js +2 -0
- package/dist/cli/chunks/routing-feedback-EKYPCZYG.js +2 -0
- package/dist/cli/chunks/{routing-handler-YYXDT4J2.js → routing-handler-GFS5FA4F.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-5PFMNDLR.js → ruvector-commands-GBMYNJKN.js} +2 -2
- package/dist/cli/chunks/{rvf-dual-writer-TF6H7AXH.js → rvf-dual-writer-STUAQT6U.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-adapter-VNGIUZCO.js → rvf-migration-adapter-LO6DBNJH.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-coordinator-VA52YAIY.js → rvf-migration-coordinator-I5AD4VJ2.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-7RXP2Q4Q.js +2 -0
- package/dist/cli/chunks/safe-db-MNKFEPBX.js +2 -0
- package/dist/cli/chunks/schedule-AJXABVXX.js +2 -0
- package/dist/cli/chunks/scheduler-LDWYHIAW.js +2 -0
- package/dist/cli/chunks/{security-62HEETBF.js → security-X3WCA5K5.js} +3 -3
- package/dist/cli/chunks/shared-rvf-adapter-Z4FSPWNP.js +2 -0
- package/dist/cli/chunks/{shared-rvf-dual-writer-JTZK7LRD.js → shared-rvf-dual-writer-QOPOIRIC.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-A6GKDMOJ.js +2 -0
- package/dist/cli/chunks/{status-handler-LSUPUKRF.js → status-handler-B2B5QBVK.js} +2 -2
- package/dist/cli/chunks/{structural-health-Z75A666N.js → structural-health-KT47LBVH.js} +2 -2
- package/dist/cli/chunks/sync-CKID22IW.js +2 -0
- package/dist/cli/chunks/{sync-M3O4T3A3.js → sync-VWD6OOUR.js} +2 -2
- package/dist/cli/chunks/{task-handler-AQBSZAQC.js → task-handler-X5JT5YBF.js} +2 -2
- package/dist/cli/chunks/{task-handlers-BOZP247V.js → task-handlers-IW4GQDW4.js} +3 -3
- package/dist/cli/chunks/{test-FTEGPNN2.js → test-MBZSUASD.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-IGR4U2VQ.js → test-scheduling-E5KHKRZS.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-TIDPJ5IG.js +2 -0
- package/dist/cli/chunks/{token-usage-VCHV47EO.js → token-usage-ECJSPOQB.js} +2 -2
- package/dist/cli/chunks/{transformers-M27QSNFH.js → transformers-UZJAQ7OZ.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-IIGEJYFU.js → tree-sitter-wasm-parser-H6BU2E5R.js} +2 -2
- package/dist/cli/chunks/{types-RQFPUUKA.js → types-PM7NT3MH.js} +2 -2
- package/dist/cli/chunks/unified-memory-27QJHABO.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-76VUXR4H.js +2 -0
- package/dist/cli/chunks/unified-persistence-QRCGDEXH.js +2 -0
- package/dist/cli/chunks/{upgrade-VJMYX3AL.js → upgrade-FS2XYC2P.js} +2 -2
- package/dist/cli/chunks/{validate-ML7HUAU5.js → validate-4Y2BNN3A.js} +3 -3
- package/dist/cli/chunks/{validate-swarm-RCR6EYRC.js → validate-swarm-Z7QXZSUE.js} +4 -4
- package/dist/cli/chunks/{vibium-ZOOS3W5L.js → vibium-VZ6L3O2G.js} +2 -2
- package/dist/cli/chunks/visual-security-KB27O7BE.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-2YPGYLWK.js → web-tree-sitter-H7P37W5U.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-GOJWUWC5.js → windsurf-installer-IB2VHSZS.js} +2 -2
- package/dist/cli/chunks/{witness-chain-3MGSS3Q4.js → witness-chain-C4DISYJN.js} +2 -2
- package/dist/cli/chunks/witness-chain-EYPXHRDV.js +2 -0
- package/dist/cli/chunks/{workflow-B5Q77BI4.js → workflow-IGM7KVIO.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-6AQZ3USU.js +2 -0
- package/dist/cli/chunks/wrappers-PQXC263L.js +2 -0
- package/dist/cli/commands/arena.d.ts +10 -0
- package/dist/cli/commands/arena.js +129 -0
- package/dist/cli/commands/hooks-handlers/command-hooks.js +38 -2
- package/dist/cli/commands/hooks-handlers/hooks-dream-learning.d.ts +4 -0
- package/dist/cli/commands/hooks-handlers/hooks-dream-learning.js +66 -3
- package/dist/cli/commands/hooks-handlers/nesting-provenance.d.ts +27 -0
- package/dist/cli/commands/hooks-handlers/nesting-provenance.js +46 -0
- package/dist/cli/commands/hooks-handlers/task-hooks.js +72 -1
- package/dist/cli/commands/hooks-handlers/tool-loop-guardrail.d.ts +71 -0
- package/dist/cli/commands/hooks-handlers/tool-loop-guardrail.js +142 -0
- package/dist/cli/index.js +17 -0
- package/dist/contracts/verdicts.d.ts +297 -0
- package/dist/contracts/verdicts.js +178 -0
- package/dist/coordination/queen-types.d.ts +4 -0
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +15 -6
- package/dist/integrations/agentic-flow/reasoning-bank/trajectory-tracker.js +12 -0
- package/dist/integrations/ruvector/shared-rvf-adapter.js +12 -1
- package/dist/integrations/ruvector/shared-rvf-dual-writer.js +6 -2
- package/dist/kernel/project-root.d.ts +33 -0
- package/dist/kernel/project-root.js +86 -0
- package/dist/kernel/unified-memory.d.ts +2 -19
- package/dist/kernel/unified-memory.js +8 -64
- package/dist/learning/local-judge-client.d.ts +55 -0
- package/dist/learning/local-judge-client.js +127 -0
- package/dist/learning/nagual-client.d.ts +73 -0
- package/dist/learning/nagual-client.js +150 -0
- package/dist/learning/pattern-store.js +10 -3
- package/dist/mcp/bundle.js +393 -391
- package/dist/mcp/entry.js +44 -33
- package/dist/mcp/handlers/core-handlers.d.ts +20 -0
- package/dist/mcp/handlers/core-handlers.js +28 -0
- package/dist/mcp/handlers/domain-handler-configs.d.ts +3 -0
- package/dist/mcp/handlers/domain-handler-configs.js +22 -10
- package/dist/mcp/transport/stdio.d.ts +7 -0
- package/dist/mcp/transport/stdio.js +39 -2
- package/dist/shared/llm/cost-tracker.js +6 -2
- package/dist/shared/llm/interfaces.d.ts +4 -0
- package/dist/shared/llm/providers/claude.js +16 -2
- package/dist/shared/reasoning-scrub.d.ts +29 -0
- package/dist/shared/reasoning-scrub.js +75 -0
- package/dist/workers/daemon.js +2 -0
- package/dist/workers/quality-daemon/git-watcher.js +2 -0
- package/dist/workers/quality-daemon/index.js +2 -0
- package/dist/workers/worker-manager.js +4 -0
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-BHPUKMJ5.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-JQ5WD2HM.js +0 -2
- package/dist/cli/chunks/audit-BMQ3VESB.js +0 -3
- package/dist/cli/chunks/base-E32WLGY2.js +0 -2
- package/dist/cli/chunks/browser-workflow-LNNXXAJG.js +0 -2
- package/dist/cli/chunks/chunk-2EQVYYBF.js +0 -2
- package/dist/cli/chunks/chunk-3VF3HCG4.js +0 -2
- package/dist/cli/chunks/chunk-GELF4ILR.js +0 -699
- package/dist/cli/chunks/chunk-JOLDCS6X.js +0 -2
- package/dist/cli/chunks/chunk-JSFYPLMQ.js +0 -2
- package/dist/cli/chunks/chunk-YX2HY4MX.js +0 -2
- package/dist/cli/chunks/client-2UKBYFX4.js +0 -2
- package/dist/cli/chunks/cross-domain-router-FPM3L27L.js +0 -2
- package/dist/cli/chunks/daemon-YWINEHG4.js +0 -10
- package/dist/cli/chunks/dream-XM33US3V.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-GM3M2MTG.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-K62GEHIL.js +0 -2
- package/dist/cli/chunks/hnsw-index-VCAK3TWN.js +0 -2
- package/dist/cli/chunks/hooks-6Y3UHYI2.js +0 -248
- package/dist/cli/chunks/hybrid-router-432QNCNG.js +0 -2
- package/dist/cli/chunks/impact-analyzer-VTSISNN4.js +0 -2
- package/dist/cli/chunks/init-wizard-COB5AH7Q.js +0 -2
- package/dist/cli/chunks/kernel-ROK7X5FM.js +0 -2
- package/dist/cli/chunks/knowledge-graph-YUWIDIWW.js +0 -2
- package/dist/cli/chunks/llm-router-service-7VLXJ7VE.js +0 -2
- package/dist/cli/chunks/load-test-32524DL3.js +0 -2
- package/dist/cli/chunks/memory-backend-BI2V5AAB.js +0 -2
- package/dist/cli/chunks/memory-handlers-NSOFWVFN.js +0 -2
- package/dist/cli/chunks/protocol-executor-2UPB7SPI.js +0 -2
- package/dist/cli/chunks/provider-manager-PDT37MIJ.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-AQQ2BI4V.js +0 -2
- package/dist/cli/chunks/queen-coordinator-6DVDVEU4.js +0 -2
- package/dist/cli/chunks/router-O2G4KQ6L.js +0 -2
- package/dist/cli/chunks/routing-feedback-TAGTD3KQ.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-46GRWQJR.js +0 -2
- package/dist/cli/chunks/safe-db-LNIPXXHH.js +0 -2
- package/dist/cli/chunks/schedule-AUH3ZALY.js +0 -2
- package/dist/cli/chunks/scheduler-KK3OYPWW.js +0 -2
- package/dist/cli/chunks/shared-rvf-adapter-XWTQPGCT.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-CYESP7NG.js +0 -2
- package/dist/cli/chunks/sync-VI37UHHH.js +0 -2
- package/dist/cli/chunks/token-bootstrap-2DFRVMBM.js +0 -2
- package/dist/cli/chunks/unified-memory-RISHEANP.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-2IKXGMNZ.js +0 -2
- package/dist/cli/chunks/unified-persistence-ZTTUJNTU.js +0 -2
- package/dist/cli/chunks/visual-security-D66DTAO5.js +0 -2
- package/dist/cli/chunks/witness-chain-RHWHHDLV.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-OQMFW2TC.js +0 -2
- package/dist/cli/chunks/wrappers-MM5VLEPG.js +0 -2
|
@@ -3,7 +3,7 @@ name: qcsd-development-swarm
|
|
|
3
3
|
description: "Use when monitoring in-sprint code quality with TDD adherence checks, complexity analysis, coverage gap detection, or defect prediction in the QCSD Development phase."
|
|
4
4
|
category: qcsd-phases
|
|
5
5
|
priority: critical
|
|
6
|
-
version: 1.
|
|
6
|
+
version: 1.1.0
|
|
7
7
|
tokenEstimate: 3400
|
|
8
8
|
# DDD Domain Mapping (from QCSD-AGENTIC-QE-MAPPING-FRAMEWORK.md)
|
|
9
9
|
domains:
|
|
@@ -34,13 +34,14 @@ agents:
|
|
|
34
34
|
total: 10
|
|
35
35
|
sub_agents: 0
|
|
36
36
|
skills: [tdd-london-chicago, mutation-testing, performance-testing, security-testing]
|
|
37
|
-
# Execution Models (
|
|
37
|
+
# Execution Models (Workflow is PRIMARY where the harness supports it — ADR-102)
|
|
38
38
|
execution:
|
|
39
|
-
primary:
|
|
40
|
-
|
|
39
|
+
primary: workflow
|
|
40
|
+
workflow_name: qcsd-development-review
|
|
41
|
+
alternatives: [task-tool, mcp-tools, cli]
|
|
41
42
|
swarm_pattern: true
|
|
42
43
|
parallel_batches: 3
|
|
43
|
-
last_updated: 2026-
|
|
44
|
+
last_updated: 2026-06-10
|
|
44
45
|
enforcement_level: strict
|
|
45
46
|
tags: [qcsd, development, tdd, complexity, coverage, security, performance, mutation, defect-prediction, swarm, parallel, ddd]
|
|
46
47
|
trust_tier: 3
|
|
@@ -192,10 +193,30 @@ skip to step N. Ensure you have the required prerequisite data from prior steps.
|
|
|
192
193
|
|
|
193
194
|
| Model | When to Use | Agent Spawn |
|
|
194
195
|
|-------|-------------|-------------|
|
|
195
|
-
| **
|
|
196
|
+
| **Workflow** (PRIMARY, ADR-102) | Harness with the Workflow tool | `Workflow({ name: "qcsd-development-review", args: { sourcePath, testPath } })` |
|
|
197
|
+
| **Task Tool** (fallback) | Claude Code sessions without Workflow support | `Task({ subagent_type, run_in_background: true })` |
|
|
196
198
|
| **MCP Tools** | MCP server available | `fleet_init({})` / `task_submit({})` |
|
|
197
199
|
| **CLI** | Terminal/scripts | `swarm init` / `agent spawn` |
|
|
198
200
|
|
|
201
|
+
### Workflow execution (ADR-102)
|
|
202
|
+
|
|
203
|
+
`.claude/workflows/qcsd-development-review.js` runs the review as a deterministic
|
|
204
|
+
pipeline: one finder per quality dimension (TDD adherence, complexity, coverage
|
|
205
|
+
gaps — `args.dimensions` selects a subset) → **3 blind adversarial refuters per
|
|
206
|
+
finding** (Loki-mode, ADR-074: refuters see only the bare claim + evidence,
|
|
207
|
+
never the finder's confidence or each other; uncertainty defaults to refuted)
|
|
208
|
+
→ deterministic synthesis into `finding-verdict@1` envelopes (ADR-103,
|
|
209
|
+
`schemas/finding-verdict.schema.json`). A finding survives only if fewer than
|
|
210
|
+
⌈N/2⌉ refuters kill it. The final report contains ONLY confirmed findings;
|
|
211
|
+
killed findings are retained under `killed` with their refutations for audit.
|
|
212
|
+
|
|
213
|
+
Args: `sourcePath` (required), `testPath`, `dimensions` (subset of
|
|
214
|
+
`tdd-adherence|complexity|coverage-gaps`), `maxFindings` per dimension (default 5).
|
|
215
|
+
|
|
216
|
+
When the Workflow tool is unavailable, fall back to the Task-tool protocol
|
|
217
|
+
below — the report format and gates are identical, minus the adversarial
|
|
218
|
+
verification stage (note this in the report header as `verification: none`).
|
|
219
|
+
|
|
199
220
|
---
|
|
200
221
|
|
|
201
222
|
## Key Principle
|
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,110 @@ All notable changes to the Agentic QE project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [3.10.5] - 2026-06-10
|
|
9
|
+
|
|
10
|
+
The Fable 5 / harness-parity release (#520): the CLI's memory and fleet
|
|
11
|
+
commands work for the first time, prompt caching actually engages, the
|
|
12
|
+
self-learning pipeline stays clean under reasoning-heavy models, and two new
|
|
13
|
+
capabilities land — adversarially verified QCSD reviews and competitive
|
|
14
|
+
test-strategy tournaments. Seven improvements, each with its own ADR and a
|
|
15
|
+
reproduction-first verification record on #520.
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- **`aqe arena` — competitive test-strategy tournaments (ADR-104, Phase 1).**
|
|
20
|
+
Strategies compete on *real* fitness: built-in operator mutants executed via
|
|
21
|
+
`node --test`, real line coverage, and a deterministic suite-cost term.
|
|
22
|
+
`aqe arena run --target fixtures/arena-demo --seed 42` produces a ranked
|
|
23
|
+
competitive array that reproduces byte-identically under the same seed;
|
|
24
|
+
`--evolve` hill-climbs the winner; runs persist to memory.db (`aqe arena list`).
|
|
25
|
+
- **Adversarially verified QCSD reviews (ADR-102).** The development-phase
|
|
26
|
+
swarm now runs as a deterministic workflow: one finder per quality dimension,
|
|
27
|
+
then 3 blind refuters per finding (majority kill, Loki-mode rules from
|
|
28
|
+
ADR-074), then code-only synthesis. Reports contain only confirmed findings;
|
|
29
|
+
killed findings are retained with their refutations. In the validation run,
|
|
30
|
+
the gate filtered a factually-wrong finding that the old prompt-driven
|
|
31
|
+
fan-out would have shipped.
|
|
32
|
+
- **Structured verdict contracts (ADR-103).** Versioned, additive envelopes —
|
|
33
|
+
`RiskDecision`, `FindingVerdict`, `CoverageGap` — with dependency-free
|
|
34
|
+
validators and published JSON Schemas (`schemas/*.schema.json`). The
|
|
35
|
+
`quality_assess` MCP tool now attaches a validated `riskDecision` envelope.
|
|
36
|
+
- **Tool-loop circuit breaker (ADR-100).** When the same Bash command fails
|
|
37
|
+
3× consecutively the pre-command hook warns; at 5× it emits a block
|
|
38
|
+
recommendation with a recovery hint (`AQE_STRICT_TOOL_LOOP=1` upgrades to a
|
|
39
|
+
hard deny). Success resets; an open breaker grants a probe after 2 minutes.
|
|
40
|
+
- **Nested-subagent readiness (ADR-101).** Anthropic announced depth-5 nested
|
|
41
|
+
subagents on 2026-06-09; AQE is ready the day the gate lifts: post-task
|
|
42
|
+
hooks accept `--parent-agent-id`/`--depth` (validated, persisted into
|
|
43
|
+
trajectory metadata for per-hierarchy-level learning), and a committed probe
|
|
44
|
+
script (`scripts/probe-nested-spawn-depth.mjs`) detects the upstream
|
|
45
|
+
rollout — current verdict: `NO_AGENT_TOOL`, denylist still active.
|
|
46
|
+
- **LLM judge benchmark harness** (`scripts/judge-benchmark.ts`) with Phase-1
|
|
47
|
+
results.
|
|
48
|
+
|
|
49
|
+
### Fixed
|
|
50
|
+
|
|
51
|
+
- **`aqe memory` / `agent` / `task` / `team` / `pipeline` CLI commands always
|
|
52
|
+
failed with "Fleet not initialized".** The CLI initialized a full kernel but
|
|
53
|
+
never registered it with the shared MCP handlers' fleet state. A new bridge
|
|
54
|
+
(`adoptExternalFleet`) gives both entry points one fleet state — these
|
|
55
|
+
commands now work from the terminal for the first time.
|
|
56
|
+
- **Prompt caching was dead code (ADR-088 amendment).** `enableCache: true`
|
|
57
|
+
existed but never set `cache_control`; every advisor/LLM call paid full
|
|
58
|
+
input price. The Anthropic provider now marks the system prompt as an
|
|
59
|
+
ephemeral cache breakpoint, surfaces `cacheRead/cacheCreation` tokens, and
|
|
60
|
+
bills them at the real 0.1×/1.25× rates in cost tracking.
|
|
61
|
+
- **Pattern embeddings were contaminated by extended-thinking blocks
|
|
62
|
+
(ADR-099).** Reasoning-heavy models (Fable 5 era) emit large scratchpads
|
|
63
|
+
inside task results; these are now scrubbed (boundary-gated) at trajectory
|
|
64
|
+
ingestion, distillation, embedding backfill, and query time — prose that
|
|
65
|
+
merely mentions a tag survives byte-identical.
|
|
66
|
+
- **Fresh-install learning silently no-oped.** `persistTaskOutcome` assumed
|
|
67
|
+
middleware-created tables (`captured_experiences`, `experience_applications`);
|
|
68
|
+
on a fresh `.agentic-qe` the whole post-task learning transaction failed
|
|
69
|
+
silently. The hook path now ensures the canonical schema.
|
|
70
|
+
|
|
71
|
+
### Changed
|
|
72
|
+
|
|
73
|
+
- Devcontainer now mounts `node_modules` as a named volume and installs
|
|
74
|
+
in-container, so Linux containers stop tripping over host (macOS) native
|
|
75
|
+
binaries (contributors only; takes effect on container rebuild).
|
|
76
|
+
- Setup docs and the devcontainer install script no longer pin the long-stale
|
|
77
|
+
`ruflo@3.5.18` (now `ruflo@3` + global `ruflo mcp start`).
|
|
78
|
+
|
|
79
|
+
## [3.10.4] - 2026-06-08
|
|
80
|
+
|
|
81
|
+
Two correctness fixes that keep a project's self-learning where it belongs and
|
|
82
|
+
stop orphaned MCP servers from burning CPU, plus opt-in support for running your
|
|
83
|
+
own local Nagual pattern hub and LLM judge.
|
|
84
|
+
|
|
85
|
+
### Added
|
|
86
|
+
|
|
87
|
+
- **Optional local Nagual pattern hub + local LLM judge (opt-in).** Point the
|
|
88
|
+
cross-project knowledge hub at a locally-run `nagual serve` instance via
|
|
89
|
+
`NAGUAL_URL`, and score pattern quality with a local Ollama-compatible model
|
|
90
|
+
via `NAGUAL_JUDGE_URL` / `NAGUAL_JUDGE_MODEL`. When configured, pre-task
|
|
91
|
+
analysis surfaces relevant cross-project patterns for complex tasks in QE
|
|
92
|
+
domains. Entirely best-effort and disabled unless the env vars are set — no
|
|
93
|
+
behavior change for existing users.
|
|
94
|
+
|
|
95
|
+
### Fixed
|
|
96
|
+
|
|
97
|
+
- **Project learning was being written outside its own `.agentic-qe/` (#516).**
|
|
98
|
+
Two root-resolution defects are fixed: (1) `findProjectRoot()` now prefers the
|
|
99
|
+
**nearest** `.agentic-qe` instead of the topmost, so an ancestor store (e.g.
|
|
100
|
+
`~/.agentic-qe`, created by any `aqe` run from `$HOME`) no longer hijacks every
|
|
101
|
+
descendant project and fragments its learning into `$HOME`; (2) the RVF
|
|
102
|
+
substrate (`patterns.rvf` / `brain.rvf`) now resolves its location through the
|
|
103
|
+
project root instead of a cwd-relative default, so running a hook, worker, or
|
|
104
|
+
`aqe` command from a subfolder no longer scatters stray, orphaned stores.
|
|
105
|
+
- **Orphaned `aqe-mcp` server busy-looped at high CPU and ignored SIGTERM (#513).**
|
|
106
|
+
When the parent Claude Code session exited, the stdio MCP server was reparented
|
|
107
|
+
and spun at 70–98% CPU indefinitely, surviving `kill` (only `kill -9` worked).
|
|
108
|
+
Stdin EOF is now treated as terminal — the server shuts down gracefully instead
|
|
109
|
+
of entering a reconnect busy-loop — backed by an idempotent shutdown path with a
|
|
110
|
+
watchdog timeout and `unref()`'d background timers so an orphan can never linger.
|
|
111
|
+
|
|
8
112
|
## [3.10.3] - 2026-06-03
|
|
9
113
|
|
|
10
114
|
Code-intelligence overhaul for the JS/TS ecosystem (#511) plus a critical fix for
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Competitive Test-Strategy Arena (ADR-104, Phase 1)
|
|
3
|
+
*
|
|
4
|
+
* Strategies are deterministic selections of fixture test groups; fitness
|
|
5
|
+
* comes from REAL runs: mutation kill rate (built-in operator mutants,
|
|
6
|
+
* `node --test` per mutant) + line coverage − a runtime penalty. The
|
|
7
|
+
* tournament produces Wolfram-style pairwise competitive arrays; optional
|
|
8
|
+
* hill-climb evolves the winner by seeded group flips with re-evaluation.
|
|
9
|
+
*
|
|
10
|
+
* Reproducibility contract: with the same seed and fixture, every field
|
|
11
|
+
* of the result envelope is identical across runs EXCEPT
|
|
12
|
+
* `informational.runtimesMs` (real wall-clock, reported but excluded —
|
|
13
|
+
* the fitness runtime term uses ordinal rank, which is stable because
|
|
14
|
+
* group runtimes differ by design).
|
|
15
|
+
*/
|
|
16
|
+
import { type Rng } from './rng.js';
|
|
17
|
+
export interface ArenaStrategy {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
groups: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface EvaluatedStrategy extends ArenaStrategy {
|
|
23
|
+
baselinePassed: boolean;
|
|
24
|
+
mutantsKilled: number;
|
|
25
|
+
mutantsTotal: number;
|
|
26
|
+
killRate: number;
|
|
27
|
+
coveragePct: number | null;
|
|
28
|
+
/** Deterministic runtime proxy: selected groups / total groups (0..1) */
|
|
29
|
+
suiteCostRatio: number;
|
|
30
|
+
fitness: number;
|
|
31
|
+
}
|
|
32
|
+
export interface ArenaResult {
|
|
33
|
+
contract: 'arena-result@1';
|
|
34
|
+
seed: number;
|
|
35
|
+
target: string;
|
|
36
|
+
weights: {
|
|
37
|
+
kill: number;
|
|
38
|
+
coverage: number;
|
|
39
|
+
runtimePenalty: number;
|
|
40
|
+
};
|
|
41
|
+
mutantsTotal: number;
|
|
42
|
+
strategies: EvaluatedStrategy[];
|
|
43
|
+
/** strategy ids best→worst */
|
|
44
|
+
ranking: string[];
|
|
45
|
+
/** competitiveArray[i][j]: 1 if strategies[i] beats [j], -1 if loses, 0 tie (by fitness) */
|
|
46
|
+
competitiveArray: number[][];
|
|
47
|
+
evolution: Array<{
|
|
48
|
+
step: number;
|
|
49
|
+
groups: string[];
|
|
50
|
+
fitness: number;
|
|
51
|
+
accepted: boolean;
|
|
52
|
+
}>;
|
|
53
|
+
informational: {
|
|
54
|
+
runtimesMs: Record<string, number>;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export interface ArenaOptions {
|
|
58
|
+
target: string;
|
|
59
|
+
strategies?: number;
|
|
60
|
+
seed?: number;
|
|
61
|
+
maxMutants?: number;
|
|
62
|
+
evolveSteps?: number;
|
|
63
|
+
log?: (line: string) => void;
|
|
64
|
+
}
|
|
65
|
+
/** First strategy is always the full suite; the rest are seeded distinct subsets. */
|
|
66
|
+
export declare function buildStrategies(groups: string[], n: number, rng: Rng): ArenaStrategy[];
|
|
67
|
+
export declare function runArena(options: ArenaOptions): ArenaResult;
|
|
68
|
+
//# sourceMappingURL=arena.d.ts.map
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Competitive Test-Strategy Arena (ADR-104, Phase 1)
|
|
3
|
+
*
|
|
4
|
+
* Strategies are deterministic selections of fixture test groups; fitness
|
|
5
|
+
* comes from REAL runs: mutation kill rate (built-in operator mutants,
|
|
6
|
+
* `node --test` per mutant) + line coverage − a runtime penalty. The
|
|
7
|
+
* tournament produces Wolfram-style pairwise competitive arrays; optional
|
|
8
|
+
* hill-climb evolves the winner by seeded group flips with re-evaluation.
|
|
9
|
+
*
|
|
10
|
+
* Reproducibility contract: with the same seed and fixture, every field
|
|
11
|
+
* of the result envelope is identical across runs EXCEPT
|
|
12
|
+
* `informational.runtimesMs` (real wall-clock, reported but excluded —
|
|
13
|
+
* the fitness runtime term uses ordinal rank, which is stable because
|
|
14
|
+
* group runtimes differ by design).
|
|
15
|
+
*/
|
|
16
|
+
import * as fs from 'fs';
|
|
17
|
+
import * as path from 'path';
|
|
18
|
+
import { mulberry32, nextInt } from './rng.js';
|
|
19
|
+
import { enumerateMutants, applyMutant } from './mutator.js';
|
|
20
|
+
import { discoverFixture, prepareWorkspace, runNodeTest, makeTmpRoot, cleanupTmpRoot, } from './runner.js';
|
|
21
|
+
const WEIGHTS = { kill: 0.6, coverage: 0.3, runtimePenalty: 0.1 };
|
|
22
|
+
/** First strategy is always the full suite; the rest are seeded distinct subsets. */
|
|
23
|
+
export function buildStrategies(groups, n, rng) {
|
|
24
|
+
const sorted = [...groups].sort();
|
|
25
|
+
const seen = new Set([sorted.join('+')]);
|
|
26
|
+
const strategies = [
|
|
27
|
+
{ id: 's1', name: `all(${sorted.join('+')})`, groups: sorted },
|
|
28
|
+
];
|
|
29
|
+
let guard = 0;
|
|
30
|
+
while (strategies.length < n && guard++ < 200) {
|
|
31
|
+
const subset = sorted.filter(() => rng() < 0.5);
|
|
32
|
+
if (subset.length === 0)
|
|
33
|
+
continue;
|
|
34
|
+
const key = subset.join('+');
|
|
35
|
+
if (seen.has(key))
|
|
36
|
+
continue;
|
|
37
|
+
seen.add(key);
|
|
38
|
+
strategies.push({ id: `s${strategies.length + 1}`, name: key, groups: subset });
|
|
39
|
+
}
|
|
40
|
+
return strategies;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Fitness with a DETERMINISTIC runtime term: at fixture scale, measured
|
|
44
|
+
* wall-clock is jitter-dominated (node boot ≈ the suite runtime), so the
|
|
45
|
+
* penalty uses suite-size ratio as the runtime proxy. Real per-strategy
|
|
46
|
+
* milliseconds are still reported under `informational`.
|
|
47
|
+
*/
|
|
48
|
+
function fitnessOf(killRate, coveragePct, suiteCostRatio) {
|
|
49
|
+
const coverageTerm = coveragePct === null ? 0 : coveragePct / 100;
|
|
50
|
+
const f = WEIGHTS.kill * killRate + WEIGHTS.coverage * coverageTerm - WEIGHTS.runtimePenalty * suiteCostRatio;
|
|
51
|
+
return Math.round(f * 10000) / 10000;
|
|
52
|
+
}
|
|
53
|
+
function evaluateStrategy(layout, strategy, mutantsByFile, tmpRoot) {
|
|
54
|
+
const baselineDir = prepareWorkspace({ layout, groups: strategy.groups }, tmpRoot);
|
|
55
|
+
const baseline = runNodeTest(baselineDir, { coverage: true });
|
|
56
|
+
if (!baseline.ok) {
|
|
57
|
+
return { baselinePassed: false, killed: 0, total: 0, coveragePct: baseline.coveragePct, runtimeMs: baseline.durationMs };
|
|
58
|
+
}
|
|
59
|
+
let killed = 0;
|
|
60
|
+
let total = 0;
|
|
61
|
+
for (const file of mutantsByFile) {
|
|
62
|
+
for (const mutant of file.mutants) {
|
|
63
|
+
total++;
|
|
64
|
+
const dir = prepareWorkspace({ layout, groups: strategy.groups, mutatedFile: { relPath: file.relPath, content: applyMutant(file.source, mutant) } }, tmpRoot);
|
|
65
|
+
const run = runNodeTest(dir);
|
|
66
|
+
if (!run.ok)
|
|
67
|
+
killed++;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return { baselinePassed: true, killed, total, coveragePct: baseline.coveragePct, runtimeMs: baseline.durationMs };
|
|
71
|
+
}
|
|
72
|
+
export function runArena(options) {
|
|
73
|
+
const seed = options.seed ?? 42;
|
|
74
|
+
const log = options.log ?? (() => { });
|
|
75
|
+
const rng = mulberry32(seed);
|
|
76
|
+
const layout = discoverFixture(options.target);
|
|
77
|
+
const tmpRoot = makeTmpRoot();
|
|
78
|
+
try {
|
|
79
|
+
// Enumerate + deterministically sample mutants
|
|
80
|
+
const maxMutants = options.maxMutants ?? 24;
|
|
81
|
+
const mutantsByFile = layout.sourceFiles.map((relPath) => {
|
|
82
|
+
const source = fs.readFileSync(path.join(layout.root, relPath), 'utf8');
|
|
83
|
+
return { relPath, source, mutants: enumerateMutants(source, relPath) };
|
|
84
|
+
});
|
|
85
|
+
let allMutants = mutantsByFile.flatMap((f) => f.mutants.map((m) => ({ file: f.relPath, m })));
|
|
86
|
+
if (allMutants.length > maxMutants) {
|
|
87
|
+
const picked = new Set();
|
|
88
|
+
while (picked.size < maxMutants) {
|
|
89
|
+
picked.add(allMutants[nextInt(rng, allMutants.length)].m.id);
|
|
90
|
+
}
|
|
91
|
+
for (const f of mutantsByFile) {
|
|
92
|
+
f.mutants = f.mutants.filter((m) => picked.has(m.id));
|
|
93
|
+
}
|
|
94
|
+
allMutants = mutantsByFile.flatMap((f) => f.mutants.map((m) => ({ file: f.relPath, m })));
|
|
95
|
+
}
|
|
96
|
+
log(`mutants: ${allMutants.length} (of ${mutantsByFile.reduce((n, f) => n + enumerateMutants(f.source, f.relPath).length, 0)} enumerated)`);
|
|
97
|
+
// Build + evaluate strategies (real runs)
|
|
98
|
+
const strategies = buildStrategies(Object.keys(layout.testGroups), options.strategies ?? 4, rng);
|
|
99
|
+
const runtimesMs = {};
|
|
100
|
+
const raw = strategies.map((s) => {
|
|
101
|
+
log(`evaluating ${s.id} [${s.name}] ...`);
|
|
102
|
+
const e = evaluateStrategy(layout, s, mutantsByFile, tmpRoot);
|
|
103
|
+
runtimesMs[s.id] = e.runtimeMs;
|
|
104
|
+
return { s, e };
|
|
105
|
+
});
|
|
106
|
+
const totalGroups = Object.keys(layout.testGroups).length;
|
|
107
|
+
const evaluated = raw.map(({ s, e }) => {
|
|
108
|
+
const killRate = e.total > 0 ? Math.round((e.killed / e.total) * 10000) / 10000 : 0;
|
|
109
|
+
const suiteCostRatio = Math.round((s.groups.length / totalGroups) * 10000) / 10000;
|
|
110
|
+
return {
|
|
111
|
+
...s,
|
|
112
|
+
baselinePassed: e.baselinePassed,
|
|
113
|
+
mutantsKilled: e.killed,
|
|
114
|
+
mutantsTotal: e.total,
|
|
115
|
+
killRate,
|
|
116
|
+
coveragePct: e.coveragePct,
|
|
117
|
+
suiteCostRatio,
|
|
118
|
+
fitness: e.baselinePassed ? fitnessOf(killRate, e.coveragePct, suiteCostRatio) : 0,
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
const ranking = [...evaluated]
|
|
122
|
+
.sort((a, b) => b.fitness - a.fitness || a.id.localeCompare(b.id))
|
|
123
|
+
.map((s) => s.id);
|
|
124
|
+
const competitiveArray = evaluated.map((a) => evaluated.map((b) => (a.fitness > b.fitness ? 1 : a.fitness < b.fitness ? -1 : 0)));
|
|
125
|
+
// Optional hill-climb from the winner: seeded single-group flips,
|
|
126
|
+
// accept only on real fitness improvement
|
|
127
|
+
const evolution = [];
|
|
128
|
+
if (options.evolveSteps && options.evolveSteps > 0) {
|
|
129
|
+
const allGroups = Object.keys(layout.testGroups).sort();
|
|
130
|
+
let bestGroups = evaluated.find((s) => s.id === ranking[0]).groups;
|
|
131
|
+
let bestFitness = evaluated.find((s) => s.id === ranking[0]).fitness;
|
|
132
|
+
for (let step = 1; step <= options.evolveSteps; step++) {
|
|
133
|
+
const flip = allGroups[nextInt(rng, allGroups.length)];
|
|
134
|
+
const candidate = bestGroups.includes(flip)
|
|
135
|
+
? bestGroups.filter((g) => g !== flip)
|
|
136
|
+
: [...bestGroups, flip].sort();
|
|
137
|
+
if (candidate.length === 0) {
|
|
138
|
+
evolution.push({ step, groups: candidate, fitness: 0, accepted: false });
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const e = evaluateStrategy(layout, { id: `evo${step}`, name: candidate.join('+'), groups: candidate }, mutantsByFile, tmpRoot);
|
|
142
|
+
const killRate = e.total > 0 ? e.killed / e.total : 0;
|
|
143
|
+
const f = e.baselinePassed ? fitnessOf(killRate, e.coveragePct, candidate.length / allGroups.length) : 0;
|
|
144
|
+
const accepted = f > bestFitness;
|
|
145
|
+
evolution.push({ step, groups: candidate, fitness: f, accepted });
|
|
146
|
+
if (accepted) {
|
|
147
|
+
bestGroups = candidate;
|
|
148
|
+
bestFitness = f;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
contract: 'arena-result@1',
|
|
154
|
+
seed,
|
|
155
|
+
target: path.relative(process.cwd(), layout.root) || '.',
|
|
156
|
+
weights: { ...WEIGHTS },
|
|
157
|
+
mutantsTotal: allMutants.length,
|
|
158
|
+
strategies: evaluated,
|
|
159
|
+
ranking,
|
|
160
|
+
competitiveArray,
|
|
161
|
+
evolution,
|
|
162
|
+
informational: { runtimesMs },
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
cleanupTmpRoot(tmpRoot);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=arena.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Operator Mutator for qe-arena (ADR-104)
|
|
3
|
+
*
|
|
4
|
+
* Generates first-order operator mutants from JavaScript source text:
|
|
5
|
+
* comparison flips, boundary shifts, arithmetic swaps, logical swaps.
|
|
6
|
+
* String literals, template literals, comments, and arrow tokens are
|
|
7
|
+
* excluded so mutants change behavior, not error messages. Enumeration
|
|
8
|
+
* order is deterministic (position-sorted), so seeded sampling over the
|
|
9
|
+
* mutant list is reproducible.
|
|
10
|
+
*/
|
|
11
|
+
export interface Mutant {
|
|
12
|
+
id: string;
|
|
13
|
+
/** Byte offset in the source file */
|
|
14
|
+
index: number;
|
|
15
|
+
from: string;
|
|
16
|
+
to: string;
|
|
17
|
+
line: number;
|
|
18
|
+
}
|
|
19
|
+
/** Enumerate all first-order mutants of a source text, position-sorted. */
|
|
20
|
+
export declare function enumerateMutants(source: string, fileLabel: string): Mutant[];
|
|
21
|
+
/** Apply one mutant to the source text. */
|
|
22
|
+
export declare function applyMutant(source: string, mutant: Mutant): string;
|
|
23
|
+
//# sourceMappingURL=mutator.d.ts.map
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Operator Mutator for qe-arena (ADR-104)
|
|
3
|
+
*
|
|
4
|
+
* Generates first-order operator mutants from JavaScript source text:
|
|
5
|
+
* comparison flips, boundary shifts, arithmetic swaps, logical swaps.
|
|
6
|
+
* String literals, template literals, comments, and arrow tokens are
|
|
7
|
+
* excluded so mutants change behavior, not error messages. Enumeration
|
|
8
|
+
* order is deterministic (position-sorted), so seeded sampling over the
|
|
9
|
+
* mutant list is reproducible.
|
|
10
|
+
*/
|
|
11
|
+
/** Longest-first so '<=' is claimed before '<', '===' before '==' etc. */
|
|
12
|
+
const OPERATOR_SUBSTITUTIONS = [
|
|
13
|
+
['===', '!=='],
|
|
14
|
+
['!==', '==='],
|
|
15
|
+
['<=', '<'],
|
|
16
|
+
['>=', '>'],
|
|
17
|
+
['&&', '||'],
|
|
18
|
+
['||', '&&'],
|
|
19
|
+
['<', '<='],
|
|
20
|
+
['>', '>='],
|
|
21
|
+
['+', '-'],
|
|
22
|
+
['*', '+'],
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Mark every index that sits inside a string literal, template literal,
|
|
26
|
+
* or comment — operators there must not be mutated.
|
|
27
|
+
*/
|
|
28
|
+
function excludedRanges(source) {
|
|
29
|
+
const excluded = new Array(source.length).fill(false);
|
|
30
|
+
let i = 0;
|
|
31
|
+
let mode = 'code';
|
|
32
|
+
while (i < source.length) {
|
|
33
|
+
const c = source[i];
|
|
34
|
+
const next = source[i + 1];
|
|
35
|
+
if (mode === 'code') {
|
|
36
|
+
if (c === "'")
|
|
37
|
+
mode = 'single';
|
|
38
|
+
else if (c === '"')
|
|
39
|
+
mode = 'double';
|
|
40
|
+
else if (c === '`')
|
|
41
|
+
mode = 'template';
|
|
42
|
+
else if (c === '/' && next === '/')
|
|
43
|
+
mode = 'line-comment';
|
|
44
|
+
else if (c === '/' && next === '*')
|
|
45
|
+
mode = 'block-comment';
|
|
46
|
+
if (mode !== 'code')
|
|
47
|
+
excluded[i] = true;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
excluded[i] = true;
|
|
51
|
+
if (mode === 'single' && c === "'" && source[i - 1] !== '\\')
|
|
52
|
+
mode = 'code';
|
|
53
|
+
else if (mode === 'double' && c === '"' && source[i - 1] !== '\\')
|
|
54
|
+
mode = 'code';
|
|
55
|
+
else if (mode === 'template' && c === '`' && source[i - 1] !== '\\')
|
|
56
|
+
mode = 'code';
|
|
57
|
+
else if (mode === 'line-comment' && c === '\n')
|
|
58
|
+
mode = 'code';
|
|
59
|
+
else if (mode === 'block-comment' && c === '*' && next === '/') {
|
|
60
|
+
excluded[i + 1] = true;
|
|
61
|
+
i++;
|
|
62
|
+
mode = 'code';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
i++;
|
|
66
|
+
}
|
|
67
|
+
return excluded;
|
|
68
|
+
}
|
|
69
|
+
function lineOf(source, index) {
|
|
70
|
+
let line = 1;
|
|
71
|
+
for (let i = 0; i < index; i++) {
|
|
72
|
+
if (source[i] === '\n')
|
|
73
|
+
line++;
|
|
74
|
+
}
|
|
75
|
+
return line;
|
|
76
|
+
}
|
|
77
|
+
/** Enumerate all first-order mutants of a source text, position-sorted. */
|
|
78
|
+
export function enumerateMutants(source, fileLabel) {
|
|
79
|
+
const excluded = excludedRanges(source);
|
|
80
|
+
const claimed = new Array(source.length).fill(false);
|
|
81
|
+
const mutants = [];
|
|
82
|
+
for (const [from, to] of OPERATOR_SUBSTITUTIONS) {
|
|
83
|
+
let pos = source.indexOf(from);
|
|
84
|
+
while (pos !== -1) {
|
|
85
|
+
const end = pos + from.length;
|
|
86
|
+
const overlapsClaim = claimed.slice(pos, end).some(Boolean);
|
|
87
|
+
const overlapsExcluded = excluded.slice(pos, end).some(Boolean);
|
|
88
|
+
// '=>' protection: never mutate the '>' of an arrow; '>=' handled by ordering
|
|
89
|
+
const isArrow = from === '>' && source[pos - 1] === '=';
|
|
90
|
+
// avoid '<=' / '>=' double-claim from the 1-char pass
|
|
91
|
+
const widerLeft = (from === '<' || from === '>') && (source[end] === '=' || source[pos - 1] === '<' || source[pos - 1] === '>');
|
|
92
|
+
if (!overlapsClaim && !overlapsExcluded && !isArrow && !widerLeft) {
|
|
93
|
+
for (let i = pos; i < end; i++)
|
|
94
|
+
claimed[i] = true;
|
|
95
|
+
mutants.push({
|
|
96
|
+
id: `${fileLabel}:${lineOf(source, pos)}:${pos}:${from}->${to}`,
|
|
97
|
+
index: pos,
|
|
98
|
+
from,
|
|
99
|
+
to,
|
|
100
|
+
line: lineOf(source, pos),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
pos = source.indexOf(from, pos + 1);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return mutants.sort((a, b) => a.index - b.index);
|
|
107
|
+
}
|
|
108
|
+
/** Apply one mutant to the source text. */
|
|
109
|
+
export function applyMutant(source, mutant) {
|
|
110
|
+
return source.slice(0, mutant.index) + mutant.to + source.slice(mutant.index + mutant.from.length);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=mutator.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Seeded RNG for qe-arena (ADR-104)
|
|
3
|
+
*
|
|
4
|
+
* mulberry32 — tiny deterministic PRNG. Everything the arena randomizes
|
|
5
|
+
* (strategy subset sampling, mutant sampling, hill-climb flips) draws from
|
|
6
|
+
* one seeded stream so identical seeds reproduce identical tournaments.
|
|
7
|
+
* No Math.random()/Date.now() anywhere in scoring paths.
|
|
8
|
+
*/
|
|
9
|
+
export type Rng = () => number;
|
|
10
|
+
export declare function mulberry32(seed: number): Rng;
|
|
11
|
+
/** Deterministic integer in [0, maxExclusive) */
|
|
12
|
+
export declare function nextInt(rng: Rng, maxExclusive: number): number;
|
|
13
|
+
/** Deterministic sample of k distinct items (order-stable Fisher-Yates prefix) */
|
|
14
|
+
export declare function sample<T>(rng: Rng, items: readonly T[], k: number): T[];
|
|
15
|
+
//# sourceMappingURL=rng.d.ts.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Seeded RNG for qe-arena (ADR-104)
|
|
3
|
+
*
|
|
4
|
+
* mulberry32 — tiny deterministic PRNG. Everything the arena randomizes
|
|
5
|
+
* (strategy subset sampling, mutant sampling, hill-climb flips) draws from
|
|
6
|
+
* one seeded stream so identical seeds reproduce identical tournaments.
|
|
7
|
+
* No Math.random()/Date.now() anywhere in scoring paths.
|
|
8
|
+
*/
|
|
9
|
+
export function mulberry32(seed) {
|
|
10
|
+
let a = seed >>> 0;
|
|
11
|
+
return function () {
|
|
12
|
+
a |= 0;
|
|
13
|
+
a = (a + 0x6d2b79f5) | 0;
|
|
14
|
+
let t = Math.imul(a ^ (a >>> 15), 1 | a);
|
|
15
|
+
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
|
|
16
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** Deterministic integer in [0, maxExclusive) */
|
|
20
|
+
export function nextInt(rng, maxExclusive) {
|
|
21
|
+
return Math.floor(rng() * maxExclusive);
|
|
22
|
+
}
|
|
23
|
+
/** Deterministic sample of k distinct items (order-stable Fisher-Yates prefix) */
|
|
24
|
+
export function sample(rng, items, k) {
|
|
25
|
+
const pool = [...items];
|
|
26
|
+
const out = [];
|
|
27
|
+
const n = Math.min(k, pool.length);
|
|
28
|
+
for (let i = 0; i < n; i++) {
|
|
29
|
+
const idx = nextInt(rng, pool.length);
|
|
30
|
+
out.push(pool.splice(idx, 1)[0]);
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=rng.js.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Fixture Runner for qe-arena (ADR-104)
|
|
3
|
+
*
|
|
4
|
+
* Materializes a strategy's workspace (fixture sources — optionally with
|
|
5
|
+
* one mutant applied — plus only the test groups the strategy selects)
|
|
6
|
+
* in a temp directory and runs it with `node --test`. Real test runs,
|
|
7
|
+
* real exit codes; nothing simulated.
|
|
8
|
+
*/
|
|
9
|
+
export interface FixtureLayout {
|
|
10
|
+
/** Absolute path of the fixture project */
|
|
11
|
+
root: string;
|
|
12
|
+
/** Source files, relative to root (mutation targets) */
|
|
13
|
+
sourceFiles: string[];
|
|
14
|
+
/** Test group name → test file relative path */
|
|
15
|
+
testGroups: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
export interface RunResult {
|
|
18
|
+
ok: boolean;
|
|
19
|
+
durationMs: number;
|
|
20
|
+
/** Line-coverage percent parsed from --experimental-test-coverage, when requested */
|
|
21
|
+
coveragePct: number | null;
|
|
22
|
+
}
|
|
23
|
+
/** Discover the conventional fixture layout: src/*.mjs + tests/<group>.test.mjs */
|
|
24
|
+
export declare function discoverFixture(root: string): FixtureLayout;
|
|
25
|
+
export interface WorkspaceSpec {
|
|
26
|
+
layout: FixtureLayout;
|
|
27
|
+
groups: string[];
|
|
28
|
+
/** When set, this source file's content replaces the original */
|
|
29
|
+
mutatedFile?: {
|
|
30
|
+
relPath: string;
|
|
31
|
+
content: string;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** Build a throwaway workspace for one (strategy, mutant?) evaluation. */
|
|
35
|
+
export declare function prepareWorkspace(spec: WorkspaceSpec, tmpRoot: string): string;
|
|
36
|
+
/** Run `node --test` on the workspace's test files (explicit paths — a bare
|
|
37
|
+
* directory argument is not portably supported by the node test runner). */
|
|
38
|
+
export declare function runNodeTest(dir: string, options?: {
|
|
39
|
+
coverage?: boolean;
|
|
40
|
+
timeoutMs?: number;
|
|
41
|
+
}): RunResult;
|
|
42
|
+
export declare function makeTmpRoot(): string;
|
|
43
|
+
export declare function cleanupTmpRoot(tmpRoot: string): void;
|
|
44
|
+
//# sourceMappingURL=runner.d.ts.map
|