agentic-qe 3.11.2 → 3.11.4
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/.validation/templates/eval.template.yaml +36 -0
- package/.claude/skills/qe-quality-assessment/SKILL.md +25 -0
- package/.claude/skills/qe-test-generation/SKILL.md +58 -20
- package/.claude/skills/qe-test-generation/evals/qe-test-generation.yaml +37 -0
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +84 -0
- package/assets/skills/.validation/templates/eval.template.yaml +36 -0
- package/assets/skills/enterprise-integration-testing/SKILL.md +1 -1
- package/assets/skills/pentest-validation/SKILL.md +1 -1
- package/assets/skills/qcsd-development-swarm/SKILL.md +27 -6
- package/assets/skills/qe-quality-assessment/SKILL.md +25 -0
- package/assets/skills/qe-test-generation/SKILL.md +58 -20
- package/assets/skills/qe-test-generation/evals/qe-test-generation.yaml +37 -0
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-2HMUXHWY.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-FNCVODUJ.js → agent-booster-wasm-62I6ZNRW.js} +2 -2
- package/dist/cli/chunks/{agent-handler-JK7VK37B.js → agent-handler-E2TZKKBS.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-EPVVJNNA.js → agent-memory-branch-JHAHC2NH.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-M2NKRVRE.js +2 -0
- package/dist/cli/chunks/{arena-EH2IMSRW.js → arena-72ZV65BR.js} +4 -4
- package/dist/cli/chunks/{arena-NTHVDZTJ.js → arena-KLG3YSSR.js} +2 -2
- package/dist/cli/chunks/{audit-ODZV2T2B.js → audit-EPB7ETMT.js} +2 -2
- package/dist/cli/chunks/base-CCHC2DAC.js +2 -0
- package/dist/cli/chunks/{hnswlib-node-2KL54YUA.js → better-sqlite3-URULPKRF.js} +2 -2
- package/dist/cli/chunks/{brain-handler-NVB6OJ25.js → brain-handler-FBMYEERK.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-BIXSELMY.js → branch-enumerator-C7MPNYT7.js} +2 -2
- package/dist/cli/chunks/{browser-S2Y2W33Z.js → browser-UUDUDYLR.js} +2 -2
- package/dist/cli/chunks/browser-workflow-4DGHFYY3.js +2 -0
- package/dist/cli/chunks/{chunk-XXCSJMSR.js → chunk-2KNFS3L5.js} +1 -1
- package/dist/cli/chunks/{chunk-I7UWFV6N.js → chunk-2WPSMQIL.js} +1 -1
- package/dist/cli/chunks/chunk-37ZDGJ3H.js +2 -0
- package/dist/cli/chunks/{chunk-JELN5XTK.js → chunk-3E7D3A35.js} +1 -1
- package/dist/cli/chunks/{chunk-ZBJMVWQR.js → chunk-3FJZMQJ7.js} +2 -2
- package/dist/cli/chunks/chunk-3SBUL72V.js +2 -0
- package/dist/cli/chunks/{chunk-O3IIAIXB.js → chunk-3SKIZDKL.js} +1 -1
- package/dist/cli/chunks/{chunk-LAY35POY.js → chunk-3SRPFBU7.js} +3 -3
- package/dist/cli/chunks/{chunk-6VAFRS5N.js → chunk-4BFCLSDN.js} +2 -2
- package/dist/cli/chunks/{chunk-NZNXEEZR.js → chunk-4JFH3MVA.js} +1 -1
- package/dist/cli/chunks/{chunk-C6UTRG66.js → chunk-4RHNPRAP.js} +2 -2
- package/dist/cli/chunks/{chunk-3NCVUFAL.js → chunk-4YT5YN5G.js} +2 -2
- package/dist/cli/chunks/{chunk-P3VRXQ3H.js → chunk-54B6P2WS.js} +3 -3
- package/dist/cli/chunks/{chunk-H5TM4KIB.js → chunk-5AQ7FXYG.js} +2 -2
- package/dist/cli/chunks/{chunk-WARFZ626.js → chunk-5P7Q5YNC.js} +1 -1
- package/dist/cli/chunks/{chunk-ARUXFZDY.js → chunk-5U2WHPXL.js} +1 -1
- package/dist/cli/chunks/{chunk-MAXOIEUG.js → chunk-5VSQAGA2.js} +1 -1
- package/dist/cli/chunks/{chunk-CEMROADY.js → chunk-5Z4FBCBK.js} +1 -1
- package/dist/cli/chunks/{chunk-I3AD523O.js → chunk-63QUN3JK.js} +1 -1
- package/dist/cli/chunks/{chunk-4FTVTAMN.js → chunk-6545AS2J.js} +2 -2
- package/dist/cli/chunks/{chunk-5BDVFFYF.js → chunk-6GYGAW53.js} +2 -2
- package/dist/cli/chunks/{chunk-OC2W7KIW.js → chunk-6JUOH6L4.js} +2 -2
- package/dist/cli/chunks/{chunk-YDPBCN7H.js → chunk-6W3QHS45.js} +2 -2
- package/dist/cli/chunks/{chunk-WKIYYF3G.js → chunk-7ADD2ZQL.js} +2 -2
- package/dist/cli/chunks/{chunk-7MKF52GT.js → chunk-7AWK43JN.js} +2 -2
- package/dist/cli/chunks/{chunk-FV53RMVB.js → chunk-7IKWF2AD.js} +1 -1
- package/dist/cli/chunks/{chunk-UCXW24HY.js → chunk-7QTB5XIQ.js} +2 -2
- package/dist/cli/chunks/{chunk-HDBJORV7.js → chunk-A4OMK3FO.js} +2 -2
- package/dist/cli/chunks/{chunk-DMUQV2YU.js → chunk-ADFKY3X2.js} +2 -2
- package/dist/cli/chunks/{chunk-SE4S23C7.js → chunk-AE6HXMOG.js} +1 -1
- package/dist/cli/chunks/{chunk-ZH6HYT7C.js → chunk-AJXGGTX7.js} +1 -1
- package/dist/cli/chunks/{chunk-CMVNYVKL.js → chunk-AQIEK4SY.js} +2 -2
- package/dist/cli/chunks/{chunk-H4ZPPHOI.js → chunk-ARPBG6FQ.js} +2 -2
- package/dist/cli/chunks/{chunk-X36TZXDK.js → chunk-AYGEWPN4.js} +1 -1
- package/dist/cli/chunks/{chunk-JSZNI3AO.js → chunk-B5XUWHKQ.js} +1 -1
- package/dist/cli/chunks/{chunk-76RO2RHG.js → chunk-BMQDELPA.js} +1 -1
- package/dist/cli/chunks/{chunk-26ZMIYSK.js → chunk-BRLUNIR4.js} +2 -2
- package/dist/cli/chunks/{chunk-H6MBRYA7.js → chunk-CNF3ZWLM.js} +2 -2
- package/dist/cli/chunks/{chunk-XRDPGJNW.js → chunk-D5S47YUS.js} +2 -2
- package/dist/cli/chunks/{chunk-S6BWEZKK.js → chunk-D6CKKNYC.js} +2 -2
- package/dist/cli/chunks/{chunk-K6IQBVD7.js → chunk-DNOU2HVQ.js} +2 -2
- package/dist/cli/chunks/{chunk-DPFLJMEI.js → chunk-DRMHVY4T.js} +4 -4
- package/dist/cli/chunks/{chunk-3ATEYGVD.js → chunk-EONKMHKO.js} +2 -2
- package/dist/cli/chunks/{chunk-6LQIVIZB.js → chunk-EZRHSHOQ.js} +2 -2
- package/dist/cli/chunks/{chunk-WEBHFIWS.js → chunk-FRFVN6AA.js} +2 -2
- package/dist/cli/chunks/{chunk-YJUJCLXV.js → chunk-FSGMRQFC.js} +2 -2
- package/dist/cli/chunks/{chunk-OFUF3APC.js → chunk-G3TFNY4T.js} +2 -2
- package/dist/cli/chunks/{chunk-PPD5ZLNA.js → chunk-GOQ4P2PB.js} +2 -2
- package/dist/cli/chunks/chunk-GRQ36XUH.js +24 -0
- package/dist/cli/chunks/{chunk-LI3T5YNC.js → chunk-HH6NCBSP.js} +3 -3
- package/dist/cli/chunks/{chunk-NPT7BYGF.js → chunk-HJ24KMC2.js} +1 -1
- package/dist/cli/chunks/{chunk-AK5Q2WCJ.js → chunk-HJO4RNOW.js} +2 -2
- package/dist/cli/chunks/{chunk-VNFL2TPU.js → chunk-HT6WAYIR.js} +1 -1
- package/dist/cli/chunks/{chunk-IO7ZUP2G.js → chunk-HWBMYR5W.js} +3 -3
- package/dist/cli/chunks/{chunk-AKZK46TQ.js → chunk-IB3ZPLFA.js} +2 -2
- package/dist/cli/chunks/{chunk-EDH4H55B.js → chunk-ICCTQ5LO.js} +2 -2
- package/dist/cli/chunks/{chunk-P7MIOTVP.js → chunk-IF3HPQNV.js} +1 -1
- package/dist/cli/chunks/{chunk-DU4GQKTH.js → chunk-IQBZBUP5.js} +2 -2
- package/dist/cli/chunks/{chunk-LFXXA325.js → chunk-JCTCM6IR.js} +1 -1
- package/dist/cli/chunks/{chunk-K426HTEQ.js → chunk-JDFPAJGB.js} +10 -10
- package/dist/cli/chunks/{chunk-CAVBEZV4.js → chunk-JFLSQH2X.js} +2 -2
- package/dist/cli/chunks/{chunk-P5SGBQLY.js → chunk-JNQN5DNS.js} +1 -1
- package/dist/cli/chunks/{chunk-A4ZDKF5F.js → chunk-JPENUVCI.js} +1 -1
- package/dist/cli/chunks/{chunk-5AFO7ZZG.js → chunk-KUZMVH6N.js} +3 -3
- package/dist/cli/chunks/{chunk-KFE6LB4I.js → chunk-KYTFIP6R.js} +2 -2
- package/dist/cli/chunks/{chunk-OU52V67H.js → chunk-LKURMUBU.js} +4 -4
- package/dist/cli/chunks/{chunk-JCH2FHJ7.js → chunk-LLUPRGOR.js} +2 -2
- package/dist/cli/chunks/{chunk-5KMGG3QW.js → chunk-LMJUMUQJ.js} +4 -4
- package/dist/cli/chunks/{chunk-Y4M2HMPR.js → chunk-LW5DHT3Z.js} +2 -2
- package/dist/cli/chunks/{chunk-JC4Z2ADP.js → chunk-MALOUGSF.js} +2 -2
- package/dist/cli/chunks/{chunk-7VM4ZUHT.js → chunk-MCT4CD5M.js} +2 -2
- package/dist/cli/chunks/{chunk-FPZLOVEF.js → chunk-MWFJC5HR.js} +1 -1
- package/dist/cli/chunks/{chunk-7KHZZVF2.js → chunk-MYMIEQSZ.js} +4 -4
- package/dist/cli/chunks/{chunk-EIWZDVMT.js → chunk-N2BJN6AO.js} +3 -3
- package/dist/cli/chunks/{chunk-3J3QXLWP.js → chunk-NBBLPDJX.js} +2 -2
- package/dist/cli/chunks/{chunk-PFDILSVO.js → chunk-NFJT7XXR.js} +1 -1
- package/dist/cli/chunks/{chunk-IXYF5BZY.js → chunk-NSPCZPTB.js} +2 -2
- package/dist/cli/chunks/{chunk-YWG4LHFU.js → chunk-NV3TXXOW.js} +2 -2
- package/dist/cli/chunks/{chunk-ZU3V4CJ4.js → chunk-O5NEJIHB.js} +2 -2
- package/dist/cli/chunks/{chunk-QZLTIGLB.js → chunk-O7PVZ32A.js} +1 -1
- package/dist/cli/chunks/{chunk-42DCMEUM.js → chunk-ODZSQVEW.js} +1 -1
- package/dist/cli/chunks/{chunk-G6LIQFT2.js → chunk-P6S6ZVB5.js} +1 -1
- package/dist/cli/chunks/{chunk-FYY7OJ6Y.js → chunk-PEIQDQXN.js} +2 -2
- package/dist/cli/chunks/{chunk-WZC4HKGZ.js → chunk-PFWJQPUC.js} +2 -2
- package/dist/cli/chunks/{chunk-6SOGYNJG.js → chunk-PQUXFSN6.js} +2 -2
- package/dist/cli/chunks/{chunk-P2RR4SW5.js → chunk-Q7ORVHJB.js} +3 -3
- package/dist/cli/chunks/{chunk-2Q65LTJN.js → chunk-QEVX4GWF.js} +2 -2
- package/dist/cli/chunks/{chunk-AINAWVGD.js → chunk-QJ5NCYJ3.js} +2 -2
- package/dist/cli/chunks/{chunk-75C5GX7D.js → chunk-QMC5MTBV.js} +2 -2
- package/dist/cli/chunks/{chunk-H3LGBH4Y.js → chunk-QSDIY3E2.js} +1 -1
- package/dist/cli/chunks/chunk-RCPD6F4R.js +2 -0
- package/dist/cli/chunks/{chunk-XNREA3FG.js → chunk-RFQBDMAP.js} +1 -1
- package/dist/cli/chunks/{chunk-KO3WB4SU.js → chunk-SFDUT5WM.js} +2 -2
- package/dist/cli/chunks/{chunk-YGR54EAA.js → chunk-SL3SNOO2.js} +2 -2
- package/dist/cli/chunks/{chunk-QFJDR4HC.js → chunk-SRVTNG6L.js} +2 -2
- package/dist/cli/chunks/{chunk-TOGZ37RL.js → chunk-T76RFXQX.js} +2 -2
- package/dist/cli/chunks/{chunk-AAVUZVM6.js → chunk-TCVEKRPI.js} +2 -2
- package/dist/cli/chunks/{chunk-AZQ6HDPM.js → chunk-TCWR6TDN.js} +2 -2
- package/dist/cli/chunks/{chunk-ZP2GE6DM.js → chunk-THKZVOZV.js} +1 -1
- package/dist/cli/chunks/{chunk-4PYJCIRO.js → chunk-TPMBFARK.js} +31 -26
- package/dist/cli/chunks/{chunk-NIW4CLN2.js → chunk-TQ373GGI.js} +2 -2
- package/dist/cli/chunks/{chunk-CUDGKSFX.js → chunk-TSWF3AGQ.js} +2 -2
- package/dist/cli/chunks/{chunk-MN6W7ZNL.js → chunk-TU6YN43Q.js} +1 -1
- package/dist/cli/chunks/{chunk-CAUTOCLZ.js → chunk-U34OZXD6.js} +2 -2
- package/dist/cli/chunks/{chunk-AYXRT2ND.js → chunk-U3AVZGQA.js} +1 -1
- package/dist/cli/chunks/{chunk-NGE5YNKC.js → chunk-UCYTY4LG.js} +2 -2
- package/dist/cli/chunks/{chunk-LRJWKFGY.js → chunk-UJMTKXPI.js} +2 -2
- package/dist/cli/chunks/{chunk-BGVEBYV4.js → chunk-UQ72K44T.js} +2 -2
- package/dist/cli/chunks/{chunk-XY2B2BEJ.js → chunk-VCUCD3B5.js} +2 -2
- package/dist/cli/chunks/{chunk-LY6PTRVL.js → chunk-VJGHRWMH.js} +2 -2
- package/dist/cli/chunks/{chunk-ZRU3OZEU.js → chunk-VKJQAKYG.js} +2 -2
- package/dist/cli/chunks/{chunk-XY4JS3IZ.js → chunk-VO6YJGB4.js} +2 -2
- package/dist/cli/chunks/{chunk-RHSUXQNF.js → chunk-VQU7DMEY.js} +2 -2
- package/dist/cli/chunks/{chunk-27KNLVOY.js → chunk-WMIRAD3J.js} +2 -2
- package/dist/cli/chunks/{chunk-3KTOM7NN.js → chunk-WNMDWP5A.js} +2 -2
- package/dist/cli/chunks/{chunk-G4CQBQBV.js → chunk-WQZ2WRO4.js} +1 -1
- package/dist/cli/chunks/{chunk-UQBGA4UA.js → chunk-WZYNY3VF.js} +1 -1
- package/dist/cli/chunks/{chunk-KEJEZY2R.js → chunk-X64BEXUY.js} +173 -173
- package/dist/cli/chunks/{chunk-7XIQR6VU.js → chunk-XHRLBJTM.js} +2 -2
- package/dist/cli/chunks/{chunk-UQ6WB4N2.js → chunk-XQ6DW5FV.js} +2 -2
- package/dist/cli/chunks/chunk-XXRTWG7O.js +2 -0
- package/dist/cli/chunks/{chunk-LIEA5EON.js → chunk-Y4AXOHW4.js} +1 -1
- package/dist/cli/chunks/{chunk-ZWMXF6AX.js → chunk-YKSWC7I4.js} +2 -2
- package/dist/cli/chunks/{chunk-IMPSB5WW.js → chunk-YNK6SUPU.js} +2 -2
- package/dist/cli/chunks/{chunk-Z2QNTRUX.js → chunk-YUHM72VQ.js} +2 -2
- package/dist/cli/chunks/{chunk-QZ2GQGJX.js → chunk-YZ5EQR37.js} +2 -2
- package/dist/cli/chunks/{chunk-YGRY2TVI.js → chunk-Z2REKBD6.js} +2 -2
- package/dist/cli/chunks/{chunk-ZQYEBLTL.js → chunk-ZFCVT43J.js} +2 -2
- package/dist/cli/chunks/{chunk-XN4G3SRU.js → chunk-ZKCKOQJI.js} +2 -2
- package/dist/cli/chunks/{chunk-CZYSCUJ4.js → chunk-ZSA6V5FH.js} +2 -2
- package/dist/cli/chunks/{chunk-IQOCTGA2.js → chunk-ZSBJNE35.js} +2 -2
- package/dist/cli/chunks/{chunk-JDFF2QMZ.js → chunk-ZYZT2CDX.js} +1 -1
- package/dist/cli/chunks/{ci-SM3EVLZ4.js → ci-HQCRSCC7.js} +2 -2
- package/dist/cli/chunks/{ci-output-YYXICZBC.js → ci-output-YBVXLA6O.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-CV5UGKXT.js → circuit-breaker-ULGMF2QN.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-BSBUZ4B7.js → claude-flow-setup-MKZ2LJXK.js} +2 -2
- package/dist/cli/chunks/client-2OVEDWGU.js +2 -0
- package/dist/cli/chunks/{cline-installer-P2O6STIC.js → cline-installer-WZQ6XBWN.js} +2 -2
- package/dist/cli/chunks/{code-M7DDLBGS.js → code-H3KGH45S.js} +2 -2
- package/dist/cli/chunks/{code-index-extractor-3QZIUYOG.js → code-index-extractor-NUVEAJ7C.js} +2 -2
- package/dist/cli/chunks/{codex-installer-5JVZCCTC.js → codex-installer-JQI6E6CV.js} +2 -2
- package/dist/cli/chunks/{completions-EM7IL2BJ.js → completions-NDF4PFE7.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-VJXVB2CV.js → complexity-analyzer-XCZH66HG.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-RCKJIAEC.js → continuedev-installer-Z4AJGZ7S.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-DZ7LTDOZ.js → copilot-installer-K4IPAL7C.js} +2 -2
- package/dist/cli/chunks/core-handlers-UXRRYP52.js +2 -0
- package/dist/cli/chunks/{cost-tracker-QLOLXVAM.js → cost-tracker-35KXAB23.js} +2 -2
- package/dist/cli/chunks/{coverage-LYHTLWRV.js → coverage-QW5I4TYZ.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-PV3VQVLO.js +2 -0
- package/dist/cli/chunks/{cursor-installer-PSIZ3Y53.js → cursor-installer-P4Z7RMIZ.js} +2 -2
- package/dist/cli/chunks/{daemon-IYDTMA5M.js → daemon-ESUEM6VB.js} +4 -4
- package/dist/cli/chunks/{daemon-YLOAXM4X.js → daemon-WQWTCYBM.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-I2UIO3Z7.js → dag-attention-scheduler-7XD2VGON.js} +2 -2
- package/dist/cli/chunks/{detect-ZXQ7X7GZ.js → detect-GZ3P4DI7.js} +2 -2
- package/dist/cli/chunks/{dist-node-GK6OZX4H.js → dist-node-6WWAW7OP.js} +2 -2
- package/dist/cli/chunks/{domain-handler-NS3IBLRQ.js → domain-handler-3GTLWARQ.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-5G4RZEWF.js → domain-transfer-TQYO3SVG.js} +2 -2
- package/dist/cli/chunks/dream-UFUXVJQC.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-V4JJUFR6.js → embed-and-insert-pattern-BGIMA77V.js} +2 -2
- package/dist/cli/chunks/{eval-7Q6PPYKR.js → eval-SXV6DRDD.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-DUBKSYFM.js → experience-capture-middleware-TT6WCT2S.js} +3 -3
- package/dist/cli/chunks/{fast-paths-IDPPMBUW.js → fast-paths-HTAZHEQP.js} +2 -2
- package/dist/cli/chunks/{feature-flags-EPTMAAKA.js → feature-flags-DIE3Z2B4.js} +2 -2
- package/dist/cli/chunks/{feature-flags-KXI6FDY7.js → feature-flags-WBUKU54W.js} +2 -2
- package/dist/cli/chunks/{file-discovery-EDX2OJO7.js → file-discovery-SKDETFS3.js} +2 -2
- package/dist/cli/chunks/{fleet-67BO3LJ4.js → fleet-WCWEPAVU.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-YARORYT7.js → gnn-wrapper-KWZOWBYS.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-K3JGPBYR.js → heartbeat-handler-3AGYHVG2.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-MBG3SARO.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-5HXA3QB3.js +2 -0
- package/dist/cli/chunks/hnsw-index-PZRQWBRG.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-CDDRSV5E.js → hnsw-legacy-bridge-6OJJDZHL.js} +2 -2
- package/dist/cli/chunks/{better-sqlite3-5JTP47LA.js → hnswlib-node-LAFK5QZ4.js} +2 -2
- package/dist/cli/chunks/{hooks-6SCAE6LC.js → hooks-OXEBTLXV.js} +10 -10
- package/dist/cli/chunks/hybrid-router-NQRIE2GG.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-I3LUMO7I.js → hypergraph-engine-NL74PRHD.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-YAKAIVCN.js → hypergraph-handler-KZ54AEEL.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-46347ZDV.js +2 -0
- package/dist/cli/chunks/{init-handler-NBKCZD7Q.js → init-handler-XKZXRXPG.js} +6 -6
- package/dist/cli/chunks/init-wizard-CJYP4WKO.js +2 -0
- package/dist/cli/chunks/kernel-22KQZ56U.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-YGPJCPU3.js → kilocode-installer-WISQMJK7.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-JV3ONVMN.js → kiro-installer-O7TBB3GM.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-KM3JDBGR.js +2 -0
- package/dist/cli/chunks/{learning-2FEZJ5CX.js → learning-6IZBGVRU.js} +3 -3
- package/dist/cli/chunks/{llm-router-SILI4KLU.js → llm-router-QDMQPPQ7.js} +4 -4
- package/dist/cli/chunks/llm-router-service-IFO6GRRO.js +2 -0
- package/dist/cli/chunks/{load-EGXLQVR3.js → load-KLAJJGL5.js} +2 -2
- package/dist/cli/chunks/load-test-TTKCYAPB.js +2 -0
- package/dist/cli/chunks/{mcp-OJH775TL.js → mcp-SZOPQZIZ.js} +2 -2
- package/dist/cli/chunks/{memory-FNEOK4FW.js → memory-G3WY74C6.js} +5 -5
- package/dist/cli/chunks/memory-backend-ELHCX2ZT.js +2 -0
- package/dist/cli/chunks/memory-handlers-3SKYQZTL.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-ORTFWLLE.js → multi-model-executor-TDNQGTOT.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-UAQLW6XX.js → opencode-installer-NGYGEDMV.js} +2 -2
- package/dist/cli/chunks/{orchestrator-VE5KJ2V4.js → orchestrator-KPI5DY2C.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-TMXAYD43.js +2 -0
- package/dist/cli/chunks/{pipeline-FNMDRWTU.js → pipeline-CSDCC675.js} +2 -2
- package/dist/cli/chunks/{platform-MGAKRUQN.js → platform-Q5XKEVKH.js} +2 -2
- package/dist/cli/chunks/{plugin-YX7THX3I.js → plugin-XKKR3GVL.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-XJV4RLMK.js → prime-radiant-advanced-wasm-22QVNKEN.js} +2 -2
- package/dist/cli/chunks/protocol-executor-BPLR5EJC.js +2 -0
- package/dist/cli/chunks/{protocol-handler-QFET442Y.js → protocol-handler-REQKTJGG.js} +2 -2
- package/dist/cli/chunks/{prove-QBAESCOC.js → prove-NOFUFSQN.js} +2 -2
- package/dist/cli/chunks/provider-manager-4MMD5QKL.js +2 -0
- package/dist/cli/chunks/qe-reasoning-bank-P7KNT3WZ.js +2 -0
- package/dist/cli/chunks/{quality-ZTNRL6EG.js → quality-3DQ2H5TK.js} +2 -2
- package/dist/cli/chunks/queen-coordinator-NBZZ4MGC.js +2 -0
- package/dist/cli/chunks/{real-embeddings-ZFFDV6HC.js → real-embeddings-FCGNYWLL.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-J4LFL4AE.js → roocode-installer-HX3CNRIR.js} +2 -2
- package/dist/cli/chunks/router-2RXR6J2Q.js +2 -0
- package/dist/cli/chunks/routing-feedback-AVAA76TK.js +2 -0
- package/dist/cli/chunks/{routing-handler-A5QG2TP2.js → routing-handler-YRZ2LDCR.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-J5JL5WX5.js → ruvector-commands-GCQVBJ4E.js} +2 -2
- package/dist/cli/chunks/{rvf-dual-writer-H7442GMO.js → rvf-dual-writer-B562P3ZC.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-adapter-PTFQUYKC.js → rvf-migration-adapter-NAGFKCMD.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-coordinator-RSNROYRX.js → rvf-migration-coordinator-WWFBEJ5Q.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-X2YDJA55.js +2 -0
- package/dist/cli/chunks/safe-db-4PRU65BK.js +2 -0
- package/dist/cli/chunks/schedule-2AST5CHW.js +2 -0
- package/dist/cli/chunks/scheduler-SW6II7OU.js +2 -0
- package/dist/cli/chunks/{security-LHHLMCBA.js → security-IFOYTD75.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-NPSHVUTM.js → shared-rvf-adapter-TYD5TQ35.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-INQDY5WE.js → shared-rvf-dual-writer-YGOOVDQZ.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-OB5NEGAK.js +2 -0
- package/dist/cli/chunks/{status-handler-R2KIAMAE.js → status-handler-HFPWSCBY.js} +2 -2
- package/dist/cli/chunks/{structural-health-2VPPIOZX.js → structural-health-KZI6YMKV.js} +2 -2
- package/dist/cli/chunks/{sync-NLASP7AK.js → sync-ABZNNYRC.js} +2 -2
- package/dist/cli/chunks/{sync-ASZ3T5GT.js → sync-Z5BDDBMK.js} +2 -2
- package/dist/cli/chunks/{task-handler-UV5R6LJG.js → task-handler-5ACZEPJ7.js} +2 -2
- package/dist/cli/chunks/{task-handlers-I6YJXPYP.js → task-handlers-UZWDPL6A.js} +3 -3
- package/dist/cli/chunks/{test-TE43TNTI.js → test-APO3MCVV.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-WWWWF2TZ.js → test-scheduling-EFZA5G5C.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-HEWP7KKS.js → token-bootstrap-J2OPLNUK.js} +2 -2
- package/dist/cli/chunks/{token-usage-3FVHUAW6.js → token-usage-VHWVNN4R.js} +2 -2
- package/dist/cli/chunks/{transformers-O5OFM4XM.js → transformers-PX4HPO75.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-YOYWFW63.js → tree-sitter-wasm-parser-44HA2Z3F.js} +2 -2
- package/dist/cli/chunks/{types-42GR6PLO.js → types-IMOP7F4R.js} +2 -2
- package/dist/cli/chunks/unified-memory-X7OJYGSD.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-O6HOD5YL.js +2 -0
- package/dist/cli/chunks/unified-persistence-C332CER2.js +2 -0
- package/dist/cli/chunks/{upgrade-BU6DJ4LT.js → upgrade-OZ3O6ZZI.js} +2 -2
- package/dist/cli/chunks/{validate-MPTBARGN.js → validate-DRY5BMWX.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-5LUQYHPP.js → validate-swarm-QD3LYPUF.js} +2 -2
- package/dist/cli/chunks/{vibium-MJJDANDL.js → vibium-2J3H2ITD.js} +2 -2
- package/dist/cli/chunks/visual-security-MPUG5HPI.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-5TF4UGB3.js → web-tree-sitter-KRNUOGKI.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-NQAOSVCN.js → windsurf-installer-PQIPH3WP.js} +2 -2
- package/dist/cli/chunks/{witness-chain-23UWK2JT.js → witness-chain-HPLOYPS7.js} +2 -2
- package/dist/cli/chunks/witness-chain-Q4BZHPDF.js +2 -0
- package/dist/cli/chunks/{workflow-3QOLXRJC.js → workflow-OAQ3FWCY.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-4NDWECYK.js +2 -0
- package/dist/cli/chunks/{wrappers-S6EUZBCX.js → wrappers-UPIU6S5S.js} +2 -2
- package/dist/coordination/consensus/providers/ollama-provider.js +3 -2
- package/dist/feedback/regenerability-gate.d.ts +70 -0
- package/dist/feedback/regenerability-gate.js +91 -0
- package/dist/integrations/ruvector/proof-gate.d.ts +68 -0
- package/dist/integrations/ruvector/proof-gate.js +135 -0
- package/dist/kernel/unified-memory.d.ts +35 -0
- package/dist/kernel/unified-memory.js +105 -0
- package/dist/learning/local-judge-client.js +2 -1
- package/dist/mcp/bundle.js +383 -378
- package/dist/routing/free-tier/coordinator-support.d.ts +6 -3
- package/dist/routing/free-tier/coordinator-support.js +6 -3
- package/dist/routing/free-tier/executor.d.ts +14 -0
- package/dist/routing/free-tier/executor.js +21 -0
- package/dist/routing/free-tier/index.d.ts +1 -0
- package/dist/routing/free-tier/index.js +1 -0
- package/dist/routing/free-tier/pattern-cache.d.ts +57 -0
- package/dist/routing/free-tier/pattern-cache.js +148 -0
- package/dist/routing/free-tier/provider.js +9 -1
- package/dist/routing/value-score.js +3 -0
- package/dist/shared/embeddings/ollama-client.js +2 -1
- package/dist/shared/llm/model-mapping.js +26 -0
- package/dist/shared/llm/model-registry.d.ts +10 -0
- package/dist/shared/llm/model-registry.js +92 -0
- package/dist/shared/llm/ollama-url.d.ts +17 -0
- package/dist/shared/llm/ollama-url.js +25 -0
- package/dist/shared/llm/providers/gemini.js +16 -10
- package/dist/shared/llm/providers/ollama-timeout.d.ts +26 -0
- package/dist/shared/llm/providers/ollama-timeout.js +31 -0
- package/dist/shared/llm/providers/ollama.d.ts +10 -0
- package/dist/shared/llm/providers/ollama.js +31 -4
- package/dist/shared/llm/providers/openrouter.js +20 -20
- package/dist/shared/llm/router/hybrid-router.js +18 -1
- package/dist/validation/conservation-guard.d.ts +39 -0
- package/dist/validation/conservation-guard.js +54 -0
- package/dist/validation/oracle-eval.d.ts +46 -0
- package/dist/validation/oracle-eval.js +108 -0
- package/dist/validation/skill-parity.d.ts +58 -0
- package/dist/validation/skill-parity.js +94 -0
- package/dist/validation/test-gen-prompt.d.ts +10 -0
- package/dist/validation/test-gen-prompt.js +26 -0
- package/package.json +12 -1
- package/dist/cli/chunks/adapter-LDNYC4GH.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-CA4CT5Q7.js +0 -2
- package/dist/cli/chunks/base-TSDAEMT4.js +0 -2
- package/dist/cli/chunks/browser-workflow-3HCTJBLR.js +0 -2
- package/dist/cli/chunks/chunk-527U4AHC.js +0 -24
- package/dist/cli/chunks/chunk-72VVTMEL.js +0 -2
- package/dist/cli/chunks/chunk-7HYO76F2.js +0 -2
- package/dist/cli/chunks/chunk-K3YM2Z3E.js +0 -2
- package/dist/cli/chunks/client-WRDYZGM2.js +0 -2
- package/dist/cli/chunks/core-handlers-O6E5DNHT.js +0 -2
- package/dist/cli/chunks/cross-domain-router-EV7LQMDO.js +0 -2
- package/dist/cli/chunks/dream-E4C236UL.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-WMADLDKT.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-STRDGJ65.js +0 -2
- package/dist/cli/chunks/hnsw-index-DBHX3TSC.js +0 -2
- package/dist/cli/chunks/hybrid-router-L2K55I4T.js +0 -2
- package/dist/cli/chunks/impact-analyzer-WMO7ZGS7.js +0 -2
- package/dist/cli/chunks/init-wizard-ZAB7UZZS.js +0 -2
- package/dist/cli/chunks/kernel-4MUFDEQI.js +0 -2
- package/dist/cli/chunks/knowledge-graph-GZRFGXLX.js +0 -2
- package/dist/cli/chunks/llm-router-service-5ODLU5U5.js +0 -2
- package/dist/cli/chunks/load-test-ZDQFS5XS.js +0 -2
- package/dist/cli/chunks/memory-backend-UK7SQ6ZM.js +0 -2
- package/dist/cli/chunks/memory-handlers-6LDUH3JZ.js +0 -2
- package/dist/cli/chunks/pattern-null-store-LO2QTIBU.js +0 -2
- package/dist/cli/chunks/protocol-executor-JWMYQEOI.js +0 -2
- package/dist/cli/chunks/provider-manager-PEXOHGNB.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-7B2G4UGQ.js +0 -2
- package/dist/cli/chunks/queen-coordinator-6OF4HT3S.js +0 -2
- package/dist/cli/chunks/router-GMWRF6DU.js +0 -2
- package/dist/cli/chunks/routing-feedback-XKJSQK3I.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-YEA6TMXB.js +0 -2
- package/dist/cli/chunks/safe-db-5DOP2J3V.js +0 -2
- package/dist/cli/chunks/schedule-SUWTOBHP.js +0 -2
- package/dist/cli/chunks/scheduler-P4VTC5SQ.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-5Z2RAXH7.js +0 -2
- package/dist/cli/chunks/unified-memory-HCKOPFAY.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-6NQPYA5C.js +0 -2
- package/dist/cli/chunks/unified-persistence-NIMKNAFR.js +0 -2
- package/dist/cli/chunks/visual-security-HFGHA57Z.js +0 -2
- package/dist/cli/chunks/witness-chain-VZGGJ7TJ.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-45L7D4SN.js +0 -2
|
@@ -333,6 +333,42 @@ test_cases:
|
|
|
333
333
|
accuracy: 0.4
|
|
334
334
|
actionability: 0.2
|
|
335
335
|
|
|
336
|
+
# ---------------------------------------------------------------------------
|
|
337
|
+
# ORACLE CASE (preferred for test-generating skills) — ADR-113
|
|
338
|
+
# ---------------------------------------------------------------------------
|
|
339
|
+
# Instead of keyword-matching the output, RUN the generated test against a
|
|
340
|
+
# reference implementation (must pass) and its operator mutants (each surviving
|
|
341
|
+
# mutant is a missed bug). Mutation kill rate is the pass signal — a test that
|
|
342
|
+
# asserts nothing scores 0 and fails. Requires the skill output to be a test
|
|
343
|
+
# that imports the impl as `../src/<module_name>.mjs`.
|
|
344
|
+
- id: tc050_oracle_generated_test
|
|
345
|
+
description: "Generated test kills mutants of a reference implementation"
|
|
346
|
+
category: oracle
|
|
347
|
+
priority: critical
|
|
348
|
+
|
|
349
|
+
input:
|
|
350
|
+
code: |
|
|
351
|
+
export function inRange(x, lo, hi) {
|
|
352
|
+
return x >= lo && x <= hi;
|
|
353
|
+
}
|
|
354
|
+
context:
|
|
355
|
+
language: javascript
|
|
356
|
+
|
|
357
|
+
expected_output: {} # not used in oracle mode
|
|
358
|
+
|
|
359
|
+
oracle:
|
|
360
|
+
module_name: inRange
|
|
361
|
+
reference_impl: |
|
|
362
|
+
export function inRange(x, lo, hi) {
|
|
363
|
+
return x >= lo && x <= hi;
|
|
364
|
+
}
|
|
365
|
+
threshold: 0.6 # minimum mutation kill rate
|
|
366
|
+
extract: first_code_block # pull the test from the first ```code block``` in output
|
|
367
|
+
|
|
368
|
+
validation:
|
|
369
|
+
oracle: true # grade as an oracle, not by keyword matching
|
|
370
|
+
# mutation_score_min: 0.6 # optional override of oracle.threshold
|
|
371
|
+
|
|
336
372
|
# =============================================================================
|
|
337
373
|
# Success Criteria
|
|
338
374
|
# =============================================================================
|
|
@@ -94,6 +94,10 @@ await qualityAnalyzer.assessCode({
|
|
|
94
94
|
await qualityGate.evaluate({
|
|
95
95
|
gates: {
|
|
96
96
|
coverage: { min: 80, blocking: true },
|
|
97
|
+
// Fault detection — coverage is necessary but NOT sufficient (ADR-113).
|
|
98
|
+
// A suite can hit 90% coverage and catch no bugs; mutation score does not lie.
|
|
99
|
+
mutationScore: { min: 0.6, blocking: false }, // warn-by-default; opt-in blocking
|
|
100
|
+
regenerability: { min: 0.5, blocking: false }, // Deletion Test: durable oracle backing per module
|
|
97
101
|
complexity: { max: 15, blocking: false },
|
|
98
102
|
vulnerabilities: { critical: 0, high: 0, blocking: true },
|
|
99
103
|
duplications: { max: 3, blocking: false },
|
|
@@ -107,6 +111,27 @@ await qualityGate.evaluate({
|
|
|
107
111
|
});
|
|
108
112
|
```
|
|
109
113
|
|
|
114
|
+
### 2a. Regenerability gate (ADR-113)
|
|
115
|
+
|
|
116
|
+
Coverage measures lines executed; **mutation score** measures whether the tests would
|
|
117
|
+
*notice a bug*, and **regenerability** answers the Deletion Test — "if this module were
|
|
118
|
+
deleted and regenerated, would a wrong rebuild be caught?" Regenerability = mutation
|
|
119
|
+
score discounted by the durability tier backing the module (durable > live > ephemeral
|
|
120
|
+
> none); ephemeral-only tests score low because they don't survive a reimplementation.
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
import { evaluateRegenerabilityGate } from '../../../src/feedback/regenerability-gate.js';
|
|
124
|
+
|
|
125
|
+
const verdict = evaluateRegenerabilityGate(moduleProfiles, {
|
|
126
|
+
mutationScoreMin: 0.6,
|
|
127
|
+
regenerabilityMin: 0.5,
|
|
128
|
+
mode: 'warn', // 'block' to fail CI; warn-by-default so adoption never breaks pipelines
|
|
129
|
+
});
|
|
130
|
+
// verdict.passed (thresholds met) · verdict.blocking (should fail CI) · verdict.failures[]
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Surface it next to coverage in reports: `Coverage 88% ✅ / Mutation 41% ⚠️ / Regenerability: ephemeral-only ⚠️`.
|
|
134
|
+
|
|
110
135
|
### 3. Deployment Readiness
|
|
111
136
|
|
|
112
137
|
```typescript
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "qe-test-generation"
|
|
3
|
-
description: "Generates
|
|
3
|
+
description: "Generates durable-first tests — invariants, contracts, and property-based tests at boundaries that survive a reimplementation — plus unit, integration, and e2e coverage. Use when creating tests for new or changed code, filling coverage gaps, or migrating test suites between Jest, Vitest, and Playwright."
|
|
4
4
|
trust_tier: 3
|
|
5
5
|
validation:
|
|
6
6
|
schema_path: schemas/output.json
|
|
@@ -14,6 +14,31 @@ validation:
|
|
|
14
14
|
|
|
15
15
|
Guide the use of v3's AI-powered test generation capabilities including pattern-based test synthesis, multi-framework support, and intelligent test case derivation from code analysis.
|
|
16
16
|
|
|
17
|
+
## Write durable-first (the core rule)
|
|
18
|
+
|
|
19
|
+
When AI makes code cheap to regenerate, the durable asset is the test that still
|
|
20
|
+
holds after the implementation is thrown away and rewritten. Generate tests in
|
|
21
|
+
**durability tiers**, and lead with the durable ones (ADR-113):
|
|
22
|
+
|
|
23
|
+
| Tier | What it is | Survives a rewrite? | When to write |
|
|
24
|
+
|------|-----------|---------------------|---------------|
|
|
25
|
+
| **Durable** | Invariants, contracts/schemas, property-based tests, behavioral e2e — specified at the module's public boundary | **Yes** | **Always — ≥1 per target** |
|
|
26
|
+
| **Ephemeral** | Example-based unit tests, mock-call/interaction tests (TDD-London style) | No (coupled to impl) | For the red-green loop; label them, delete freely |
|
|
27
|
+
| **Live** | Monitoring / drift / cost assertions that run against reality | Continuously | For deployed behavior |
|
|
28
|
+
|
|
29
|
+
**The language-swap heuristic:** *if reimplementing this module in another language
|
|
30
|
+
would invalidate the test, the test is at the wrong boundary.* Push it up a tier —
|
|
31
|
+
assert on the observable contract, not on how the current code happens to work.
|
|
32
|
+
|
|
33
|
+
Every generated target MUST include at least one **durable** assertion (an invariant,
|
|
34
|
+
a contract check, or a property). Mock-call assertions (`toHaveBeenCalledWith`) are
|
|
35
|
+
ephemeral by definition — never let them be the only thing testing a target. Tag each
|
|
36
|
+
generated test `// @tier durable|ephemeral|live` so its lifetime is explicit.
|
|
37
|
+
|
|
38
|
+
These tests are graded as **oracles**: a good test passes against the real code and
|
|
39
|
+
*fails* against a seeded bug (mutant). A test that asserts nothing, or only the happy
|
|
40
|
+
path, kills no mutants and is rejected — see `/mutation-testing` and ADR-113.
|
|
41
|
+
|
|
17
42
|
## Activation
|
|
18
43
|
|
|
19
44
|
- When generating tests for new code
|
|
@@ -41,25 +66,29 @@ aqe test generate --pattern repository --target src/repositories/
|
|
|
41
66
|
## Agent Workflow
|
|
42
67
|
|
|
43
68
|
```typescript
|
|
44
|
-
// Spawn test generation agents
|
|
45
|
-
Task("Generate
|
|
46
|
-
Analyze src/services/PaymentService.ts and generate
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
-
|
|
69
|
+
// Spawn test generation agents — durable-first
|
|
70
|
+
Task("Generate durable-first tests", `
|
|
71
|
+
Analyze src/services/PaymentService.ts and generate Jest tests in tier order.
|
|
72
|
+
1. DURABLE (write these first, >=1 per public method):
|
|
73
|
+
- Invariants ("a refund never makes a balance negative")
|
|
74
|
+
- Contract/schema checks on inputs and outputs crossing the boundary
|
|
75
|
+
- Property-based tests (fast-check) over input ranges, not single examples
|
|
76
|
+
2. EPHEMERAL (the red-green loop; tag '// @tier ephemeral'):
|
|
77
|
+
- Specific happy-path examples and error paths
|
|
78
|
+
- Mock external dependencies ONLY — never let a mock-call assertion be the
|
|
79
|
+
only test for a method
|
|
80
|
+
Apply the language-swap check: if a Python rewrite of PaymentService would break
|
|
81
|
+
the test, move it up to the durable tier.
|
|
52
82
|
Output to tests/unit/services/PaymentService.test.ts
|
|
53
|
-
`, "qe-test-
|
|
54
|
-
|
|
55
|
-
//
|
|
56
|
-
Task("
|
|
57
|
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
|
|
62
|
-
`, "qe-pattern-matcher")
|
|
83
|
+
`, "qe-test-architect")
|
|
84
|
+
|
|
85
|
+
// Property + contract generation (first-class, not opt-in)
|
|
86
|
+
Task("Generate property and contract tests", `
|
|
87
|
+
For src/repositories/, derive:
|
|
88
|
+
- Properties: round-trip (write→read returns same), idempotence, ordering invariants
|
|
89
|
+
- Contracts: the repository interface schema, enforced on every CRUD result
|
|
90
|
+
These survive a storage-engine swap; example-based CRUD tests do not.
|
|
91
|
+
`, "qe-property-tester")
|
|
63
92
|
```
|
|
64
93
|
|
|
65
94
|
## Test Generation Strategies
|
|
@@ -122,6 +151,15 @@ await testGenerator.fillCoverageGaps({
|
|
|
122
151
|
|
|
123
152
|
```yaml
|
|
124
153
|
quality_checks:
|
|
154
|
+
durability: # the primary check (ADR-113)
|
|
155
|
+
durable_assertions_per_target: 1 # >=1 invariant/contract/property each
|
|
156
|
+
language_swap_safe: true # would survive a reimplementation
|
|
157
|
+
tier_tags_present: true # every test tagged durable|ephemeral|live
|
|
158
|
+
|
|
159
|
+
fault_detection: # do the tests actually catch bugs?
|
|
160
|
+
mutation_score_min: 0.6 # kill rate against seeded mutants
|
|
161
|
+
no_assertionless_tests: true # reject tests that kill 0 mutants
|
|
162
|
+
|
|
125
163
|
assertions:
|
|
126
164
|
minimum_per_test: 1
|
|
127
165
|
meaningful: true
|
|
@@ -134,7 +172,7 @@ quality_checks:
|
|
|
134
172
|
descriptive: true
|
|
135
173
|
follows_convention: true
|
|
136
174
|
|
|
137
|
-
coverage:
|
|
175
|
+
coverage: # necessary but NOT sufficient — see fault_detection
|
|
138
176
|
branches: 80
|
|
139
177
|
statements: 85
|
|
140
178
|
```
|
|
@@ -134,6 +134,43 @@ test_cases:
|
|
|
134
134
|
schema_check: true
|
|
135
135
|
allow_partial: true
|
|
136
136
|
|
|
137
|
+
# ORACLE CASE (ADR-113): grade the generated test by running it against a
|
|
138
|
+
# reference impl + operator mutants. Skips under the simulating runner; runs
|
|
139
|
+
# in the live eval lane (a provider must produce the test). This is what makes
|
|
140
|
+
# this eval a real oracle instead of a keyword grep.
|
|
141
|
+
- id: tc006_oracle_generated_test
|
|
142
|
+
description: "Generated test kills mutants of a reference function"
|
|
143
|
+
category: oracle
|
|
144
|
+
priority: critical
|
|
145
|
+
|
|
146
|
+
input:
|
|
147
|
+
code: |
|
|
148
|
+
export function classify(score, bonus) {
|
|
149
|
+
const total = score + bonus;
|
|
150
|
+
if (total >= 90 && bonus > 0) return 'A';
|
|
151
|
+
if (total >= 70) return 'B';
|
|
152
|
+
return 'C';
|
|
153
|
+
}
|
|
154
|
+
context:
|
|
155
|
+
language: javascript
|
|
156
|
+
|
|
157
|
+
expected_output: {}
|
|
158
|
+
|
|
159
|
+
oracle:
|
|
160
|
+
module_name: classify
|
|
161
|
+
reference_impl: |
|
|
162
|
+
export function classify(score, bonus) {
|
|
163
|
+
const total = score + bonus;
|
|
164
|
+
if (total >= 90 && bonus > 0) return 'A';
|
|
165
|
+
if (total >= 70) return 'B';
|
|
166
|
+
return 'C';
|
|
167
|
+
}
|
|
168
|
+
threshold: 0.6
|
|
169
|
+
extract: first_code_block
|
|
170
|
+
|
|
171
|
+
validation:
|
|
172
|
+
oracle: true
|
|
173
|
+
|
|
137
174
|
success_criteria:
|
|
138
175
|
pass_rate: 0.9
|
|
139
176
|
critical_pass_rate: 1.0
|
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,90 @@ 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.11.4] - 2026-07-01
|
|
9
|
+
|
|
10
|
+
Better free local-model support, a tamper-evident guard for AQE's learning
|
|
11
|
+
database, and a self-running dependency-security system — so known CVEs surface
|
|
12
|
+
on their own instead of sitting unnoticed.
|
|
13
|
+
|
|
14
|
+
Local test generation now defaults to a **code-tuned** local model and skips the
|
|
15
|
+
paid path when a cached pattern already fits. A new opt-in **proof-gate** lets you
|
|
16
|
+
cryptographically verify that nothing tampered with `memory.db` across a sync or
|
|
17
|
+
migration. And AQE now audits its own dependencies on a schedule and opens
|
|
18
|
+
in-range security-fix PRs automatically. See
|
|
19
|
+
[ADR-116](docs/implementation/adrs/ADR-116-proof-gate-memory-integrity.md) (proof-gate),
|
|
20
|
+
[ADR-115](docs/implementation/adrs/ADR-115-dependency-security-system.md) (dependency security),
|
|
21
|
+
and the [free-tier local-models guide](docs/guides/free-tier-local-models.md).
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- **Free-tier local test generation** — run test generation on a local Ollama
|
|
26
|
+
model (default `qwen3-coder:30b`), with an objective "is this a real test?"
|
|
27
|
+
check and a repair loop; a ruvLLM-style **pattern cache** skips the model
|
|
28
|
+
entirely when a prior result fits, and the paid path is used only as fallback.
|
|
29
|
+
- **Local-model plumbing** — unified `AQE_OLLAMA_URL`, adaptive Ollama timeouts,
|
|
30
|
+
registered qwen3 models, and a capability-aware tool-routing guard so a model
|
|
31
|
+
is only asked to use tools it actually supports.
|
|
32
|
+
- **Proof-gate (opt-in)** — a tamper-evident SHA-256 hash chain over the
|
|
33
|
+
`memory.db` kv write path: enable it for a sync/migration/publish window
|
|
34
|
+
(`AQE_PROOF_GATE=1`) and `verifyMemoryIntegrity()` proves no write was mutated,
|
|
35
|
+
reordered, or dropped. Off by default, fail-soft, single-store (ADR-116).
|
|
36
|
+
- **Dependency-security system** — a daily scheduled consumer-POV `npm audit`
|
|
37
|
+
that files a tracking issue on new HIGH/CRITICAL CVEs (even against unchanged,
|
|
38
|
+
pinned deps), plus a weekly updater that opens small in-range security-fix PRs
|
|
39
|
+
and refuses to drop optional platform binaries. `npm run deps:audit` /
|
|
40
|
+
`deps:update` locally (ADR-115).
|
|
41
|
+
|
|
42
|
+
### Fixed
|
|
43
|
+
|
|
44
|
+
- **`@grpc/grpc-js` HIGH CVE** (CVE-2026-48068 / -48069, server-crash DoS)
|
|
45
|
+
resolved by an in-range bump to 1.14.4.
|
|
46
|
+
- **Reduced advisory noise** — in-range dependency updates cut moderate
|
|
47
|
+
advisories from 29 to 7 (OpenTelemetry W3C-Baggage family and others), with all
|
|
48
|
+
15 optional platform dependencies preserved.
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
|
|
52
|
+
- **Default local test-gen model** is now `qwen3-coder:30b` (code-tuned MoE),
|
|
53
|
+
replacing the general-purpose `qwen3:30b-a3b` — lower latency and more reliable
|
|
54
|
+
test output.
|
|
55
|
+
|
|
56
|
+
## [3.11.3] - 2026-06-27
|
|
57
|
+
|
|
58
|
+
Tests and evals you can actually trust, cheaper model options, and a guard that
|
|
59
|
+
keeps AQE's commands and outputs stable for your scripts.
|
|
60
|
+
|
|
61
|
+
AQE now grades a generated test by **running it** — against the real code (it must
|
|
62
|
+
pass) and against deliberately-broken versions (it must catch them) — instead of
|
|
63
|
+
checking for keywords. Test generation leads with **durable tests** (invariants,
|
|
64
|
+
contracts, properties) that survive a rewrite, and quality reports add a
|
|
65
|
+
**mutation-score / regenerability** signal next to coverage. See the new
|
|
66
|
+
[oracle-evals plan](docs/plans/oracle-evals-durable-tests-plan.md) (ADR-113) and the
|
|
67
|
+
[conservation-layer policy](docs/guides/conservation-layer-policy.md) (ADR-114).
|
|
68
|
+
|
|
69
|
+
### Added
|
|
70
|
+
|
|
71
|
+
- **Oracle evals** — skill evals run the generated test against a reference
|
|
72
|
+
implementation plus seeded mutants; an assertion-less or wrong test is rejected.
|
|
73
|
+
- **Durable-first test generation** — `qe-test-generation` now emits invariants,
|
|
74
|
+
contracts, and property-based tests first (with a "would this survive a rewrite?"
|
|
75
|
+
check), keeping happy-path/mock tests as a labeled, disposable tier.
|
|
76
|
+
- **Regenerability gate** — `qe-quality-assessment` reports mutation score + a
|
|
77
|
+
per-module regenerability score alongside coverage (warn by default, opt-in blocking).
|
|
78
|
+
- **Conservation guard** — `npm run verify:conservation` + `verify:skill-parity` catch
|
|
79
|
+
breaking changes to CLI commands, report output schemas, the dashboard API, and skill
|
|
80
|
+
trees, with a deprecation policy so removals are deliberate and announced.
|
|
81
|
+
- **Cheaper model lanes** — pick a budget or local model for test generation and prove
|
|
82
|
+
it clears the oracle: `npm run providers:health`, `eval:models`, `eval:live:*`. See the
|
|
83
|
+
[cheaper-model guide](docs/guides/cheaper-model-eval-lanes.md).
|
|
84
|
+
|
|
85
|
+
### Fixed
|
|
86
|
+
|
|
87
|
+
- **OpenRouter provider** now works through the provider manager (it previously failed
|
|
88
|
+
to route because it identified itself as `openai`).
|
|
89
|
+
- **Gemini provider** default model updated to a current model (`gemini-2.5-flash`); the
|
|
90
|
+
old default had been retired by Google. Supported-model list and pricing refreshed.
|
|
91
|
+
|
|
8
92
|
## [3.11.2] - 2026-06-27
|
|
9
93
|
|
|
10
94
|
First-class **C4 architecture diagrams** generated straight from your codebase —
|
|
@@ -333,6 +333,42 @@ test_cases:
|
|
|
333
333
|
accuracy: 0.4
|
|
334
334
|
actionability: 0.2
|
|
335
335
|
|
|
336
|
+
# ---------------------------------------------------------------------------
|
|
337
|
+
# ORACLE CASE (preferred for test-generating skills) — ADR-113
|
|
338
|
+
# ---------------------------------------------------------------------------
|
|
339
|
+
# Instead of keyword-matching the output, RUN the generated test against a
|
|
340
|
+
# reference implementation (must pass) and its operator mutants (each surviving
|
|
341
|
+
# mutant is a missed bug). Mutation kill rate is the pass signal — a test that
|
|
342
|
+
# asserts nothing scores 0 and fails. Requires the skill output to be a test
|
|
343
|
+
# that imports the impl as `../src/<module_name>.mjs`.
|
|
344
|
+
- id: tc050_oracle_generated_test
|
|
345
|
+
description: "Generated test kills mutants of a reference implementation"
|
|
346
|
+
category: oracle
|
|
347
|
+
priority: critical
|
|
348
|
+
|
|
349
|
+
input:
|
|
350
|
+
code: |
|
|
351
|
+
export function inRange(x, lo, hi) {
|
|
352
|
+
return x >= lo && x <= hi;
|
|
353
|
+
}
|
|
354
|
+
context:
|
|
355
|
+
language: javascript
|
|
356
|
+
|
|
357
|
+
expected_output: {} # not used in oracle mode
|
|
358
|
+
|
|
359
|
+
oracle:
|
|
360
|
+
module_name: inRange
|
|
361
|
+
reference_impl: |
|
|
362
|
+
export function inRange(x, lo, hi) {
|
|
363
|
+
return x >= lo && x <= hi;
|
|
364
|
+
}
|
|
365
|
+
threshold: 0.6 # minimum mutation kill rate
|
|
366
|
+
extract: first_code_block # pull the test from the first ```code block``` in output
|
|
367
|
+
|
|
368
|
+
validation:
|
|
369
|
+
oracle: true # grade as an oracle, not by keyword matching
|
|
370
|
+
# mutation_score_min: 0.6 # optional override of oracle.threshold
|
|
371
|
+
|
|
336
372
|
# =============================================================================
|
|
337
373
|
# Success Criteria
|
|
338
374
|
# =============================================================================
|
|
@@ -82,7 +82,7 @@ When testing enterprise integrations or SAP-connected systems:
|
|
|
82
82
|
### Tools
|
|
83
83
|
- **SAP**: SAP GUI, Transaction codes (SE37, WE19, SEGW), Eclipse ADT
|
|
84
84
|
- **Middleware**: IBM IIB/ACE, MuleSoft, SAP PI/PO/CPI
|
|
85
|
-
- **Testing**: SoapUI, Postman,
|
|
85
|
+
- **Testing**: SoapUI, Postman, qe-browser (via Vibium for Fiori/web UIs), custom harnesses
|
|
86
86
|
- **Monitoring**: SAP Solution Manager, Splunk, Dynatrace
|
|
87
87
|
- **Data**: SAP LSMW, SECATT, eCATT
|
|
88
88
|
|
|
@@ -124,7 +124,7 @@ Every pentest validation run MUST:
|
|
|
124
124
|
### XSS Pipeline
|
|
125
125
|
| Attack | Tier 1 (Pattern) | Tier 2 (Payload) | Tier 3 (Full) |
|
|
126
126
|
|--------|-------------------|-------------------|----------------|
|
|
127
|
-
| Reflected XSS | No output encoding | `<img onerror>` reflection | Browser JS execution via
|
|
127
|
+
| Reflected XSS | No output encoding | `<img onerror>` reflection | Browser JS execution via qe-browser (Vibium) |
|
|
128
128
|
| Stored XSS | `innerHTML` assignment | Payload stored + retrieved | Cookie theft PoC |
|
|
129
129
|
| DOM XSS | `document.write(location)` | Fragment injection | DOM manipulation proof |
|
|
130
130
|
|
|
@@ -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
|
|
@@ -94,6 +94,10 @@ await qualityAnalyzer.assessCode({
|
|
|
94
94
|
await qualityGate.evaluate({
|
|
95
95
|
gates: {
|
|
96
96
|
coverage: { min: 80, blocking: true },
|
|
97
|
+
// Fault detection — coverage is necessary but NOT sufficient (ADR-113).
|
|
98
|
+
// A suite can hit 90% coverage and catch no bugs; mutation score does not lie.
|
|
99
|
+
mutationScore: { min: 0.6, blocking: false }, // warn-by-default; opt-in blocking
|
|
100
|
+
regenerability: { min: 0.5, blocking: false }, // Deletion Test: durable oracle backing per module
|
|
97
101
|
complexity: { max: 15, blocking: false },
|
|
98
102
|
vulnerabilities: { critical: 0, high: 0, blocking: true },
|
|
99
103
|
duplications: { max: 3, blocking: false },
|
|
@@ -107,6 +111,27 @@ await qualityGate.evaluate({
|
|
|
107
111
|
});
|
|
108
112
|
```
|
|
109
113
|
|
|
114
|
+
### 2a. Regenerability gate (ADR-113)
|
|
115
|
+
|
|
116
|
+
Coverage measures lines executed; **mutation score** measures whether the tests would
|
|
117
|
+
*notice a bug*, and **regenerability** answers the Deletion Test — "if this module were
|
|
118
|
+
deleted and regenerated, would a wrong rebuild be caught?" Regenerability = mutation
|
|
119
|
+
score discounted by the durability tier backing the module (durable > live > ephemeral
|
|
120
|
+
> none); ephemeral-only tests score low because they don't survive a reimplementation.
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
import { evaluateRegenerabilityGate } from '../../../src/feedback/regenerability-gate.js';
|
|
124
|
+
|
|
125
|
+
const verdict = evaluateRegenerabilityGate(moduleProfiles, {
|
|
126
|
+
mutationScoreMin: 0.6,
|
|
127
|
+
regenerabilityMin: 0.5,
|
|
128
|
+
mode: 'warn', // 'block' to fail CI; warn-by-default so adoption never breaks pipelines
|
|
129
|
+
});
|
|
130
|
+
// verdict.passed (thresholds met) · verdict.blocking (should fail CI) · verdict.failures[]
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Surface it next to coverage in reports: `Coverage 88% ✅ / Mutation 41% ⚠️ / Regenerability: ephemeral-only ⚠️`.
|
|
134
|
+
|
|
110
135
|
### 3. Deployment Readiness
|
|
111
136
|
|
|
112
137
|
```typescript
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "qe-test-generation"
|
|
3
|
-
description: "Generates
|
|
3
|
+
description: "Generates durable-first tests — invariants, contracts, and property-based tests at boundaries that survive a reimplementation — plus unit, integration, and e2e coverage. Use when creating tests for new or changed code, filling coverage gaps, or migrating test suites between Jest, Vitest, and Playwright."
|
|
4
4
|
trust_tier: 3
|
|
5
5
|
validation:
|
|
6
6
|
schema_path: schemas/output.json
|
|
@@ -14,6 +14,31 @@ validation:
|
|
|
14
14
|
|
|
15
15
|
Guide the use of v3's AI-powered test generation capabilities including pattern-based test synthesis, multi-framework support, and intelligent test case derivation from code analysis.
|
|
16
16
|
|
|
17
|
+
## Write durable-first (the core rule)
|
|
18
|
+
|
|
19
|
+
When AI makes code cheap to regenerate, the durable asset is the test that still
|
|
20
|
+
holds after the implementation is thrown away and rewritten. Generate tests in
|
|
21
|
+
**durability tiers**, and lead with the durable ones (ADR-113):
|
|
22
|
+
|
|
23
|
+
| Tier | What it is | Survives a rewrite? | When to write |
|
|
24
|
+
|------|-----------|---------------------|---------------|
|
|
25
|
+
| **Durable** | Invariants, contracts/schemas, property-based tests, behavioral e2e — specified at the module's public boundary | **Yes** | **Always — ≥1 per target** |
|
|
26
|
+
| **Ephemeral** | Example-based unit tests, mock-call/interaction tests (TDD-London style) | No (coupled to impl) | For the red-green loop; label them, delete freely |
|
|
27
|
+
| **Live** | Monitoring / drift / cost assertions that run against reality | Continuously | For deployed behavior |
|
|
28
|
+
|
|
29
|
+
**The language-swap heuristic:** *if reimplementing this module in another language
|
|
30
|
+
would invalidate the test, the test is at the wrong boundary.* Push it up a tier —
|
|
31
|
+
assert on the observable contract, not on how the current code happens to work.
|
|
32
|
+
|
|
33
|
+
Every generated target MUST include at least one **durable** assertion (an invariant,
|
|
34
|
+
a contract check, or a property). Mock-call assertions (`toHaveBeenCalledWith`) are
|
|
35
|
+
ephemeral by definition — never let them be the only thing testing a target. Tag each
|
|
36
|
+
generated test `// @tier durable|ephemeral|live` so its lifetime is explicit.
|
|
37
|
+
|
|
38
|
+
These tests are graded as **oracles**: a good test passes against the real code and
|
|
39
|
+
*fails* against a seeded bug (mutant). A test that asserts nothing, or only the happy
|
|
40
|
+
path, kills no mutants and is rejected — see `/mutation-testing` and ADR-113.
|
|
41
|
+
|
|
17
42
|
## Activation
|
|
18
43
|
|
|
19
44
|
- When generating tests for new code
|
|
@@ -41,25 +66,29 @@ aqe test generate --pattern repository --target src/repositories/
|
|
|
41
66
|
## Agent Workflow
|
|
42
67
|
|
|
43
68
|
```typescript
|
|
44
|
-
// Spawn test generation agents
|
|
45
|
-
Task("Generate
|
|
46
|
-
Analyze src/services/PaymentService.ts and generate
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
-
|
|
69
|
+
// Spawn test generation agents — durable-first
|
|
70
|
+
Task("Generate durable-first tests", `
|
|
71
|
+
Analyze src/services/PaymentService.ts and generate Jest tests in tier order.
|
|
72
|
+
1. DURABLE (write these first, >=1 per public method):
|
|
73
|
+
- Invariants ("a refund never makes a balance negative")
|
|
74
|
+
- Contract/schema checks on inputs and outputs crossing the boundary
|
|
75
|
+
- Property-based tests (fast-check) over input ranges, not single examples
|
|
76
|
+
2. EPHEMERAL (the red-green loop; tag '// @tier ephemeral'):
|
|
77
|
+
- Specific happy-path examples and error paths
|
|
78
|
+
- Mock external dependencies ONLY — never let a mock-call assertion be the
|
|
79
|
+
only test for a method
|
|
80
|
+
Apply the language-swap check: if a Python rewrite of PaymentService would break
|
|
81
|
+
the test, move it up to the durable tier.
|
|
52
82
|
Output to tests/unit/services/PaymentService.test.ts
|
|
53
|
-
`, "qe-test-
|
|
54
|
-
|
|
55
|
-
//
|
|
56
|
-
Task("
|
|
57
|
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
|
|
62
|
-
`, "qe-pattern-matcher")
|
|
83
|
+
`, "qe-test-architect")
|
|
84
|
+
|
|
85
|
+
// Property + contract generation (first-class, not opt-in)
|
|
86
|
+
Task("Generate property and contract tests", `
|
|
87
|
+
For src/repositories/, derive:
|
|
88
|
+
- Properties: round-trip (write→read returns same), idempotence, ordering invariants
|
|
89
|
+
- Contracts: the repository interface schema, enforced on every CRUD result
|
|
90
|
+
These survive a storage-engine swap; example-based CRUD tests do not.
|
|
91
|
+
`, "qe-property-tester")
|
|
63
92
|
```
|
|
64
93
|
|
|
65
94
|
## Test Generation Strategies
|
|
@@ -122,6 +151,15 @@ await testGenerator.fillCoverageGaps({
|
|
|
122
151
|
|
|
123
152
|
```yaml
|
|
124
153
|
quality_checks:
|
|
154
|
+
durability: # the primary check (ADR-113)
|
|
155
|
+
durable_assertions_per_target: 1 # >=1 invariant/contract/property each
|
|
156
|
+
language_swap_safe: true # would survive a reimplementation
|
|
157
|
+
tier_tags_present: true # every test tagged durable|ephemeral|live
|
|
158
|
+
|
|
159
|
+
fault_detection: # do the tests actually catch bugs?
|
|
160
|
+
mutation_score_min: 0.6 # kill rate against seeded mutants
|
|
161
|
+
no_assertionless_tests: true # reject tests that kill 0 mutants
|
|
162
|
+
|
|
125
163
|
assertions:
|
|
126
164
|
minimum_per_test: 1
|
|
127
165
|
meaningful: true
|
|
@@ -134,7 +172,7 @@ quality_checks:
|
|
|
134
172
|
descriptive: true
|
|
135
173
|
follows_convention: true
|
|
136
174
|
|
|
137
|
-
coverage:
|
|
175
|
+
coverage: # necessary but NOT sufficient — see fault_detection
|
|
138
176
|
branches: 80
|
|
139
177
|
statements: 85
|
|
140
178
|
```
|
|
@@ -134,6 +134,43 @@ test_cases:
|
|
|
134
134
|
schema_check: true
|
|
135
135
|
allow_partial: true
|
|
136
136
|
|
|
137
|
+
# ORACLE CASE (ADR-113): grade the generated test by running it against a
|
|
138
|
+
# reference impl + operator mutants. Skips under the simulating runner; runs
|
|
139
|
+
# in the live eval lane (a provider must produce the test). This is what makes
|
|
140
|
+
# this eval a real oracle instead of a keyword grep.
|
|
141
|
+
- id: tc006_oracle_generated_test
|
|
142
|
+
description: "Generated test kills mutants of a reference function"
|
|
143
|
+
category: oracle
|
|
144
|
+
priority: critical
|
|
145
|
+
|
|
146
|
+
input:
|
|
147
|
+
code: |
|
|
148
|
+
export function classify(score, bonus) {
|
|
149
|
+
const total = score + bonus;
|
|
150
|
+
if (total >= 90 && bonus > 0) return 'A';
|
|
151
|
+
if (total >= 70) return 'B';
|
|
152
|
+
return 'C';
|
|
153
|
+
}
|
|
154
|
+
context:
|
|
155
|
+
language: javascript
|
|
156
|
+
|
|
157
|
+
expected_output: {}
|
|
158
|
+
|
|
159
|
+
oracle:
|
|
160
|
+
module_name: classify
|
|
161
|
+
reference_impl: |
|
|
162
|
+
export function classify(score, bonus) {
|
|
163
|
+
const total = score + bonus;
|
|
164
|
+
if (total >= 90 && bonus > 0) return 'A';
|
|
165
|
+
if (total >= 70) return 'B';
|
|
166
|
+
return 'C';
|
|
167
|
+
}
|
|
168
|
+
threshold: 0.6
|
|
169
|
+
extract: first_code_block
|
|
170
|
+
|
|
171
|
+
validation:
|
|
172
|
+
oracle: true
|
|
173
|
+
|
|
137
174
|
success_criteria:
|
|
138
175
|
pass_rate: 0.9
|
|
139
176
|
critical_pass_rate: 1.0
|