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.
Files changed (364) hide show
  1. package/.claude/skills/.validation/templates/eval.template.yaml +36 -0
  2. package/.claude/skills/qe-quality-assessment/SKILL.md +25 -0
  3. package/.claude/skills/qe-test-generation/SKILL.md +58 -20
  4. package/.claude/skills/qe-test-generation/evals/qe-test-generation.yaml +37 -0
  5. package/.claude/skills/skills-manifest.json +1 -1
  6. package/CHANGELOG.md +84 -0
  7. package/assets/skills/.validation/templates/eval.template.yaml +36 -0
  8. package/assets/skills/enterprise-integration-testing/SKILL.md +1 -1
  9. package/assets/skills/pentest-validation/SKILL.md +1 -1
  10. package/assets/skills/qcsd-development-swarm/SKILL.md +27 -6
  11. package/assets/skills/qe-quality-assessment/SKILL.md +25 -0
  12. package/assets/skills/qe-test-generation/SKILL.md +58 -20
  13. package/assets/skills/qe-test-generation/evals/qe-test-generation.yaml +37 -0
  14. package/dist/cli/bundle.js +5 -5
  15. package/dist/cli/chunks/adapter-2HMUXHWY.js +2 -0
  16. package/dist/cli/chunks/{agent-booster-wasm-FNCVODUJ.js → agent-booster-wasm-62I6ZNRW.js} +2 -2
  17. package/dist/cli/chunks/{agent-handler-JK7VK37B.js → agent-handler-E2TZKKBS.js} +2 -2
  18. package/dist/cli/chunks/{agent-memory-branch-EPVVJNNA.js → agent-memory-branch-JHAHC2NH.js} +2 -2
  19. package/dist/cli/chunks/aqe-learning-engine-M2NKRVRE.js +2 -0
  20. package/dist/cli/chunks/{arena-EH2IMSRW.js → arena-72ZV65BR.js} +4 -4
  21. package/dist/cli/chunks/{arena-NTHVDZTJ.js → arena-KLG3YSSR.js} +2 -2
  22. package/dist/cli/chunks/{audit-ODZV2T2B.js → audit-EPB7ETMT.js} +2 -2
  23. package/dist/cli/chunks/base-CCHC2DAC.js +2 -0
  24. package/dist/cli/chunks/{hnswlib-node-2KL54YUA.js → better-sqlite3-URULPKRF.js} +2 -2
  25. package/dist/cli/chunks/{brain-handler-NVB6OJ25.js → brain-handler-FBMYEERK.js} +3 -3
  26. package/dist/cli/chunks/{branch-enumerator-BIXSELMY.js → branch-enumerator-C7MPNYT7.js} +2 -2
  27. package/dist/cli/chunks/{browser-S2Y2W33Z.js → browser-UUDUDYLR.js} +2 -2
  28. package/dist/cli/chunks/browser-workflow-4DGHFYY3.js +2 -0
  29. package/dist/cli/chunks/{chunk-XXCSJMSR.js → chunk-2KNFS3L5.js} +1 -1
  30. package/dist/cli/chunks/{chunk-I7UWFV6N.js → chunk-2WPSMQIL.js} +1 -1
  31. package/dist/cli/chunks/chunk-37ZDGJ3H.js +2 -0
  32. package/dist/cli/chunks/{chunk-JELN5XTK.js → chunk-3E7D3A35.js} +1 -1
  33. package/dist/cli/chunks/{chunk-ZBJMVWQR.js → chunk-3FJZMQJ7.js} +2 -2
  34. package/dist/cli/chunks/chunk-3SBUL72V.js +2 -0
  35. package/dist/cli/chunks/{chunk-O3IIAIXB.js → chunk-3SKIZDKL.js} +1 -1
  36. package/dist/cli/chunks/{chunk-LAY35POY.js → chunk-3SRPFBU7.js} +3 -3
  37. package/dist/cli/chunks/{chunk-6VAFRS5N.js → chunk-4BFCLSDN.js} +2 -2
  38. package/dist/cli/chunks/{chunk-NZNXEEZR.js → chunk-4JFH3MVA.js} +1 -1
  39. package/dist/cli/chunks/{chunk-C6UTRG66.js → chunk-4RHNPRAP.js} +2 -2
  40. package/dist/cli/chunks/{chunk-3NCVUFAL.js → chunk-4YT5YN5G.js} +2 -2
  41. package/dist/cli/chunks/{chunk-P3VRXQ3H.js → chunk-54B6P2WS.js} +3 -3
  42. package/dist/cli/chunks/{chunk-H5TM4KIB.js → chunk-5AQ7FXYG.js} +2 -2
  43. package/dist/cli/chunks/{chunk-WARFZ626.js → chunk-5P7Q5YNC.js} +1 -1
  44. package/dist/cli/chunks/{chunk-ARUXFZDY.js → chunk-5U2WHPXL.js} +1 -1
  45. package/dist/cli/chunks/{chunk-MAXOIEUG.js → chunk-5VSQAGA2.js} +1 -1
  46. package/dist/cli/chunks/{chunk-CEMROADY.js → chunk-5Z4FBCBK.js} +1 -1
  47. package/dist/cli/chunks/{chunk-I3AD523O.js → chunk-63QUN3JK.js} +1 -1
  48. package/dist/cli/chunks/{chunk-4FTVTAMN.js → chunk-6545AS2J.js} +2 -2
  49. package/dist/cli/chunks/{chunk-5BDVFFYF.js → chunk-6GYGAW53.js} +2 -2
  50. package/dist/cli/chunks/{chunk-OC2W7KIW.js → chunk-6JUOH6L4.js} +2 -2
  51. package/dist/cli/chunks/{chunk-YDPBCN7H.js → chunk-6W3QHS45.js} +2 -2
  52. package/dist/cli/chunks/{chunk-WKIYYF3G.js → chunk-7ADD2ZQL.js} +2 -2
  53. package/dist/cli/chunks/{chunk-7MKF52GT.js → chunk-7AWK43JN.js} +2 -2
  54. package/dist/cli/chunks/{chunk-FV53RMVB.js → chunk-7IKWF2AD.js} +1 -1
  55. package/dist/cli/chunks/{chunk-UCXW24HY.js → chunk-7QTB5XIQ.js} +2 -2
  56. package/dist/cli/chunks/{chunk-HDBJORV7.js → chunk-A4OMK3FO.js} +2 -2
  57. package/dist/cli/chunks/{chunk-DMUQV2YU.js → chunk-ADFKY3X2.js} +2 -2
  58. package/dist/cli/chunks/{chunk-SE4S23C7.js → chunk-AE6HXMOG.js} +1 -1
  59. package/dist/cli/chunks/{chunk-ZH6HYT7C.js → chunk-AJXGGTX7.js} +1 -1
  60. package/dist/cli/chunks/{chunk-CMVNYVKL.js → chunk-AQIEK4SY.js} +2 -2
  61. package/dist/cli/chunks/{chunk-H4ZPPHOI.js → chunk-ARPBG6FQ.js} +2 -2
  62. package/dist/cli/chunks/{chunk-X36TZXDK.js → chunk-AYGEWPN4.js} +1 -1
  63. package/dist/cli/chunks/{chunk-JSZNI3AO.js → chunk-B5XUWHKQ.js} +1 -1
  64. package/dist/cli/chunks/{chunk-76RO2RHG.js → chunk-BMQDELPA.js} +1 -1
  65. package/dist/cli/chunks/{chunk-26ZMIYSK.js → chunk-BRLUNIR4.js} +2 -2
  66. package/dist/cli/chunks/{chunk-H6MBRYA7.js → chunk-CNF3ZWLM.js} +2 -2
  67. package/dist/cli/chunks/{chunk-XRDPGJNW.js → chunk-D5S47YUS.js} +2 -2
  68. package/dist/cli/chunks/{chunk-S6BWEZKK.js → chunk-D6CKKNYC.js} +2 -2
  69. package/dist/cli/chunks/{chunk-K6IQBVD7.js → chunk-DNOU2HVQ.js} +2 -2
  70. package/dist/cli/chunks/{chunk-DPFLJMEI.js → chunk-DRMHVY4T.js} +4 -4
  71. package/dist/cli/chunks/{chunk-3ATEYGVD.js → chunk-EONKMHKO.js} +2 -2
  72. package/dist/cli/chunks/{chunk-6LQIVIZB.js → chunk-EZRHSHOQ.js} +2 -2
  73. package/dist/cli/chunks/{chunk-WEBHFIWS.js → chunk-FRFVN6AA.js} +2 -2
  74. package/dist/cli/chunks/{chunk-YJUJCLXV.js → chunk-FSGMRQFC.js} +2 -2
  75. package/dist/cli/chunks/{chunk-OFUF3APC.js → chunk-G3TFNY4T.js} +2 -2
  76. package/dist/cli/chunks/{chunk-PPD5ZLNA.js → chunk-GOQ4P2PB.js} +2 -2
  77. package/dist/cli/chunks/chunk-GRQ36XUH.js +24 -0
  78. package/dist/cli/chunks/{chunk-LI3T5YNC.js → chunk-HH6NCBSP.js} +3 -3
  79. package/dist/cli/chunks/{chunk-NPT7BYGF.js → chunk-HJ24KMC2.js} +1 -1
  80. package/dist/cli/chunks/{chunk-AK5Q2WCJ.js → chunk-HJO4RNOW.js} +2 -2
  81. package/dist/cli/chunks/{chunk-VNFL2TPU.js → chunk-HT6WAYIR.js} +1 -1
  82. package/dist/cli/chunks/{chunk-IO7ZUP2G.js → chunk-HWBMYR5W.js} +3 -3
  83. package/dist/cli/chunks/{chunk-AKZK46TQ.js → chunk-IB3ZPLFA.js} +2 -2
  84. package/dist/cli/chunks/{chunk-EDH4H55B.js → chunk-ICCTQ5LO.js} +2 -2
  85. package/dist/cli/chunks/{chunk-P7MIOTVP.js → chunk-IF3HPQNV.js} +1 -1
  86. package/dist/cli/chunks/{chunk-DU4GQKTH.js → chunk-IQBZBUP5.js} +2 -2
  87. package/dist/cli/chunks/{chunk-LFXXA325.js → chunk-JCTCM6IR.js} +1 -1
  88. package/dist/cli/chunks/{chunk-K426HTEQ.js → chunk-JDFPAJGB.js} +10 -10
  89. package/dist/cli/chunks/{chunk-CAVBEZV4.js → chunk-JFLSQH2X.js} +2 -2
  90. package/dist/cli/chunks/{chunk-P5SGBQLY.js → chunk-JNQN5DNS.js} +1 -1
  91. package/dist/cli/chunks/{chunk-A4ZDKF5F.js → chunk-JPENUVCI.js} +1 -1
  92. package/dist/cli/chunks/{chunk-5AFO7ZZG.js → chunk-KUZMVH6N.js} +3 -3
  93. package/dist/cli/chunks/{chunk-KFE6LB4I.js → chunk-KYTFIP6R.js} +2 -2
  94. package/dist/cli/chunks/{chunk-OU52V67H.js → chunk-LKURMUBU.js} +4 -4
  95. package/dist/cli/chunks/{chunk-JCH2FHJ7.js → chunk-LLUPRGOR.js} +2 -2
  96. package/dist/cli/chunks/{chunk-5KMGG3QW.js → chunk-LMJUMUQJ.js} +4 -4
  97. package/dist/cli/chunks/{chunk-Y4M2HMPR.js → chunk-LW5DHT3Z.js} +2 -2
  98. package/dist/cli/chunks/{chunk-JC4Z2ADP.js → chunk-MALOUGSF.js} +2 -2
  99. package/dist/cli/chunks/{chunk-7VM4ZUHT.js → chunk-MCT4CD5M.js} +2 -2
  100. package/dist/cli/chunks/{chunk-FPZLOVEF.js → chunk-MWFJC5HR.js} +1 -1
  101. package/dist/cli/chunks/{chunk-7KHZZVF2.js → chunk-MYMIEQSZ.js} +4 -4
  102. package/dist/cli/chunks/{chunk-EIWZDVMT.js → chunk-N2BJN6AO.js} +3 -3
  103. package/dist/cli/chunks/{chunk-3J3QXLWP.js → chunk-NBBLPDJX.js} +2 -2
  104. package/dist/cli/chunks/{chunk-PFDILSVO.js → chunk-NFJT7XXR.js} +1 -1
  105. package/dist/cli/chunks/{chunk-IXYF5BZY.js → chunk-NSPCZPTB.js} +2 -2
  106. package/dist/cli/chunks/{chunk-YWG4LHFU.js → chunk-NV3TXXOW.js} +2 -2
  107. package/dist/cli/chunks/{chunk-ZU3V4CJ4.js → chunk-O5NEJIHB.js} +2 -2
  108. package/dist/cli/chunks/{chunk-QZLTIGLB.js → chunk-O7PVZ32A.js} +1 -1
  109. package/dist/cli/chunks/{chunk-42DCMEUM.js → chunk-ODZSQVEW.js} +1 -1
  110. package/dist/cli/chunks/{chunk-G6LIQFT2.js → chunk-P6S6ZVB5.js} +1 -1
  111. package/dist/cli/chunks/{chunk-FYY7OJ6Y.js → chunk-PEIQDQXN.js} +2 -2
  112. package/dist/cli/chunks/{chunk-WZC4HKGZ.js → chunk-PFWJQPUC.js} +2 -2
  113. package/dist/cli/chunks/{chunk-6SOGYNJG.js → chunk-PQUXFSN6.js} +2 -2
  114. package/dist/cli/chunks/{chunk-P2RR4SW5.js → chunk-Q7ORVHJB.js} +3 -3
  115. package/dist/cli/chunks/{chunk-2Q65LTJN.js → chunk-QEVX4GWF.js} +2 -2
  116. package/dist/cli/chunks/{chunk-AINAWVGD.js → chunk-QJ5NCYJ3.js} +2 -2
  117. package/dist/cli/chunks/{chunk-75C5GX7D.js → chunk-QMC5MTBV.js} +2 -2
  118. package/dist/cli/chunks/{chunk-H3LGBH4Y.js → chunk-QSDIY3E2.js} +1 -1
  119. package/dist/cli/chunks/chunk-RCPD6F4R.js +2 -0
  120. package/dist/cli/chunks/{chunk-XNREA3FG.js → chunk-RFQBDMAP.js} +1 -1
  121. package/dist/cli/chunks/{chunk-KO3WB4SU.js → chunk-SFDUT5WM.js} +2 -2
  122. package/dist/cli/chunks/{chunk-YGR54EAA.js → chunk-SL3SNOO2.js} +2 -2
  123. package/dist/cli/chunks/{chunk-QFJDR4HC.js → chunk-SRVTNG6L.js} +2 -2
  124. package/dist/cli/chunks/{chunk-TOGZ37RL.js → chunk-T76RFXQX.js} +2 -2
  125. package/dist/cli/chunks/{chunk-AAVUZVM6.js → chunk-TCVEKRPI.js} +2 -2
  126. package/dist/cli/chunks/{chunk-AZQ6HDPM.js → chunk-TCWR6TDN.js} +2 -2
  127. package/dist/cli/chunks/{chunk-ZP2GE6DM.js → chunk-THKZVOZV.js} +1 -1
  128. package/dist/cli/chunks/{chunk-4PYJCIRO.js → chunk-TPMBFARK.js} +31 -26
  129. package/dist/cli/chunks/{chunk-NIW4CLN2.js → chunk-TQ373GGI.js} +2 -2
  130. package/dist/cli/chunks/{chunk-CUDGKSFX.js → chunk-TSWF3AGQ.js} +2 -2
  131. package/dist/cli/chunks/{chunk-MN6W7ZNL.js → chunk-TU6YN43Q.js} +1 -1
  132. package/dist/cli/chunks/{chunk-CAUTOCLZ.js → chunk-U34OZXD6.js} +2 -2
  133. package/dist/cli/chunks/{chunk-AYXRT2ND.js → chunk-U3AVZGQA.js} +1 -1
  134. package/dist/cli/chunks/{chunk-NGE5YNKC.js → chunk-UCYTY4LG.js} +2 -2
  135. package/dist/cli/chunks/{chunk-LRJWKFGY.js → chunk-UJMTKXPI.js} +2 -2
  136. package/dist/cli/chunks/{chunk-BGVEBYV4.js → chunk-UQ72K44T.js} +2 -2
  137. package/dist/cli/chunks/{chunk-XY2B2BEJ.js → chunk-VCUCD3B5.js} +2 -2
  138. package/dist/cli/chunks/{chunk-LY6PTRVL.js → chunk-VJGHRWMH.js} +2 -2
  139. package/dist/cli/chunks/{chunk-ZRU3OZEU.js → chunk-VKJQAKYG.js} +2 -2
  140. package/dist/cli/chunks/{chunk-XY4JS3IZ.js → chunk-VO6YJGB4.js} +2 -2
  141. package/dist/cli/chunks/{chunk-RHSUXQNF.js → chunk-VQU7DMEY.js} +2 -2
  142. package/dist/cli/chunks/{chunk-27KNLVOY.js → chunk-WMIRAD3J.js} +2 -2
  143. package/dist/cli/chunks/{chunk-3KTOM7NN.js → chunk-WNMDWP5A.js} +2 -2
  144. package/dist/cli/chunks/{chunk-G4CQBQBV.js → chunk-WQZ2WRO4.js} +1 -1
  145. package/dist/cli/chunks/{chunk-UQBGA4UA.js → chunk-WZYNY3VF.js} +1 -1
  146. package/dist/cli/chunks/{chunk-KEJEZY2R.js → chunk-X64BEXUY.js} +173 -173
  147. package/dist/cli/chunks/{chunk-7XIQR6VU.js → chunk-XHRLBJTM.js} +2 -2
  148. package/dist/cli/chunks/{chunk-UQ6WB4N2.js → chunk-XQ6DW5FV.js} +2 -2
  149. package/dist/cli/chunks/chunk-XXRTWG7O.js +2 -0
  150. package/dist/cli/chunks/{chunk-LIEA5EON.js → chunk-Y4AXOHW4.js} +1 -1
  151. package/dist/cli/chunks/{chunk-ZWMXF6AX.js → chunk-YKSWC7I4.js} +2 -2
  152. package/dist/cli/chunks/{chunk-IMPSB5WW.js → chunk-YNK6SUPU.js} +2 -2
  153. package/dist/cli/chunks/{chunk-Z2QNTRUX.js → chunk-YUHM72VQ.js} +2 -2
  154. package/dist/cli/chunks/{chunk-QZ2GQGJX.js → chunk-YZ5EQR37.js} +2 -2
  155. package/dist/cli/chunks/{chunk-YGRY2TVI.js → chunk-Z2REKBD6.js} +2 -2
  156. package/dist/cli/chunks/{chunk-ZQYEBLTL.js → chunk-ZFCVT43J.js} +2 -2
  157. package/dist/cli/chunks/{chunk-XN4G3SRU.js → chunk-ZKCKOQJI.js} +2 -2
  158. package/dist/cli/chunks/{chunk-CZYSCUJ4.js → chunk-ZSA6V5FH.js} +2 -2
  159. package/dist/cli/chunks/{chunk-IQOCTGA2.js → chunk-ZSBJNE35.js} +2 -2
  160. package/dist/cli/chunks/{chunk-JDFF2QMZ.js → chunk-ZYZT2CDX.js} +1 -1
  161. package/dist/cli/chunks/{ci-SM3EVLZ4.js → ci-HQCRSCC7.js} +2 -2
  162. package/dist/cli/chunks/{ci-output-YYXICZBC.js → ci-output-YBVXLA6O.js} +2 -2
  163. package/dist/cli/chunks/{circuit-breaker-CV5UGKXT.js → circuit-breaker-ULGMF2QN.js} +2 -2
  164. package/dist/cli/chunks/{claude-flow-setup-BSBUZ4B7.js → claude-flow-setup-MKZ2LJXK.js} +2 -2
  165. package/dist/cli/chunks/client-2OVEDWGU.js +2 -0
  166. package/dist/cli/chunks/{cline-installer-P2O6STIC.js → cline-installer-WZQ6XBWN.js} +2 -2
  167. package/dist/cli/chunks/{code-M7DDLBGS.js → code-H3KGH45S.js} +2 -2
  168. package/dist/cli/chunks/{code-index-extractor-3QZIUYOG.js → code-index-extractor-NUVEAJ7C.js} +2 -2
  169. package/dist/cli/chunks/{codex-installer-5JVZCCTC.js → codex-installer-JQI6E6CV.js} +2 -2
  170. package/dist/cli/chunks/{completions-EM7IL2BJ.js → completions-NDF4PFE7.js} +2 -2
  171. package/dist/cli/chunks/{complexity-analyzer-VJXVB2CV.js → complexity-analyzer-XCZH66HG.js} +2 -2
  172. package/dist/cli/chunks/{continuedev-installer-RCKJIAEC.js → continuedev-installer-Z4AJGZ7S.js} +2 -2
  173. package/dist/cli/chunks/{copilot-installer-DZ7LTDOZ.js → copilot-installer-K4IPAL7C.js} +2 -2
  174. package/dist/cli/chunks/core-handlers-UXRRYP52.js +2 -0
  175. package/dist/cli/chunks/{cost-tracker-QLOLXVAM.js → cost-tracker-35KXAB23.js} +2 -2
  176. package/dist/cli/chunks/{coverage-LYHTLWRV.js → coverage-QW5I4TYZ.js} +3 -3
  177. package/dist/cli/chunks/cross-domain-router-PV3VQVLO.js +2 -0
  178. package/dist/cli/chunks/{cursor-installer-PSIZ3Y53.js → cursor-installer-P4Z7RMIZ.js} +2 -2
  179. package/dist/cli/chunks/{daemon-IYDTMA5M.js → daemon-ESUEM6VB.js} +4 -4
  180. package/dist/cli/chunks/{daemon-YLOAXM4X.js → daemon-WQWTCYBM.js} +3 -3
  181. package/dist/cli/chunks/{dag-attention-scheduler-I2UIO3Z7.js → dag-attention-scheduler-7XD2VGON.js} +2 -2
  182. package/dist/cli/chunks/{detect-ZXQ7X7GZ.js → detect-GZ3P4DI7.js} +2 -2
  183. package/dist/cli/chunks/{dist-node-GK6OZX4H.js → dist-node-6WWAW7OP.js} +2 -2
  184. package/dist/cli/chunks/{domain-handler-NS3IBLRQ.js → domain-handler-3GTLWARQ.js} +2 -2
  185. package/dist/cli/chunks/{domain-transfer-5G4RZEWF.js → domain-transfer-TQYO3SVG.js} +2 -2
  186. package/dist/cli/chunks/dream-UFUXVJQC.js +2 -0
  187. package/dist/cli/chunks/{embed-and-insert-pattern-V4JJUFR6.js → embed-and-insert-pattern-BGIMA77V.js} +2 -2
  188. package/dist/cli/chunks/{eval-7Q6PPYKR.js → eval-SXV6DRDD.js} +2 -2
  189. package/dist/cli/chunks/{experience-capture-middleware-DUBKSYFM.js → experience-capture-middleware-TT6WCT2S.js} +3 -3
  190. package/dist/cli/chunks/{fast-paths-IDPPMBUW.js → fast-paths-HTAZHEQP.js} +2 -2
  191. package/dist/cli/chunks/{feature-flags-EPTMAAKA.js → feature-flags-DIE3Z2B4.js} +2 -2
  192. package/dist/cli/chunks/{feature-flags-KXI6FDY7.js → feature-flags-WBUKU54W.js} +2 -2
  193. package/dist/cli/chunks/{file-discovery-EDX2OJO7.js → file-discovery-SKDETFS3.js} +2 -2
  194. package/dist/cli/chunks/{fleet-67BO3LJ4.js → fleet-WCWEPAVU.js} +3 -3
  195. package/dist/cli/chunks/{gnn-wrapper-YARORYT7.js → gnn-wrapper-KWZOWBYS.js} +2 -2
  196. package/dist/cli/chunks/{heartbeat-handler-K3JGPBYR.js → heartbeat-handler-3AGYHVG2.js} +4 -4
  197. package/dist/cli/chunks/heartbeat-scheduler-MBG3SARO.js +2 -0
  198. package/dist/cli/chunks/hnsw-adapter-5HXA3QB3.js +2 -0
  199. package/dist/cli/chunks/hnsw-index-PZRQWBRG.js +2 -0
  200. package/dist/cli/chunks/{hnsw-legacy-bridge-CDDRSV5E.js → hnsw-legacy-bridge-6OJJDZHL.js} +2 -2
  201. package/dist/cli/chunks/{better-sqlite3-5JTP47LA.js → hnswlib-node-LAFK5QZ4.js} +2 -2
  202. package/dist/cli/chunks/{hooks-6SCAE6LC.js → hooks-OXEBTLXV.js} +10 -10
  203. package/dist/cli/chunks/hybrid-router-NQRIE2GG.js +2 -0
  204. package/dist/cli/chunks/{hypergraph-engine-I3LUMO7I.js → hypergraph-engine-NL74PRHD.js} +2 -2
  205. package/dist/cli/chunks/{hypergraph-handler-YAKAIVCN.js → hypergraph-handler-KZ54AEEL.js} +3 -3
  206. package/dist/cli/chunks/impact-analyzer-46347ZDV.js +2 -0
  207. package/dist/cli/chunks/{init-handler-NBKCZD7Q.js → init-handler-XKZXRXPG.js} +6 -6
  208. package/dist/cli/chunks/init-wizard-CJYP4WKO.js +2 -0
  209. package/dist/cli/chunks/kernel-22KQZ56U.js +2 -0
  210. package/dist/cli/chunks/{kilocode-installer-YGPJCPU3.js → kilocode-installer-WISQMJK7.js} +2 -2
  211. package/dist/cli/chunks/{kiro-installer-JV3ONVMN.js → kiro-installer-O7TBB3GM.js} +2 -2
  212. package/dist/cli/chunks/knowledge-graph-KM3JDBGR.js +2 -0
  213. package/dist/cli/chunks/{learning-2FEZJ5CX.js → learning-6IZBGVRU.js} +3 -3
  214. package/dist/cli/chunks/{llm-router-SILI4KLU.js → llm-router-QDMQPPQ7.js} +4 -4
  215. package/dist/cli/chunks/llm-router-service-IFO6GRRO.js +2 -0
  216. package/dist/cli/chunks/{load-EGXLQVR3.js → load-KLAJJGL5.js} +2 -2
  217. package/dist/cli/chunks/load-test-TTKCYAPB.js +2 -0
  218. package/dist/cli/chunks/{mcp-OJH775TL.js → mcp-SZOPQZIZ.js} +2 -2
  219. package/dist/cli/chunks/{memory-FNEOK4FW.js → memory-G3WY74C6.js} +5 -5
  220. package/dist/cli/chunks/memory-backend-ELHCX2ZT.js +2 -0
  221. package/dist/cli/chunks/memory-handlers-3SKYQZTL.js +2 -0
  222. package/dist/cli/chunks/{multi-model-executor-ORTFWLLE.js → multi-model-executor-TDNQGTOT.js} +2 -2
  223. package/dist/cli/chunks/{opencode-installer-UAQLW6XX.js → opencode-installer-NGYGEDMV.js} +2 -2
  224. package/dist/cli/chunks/{orchestrator-VE5KJ2V4.js → orchestrator-KPI5DY2C.js} +5 -5
  225. package/dist/cli/chunks/pattern-null-store-TMXAYD43.js +2 -0
  226. package/dist/cli/chunks/{pipeline-FNMDRWTU.js → pipeline-CSDCC675.js} +2 -2
  227. package/dist/cli/chunks/{platform-MGAKRUQN.js → platform-Q5XKEVKH.js} +2 -2
  228. package/dist/cli/chunks/{plugin-YX7THX3I.js → plugin-XKKR3GVL.js} +2 -2
  229. package/dist/cli/chunks/{prime-radiant-advanced-wasm-XJV4RLMK.js → prime-radiant-advanced-wasm-22QVNKEN.js} +2 -2
  230. package/dist/cli/chunks/protocol-executor-BPLR5EJC.js +2 -0
  231. package/dist/cli/chunks/{protocol-handler-QFET442Y.js → protocol-handler-REQKTJGG.js} +2 -2
  232. package/dist/cli/chunks/{prove-QBAESCOC.js → prove-NOFUFSQN.js} +2 -2
  233. package/dist/cli/chunks/provider-manager-4MMD5QKL.js +2 -0
  234. package/dist/cli/chunks/qe-reasoning-bank-P7KNT3WZ.js +2 -0
  235. package/dist/cli/chunks/{quality-ZTNRL6EG.js → quality-3DQ2H5TK.js} +2 -2
  236. package/dist/cli/chunks/queen-coordinator-NBZZ4MGC.js +2 -0
  237. package/dist/cli/chunks/{real-embeddings-ZFFDV6HC.js → real-embeddings-FCGNYWLL.js} +2 -2
  238. package/dist/cli/chunks/{roocode-installer-J4LFL4AE.js → roocode-installer-HX3CNRIR.js} +2 -2
  239. package/dist/cli/chunks/router-2RXR6J2Q.js +2 -0
  240. package/dist/cli/chunks/routing-feedback-AVAA76TK.js +2 -0
  241. package/dist/cli/chunks/{routing-handler-A5QG2TP2.js → routing-handler-YRZ2LDCR.js} +2 -2
  242. package/dist/cli/chunks/{ruvector-commands-J5JL5WX5.js → ruvector-commands-GCQVBJ4E.js} +2 -2
  243. package/dist/cli/chunks/{rvf-dual-writer-H7442GMO.js → rvf-dual-writer-B562P3ZC.js} +2 -2
  244. package/dist/cli/chunks/{rvf-migration-adapter-PTFQUYKC.js → rvf-migration-adapter-NAGFKCMD.js} +2 -2
  245. package/dist/cli/chunks/{rvf-migration-coordinator-RSNROYRX.js → rvf-migration-coordinator-WWFBEJ5Q.js} +2 -2
  246. package/dist/cli/chunks/rvf-native-adapter-X2YDJA55.js +2 -0
  247. package/dist/cli/chunks/safe-db-4PRU65BK.js +2 -0
  248. package/dist/cli/chunks/schedule-2AST5CHW.js +2 -0
  249. package/dist/cli/chunks/scheduler-SW6II7OU.js +2 -0
  250. package/dist/cli/chunks/{security-LHHLMCBA.js → security-IFOYTD75.js} +3 -3
  251. package/dist/cli/chunks/{shared-rvf-adapter-NPSHVUTM.js → shared-rvf-adapter-TYD5TQ35.js} +2 -2
  252. package/dist/cli/chunks/{shared-rvf-dual-writer-INQDY5WE.js → shared-rvf-dual-writer-YGOOVDQZ.js} +2 -2
  253. package/dist/cli/chunks/sqlite-persistence-OB5NEGAK.js +2 -0
  254. package/dist/cli/chunks/{status-handler-R2KIAMAE.js → status-handler-HFPWSCBY.js} +2 -2
  255. package/dist/cli/chunks/{structural-health-2VPPIOZX.js → structural-health-KZI6YMKV.js} +2 -2
  256. package/dist/cli/chunks/{sync-NLASP7AK.js → sync-ABZNNYRC.js} +2 -2
  257. package/dist/cli/chunks/{sync-ASZ3T5GT.js → sync-Z5BDDBMK.js} +2 -2
  258. package/dist/cli/chunks/{task-handler-UV5R6LJG.js → task-handler-5ACZEPJ7.js} +2 -2
  259. package/dist/cli/chunks/{task-handlers-I6YJXPYP.js → task-handlers-UZWDPL6A.js} +3 -3
  260. package/dist/cli/chunks/{test-TE43TNTI.js → test-APO3MCVV.js} +4 -4
  261. package/dist/cli/chunks/{test-scheduling-WWWWF2TZ.js → test-scheduling-EFZA5G5C.js} +3 -3
  262. package/dist/cli/chunks/{token-bootstrap-HEWP7KKS.js → token-bootstrap-J2OPLNUK.js} +2 -2
  263. package/dist/cli/chunks/{token-usage-3FVHUAW6.js → token-usage-VHWVNN4R.js} +2 -2
  264. package/dist/cli/chunks/{transformers-O5OFM4XM.js → transformers-PX4HPO75.js} +2 -2
  265. package/dist/cli/chunks/{tree-sitter-wasm-parser-YOYWFW63.js → tree-sitter-wasm-parser-44HA2Z3F.js} +2 -2
  266. package/dist/cli/chunks/{types-42GR6PLO.js → types-IMOP7F4R.js} +2 -2
  267. package/dist/cli/chunks/unified-memory-X7OJYGSD.js +2 -0
  268. package/dist/cli/chunks/unified-memory-hnsw-O6HOD5YL.js +2 -0
  269. package/dist/cli/chunks/unified-persistence-C332CER2.js +2 -0
  270. package/dist/cli/chunks/{upgrade-BU6DJ4LT.js → upgrade-OZ3O6ZZI.js} +2 -2
  271. package/dist/cli/chunks/{validate-MPTBARGN.js → validate-DRY5BMWX.js} +2 -2
  272. package/dist/cli/chunks/{validate-swarm-5LUQYHPP.js → validate-swarm-QD3LYPUF.js} +2 -2
  273. package/dist/cli/chunks/{vibium-MJJDANDL.js → vibium-2J3H2ITD.js} +2 -2
  274. package/dist/cli/chunks/visual-security-MPUG5HPI.js +2 -0
  275. package/dist/cli/chunks/{web-tree-sitter-5TF4UGB3.js → web-tree-sitter-KRNUOGKI.js} +2 -2
  276. package/dist/cli/chunks/{windsurf-installer-NQAOSVCN.js → windsurf-installer-PQIPH3WP.js} +2 -2
  277. package/dist/cli/chunks/{witness-chain-23UWK2JT.js → witness-chain-HPLOYPS7.js} +2 -2
  278. package/dist/cli/chunks/witness-chain-Q4BZHPDF.js +2 -0
  279. package/dist/cli/chunks/{workflow-3QOLXRJC.js → workflow-OAQ3FWCY.js} +4 -4
  280. package/dist/cli/chunks/workflow-orchestrator-4NDWECYK.js +2 -0
  281. package/dist/cli/chunks/{wrappers-S6EUZBCX.js → wrappers-UPIU6S5S.js} +2 -2
  282. package/dist/coordination/consensus/providers/ollama-provider.js +3 -2
  283. package/dist/feedback/regenerability-gate.d.ts +70 -0
  284. package/dist/feedback/regenerability-gate.js +91 -0
  285. package/dist/integrations/ruvector/proof-gate.d.ts +68 -0
  286. package/dist/integrations/ruvector/proof-gate.js +135 -0
  287. package/dist/kernel/unified-memory.d.ts +35 -0
  288. package/dist/kernel/unified-memory.js +105 -0
  289. package/dist/learning/local-judge-client.js +2 -1
  290. package/dist/mcp/bundle.js +383 -378
  291. package/dist/routing/free-tier/coordinator-support.d.ts +6 -3
  292. package/dist/routing/free-tier/coordinator-support.js +6 -3
  293. package/dist/routing/free-tier/executor.d.ts +14 -0
  294. package/dist/routing/free-tier/executor.js +21 -0
  295. package/dist/routing/free-tier/index.d.ts +1 -0
  296. package/dist/routing/free-tier/index.js +1 -0
  297. package/dist/routing/free-tier/pattern-cache.d.ts +57 -0
  298. package/dist/routing/free-tier/pattern-cache.js +148 -0
  299. package/dist/routing/free-tier/provider.js +9 -1
  300. package/dist/routing/value-score.js +3 -0
  301. package/dist/shared/embeddings/ollama-client.js +2 -1
  302. package/dist/shared/llm/model-mapping.js +26 -0
  303. package/dist/shared/llm/model-registry.d.ts +10 -0
  304. package/dist/shared/llm/model-registry.js +92 -0
  305. package/dist/shared/llm/ollama-url.d.ts +17 -0
  306. package/dist/shared/llm/ollama-url.js +25 -0
  307. package/dist/shared/llm/providers/gemini.js +16 -10
  308. package/dist/shared/llm/providers/ollama-timeout.d.ts +26 -0
  309. package/dist/shared/llm/providers/ollama-timeout.js +31 -0
  310. package/dist/shared/llm/providers/ollama.d.ts +10 -0
  311. package/dist/shared/llm/providers/ollama.js +31 -4
  312. package/dist/shared/llm/providers/openrouter.js +20 -20
  313. package/dist/shared/llm/router/hybrid-router.js +18 -1
  314. package/dist/validation/conservation-guard.d.ts +39 -0
  315. package/dist/validation/conservation-guard.js +54 -0
  316. package/dist/validation/oracle-eval.d.ts +46 -0
  317. package/dist/validation/oracle-eval.js +108 -0
  318. package/dist/validation/skill-parity.d.ts +58 -0
  319. package/dist/validation/skill-parity.js +94 -0
  320. package/dist/validation/test-gen-prompt.d.ts +10 -0
  321. package/dist/validation/test-gen-prompt.js +26 -0
  322. package/package.json +12 -1
  323. package/dist/cli/chunks/adapter-LDNYC4GH.js +0 -2
  324. package/dist/cli/chunks/aqe-learning-engine-CA4CT5Q7.js +0 -2
  325. package/dist/cli/chunks/base-TSDAEMT4.js +0 -2
  326. package/dist/cli/chunks/browser-workflow-3HCTJBLR.js +0 -2
  327. package/dist/cli/chunks/chunk-527U4AHC.js +0 -24
  328. package/dist/cli/chunks/chunk-72VVTMEL.js +0 -2
  329. package/dist/cli/chunks/chunk-7HYO76F2.js +0 -2
  330. package/dist/cli/chunks/chunk-K3YM2Z3E.js +0 -2
  331. package/dist/cli/chunks/client-WRDYZGM2.js +0 -2
  332. package/dist/cli/chunks/core-handlers-O6E5DNHT.js +0 -2
  333. package/dist/cli/chunks/cross-domain-router-EV7LQMDO.js +0 -2
  334. package/dist/cli/chunks/dream-E4C236UL.js +0 -2
  335. package/dist/cli/chunks/heartbeat-scheduler-WMADLDKT.js +0 -2
  336. package/dist/cli/chunks/hnsw-adapter-STRDGJ65.js +0 -2
  337. package/dist/cli/chunks/hnsw-index-DBHX3TSC.js +0 -2
  338. package/dist/cli/chunks/hybrid-router-L2K55I4T.js +0 -2
  339. package/dist/cli/chunks/impact-analyzer-WMO7ZGS7.js +0 -2
  340. package/dist/cli/chunks/init-wizard-ZAB7UZZS.js +0 -2
  341. package/dist/cli/chunks/kernel-4MUFDEQI.js +0 -2
  342. package/dist/cli/chunks/knowledge-graph-GZRFGXLX.js +0 -2
  343. package/dist/cli/chunks/llm-router-service-5ODLU5U5.js +0 -2
  344. package/dist/cli/chunks/load-test-ZDQFS5XS.js +0 -2
  345. package/dist/cli/chunks/memory-backend-UK7SQ6ZM.js +0 -2
  346. package/dist/cli/chunks/memory-handlers-6LDUH3JZ.js +0 -2
  347. package/dist/cli/chunks/pattern-null-store-LO2QTIBU.js +0 -2
  348. package/dist/cli/chunks/protocol-executor-JWMYQEOI.js +0 -2
  349. package/dist/cli/chunks/provider-manager-PEXOHGNB.js +0 -2
  350. package/dist/cli/chunks/qe-reasoning-bank-7B2G4UGQ.js +0 -2
  351. package/dist/cli/chunks/queen-coordinator-6OF4HT3S.js +0 -2
  352. package/dist/cli/chunks/router-GMWRF6DU.js +0 -2
  353. package/dist/cli/chunks/routing-feedback-XKJSQK3I.js +0 -2
  354. package/dist/cli/chunks/rvf-native-adapter-YEA6TMXB.js +0 -2
  355. package/dist/cli/chunks/safe-db-5DOP2J3V.js +0 -2
  356. package/dist/cli/chunks/schedule-SUWTOBHP.js +0 -2
  357. package/dist/cli/chunks/scheduler-P4VTC5SQ.js +0 -2
  358. package/dist/cli/chunks/sqlite-persistence-5Z2RAXH7.js +0 -2
  359. package/dist/cli/chunks/unified-memory-HCKOPFAY.js +0 -2
  360. package/dist/cli/chunks/unified-memory-hnsw-6NQPYA5C.js +0 -2
  361. package/dist/cli/chunks/unified-persistence-NIMKNAFR.js +0 -2
  362. package/dist/cli/chunks/visual-security-HFGHA57Z.js +0 -2
  363. package/dist/cli/chunks/witness-chain-VZGGJ7TJ.js +0 -2
  364. 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 unit, integration, and e2e tests from code analysis including branch coverage, error paths, and edge cases. Use when creating tests for new or changed code, filling coverage gaps, or migrating test suites between Jest, Vitest, and Playwright."
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 unit tests", `
46
- Analyze src/services/PaymentService.ts and generate comprehensive Jest tests.
47
- Include:
48
- - Happy path tests for all public methods
49
- - Edge cases and boundary conditions
50
- - Error handling scenarios
51
- - Mock external dependencies
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-generator")
54
-
55
- // Pattern-based generation
56
- Task("Apply test patterns", `
57
- Scan src/repositories/ and apply repository test pattern:
58
- - CRUD operation tests
59
- - Query builder tests
60
- - Transaction tests
61
- - Connection error handling
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
@@ -939,7 +939,7 @@
939
939
  },
940
940
  "metadata": {
941
941
  "generatedBy": "Agentic QE Fleet",
942
- "fleetVersion": "3.11.2",
942
+ "fleetVersion": "3.11.4",
943
943
  "manifestVersion": "1.4.0",
944
944
  "lastUpdated": "2026-04-13T00:00:00.000Z",
945
945
  "contributors": [
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, Playwright, custom harnesses
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 Playwright |
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.0.0
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 (Task Tool is PRIMARY)
37
+ # Execution Models (Workflow is PRIMARY where the harness supports it — ADR-102)
38
38
  execution:
39
- primary: task-tool
40
- alternatives: [mcp-tools, cli]
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-02-03
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
- | **Task Tool** (PRIMARY) | Claude Code sessions | `Task({ subagent_type, run_in_background: true })` |
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 unit, integration, and e2e tests from code analysis including branch coverage, error paths, and edge cases. Use when creating tests for new or changed code, filling coverage gaps, or migrating test suites between Jest, Vitest, and Playwright."
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 unit tests", `
46
- Analyze src/services/PaymentService.ts and generate comprehensive Jest tests.
47
- Include:
48
- - Happy path tests for all public methods
49
- - Edge cases and boundary conditions
50
- - Error handling scenarios
51
- - Mock external dependencies
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-generator")
54
-
55
- // Pattern-based generation
56
- Task("Apply test patterns", `
57
- Scan src/repositories/ and apply repository test pattern:
58
- - CRUD operation tests
59
- - Query builder tests
60
- - Transaction tests
61
- - Connection error handling
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