agentic-qe 3.14.6 → 3.14.8

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 (467) hide show
  1. package/.claude/helpers/.helpers-version +1 -1
  2. package/.claude/helpers/auto-memory-hook.mjs +18 -9
  3. package/.claude/helpers/helpers.manifest.json +6 -5
  4. package/.claude/helpers/hook-handler.cjs +40 -12
  5. package/.claude/helpers/memory.cjs +86 -0
  6. package/.claude/helpers/router.cjs +105 -0
  7. package/.claude/helpers/session.cjs +166 -0
  8. package/.claude/helpers/statusline.cjs +73 -621
  9. package/.claude/skills/skills-manifest.json +1 -1
  10. package/CHANGELOG.md +204 -0
  11. package/assets/skills/skills-manifest.json +1 -1
  12. package/dist/adapters/a2a/notifications/retry-queue.js +5 -0
  13. package/dist/adapters/claude-flow/pretrain-bridge.js +3 -2
  14. package/dist/agents/claim-verifier/verifiers/file-verifier.js +3 -2
  15. package/dist/cli/bundle.js +8 -8
  16. package/dist/cli/chunks/adapter-XYCOXQCC.js +2 -0
  17. package/dist/cli/chunks/{agent-booster-wasm-2YGML6OU.js → agent-booster-wasm-67OKGDGZ.js} +2 -2
  18. package/dist/cli/chunks/{agent-handler-D5SSQYNU.js → agent-handler-4HZEQ3WQ.js} +2 -2
  19. package/dist/cli/chunks/{agent-memory-branch-YHPLTITV.js → agent-memory-branch-IBHZQSRN.js} +2 -2
  20. package/dist/cli/chunks/aqe-learning-engine-DTJCROTG.js +2 -0
  21. package/dist/cli/chunks/{arena-7BGOXGXO.js → arena-EJBIGSF4.js} +2 -2
  22. package/dist/cli/chunks/{arena-MCE6EU7K.js → arena-LCLRGUIK.js} +4 -4
  23. package/dist/cli/chunks/{audit-BMWTQECB.js → audit-PY4JNDQQ.js} +3 -3
  24. package/dist/cli/chunks/base-5TQ34GMD.js +2 -0
  25. package/dist/cli/chunks/{better-sqlite3-PMUNGASU.js → better-sqlite3-2JG5K6XT.js} +2 -2
  26. package/dist/cli/chunks/{brain-handler-QPUFYX7F.js → brain-handler-3UYK55GA.js} +4 -4
  27. package/dist/cli/chunks/{branch-enumerator-WKFDGRN4.js → branch-enumerator-GOSWOX46.js} +2 -2
  28. package/dist/cli/chunks/{browser-VY5HKH5X.js → browser-DC2JV47Z.js} +2 -2
  29. package/dist/cli/chunks/browser-workflow-KWX4ESTJ.js +2 -0
  30. package/dist/cli/chunks/{chunk-FWASDOT2.js → chunk-25EEIAHS.js} +2 -2
  31. package/dist/cli/chunks/{chunk-P6OYS755.js → chunk-3576QGPP.js} +1 -1
  32. package/dist/cli/chunks/{chunk-2TMWAQQ3.js → chunk-3EKG7HFV.js} +4 -4
  33. package/dist/cli/chunks/{chunk-QZANMBIT.js → chunk-3FCHH4VP.js} +1 -1
  34. package/dist/cli/chunks/{chunk-CD542DNJ.js → chunk-3S5IIK32.js} +1 -1
  35. package/dist/cli/chunks/{chunk-5VFPCSK7.js → chunk-3X2JSW3R.js} +1 -1
  36. package/dist/cli/chunks/{chunk-D45SG6CP.js → chunk-4HXFPBAA.js} +1 -1
  37. package/dist/cli/chunks/{chunk-JVNTSNWU.js → chunk-4PY44TKH.js} +2 -2
  38. package/dist/cli/chunks/{chunk-DZ3AUAAB.js → chunk-4RNCVSVN.js} +2 -2
  39. package/dist/cli/chunks/{chunk-JBTPOIAC.js → chunk-56M4QNXU.js} +2 -2
  40. package/dist/cli/chunks/{chunk-H52HZ67P.js → chunk-5X4HDW5W.js} +2 -2
  41. package/dist/cli/chunks/{chunk-UNFFDHER.js → chunk-673XJBGW.js} +10 -32
  42. package/dist/cli/chunks/{chunk-RTFO5UQH.js → chunk-6F7MFHTY.js} +2 -2
  43. package/dist/cli/chunks/{chunk-Y3LZ35OG.js → chunk-6GJWT2OY.js} +2 -2
  44. package/dist/cli/chunks/{chunk-JXGFRBUO.js → chunk-6GNWVPMR.js} +2 -2
  45. package/dist/cli/chunks/{chunk-3EA536JF.js → chunk-6VTC3OHD.js} +2 -2
  46. package/dist/cli/chunks/{chunk-W6HXLH5G.js → chunk-775WGWLL.js} +3 -3
  47. package/dist/cli/chunks/{chunk-TVYY3OCX.js → chunk-77WL5HQW.js} +1 -1
  48. package/dist/cli/chunks/chunk-7STWD4KJ.js +3 -0
  49. package/dist/cli/chunks/{chunk-YSLL6VSL.js → chunk-7TNCEVWX.js} +2 -2
  50. package/dist/cli/chunks/{chunk-Z7WODOTH.js → chunk-7X3LMTRA.js} +2 -2
  51. package/dist/cli/chunks/{chunk-RZZCUIAI.js → chunk-A53MMSGC.js} +2 -2
  52. package/dist/cli/chunks/{chunk-QW6VMTBR.js → chunk-A5CLVZC3.js} +2 -2
  53. package/dist/cli/chunks/{chunk-IG5GNEC6.js → chunk-AEYJ4ZLA.js} +1 -1
  54. package/dist/cli/chunks/{chunk-NMAIY4PX.js → chunk-AJ5PCJQ2.js} +11 -11
  55. package/dist/cli/chunks/{chunk-WO4QMXIG.js → chunk-AJMAKUS3.js} +2 -2
  56. package/dist/cli/chunks/{chunk-2NPKIBAZ.js → chunk-AOD2ES44.js} +2 -2
  57. package/dist/cli/chunks/chunk-AR2S4DOB.js +2 -0
  58. package/dist/cli/chunks/{chunk-257E2A5M.js → chunk-AUFV2G2J.js} +5 -5
  59. package/dist/cli/chunks/{chunk-BVR7RMC5.js → chunk-B2QKBQYD.js} +1 -1
  60. package/dist/cli/chunks/{chunk-B6D2CHEH.js → chunk-BCCSV3RH.js} +1 -1
  61. package/dist/cli/chunks/{chunk-2YXGBZWV.js → chunk-BFIXUKOR.js} +1 -1
  62. package/dist/cli/chunks/chunk-BHPTHC5O.js +4 -0
  63. package/dist/cli/chunks/{chunk-AIRGNL55.js → chunk-BITFGVZ4.js} +2 -2
  64. package/dist/cli/chunks/{chunk-MBRHSU6W.js → chunk-BL6273KR.js} +10 -10
  65. package/dist/cli/chunks/{chunk-SMDN3BQZ.js → chunk-BOIUENWW.js} +1 -1
  66. package/dist/cli/chunks/{chunk-YS4FCTWF.js → chunk-BT3MI2BW.js} +1 -1
  67. package/dist/cli/chunks/{chunk-JZOS5FCX.js → chunk-BTBJ2NLH.js} +2 -2
  68. package/dist/cli/chunks/{chunk-CCK4BF76.js → chunk-BUVJIVFG.js} +1 -1
  69. package/dist/cli/chunks/{chunk-2JVWITNK.js → chunk-BZIPW2PA.js} +56 -80
  70. package/dist/cli/chunks/{chunk-BPEDWS6O.js → chunk-C647D42G.js} +2 -2
  71. package/dist/cli/chunks/{chunk-6U7LNMWZ.js → chunk-CBWM5NOO.js} +3 -3
  72. package/dist/cli/chunks/{chunk-72KXSMWI.js → chunk-CIEXUYY7.js} +1 -1
  73. package/dist/cli/chunks/{chunk-SE4WIB26.js → chunk-CLUHGBLN.js} +4 -4
  74. package/dist/cli/chunks/{chunk-JIXUMYKZ.js → chunk-CQEWL32R.js} +1 -1
  75. package/dist/cli/chunks/{chunk-CM7U6TAX.js → chunk-CXUC7YKA.js} +2 -2
  76. package/dist/cli/chunks/{chunk-7LPR6HJG.js → chunk-D2Y36V5J.js} +2 -2
  77. package/dist/cli/chunks/{chunk-BJTJLJRZ.js → chunk-DSJJHPPS.js} +4 -4
  78. package/dist/cli/chunks/{chunk-ZVWVV4EX.js → chunk-DZHXCOSK.js} +1 -1
  79. package/dist/cli/chunks/{chunk-7Z5LHRC3.js → chunk-EBV3WFIR.js} +2 -2
  80. package/dist/cli/chunks/{chunk-KNNISEDY.js → chunk-EKO5QL2B.js} +1 -1
  81. package/dist/cli/chunks/{chunk-XAS3XRYM.js → chunk-EMOZ5O5S.js} +1 -1
  82. package/dist/cli/chunks/{chunk-62N4NUJH.js → chunk-ES7TAJRJ.js} +2 -2
  83. package/dist/cli/chunks/chunk-EXQGHTPD.js +65 -0
  84. package/dist/cli/chunks/{chunk-Q7EAGKAE.js → chunk-F2WAB4WK.js} +2 -2
  85. package/dist/cli/chunks/{chunk-L4RUBPLR.js → chunk-F57FTFWS.js} +2 -2
  86. package/dist/cli/chunks/{chunk-GGRHV6D7.js → chunk-F6JJNBE5.js} +1 -1
  87. package/dist/cli/chunks/{chunk-3EZOZN25.js → chunk-FRC7AFB4.js} +2 -2
  88. package/dist/cli/chunks/{chunk-RSXXCL4A.js → chunk-G36RZF2Y.js} +1 -1
  89. package/dist/cli/chunks/{chunk-ZSPU4MOS.js → chunk-G3C7Z6FO.js} +2 -2
  90. package/dist/cli/chunks/{chunk-SNOBH4AZ.js → chunk-GA63ESNT.js} +2 -2
  91. package/dist/cli/chunks/{chunk-HNFVJP4I.js → chunk-GHMJFICO.js} +2 -2
  92. package/dist/cli/chunks/{chunk-7D3V65N5.js → chunk-GK5WLUX3.js} +1 -1
  93. package/dist/cli/chunks/{chunk-RETBYIAC.js → chunk-GQJ4QDEN.js} +6 -6
  94. package/dist/cli/chunks/chunk-GVLRE3BV.js +12 -0
  95. package/dist/cli/chunks/{chunk-MW2GGZZ5.js → chunk-H5UH234L.js} +1 -1
  96. package/dist/cli/chunks/{chunk-HM6ZSCPI.js → chunk-HBAFXWSO.js} +1 -1
  97. package/dist/cli/chunks/{chunk-DHVX5UB2.js → chunk-HE3BDBAO.js} +2 -2
  98. package/dist/cli/chunks/{chunk-YFBSPLJG.js → chunk-HHANMCD2.js} +1 -1
  99. package/dist/cli/chunks/chunk-HPVYJ6JH.js +2 -0
  100. package/dist/cli/chunks/{chunk-PX5YDCRH.js → chunk-I6NZFBT3.js} +3 -3
  101. package/dist/cli/chunks/{chunk-5J6W7SIA.js → chunk-ISBOHF6Y.js} +1 -1
  102. package/dist/cli/chunks/{chunk-UCFQALXO.js → chunk-J24AJEDE.js} +2 -2
  103. package/dist/cli/chunks/{chunk-FBMN7B46.js → chunk-J5HTQHJK.js} +2 -2
  104. package/dist/cli/chunks/{chunk-GPYVDFB3.js → chunk-JDOVO4E4.js} +205 -195
  105. package/dist/cli/chunks/chunk-JQAJUXRE.js +2 -0
  106. package/dist/cli/chunks/{chunk-RG52OKAM.js → chunk-JRK5GX56.js} +1 -1
  107. package/dist/cli/chunks/{chunk-I33ERSGB.js → chunk-JRLZ7LZ3.js} +2 -2
  108. package/dist/cli/chunks/{chunk-NQZ5AR3D.js → chunk-JTOFLDU7.js} +2 -2
  109. package/dist/cli/chunks/{chunk-NHWGMJAP.js → chunk-K6EOHGKS.js} +2 -2
  110. package/dist/cli/chunks/{chunk-5QQSIGUA.js → chunk-KKXH25IH.js} +2 -2
  111. package/dist/cli/chunks/{chunk-VGFFFKGK.js → chunk-KNSQWM2E.js} +2 -2
  112. package/dist/cli/chunks/{chunk-B6MOJC3X.js → chunk-L5T32SRF.js} +1 -1
  113. package/dist/cli/chunks/{chunk-WGM35YWL.js → chunk-LKFBW2QM.js} +2 -2
  114. package/dist/cli/chunks/{chunk-AJRUJAAK.js → chunk-LMAI74EP.js} +1 -1
  115. package/dist/cli/chunks/{chunk-C6KWXUFJ.js → chunk-LQVS5IWH.js} +2 -2
  116. package/dist/cli/chunks/{chunk-H5BS5VH7.js → chunk-LRGTPUJA.js} +2 -2
  117. package/dist/cli/chunks/{chunk-3HZS4M3O.js → chunk-LTHV4PIG.js} +2 -2
  118. package/dist/cli/chunks/{chunk-7CUQCCMD.js → chunk-M7QKCHLQ.js} +2 -2
  119. package/dist/cli/chunks/{chunk-CF2ISEOJ.js → chunk-N3ASALOL.js} +2 -2
  120. package/dist/cli/chunks/{chunk-ZCRTRYXK.js → chunk-NEXBTLN6.js} +2 -2
  121. package/dist/cli/chunks/{chunk-VMNWDJIZ.js → chunk-NJEEKYEP.js} +3 -3
  122. package/dist/cli/chunks/{chunk-ZEV3YTO7.js → chunk-NWUFTLSF.js} +2 -2
  123. package/dist/cli/chunks/{chunk-MQROI74N.js → chunk-O4QB2GFL.js} +2 -2
  124. package/dist/cli/chunks/{chunk-GDSXITFH.js → chunk-OA75C4HY.js} +2 -2
  125. package/dist/cli/chunks/{chunk-SESK3ARK.js → chunk-OVMG6EEF.js} +2 -2
  126. package/dist/cli/chunks/{chunk-MUOG6QXR.js → chunk-OX7MJFLC.js} +2 -2
  127. package/dist/cli/chunks/{chunk-ELLBS5RP.js → chunk-OZJQN7YE.js} +2 -2
  128. package/dist/cli/chunks/{chunk-D6CJIGRU.js → chunk-PFXCRRR6.js} +55 -55
  129. package/dist/cli/chunks/{chunk-ZL6SYKUK.js → chunk-PVJLQ2YZ.js} +1 -1
  130. package/dist/cli/chunks/{chunk-6LIHFV7O.js → chunk-QDRFLM77.js} +2 -2
  131. package/dist/cli/chunks/{chunk-H6ZM3PUT.js → chunk-QH7C4PTX.js} +1 -1
  132. package/dist/cli/chunks/chunk-QKM4XT2F.js +2 -0
  133. package/dist/cli/chunks/{chunk-V4DM6ELU.js → chunk-QP7EKLWU.js} +2 -2
  134. package/dist/cli/chunks/{chunk-BAMN2CHI.js → chunk-QPACHVDI.js} +1 -1
  135. package/dist/cli/chunks/{chunk-QDFTT3RF.js → chunk-QQVE65ER.js} +2 -2
  136. package/dist/cli/chunks/{chunk-LL3IGZBI.js → chunk-QYCZYJH7.js} +2 -2
  137. package/dist/cli/chunks/{chunk-DUYOVM5I.js → chunk-R6I5I724.js} +2 -2
  138. package/dist/cli/chunks/{chunk-ENGZ4D5V.js → chunk-RJJIPTVH.js} +2 -2
  139. package/dist/cli/chunks/{chunk-7NITCZWD.js → chunk-RM6OC35G.js} +1 -1
  140. package/dist/cli/chunks/{chunk-Q5XTSMWR.js → chunk-RTD4U7IW.js} +2 -2
  141. package/dist/cli/chunks/{chunk-DBDPRORT.js → chunk-SKJQKOFJ.js} +2 -2
  142. package/dist/cli/chunks/{chunk-ICTXTNQZ.js → chunk-SMBGK7XI.js} +1 -1
  143. package/dist/cli/chunks/{chunk-PI7TJS62.js → chunk-SPS472C5.js} +2 -2
  144. package/dist/cli/chunks/{chunk-IV5UZOHH.js → chunk-SUNXA2UR.js} +2 -2
  145. package/dist/cli/chunks/{chunk-IB27QACC.js → chunk-SVP3BP52.js} +2 -2
  146. package/dist/cli/chunks/{chunk-5OOMJGFN.js → chunk-T4WQPE77.js} +1 -1
  147. package/dist/cli/chunks/{chunk-66VWCR67.js → chunk-T53ZN4NO.js} +2 -2
  148. package/dist/cli/chunks/chunk-T6W2EYHC.js +2 -0
  149. package/dist/cli/chunks/{chunk-EAY2JMZG.js → chunk-T7YCNOW5.js} +2 -2
  150. package/dist/cli/chunks/{chunk-FZOBD67M.js → chunk-TCQWVVSR.js} +1 -1
  151. package/dist/cli/chunks/{chunk-SJUXE4IC.js → chunk-TGRHO4ES.js} +2 -2
  152. package/dist/cli/chunks/{chunk-6RE3X4V5.js → chunk-TP7L4EX6.js} +2 -2
  153. package/dist/cli/chunks/{chunk-6SQM2MUX.js → chunk-TT45RCLN.js} +2 -2
  154. package/dist/cli/chunks/{chunk-AVBJYI5I.js → chunk-TUZNWRYC.js} +1 -1
  155. package/dist/cli/chunks/{chunk-YHKEDEAA.js → chunk-U2QTL5T2.js} +3 -3
  156. package/dist/cli/chunks/chunk-U64QORFO.js +2 -0
  157. package/dist/cli/chunks/{chunk-BBT64TII.js → chunk-UHLZKH6B.js} +4 -4
  158. package/dist/cli/chunks/{chunk-GSF6MB64.js → chunk-UIWXKRTK.js} +2 -2
  159. package/dist/cli/chunks/{chunk-JMONHE4B.js → chunk-UNFE4RPV.js} +1 -1
  160. package/dist/cli/chunks/{chunk-DPYSUDAO.js → chunk-UQGIC5OX.js} +1 -1
  161. package/dist/cli/chunks/{chunk-IAF6T27S.js → chunk-VAXTPLO3.js} +2 -2
  162. package/dist/cli/chunks/{chunk-6SH5VZUD.js → chunk-VCSNNLWL.js} +2 -2
  163. package/dist/cli/chunks/chunk-VSPNIDQK.js +21 -0
  164. package/dist/cli/chunks/{chunk-6OS76PHI.js → chunk-VV2JVYOI.js} +2 -2
  165. package/dist/cli/chunks/{chunk-IQO7UCFR.js → chunk-VW7AXJQS.js} +2 -2
  166. package/dist/cli/chunks/{chunk-UQ32JHES.js → chunk-W7JUD4EZ.js} +2 -2
  167. package/dist/cli/chunks/chunk-WFKE7NZ5.js +12 -0
  168. package/dist/cli/chunks/{chunk-RFNPJK6N.js → chunk-WVEHKAIH.js} +3 -3
  169. package/dist/cli/chunks/{chunk-64VGZQLB.js → chunk-XAESN54Q.js} +1 -1
  170. package/dist/cli/chunks/{chunk-BMAPORJ7.js → chunk-XECZYQT5.js} +2 -2
  171. package/dist/cli/chunks/chunk-XFT4FYTC.js +2 -0
  172. package/dist/cli/chunks/{chunk-Y3UOUNHM.js → chunk-YHX74M7C.js} +2 -2
  173. package/dist/cli/chunks/chunk-YIWBJ637.js +2 -0
  174. package/dist/cli/chunks/{chunk-SDRHUMJB.js → chunk-Z5UZOYQS.js} +2 -2
  175. package/dist/cli/chunks/{chunk-7J6QC567.js → chunk-Z6G3QVZ4.js} +12 -12
  176. package/dist/cli/chunks/ci-5LIV2HW5.js +82 -0
  177. package/dist/cli/chunks/{ci-output-LDT24TS3.js → ci-output-UO5BDFU4.js} +2 -2
  178. package/dist/cli/chunks/{circuit-breaker-F5V4KITU.js → circuit-breaker-UQDPXYRD.js} +2 -2
  179. package/dist/cli/chunks/{claude-flow-setup-DT6WQQVD.js → claude-flow-setup-62QES3QX.js} +2 -2
  180. package/dist/cli/chunks/client-AJZKCP4I.js +2 -0
  181. package/dist/cli/chunks/{cline-installer-G7TJOAEX.js → cline-installer-X7VZTSZG.js} +2 -2
  182. package/dist/cli/chunks/{code-PGE6A42V.js → code-H3BF4L4H.js} +3 -3
  183. package/dist/cli/chunks/{code-index-extractor-RNITH372.js → code-index-extractor-BJGFZGGL.js} +2 -2
  184. package/dist/cli/chunks/{codex-installer-LBX77AI3.js → codex-installer-KVZWKU6S.js} +2 -2
  185. package/dist/cli/chunks/{completions-4AWLAARX.js → completions-YMILE6V7.js} +2 -2
  186. package/dist/cli/chunks/{complexity-analyzer-ZPNSS476.js → complexity-analyzer-J26N2PWG.js} +2 -2
  187. package/dist/cli/chunks/{continuedev-installer-UAPWX6OA.js → continuedev-installer-MAR42OV7.js} +2 -2
  188. package/dist/cli/chunks/{copilot-installer-BJN2YJGI.js → copilot-installer-CVOJF6OT.js} +2 -2
  189. package/dist/cli/chunks/core-handlers-MQHEMGDV.js +2 -0
  190. package/dist/cli/chunks/{cost-tracker-MHP2VJ63.js → cost-tracker-SXLWXE55.js} +2 -2
  191. package/dist/cli/chunks/{coverage-PQB4IEFG.js → coverage-D7HCHFP3.js} +3 -3
  192. package/dist/cli/chunks/cross-domain-router-3QNMZV5R.js +2 -0
  193. package/dist/cli/chunks/{cursor-installer-ZXBWYAS3.js → cursor-installer-X37VHIKW.js} +2 -2
  194. package/dist/cli/chunks/{daemon-64C7R6OJ.js → daemon-JN7SOH6F.js} +4 -4
  195. package/dist/cli/chunks/{daemon-N2BEGEFY.js → daemon-LIW47IDM.js} +4 -4
  196. package/dist/cli/chunks/{dag-attention-scheduler-SPZDAPNL.js → dag-attention-scheduler-QCHHIZBT.js} +2 -2
  197. package/dist/cli/chunks/{detect-LXJBSSZW.js → detect-WRFCWAX5.js} +2 -2
  198. package/dist/cli/chunks/{dist-node-U3TKZ2IZ.js → dist-node-6FWT4XZO.js} +2 -2
  199. package/dist/cli/chunks/{domain-handler-3DDWUVSR.js → domain-handler-SNFPNMRT.js} +2 -2
  200. package/dist/cli/chunks/{domain-plugins-JJVWI4OQ.js → domain-plugins-MXKHH62P.js} +2 -2
  201. package/dist/cli/chunks/domain-transfer-47UJNERX.js +2 -0
  202. package/dist/cli/chunks/dream-OSWAITPT.js +2 -0
  203. package/dist/cli/chunks/{embed-and-insert-pattern-JPAR7TXX.js → embed-and-insert-pattern-LZFAUNBQ.js} +2 -2
  204. package/dist/cli/chunks/{eval-SOLG23EA.js → eval-AMUXTMJB.js} +2 -2
  205. package/dist/cli/chunks/{experience-capture-middleware-T7G2VOOD.js → experience-capture-middleware-3D65TR2C.js} +4 -4
  206. package/dist/cli/chunks/{fast-paths-32N3ELI4.js → fast-paths-Y7BBMM56.js} +2 -2
  207. package/dist/cli/chunks/{feature-flags-APJDQ4N7.js → feature-flags-JMQQ7JW4.js} +2 -2
  208. package/dist/cli/chunks/{feature-flags-NAHKLDRN.js → feature-flags-VESRRQ6V.js} +2 -2
  209. package/dist/cli/chunks/{file-discovery-YKVM3MDB.js → file-discovery-JJKQQUV6.js} +2 -2
  210. package/dist/cli/chunks/{fleet-55M5CJS4.js → fleet-WIGHICJF.js} +4 -4
  211. package/dist/cli/chunks/{gnn-wrapper-UD6E6S6Z.js → gnn-wrapper-BFNPETTT.js} +2 -2
  212. package/dist/cli/chunks/{heartbeat-handler-OYVW3VSC.js → heartbeat-handler-HDXKTGUI.js} +4 -4
  213. package/dist/cli/chunks/heartbeat-scheduler-BVRVVIE2.js +2 -0
  214. package/dist/cli/chunks/hnsw-adapter-MZTHXULS.js +2 -0
  215. package/dist/cli/chunks/hnsw-index-KHEX4VDG.js +2 -0
  216. package/dist/cli/chunks/{hnsw-legacy-bridge-HBYIS3ZW.js → hnsw-legacy-bridge-6A7OTAPT.js} +2 -2
  217. package/dist/cli/chunks/{hnswlib-node-EQPM42OU.js → hnswlib-node-LKV2H47B.js} +2 -2
  218. package/dist/cli/chunks/{hooks-5ZSSJWO6.js → hooks-KDSFYQQG.js} +10 -10
  219. package/dist/cli/chunks/hybrid-backend-2B3LCLR4.js +2 -0
  220. package/dist/cli/chunks/{hypergraph-engine-XBGVQ4PD.js → hypergraph-engine-GDLPEPUC.js} +2 -2
  221. package/dist/cli/chunks/{hypergraph-handler-CAWAQ673.js → hypergraph-handler-4UMFA2EW.js} +3 -3
  222. package/dist/cli/chunks/impact-analyzer-4R4VWOGQ.js +2 -0
  223. package/dist/cli/chunks/{init-handler-PRHXSARK.js → init-handler-4GCHPQHD.js} +16 -14
  224. package/dist/cli/chunks/init-wizard-TAOPXHHD.js +2 -0
  225. package/dist/cli/chunks/kernel-6I6VZUWY.js +2 -0
  226. package/dist/cli/chunks/{kilocode-installer-F7LXBM7I.js → kilocode-installer-HJZMT2G5.js} +2 -2
  227. package/dist/cli/chunks/{kiro-installer-NM723ZRG.js → kiro-installer-WUPY67HG.js} +2 -2
  228. package/dist/cli/chunks/knowledge-graph-KFMTTUR5.js +2 -0
  229. package/dist/cli/chunks/{learning-5QYIDHH3.js → learning-AXKIS7IG.js} +4 -4
  230. package/dist/cli/chunks/{llm-router-43HKWPSX.js → llm-router-HUDPNZLJ.js} +4 -4
  231. package/dist/cli/chunks/llm-router-service-2D74XVM3.js +2 -0
  232. package/dist/cli/chunks/{load-5YDBWSCS.js → load-RM44POD7.js} +2 -2
  233. package/dist/cli/chunks/load-test-53FWOWNS.js +2 -0
  234. package/dist/cli/chunks/{mcp-UMAPMNMY.js → mcp-5JVQRBOP.js} +2 -2
  235. package/dist/cli/chunks/{memory-FWCPCQFP.js → memory-VGZ2V6PL.js} +5 -5
  236. package/dist/cli/chunks/memory-backend-KFJDDPEZ.js +2 -0
  237. package/dist/cli/chunks/memory-handlers-EI537Z32.js +2 -0
  238. package/dist/cli/chunks/{multi-model-executor-2XTBGLE4.js → multi-model-executor-WPRKCSCM.js} +2 -2
  239. package/dist/cli/chunks/{opencode-installer-GIXOJ6NS.js → opencode-installer-YAJMRCQO.js} +2 -2
  240. package/dist/cli/chunks/{orchestrator-VW6BKHLI.js → orchestrator-MUGWBUYP.js} +17 -17
  241. package/dist/cli/chunks/pattern-null-store-7DMU5CJ4.js +2 -0
  242. package/dist/cli/chunks/{pattern-usage-recorder-7CEUC3J7.js → pattern-usage-recorder-ZQJJ2YNG.js} +2 -2
  243. package/dist/cli/chunks/{pipeline-IGUQPPPO.js → pipeline-F4DXDUDC.js} +2 -2
  244. package/dist/cli/chunks/{platform-2P636I7B.js → platform-HI3A3OWF.js} +2 -2
  245. package/dist/cli/chunks/{plugin-NY6SWDPE.js → plugin-XRITPTR7.js} +2 -2
  246. package/dist/cli/chunks/{prime-radiant-advanced-wasm-2UUDTIO2.js → prime-radiant-advanced-wasm-HHNJP7CQ.js} +2 -2
  247. package/dist/cli/chunks/{project-root-IOISG5KX.js → project-root-2VN4WO2A.js} +2 -2
  248. package/dist/cli/chunks/protocol-executor-2EMTBTMG.js +2 -0
  249. package/dist/cli/chunks/{protocol-handler-ZTPCRQ5W.js → protocol-handler-ZEVHSEBG.js} +2 -2
  250. package/dist/cli/chunks/{prove-SQX5A3IG.js → prove-C4BLZWBS.js} +2 -2
  251. package/dist/cli/chunks/qe-reasoning-bank-VZHZZPHE.js +2 -0
  252. package/dist/cli/chunks/{quality-DROILKRY.js → quality-M3DTE4KK.js} +2 -2
  253. package/dist/cli/chunks/quality-gate-V6KS7ML3.js +7 -0
  254. package/dist/cli/chunks/queen-coordinator-7MYTTUHI.js +2 -0
  255. package/dist/cli/chunks/{real-embeddings-P5U3MGYC.js → real-embeddings-YWSE3IRT.js} +2 -2
  256. package/dist/cli/chunks/{ref-validation-KY73NQXD.js → ref-validation-ZWOTFA3T.js} +2 -2
  257. package/dist/cli/chunks/{roocode-installer-6JPPRB3W.js → roocode-installer-GJBIWETD.js} +2 -2
  258. package/dist/cli/chunks/router-ZD4LXAWA.js +2 -0
  259. package/dist/cli/chunks/routing-feedback-FSLMDVGD.js +2 -0
  260. package/dist/cli/chunks/{routing-handler-VTJIVFUO.js → routing-handler-CFYLGNAR.js} +2 -2
  261. package/dist/cli/chunks/{ruvector-commands-C6RPSJJO.js → ruvector-commands-EDKG456B.js} +2 -2
  262. package/dist/cli/chunks/rvf-dual-writer-LTKTDRFS.js +2 -0
  263. package/dist/cli/chunks/rvf-migration-adapter-IF24EVC5.js +2 -0
  264. package/dist/cli/chunks/{rvf-migration-coordinator-R53URRIO.js → rvf-migration-coordinator-ZMEYMAI6.js} +2 -2
  265. package/dist/cli/chunks/rvf-native-adapter-E6JNBKMZ.js +2 -0
  266. package/dist/cli/chunks/{rvf-store-integrity-MMXN5TEJ.js → rvf-store-integrity-AH6PNJP6.js} +2 -2
  267. package/dist/cli/chunks/safe-db-F6TRB5KZ.js +2 -0
  268. package/dist/cli/chunks/schedule-HBD4BYTE.js +2 -0
  269. package/dist/cli/chunks/scheduler-6FYWPMQC.js +2 -0
  270. package/dist/cli/chunks/{security-3B3R2NL4.js → security-ZU2GW3ZM.js} +3 -3
  271. package/dist/cli/chunks/{shared-rvf-adapter-VIJB7JUS.js → shared-rvf-adapter-5FOVSL3T.js} +2 -2
  272. package/dist/cli/chunks/{shared-rvf-dual-writer-UVWGDUWC.js → shared-rvf-dual-writer-IO4DC4XV.js} +2 -2
  273. package/dist/cli/chunks/sqlite-persistence-DOU72F5Z.js +2 -0
  274. package/dist/cli/chunks/{standalone-memory-M4LWAAYZ.js → standalone-memory-3UXDZ7HI.js} +2 -2
  275. package/dist/cli/chunks/{status-handler-YYFV6OZL.js → status-handler-264CHTWS.js} +2 -2
  276. package/dist/cli/chunks/{structural-health-27E6LLKB.js → structural-health-E2QPUOZE.js} +2 -2
  277. package/dist/cli/chunks/{sync-J3LJ56WN.js → sync-2ACMWM7D.js} +2 -2
  278. package/dist/cli/chunks/sync-N2L2OST4.js +2 -0
  279. package/dist/cli/chunks/{task-handler-4MCEBQZL.js → task-handler-IB5CVOTY.js} +2 -2
  280. package/dist/cli/chunks/task-handlers-QBMYNJHE.js +9 -0
  281. package/dist/cli/chunks/test-7RGLRDSP.js +33 -0
  282. package/dist/cli/chunks/{test-scheduling-ZJBFRZ3J.js → test-scheduling-RJABJT2W.js} +3 -3
  283. package/dist/cli/chunks/token-bootstrap-JVHMHB72.js +2 -0
  284. package/dist/cli/chunks/{token-usage-3X5WMTG2.js → token-usage-3ECHQVCY.js} +2 -2
  285. package/dist/cli/chunks/{transformers-MVL4C5IX.js → transformers-KJH3IJWI.js} +2 -2
  286. package/dist/cli/chunks/{tree-sitter-wasm-parser-SLW65ZFO.js → tree-sitter-wasm-parser-XN6PFI32.js} +2 -2
  287. package/dist/cli/chunks/{types-TG5P3CRS.js → types-5BAPXOLS.js} +2 -2
  288. package/dist/cli/chunks/unified-memory-GHAYAXWZ.js +2 -0
  289. package/dist/cli/chunks/unified-memory-hnsw-CCC63YXT.js +2 -0
  290. package/dist/cli/chunks/unified-persistence-HKRHI5PG.js +2 -0
  291. package/dist/cli/chunks/{upgrade-ETBHDEPY.js → upgrade-S5NFQZID.js} +2 -2
  292. package/dist/cli/chunks/{validate-C2A73LZK.js → validate-BIBWOLJD.js} +2 -2
  293. package/dist/cli/chunks/{validate-swarm-67XN42ML.js → validate-swarm-WAA3LBHH.js} +2 -2
  294. package/dist/cli/chunks/visual-security-APOXJ3Q3.js +2 -0
  295. package/dist/cli/chunks/{web-tree-sitter-USJN77P4.js → web-tree-sitter-OTBQTHAV.js} +2 -2
  296. package/dist/cli/chunks/{windsurf-installer-5GGZXGJW.js → windsurf-installer-NNQ22EW6.js} +2 -2
  297. package/dist/cli/chunks/witness-chain-7IP5IJGT.js +2 -0
  298. package/dist/cli/chunks/{witness-chain-IWS5ZHHL.js → witness-chain-E7MUBOJW.js} +2 -2
  299. package/dist/cli/chunks/witness-chain-repair-FW4QSN4C.js +2 -0
  300. package/dist/cli/chunks/{witness-chain-verifier-3GEADWPE.js → witness-chain-verifier-YMROEBVL.js} +2 -2
  301. package/dist/cli/chunks/{witness-key-manager-ZWEIK3VJ.js → witness-key-manager-4CGRNDMJ.js} +2 -2
  302. package/dist/cli/chunks/{workflow-KHMVVBBA.js → workflow-4VRSTRAN.js} +4 -4
  303. package/dist/cli/chunks/workflow-orchestrator-2HNW5ZMQ.js +2 -0
  304. package/dist/cli/chunks/wrappers-4M4UTGEU.js +2 -0
  305. package/dist/cli/commands/ci.js +18 -7
  306. package/dist/cli/commands/quality-gate.js +6 -1
  307. package/dist/cli/commands/test.js +18 -3
  308. package/dist/cli/handlers/init-handler.d.ts +2 -0
  309. package/dist/cli/handlers/init-handler.js +8 -2
  310. package/dist/cli/index.js +15 -2
  311. package/dist/cli/process-store-cleanup.d.ts +7 -0
  312. package/dist/cli/process-store-cleanup.js +27 -0
  313. package/dist/cli/utils/ci-config.d.ts +3 -3
  314. package/dist/cli/utils/ci-config.js +202 -68
  315. package/dist/coordination/handlers/test-execution-handlers.js +13 -8
  316. package/dist/coordination/index.d.ts +1 -1
  317. package/dist/coordination/queen-event-handlers.js +9 -6
  318. package/dist/coordination/result-saver.js +1 -1
  319. package/dist/coordination/services/index.d.ts +1 -1
  320. package/dist/coordination/services/task-audit-logger.d.ts +38 -13
  321. package/dist/coordination/services/task-audit-logger.js +33 -5
  322. package/dist/coordination/task-executor.d.ts +5 -0
  323. package/dist/coordination/task-executor.js +10 -5
  324. package/dist/domains/quality-assessment/quality-evidence.d.ts +3 -1
  325. package/dist/domains/quality-assessment/quality-evidence.js +7 -2
  326. package/dist/domains/test-execution/services/retry-handler.js +32 -13
  327. package/dist/domains/test-execution/services/test-executor.d.ts +3 -3
  328. package/dist/domains/test-execution/services/test-executor.js +66 -22
  329. package/dist/domains/test-generation/coordinator.js +6 -5
  330. package/dist/domains/test-generation/interfaces.d.ts +11 -1
  331. package/dist/domains/test-generation/services/behavior-example-validation.d.ts +36 -0
  332. package/dist/domains/test-generation/services/behavior-example-validation.js +89 -0
  333. package/dist/domains/test-generation/services/behavior-examples.d.ts +8 -0
  334. package/dist/domains/test-generation/services/behavior-examples.js +65 -0
  335. package/dist/domains/test-generation/services/test-generator.d.ts +1 -1
  336. package/dist/domains/test-generation/services/test-generator.js +59 -30
  337. package/dist/domains/visual-accessibility/services/axe-core-audit.d.ts +0 -15
  338. package/dist/domains/visual-accessibility/services/axe-core-audit.js +12 -10
  339. package/dist/init/browser-engine-installer.d.ts +5 -5
  340. package/dist/init/browser-engine-installer.js +28 -6
  341. package/dist/init/fleet-integration.js +3 -2
  342. package/dist/init/init-wizard-steps.js +3 -2
  343. package/dist/init/init-wizard.d.ts +2 -0
  344. package/dist/init/orchestrator.js +1 -0
  345. package/dist/init/phases/06-code-intelligence.js +6 -4
  346. package/dist/init/phases/09-assets.js +8 -18
  347. package/dist/init/phases/phase-interface.d.ts +2 -0
  348. package/dist/integrations/agentic-flow/reasoning-bank/index.d.ts +2 -5
  349. package/dist/integrations/ruvector/sona-persistence.d.ts +1 -0
  350. package/dist/integrations/ruvector/sona-persistence.js +74 -20
  351. package/dist/integrations/ruvector/sona-wrapper.d.ts +2 -0
  352. package/dist/integrations/ruvector/sona-wrapper.js +13 -0
  353. package/dist/integrations/vibium/client.d.ts +1 -0
  354. package/dist/integrations/vibium/client.js +24 -11
  355. package/dist/integrations/vibium/runtime.d.ts +14 -0
  356. package/dist/integrations/vibium/runtime.js +94 -0
  357. package/dist/kernel/memory-backend.js +5 -4
  358. package/dist/kernel/pattern-fts-self-heal.d.ts +63 -0
  359. package/dist/kernel/pattern-fts-self-heal.js +193 -0
  360. package/dist/kernel/process-lifecycle.d.ts +60 -0
  361. package/dist/kernel/process-lifecycle.js +91 -0
  362. package/dist/kernel/unified-memory-schemas.d.ts +15 -1
  363. package/dist/kernel/unified-memory-schemas.js +53 -25
  364. package/dist/kernel/unified-memory.js +34 -36
  365. package/dist/kernel/unified-persistence.js +12 -6
  366. package/dist/learning/aqe-learning-engine.js +3 -2
  367. package/dist/learning/experience-capture.d.ts +2 -1
  368. package/dist/learning/experience-capture.js +23 -8
  369. package/dist/learning/pattern-store.d.ts +1 -1
  370. package/dist/learning/pattern-store.js +27 -30
  371. package/dist/learning/qe-patterns.d.ts +6 -0
  372. package/dist/learning/qe-reasoning-bank.d.ts +1 -0
  373. package/dist/learning/qe-reasoning-bank.js +14 -4
  374. package/dist/learning/real-qe-reasoning-bank.d.ts +9 -4
  375. package/dist/learning/real-qe-reasoning-bank.js +28 -4
  376. package/dist/learning/rvf-pattern-store.js +19 -19
  377. package/dist/learning/sqlite-persistence.js +9 -24
  378. package/dist/mcp/bundle.js +545 -581
  379. package/dist/mcp/connection-pool.d.ts +2 -0
  380. package/dist/mcp/connection-pool.js +13 -2
  381. package/dist/mcp/entry.js +52 -6
  382. package/dist/mcp/handlers/domain-handler-configs.js +12 -4
  383. package/dist/mcp/handlers/memory-handlers.d.ts +1 -0
  384. package/dist/mcp/handlers/memory-handlers.js +16 -6
  385. package/dist/mcp/handlers/task-handlers.js +11 -7
  386. package/dist/mcp/protocol-server.js +47 -11
  387. package/dist/mcp/services/reasoning-bank-service.d.ts +6 -1
  388. package/dist/mcp/services/reasoning-bank-service.js +5 -1
  389. package/dist/mcp/tools/test-execution/e2e-execute.js +9 -1
  390. package/dist/mcp/tools/test-generation/generate.d.ts +6 -1
  391. package/dist/mcp/tools/test-generation/generate.js +8 -0
  392. package/dist/mcp/types.d.ts +8 -2
  393. package/dist/optimization/session-cache.js +13 -11
  394. package/dist/plugins/cache.js +10 -3
  395. package/dist/shared/embeddings/embedding-cache.js +4 -4
  396. package/dist/shared/error-utils.d.ts +15 -0
  397. package/dist/shared/error-utils.js +21 -0
  398. package/dist/shared/events/domain-events.d.ts +2 -1
  399. package/dist/shared/llm/cache.js +7 -10
  400. package/dist/shared/retry-engine.js +4 -0
  401. package/dist/shared/test-runner-process.d.ts +10 -0
  402. package/dist/shared/test-runner-process.js +210 -0
  403. package/dist/validation/quality-verdict.js +3 -2
  404. package/dist/workers/quality-daemon/priority-queue.js +4 -1
  405. package/package.json +10 -6
  406. package/dist/cli/chunks/adapter-UYOJPTOX.js +0 -2
  407. package/dist/cli/chunks/aqe-learning-engine-JR5AVQXR.js +0 -2
  408. package/dist/cli/chunks/base-DRZ2LS6X.js +0 -2
  409. package/dist/cli/chunks/browser-workflow-CJ7T3MXF.js +0 -2
  410. package/dist/cli/chunks/chunk-3NIG7S5W.js +0 -2
  411. package/dist/cli/chunks/chunk-4N23RFDU.js +0 -2
  412. package/dist/cli/chunks/chunk-AHKELLIO.js +0 -12
  413. package/dist/cli/chunks/chunk-DK4XN4CU.js +0 -2
  414. package/dist/cli/chunks/chunk-E6G2RD5H.js +0 -4
  415. package/dist/cli/chunks/chunk-MJS53PRX.js +0 -2
  416. package/dist/cli/chunks/chunk-PZPWRQ2M.js +0 -21
  417. package/dist/cli/chunks/chunk-QGA55PFM.js +0 -12
  418. package/dist/cli/chunks/chunk-SPV2VKC5.js +0 -3
  419. package/dist/cli/chunks/chunk-TCHGOB2N.js +0 -2
  420. package/dist/cli/chunks/chunk-UKA2KOXE.js +0 -2
  421. package/dist/cli/chunks/chunk-WCJBU2KI.js +0 -2
  422. package/dist/cli/chunks/chunk-Z6GGIRQQ.js +0 -65
  423. package/dist/cli/chunks/ci-W6K6G2KZ.js +0 -81
  424. package/dist/cli/chunks/client-KHWJT6FB.js +0 -2
  425. package/dist/cli/chunks/core-handlers-HING5RRG.js +0 -2
  426. package/dist/cli/chunks/cross-domain-router-PQTD6AZN.js +0 -2
  427. package/dist/cli/chunks/domain-transfer-M36KUJ2U.js +0 -2
  428. package/dist/cli/chunks/dream-WUGRSNCV.js +0 -2
  429. package/dist/cli/chunks/heartbeat-scheduler-33XX5XNQ.js +0 -2
  430. package/dist/cli/chunks/hnsw-adapter-XQPERX3H.js +0 -2
  431. package/dist/cli/chunks/hnsw-index-2GNXTWHH.js +0 -2
  432. package/dist/cli/chunks/hybrid-backend-CCF7URKI.js +0 -2
  433. package/dist/cli/chunks/impact-analyzer-HGKAZWIG.js +0 -2
  434. package/dist/cli/chunks/init-wizard-72MFBI3G.js +0 -2
  435. package/dist/cli/chunks/kernel-BRCBVMSK.js +0 -2
  436. package/dist/cli/chunks/knowledge-graph-DG44IPEI.js +0 -2
  437. package/dist/cli/chunks/llm-router-service-24KXFX32.js +0 -2
  438. package/dist/cli/chunks/load-test-N4TAYJY3.js +0 -2
  439. package/dist/cli/chunks/memory-backend-NVYFYVAU.js +0 -2
  440. package/dist/cli/chunks/memory-handlers-UTWCNCHL.js +0 -2
  441. package/dist/cli/chunks/pattern-null-store-SBPNYDBR.js +0 -2
  442. package/dist/cli/chunks/protocol-executor-IBYEII5Q.js +0 -2
  443. package/dist/cli/chunks/qe-reasoning-bank-7IETWW6W.js +0 -2
  444. package/dist/cli/chunks/quality-gate-PWKWDJY2.js +0 -7
  445. package/dist/cli/chunks/queen-coordinator-NHUK2MWJ.js +0 -2
  446. package/dist/cli/chunks/router-SRSO3IHF.js +0 -2
  447. package/dist/cli/chunks/routing-feedback-PASRE5HY.js +0 -2
  448. package/dist/cli/chunks/rvf-dual-writer-4M4J67OU.js +0 -2
  449. package/dist/cli/chunks/rvf-migration-adapter-TSXGT5LF.js +0 -2
  450. package/dist/cli/chunks/rvf-native-adapter-MOF3E7BR.js +0 -2
  451. package/dist/cli/chunks/safe-db-QJLFO33B.js +0 -2
  452. package/dist/cli/chunks/schedule-YIVXW5O2.js +0 -2
  453. package/dist/cli/chunks/scheduler-AON7DWSJ.js +0 -2
  454. package/dist/cli/chunks/sqlite-persistence-75VHKKQB.js +0 -2
  455. package/dist/cli/chunks/sync-26CEGSTC.js +0 -2
  456. package/dist/cli/chunks/task-handlers-GYBAWKE2.js +0 -9
  457. package/dist/cli/chunks/test-MPC5HRH5.js +0 -33
  458. package/dist/cli/chunks/token-bootstrap-2Y2XITBX.js +0 -2
  459. package/dist/cli/chunks/unified-memory-UCQ6AB32.js +0 -2
  460. package/dist/cli/chunks/unified-memory-hnsw-IXYUMKRR.js +0 -2
  461. package/dist/cli/chunks/unified-persistence-7E6JQ4FZ.js +0 -2
  462. package/dist/cli/chunks/vibium-NILGKHLN.js +0 -2
  463. package/dist/cli/chunks/visual-security-4VZXPEVG.js +0 -2
  464. package/dist/cli/chunks/witness-chain-JQA2VPZI.js +0 -2
  465. package/dist/cli/chunks/witness-chain-repair-4UA7IPS3.js +0 -2
  466. package/dist/cli/chunks/workflow-orchestrator-GI5NQH7C.js +0 -2
  467. package/dist/cli/chunks/wrappers-N6XIK5PT.js +0 -2
