agentic-qe 3.10.3 → 3.10.5

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