agentic-qe 3.14.0 → 3.14.2

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 (430) hide show
  1. package/.claude/helpers/brain-checkpoint.cjs +2 -1
  2. package/.claude/helpers/validate-v3-config.sh +6 -5
  3. package/.claude/hooks/aqe-hook.cjs +14 -14
  4. package/.claude/skills/qe-browser/evals/qe-browser.yaml +30 -41
  5. package/.claude/skills/qe-browser/fixtures/serve-skills.js +37 -0
  6. package/.claude/skills/qe-browser/scripts/lib/vibium.js +1 -1
  7. package/.claude/skills/qe-browser/scripts/smoke-test.sh +56 -25
  8. package/.claude/skills/qe-browser/scripts/visual-diff.js +24 -15
  9. package/.claude/skills/skills-manifest.json +1 -1
  10. package/CHANGELOG.md +114 -0
  11. package/assets/skills/qe-browser/evals/qe-browser.yaml +30 -41
  12. package/assets/skills/qe-browser/fixtures/serve-skills.js +37 -0
  13. package/assets/skills/qe-browser/scripts/lib/vibium.js +1 -1
  14. package/assets/skills/qe-browser/scripts/smoke-test.sh +56 -25
  15. package/assets/skills/qe-browser/scripts/visual-diff.js +24 -15
  16. package/assets/skills/skills-manifest.json +1 -1
  17. package/dist/cli/bundle.js +7 -7
  18. package/dist/cli/chunks/adapter-OJF6LAJV.js +2 -0
  19. package/dist/cli/chunks/{agent-booster-wasm-JZO6VUW4.js → agent-booster-wasm-SD5N32MX.js} +2 -2
  20. package/dist/cli/chunks/{agent-handler-534KFGEJ.js → agent-handler-OZRSJM7F.js} +2 -2
  21. package/dist/cli/chunks/{agent-memory-branch-B7KWLWY4.js → agent-memory-branch-NYTRANRN.js} +2 -2
  22. package/dist/cli/chunks/aqe-learning-engine-FGT474XB.js +2 -0
  23. package/dist/cli/chunks/{arena-OW5MELJX.js → arena-EX3SC2DP.js} +4 -4
  24. package/dist/cli/chunks/{arena-7CCD3S3I.js → arena-FOTVSRK4.js} +2 -2
  25. package/dist/cli/chunks/{audit-BHVKN4E2.js → audit-Q5GHSUQY.js} +3 -3
  26. package/dist/cli/chunks/base-HH765JFV.js +2 -0
  27. package/dist/cli/chunks/{better-sqlite3-P5FA6WFK.js → better-sqlite3-S7M5R2HS.js} +2 -2
  28. package/dist/cli/chunks/{brain-handler-WNW5LOV7.js → brain-handler-5FSA46R5.js} +3 -3
  29. package/dist/cli/chunks/{branch-enumerator-TVZ2ODKH.js → branch-enumerator-RWAXTGEU.js} +2 -2
  30. package/dist/cli/chunks/{browser-TCEB2W2F.js → browser-IGDESJGF.js} +2 -2
  31. package/dist/cli/chunks/browser-workflow-NPM4FUPI.js +2 -0
  32. package/dist/cli/chunks/{chunk-Q73RRTLE.js → chunk-2EHFEMRU.js} +2 -2
  33. package/dist/cli/chunks/{chunk-ZBOWR4XT.js → chunk-2H5YJ5ZK.js} +2 -2
  34. package/dist/cli/chunks/chunk-2LKAMMMI.js +2 -0
  35. package/dist/cli/chunks/{chunk-A2WZEMWT.js → chunk-2TG24LYQ.js} +1 -1
  36. package/dist/cli/chunks/{chunk-3QT6S3A3.js → chunk-3C2K4YMS.js} +3 -3
  37. package/dist/cli/chunks/{chunk-VESOYP6A.js → chunk-3DFFFXXO.js} +2 -2
  38. package/dist/cli/chunks/{chunk-K6CGQR5R.js → chunk-3WV4H33V.js} +1 -1
  39. package/dist/cli/chunks/{chunk-IL4AEB3J.js → chunk-42WUDDUU.js} +2 -2
  40. package/dist/cli/chunks/chunk-4AKGBUYD.js +4 -0
  41. package/dist/cli/chunks/{chunk-4FEJEVG7.js → chunk-4K27ESCA.js} +1 -1
  42. package/dist/cli/chunks/{chunk-TGOGCA74.js → chunk-4M6A3PVJ.js} +2 -2
  43. package/dist/cli/chunks/{chunk-RGVD6ZUX.js → chunk-4MH22236.js} +1 -1
  44. package/dist/cli/chunks/{chunk-6DPAMYLU.js → chunk-4N44UJGI.js} +2 -2
  45. package/dist/cli/chunks/{chunk-DJITEQYS.js → chunk-4PH7O5ZH.js} +2 -2
  46. package/dist/cli/chunks/{chunk-M3HUZD2I.js → chunk-4RT7I7PI.js} +1 -1
  47. package/dist/cli/chunks/chunk-4UCMTYFQ.js +65 -0
  48. package/dist/cli/chunks/{chunk-ZI3UO7QR.js → chunk-4ZUZDFAA.js} +2 -2
  49. package/dist/cli/chunks/{chunk-QSPRQPEL.js → chunk-57TNBR2P.js} +2 -2
  50. package/dist/cli/chunks/{chunk-ZCVJCCQQ.js → chunk-5EHLGOWW.js} +2 -2
  51. package/dist/cli/chunks/{chunk-ZAAYOENS.js → chunk-5WJUNRTY.js} +2 -2
  52. package/dist/cli/chunks/{chunk-QZPFUFZG.js → chunk-67A6PEZM.js} +2 -2
  53. package/dist/cli/chunks/{chunk-7BOPFN3Y.js → chunk-6EHN7Q2Q.js} +2 -2
  54. package/dist/cli/chunks/{chunk-2HYVOX6N.js → chunk-6F4WHN7D.js} +1 -1
  55. package/dist/cli/chunks/{chunk-GVEJP5T7.js → chunk-6LMLN5R2.js} +2 -2
  56. package/dist/cli/chunks/{chunk-QKQZ4IJF.js → chunk-6SZKLWZT.js} +5 -5
  57. package/dist/cli/chunks/{chunk-PEW6FZ47.js → chunk-6VKJAMZY.js} +1 -1
  58. package/dist/cli/chunks/{chunk-VYENTZ45.js → chunk-7AFBNU6K.js} +2 -2
  59. package/dist/cli/chunks/{chunk-6IJMD2ZL.js → chunk-7FWP7CZY.js} +3 -3
  60. package/dist/cli/chunks/{chunk-IE5LC7MB.js → chunk-7SK6IMGZ.js} +2 -2
  61. package/dist/cli/chunks/{chunk-3EM2MK3Z.js → chunk-A7N3YUDJ.js} +2 -2
  62. package/dist/cli/chunks/{chunk-J3XSHJGK.js → chunk-ADK7DF3G.js} +2 -2
  63. package/dist/cli/chunks/{chunk-EJ6IP7DE.js → chunk-ARMZYHYL.js} +2 -2
  64. package/dist/cli/chunks/{chunk-BZ4QVFP2.js → chunk-BWRHOIYC.js} +2 -2
  65. package/dist/cli/chunks/{chunk-A7SKM6JL.js → chunk-C7AXRI7E.js} +1 -1
  66. package/dist/cli/chunks/{chunk-4XTHRAUV.js → chunk-CG2MUD7U.js} +1 -1
  67. package/dist/cli/chunks/{chunk-HLNQDRHA.js → chunk-CH2TQCV5.js} +1 -1
  68. package/dist/cli/chunks/{chunk-JGROLJ33.js → chunk-CIESXO73.js} +1 -1
  69. package/dist/cli/chunks/{chunk-AR6SATU3.js → chunk-CJCT452S.js} +2 -2
  70. package/dist/cli/chunks/{chunk-UUJ5VQJM.js → chunk-CJHVOBJY.js} +1 -1
  71. package/dist/cli/chunks/{chunk-VOSISOFD.js → chunk-CTCQOYBS.js} +1 -1
  72. package/dist/cli/chunks/{chunk-XITTURP2.js → chunk-D4RCV4LY.js} +2 -2
  73. package/dist/cli/chunks/{chunk-5XGVSQS2.js → chunk-DRO5NJZA.js} +2 -2
  74. package/dist/cli/chunks/{chunk-QMMDN4WX.js → chunk-DVHWLAEO.js} +3 -3
  75. package/dist/cli/chunks/{chunk-5LEAGKX5.js → chunk-DW6ZMNMR.js} +2 -2
  76. package/dist/cli/chunks/{chunk-ZBKGX72B.js → chunk-E3Q7WNJD.js} +3 -3
  77. package/dist/cli/chunks/{chunk-5MZF4N4Q.js → chunk-EAJK25IS.js} +1 -1
  78. package/dist/cli/chunks/{chunk-3RYTAYR6.js → chunk-EH5OCHAJ.js} +1 -1
  79. package/dist/cli/chunks/{chunk-UI6WSPEK.js → chunk-F2KRT2II.js} +3 -3
  80. package/dist/cli/chunks/{chunk-NDPQ2WPU.js → chunk-FPHPP5TQ.js} +1 -1
  81. package/dist/cli/chunks/{chunk-WWWX76QB.js → chunk-FREF6Y4L.js} +2 -2
  82. package/dist/cli/chunks/{chunk-SROZXIMT.js → chunk-FVGTINVR.js} +54 -54
  83. package/dist/cli/chunks/{chunk-H3YDDKBW.js → chunk-G2CLZVYI.js} +3 -3
  84. package/dist/cli/chunks/{chunk-2O4DDPEA.js → chunk-G6AV2HGY.js} +3 -3
  85. package/dist/cli/chunks/{chunk-ENGKLFLY.js → chunk-GHQ5PUOV.js} +2 -2
  86. package/dist/cli/chunks/{chunk-NKWO2X3T.js → chunk-GHUPID5E.js} +1 -1
  87. package/dist/cli/chunks/{chunk-S5YVLPXU.js → chunk-GJAWEUIN.js} +2 -2
  88. package/dist/cli/chunks/{chunk-6IZQSLYZ.js → chunk-HBTC4L53.js} +2 -2
  89. package/dist/cli/chunks/{chunk-DDPJUAXQ.js → chunk-HSJ5FQCF.js} +2 -2
  90. package/dist/cli/chunks/{chunk-OONCRNFA.js → chunk-HZ6NEJMO.js} +2 -2
  91. package/dist/cli/chunks/{chunk-LCSVROU7.js → chunk-HZMLNM2T.js} +10 -10
  92. package/dist/cli/chunks/{chunk-JY4VZ6BN.js → chunk-ICKLBATY.js} +2 -2
  93. package/dist/cli/chunks/{chunk-JMKMDSXG.js → chunk-IUNMW454.js} +2 -2
  94. package/dist/cli/chunks/{chunk-XXFKN7LB.js → chunk-IVGVOGIZ.js} +1 -1
  95. package/dist/cli/chunks/{chunk-3GUO4ERR.js → chunk-IWFL6EFI.js} +2 -2
  96. package/dist/cli/chunks/{chunk-FRL3X2QA.js → chunk-JDXLCNKV.js} +2 -2
  97. package/dist/cli/chunks/{chunk-YW4RNZWT.js → chunk-JIUF6NV6.js} +2 -2
  98. package/dist/cli/chunks/{chunk-JAK5UUWH.js → chunk-JQ2ZD3WO.js} +2 -2
  99. package/dist/cli/chunks/{chunk-YEAC3DC6.js → chunk-K574FLVB.js} +2 -2
  100. package/dist/cli/chunks/{chunk-LZHTCUCO.js → chunk-KEEBUVGV.js} +2 -2
  101. package/dist/cli/chunks/{chunk-LKR7T3OZ.js → chunk-KFXZDQ5J.js} +1 -1
  102. package/dist/cli/chunks/{chunk-7OUMJCJT.js → chunk-KPFG4OIM.js} +1 -1
  103. package/dist/cli/chunks/{chunk-HQ7243G3.js → chunk-KZOBLLXW.js} +2 -2
  104. package/dist/cli/chunks/{chunk-R6WJF4D5.js → chunk-L2F7FVIU.js} +2 -2
  105. package/dist/cli/chunks/{chunk-VRRG66XB.js → chunk-LML5VTFK.js} +1 -1
  106. package/dist/cli/chunks/{chunk-JTWJR2KY.js → chunk-LWUJQGCS.js} +2 -2
  107. package/dist/cli/chunks/{chunk-BQCTO7UB.js → chunk-MH73D5TN.js} +2 -2
  108. package/dist/cli/chunks/{chunk-U4GZWPKM.js → chunk-MWQTACNA.js} +2 -2
  109. package/dist/cli/chunks/{chunk-CIZ6LSNV.js → chunk-N3RN4QTC.js} +2 -2
  110. package/dist/cli/chunks/{chunk-ZQSXG7FA.js → chunk-N5ZRUOMR.js} +2 -2
  111. package/dist/cli/chunks/{chunk-AFGT26NR.js → chunk-NAZVPZJS.js} +2 -2
  112. package/dist/cli/chunks/{chunk-FOHYBR3O.js → chunk-NG2UVPTW.js} +1 -1
  113. package/dist/cli/chunks/{chunk-2D7UBX5S.js → chunk-NHHWLJQF.js} +1 -1
  114. package/dist/cli/chunks/{chunk-JRKEBESE.js → chunk-NNOMDM4N.js} +2 -2
  115. package/dist/cli/chunks/{chunk-YKWMKRYB.js → chunk-NRR23SJV.js} +1 -1
  116. package/dist/cli/chunks/{chunk-WKNWRDA5.js → chunk-NWFIJNEB.js} +1 -1
  117. package/dist/cli/chunks/{chunk-4MK2G6TK.js → chunk-OBCKP3G4.js} +2 -2
  118. package/dist/cli/chunks/{chunk-YKZV7O65.js → chunk-OC2CKU7I.js} +2 -2
  119. package/dist/cli/chunks/{chunk-7RVAHJQZ.js → chunk-OX6T26CD.js} +3 -3
  120. package/dist/cli/chunks/chunk-P64DMQ2C.js +2 -0
  121. package/dist/cli/chunks/{chunk-RKUYVVGJ.js → chunk-PFXX5Q32.js} +2 -2
  122. package/dist/cli/chunks/chunk-PHHXHG2W.js +2 -0
  123. package/dist/cli/chunks/{chunk-N2YAUDAV.js → chunk-PMUBG2RU.js} +2 -2
  124. package/dist/cli/chunks/{chunk-WTHAVFIC.js → chunk-PVHO6KLB.js} +1 -1
  125. package/dist/cli/chunks/{chunk-MO7EITJK.js → chunk-PWEIDHT7.js} +2 -2
  126. package/dist/cli/chunks/{chunk-52DFCV57.js → chunk-PZKZY6PB.js} +2 -2
  127. package/dist/cli/chunks/{chunk-I3VHXA2W.js → chunk-Q335R4MR.js} +2 -2
  128. package/dist/cli/chunks/{chunk-ECTPFCON.js → chunk-Q3JHS3UD.js} +2 -2
  129. package/dist/cli/chunks/{chunk-HJIAVR6P.js → chunk-QFUX7ELG.js} +2 -2
  130. package/dist/cli/chunks/{chunk-L4C42WYI.js → chunk-QW4LN5NK.js} +2 -2
  131. package/dist/cli/chunks/{chunk-HQHLHSJO.js → chunk-QXTW7XCS.js} +2 -2
  132. package/dist/cli/chunks/{chunk-SSV6KSFT.js → chunk-R5RNOLHI.js} +1 -1
  133. package/dist/cli/chunks/{chunk-AVLA5PBJ.js → chunk-RCI64RIJ.js} +2 -2
  134. package/dist/cli/chunks/{chunk-T3BZAFLP.js → chunk-RFNEHNJV.js} +1 -1
  135. package/dist/cli/chunks/{chunk-IL6QRXRP.js → chunk-RGH3WGWD.js} +10 -10
  136. package/dist/cli/chunks/{chunk-E4NU4BJA.js → chunk-RHJVDCLV.js} +2 -2
  137. package/dist/cli/chunks/{chunk-KTSCZ7AW.js → chunk-RVCWSAXI.js} +2 -2
  138. package/dist/cli/chunks/{chunk-TQJE7DNL.js → chunk-RYJHREYS.js} +2 -2
  139. package/dist/cli/chunks/{chunk-HNKPLVYS.js → chunk-S4MR6RTE.js} +1 -1
  140. package/dist/cli/chunks/{chunk-6AYO3IR2.js → chunk-S7N4BKI3.js} +2 -2
  141. package/dist/cli/chunks/{chunk-2NO4H35K.js → chunk-SEHCX4NH.js} +1 -1
  142. package/dist/cli/chunks/{chunk-GKNDP5VK.js → chunk-T46LOLW3.js} +2 -2
  143. package/dist/cli/chunks/{chunk-VXU53F7Z.js → chunk-T4C56HBW.js} +2 -2
  144. package/dist/cli/chunks/{chunk-43GPSYAL.js → chunk-TENYL5TI.js} +2 -2
  145. package/dist/cli/chunks/{chunk-6AOZU3UN.js → chunk-TLPL3EQY.js} +2 -2
  146. package/dist/cli/chunks/{chunk-4ZVGSVHV.js → chunk-TYVQNYXX.js} +4 -4
  147. package/dist/cli/chunks/{chunk-NOPVFBQM.js → chunk-U2AY57XZ.js} +2 -2
  148. package/dist/cli/chunks/{chunk-IQLRA4FV.js → chunk-U54OOA24.js} +1 -1
  149. package/dist/cli/chunks/{chunk-IQ3JFHZN.js → chunk-UHTAI4ZB.js} +1 -1
  150. package/dist/cli/chunks/{chunk-KDIZQHG5.js → chunk-UIGEUEBT.js} +2 -2
  151. package/dist/cli/chunks/{chunk-5VDVYTO5.js → chunk-UYTWDS2R.js} +2 -2
  152. package/dist/cli/chunks/{chunk-ZNSMVQCG.js → chunk-VNAKBHJI.js} +2 -2
  153. package/dist/cli/chunks/{chunk-SUSMHSXT.js → chunk-VOYJJ3KA.js} +2 -2
  154. package/dist/cli/chunks/{chunk-QQCENKCX.js → chunk-VSYBMNIR.js} +1 -1
  155. package/dist/cli/chunks/{chunk-7RAB2BZY.js → chunk-W2FLULF4.js} +2 -2
  156. package/dist/cli/chunks/{chunk-NYARYONH.js → chunk-W4OQYLYO.js} +1 -1
  157. package/dist/cli/chunks/{chunk-DOWCOZDO.js → chunk-WBH4C4BG.js} +2 -2
  158. package/dist/cli/chunks/{chunk-OIYUSWHX.js → chunk-WBMRADQP.js} +1 -1
  159. package/dist/cli/chunks/{chunk-B3H4K7CY.js → chunk-WMW47QMR.js} +2 -2
  160. package/dist/cli/chunks/{chunk-VPVZHJSU.js → chunk-WVY22NHZ.js} +2 -2
  161. package/dist/cli/chunks/{chunk-6W42XWLL.js → chunk-WXMSRBQF.js} +2 -2
  162. package/dist/cli/chunks/{chunk-CIUOC5F3.js → chunk-XPLSLHRB.js} +1 -1
  163. package/dist/cli/chunks/{chunk-E722WNWC.js → chunk-YF5OP6CR.js} +2 -2
  164. package/dist/cli/chunks/{chunk-H76TV4UU.js → chunk-YN6W2XIT.js} +3 -3
  165. package/dist/cli/chunks/{chunk-FF43SRP6.js → chunk-ZCDXJ27H.js} +1 -1
  166. package/dist/cli/chunks/{chunk-TKYEP7OR.js → chunk-ZFGND4QK.js} +1 -1
  167. package/dist/cli/chunks/{chunk-O2MZZL54.js → chunk-ZWRQ5VAU.js} +2 -2
  168. package/dist/cli/chunks/{chunk-H6NFDOMK.js → chunk-ZYLSOBOR.js} +1 -1
  169. package/dist/cli/chunks/{ci-B432UH6N.js → ci-NTRH7PAW.js} +2 -2
  170. package/dist/cli/chunks/{ci-output-GTHH7WYG.js → ci-output-F57RSD35.js} +2 -2
  171. package/dist/cli/chunks/{circuit-breaker-VW75DLME.js → circuit-breaker-4WST3QSA.js} +2 -2
  172. package/dist/cli/chunks/{claude-flow-setup-RE3IVT7U.js → claude-flow-setup-KB4TKMYI.js} +2 -2
  173. package/dist/cli/chunks/client-GPZEC54E.js +2 -0
  174. package/dist/cli/chunks/{cline-installer-NUBZZ55N.js → cline-installer-W2ZHQ6WM.js} +2 -2
  175. package/dist/cli/chunks/{code-K6JCWKNW.js → code-TF2AVR5D.js} +2 -2
  176. package/dist/cli/chunks/{code-index-extractor-I4ILB5JN.js → code-index-extractor-RMDRUVQJ.js} +2 -2
  177. package/dist/cli/chunks/codex-installer-VSTRHJHV.js +14 -0
  178. package/dist/cli/chunks/{completions-V3KJVJF4.js → completions-3Q37QVFR.js} +2 -2
  179. package/dist/cli/chunks/{complexity-analyzer-HRG7OOY3.js → complexity-analyzer-3FNFLACD.js} +2 -2
  180. package/dist/cli/chunks/{continuedev-installer-CNTDONWG.js → continuedev-installer-VTEXM455.js} +2 -2
  181. package/dist/cli/chunks/{copilot-installer-XPWWIWYA.js → copilot-installer-AGY7DQUS.js} +2 -2
  182. package/dist/cli/chunks/core-handlers-YMGHYIBR.js +2 -0
  183. package/dist/cli/chunks/{cost-tracker-MFNLQ56K.js → cost-tracker-LTZAQBX7.js} +2 -2
  184. package/dist/cli/chunks/{coverage-KOIK654V.js → coverage-TT64IOS4.js} +3 -3
  185. package/dist/cli/chunks/cross-domain-router-ECBNTGYJ.js +2 -0
  186. package/dist/cli/chunks/{cursor-installer-S5MKLRQQ.js → cursor-installer-OVOJIOHN.js} +2 -2
  187. package/dist/cli/chunks/{daemon-DUS6JYW6.js → daemon-DMFZMXKA.js} +8 -8
  188. package/dist/cli/chunks/{daemon-Z7VPGWHY.js → daemon-XCULEHWY.js} +4 -4
  189. package/dist/cli/chunks/{dag-attention-scheduler-7CQ3ARNI.js → dag-attention-scheduler-WW2RX4B5.js} +2 -2
  190. package/dist/cli/chunks/{detect-WORBCAYF.js → detect-QNWIM232.js} +2 -2
  191. package/dist/cli/chunks/{dist-node-KRNI6OYW.js → dist-node-6GQIY3CG.js} +2 -2
  192. package/dist/cli/chunks/{domain-handler-KRUR2VQG.js → domain-handler-6RJPDELX.js} +2 -2
  193. package/dist/cli/chunks/{domain-transfer-VEOVLV54.js → domain-transfer-WK524LBS.js} +2 -2
  194. package/dist/cli/chunks/dream-EHGKCFWH.js +2 -0
  195. package/dist/cli/chunks/{embed-and-insert-pattern-QU3NQVA5.js → embed-and-insert-pattern-SO6GWJW7.js} +2 -2
  196. package/dist/cli/chunks/{eval-AYQ7BSUP.js → eval-GL544IPO.js} +2 -2
  197. package/dist/cli/chunks/{experience-capture-middleware-AWQBL6LT.js → experience-capture-middleware-BCCJ35OX.js} +3 -3
  198. package/dist/cli/chunks/{fast-paths-V5EL4BYJ.js → fast-paths-CATDDBEU.js} +2 -2
  199. package/dist/cli/chunks/{feature-flags-P34BPRWU.js → feature-flags-BUXNAORY.js} +2 -2
  200. package/dist/cli/chunks/{feature-flags-BXX7BP22.js → feature-flags-KNNWWP5G.js} +2 -2
  201. package/dist/cli/chunks/{file-discovery-MS6BKQ2U.js → file-discovery-S4HF3O7D.js} +2 -2
  202. package/dist/cli/chunks/{fleet-7WVVPA4W.js → fleet-DQVQQONW.js} +3 -3
  203. package/dist/cli/chunks/{gnn-wrapper-7WQ3LEPG.js → gnn-wrapper-G7ABZUG7.js} +2 -2
  204. package/dist/cli/chunks/{heartbeat-handler-P7QD3BZH.js → heartbeat-handler-UFMELIWT.js} +4 -4
  205. package/dist/cli/chunks/heartbeat-scheduler-UFEL2CBW.js +2 -0
  206. package/dist/cli/chunks/hnsw-adapter-BLSD45CX.js +2 -0
  207. package/dist/cli/chunks/hnsw-index-A3RZODEN.js +2 -0
  208. package/dist/cli/chunks/{hnsw-legacy-bridge-Y3GAR3UP.js → hnsw-legacy-bridge-YIILSRXI.js} +2 -2
  209. package/dist/cli/chunks/{hnswlib-node-5QUXZQWQ.js → hnswlib-node-TSVRMXDH.js} +2 -2
  210. package/dist/cli/chunks/{hooks-2D64KPRY.js → hooks-OHQPNK74.js} +10 -10
  211. package/dist/cli/chunks/{hypergraph-engine-5INXEZDP.js → hypergraph-engine-LY7PJDSL.js} +2 -2
  212. package/dist/cli/chunks/{hypergraph-handler-YJJJ3ESZ.js → hypergraph-handler-YGDYZO6H.js} +3 -3
  213. package/dist/cli/chunks/impact-analyzer-OXHD3FOH.js +2 -0
  214. package/dist/cli/chunks/{init-handler-QSFYJN5Q.js → init-handler-MTK65LI3.js} +9 -8
  215. package/dist/cli/chunks/init-wizard-PKZL7QBU.js +2 -0
  216. package/dist/cli/chunks/kernel-XWPM72UJ.js +2 -0
  217. package/dist/cli/chunks/{kilocode-installer-3N3QGTJU.js → kilocode-installer-3IICU4RS.js} +2 -2
  218. package/dist/cli/chunks/{kiro-installer-GIWVTFZQ.js → kiro-installer-MXOVQYQA.js} +2 -2
  219. package/dist/cli/chunks/knowledge-graph-FRKR5XWI.js +2 -0
  220. package/dist/cli/chunks/{learning-SGO2DQ5Q.js → learning-EV5LSOOM.js} +3 -3
  221. package/dist/cli/chunks/{llm-router-HBBULO65.js → llm-router-7LYDJUOT.js} +4 -4
  222. package/dist/cli/chunks/llm-router-service-R7A5HHDM.js +2 -0
  223. package/dist/cli/chunks/{load-B5OFYB4H.js → load-F4PVAMXQ.js} +2 -2
  224. package/dist/cli/chunks/load-test-5IKDWSYL.js +2 -0
  225. package/dist/cli/chunks/{mcp-FG3LNQR4.js → mcp-DUYJUEME.js} +2 -2
  226. package/dist/cli/chunks/{memory-SPS7ZWLC.js → memory-XTTYORAS.js} +5 -5
  227. package/dist/cli/chunks/memory-backend-7VW5QCMO.js +2 -0
  228. package/dist/cli/chunks/{memory-handlers-P7FTPWP3.js → memory-handlers-VZH3R2TQ.js} +2 -2
  229. package/dist/cli/chunks/{multi-model-executor-PUB7E6KH.js → multi-model-executor-R6XCTMCF.js} +2 -2
  230. package/dist/cli/chunks/{opencode-installer-TGCSGVG2.js → opencode-installer-33ULBU2F.js} +2 -2
  231. package/dist/cli/chunks/{orchestrator-S5FTJFGB.js → orchestrator-34ZJEKTJ.js} +22 -21
  232. package/dist/cli/chunks/pattern-null-store-BU6LCB2W.js +2 -0
  233. package/dist/cli/chunks/{pattern-usage-recorder-LCXXGRAB.js → pattern-usage-recorder-GZ2M3F2E.js} +2 -2
  234. package/dist/cli/chunks/{pipeline-ENOSRHKW.js → pipeline-SR5OTY45.js} +2 -2
  235. package/dist/cli/chunks/platform-VKJFJIAW.js +2 -0
  236. package/dist/cli/chunks/{plugin-JZ5ODJSU.js → plugin-5C5UBQUQ.js} +2 -2
  237. package/dist/cli/chunks/{prime-radiant-advanced-wasm-DPJUPNCG.js → prime-radiant-advanced-wasm-KO2PQI3D.js} +2 -2
  238. package/dist/cli/chunks/protocol-executor-BSP5LWJN.js +2 -0
  239. package/dist/cli/chunks/{protocol-handler-IP4NLVY3.js → protocol-handler-ZF74NIKA.js} +2 -2
  240. package/dist/cli/chunks/{prove-P6FM4RU7.js → prove-MO5TQQU4.js} +2 -2
  241. package/dist/cli/chunks/qe-reasoning-bank-J2RC7P25.js +2 -0
  242. package/dist/cli/chunks/{quality-UHP4XO26.js → quality-EYIN6AER.js} +2 -2
  243. package/dist/cli/chunks/quality-gate-V6OQM57O.js +7 -0
  244. package/dist/cli/chunks/queen-coordinator-XI5AJV2V.js +2 -0
  245. package/dist/cli/chunks/{real-embeddings-6SO5MFRQ.js → real-embeddings-AR7TZX7U.js} +2 -2
  246. package/dist/cli/chunks/{roocode-installer-WTWUOFCH.js → roocode-installer-46E626VZ.js} +2 -2
  247. package/dist/cli/chunks/router-VXQYYA3D.js +2 -0
  248. package/dist/cli/chunks/routing-feedback-HZQTASFF.js +2 -0
  249. package/dist/cli/chunks/{routing-handler-IK7HYERQ.js → routing-handler-ZNRVW6QW.js} +2 -2
  250. package/dist/cli/chunks/{ruvector-commands-THLB4NIM.js → ruvector-commands-4L2CQMWS.js} +2 -2
  251. package/dist/cli/chunks/rvf-dual-writer-BDTLLJER.js +2 -0
  252. package/dist/cli/chunks/rvf-migration-adapter-IB343MDN.js +2 -0
  253. package/dist/cli/chunks/{rvf-migration-coordinator-BUKCSHBD.js → rvf-migration-coordinator-H4RVGBIA.js} +2 -2
  254. package/dist/cli/chunks/rvf-native-adapter-Y7SN7LHU.js +2 -0
  255. package/dist/cli/chunks/{rvf-store-integrity-ECTADZIN.js → rvf-store-integrity-OJGWWPLL.js} +2 -2
  256. package/dist/cli/chunks/safe-db-2VTKKBJU.js +2 -0
  257. package/dist/cli/chunks/schedule-QJ4CFGJY.js +2 -0
  258. package/dist/cli/chunks/scheduler-2NHDQPC3.js +2 -0
  259. package/dist/cli/chunks/{security-HN4UXFXX.js → security-JF3BVNRO.js} +3 -3
  260. package/dist/cli/chunks/{shared-rvf-adapter-XJCPX5SN.js → shared-rvf-adapter-M6NNIZ5W.js} +2 -2
  261. package/dist/cli/chunks/{shared-rvf-dual-writer-23X5PNY5.js → shared-rvf-dual-writer-LHMFCYVE.js} +2 -2
  262. package/dist/cli/chunks/sqlite-persistence-NVVAPZN3.js +2 -0
  263. package/dist/cli/chunks/{status-handler-ZXANTHKT.js → status-handler-GMIOXQIE.js} +2 -2
  264. package/dist/cli/chunks/{structural-health-LR6WI3AH.js → structural-health-YZXHVHM6.js} +2 -2
  265. package/dist/cli/chunks/{sync-I5IUJF33.js → sync-GMPCPV5L.js} +2 -2
  266. package/dist/cli/chunks/{sync-4OEI3BC2.js → sync-N56UQGCS.js} +2 -2
  267. package/dist/cli/chunks/{task-handler-R3ATJKU5.js → task-handler-VTNRGAXP.js} +2 -2
  268. package/dist/cli/chunks/{task-handlers-4X357AEW.js → task-handlers-FYSDH55N.js} +3 -3
  269. package/dist/cli/chunks/{test-PR2B5H2F.js → test-GQNCKRSP.js} +4 -4
  270. package/dist/cli/chunks/{test-scheduling-ZNOSQVLD.js → test-scheduling-GPRXSIRP.js} +3 -3
  271. package/dist/cli/chunks/{token-bootstrap-LYXOI72S.js → token-bootstrap-76SRNXGG.js} +2 -2
  272. package/dist/cli/chunks/{token-usage-R6EQZBX2.js → token-usage-O7CZDP5Q.js} +2 -2
  273. package/dist/cli/chunks/{transformers-COQWK27J.js → transformers-LTU4LSSC.js} +2 -2
  274. package/dist/cli/chunks/{tree-sitter-wasm-parser-LLIW2X3M.js → tree-sitter-wasm-parser-NQSQCMBM.js} +2 -2
  275. package/dist/cli/chunks/{types-MEYTZITK.js → types-OP6IWE6N.js} +2 -2
  276. package/dist/cli/chunks/unified-memory-DSTIEDSH.js +2 -0
  277. package/dist/cli/chunks/unified-memory-hnsw-KBV3P4OS.js +2 -0
  278. package/dist/cli/chunks/unified-persistence-XKCOUBKY.js +2 -0
  279. package/dist/cli/chunks/{upgrade-DVIJ456A.js → upgrade-OQWRBZ3R.js} +2 -2
  280. package/dist/cli/chunks/{validate-UYTSMJ5X.js → validate-TH5SRP3E.js} +2 -2
  281. package/dist/cli/chunks/{validate-swarm-P32WCJR6.js → validate-swarm-UITL2JUS.js} +2 -2
  282. package/dist/cli/chunks/{vibium-JGVOLM6X.js → vibium-O6PRAG4J.js} +2 -2
  283. package/dist/cli/chunks/visual-security-TTWSPZTZ.js +2 -0
  284. package/dist/cli/chunks/{web-tree-sitter-5ZGNCTPN.js → web-tree-sitter-XBFBY4OF.js} +2 -2
  285. package/dist/cli/chunks/{windsurf-installer-IILSSQAE.js → windsurf-installer-DVT5NRNY.js} +2 -2
  286. package/dist/cli/chunks/witness-chain-2KY73HPN.js +2 -0
  287. package/dist/cli/chunks/{witness-chain-JZMXCG3B.js → witness-chain-VRSH2F36.js} +2 -2
  288. package/dist/cli/chunks/{witness-key-manager-UUTLNUIH.js → witness-key-manager-GFHRDKQ4.js} +2 -2
  289. package/dist/cli/chunks/{workflow-NS7HXVHZ.js → workflow-HAZ6YKOG.js} +4 -4
  290. package/dist/cli/chunks/workflow-orchestrator-UK56AVOT.js +2 -0
  291. package/dist/cli/chunks/{wrappers-XKEDSV5W.js → wrappers-5LLLT7GM.js} +2 -2
  292. package/dist/cli/commands/daemon.js +3 -0
  293. package/dist/cli/commands/platform.d.ts +1 -0
  294. package/dist/cli/commands/platform.js +28 -6
  295. package/dist/cli/commands/quality-gate.js +25 -3
  296. package/dist/cli/foreground-command.d.ts +3 -0
  297. package/dist/cli/foreground-command.js +22 -0
  298. package/dist/cli/handlers/init-handler.d.ts +5 -0
  299. package/dist/cli/handlers/init-handler.js +6 -0
  300. package/dist/cli/index.js +8 -1
  301. package/dist/contracts/verdicts.d.ts +625 -0
  302. package/dist/contracts/verdicts.js +202 -14
  303. package/dist/coordination/handlers/coverage-handlers.js +8 -1
  304. package/dist/domains/chaos-resilience/diagnosis/corpus.d.ts +5 -0
  305. package/dist/domains/chaos-resilience/diagnosis/corpus.js +141 -0
  306. package/dist/domains/chaos-resilience/diagnosis/detectors.d.ts +11 -0
  307. package/dist/domains/chaos-resilience/diagnosis/detectors.js +109 -0
  308. package/dist/domains/chaos-resilience/diagnosis/index.d.ts +5 -0
  309. package/dist/domains/chaos-resilience/diagnosis/index.js +5 -0
  310. package/dist/domains/chaos-resilience/diagnosis/scorer.d.ts +8 -0
  311. package/dist/domains/chaos-resilience/diagnosis/scorer.js +128 -0
  312. package/dist/domains/chaos-resilience/diagnosis/types.d.ts +171 -0
  313. package/dist/domains/chaos-resilience/diagnosis/types.js +3 -0
  314. package/dist/domains/chaos-resilience/index.d.ts +1 -0
  315. package/dist/domains/chaos-resilience/index.js +1 -0
  316. package/dist/domains/index.d.ts +1 -0
  317. package/dist/domains/index.js +1 -0
  318. package/dist/early-exit/early-exit-controller.d.ts +4 -2
  319. package/dist/early-exit/early-exit-controller.js +95 -7
  320. package/dist/early-exit/index.d.ts +1 -1
  321. package/dist/early-exit/speculative-executor.js +3 -0
  322. package/dist/early-exit/types.d.ts +51 -0
  323. package/dist/early-exit/types.js +3 -0
  324. package/dist/index.d.ts +4 -2
  325. package/dist/index.js +2 -1
  326. package/dist/init/browser-engine-installer.d.ts +11 -0
  327. package/dist/init/browser-engine-installer.js +35 -5
  328. package/dist/init/codex-installer.d.ts +11 -1
  329. package/dist/init/codex-installer.js +90 -24
  330. package/dist/init/init-wizard-hooks.js +11 -11
  331. package/dist/init/orchestrator.js +2 -0
  332. package/dist/init/phases/07-hooks.d.ts +3 -3
  333. package/dist/init/phases/07-hooks.js +19 -18
  334. package/dist/init/phases/09-assets.d.ts +4 -0
  335. package/dist/init/phases/09-assets.js +13 -10
  336. package/dist/init/phases/phase-interface.d.ts +2 -0
  337. package/dist/init/types.d.ts +4 -0
  338. package/dist/learning/index.d.ts +3 -0
  339. package/dist/learning/index.js +2 -0
  340. package/dist/learning/pattern-mutation-error.d.ts +9 -0
  341. package/dist/learning/pattern-mutation-error.js +14 -0
  342. package/dist/learning/pattern-store.js +24 -2
  343. package/dist/learning/qe-reasoning-bank.js +24 -5
  344. package/dist/learning/rvf-pattern-store.js +23 -5
  345. package/dist/learning/structural-retrieval/corpus.d.ts +5 -0
  346. package/dist/learning/structural-retrieval/corpus.js +97 -0
  347. package/dist/learning/structural-retrieval/evaluate.d.ts +7 -0
  348. package/dist/learning/structural-retrieval/evaluate.js +124 -0
  349. package/dist/learning/structural-retrieval/index.d.ts +6 -0
  350. package/dist/learning/structural-retrieval/index.js +4 -0
  351. package/dist/learning/structural-retrieval/receipt.d.ts +14 -0
  352. package/dist/learning/structural-retrieval/receipt.js +36 -0
  353. package/dist/learning/structural-retrieval/types.d.ts +83 -0
  354. package/dist/learning/structural-retrieval/types.js +2 -0
  355. package/dist/mcp/bundle.js +423 -423
  356. package/dist/mcp/index.d.ts +1 -0
  357. package/dist/mcp/index.js +1 -0
  358. package/dist/mcp/protocol-server.js +11 -2
  359. package/dist/mcp/qe-tool-bridge.js +1 -0
  360. package/dist/mcp/services/session-resume.d.ts +15 -19
  361. package/dist/mcp/services/session-resume.js +204 -194
  362. package/dist/mcp/tool-annotations.d.ts +25 -0
  363. package/dist/mcp/tool-annotations.js +75 -0
  364. package/dist/mcp/tool-registry.js +17 -12
  365. package/dist/mcp/tools/base.d.ts +7 -1
  366. package/dist/mcp/tools/base.js +8 -0
  367. package/dist/mcp/tools/quality-assessment/gate.d.ts +8 -5
  368. package/dist/mcp/tools/quality-assessment/gate.js +9 -4
  369. package/dist/mcp/tools/registry.d.ts +3 -0
  370. package/dist/mcp/tools/registry.js +1 -0
  371. package/dist/mcp/types.d.ts +15 -0
  372. package/dist/skills/qe-court/cli.js +0 -0
  373. package/dist/validation/quality-gate-runner.d.ts +27 -4
  374. package/dist/validation/quality-gate-runner.js +33 -4
  375. package/dist/validation/verification-reach.d.ts +90 -0
  376. package/dist/validation/verification-reach.js +187 -0
  377. package/dist/verification/adversarial-verify/index.d.ts +1 -1
  378. package/dist/verification/adversarial-verify/measurement-receipt.d.ts +13 -0
  379. package/dist/verification/adversarial-verify/measurement-receipt.js +136 -0
  380. package/dist/verification/adversarial-verify/synthesize.js +7 -10
  381. package/dist/verification/adversarial-verify/types.d.ts +35 -0
  382. package/dist/verification/adversarial-verify/verify.js +6 -1
  383. package/package.json +9 -5
  384. package/schemas/coverage-gap.schema.json +41 -0
  385. package/schemas/finding-verdict.schema.json +470 -0
  386. package/schemas/risk-decision.schema.json +41 -0
  387. package/dist/cli/chunks/adapter-3VBXL7DO.js +0 -2
  388. package/dist/cli/chunks/aqe-learning-engine-NXRNKJNA.js +0 -2
  389. package/dist/cli/chunks/base-F6GMOKU2.js +0 -2
  390. package/dist/cli/chunks/browser-workflow-QRDC46LR.js +0 -2
  391. package/dist/cli/chunks/chunk-3JIJBR4V.js +0 -2
  392. package/dist/cli/chunks/chunk-R2B6EE45.js +0 -2
  393. package/dist/cli/chunks/chunk-TRDEULS7.js +0 -4
  394. package/dist/cli/chunks/chunk-WJXHE52V.js +0 -65
  395. package/dist/cli/chunks/client-HNBZUEVV.js +0 -2
  396. package/dist/cli/chunks/codex-installer-AKQ5BCHU.js +0 -15
  397. package/dist/cli/chunks/core-handlers-TB7NLYXL.js +0 -2
  398. package/dist/cli/chunks/cross-domain-router-MDSI553U.js +0 -2
  399. package/dist/cli/chunks/dream-X7ISHFEE.js +0 -2
  400. package/dist/cli/chunks/heartbeat-scheduler-2C5XGFQT.js +0 -2
  401. package/dist/cli/chunks/hnsw-adapter-KCVMXLUL.js +0 -2
  402. package/dist/cli/chunks/hnsw-index-OGWZS6MP.js +0 -2
  403. package/dist/cli/chunks/impact-analyzer-IBJ43GQL.js +0 -2
  404. package/dist/cli/chunks/init-wizard-6XMFD5LP.js +0 -2
  405. package/dist/cli/chunks/kernel-UDUMUPB3.js +0 -2
  406. package/dist/cli/chunks/knowledge-graph-JRYTUG3W.js +0 -2
  407. package/dist/cli/chunks/llm-router-service-KF5ZALUQ.js +0 -2
  408. package/dist/cli/chunks/load-test-LHMBCNCH.js +0 -2
  409. package/dist/cli/chunks/memory-backend-WZHKHBZK.js +0 -2
  410. package/dist/cli/chunks/pattern-null-store-UZSHCRL2.js +0 -2
  411. package/dist/cli/chunks/platform-WCRBO3Z7.js +0 -2
  412. package/dist/cli/chunks/protocol-executor-42NLVDTC.js +0 -2
  413. package/dist/cli/chunks/qe-reasoning-bank-W74RSMMU.js +0 -2
  414. package/dist/cli/chunks/quality-gate-63DDBSGM.js +0 -7
  415. package/dist/cli/chunks/queen-coordinator-XELKSRMS.js +0 -2
  416. package/dist/cli/chunks/router-GTW2EQZV.js +0 -2
  417. package/dist/cli/chunks/routing-feedback-NVOBWEMK.js +0 -2
  418. package/dist/cli/chunks/rvf-dual-writer-5OPVMXNL.js +0 -2
  419. package/dist/cli/chunks/rvf-migration-adapter-5S4YFTX4.js +0 -2
  420. package/dist/cli/chunks/rvf-native-adapter-LYSJHEVX.js +0 -2
  421. package/dist/cli/chunks/safe-db-AEB3JMLD.js +0 -2
  422. package/dist/cli/chunks/schedule-4QNPCQNT.js +0 -2
  423. package/dist/cli/chunks/scheduler-S3DFHX6A.js +0 -2
  424. package/dist/cli/chunks/sqlite-persistence-L2KISU2H.js +0 -2
  425. package/dist/cli/chunks/unified-memory-5KQMA7FV.js +0 -2
  426. package/dist/cli/chunks/unified-memory-hnsw-PQRPTYOD.js +0 -2
  427. package/dist/cli/chunks/unified-persistence-YDONVPJB.js +0 -2
  428. package/dist/cli/chunks/visual-security-RJ7RTNGJ.js +0 -2
  429. package/dist/cli/chunks/witness-chain-YXXXNGAM.js +0 -2
  430. package/dist/cli/chunks/workflow-orchestrator-5KUAVSTH.js +0 -2
