agentic-qe 3.11.1 → 3.11.3
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-code-intelligence/SKILL.md +3 -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 +71 -0
- package/README.md +1 -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-code-intelligence/SKILL.md +3 -0
- 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-IU3H3MD7.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-3OJAT664.js → agent-booster-wasm-BFRW7HEU.js} +2 -2
- package/dist/cli/chunks/{agent-handler-6TCTI5AT.js → agent-handler-ZVC3VFPC.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-FAWCYEGJ.js → agent-memory-branch-3WU3CVSX.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-BGOC63IN.js +2 -0
- package/dist/cli/chunks/{arena-UVYIGYUF.js → arena-JMVTWWG5.js} +2 -2
- package/dist/cli/chunks/{arena-O2TCUQBF.js → arena-QMRLNQUC.js} +4 -4
- package/dist/cli/chunks/{audit-AYESKHAJ.js → audit-TTWAAV7P.js} +2 -2
- package/dist/cli/chunks/base-DVPRE3WO.js +2 -0
- package/dist/cli/chunks/{hnswlib-node-FUWQTM2D.js → better-sqlite3-QNZJOJAB.js} +2 -2
- package/dist/cli/chunks/{brain-handler-KSJBVTHZ.js → brain-handler-FXPLJCPV.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-4O3S42EG.js → branch-enumerator-CJJG6X3I.js} +2 -2
- package/dist/cli/chunks/{browser-5VXK323P.js → browser-LI2CDWVR.js} +2 -2
- package/dist/cli/chunks/browser-workflow-MP5P7KZF.js +2 -0
- package/dist/cli/chunks/{chunk-ZKPOKMJZ.js → chunk-22CUJA33.js} +2 -2
- package/dist/cli/chunks/{chunk-N52WQO3G.js → chunk-242B625Q.js} +2 -2
- package/dist/cli/chunks/{chunk-T7PUM6OY.js → chunk-26KHL4VO.js} +1 -1
- package/dist/cli/chunks/{chunk-IIX5Y7BO.js → chunk-27MMZQ7X.js} +1 -1
- package/dist/cli/chunks/{chunk-FBOPSWF6.js → chunk-2OUXYSQV.js} +2 -2
- package/dist/cli/chunks/{chunk-AEZMNFXM.js → chunk-2SZQDTI5.js} +1 -1
- package/dist/cli/chunks/{chunk-44HXRFOP.js → chunk-36HTS4EP.js} +2 -2
- package/dist/cli/chunks/{chunk-3XCEFSUK.js → chunk-3BREKEL5.js} +2 -2
- package/dist/cli/chunks/{chunk-56PICCZN.js → chunk-3CBYKKRW.js} +2 -2
- package/dist/cli/chunks/{chunk-EJSDQQZH.js → chunk-3E3PSEC5.js} +2 -2
- package/dist/cli/chunks/{chunk-5PSIKJL5.js → chunk-3FOFPGHH.js} +2 -2
- package/dist/cli/chunks/{chunk-J2LAYCYZ.js → chunk-3XLGXCSX.js} +1 -1
- package/dist/cli/chunks/{chunk-YFY35CSD.js → chunk-4ITHKHR5.js} +2 -2
- package/dist/cli/chunks/{chunk-5QFZEEJ2.js → chunk-54TDOQAH.js} +3 -3
- package/dist/cli/chunks/{chunk-S7ZHD6VN.js → chunk-5746QYRF.js} +2 -2
- package/dist/cli/chunks/{chunk-4OYC5TIZ.js → chunk-5EW36WTI.js} +2 -2
- package/dist/cli/chunks/{chunk-C27UV6DO.js → chunk-6F43POT6.js} +1 -1
- package/dist/cli/chunks/{chunk-SU4YXUVK.js → chunk-6GVRP64A.js} +2 -2
- package/dist/cli/chunks/{chunk-SZPTUV3B.js → chunk-6IHB3T6M.js} +2 -2
- package/dist/cli/chunks/{chunk-CN2HMHIY.js → chunk-6JR2RSY2.js} +2 -2
- package/dist/cli/chunks/{chunk-VGR65B4Y.js → chunk-6KKKPVOF.js} +1 -1
- package/dist/cli/chunks/{chunk-C7FYDE5F.js → chunk-6WWNK67C.js} +125 -150
- package/dist/cli/chunks/{chunk-VRHLHGKR.js → chunk-77QJQRL2.js} +2 -2
- package/dist/cli/chunks/{chunk-W6RS5S4Q.js → chunk-7FVWETN4.js} +2 -2
- package/dist/cli/chunks/{chunk-X4GKYSOH.js → chunk-7PDUD7FF.js} +2 -2
- package/dist/cli/chunks/{chunk-V6YDM37M.js → chunk-7QIYYYUE.js} +1 -1
- package/dist/cli/chunks/{chunk-CII57TME.js → chunk-7S7QF4HJ.js} +1 -1
- package/dist/cli/chunks/{chunk-ILZHECWZ.js → chunk-7SBMTSGY.js} +3 -3
- package/dist/cli/chunks/{chunk-S7IHSELP.js → chunk-7UOH55UT.js} +2 -2
- package/dist/cli/chunks/{chunk-6ZAUNPAI.js → chunk-A43MKBSX.js} +2 -2
- package/dist/cli/chunks/{chunk-HMVL55QX.js → chunk-A4NYOH7P.js} +2 -2
- package/dist/cli/chunks/{chunk-OHBZON7T.js → chunk-ABD6JBNO.js} +1 -1
- package/dist/cli/chunks/{chunk-WIC5UZCQ.js → chunk-AC6OZTY4.js} +2 -2
- package/dist/cli/chunks/{chunk-LNV76GGB.js → chunk-AKOGQT3A.js} +2 -2
- package/dist/cli/chunks/{chunk-XMDZRULK.js → chunk-ATFADWGD.js} +2 -2
- package/dist/cli/chunks/{chunk-UDLN2THT.js → chunk-B65CRJN6.js} +1 -1
- package/dist/cli/chunks/{chunk-7DQLYWLR.js → chunk-B6USJW5E.js} +1 -1
- package/dist/cli/chunks/{chunk-NVJIOCS5.js → chunk-B7XPSXK6.js} +2 -2
- package/dist/cli/chunks/{chunk-IUVAWWQG.js → chunk-BA7PJS3Y.js} +2 -2
- package/dist/cli/chunks/{chunk-2RE32VOF.js → chunk-BFBZFUBP.js} +1 -1
- package/dist/cli/chunks/{chunk-KIBP3LGY.js → chunk-BHZI6PDR.js} +1 -1
- package/dist/cli/chunks/{chunk-EFRIMR74.js → chunk-BQ5EJPK3.js} +1 -1
- package/dist/cli/chunks/{chunk-3DS7ZHA7.js → chunk-CCDGNJZX.js} +2 -2
- package/dist/cli/chunks/{chunk-QOR4YAZY.js → chunk-CGKHG46K.js} +2 -2
- package/dist/cli/chunks/{chunk-3V5DAM37.js → chunk-CLZ5RQVA.js} +2 -2
- package/dist/cli/chunks/{chunk-H4V6WCF7.js → chunk-CYJ6O5VZ.js} +2 -2
- package/dist/cli/chunks/{chunk-X2OVUBF6.js → chunk-DNOBN3IR.js} +2 -2
- package/dist/cli/chunks/{chunk-AG4BYKUV.js → chunk-DPYNXEBC.js} +2 -2
- package/dist/cli/chunks/{chunk-76UVJLPM.js → chunk-DS7AZD26.js} +2 -2
- package/dist/cli/chunks/{chunk-7QICU44H.js → chunk-DZ7PWB6E.js} +2 -2
- package/dist/cli/chunks/{chunk-TOQJWLJV.js → chunk-DZZ4AJQI.js} +2 -2
- package/dist/cli/chunks/{chunk-N6RSJGTW.js → chunk-EBCUWMLX.js} +2 -2
- package/dist/cli/chunks/{chunk-FK3XYV3A.js → chunk-ECGASTG7.js} +2 -2
- package/dist/cli/chunks/{chunk-3IMEDZIS.js → chunk-ED7MD6OI.js} +3 -3
- package/dist/cli/chunks/{chunk-BOQNPFO5.js → chunk-EHEFI6LR.js} +1 -1
- package/dist/cli/chunks/{chunk-GUSW3OGX.js → chunk-EXCU4J7T.js} +1 -1
- package/dist/cli/chunks/{chunk-7GP7ZG3K.js → chunk-EZ4GKHSI.js} +2 -2
- package/dist/cli/chunks/{chunk-CZU5G6J4.js → chunk-FJRRXCIS.js} +1 -1
- package/dist/cli/chunks/{chunk-WEPZOCN7.js → chunk-FPKKKUWF.js} +1 -1
- package/dist/cli/chunks/{chunk-CIDTFU3C.js → chunk-FZLCKIPP.js} +2 -2
- package/dist/cli/chunks/{chunk-N6NSZG7Z.js → chunk-G6MPXBCD.js} +2 -2
- package/dist/cli/chunks/{chunk-KRUKMGPF.js → chunk-GBCDJJWH.js} +2 -2
- package/dist/cli/chunks/{chunk-72UPBNVF.js → chunk-GCIL7PK7.js} +2 -2
- package/dist/cli/chunks/{chunk-K3BBLIWW.js → chunk-H2YOWAEB.js} +2 -2
- package/dist/cli/chunks/{chunk-HOFEAA4R.js → chunk-H6YFMUFG.js} +1 -1
- package/dist/cli/chunks/{chunk-U5GCSSYX.js → chunk-H7Y43HBQ.js} +1 -1
- package/dist/cli/chunks/{chunk-6CH7476R.js → chunk-HRD5I7ES.js} +1 -1
- package/dist/cli/chunks/{chunk-LOPM3YIO.js → chunk-IJHPZMEQ.js} +2 -2
- package/dist/cli/chunks/{chunk-437XL5VZ.js → chunk-JVXPKHND.js} +2 -2
- package/dist/cli/chunks/{chunk-LSZLXLZA.js → chunk-JWTMVC6E.js} +2 -2
- package/dist/cli/chunks/{chunk-BVFNF3RW.js → chunk-KHUN65Q3.js} +1 -1
- package/dist/cli/chunks/{chunk-ATQTTGSE.js → chunk-KTYESESI.js} +2 -2
- package/dist/cli/chunks/{chunk-Z6ADE3KJ.js → chunk-KULBMV6K.js} +2 -2
- package/dist/cli/chunks/{chunk-H5GCRC2D.js → chunk-KXRI4MR3.js} +2 -2
- package/dist/cli/chunks/{chunk-VS2G6LX5.js → chunk-L44XXD3X.js} +2 -2
- package/dist/cli/chunks/{chunk-N4OWZLH5.js → chunk-L6PH7JIE.js} +2 -2
- package/dist/cli/chunks/{chunk-QEDS3MOJ.js → chunk-LGEZ3ZJX.js} +2 -2
- package/dist/cli/chunks/{chunk-QXDZN2WX.js → chunk-LKLWIP4Z.js} +1 -1
- package/dist/cli/chunks/{chunk-MX6M2VPB.js → chunk-LMA6KEZH.js} +1 -1
- package/dist/cli/chunks/{chunk-4565IIF6.js → chunk-LW5TUN5F.js} +2 -2
- package/dist/cli/chunks/{chunk-O5NF6BBD.js → chunk-MU36VPXV.js} +1 -1
- package/dist/cli/chunks/{chunk-3G25ZBQ6.js → chunk-MX5FMAY5.js} +1 -1
- package/dist/cli/chunks/{chunk-D4DAZ3P2.js → chunk-N2K2EQFH.js} +2 -2
- package/dist/cli/chunks/{chunk-5LDUW2FD.js → chunk-NBOEXSV2.js} +1 -1
- package/dist/cli/chunks/{chunk-5Y7GXQOM.js → chunk-NJ2RY4OL.js} +2 -2
- package/dist/cli/chunks/{chunk-PY4YQDBM.js → chunk-NWUVXLBB.js} +4 -4
- package/dist/cli/chunks/{chunk-JGHEGMLD.js → chunk-O7ZDQ5FF.js} +3 -3
- package/dist/cli/chunks/{chunk-OUSD2RWO.js → chunk-OCACCUFO.js} +2 -2
- package/dist/cli/chunks/{chunk-L2QHZFC3.js → chunk-OFMVC6P3.js} +1 -1
- package/dist/cli/chunks/{chunk-DZT4A7R3.js → chunk-OQGELUM2.js} +2 -2
- package/dist/cli/chunks/{chunk-O75SVMMB.js → chunk-OVEG5MEL.js} +2 -2
- package/dist/cli/chunks/{chunk-TUEDIQHY.js → chunk-P4UGVVVX.js} +1 -1
- package/dist/cli/chunks/{chunk-D6MPGK7R.js → chunk-PLQADRA6.js} +2 -2
- package/dist/cli/chunks/{chunk-OX2PGDUM.js → chunk-PMHSTMHV.js} +3 -3
- package/dist/cli/chunks/{chunk-QMN563LV.js → chunk-PSL53AQ4.js} +44 -44
- package/dist/cli/chunks/{chunk-7SRSOZMP.js → chunk-PUK5NE47.js} +1 -1
- package/dist/cli/chunks/{chunk-7OAKIXNM.js → chunk-PUUGIBFF.js} +2 -2
- package/dist/cli/chunks/{chunk-CXIFCN6G.js → chunk-PW4GGJMP.js} +1 -1
- package/dist/cli/chunks/{chunk-4RUS5E3Q.js → chunk-PY2Q6MN3.js} +6 -6
- package/dist/cli/chunks/{chunk-6YNXH6H4.js → chunk-Q2A2XQGF.js} +2 -2
- package/dist/cli/chunks/{chunk-4G4GTF36.js → chunk-QCCXH5DK.js} +4 -4
- package/dist/cli/chunks/{chunk-22FHOXEE.js → chunk-QPMISAWB.js} +1 -1
- package/dist/cli/chunks/{chunk-EQYDPF52.js → chunk-REZ2GZQ3.js} +1 -1
- package/dist/cli/chunks/{chunk-EZBXCEBV.js → chunk-RRSUW2TK.js} +2 -2
- package/dist/cli/chunks/{chunk-IVZVVZZ3.js → chunk-RWUGXU2K.js} +3 -3
- package/dist/cli/chunks/{chunk-BR4ERWVD.js → chunk-RXN5DWVM.js} +2 -2
- package/dist/cli/chunks/{chunk-XEVUW4QL.js → chunk-S2T2BXUL.js} +2 -2
- package/dist/cli/chunks/{chunk-IAHJ62JS.js → chunk-S7KDHA6P.js} +4 -4
- package/dist/cli/chunks/{chunk-6WNYBIPS.js → chunk-SFDBIO64.js} +2 -2
- package/dist/cli/chunks/{chunk-TCKBICJ3.js → chunk-SFGBC5RP.js} +2 -2
- package/dist/cli/chunks/{chunk-P7CMWL7Y.js → chunk-SIAJP3YA.js} +2 -2
- package/dist/cli/chunks/{chunk-QUTKELAS.js → chunk-SLU35IDJ.js} +2 -2
- package/dist/cli/chunks/{chunk-HYT5EMES.js → chunk-SMHYPPO6.js} +2 -2
- package/dist/cli/chunks/{chunk-BXLWERBR.js → chunk-SWRGPCZ2.js} +3 -3
- package/dist/cli/chunks/{chunk-B6U56VWG.js → chunk-UFZCHVLH.js} +1 -1
- package/dist/cli/chunks/{chunk-OUBYADPD.js → chunk-UMWYL37S.js} +2 -2
- package/dist/cli/chunks/chunk-UNH2DE2G.js +2 -0
- package/dist/cli/chunks/{chunk-S456W64P.js → chunk-UTGW75AZ.js} +2 -2
- package/dist/cli/chunks/{chunk-3D4HNUZM.js → chunk-VFEU4JM4.js} +2 -2
- package/dist/cli/chunks/{chunk-K7XPKGOL.js → chunk-VTDWQ7WI.js} +2 -2
- package/dist/cli/chunks/{chunk-4S3UIY3G.js → chunk-VUEYLW5P.js} +2 -2
- package/dist/cli/chunks/{chunk-B5EE63VE.js → chunk-WCVZHXWL.js} +2 -2
- package/dist/cli/chunks/{chunk-7WQKKYYG.js → chunk-WLLGPGQY.js} +1 -1
- package/dist/cli/chunks/{chunk-NKCL6RAF.js → chunk-WTKT2AD3.js} +2 -2
- package/dist/cli/chunks/{chunk-FOD6JEEU.js → chunk-WV66MXJI.js} +2 -2
- package/dist/cli/chunks/{chunk-ZRWAFMM7.js → chunk-WYJFVSEB.js} +2 -2
- package/dist/cli/chunks/{chunk-AL54LED5.js → chunk-XCSEJQXR.js} +2 -2
- package/dist/cli/chunks/{chunk-MILWEZSZ.js → chunk-XKUN5PDH.js} +3 -3
- package/dist/cli/chunks/{chunk-4BMPFEEG.js → chunk-YPRM6ZFL.js} +2 -2
- package/dist/cli/chunks/{chunk-4UHWZ47M.js → chunk-ZDPQB67L.js} +1 -1
- package/dist/cli/chunks/{chunk-NYWK7ZSX.js → chunk-ZM7WOA3K.js} +1 -1
- package/dist/cli/chunks/{ci-KTWY7BZT.js → ci-JW4O2J3W.js} +2 -2
- package/dist/cli/chunks/{ci-output-WOX6QBMS.js → ci-output-JNXJV4B2.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-6XKOSFIF.js → circuit-breaker-XDD4KUGR.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-5JA4MNE4.js → claude-flow-setup-L6IZOGYZ.js} +2 -2
- package/dist/cli/chunks/client-ADCDBTEE.js +2 -0
- package/dist/cli/chunks/{cline-installer-Z2ANHEKW.js → cline-installer-PK5SMN2B.js} +2 -2
- package/dist/cli/chunks/code-ZDVX3SQH.js +58 -0
- package/dist/cli/chunks/{code-index-extractor-VV4OEPG7.js → code-index-extractor-VXZNKEU5.js} +2 -2
- package/dist/cli/chunks/{codex-installer-BP7Y2NYR.js → codex-installer-OXKSIX7H.js} +2 -2
- package/dist/cli/chunks/{completions-YULJQUF4.js → completions-VRFFK223.js} +8 -5
- package/dist/cli/chunks/{complexity-analyzer-D7XYPQ76.js → complexity-analyzer-FTIMV74J.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-E3L7UF72.js → continuedev-installer-KTYBBPN4.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-5TRUMJC5.js → copilot-installer-WDC3YNUR.js} +2 -2
- package/dist/cli/chunks/core-handlers-HCACMLUW.js +2 -0
- package/dist/cli/chunks/{cost-tracker-QTYSJMSV.js → cost-tracker-6MH4H33B.js} +2 -2
- package/dist/cli/chunks/{coverage-D5DKZ3XT.js → coverage-NHATLNS4.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-HXFQAU4M.js +2 -0
- package/dist/cli/chunks/{cursor-installer-UDBHGUIG.js → cursor-installer-VQSUJDFB.js} +2 -2
- package/dist/cli/chunks/{daemon-2GXYN7F7.js → daemon-3VAOEKQW.js} +3 -3
- package/dist/cli/chunks/{daemon-IVWUMQKL.js → daemon-ZSK6CLQR.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-PWXR4QTU.js → dag-attention-scheduler-HZ6OGYIH.js} +2 -2
- package/dist/cli/chunks/{detect-C6P7ONFB.js → detect-CGU3SC63.js} +2 -2
- package/dist/cli/chunks/{dist-node-2BUFM2JK.js → dist-node-DIBQ7PTA.js} +2 -2
- package/dist/cli/chunks/{domain-handler-Q2GWZLDM.js → domain-handler-DCMGAYXS.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-GMUBAM3J.js → domain-transfer-UWFKBZTJ.js} +2 -2
- package/dist/cli/chunks/dream-SVWQH62A.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-EFUERRM2.js → embed-and-insert-pattern-7247LAU3.js} +2 -2
- package/dist/cli/chunks/{eval-24FIC43F.js → eval-6KR7TFOK.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-R4UP2Q2M.js → experience-capture-middleware-IIOR6RVV.js} +3 -3
- package/dist/cli/chunks/{fast-paths-RQCGGTXB.js → fast-paths-M7OGD4ZI.js} +2 -2
- package/dist/cli/chunks/{feature-flags-SOXVYIBN.js → feature-flags-GGUXHRJI.js} +2 -2
- package/dist/cli/chunks/{feature-flags-APTWWVNQ.js → feature-flags-U75KFIGH.js} +2 -2
- package/dist/cli/chunks/{file-discovery-66KRMXVF.js → file-discovery-V52AYEB7.js} +2 -2
- package/dist/cli/chunks/{fleet-EMBNKO5Q.js → fleet-2UH72CK4.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-6TKDWFJF.js → gnn-wrapper-J2GDLT3P.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-4ODKJ75H.js → heartbeat-handler-QIDQHRXT.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-QW5TW5QS.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-D6EJWYAL.js +2 -0
- package/dist/cli/chunks/hnsw-index-4MWR4U5W.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-25KFCLUC.js → hnsw-legacy-bridge-IU62PIY5.js} +2 -2
- package/dist/cli/chunks/{better-sqlite3-MJNUEPYB.js → hnswlib-node-EBRXKEX5.js} +2 -2
- package/dist/cli/chunks/{hooks-JIDA2COE.js → hooks-ZI4D3ATS.js} +10 -10
- package/dist/cli/chunks/hybrid-router-BYVUBHER.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-3YDFDPE3.js → hypergraph-engine-6JEERAGA.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-VWZX2OJX.js → hypergraph-handler-YMDGYCB6.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-OK2UIMSG.js +2 -0
- package/dist/cli/chunks/{init-handler-DH7VQAMF.js → init-handler-N57NW3QI.js} +6 -6
- package/dist/cli/chunks/init-wizard-6NNPNS6J.js +2 -0
- package/dist/cli/chunks/kernel-F4A4GRNO.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-2W2KZCGH.js → kilocode-installer-7ABTGXJ5.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-E5KP7OMD.js → kiro-installer-2JFOHLVI.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-MSJDEZCF.js +2 -0
- package/dist/cli/chunks/{learning-XJRUVPLF.js → learning-3P3ZXRGD.js} +3 -3
- package/dist/cli/chunks/{llm-router-AEEKEMF5.js → llm-router-AWB2KHDW.js} +4 -4
- package/dist/cli/chunks/llm-router-service-27IQAO7G.js +2 -0
- package/dist/cli/chunks/{load-PZ4YOTBJ.js → load-GGVBCBGX.js} +2 -2
- package/dist/cli/chunks/load-test-TT5VLAN7.js +2 -0
- package/dist/cli/chunks/{mcp-IVA6LC2S.js → mcp-33NHIBN3.js} +2 -2
- package/dist/cli/chunks/{memory-Y3DHXFQE.js → memory-IVAQS4OW.js} +5 -5
- package/dist/cli/chunks/memory-backend-FVSK53IM.js +2 -0
- package/dist/cli/chunks/{memory-handlers-V5PXEJWL.js → memory-handlers-OPUDOZNT.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-646G4S4Y.js → multi-model-executor-NWQY6IN2.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-P6KOOTUS.js → opencode-installer-FBB4JOEV.js} +2 -2
- package/dist/cli/chunks/{orchestrator-T2GVKYMX.js → orchestrator-GDAXR7DH.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-7MVEDWCY.js +2 -0
- package/dist/cli/chunks/{pipeline-CK2ON45P.js → pipeline-VIKAOIBE.js} +2 -2
- package/dist/cli/chunks/{platform-OQNSD3A3.js → platform-FFVP36LH.js} +2 -2
- package/dist/cli/chunks/{plugin-UOG6RNRM.js → plugin-TI6QOLXH.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-37UE6TG5.js → prime-radiant-advanced-wasm-AZRNI2OL.js} +2 -2
- package/dist/cli/chunks/protocol-executor-BLDDYEJ4.js +2 -0
- package/dist/cli/chunks/{protocol-handler-V722S6YH.js → protocol-handler-J4EA34B3.js} +2 -2
- package/dist/cli/chunks/{prove-ANGY6W3W.js → prove-ADVRMAWS.js} +2 -2
- package/dist/cli/chunks/provider-manager-ZYCFRYZQ.js +2 -0
- package/dist/cli/chunks/qe-reasoning-bank-P66CCPHM.js +2 -0
- package/dist/cli/chunks/{quality-KG4ALI2L.js → quality-GB5SJFSD.js} +2 -2
- package/dist/cli/chunks/queen-coordinator-LPHT3SX5.js +2 -0
- package/dist/cli/chunks/{real-embeddings-GUZDO5UN.js → real-embeddings-GDRJ4XSH.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-WROAR6MJ.js → roocode-installer-Q6EISUDV.js} +2 -2
- package/dist/cli/chunks/router-XQ2TERUT.js +2 -0
- package/dist/cli/chunks/routing-feedback-K52O752B.js +2 -0
- package/dist/cli/chunks/{routing-handler-UFPSSS5D.js → routing-handler-RO4RTRAG.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-XJQMKDRM.js → ruvector-commands-FFIHCGVQ.js} +2 -2
- package/dist/cli/chunks/{rvf-dual-writer-QPRMDKYX.js → rvf-dual-writer-JGEK3A5Y.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-adapter-SOHBK23K.js → rvf-migration-adapter-OVYC4QM6.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-coordinator-MTWUSPEJ.js → rvf-migration-coordinator-U6L77QTS.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-G4DV7FK3.js +2 -0
- package/dist/cli/chunks/safe-db-TMSEITES.js +2 -0
- package/dist/cli/chunks/schedule-RWFLA43O.js +2 -0
- package/dist/cli/chunks/scheduler-2V55MJJR.js +2 -0
- package/dist/cli/chunks/{security-5MAMQKP6.js → security-QPQIDAIL.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-YEUBSRNN.js → shared-rvf-adapter-JRJTI4UD.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-DBQJHG42.js → shared-rvf-dual-writer-DSHGURDA.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-L7QM6IWF.js +2 -0
- package/dist/cli/chunks/{status-handler-ZUB2UKQZ.js → status-handler-SBT3MZTX.js} +2 -2
- package/dist/cli/chunks/{structural-health-B2GHENWX.js → structural-health-UVECCN7U.js} +2 -2
- package/dist/cli/chunks/{sync-7VMXJTR2.js → sync-XXIGTGCG.js} +2 -2
- package/dist/cli/chunks/{sync-YCUUW3IP.js → sync-ZLZ4CZFJ.js} +2 -2
- package/dist/cli/chunks/{task-handler-N7LJTXZM.js → task-handler-73YAVOKJ.js} +2 -2
- package/dist/cli/chunks/{task-handlers-GDHNJV2E.js → task-handlers-PKECV27D.js} +3 -3
- package/dist/cli/chunks/{test-6COGC5KI.js → test-U3SXW4SV.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-CUERHJMF.js → test-scheduling-POJND3GV.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-JTGSL6PP.js → token-bootstrap-ICX6SIXJ.js} +2 -2
- package/dist/cli/chunks/{token-usage-LSG3JYGX.js → token-usage-WCHJUVGT.js} +2 -2
- package/dist/cli/chunks/{transformers-ODIITRCT.js → transformers-L77UIHIY.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-KSP7ZZ5H.js → tree-sitter-wasm-parser-CVAXURQP.js} +2 -2
- package/dist/cli/chunks/{types-6N6SUU2O.js → types-LNVJBDM2.js} +2 -2
- package/dist/cli/chunks/unified-memory-ZSULA46X.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-SQEWFUBN.js +2 -0
- package/dist/cli/chunks/unified-persistence-EDCTT6SE.js +2 -0
- package/dist/cli/chunks/{upgrade-7SCVOCPS.js → upgrade-4ND5RQFY.js} +2 -2
- package/dist/cli/chunks/{validate-762ISH2Y.js → validate-ZA4XT6K2.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-R6WYYXGO.js → validate-swarm-FNK3GCJ4.js} +2 -2
- package/dist/cli/chunks/{vibium-5GZYSUDQ.js → vibium-E2CK2GBQ.js} +2 -2
- package/dist/cli/chunks/visual-security-SOGAETFP.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-VYYVAJTY.js → web-tree-sitter-63VRNKZV.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-RRIOR3B6.js → windsurf-installer-5BTCVOLH.js} +2 -2
- package/dist/cli/chunks/{witness-chain-SRVBEKDB.js → witness-chain-6CUUGISD.js} +2 -2
- package/dist/cli/chunks/witness-chain-AJCECBH5.js +2 -0
- package/dist/cli/chunks/{workflow-XNUDHGEC.js → workflow-V7ED22XT.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-UXRUCOZR.js +2 -0
- package/dist/cli/chunks/{wrappers-3STST7QW.js → wrappers-7S3NTTLW.js} +2 -2
- package/dist/cli/commands/code.js +78 -2
- package/dist/cli/completions/index.js +4 -1
- package/dist/domains/code-intelligence/coordinator.js +8 -4
- package/dist/domains/code-intelligence/services/c4-model/from-detected.d.ts +41 -0
- package/dist/domains/code-intelligence/services/c4-model/from-detected.js +152 -0
- package/dist/domains/code-intelligence/services/c4-model/kg-relationships.d.ts +71 -0
- package/dist/domains/code-intelligence/services/c4-model/kg-relationships.js +87 -0
- package/dist/domains/code-intelligence/services/knowledge-graph.d.ts +6 -0
- package/dist/domains/code-intelligence/services/knowledge-graph.js +3 -3
- package/dist/domains/code-intelligence/services/product-factors-bridge.d.ts +26 -5
- package/dist/domains/code-intelligence/services/product-factors-bridge.js +72 -65
- package/dist/feedback/regenerability-gate.d.ts +70 -0
- package/dist/feedback/regenerability-gate.js +91 -0
- package/dist/mcp/bundle.js +429 -454
- package/dist/mcp/tools/code-intelligence/c4.d.ts +56 -0
- package/dist/mcp/tools/code-intelligence/c4.js +145 -0
- package/dist/mcp/tools/index.d.ts +1 -0
- package/dist/mcp/tools/index.js +1 -0
- package/dist/mcp/tools/registry.d.ts +1 -0
- package/dist/mcp/tools/registry.js +3 -0
- package/dist/shared/c4-model/confidence.d.ts +38 -0
- package/dist/shared/c4-model/confidence.js +69 -0
- package/dist/shared/c4-model/index.d.ts +4 -0
- package/dist/shared/c4-model/index.js +1 -0
- package/dist/shared/llm/providers/gemini.js +16 -10
- package/dist/shared/llm/providers/openrouter.js +20 -20
- 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 +8 -1
- package/dist/cli/chunks/adapter-A6GCBONS.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-FRCSXNMG.js +0 -2
- package/dist/cli/chunks/base-CZ3EHBU5.js +0 -2
- package/dist/cli/chunks/browser-workflow-EKTGQQBQ.js +0 -2
- package/dist/cli/chunks/chunk-57WGS6BI.js +0 -2
- package/dist/cli/chunks/client-X3KUJ6R5.js +0 -2
- package/dist/cli/chunks/code-NO4ZKNDU.js +0 -39
- package/dist/cli/chunks/core-handlers-A2EQB3UH.js +0 -2
- package/dist/cli/chunks/cross-domain-router-OKZ2PDHT.js +0 -2
- package/dist/cli/chunks/dream-ZBP4Z5C3.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-6JUWQXWG.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-JT4BU7XJ.js +0 -2
- package/dist/cli/chunks/hnsw-index-JC5YELJX.js +0 -2
- package/dist/cli/chunks/hybrid-router-SLTXHUFG.js +0 -2
- package/dist/cli/chunks/impact-analyzer-JXHCMZXY.js +0 -2
- package/dist/cli/chunks/init-wizard-EX37TYOG.js +0 -2
- package/dist/cli/chunks/kernel-JPHAG27D.js +0 -2
- package/dist/cli/chunks/knowledge-graph-5QJZIRYB.js +0 -2
- package/dist/cli/chunks/llm-router-service-SE2RO4P5.js +0 -2
- package/dist/cli/chunks/load-test-LOTBWIIS.js +0 -2
- package/dist/cli/chunks/memory-backend-BSDKTFAN.js +0 -2
- package/dist/cli/chunks/pattern-null-store-LRSXCZWM.js +0 -2
- package/dist/cli/chunks/protocol-executor-WPUVJEL7.js +0 -2
- package/dist/cli/chunks/provider-manager-EVPWSH3E.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-IH63FG33.js +0 -2
- package/dist/cli/chunks/queen-coordinator-TTCAGYQO.js +0 -2
- package/dist/cli/chunks/router-64Q4ILOQ.js +0 -2
- package/dist/cli/chunks/routing-feedback-KCZV4XXC.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-GNJKMURU.js +0 -2
- package/dist/cli/chunks/safe-db-6VBZQIJI.js +0 -2
- package/dist/cli/chunks/schedule-4V7O5IPX.js +0 -2
- package/dist/cli/chunks/scheduler-CQDMHEHN.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-7DHUFTHL.js +0 -2
- package/dist/cli/chunks/unified-memory-MQA72NLP.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-K7HA3CWV.js +0 -2
- package/dist/cli/chunks/unified-persistence-2DXB4OE4.js +0 -2
- package/dist/cli/chunks/visual-security-UD6CARIJ.js +0 -2
- package/dist/cli/chunks/witness-chain-LWALPPMC.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-QU652FLH.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,77 @@ 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.3] - 2026-06-27
|
|
9
|
+
|
|
10
|
+
Tests and evals you can actually trust, cheaper model options, and a guard that
|
|
11
|
+
keeps AQE's commands and outputs stable for your scripts.
|
|
12
|
+
|
|
13
|
+
AQE now grades a generated test by **running it** — against the real code (it must
|
|
14
|
+
pass) and against deliberately-broken versions (it must catch them) — instead of
|
|
15
|
+
checking for keywords. Test generation leads with **durable tests** (invariants,
|
|
16
|
+
contracts, properties) that survive a rewrite, and quality reports add a
|
|
17
|
+
**mutation-score / regenerability** signal next to coverage. See the new
|
|
18
|
+
[oracle-evals plan](docs/plans/oracle-evals-durable-tests-plan.md) (ADR-113) and the
|
|
19
|
+
[conservation-layer policy](docs/guides/conservation-layer-policy.md) (ADR-114).
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- **Oracle evals** — skill evals run the generated test against a reference
|
|
24
|
+
implementation plus seeded mutants; an assertion-less or wrong test is rejected.
|
|
25
|
+
- **Durable-first test generation** — `qe-test-generation` now emits invariants,
|
|
26
|
+
contracts, and property-based tests first (with a "would this survive a rewrite?"
|
|
27
|
+
check), keeping happy-path/mock tests as a labeled, disposable tier.
|
|
28
|
+
- **Regenerability gate** — `qe-quality-assessment` reports mutation score + a
|
|
29
|
+
per-module regenerability score alongside coverage (warn by default, opt-in blocking).
|
|
30
|
+
- **Conservation guard** — `npm run verify:conservation` + `verify:skill-parity` catch
|
|
31
|
+
breaking changes to CLI commands, report output schemas, the dashboard API, and skill
|
|
32
|
+
trees, with a deprecation policy so removals are deliberate and announced.
|
|
33
|
+
- **Cheaper model lanes** — pick a budget or local model for test generation and prove
|
|
34
|
+
it clears the oracle: `npm run providers:health`, `eval:models`, `eval:live:*`. See the
|
|
35
|
+
[cheaper-model guide](docs/guides/cheaper-model-eval-lanes.md).
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
|
|
39
|
+
- **OpenRouter provider** now works through the provider manager (it previously failed
|
|
40
|
+
to route because it identified itself as `openai`).
|
|
41
|
+
- **Gemini provider** default model updated to a current model (`gemini-2.5-flash`); the
|
|
42
|
+
old default had been retired by Google. Supported-model list and pricing refreshed.
|
|
43
|
+
|
|
44
|
+
## [3.11.2] - 2026-06-27
|
|
45
|
+
|
|
46
|
+
First-class **C4 architecture diagrams** generated straight from your codebase —
|
|
47
|
+
with a confidence score so you know how much to trust them. AQE detects your
|
|
48
|
+
components, the external systems they depend on, and their *real* relationships
|
|
49
|
+
(from the code's import/call graph), renders standard [C4](https://c4model.com/)
|
|
50
|
+
Mermaid you can paste into GitHub or an IDE, and exposes it through both the CLI
|
|
51
|
+
and an MCP tool.
|
|
52
|
+
|
|
53
|
+
See the new [C4 architecture diagrams guide](docs/guides/c4-architecture-diagrams.md).
|
|
54
|
+
|
|
55
|
+
### Added
|
|
56
|
+
|
|
57
|
+
- **`aqe code c4 <path>`** — generate Context / Container / Component C4 diagrams
|
|
58
|
+
(Mermaid) for a repository, with `--level context|container|component|all`,
|
|
59
|
+
`--format text|json`, and `-o <file>`.
|
|
60
|
+
- **`qe/code/c4` MCP tool** — the same generation for agents and IDEs, plus
|
|
61
|
+
semantic `search` over previously generated diagrams.
|
|
62
|
+
- **Confidence gate** — every diagram is scored high / medium / low (deterministic,
|
|
63
|
+
no AI judging another AI) with the reasons, so an auto-detected diagram is never
|
|
64
|
+
presented as ground truth. Large or under-segmented repos are flagged as drafts.
|
|
65
|
+
- **Real relationships from the Knowledge Graph** — component arrows now come from
|
|
66
|
+
actual import/call edges (AST), not name-based guessing.
|
|
67
|
+
|
|
68
|
+
### Changed
|
|
69
|
+
|
|
70
|
+
- C4 generation is consolidated onto a single engine. On a render failure it now
|
|
71
|
+
**reports the error** instead of silently falling back to a weaker diagram.
|
|
72
|
+
|
|
73
|
+
### Fixed
|
|
74
|
+
|
|
75
|
+
- Knowledge Graph file reads can be scoped to a project root, so analyzing a
|
|
76
|
+
repository outside the current working directory no longer trips the file-path
|
|
77
|
+
safety guard.
|
|
78
|
+
|
|
8
79
|
## [3.11.1] - 2026-06-25
|
|
9
80
|
|
|
10
81
|
Benchmark-driven deepening of the opt-in "cheap-first" test generation from
|
package/README.md
CHANGED
|
@@ -359,6 +359,7 @@ aqe code search "authentication" # Semantic code search
|
|
|
359
359
|
aqe code impact src/ # Change impact analysis
|
|
360
360
|
aqe code deps src/ # Dependency mapping
|
|
361
361
|
aqe code complexity src/ # Complexity metrics and hotspots
|
|
362
|
+
aqe code c4 . # C4 architecture diagrams (Mermaid) + confidence
|
|
362
363
|
```
|
|
363
364
|
|
|
364
365
|
---
|
|
@@ -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
|
```
|