@@ -21,6 +21,34 @@ export interface TaskAuditEntry {
21
21
  readonly domain?: DomainName;
22
22
  readonly details?: Record<string, unknown>;
23
23
  }
24
+ /** An entry produced by this logger, positioned within its generation. */
25
+ export interface TaskAuditSequencedEntry extends TaskAuditEntry {
26
+ readonly sequence: number;
27
+ }
28
+ /** Filters select retained entries; they do not change retention metadata. */
29
+ export interface TaskAuditFilter {
30
+ operation?: TaskOperation;
31
+ taskId?: string;
32
+ agentId?: string;
33
+ domain?: DomainName;
34
+ fromTimestamp?: Date;
35
+ toTimestamp?: Date;
36
+ limit?: number;
37
+ }
38
+ /** Completeness of the bounded observation window since construction/clear. */
39
+ export interface TaskAuditWindow {
40
+ generation: string;
41
+ recordedEntries: number;
42
+ retainedEntries: number;
43
+ droppedEntries: number;
44
+ firstRetainedSequence: number | null;
45
+ lastRetainedSequence: number | null;
46
+ disposition: 'complete' | 'truncated';
47
+ }
48
+ /** Filtered entries with metadata for the entire retained window. */
49
+ export interface TaskAuditSnapshot extends TaskAuditWindow {
50
+ entries: TaskAuditSequencedEntry[];
51
+ }
24
52
  /**
25
53
  * Configuration for task audit logger
26
54
  */