@@ -17,6 +17,7 @@ const AQE_DIR = path.join(PROJECT_ROOT, '.agentic-qe');
17
17
  const RVF_PATH = path.join(AQE_DIR, 'aqe.rvf');
18
18
  const DB_PATH = path.join(AQE_DIR, 'memory.db');
19
19
  const MAX_AGE_HOURS = 24;
20
+ const AQE_BIN = process.env.AQE_HOOK_BIN || (process.platform === 'win32' ? 'aqe.cmd' : 'aqe');
20
21
 
21
22
  // Mount-local kill switch. `brain export` (below) spawns a native RVF writer
22
23
  // that, on a macOS Docker virtiofs bind mount, deadlocks in a futex and IGNORES
@@ -37,7 +38,7 @@ function exportBrain() {
37
38
  const idmap = RVF_PATH + '.idmap.json';
38
39
  if (fs.existsSync(idmap)) fs.unlinkSync(idmap);
39
40
  const result = execFileSync(
40
- 'npx', ['agentic-qe', 'brain', 'export', '-o', RVF_PATH, '--format', 'rvf'],
41
+ AQE_BIN, ['brain', 'export', '-o', RVF_PATH, '--format', 'rvf'],
41
42
  { timeout: 60000, encoding: 'utf-8' }
42
43
  );
43
44
  const m = result.match(/Patterns:\s+(\d+)/);
@@ -144,12 +144,13 @@ if command -v node >/dev/null 2>&1; then
144
144
  node_version=$(node --version)
145
145
  log_success "Node.js installed: $node_version"
146
146
 
147
- # Check if Node.js version is 20+
147
+ # Check if Node.js version is 22.13+
148
148
  node_major=$(echo "$node_version" | cut -d'.' -f1 | sed 's/v//')
149
- if [ "$node_major" -ge 20 ]; then
150
- log_success "Node.js version meets requirements (≥20.0.0)"
149
+ node_minor=$(echo "$node_version" | cut -d'.' -f2)
150
+ if [ "$node_major" -gt 22 ] || { [ "$node_major" -eq 22 ] && [ "$node_minor" -ge 13 ]; }; then
151
+ log_success "Node.js version meets requirements (≥22.13.0)"
151
152
  else
152
- log_error "Node.js version too old. Required: ≥20.0.0, Found: $node_version"
153
+ log_error "Node.js version too old. Required: ≥22.13.0, Found: $node_version"
153
154
  fi
154
155
  else
155
156
  log_error "Node.js not installed"
@@ -213,4 +214,4 @@ else
213
214
  fi
214
215
  log_error "Please fix critical errors before proceeding with V3 development."
215
216
  exit 1
216
- fi
217
+ fi
@@ -3,7 +3,7 @@
3
3
  * Resilient AQE hook shim (#510 item 5 — ports ruflo's hook-shim contract).
4
4
  *
5
5
  * Written in Node (CommonJS) so ONE file is cross-platform — Node is already a
6
- * hard dependency of AQE (the CLI is Node >= 20), so this runs identically on
6
+ * hard dependency of AQE (the CLI is Node >= 22.13), so this runs identically on
7
7
  * Windows / macOS / Linux with no POSIX `.sh` + `.cjs` twin. (It replaced an
8
8
  * earlier `aqe-hook.sh`, which forced a Windows twin and a `node_modules/.bin`
9
9
  * shell-wrapper spawn — see PR #512 discussion.)
@@ -14,9 +14,9 @@
14
14
  * polluting the transcript, and a crash/slow init can surface a hook error.
15
15
  *
16
16
  * Contract:
17
- * * resolve a PROJECT-LOCAL AQE bundle and run it via THIS node (no shell, no
18
- * .bin/.cmd wrapper) — or fall back to `npx agentic-qe` for npx-only installs
19
- * (disable that fallback with AQE_HOOK_NPX=0);
17
+ * * resolve a PROJECT-LOCAL AQE bundle and run it via THIS node (no shell),
18
+ * or invoke an already-installed `aqe` binary without package-manager or
19
+ * network resolution;
20
20
  * * if nothing resolves, no-op (a hook must never block a turn);
21
21
  * * keep stderr OUT of the transcript, but tee fatal native-init markers
22
22
  * (e.g. better-sqlite3 `invalid ELF header`) to a throttled, durable
@@ -49,14 +49,14 @@ const args = process.argv.slice(2); // hook subcommand + its args
49
49
  // 2. local source build (this repo: ./dist)
50
50
  // -> run either directly via process.execPath (this node): no shell, no
51
51
  // node_modules/.bin/aqe(.cmd) wrapper, fully cross-platform.
52
- // 3. npx fallback (npx-only installs with no project-local
53
- // bundle) `npx -y --prefer-offline agentic-qe hooks ...`. Disable with
54
- // AQE_HOOK_NPX=0 (used by tests and by anyone who never wants a network
55
- // reach). When disabled and no local bundle exists, we no-op.
52
+ // 3. installed `aqe` binary (global/managed installs without a local
53
+ // bundle). AQE_HOOK_BIN is a test/managed-install seam; no package manager
54
+ // is ever invoked from a lifecycle hook.
56
55
  const candidates = [
56
+ process.env.AQE_HOOK_BUNDLE,
57
57
  path.join(PROJECT, 'node_modules', 'agentic-qe', 'dist', 'cli', 'bundle.js'),
58
58
  path.join(PROJECT, 'dist', 'cli', 'bundle.js'),
59
- ];
59
+ ].filter(Boolean);
60
60
 
61
61
  let cmd;
62
62
  let cmdArgs;
@@ -67,11 +67,9 @@ for (const p of candidates) {
67
67
  if (bundle) {
68
68
  cmd = process.execPath;
69
69
  cmdArgs = [bundle, 'hooks', ...args];
70
- } else if (process.env.AQE_HOOK_NPX !== '0') {
71
- cmd = process.platform === 'win32' ? 'npx.cmd' : 'npx';
72
- cmdArgs = ['-y', '--prefer-offline', 'agentic-qe', 'hooks', ...args];
73
70
  } else {
74
- process.exit(0); // no project-local AQE and npx disabled -> no-op, never block
71
+ cmd = process.env.AQE_HOOK_BIN || (process.platform === 'win32' ? 'aqe.cmd' : 'aqe');
72
+ cmdArgs = ['hooks', ...args];
75
73
  }
76
74
 
77
75
  // Fatal init markers that mean the hook ran but its persistence layer is dead
@@ -94,7 +92,9 @@ const FATAL_MARKERS = [
94
92
  // harness timeout vs. this shim's own admitted ~30-60s cold start left
95
93
  // routing_outcomes writes silently dropped for a month — nothing recorded
96
94
  // the mismatch because nothing was watching for it.)
97
- const SPAWN_TIMEOUT_MS = Number(process.env.AQE_HOOK_TIMEOUT_MS) || 18000;
95
+ const FAST_HOOKS = new Set(['guard', 'pre-command']);
96
+ const SPAWN_TIMEOUT_MS = Number(process.env.AQE_HOOK_TIMEOUT_MS)
97
+ || (FAST_HOOKS.has(args[0]) ? 2500 : 4500);
98
98
 
99
99
  function recordHookHealth(line) {
100
100
  try {
@@ -52,26 +52,18 @@ setup:
52
52
  optional_tools:
53
53
  - pixelmatch
54
54
  - pngjs
55
- # NOTE: this yaml deliberately uses ONLY pinned public fixtures
56
- # (httpbin.org/*) so it can be run end-to-end by CommandEvalRunner without
57
- # any prerequisite services. Tests that need a local poisoned-HTML fixture
58
- # (the check-injection severity path) live in scripts/smoke-test.sh, which
59
- # starts fixtures/serve-skills.js out of band.
55
+ # The CI workflow starts fixtures/serve-skills.js on loopback before this
56
+ # suite runs. Keeping browser targets local removes rate limits and makes
57
+ # every page stable across repeated visual comparisons.
60
58
 
61
59
  fixtures:
62
- public_pinned:
63
- # Pinned public endpoints — chosen because they're stable, well-known, and
64
- # serve predictable forms / HTML. Per feedback_no_unverified_failure_modes,
65
- # these are the canonical "does the tool actually work" fixtures.
66
- httpbin_form:
67
- url: "https://httpbin.org/forms/post"
68
- description: "Classic simple form custname, custtel, custemail, size, toppings"
69
- httpbin_html:
70
- url: "https://httpbin.org/html"
71
- description: "Static HTML page with known headings"
72
- httpbin_status_404:
73
- url: "https://httpbin.org/status/404"
74
- description: "Known 404 for testing no_failed_requests"
60
+ local:
61
+ form:
62
+ url: "http://127.0.0.1:8088/fixtures/form.html"
63
+ description: "Deterministic form with an email input and submit button"
64
+ content:
65
+ url: "http://127.0.0.1:8088/fixtures/content.html"
66
+ description: "Deterministic static page with a known heading"
75
67
 
76
68
  test_cases:
77
69
  # -------- assert.js --------
@@ -81,10 +73,10 @@ test_cases:
81
73
  priority: critical
82
74
  input:
83
75
  setup:
84
- - "vibium --headless go https://httpbin.org/forms/post"
76
+ - "vibium --headless go http://127.0.0.1:8088/fixtures/form.html"
85
77
  command: |
86
78
  node .claude/skills/qe-browser/scripts/assert.js --checks \
87
- '[{"kind": "url_contains", "text": "httpbin.org/forms"}]'
79
+ '[{"kind": "url_contains", "text": "/fixtures/form.html"}]'
88
80
  expected:
89
81
  exit_code: 0
90
82
  json_fields:
@@ -98,7 +90,7 @@ test_cases:
98
90
  priority: critical
99
91
  input:
100
92
  setup:
101
- - "vibium --headless go https://httpbin.org/html"
93
+ - "vibium --headless go http://127.0.0.1:8088/fixtures/content.html"
102
94
  command: |
103
95
  node .claude/skills/qe-browser/scripts/assert.js --checks \
104
96
  '[{"kind": "selector_visible", "selector": "h1"}]'
@@ -113,7 +105,7 @@ test_cases:
113
105
  priority: critical
114
106
  input:
115
107
  setup:
116
- - "vibium --headless go https://httpbin.org/html"
108
+ - "vibium --headless go http://127.0.0.1:8088/fixtures/content.html"
117
109
  command: |
118
110
  node .claude/skills/qe-browser/scripts/assert.js --checks \
119
111
  '[{"kind": "url_contains", "text": "this-does-not-exist"}]'
@@ -132,10 +124,10 @@ test_cases:
132
124
  command: |
133
125
  node .claude/skills/qe-browser/scripts/batch.js --steps \
134
126
  '[
135
- {"action": "go", "url": "https://httpbin.org/html"},
127
+ {"action": "go", "url": "http://127.0.0.1:8088/fixtures/content.html"},
136
128
  {"action": "wait_load"},
137
129
  {"action": "assert", "checks": [
138
- {"kind": "url_contains", "text": "/html"},
130
+ {"kind": "url_contains", "text": "/fixtures/content.html"},
139
131
  {"kind": "selector_visible", "selector": "h1"}
140
132
  ]}
141
133
  ]' --summary-only
@@ -154,9 +146,11 @@ test_cases:
154
146
  command: |
155
147
  node .claude/skills/qe-browser/scripts/batch.js --steps \
156
148
  '[
157
- {"action": "go", "url": "https://httpbin.org/html"},
158
- {"action": "click", "selector": "#does-not-exist"},
159
- {"action": "go", "url": "https://httpbin.org/forms/post"}
149
+ {"action": "go", "url": "http://127.0.0.1:8088/fixtures/content.html"},
150
+ {"action": "assert", "checks": [
151
+ {"kind": "url_contains", "text": "/does-not-exist"}
152
+ ]},
153
+ {"action": "go", "url": "http://127.0.0.1:8088/fixtures/form.html"}
160
154
  ]'
161
155
  expected:
162
156
  exit_code: 1
@@ -177,7 +171,7 @@ test_cases:
177
171
  # different dimensions (768×654 vs 765×672 observed), making the
178
172
  # pixel-diff in tc007 spuriously fail. Mirrors scripts/smoke-test.sh.
179
173
  - "vibium --headless viewport 1280 720"
180
- - "vibium --headless go https://httpbin.org/html"
174
+ - "vibium --headless go http://127.0.0.1:8088/fixtures/content.html"
181
175
  - "rm -rf .aqe/visual-baselines/eval_httpbin_html*"
182
176
  command: |
183
177
  node .claude/skills/qe-browser/scripts/visual-diff.js \
@@ -195,7 +189,7 @@ test_cases:
195
189
  input:
196
190
  setup:
197
191
  - "vibium --headless viewport 1280 720"
198
- - "vibium --headless go https://httpbin.org/html"
192
+ - "vibium --headless go http://127.0.0.1:8088/fixtures/content.html"
199
193
  command: |
200
194
  node .claude/skills/qe-browser/scripts/visual-diff.js \
201
195
  --name eval_httpbin_html --threshold 0.02
@@ -212,7 +206,7 @@ test_cases:
212
206
  priority: critical
213
207
  input:
214
208
  setup:
215
- - "vibium --headless go https://httpbin.org/html"
209
+ - "vibium --headless go http://127.0.0.1:8088/fixtures/content.html"
216
210
  command: |
217
211
  node .claude/skills/qe-browser/scripts/check-injection.js --include-hidden
218
212
  expected:
@@ -221,15 +215,11 @@ test_cases:
221
215
  ".status": "success"
222
216
  ".output.checkInjection.severity": "none"
223
217
 
224
- # GAP: the "poisoned-page detected with severity>=high" contract needs a
225
- # local fixture (fixtures/injection-poisoned.html) served by
226
- # fixtures/serve-skills.js. That's out of scope for this yaml — we keep
227
- # CommandEvalRunner dependency-free so it can run anywhere httpbin.org
228
- # is reachable. Coverage of the high-severity path is currently
218
+ # The "poisoned-page detected with severity>=high" contract is currently
219
+ # asserted outside this command suite. Coverage of the high-severity path is
229
220
  # only asserted by unit tests on check-injection.js (see
230
221
  # tests/unit/scripts/qe-browser-check-injection.test.ts). Follow-up:
231
- # either teach CommandEvalRunner to spawn the fixture server, or add a
232
- # tc009 to scripts/smoke-test.sh that starts/stops it out of band.
222
+ # add tc009 against fixtures/injection-poisoned.html.
233
223
 
234
224
  # -------- intent-score.js --------
235
225
  - id: tc010_intent_submit_form_on_httpbin
@@ -238,7 +228,7 @@ test_cases:
238
228
  priority: critical
239
229
  input:
240
230
  setup:
241
- - "vibium --headless go https://httpbin.org/forms/post"
231
+ - "vibium --headless go http://127.0.0.1:8088/fixtures/form.html"
242
232
  command: |
243
233
  node .claude/skills/qe-browser/scripts/intent-score.js \
244
234
  --intent submit_form
@@ -255,7 +245,7 @@ test_cases:
255
245
  priority: medium
256
246
  input:
257
247
  setup:
258
- - "vibium --headless go https://httpbin.org/html"
248
+ - "vibium --headless go http://127.0.0.1:8088/fixtures/content.html"
259
249
  command: |
260
250
  node .claude/skills/qe-browser/scripts/intent-score.js --intent fill_email
261
251
  expected:
@@ -270,5 +260,4 @@ validation:
270
260
  notes: |
271
261
  Evaluation assumes:
272
262
  - `vibium` v26.3.x+ is on PATH (from `aqe init` or `npm install -g vibium`)
273
- - Network access to httpbin.org (public, stable)
274
- - Local fixtures server running on :8088 (started in setup.local_docs_server)
263
+ - Local fixtures server running on 127.0.0.1:8088
@@ -74,6 +74,31 @@ const POISONED_HTML = `<!doctype html>
74
74
  </body>
75
75
  </html>`;
76
76
 
77
+ const CONTENT_HTML = `<!doctype html>
78
+ <html lang="en">
79
+ <head><meta charset="utf-8"><title>QE Browser Content Fixture</title></head>
80
+ <body>
81
+ <main>
82
+ <h1>QE Browser Content Fixture</h1>
83
+ <p>This deterministic page exercises browser assertions and visual comparisons.</p>
84
+ </main>
85
+ </body>
86
+ </html>`;
87
+
88
+ const FORM_HTML = `<!doctype html>
89
+ <html lang="en">
90
+ <head><meta charset="utf-8"><title>QE Browser Form Fixture</title></head>
91
+ <body>
92
+ <main>
93
+ <h1>Contact form</h1>
94
+ <form method="post" action="/fixtures/form.html">
95
+ <label>Email <input id="email" name="email" type="email" autocomplete="email"></label>
96
+ <button type="submit">Submit</button>
97
+ </form>
98
+ </main>
99
+ </body>
100
+ </html>`;
101
+
77
102
  function notFound(res, message) {
78
103
  res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
79
104
  res.end(`404 Not Found: ${message}\n`);
@@ -95,6 +120,18 @@ function serve(req, res) {
95
120
  return;
96
121
  }
97
122
 
123
+ if (pathname === '/fixtures/content.html') {
124
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
125
+ res.end(CONTENT_HTML);
126
+ return;
127
+ }
128
+
129
+ if (pathname === '/fixtures/form.html') {
130
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
131
+ res.end(FORM_HTML);
132
+ return;
133
+ }
134
+
98
135
  // Rewrite /foo/SKILL.md.html → /foo/SKILL.md (or similar) and serve wrapped.
99
136
  if (pathname.endsWith('.html')) {
100
137
  const mdPath = pathname.replace(/\.html$/, '');
@@ -292,7 +292,7 @@ function readInlineOrFile(value) {
292
292
  // "we couldn't run the test because the browser engine isn't installed."
293
293
  function emit(env) {
294
294
  process.stdout.write(`${JSON.stringify(env, null, 2)}\n`);
295
- if (env.status === 'success') return 0;
295
+ if (env.status === 'success' || env.status === 'partial') return 0;
296
296
  if (env.status === 'skipped') return 2;
297
297
  return 1;
298
298
  }
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bash
2
2
  # qe-browser smoke test (bash mirror of evals/qe-browser.yaml)
3
3
  #
4
- # Runs each helper script against pinned public fixtures (httpbin.org) and
4
+ # Runs each helper script against deterministic local fixtures and
5
5
  # verifies the output structure. Gates PR-reopen per ADR-091 Phase 3.
6
6
  #
7
7
  # RELATIONSHIP TO evals/qe-browser.yaml
@@ -24,16 +24,25 @@
24
24
  # 2 — vibium binary not on PATH (precondition unmet)
25
25
  #
26
26
  # Per feedback_no_unverified_failure_modes.md, this is the script we
27
- # actually run, not just write. Per feedback_synthetic_fixtures_dont_count,
28
- # all fixtures are pinned public endpoints (httpbin.org) no synthetic
29
- # stubs, no inline HTML.
27
+ # actually run, not just write. The fixture pages are maintained with the
28
+ # skill and served only on loopback, removing public-service rate limits.
30
29
 
31
30
  set -uo pipefail
32
31
 
33
32
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
34
33
  SKILL_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
35
34
  WORK_DIR="$(mktemp -d)"
36
- trap 'rm -rf "$WORK_DIR"' EXIT
35
+ FIXTURE_PORT="${QE_BROWSER_FIXTURE_PORT:-8088}"
36
+ FIXTURE_URL="${QE_BROWSER_FIXTURE_URL:-http://127.0.0.1:${FIXTURE_PORT}}"
37
+ FIXTURE_PID=""
38
+
39
+ cleanup() {
40
+ if [ -n "$FIXTURE_PID" ]; then
41
+ kill "$FIXTURE_PID" >/dev/null 2>&1 || true
42
+ fi
43
+ rm -rf "$WORK_DIR"
44
+ }
45
+ trap cleanup EXIT
37
46
 
38
47
  GREEN='\033[0;32m'
39
48
  RED='\033[0;31m'
@@ -57,6 +66,28 @@ if ! command -v vibium >/dev/null 2>&1; then
57
66
  exit 2
58
67
  fi
59
68
 
69
+ if ! curl --silent --fail "$FIXTURE_URL/fixtures/content.html" >/dev/null 2>&1; then
70
+ QE_BROWSER_FIXTURE_PORT="$FIXTURE_PORT" \
71
+ node "$SKILL_DIR/fixtures/serve-skills.js" >"$WORK_DIR/fixture-server.log" 2>&1 &
72
+ FIXTURE_PID=$!
73
+ fixture_ready=0
74
+ for _attempt in 1 2 3 4 5; do
75
+ if curl --silent --fail "$FIXTURE_URL/fixtures/content.html" >/dev/null 2>&1; then
76
+ fixture_ready=1
77
+ break
78
+ fi
79
+ sleep 1
80
+ done
81
+ if [ "$fixture_ready" != "1" ]; then
82
+ cat "$WORK_DIR/fixture-server.log" >&2
83
+ echo -e "${RED}qe-browser fixture server did not become ready${NC}" >&2
84
+ exit 1
85
+ fi
86
+ fi
87
+
88
+ CONTENT_URL="$FIXTURE_URL/fixtures/content.html"
89
+ FORM_URL="$FIXTURE_URL/fixtures/form.html"
90
+
60
91
  VIBIUM_VERSION=$(vibium --version 2>&1 | head -1)
61
92
  echo "Smoke testing against $VIBIUM_VERSION"
62
93
  echo "Skill dir: $SKILL_DIR"
@@ -64,29 +95,29 @@ echo "Work dir: $WORK_DIR"
64
95
  echo ""
65
96
 
66
97
  # ---------------------------------------------------------------------------
67
- # tc001 — assert.js url_contains against pinned httpbin form
98
+ # tc001 — assert.js url_contains against the local form fixture
68
99
  # ---------------------------------------------------------------------------
69
- vibium --headless go https://httpbin.org/forms/post >/dev/null 2>&1 || true
100
+ vibium --headless go "$FORM_URL" >/dev/null 2>&1 || true
70
101
  RESULT=$(node "$SKILL_DIR/scripts/assert.js" --checks \
71
- '[{"kind": "url_contains", "text": "httpbin.org/forms"}]' 2>&1)
102
+ '[{"kind": "url_contains", "text": "/fixtures/form.html"}]' 2>&1)
72
103
  EXIT=$?
73
104
  if [ "$EXIT" = "0" ] && echo "$RESULT" | grep -q '"status": "success"'; then
74
- ok "tc001 url_contains on httpbin form"
105
+ ok "tc001 url_contains on local form"
75
106
  else
76
- bad "tc001 url_contains on httpbin form" "exit=$EXIT, result=$RESULT"
107
+ bad "tc001 url_contains on local form" "exit=$EXIT, result=$RESULT"
77
108
  fi
78
109
 
79
110
  # ---------------------------------------------------------------------------
80
- # tc002 — assert.js selector_visible against pinned httpbin /html
111
+ # tc002 — assert.js selector_visible against the local content fixture
81
112
  # ---------------------------------------------------------------------------
82
- vibium --headless go https://httpbin.org/html >/dev/null 2>&1 || true
113
+ vibium --headless go "$CONTENT_URL" >/dev/null 2>&1 || true
83
114
  RESULT=$(node "$SKILL_DIR/scripts/assert.js" --checks \
84
115
  '[{"kind": "selector_visible", "selector": "h1"}]' 2>&1)
85
116
  EXIT=$?
86
117
  if [ "$EXIT" = "0" ] && echo "$RESULT" | grep -q '"passed": true'; then
87
- ok "tc002 selector_visible h1 on httpbin /html"
118
+ ok "tc002 selector_visible h1 on local content"
88
119
  else
89
- bad "tc002 selector_visible h1 on httpbin /html" "exit=$EXIT"
120
+ bad "tc002 selector_visible h1 on local content" "exit=$EXIT"
90
121
  fi
91
122
 
92
123
  # ---------------------------------------------------------------------------
@@ -105,7 +136,7 @@ fi
105
136
  # tc004 — batch.js navigate + wait + assert in one call
106
137
  # ---------------------------------------------------------------------------
107
138
  RESULT=$(node "$SKILL_DIR/scripts/batch.js" --steps \
108
- '[{"action":"go","url":"https://httpbin.org/html"},{"action":"wait_load"},{"action":"assert","checks":[{"kind":"url_contains","text":"/html"}]}]' \
139
+ "[{\"action\":\"go\",\"url\":\"$CONTENT_URL\"},{\"action\":\"wait_load\"},{\"action\":\"assert\",\"checks\":[{\"kind\":\"url_contains\",\"text\":\"/fixtures/content.html\"}]}]" \
109
140
  --summary-only 2>&1)
110
141
  EXIT=$?
111
142
  if [ "$EXIT" = "0" ] && echo "$RESULT" | grep -q '"passedSteps": 3'; then
@@ -118,7 +149,7 @@ fi
118
149
  # tc005 — batch.js stops on failure
119
150
  # ---------------------------------------------------------------------------
120
151
  RESULT=$(node "$SKILL_DIR/scripts/batch.js" --steps \
121
- '[{"action":"go","url":"https://httpbin.org/html"},{"action":"click","selector":"#does-not-exist-selector"},{"action":"go","url":"https://httpbin.org/forms/post"}]' 2>&1)
152
+ "[{\"action\":\"go\",\"url\":\"$CONTENT_URL\"},{\"action\":\"assert\",\"checks\":[{\"kind\":\"url_contains\",\"text\":\"/does-not-exist\"}]},{\"action\":\"go\",\"url\":\"$FORM_URL\"}]" 2>&1)
122
153
  EXIT=$?
123
154
  if [ "$EXIT" = "1" ] && echo "$RESULT" | grep -q '"failedStep"'; then
124
155
  ok "tc005 batch stops on first failure"
@@ -131,19 +162,19 @@ fi
131
162
  #
132
163
  # Set explicit viewport BEFORE screenshot so the two visual-diff runs have
133
164
  # the same dimensions. Without this the chromium headless window picks
134
- # whatever size it likes per run, and httpbin.org/html renders at different
165
+ # whatever size it likes per run, and pages may render at different
135
166
  # sizes between runs (768×654 vs 765×672 observed), making pixel-diff
136
167
  # spuriously fail. This is documented in references/assertion-kinds.md.
137
168
  # ---------------------------------------------------------------------------
138
169
  rm -rf "$PWD/.aqe/visual-baselines/smoke_test_baseline"*
139
170
  vibium --headless viewport 1280 720 >/dev/null 2>&1 || true
140
- vibium --headless go https://httpbin.org/html >/dev/null 2>&1 || true
171
+ vibium --headless go "$CONTENT_URL" >/dev/null 2>&1 || true
141
172
  RESULT=$(node "$SKILL_DIR/scripts/visual-diff.js" --name smoke_test_baseline 2>&1)
142
173
  EXIT=$?
143
174
  if [ "$EXIT" = "0" ] && echo "$RESULT" | grep -q '"baseline_created"'; then
144
175
  ok "tc006 visual-diff baseline created"
145
176
  else
146
- bad "tc006 visual-diff baseline created" "exit=$EXIT"
177
+ bad "tc006 visual-diff baseline created" "exit=$EXIT, result=$RESULT"
147
178
  fi
148
179
 
149
180
  # ---------------------------------------------------------------------------
@@ -157,13 +188,13 @@ EXIT=$?
157
188
  if [ "$EXIT" = "0" ] && echo "$RESULT" | grep -qE '"(match|baseline_created)"'; then
158
189
  ok "tc007 visual-diff second run matches"
159
190
  else
160
- bad "tc007 visual-diff second run matches" "exit=$EXIT"
191
+ bad "tc007 visual-diff second run matches" "exit=$EXIT, result=$RESULT"
161
192
  fi
162
193
 
163
194
  # ---------------------------------------------------------------------------
164
195
  # tc008 — check-injection.js clean page
165
196
  # ---------------------------------------------------------------------------
166
- vibium --headless go https://httpbin.org/html >/dev/null 2>&1 || true
197
+ vibium --headless go "$CONTENT_URL" >/dev/null 2>&1 || true
167
198
  RESULT=$(node "$SKILL_DIR/scripts/check-injection.js" --include-hidden 2>&1)
168
199
  EXIT=$?
169
200
  if [ "$EXIT" = "0" ] && echo "$RESULT" | grep -q '"severity": "none"'; then
@@ -173,15 +204,15 @@ else
173
204
  fi
174
205
 
175
206
  # ---------------------------------------------------------------------------
176
- # tc010 — intent-score.js submit_form on pinned httpbin form
207
+ # tc010 — intent-score.js submit_form on the local form fixture
177
208
  # ---------------------------------------------------------------------------
178
- vibium --headless go https://httpbin.org/forms/post >/dev/null 2>&1 || true
209
+ vibium --headless go "$FORM_URL" >/dev/null 2>&1 || true
179
210
  RESULT=$(node "$SKILL_DIR/scripts/intent-score.js" --intent submit_form 2>&1)
180
211
  EXIT=$?
181
212
  if [ "$EXIT" = "0" ] && echo "$RESULT" | grep -q '"intent": "submit_form"'; then
182
- ok "tc010 intent-score submit_form on httpbin form"
213
+ ok "tc010 intent-score submit_form on local form"
183
214
  else
184
- bad "tc010 intent-score submit_form on httpbin form" "exit=$EXIT"
215
+ bad "tc010 intent-score submit_form on local form" "exit=$EXIT"
185
216
  fi
186
217
 
187
218
  # ---------------------------------------------------------------------------
@@ -45,11 +45,10 @@ function ensureDir(dir) {
45
45
  fs.mkdirSync(dir, { recursive: true });
46
46
  }
47
47
 
48
- // Vibium screenshot quirks (verified against v26.3.18 on 2026-04-09):
49
- // 1. `vibium screenshot -o <path>` IGNORES the directory in <path>.
50
- // Only the basename is used, and the file is saved to
51
- // `~/Pictures/Vibium/<basename>`. We work around this by reading from
52
- // Vibium's actual output dir and copying to the requested location.
48
+ // Vibium screenshot output changed across the supported 26.x releases.
49
+ // Older releases ignore the directory passed to `-o` and save under
50
+ // `~/Pictures/Vibium`; newer releases may honor the requested path. Accept
51
+ // both behaviors so AQE init's compatible-version range stays usable.
53
52
  // 2. `--selector` flag does NOT exist on `vibium screenshot`. Selector-
54
53
  // scoped baselines are not supported in v26.3.x. We surface a clear
55
54
  // error if a caller passes one. Future Vibium versions may add it.
@@ -69,21 +68,31 @@ function captureScreenshot(selector, outputPath) {
69
68
  );
70
69
  }
71
70
  const basename = path.basename(outputPath);
72
- const args = ['screenshot', '-o', basename, '--full-page'];
71
+ const candidates = [
72
+ outputPath,
73
+ path.resolve(process.cwd(), basename),
74
+ path.join(vibiumPicturesDir(), basename),
75
+ ];
76
+ for (const candidate of candidates) {
77
+ fs.rmSync(candidate, { force: true });
78
+ }
79
+ const args = ['screenshot', '-o', outputPath, '--full-page'];
73
80
  const res = vibium(args);
74
81
  if (res.status !== 0) {
75
82
  throw new Error(`vibium screenshot failed: ${res.stderr.trim() || res.stdout.trim()}`);
76
83
  }
77
- // Vibium wrote the file to ~/Pictures/Vibium/<basename>, not outputPath.
78
- // Copy it to where the caller asked. Use copy-then-unlink so we leave
79
- // Vibium's own dir clean for the next run.
80
- const vibiumPath = path.join(vibiumPicturesDir(), basename);
81
- if (!fs.existsSync(vibiumPath)) {
82
- throw new Error(`screenshot output not created at ${vibiumPath} (vibium said: ${res.stdout.trim()})`);
84
+ const screenshotPath = candidates.find((candidate) => fs.existsSync(candidate));
85
+ if (!screenshotPath) {
86
+ throw new Error(
87
+ `screenshot output not created at any supported path (${candidates.join(', ')}; ` +
88
+ `vibium said: ${res.stdout.trim()})`
89
+ );
90
+ }
91
+ if (screenshotPath !== outputPath) {
92
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
93
+ fs.copyFileSync(screenshotPath, outputPath);
94
+ fs.unlinkSync(screenshotPath);
83
95
  }
84
- fs.mkdirSync(path.dirname(outputPath), { recursive: true });
85
- fs.copyFileSync(vibiumPath, outputPath);
86
- fs.unlinkSync(vibiumPath);
87
96
  return outputPath;
88
97
  }
89
98
 
@@ -940,7 +940,7 @@
940
940
  },
941
941
  "metadata": {
942
942
  "generatedBy": "Agentic QE Fleet",
943
- "fleetVersion": "3.14.0",
943
+ "fleetVersion": "3.14.2",
944
944
  "manifestVersion": "1.4.0",
945
945
  "lastUpdated": "2026-04-13T00:00:00.000Z",
946
946
  "contributors": [