@@ -41,6 +69,9 @@ export interface TaskAuditConfig {
41
69
  export declare class TaskAuditLogger {
42
70
  private readonly entries;
43
71
  private readonly config;
72
+ private generation;
73
+ private recordedEntries;
74
+ private droppedEntries;
44
75
  constructor(config?: Partial<TaskAuditConfig>);
45
76
  /**
46
77
  * Log a task operation
@@ -65,19 +96,13 @@ export declare class TaskAuditLogger {
65
96
  /**
66
97
  * Get audit entries with optional filtering
67
98
  */
68
- getEntries(filter?: {
69
- operation?: TaskOperation;
70
- taskId?: string;
71
- agentId?: string;
72
- domain?: DomainName;
73
- fromTimestamp?: Date;
74
- toTimestamp?: Date;
75
- limit?: number;
76
- }): TaskAuditEntry[];
77
- /**
78
- * Get statistics about task operations
79
- */
80
- getStatistics(): {
99
+ getEntries(filter?: TaskAuditFilter): TaskAuditSequencedEntry[];
100
+ /** Get selected entries without losing evidence of earlier evictions/resets. */
101
+ getSnapshot(filter?: TaskAuditFilter): TaskAuditSnapshot;
102
+ private getWindow;
103
+ /** Get counts for the retained window, with its completeness metadata. */
104
+ getStatistics(): TaskAuditWindow & {
105
+ basis: 'retained-window';
81
106
  totalEntries: number;
82
107
  operationCounts: Record<TaskOperation, number>;
83
108
  taskCount: number;
@@ -5,6 +5,7 @@
5
5
  * This replaces the full authorization service with simple audit logging
6
6
  * for a local CLI tool where all agents are trusted.
7
7
  */
8
+ import { randomUUID } from 'node:crypto';
8
9
  const DEFAULT_CONFIG = {
9
10
  enableConsoleLog: true,
10
11
  maxEntries: 1000,
@@ -19,14 +20,21 @@ const DEFAULT_CONFIG = {
19
20
  export class TaskAuditLogger {
20
21
  entries = [];
21
22
  config;
23
+ generation = randomUUID();
24
+ recordedEntries = 0;
25
+ droppedEntries = 0;
22
26
  constructor(config = {}) {
23
27
  this.config = { ...DEFAULT_CONFIG, ...config };
28
+ if (!Number.isSafeInteger(this.config.maxEntries) || this.config.maxEntries < 0) {
29
+ throw new RangeError('maxEntries must be a non-negative safe integer');
30
+ }
24
31
  }
25
32
  /**
26
33
  * Log a task operation
27
34
  */
28
35
  log(operation, taskId, options) {
29
36
  const entry = {
37
+ sequence: ++this.recordedEntries,
30
38
  timestamp: new Date(),
31
39
  operation,
32
40
  taskId,
@@ -37,7 +45,9 @@ export class TaskAuditLogger {
37
45
  this.entries.push(entry);
38
46
  // Trim if exceeds max
39
47
  if (this.entries.length > this.config.maxEntries) {
40
- this.entries.splice(0, this.entries.length - this.config.maxEntries);
48
+ const dropped = this.entries.length - this.config.maxEntries;
49
+ this.entries.splice(0, dropped);
50
+ this.droppedEntries += dropped;
41
51
  }
42
52
  // Console log if enabled
43
53
  if (this.config.enableConsoleLog) {
@@ -102,11 +112,24 @@ export class TaskAuditLogger {
102
112
  }
103
113
  }
104
114
  const limit = filter?.limit ?? result.length;
105
- return result.slice(-limit);
115
+ return limit === 0 ? [] : result.slice(-limit);
106
116
  }
107
- /**
108
- * Get statistics about task operations
109
- */
117
+ /** Get selected entries without losing evidence of earlier evictions/resets. */
118
+ getSnapshot(filter) {
119
+ return { ...this.getWindow(), entries: this.getEntries(filter) };
120
+ }
121
+ getWindow() {
122
+ return {
123
+ generation: this.generation,
124
+ recordedEntries: this.recordedEntries,
125
+ retainedEntries: this.entries.length,
126
+ droppedEntries: this.droppedEntries,
127
+ firstRetainedSequence: this.entries[0]?.sequence ?? null,
128
+ lastRetainedSequence: this.entries[this.entries.length - 1]?.sequence ?? null,
129
+ disposition: this.droppedEntries > 0 ? 'truncated' : 'complete',
130
+ };
131
+ }
132
+ /** Get counts for the retained window, with its completeness metadata. */
110
133
  getStatistics() {
111
134
  const operationCounts = {
112
135
  submit: 0,
@@ -129,6 +152,8 @@ export class TaskAuditLogger {
129
152
  }
130
153
  }
131
154
  return {
155
+ ...this.getWindow(),
156
+ basis: 'retained-window',
132
157
  totalEntries: this.entries.length,
133
158
  operationCounts,
134
159
  taskCount: taskIds.size,
@@ -140,6 +165,9 @@ export class TaskAuditLogger {
140
165
  */
141
166
  clear() {
142
167
  this.entries.length = 0;
168
+ this.generation = randomUUID();
169
+ this.recordedEntries = 0;
170
+ this.droppedEntries = 0;
143
171
  }
144
172
  }
145
173
  /**
@@ -154,6 +154,11 @@ export declare class DomainTaskExecutor implements TaskHandlerContext {
154
154
  private getTaskDomain;
155
155
  private timeout;
156
156
  private publishTaskCompleted;
157
+ /**
158
+ * @param callerError true when the task was rejected because of invalid
159
+ * caller input; the queen then neither retries it nor counts it toward
160
+ * the domain circuit breaker.
161
+ */
157
162
  private publishTaskFailed;
158
163
  }
159
164
  export declare function createTaskExecutor(kernel: QEKernel, config?: Partial<TaskExecutorConfig>): DomainTaskExecutor;
@@ -13,7 +13,7 @@
13
13
  * Handler implementations are extracted into ./handlers/ modules.
14
14
  */
15
15
  import { v4 as uuidv4 } from 'uuid';
16
- import { toErrorMessage } from '../shared/error-utils.js';
16
+ import { isCallerInputError, toErrorMessage } from '../shared/error-utils.js';
17
17
  import { createResultSaver } from './result-saver.js';
18
18
  import { createLogger } from '../logging/logger-factory.js';
19
19
  import { getClaudeModelForTier } from '../shared/llm/model-registry.js';
@@ -436,7 +436,7 @@ export class DomainTaskExecutor {
436
436
  ]);
437
437
  if (!result.success) {
438
438
  const errorMsg = 'error' in result ? result.error.message : 'Unknown error';
439
- await this.publishTaskFailed(task.id, errorMsg, domain);
439
+ await this.publishTaskFailed(task.id, errorMsg, domain, 'error' in result && isCallerInputError(result.error));
440
440
  // ADR-051: Record failed outcome
441
441
  this.recordOutcome(task, routingTier, false, Date.now() - startTime).catch((e) => { logger.warn('recordOutcome failed', { error: e instanceof Error ? e.message : String(e), taskId: task.id }); });
442
442
  return {
@@ -486,7 +486,7 @@ export class DomainTaskExecutor {
486
486
  }
487
487
  catch (error) {
488
488
  const errorMessage = toErrorMessage(error);
489
- await this.publishTaskFailed(task.id, errorMessage, domain);
489
+ await this.publishTaskFailed(task.id, errorMessage, domain, isCallerInputError(error));
490
490
  // ADR-051: Record failed outcome
491
491
  this.recordOutcome(task, routingTier, false, Date.now() - startTime).catch((e) => { logger.warn('recordOutcome failed', { error: e instanceof Error ? e.message : String(e), taskId: task.id }); });
492
492
  return {
@@ -655,13 +655,18 @@ export class DomainTaskExecutor {
655
655
  payload: { taskId, result },
656
656
  });
657
657
  }
658
- async publishTaskFailed(taskId, error, domain) {
658
+ /**
659
+ * @param callerError true when the task was rejected because of invalid
660
+ * caller input; the queen then neither retries it nor counts it toward
661
+ * the domain circuit breaker.
662
+ */
663
+ async publishTaskFailed(taskId, error, domain, callerError = false) {
659
664
  await this.eventBus.publish({
660
665
  id: uuidv4(),
661
666
  type: 'TaskFailed',
662
667
  timestamp: new Date(),
663
668
  source: domain,
664
- payload: { taskId, error },
669
+ payload: { taskId, error, ...(callerError ? { callerError: true } : {}) },
665
670
  });
666
671
  }
667
672
  }
@@ -33,7 +33,9 @@ export declare function loadQualityEvidence(memory: MemoryBackend, options?: {
33
33
  now?: number;
34
34
  maxAgeMs?: number;
35
35
  }): Promise<QualityEvidenceValues>;
36
- export declare function evaluateQualityEvidence(values: QualityEvidenceValues): {
36
+ export declare function evaluateQualityEvidence(values: QualityEvidenceValues, thresholds?: {
37
+ coverage?: number;
38
+ }): {
37
39
  passed: boolean;
38
40
  checks: EvaluatedQualityCheck[];
39
41
  recommendations: string[];
@@ -91,9 +91,14 @@ export async function loadQualityEvidence(memory, options = {}) {
91
91
  }
92
92
  return values;
93
93
  }
94
- export function evaluateQualityEvidence(values) {
94
+ export function evaluateQualityEvidence(values, thresholds = {}) {
95
+ if (thresholds.coverage !== undefined && (!Number.isFinite(thresholds.coverage) || thresholds.coverage < 0 || thresholds.coverage > 100)) {
96
+ throw new Error('Coverage quality threshold must be a finite number between 0 and 100.');
97
+ }
95
98
  const checks = QUALITY_METRICS.map((name) => {
96
- const threshold = DEFAULT_QUALITY_THRESHOLDS[name];
99
+ const threshold = name === 'coverage' && thresholds.coverage !== undefined
100
+ ? { ...DEFAULT_QUALITY_THRESHOLDS[name], value: thresholds.coverage }
101
+ : DEFAULT_QUALITY_THRESHOLDS[name];
97
102
  const value = values[name];
98
103
  return {
99
104
  name,
@@ -11,6 +11,7 @@ import { TEST_EXECUTION_CONSTANTS, RETRY_CONSTANTS } from '../../constants.js';
11
11
  import { toError } from '../../../shared/error-utils.js';
12
12
  import { safeJsonParse } from '../../../shared/safe-json.js';
13
13
  import { secureRandom } from '../../../shared/utils/crypto-random.js';
14
+ import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
14
15
  const DEFAULT_RETRY_CONFIG = {
15
16
  simulateForTesting: false,
16
17
  simulatedRetrySuccessRate: RETRY_CONSTANTS.DEFAULT_FLAKY_PASS_RATE,
@@ -379,6 +380,8 @@ export class RetryHandlerService {
379
380
  let stdout = '';
380
381
  let stderr = '';
381
382
  let timedOut = false;
383
+ let termination;
384
+ const timeoutError = new Error(`Test execution timed out after ${timeout}ms for command: ${command} ${args.join(' ')}`);
382
385
  const settle = (fn, value) => {
383
386
  report?.cleanup();
384
387
  fn(value);
@@ -387,13 +390,20 @@ export class RetryHandlerService {
387
390
  // Arguments are passed as array to avoid shell interpretation
388
391
  const proc = spawn(command, args, {
389
392
  cwd,
393
+ detached: process.platform !== 'win32',
390
394
  env: { ...process.env, FORCE_COLOR: '0', CI: 'true' },
391
395
  });
396
+ const untrackExit = trackTestRunnerExit(proc);
392
397
  const timeoutHandle = setTimeout(() => {
393
398
  timedOut = true;
394
- proc.kill('SIGTERM');
395
- // Give it a moment to terminate gracefully, then force kill
396
- setTimeout(() => proc.kill('SIGKILL'), 1000);
399
+ termination = terminateTestRunner(proc);
400
+ termination.catch(error => {
401
+ logger.warn(`Retry runner cleanup failed: ${toError(error).message}`);
402
+ // A denied cleanup can leave the root alive: preserve the timeout
403
+ // outcome immediately, keeping artifacts because settlement is unknown.
404
+ reject(timeoutError);
405
+ });
406
+ termination.then(untrackExit, () => undefined);
397
407
  }, timeout);
398
408
  proc.stdout?.on('data', (data) => {
399
409
  stdout += data.toString();
@@ -404,9 +414,10 @@ export class RetryHandlerService {
404
414
  proc.on('close', (code) => {
405
415
  clearTimeout(timeoutHandle);
406
416
  if (timedOut) {
407
- settle(reject, new Error(`Test execution timed out after ${timeout}ms for command: ${command} ${args.join(' ')}`));
417
+ termination?.then(() => settle(reject, timeoutError), () => reject(timeoutError));
408
418
  return;
409
419
  }
420
+ untrackExit();
410
421
  // Parse result based on exit code and output (Vitest writes the JSON
411
422
  // report to the --outputFile; read it back rather than trusting stdout).
412
423
  try {
@@ -422,6 +433,7 @@ export class RetryHandlerService {
422
433
  });
423
434
  proc.on('error', (err) => {
424
435
  clearTimeout(timeoutHandle);
436
+ untrackExit();
425
437
  report?.cleanup();
426
438
  reject(new Error(`Failed to spawn test process: ${err.message}. ` +
427
439
  `Command: ${command} ${args.join(' ')}. ` +
@@ -433,20 +445,23 @@ export class RetryHandlerService {
433
445
  * Parse test runner output to determine pass/fail status
434
446
  */
435
447
  parseTestResult(exitCode, stdout, stderr) {
436
- // A passing process and a passing report must agree when JSON is available.
448
+ // A retry can clear a prior failure only when the report proves a test
449
+ // actually passed. Empty/fully skipped selections can also exit zero.
437
450
  try {
438
451
  // Vitest JSON output
439
452
  const vitestMatch = stdout.match(/\{[\s\S]*"testResults"[\s\S]*\}/);
440
453
  if (vitestMatch) {
441
454
  const result = safeJsonParse(vitestMatch[0]);
442
455
  if (exitCode === 0 && result.success !== false
443
- && result.numFailedTests === 0 && result.numFailedTestSuites === 0) {
456
+ && result.numFailedTests === 0 && result.numFailedTestSuites === 0
457
+ && Number.isFinite(result.numPassedTests) && result.numPassedTests > 0) {
444
458
  return { passed: true };
445
459
  }
446
460
  const failedTest = result.testResults?.[0]?.assertionResults?.find((r) => r.status === 'failed');
447
461
  return {
448
462
  passed: false,
449
- error: failedTest?.failureMessages?.join('\n') || stderr || `Test failed with exit code ${exitCode}`,
463
+ error: failedTest?.failureMessages?.join('\n') || stderr
464
+ || (exitCode === 0 ? 'Retry runner did not report any passing tests.' : `Test failed with exit code ${exitCode}`),
450
465
  };
451
466
  }
452
467
  // Jest JSON output
@@ -454,34 +469,38 @@ export class RetryHandlerService {
454
469
  if (jestMatch) {
455
470
  const result = safeJsonParse(jestMatch[0]);
456
471
  if (exitCode === 0 && result.success !== false
457
- && result.numFailedTests === 0 && result.numFailedTestSuites === 0) {
472
+ && result.numFailedTests === 0 && result.numFailedTestSuites === 0
473
+ && Number.isFinite(result.numPassedTests) && result.numPassedTests > 0) {
458
474
  return { passed: true };
459
475
  }
460
476
  const failedTest = result.testResults?.[0]?.assertionResults?.find((r) => r.status === 'failed');
461
477
  return {
462
478
  passed: false,
463
- error: failedTest?.failureMessages?.join('\n') || stderr || `Test failed with exit code ${exitCode}`,
479
+ error: failedTest?.failureMessages?.join('\n') || stderr
480
+ || (exitCode === 0 ? 'Retry runner did not report any passing tests.' : `Test failed with exit code ${exitCode}`),
464
481
  };
465
482
  }
466
483
  // Mocha JSON output
467
484
  const mochaMatch = stdout.match(/\{[\s\S]*"stats"[\s\S]*"failures"[\s\S]*\}/);
468
485
  if (mochaMatch) {
469
486
  const result = safeJsonParse(mochaMatch[0]);
470
- if (exitCode === 0 && result.stats?.failures === 0) {
487
+ if (exitCode === 0 && result.stats?.failures === 0
488
+ && Number.isFinite(result.stats?.passes) && result.stats.passes > 0) {
471
489
  return { passed: true };
472
490
  }
473
491
  const failure = result.failures?.[0];
474
492
  return {
475
493
  passed: false,
476
- error: failure?.err?.message || stderr || `Test failed with exit code ${exitCode}`,
494
+ error: failure?.err?.message || stderr
495
+ || (exitCode === 0 ? 'Retry runner did not report any passing tests.' : `Test failed with exit code ${exitCode}`),
477
496
  };
478
497
  }
479
498
  }
480
499
  catch {
481
- // JSON parsing failed, fall back to simple exit code check
500
+ // Unreadable output cannot prove that the retry executed a passing test.
482
501
  }
483
502
  if (exitCode === 0)
484
- return { passed: true };
503
+ return { passed: false, error: 'Retry runner did not report any passing tests.' };
485
504
  // Non-zero exit code means failure
486
505
  const errorOutput = stderr || stdout || `Test failed with exit code ${exitCode}`;
487
506
  return {
@@ -170,9 +170,9 @@ export declare class TestExecutorService implements ITestExecutionService {
170
170
  */
171
171
  private extractCoverageFromJson;
172
172
  /**
173
- * Read coverage from disk files written by vitest/jest.
174
- * Both runners write coverage-summary.json to a coverage/ directory when
175
- * --coverage is passed, rather than embedding it in stdout JSON.
173
+ * Read coverage from the private output directory of a completed runner.
174
+ * Setting the directory does not enable coverage; project configuration
175
+ * still decides whether coverage is collected.
176
176
  */
177
177
  private readCoverageFromDisk;
178
178
  private storeResults;
@@ -4,7 +4,8 @@
4
4
  */
5
5
  import { LoggerFactory } from '../../../logging/index.js';
6
6
  import { spawn } from 'node:child_process';
7
- import { existsSync, readFileSync } from 'node:fs';
7
+ import { existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';
8
+ import { tmpdir } from 'node:os';
8
9
  import { join } from 'node:path';
9
10
  import { v4 as uuidv4 } from 'uuid';
10
11
  import { ok, err } from '../../../shared/types/index.js';
@@ -16,6 +17,7 @@ import { writeQualityEvidence } from '../../quality-assessment/quality-evidence.
16
17
  import { getTestRunnerExecutionError, TestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
17
18
  import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
18
19
  import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
20
+ import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
19
21
  const DEFAULT_CONFIG = {
20
22
  simulateForTesting: false,
21
23
  simulatedTestsPerFile: 5,
@@ -368,19 +370,29 @@ Provide:
368
370
  return err(new Error(`Test file not found: ${missingFile}`));
369
371
  }
370
372
  // Build command based on framework
371
- const { command, args, report } = this.buildTestCommand(files, framework);
373
+ const { command, args, report, coverageDirectory } = this.buildTestCommand(files, framework);
372
374
  const fileLabel = files.join(', ');
373
375
  return new Promise((resolve) => {
374
376
  let stdout = '';
375
377
  let stderr = '';
376
378
  let killed = false;
379
+ let termination;
377
380
  let settled = false;
381
+ const cleanupArtifacts = () => {
382
+ report?.cleanup();
383
+ if (coverageDirectory) {
384
+ try {
385
+ rmSync(coverageDirectory, { recursive: true, force: true });
386
+ }
387
+ catch { /* Best effort. */ }
388
+ }
389
+ };
378
390
  const finish = (result, cleanup = true) => {
379
391
  if (settled)
380
392
  return;
381
393
  settled = true;
382
394
  if (cleanup)
383
- report?.cleanup();
395
+ cleanupArtifacts();
384
396
  resolve(result);
385
397
  };
386
398
  // Spawn the test runner process
@@ -390,6 +402,7 @@ Provide:
390
402
  try {
391
403
  proc = spawn(command, args, {
392
404
  cwd: process.cwd(),
405
+ detached: process.platform !== 'win32',
393
406
  env: {
394
407
  ...process.env,
395
408
  FORCE_COLOR: '0', // Disable color codes for easier parsing
@@ -401,10 +414,15 @@ Provide:
401
414
  finish(err(new Error(`Failed to spawn test runner: ${toErrorMessage(error)}. Is '${command}' installed?`)));
402
415
  return;
403
416
  }
417
+ const untrackExit = trackTestRunnerExit(proc);
404
418
  // Set timeout
405
419
  const timeoutId = setTimeout(() => {
406
420
  killed = true;
407
- proc.kill('SIGTERM');
421
+ termination = terminateTestRunner(proc);
422
+ // Keep the timeout outcome immediate; cleanup waits for the owned
423
+ // group, rather than treating the root's close as descendant exit.
424
+ termination.catch(error => logger.warn(`Test runner cleanup failed: ${toErrorMessage(error)}`));
425
+ termination.then(untrackExit, () => undefined);
408
426
  finish(err(new Error(`Test execution timed out after ${timeout}ms for files: ${fileLabel}`)), false);
409
427
  }, timeout);
410
428
  proc.stdout?.on('data', (data) => {
@@ -416,9 +434,12 @@ Provide:
416
434
  proc.on('close', (code) => {
417
435
  clearTimeout(timeoutId);
418
436
  if (killed) {
419
- report?.cleanup();
420
- return; // Timeout result was already returned; child has now closed.
437
+ // Coverage and JSON reports belong to this run; clean both only
438
+ // after the entire owned process group has stopped.
439
+ termination?.then(() => cleanupArtifacts(), () => undefined);
440
+ return; // The timeout result has already been returned.
421
441
  }
442
+ untrackExit();
422
443
  // Parse results based on framework. Vitest 5 writes the JSON report to
423
444
  // a file instead of stdout, so read it back through the report handle.
424
445
  let reportText;
@@ -434,10 +455,10 @@ Provide:
434
455
  return;
435
456
  }
436
457
  const parseResult = this.parseTestOutput(reportText, stderr, fileLabel, framework, code);
437
- // If no coverage in stdout JSON, try reading from disk
438
- // (vitest/jest write coverage to coverage/coverage-summary.json)
439
- if (parseResult.success && !parseResult.value.coverage && ['vitest', 'jest'].includes(framework.toLowerCase())) {
440
- const diskCoverage = this.readCoverageFromDisk();
458
+ // Read only this invocation's coverage artifacts. A previous or
459
+ // concurrent run's project coverage directory is not evidence.
460
+ if (parseResult.success && !parseResult.value.coverage && coverageDirectory) {
461
+ const diskCoverage = this.readCoverageFromDisk(coverageDirectory);
441
462
  if (diskCoverage) {
442
463
  parseResult.value.coverage = diskCoverage.summary;
443
464
  if (diskCoverage.perFile.length > 0) {
@@ -451,6 +472,7 @@ Provide:
451
472
  clearTimeout(timeoutId);
452
473
  if (killed)
453
474
  return;
475
+ untrackExit();
454
476
  finish(err(new Error(`Failed to spawn test runner: ${error.message}. Is '${command}' installed?`)));
455
477
  });
456
478
  });
@@ -460,22 +482,35 @@ Provide:
460
482
  */
461
483
  buildTestCommand(fileOrFiles, framework) {
462
484
  const files = Array.isArray(fileOrFiles) ? fileOrFiles : [fileOrFiles];
485
+ const createCoverageDirectory = () => mkdtempSync(join(tmpdir(), 'aqe-test-coverage-'));
463
486
  switch (framework.toLowerCase()) {
464
487
  case 'vitest': {
465
488
  // --outputFile makes Vitest 4 and 5 both write the JSON report to a
466
489
  // file we own; Vitest 5 no longer prints it to stdout.
467
- const report = createVitestJsonReport();
490
+ const coverageDirectory = createCoverageDirectory();
491
+ let report;
492
+ try {
493
+ report = createVitestJsonReport();
494
+ }
495
+ catch (error) {
496
+ rmSync(coverageDirectory, { recursive: true, force: true });
497
+ throw error;
498
+ }
468
499
  return {
469
500
  command: 'npx',
470
- args: ['vitest', 'run', ...files, '--reporter=json', '--no-color', ...report.args],
501
+ args: ['vitest', 'run', ...files, '--reporter=json', '--no-color', ...report.args, `--coverage.reportsDirectory=${coverageDirectory}`],
471
502
  report,
503
+ coverageDirectory,
472
504
  };
473
505
  }
474
- case 'jest':
506
+ case 'jest': {
507
+ const coverageDirectory = createCoverageDirectory();
475
508
  return {
476
509
  command: 'npx',
477
- args: ['jest', ...files, '--json', '--no-colors', '--testLocationInResults'],
510
+ args: ['jest', ...files, '--json', '--no-colors', '--testLocationInResults', `--coverageDirectory=${coverageDirectory}`],
511
+ coverageDirectory,
478
512
  };
513
+ }
479
514
  case 'mocha':
480
515
  // Note: mocha has no built-in coverage — requires external nyc/c8 wrapper.
481
516
  // Coverage data will be unavailable for mocha-based test runs.
@@ -491,11 +526,20 @@ Provide:
491
526
  };
492
527
  default: {
493
528
  // Default to vitest
494
- const report = createVitestJsonReport();
529
+ const coverageDirectory = createCoverageDirectory();
530
+ let report;
531
+ try {
532
+ report = createVitestJsonReport();
533
+ }
534
+ catch (error) {
535
+ rmSync(coverageDirectory, { recursive: true, force: true });
536
+ throw error;
537
+ }
495
538
  return {
496
539
  command: 'npx',
497
- args: ['vitest', 'run', ...files, '--reporter=json', '--no-color', ...report.args],
540
+ args: ['vitest', 'run', ...files, '--reporter=json', '--no-color', ...report.args, `--coverage.reportsDirectory=${coverageDirectory}`],
498
541
  report,
542
+ coverageDirectory,
499
543
  };
500
544
  }
501
545
  }
@@ -1003,16 +1047,16 @@ Provide:
1003
1047
  return { perFile };
1004
1048
  }
1005
1049
  /**
1006
- * Read coverage from disk files written by vitest/jest.
1007
- * Both runners write coverage-summary.json to a coverage/ directory when
1008
- * --coverage is passed, rather than embedding it in stdout JSON.
1050
+ * Read coverage from the private output directory of a completed runner.
1051
+ * Setting the directory does not enable coverage; project configuration
1052
+ * still decides whether coverage is collected.
1009
1053
  */
1010
- readCoverageFromDisk() {
1054
+ readCoverageFromDisk(coverageDirectory) {
1011
1055
  try {
1012
1056
  // Check common coverage output paths
1013
1057
  const candidates = [
1014
- join(process.cwd(), 'coverage', 'coverage-summary.json'),
1015
- join(process.cwd(), 'coverage', 'coverage-final.json'),
1058
+ join(coverageDirectory, 'coverage-summary.json'),
1059
+ join(coverageDirectory, 'coverage-final.json'),
1016
1060
  ];
1017
1061
  for (const filePath of candidates) {
1018
1062
  if (!existsSync(filePath))
@@ -249,7 +249,7 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
249
249
  this.startWorkflow(workflowId, 'generate');
250
250
  // Opt-in (plan 06, D7-wire): try the FREE local model first with a repair
251
251
  // loop. Fully guarded — any miss falls through to the normal LLM path.
252
- if (this.freeTierExecutor) {
252
+ if (this.freeTierExecutor && !request.behaviorExamples?.length) {
253
253
  try {
254
254
  const ft = await this.tryFreeTierGeneration(request);
255
255
  if (ft) {
@@ -354,11 +354,12 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
354
354
  }
355
355
  }
356
356
  // Three-loop protocol: instantAdapt must precede recordOutcome
357
- if (isSONAThreeLoopEnabled() && this.qesona?.isThreeLoopEnabled()) {
357
+ const coverageEstimate = result.value.coverageEstimate;
358
+ if (coverageEstimate !== null && isSONAThreeLoopEnabled() && this.qesona?.isThreeLoopEnabled()) {
358
359
  const tests = result.value;
359
360
  this.qesona.instantAdapt([
360
361
  tests.tests.length / 20,
361
- tests.coverageEstimate / 100,
362
+ coverageEstimate / 100,
362
363
  tests.patternsUsed.length / 10,
363
364
  request.sourceFiles.length / 20,
364
365
  (request.coverageTarget ?? 80) / 100,
@@ -476,7 +477,7 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
476
477
  framework,
477
478
  llmEnhanced: true,
478
479
  };
479
- return { tests: [test], coverageEstimate: 0, patternsUsed: ['free-tier-local', `tier:${r.tierUsed}`] };
480
+ return { tests: [test], coverageEstimate: null, patternsUsed: ['free-tier-local', `tier:${r.tierUsed}`] };
480
481
  }
481
482
  /**
482
483
  * Generate tests using TDD workflow
@@ -953,7 +954,7 @@ export class TestGenerationCoordinator extends BaseDomainCoordinator {
953
954
  * Per ADR-040: Store test generation patterns in SONA
954
955
  */
955
956
  async storeTestGenerationPattern(tests, request) {
956
- if (!this.qesona) {
957
+ if (!this.qesona || tests.coverageEstimate === null) {
957
958
  return;
958
959
  }
959
960
  try {