agentic-qe 3.15.3 → 3.15.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. package/.claude/skills/skills-manifest.json +1 -1
  2. package/CHANGELOG.md +139 -0
  3. package/assets/skills/skills-manifest.json +1 -1
  4. package/dist/bridge/captured-experience-bridge.js +7 -9
  5. package/dist/cli/bundle.js +5 -5
  6. package/dist/cli/chunks/adapter-EGIPTX5H.js +2 -0
  7. package/dist/cli/chunks/{agent-booster-wasm-CYG3PKHH.js → agent-booster-wasm-CCTTGCQS.js} +2 -2
  8. package/dist/cli/chunks/{agent-handler-WTFYFZKL.js → agent-handler-DHYUF3NX.js} +2 -2
  9. package/dist/cli/chunks/{agent-memory-branch-G6WE3ZXU.js → agent-memory-branch-642W7CYX.js} +2 -2
  10. package/dist/cli/chunks/aqe-learning-engine-WP4GCBDT.js +2 -0
  11. package/dist/cli/chunks/{arena-S72QW44C.js → arena-MUCC7UUN.js} +4 -4
  12. package/dist/cli/chunks/{arena-ZFXQEVUQ.js → arena-NW2JVAFY.js} +2 -2
  13. package/dist/cli/chunks/{audit-KPYIEQJ3.js → audit-VKQTZJAA.js} +3 -3
  14. package/dist/cli/chunks/base-6ORFD62I.js +2 -0
  15. package/dist/cli/chunks/{better-sqlite3-L2M3TI5D.js → better-sqlite3-7ZUFVWLQ.js} +2 -2
  16. package/dist/cli/chunks/{brain-handler-FHKLQTB4.js → brain-handler-7LKAWSBI.js} +3 -3
  17. package/dist/cli/chunks/{branch-enumerator-3BSHOPOK.js → branch-enumerator-HUNXJKM4.js} +2 -2
  18. package/dist/cli/chunks/{browser-JUIJPL6Y.js → browser-ZSZEYUDP.js} +2 -2
  19. package/dist/cli/chunks/browser-workflow-PIXGERWP.js +2 -0
  20. package/dist/cli/chunks/{chunk-VHBZADYK.js → chunk-2KWI3MT3.js} +2 -2
  21. package/dist/cli/chunks/{chunk-35VDOH4Y.js → chunk-2WFTZSRT.js} +1 -1
  22. package/dist/cli/chunks/{chunk-UTALYUMW.js → chunk-2XYTS2WY.js} +2 -2
  23. package/dist/cli/chunks/{chunk-OTTTHNIT.js → chunk-35MDATQE.js} +1 -1
  24. package/dist/cli/chunks/{chunk-Z7UGEQ4G.js → chunk-3AYYGR6W.js} +1 -1
  25. package/dist/cli/chunks/{chunk-LPZAB3N2.js → chunk-3DTEQHFB.js} +3 -3
  26. package/dist/cli/chunks/{chunk-YHZGFWJE.js → chunk-3OAQPN2N.js} +2 -2
  27. package/dist/cli/chunks/{chunk-PUPEKA2J.js → chunk-3QD7U3FY.js} +2 -2
  28. package/dist/cli/chunks/{chunk-3Y4GX5FL.js → chunk-3SH23PS3.js} +2 -2
  29. package/dist/cli/chunks/{chunk-NT6FYFJA.js → chunk-3YASZPLO.js} +2 -2
  30. package/dist/cli/chunks/{chunk-QVNMTMDJ.js → chunk-3YNP33GB.js} +2 -2
  31. package/dist/cli/chunks/{chunk-AQTQ24SK.js → chunk-47GEI2LT.js} +3 -3
  32. package/dist/cli/chunks/{chunk-JJBTM4JO.js → chunk-4AZP7ZCW.js} +2 -2
  33. package/dist/cli/chunks/{chunk-6W6GZHQA.js → chunk-4PT5KNXL.js} +4 -4
  34. package/dist/cli/chunks/{chunk-EQGT4VLC.js → chunk-4UXPDV7E.js} +1 -1
  35. package/dist/cli/chunks/{chunk-SP2JO53K.js → chunk-4XSCZVON.js} +2 -2
  36. package/dist/cli/chunks/{chunk-DWG4TN6A.js → chunk-5BOZCMXZ.js} +1 -1
  37. package/dist/cli/chunks/{chunk-PBUWNMZ2.js → chunk-644DFAGS.js} +1 -1
  38. package/dist/cli/chunks/{chunk-6EQDA4EC.js → chunk-663ZFPUL.js} +2 -2
  39. package/dist/cli/chunks/{chunk-HU474NXP.js → chunk-6JFGB2JB.js} +1 -1
  40. package/dist/cli/chunks/{chunk-AS54N3H7.js → chunk-6LG5UEQE.js} +2 -2
  41. package/dist/cli/chunks/{chunk-3UUMGWHW.js → chunk-6UYN5PHA.js} +4 -4
  42. package/dist/cli/chunks/{chunk-RQUSJEON.js → chunk-6ZIDZ4TJ.js} +2 -2
  43. package/dist/cli/chunks/{chunk-P36IODAM.js → chunk-7BIYJRQJ.js} +2 -2
  44. package/dist/cli/chunks/{chunk-5LEUEWJY.js → chunk-7EZLOC4K.js} +2 -2
  45. package/dist/cli/chunks/{chunk-EBIMVSPH.js → chunk-7YB2KELI.js} +2 -2
  46. package/dist/cli/chunks/{chunk-YCGU2LI7.js → chunk-A2WOQO2N.js} +2 -2
  47. package/dist/cli/chunks/{chunk-HSR53REE.js → chunk-A337MD3C.js} +2 -2
  48. package/dist/cli/chunks/{chunk-ZJW4HRUA.js → chunk-A5J4XJS6.js} +1 -1
  49. package/dist/cli/chunks/{chunk-POTVF6BY.js → chunk-AQN5EDBM.js} +1 -1
  50. package/dist/cli/chunks/{chunk-X335K4SU.js → chunk-AUZXRFOX.js} +2 -2
  51. package/dist/cli/chunks/{chunk-WI7I6LMM.js → chunk-B2UHTA4Q.js} +1 -1
  52. package/dist/cli/chunks/{chunk-W7EHNX3Y.js → chunk-BBL6YXD3.js} +2 -2
  53. package/dist/cli/chunks/chunk-BJ5P4IV2.js +2 -0
  54. package/dist/cli/chunks/{chunk-RDTR43YN.js → chunk-BMWAWZAN.js} +2 -2
  55. package/dist/cli/chunks/chunk-BO4PKNYP.js +102 -0
  56. package/dist/cli/chunks/{chunk-KGS6H2HB.js → chunk-BY646JOM.js} +2 -2
  57. package/dist/cli/chunks/{chunk-PPA53NJB.js → chunk-BYXNHGQC.js} +2 -2
  58. package/dist/cli/chunks/{chunk-RRSZ27A7.js → chunk-BZFT4QDQ.js} +2 -2
  59. package/dist/cli/chunks/{chunk-M3ACHBC7.js → chunk-CFPR24YK.js} +2 -2
  60. package/dist/cli/chunks/{chunk-SRDECRTL.js → chunk-CQMHDAJS.js} +2 -2
  61. package/dist/cli/chunks/{chunk-WW4RJ6BH.js → chunk-CR2JUANW.js} +2 -2
  62. package/dist/cli/chunks/{chunk-QSVNVDA5.js → chunk-CXOXUBYU.js} +1 -1
  63. package/dist/cli/chunks/chunk-D3G2NN7F.js +741 -0
  64. package/dist/cli/chunks/{chunk-RGD2CG23.js → chunk-DEGWCUMY.js} +2 -2
  65. package/dist/cli/chunks/{chunk-AEL4XJGJ.js → chunk-DFPL5N3Q.js} +2 -2
  66. package/dist/cli/chunks/{chunk-FTUNC4EI.js → chunk-DL5JENWD.js} +3 -3
  67. package/dist/cli/chunks/{chunk-DH5NWHH2.js → chunk-DLY4YEN3.js} +2 -2
  68. package/dist/cli/chunks/{chunk-V5NYGDSX.js → chunk-DPV33C77.js} +2 -2
  69. package/dist/cli/chunks/{chunk-A5H7TF7C.js → chunk-DPYDUKVZ.js} +2 -2
  70. package/dist/cli/chunks/{chunk-4JVVVKAX.js → chunk-DTJODGCE.js} +2 -2
  71. package/dist/cli/chunks/{chunk-6AKJ73X3.js → chunk-DWZI3IVB.js} +2 -2
  72. package/dist/cli/chunks/{chunk-7UUSV2SK.js → chunk-DXVZBJE4.js} +1 -1
  73. package/dist/cli/chunks/{chunk-FPFGN2Z5.js → chunk-E4VIVMDL.js} +2 -2
  74. package/dist/cli/chunks/{chunk-GPZH6OPP.js → chunk-EAYQCBXL.js} +3 -3
  75. package/dist/cli/chunks/{chunk-7SWHW5AC.js → chunk-EOR3RECZ.js} +20 -20
  76. package/dist/cli/chunks/chunk-ERGWWI4Y.js +3 -0
  77. package/dist/cli/chunks/{chunk-XXW4KFBB.js → chunk-EUEHBERE.js} +1 -1
  78. package/dist/cli/chunks/{chunk-VUBLJBHQ.js → chunk-EVCFUYYK.js} +2 -2
  79. package/dist/cli/chunks/{chunk-YQ3ZW47V.js → chunk-FBEXG4HD.js} +2 -2
  80. package/dist/cli/chunks/{chunk-HV3ZVUHO.js → chunk-FE3AIZI6.js} +1 -1
  81. package/dist/cli/chunks/{chunk-TBVPNN65.js → chunk-FHUJCVT3.js} +2 -2
  82. package/dist/cli/chunks/{chunk-3ZTBV6M3.js → chunk-FNAYDITO.js} +1 -1
  83. package/dist/cli/chunks/{chunk-JVQK6NGI.js → chunk-FQKEZVN6.js} +2 -2
  84. package/dist/cli/chunks/{chunk-MUSYQF53.js → chunk-FWYJ6UDX.js} +2 -2
  85. package/dist/cli/chunks/{chunk-QUXX2DP7.js → chunk-GGDKOJVF.js} +2 -2
  86. package/dist/cli/chunks/{chunk-VRT736E3.js → chunk-GKPRECLL.js} +2 -2
  87. package/dist/cli/chunks/{chunk-3MNKYCLH.js → chunk-GRIPCYW5.js} +1 -1
  88. package/dist/cli/chunks/{chunk-DE3QNPTG.js → chunk-GTSOFCMQ.js} +1 -1
  89. package/dist/cli/chunks/{chunk-2MEWIXW4.js → chunk-HBYQYGXP.js} +2 -2
  90. package/dist/cli/chunks/{chunk-RWLOERKK.js → chunk-HGBJ2QQ4.js} +2 -2
  91. package/dist/cli/chunks/{chunk-4IYHYHTG.js → chunk-HIUNCO2W.js} +2 -2
  92. package/dist/cli/chunks/{chunk-WSUYEVSY.js → chunk-HLFDC4SF.js} +1 -1
  93. package/dist/cli/chunks/{chunk-OKNMZLGB.js → chunk-HPLMX62I.js} +2 -2
  94. package/dist/cli/chunks/{chunk-Z7JPWXW2.js → chunk-IHFUEPZH.js} +2 -2
  95. package/dist/cli/chunks/{chunk-2TBHPYOU.js → chunk-IJ2EXSMO.js} +2 -2
  96. package/dist/cli/chunks/{chunk-SKHP5WUP.js → chunk-IJOFZBXD.js} +2 -2
  97. package/dist/cli/chunks/{chunk-YW4GM36K.js → chunk-JANLATHN.js} +2 -2
  98. package/dist/cli/chunks/{chunk-BDKQSEEY.js → chunk-JCC7QEKZ.js} +1 -1
  99. package/dist/cli/chunks/{chunk-7PDC4SKR.js → chunk-JI77KJP7.js} +1 -1
  100. package/dist/cli/chunks/{chunk-LEB6O2IN.js → chunk-JNMUVBAJ.js} +2 -2
  101. package/dist/cli/chunks/{chunk-ZI6NJEBY.js → chunk-JYY7AYGA.js} +1 -1
  102. package/dist/cli/chunks/{chunk-ASUXS4N4.js → chunk-KHCALIFP.js} +2 -2
  103. package/dist/cli/chunks/{chunk-ED5HUPUR.js → chunk-KJ3KBP24.js} +2 -2
  104. package/dist/cli/chunks/{chunk-YTRGMILO.js → chunk-KZVJW2SD.js} +2 -2
  105. package/dist/cli/chunks/chunk-L336HFFE.js +2 -0
  106. package/dist/cli/chunks/{chunk-GJB3LPCS.js → chunk-L375O3CZ.js} +2 -2
  107. package/dist/cli/chunks/{chunk-WQZBKLAG.js → chunk-L6SVCNXK.js} +1 -1
  108. package/dist/cli/chunks/{chunk-YGKU2QRC.js → chunk-LNO5IWGH.js} +1 -1
  109. package/dist/cli/chunks/{chunk-APV5UWTU.js → chunk-LRASYSGV.js} +2 -2
  110. package/dist/cli/chunks/{chunk-HW4V7BVV.js → chunk-MB4VFAJC.js} +2 -2
  111. package/dist/cli/chunks/{chunk-366IBPZB.js → chunk-MNQ36MAF.js} +2 -2
  112. package/dist/cli/chunks/{chunk-7TW5UGDP.js → chunk-MQGEZA2A.js} +2 -2
  113. package/dist/cli/chunks/{chunk-CFXROOIU.js → chunk-MS3Z2CP5.js} +2 -2
  114. package/dist/cli/chunks/{chunk-4TM5K6EZ.js → chunk-N2TJNIHA.js} +2 -2
  115. package/dist/cli/chunks/{chunk-DLA3EHKJ.js → chunk-NF6AFIAX.js} +1 -1
  116. package/dist/cli/chunks/{chunk-2GJJGO5D.js → chunk-NLDFNAOS.js} +2 -2
  117. package/dist/cli/chunks/{chunk-UCSGZVJX.js → chunk-NMJVG22Z.js} +1 -1
  118. package/dist/cli/chunks/{chunk-WSND64RL.js → chunk-OGYWWZU7.js} +2 -2
  119. package/dist/cli/chunks/{chunk-FXTZXZCU.js → chunk-ONCH5AXU.js} +3 -3
  120. package/dist/cli/chunks/{chunk-M3ONCPSU.js → chunk-OQDC7GCM.js} +2 -2
  121. package/dist/cli/chunks/{chunk-P6EGRAQG.js → chunk-ORTBRO7F.js} +2 -2
  122. package/dist/cli/chunks/{chunk-D6PUDLJ4.js → chunk-OU4ZAWCC.js} +2 -2
  123. package/dist/cli/chunks/{chunk-AOZJ6UUZ.js → chunk-OW42F2TX.js} +2 -2
  124. package/dist/cli/chunks/{chunk-4N7YXTV3.js → chunk-PCCIZFD7.js} +1 -1
  125. package/dist/cli/chunks/{chunk-OT6SOPAL.js → chunk-PDPEMBFV.js} +2 -2
  126. package/dist/cli/chunks/{chunk-A3IQU2ND.js → chunk-PHAQWAEV.js} +2 -2
  127. package/dist/cli/chunks/{chunk-XV2TIODR.js → chunk-PHP4UJYP.js} +1 -1
  128. package/dist/cli/chunks/{chunk-POVP6O6K.js → chunk-PURHGLEC.js} +1 -1
  129. package/dist/cli/chunks/{chunk-5QUOM357.js → chunk-PVAE65B4.js} +1 -1
  130. package/dist/cli/chunks/{chunk-ZL2GYU7H.js → chunk-QPV3OKX2.js} +2 -2
  131. package/dist/cli/chunks/{chunk-B23ROYST.js → chunk-QXY3IRBW.js} +21 -21
  132. package/dist/cli/chunks/chunk-RCXMUEZN.js +3 -0
  133. package/dist/cli/chunks/{chunk-HVIFA73X.js → chunk-RMJ7PJOS.js} +2 -2
  134. package/dist/cli/chunks/{chunk-OGARNKLS.js → chunk-RUJLVJDE.js} +2 -2
  135. package/dist/cli/chunks/{chunk-UGNTLSBL.js → chunk-RUSLEOMC.js} +2 -2
  136. package/dist/cli/chunks/chunk-SAPIRK2G.js +3 -0
  137. package/dist/cli/chunks/{chunk-F5BREV2Q.js → chunk-SDWMLT7B.js} +5 -5
  138. package/dist/cli/chunks/{chunk-A6PII4R4.js → chunk-SEZLYRCS.js} +1 -1
  139. package/dist/cli/chunks/{chunk-RWQDRPN5.js → chunk-TDLKXLJC.js} +2 -2
  140. package/dist/cli/chunks/{chunk-YJH7UFA2.js → chunk-U4TV75AC.js} +2 -2
  141. package/dist/cli/chunks/{chunk-34Y4CIHD.js → chunk-U6OVPMQX.js} +2 -2
  142. package/dist/cli/chunks/{chunk-L6OSEWOS.js → chunk-UE22ODHN.js} +1 -1
  143. package/dist/cli/chunks/{chunk-IARE5VGI.js → chunk-UXZEVIFX.js} +1 -1
  144. package/dist/cli/chunks/{chunk-OMHISPPF.js → chunk-V7GNUVYI.js} +1 -1
  145. package/dist/cli/chunks/{chunk-HR7RL4PB.js → chunk-VCKDVOPD.js} +2 -2
  146. package/dist/cli/chunks/{chunk-UZDTRCVU.js → chunk-VH3EB6ZG.js} +2 -2
  147. package/dist/cli/chunks/{chunk-6V6XVGCL.js → chunk-VLOIEVER.js} +3 -3
  148. package/dist/cli/chunks/{chunk-XTGVGZ4J.js → chunk-VML4SG3X.js} +3 -3
  149. package/dist/cli/chunks/{chunk-6TYTBQPV.js → chunk-VRJPH3LG.js} +2 -2
  150. package/dist/cli/chunks/{chunk-5WOBFN2T.js → chunk-VYDNLQJN.js} +2 -2
  151. package/dist/cli/chunks/{chunk-U5AVZ3T2.js → chunk-W3ZGNNDV.js} +1 -1
  152. package/dist/cli/chunks/{chunk-YGEC3PSD.js → chunk-WC47GICZ.js} +2 -2
  153. package/dist/cli/chunks/{chunk-WLOHTLHO.js → chunk-WLIYWBQR.js} +2 -2
  154. package/dist/cli/chunks/{chunk-I5VJ3FBC.js → chunk-WN55MNZ2.js} +2 -2
  155. package/dist/cli/chunks/chunk-WOZIXXY5.js +7 -0
  156. package/dist/cli/chunks/{chunk-X33LID2T.js → chunk-WR64BKUE.js} +1 -1
  157. package/dist/cli/chunks/{chunk-VGN46ZT4.js → chunk-WT3JC4A6.js} +2 -2
  158. package/dist/cli/chunks/{chunk-VOKIUF7I.js → chunk-X52TMBHU.js} +1 -1
  159. package/dist/cli/chunks/{chunk-ZATQLTYL.js → chunk-XIE7OHML.js} +1 -1
  160. package/dist/cli/chunks/{chunk-BO43BGHX.js → chunk-XNEEYXR2.js} +2 -2
  161. package/dist/cli/chunks/{chunk-KCBCYF7M.js → chunk-XNHB6TLC.js} +2 -2
  162. package/dist/cli/chunks/{chunk-VX7CQUO7.js → chunk-XQRE2HWM.js} +2 -2
  163. package/dist/cli/chunks/{chunk-CNQUU6CF.js → chunk-Y2E3IJ53.js} +2 -2
  164. package/dist/cli/chunks/{chunk-2M75CW5Q.js → chunk-Y2WMPEUP.js} +2 -2
  165. package/dist/cli/chunks/{chunk-WTMLRMKW.js → chunk-Y7GPLOXB.js} +2 -2
  166. package/dist/cli/chunks/{chunk-O66D4NEJ.js → chunk-YINFES3E.js} +2 -2
  167. package/dist/cli/chunks/{chunk-CF3BPD2R.js → chunk-ZLBBX24Q.js} +163 -164
  168. package/dist/cli/chunks/{chunk-S7D4GD7H.js → chunk-ZT3GUYM5.js} +2 -2
  169. package/dist/cli/chunks/{chunk-D5V6C3XG.js → chunk-ZTC5FBL6.js} +3 -3
  170. package/dist/cli/chunks/ci-KP4GZKJ7.js +81 -0
  171. package/dist/cli/chunks/ci-config-XDDZOOEI.js +2 -0
  172. package/dist/cli/chunks/{ci-output-DPHTFIGX.js → ci-output-7ZUQI4U6.js} +2 -2
  173. package/dist/cli/chunks/{circuit-breaker-PQ65VU2M.js → circuit-breaker-ALXKCFAL.js} +2 -2
  174. package/dist/cli/chunks/{claude-flow-setup-GKHVO7AD.js → claude-flow-setup-RL7K2NI2.js} +2 -2
  175. package/dist/cli/chunks/client-C3KHVRM6.js +2 -0
  176. package/dist/cli/chunks/{cline-installer-HWMQZJ64.js → cline-installer-2Z2QQKC3.js} +2 -2
  177. package/dist/cli/chunks/{code-OTY7BF3D.js → code-QSZTDINQ.js} +4 -4
  178. package/dist/cli/chunks/{code-index-extractor-FG3TMHHR.js → code-index-extractor-5CGR5D3Y.js} +2 -2
  179. package/dist/cli/chunks/{codex-installer-63JARKKS.js → codex-installer-7JLSEDE5.js} +2 -2
  180. package/dist/cli/chunks/{completions-4ZHONFML.js → completions-U4NBSXEB.js} +2 -2
  181. package/dist/cli/chunks/{complexity-analyzer-FYHTJW5Y.js → complexity-analyzer-WYZD2YSY.js} +2 -2
  182. package/dist/cli/chunks/{continuedev-installer-ZAWDSUR3.js → continuedev-installer-UPXINJFT.js} +2 -2
  183. package/dist/cli/chunks/{copilot-installer-5QK565JX.js → copilot-installer-WIVYQRIF.js} +2 -2
  184. package/dist/cli/chunks/core-handlers-KSQM6Q6S.js +2 -0
  185. package/dist/cli/chunks/{cost-tracker-AWWMPPBJ.js → cost-tracker-RIN4JDDM.js} +2 -2
  186. package/dist/cli/chunks/coverage-SPFVHRRU.js +43 -0
  187. package/dist/cli/chunks/coverage-target-GSRBNHXE.js +2 -0
  188. package/dist/cli/chunks/cross-domain-router-CTGNOVCF.js +2 -0
  189. package/dist/cli/chunks/{cursor-installer-3BL7JACV.js → cursor-installer-POM7NGCC.js} +2 -2
  190. package/dist/cli/chunks/{daemon-R6ULBHHF.js → daemon-HFGKQ6LB.js} +3 -3
  191. package/dist/cli/chunks/{daemon-OJ624POF.js → daemon-M5TD5Y6T.js} +4 -4
  192. package/dist/cli/chunks/{dag-attention-scheduler-J6I3LTMY.js → dag-attention-scheduler-HJXM7Q5P.js} +2 -2
  193. package/dist/cli/chunks/{detect-5Q5W33UR.js → detect-XKQGLZYN.js} +2 -2
  194. package/dist/cli/chunks/{dist-node-GJNW56NA.js → dist-node-SSKB53QL.js} +2 -2
  195. package/dist/cli/chunks/{domain-handler-IZQY2G44.js → domain-handler-6BNDHATU.js} +2 -2
  196. package/dist/cli/chunks/{domain-plugins-PIGO3KI2.js → domain-plugins-DOX54YE3.js} +2 -2
  197. package/dist/cli/chunks/{domain-transfer-NU3B4FQG.js → domain-transfer-FW4ZX3Z7.js} +2 -2
  198. package/dist/cli/chunks/dream-MIK2E4UL.js +2 -0
  199. package/dist/cli/chunks/{embed-and-insert-pattern-5QDDRPWV.js → embed-and-insert-pattern-QST77T2B.js} +2 -2
  200. package/dist/cli/chunks/{eval-TB5HOAUY.js → eval-K7E4XXBS.js} +2 -2
  201. package/dist/cli/chunks/{experience-capture-middleware-SIYVLKDE.js → experience-capture-middleware-X66IYSRV.js} +3 -3
  202. package/dist/cli/chunks/{fast-paths-T7QELS6D.js → fast-paths-5JXXTYAG.js} +2 -2
  203. package/dist/cli/chunks/{feature-flags-TNZ7ZAJV.js → feature-flags-2CR3CO23.js} +2 -2
  204. package/dist/cli/chunks/{feature-flags-T3CNNYMJ.js → feature-flags-RB72LHOJ.js} +2 -2
  205. package/dist/cli/chunks/{file-discovery-M45P2ZCY.js → file-discovery-3NHRUQQB.js} +2 -2
  206. package/dist/cli/chunks/{fleet-DSBZPHBZ.js → fleet-SDU7QEOA.js} +3 -3
  207. package/dist/cli/chunks/{gnn-wrapper-EHODCF32.js → gnn-wrapper-AWCFODUV.js} +2 -2
  208. package/dist/cli/chunks/{heartbeat-handler-V5DBVF7V.js → heartbeat-handler-A4PJ3NFP.js} +4 -4
  209. package/dist/cli/chunks/heartbeat-scheduler-OCKRACUW.js +2 -0
  210. package/dist/cli/chunks/hnsw-adapter-X67XG73C.js +2 -0
  211. package/dist/cli/chunks/hnsw-index-I7KCQBQR.js +2 -0
  212. package/dist/cli/chunks/{hnsw-legacy-bridge-IYKDYA2F.js → hnsw-legacy-bridge-KRS7SSFM.js} +2 -2
  213. package/dist/cli/chunks/{hnswlib-node-DKG4LW3X.js → hnswlib-node-OGGCPKPO.js} +2 -2
  214. package/dist/cli/chunks/{hooks-VKNMAILY.js → hooks-XNRNMUBW.js} +10 -10
  215. package/dist/cli/chunks/hybrid-backend-FOUHTKAK.js +2 -0
  216. package/dist/cli/chunks/{hypergraph-engine-AXZVP7A7.js → hypergraph-engine-X35LTXYT.js} +2 -2
  217. package/dist/cli/chunks/{hypergraph-handler-6EO6JN4Z.js → hypergraph-handler-M6THKAG6.js} +3 -3
  218. package/dist/cli/chunks/impact-analyzer-GXYVX46O.js +2 -0
  219. package/dist/cli/chunks/{init-handler-N3NG3RHN.js → init-handler-2AXMXHYF.js} +6 -6
  220. package/dist/cli/chunks/init-wizard-C2MRX2QG.js +2 -0
  221. package/dist/cli/chunks/kernel-Q2IUDIDC.js +2 -0
  222. package/dist/cli/chunks/{kilocode-installer-JICGAHLM.js → kilocode-installer-TEPR2ZJD.js} +2 -2
  223. package/dist/cli/chunks/{kiro-installer-VYBFP6ZH.js → kiro-installer-RUKHGDEE.js} +2 -2
  224. package/dist/cli/chunks/knowledge-graph-E2Z6K5EE.js +2 -0
  225. package/dist/cli/chunks/{learning-3BHEZEPK.js → learning-BEA26RNA.js} +3 -3
  226. package/dist/cli/chunks/{llm-router-GPTEZCUN.js → llm-router-7GECMDCP.js} +4 -4
  227. package/dist/cli/chunks/llm-router-service-YATYFEDD.js +2 -0
  228. package/dist/cli/chunks/{load-W5BIRPU4.js → load-NTJ4Y4ZR.js} +2 -2
  229. package/dist/cli/chunks/load-test-LV77JXWA.js +2 -0
  230. package/dist/cli/chunks/{mcp-EBV4DZPG.js → mcp-4335GTTG.js} +2 -2
  231. package/dist/cli/chunks/{memory-7F6YYKNL.js → memory-HYC4M4XS.js} +5 -5
  232. package/dist/cli/chunks/memory-backend-XME3X3QX.js +2 -0
  233. package/dist/cli/chunks/memory-handlers-VG47X5DX.js +2 -0
  234. package/dist/cli/chunks/{multi-model-executor-3ZIA2YOL.js → multi-model-executor-T7FYKM6T.js} +2 -2
  235. package/dist/cli/chunks/{opencode-installer-2XRZUTLR.js → opencode-installer-3USXVT5M.js} +2 -2
  236. package/dist/cli/chunks/{orchestrator-VSZVJUJW.js → orchestrator-VHUXUYIM.js} +5 -5
  237. package/dist/cli/chunks/pattern-null-store-TAXMLENP.js +2 -0
  238. package/dist/cli/chunks/{pattern-usage-recorder-I2IGVHRL.js → pattern-usage-recorder-CMZLPX2K.js} +2 -2
  239. package/dist/cli/chunks/{pipeline-5G3O6WBY.js → pipeline-BTRZOVSL.js} +2 -2
  240. package/dist/cli/chunks/{platform-6GUFDIA3.js → platform-2MCRKC25.js} +2 -2
  241. package/dist/cli/chunks/{plugin-GYXE4CIC.js → plugin-2VAYWAO3.js} +2 -2
  242. package/dist/cli/chunks/{prime-radiant-advanced-wasm-THX6JLGZ.js → prime-radiant-advanced-wasm-TXFEMBP6.js} +2 -2
  243. package/dist/cli/chunks/{project-root-QJRBKZQU.js → project-root-CFFPBGPX.js} +2 -2
  244. package/dist/cli/chunks/protocol-executor-ML76QAVQ.js +2 -0
  245. package/dist/cli/chunks/{protocol-handler-B54LRU26.js → protocol-handler-DZ26OYVZ.js} +2 -2
  246. package/dist/cli/chunks/{prove-PCY2WQOD.js → prove-QWONEJWX.js} +2 -2
  247. package/dist/cli/chunks/qe-reasoning-bank-LUZH6RYV.js +2 -0
  248. package/dist/cli/chunks/quality-WFH54FY7.js +8 -0
  249. package/dist/cli/chunks/{quality-gate-L3KXL6WE.js → quality-gate-ONJB7XU7.js} +3 -3
  250. package/dist/cli/chunks/queen-coordinator-EWXNIXB6.js +2 -0
  251. package/dist/cli/chunks/{real-embeddings-N3H523PJ.js → real-embeddings-GZV4VKK4.js} +2 -2
  252. package/dist/cli/chunks/{ref-validation-6BKDPHZ7.js → ref-validation-HW5Y55ZC.js} +2 -2
  253. package/dist/cli/chunks/{roocode-installer-NSGGTWXE.js → roocode-installer-5OABDNZT.js} +2 -2
  254. package/dist/cli/chunks/router-MXOBVEBF.js +2 -0
  255. package/dist/cli/chunks/routing-feedback-T6CCRUEK.js +2 -0
  256. package/dist/cli/chunks/{routing-handler-SRQNUBG3.js → routing-handler-CVHVOQTC.js} +2 -2
  257. package/dist/cli/chunks/{ruvector-commands-2IGULGDE.js → ruvector-commands-KKDKFGIQ.js} +2 -2
  258. package/dist/cli/chunks/rvf-dual-writer-WHXVT3V3.js +2 -0
  259. package/dist/cli/chunks/rvf-migration-adapter-JFPWIRCG.js +2 -0
  260. package/dist/cli/chunks/{rvf-migration-coordinator-ZD6WK5CK.js → rvf-migration-coordinator-D4KUBNRZ.js} +2 -2
  261. package/dist/cli/chunks/rvf-native-adapter-KOXR7TJL.js +2 -0
  262. package/dist/cli/chunks/{rvf-store-integrity-QULKUBBI.js → rvf-store-integrity-UGUXKIFX.js} +2 -2
  263. package/dist/cli/chunks/safe-db-CI6IPSIN.js +2 -0
  264. package/dist/cli/chunks/schedule-X4HW6TVJ.js +2 -0
  265. package/dist/cli/chunks/scheduler-KCNJ2ON3.js +2 -0
  266. package/dist/cli/chunks/{security-JW4EBARW.js → security-7723AZZ4.js} +3 -3
  267. package/dist/cli/chunks/{shared-rvf-adapter-VQ7NJTGY.js → shared-rvf-adapter-KEQ5CLNI.js} +2 -2
  268. package/dist/cli/chunks/{shared-rvf-dual-writer-SKTS52HK.js → shared-rvf-dual-writer-ZSHYG5IA.js} +2 -2
  269. package/dist/cli/chunks/sqlite-persistence-PGHU6VUR.js +2 -0
  270. package/dist/cli/chunks/{standalone-memory-3N4YJCSY.js → standalone-memory-MHZEEYMK.js} +2 -2
  271. package/dist/cli/chunks/{status-handler-5BQ2IIDG.js → status-handler-JKXPJ22K.js} +2 -2
  272. package/dist/cli/chunks/{structural-health-WGYR2RJB.js → structural-health-J4RKCYWF.js} +2 -2
  273. package/dist/cli/chunks/{sync-R5OKUBTQ.js → sync-EFWXMA2H.js} +2 -2
  274. package/dist/cli/chunks/{sync-DLKSXTIR.js → sync-PDPORHVN.js} +2 -2
  275. package/dist/cli/chunks/{task-handler-Z5KNTSUX.js → task-handler-VERADM44.js} +2 -2
  276. package/dist/cli/chunks/{task-handlers-RZFMYFSC.js → task-handlers-4RUCWUR2.js} +3 -3
  277. package/dist/cli/chunks/{test-LHWKZJRN.js → test-DMBJFQNL.js} +4 -4
  278. package/dist/cli/chunks/{test-scheduling-EN7WXUMS.js → test-scheduling-LUPTVGCD.js} +3 -3
  279. package/dist/cli/chunks/{token-bootstrap-4V3OO4EC.js → token-bootstrap-S346YBVO.js} +2 -2
  280. package/dist/cli/chunks/{token-usage-PFC2BYBS.js → token-usage-VOA34IKM.js} +2 -2
  281. package/dist/cli/chunks/{transformers-VZCC4SHC.js → transformers-GU4TYAN5.js} +2 -2
  282. package/dist/cli/chunks/{tree-sitter-wasm-parser-ZYDQXGKN.js → tree-sitter-wasm-parser-MZPXAH7C.js} +2 -2
  283. package/dist/cli/chunks/{types-I6AWHZZQ.js → types-K4FLXR2K.js} +2 -2
  284. package/dist/cli/chunks/unified-memory-6CK3TUNQ.js +2 -0
  285. package/dist/cli/chunks/unified-memory-hnsw-A7BWBGYN.js +2 -0
  286. package/dist/cli/chunks/unified-persistence-GEPMDBQZ.js +2 -0
  287. package/dist/cli/chunks/{upgrade-T7SG75PA.js → upgrade-M3ATDRMK.js} +2 -2
  288. package/dist/cli/chunks/{validate-YLYEHTY3.js → validate-AAP773B3.js} +2 -2
  289. package/dist/cli/chunks/{validate-swarm-VTLTRUE3.js → validate-swarm-7RGAZX5F.js} +2 -2
  290. package/dist/cli/chunks/visual-security-L4J7LQWT.js +2 -0
  291. package/dist/cli/chunks/{web-tree-sitter-JUM7ZY5M.js → web-tree-sitter-GQMRHGGI.js} +2 -2
  292. package/dist/cli/chunks/{windsurf-installer-4KS2466T.js → windsurf-installer-HG6HF2GF.js} +2 -2
  293. package/dist/cli/chunks/witness-chain-CDUMX623.js +2 -0
  294. package/dist/cli/chunks/{witness-chain-E4X6TOCT.js → witness-chain-WKU3ZIBQ.js} +2 -2
  295. package/dist/cli/chunks/{witness-chain-repair-MB53OZO6.js → witness-chain-repair-WNYH6O4L.js} +2 -2
  296. package/dist/cli/chunks/{witness-chain-verifier-LBWJHO7Y.js → witness-chain-verifier-Q2KW3QEQ.js} +2 -2
  297. package/dist/cli/chunks/{witness-key-manager-5IHVMXHJ.js → witness-key-manager-NQ5DAAC4.js} +2 -2
  298. package/dist/cli/chunks/{workflow-XUQXIRNE.js → workflow-CX6SHFBW.js} +5 -5
  299. package/dist/cli/chunks/workflow-orchestrator-USJDWVDR.js +2 -0
  300. package/dist/cli/chunks/{wrappers-YVF5SQUN.js → wrappers-CZDI6Z3X.js} +2 -2
  301. package/dist/cli/commands/ci.js +14 -6
  302. package/dist/cli/commands/code.js +1 -0
  303. package/dist/cli/commands/coverage.d.ts +28 -0
  304. package/dist/cli/commands/coverage.js +258 -143
  305. package/dist/cli/commands/quality.d.ts +12 -1
  306. package/dist/cli/commands/quality.js +51 -3
  307. package/dist/cli/commands/workflow.js +3 -0
  308. package/dist/cli/scheduler/persistent-scheduler.d.ts +2 -0
  309. package/dist/cli/scheduler/persistent-scheduler.js +12 -2
  310. package/dist/cli/utils/ci-output.d.ts +14 -4
  311. package/dist/cli/utils/ci-output.js +21 -4
  312. package/dist/cli/utils/coverage-data.d.ts +7 -0
  313. package/dist/cli/utils/coverage-data.js +21 -27
  314. package/dist/contracts/verdicts.d.ts +14 -0
  315. package/dist/contracts/verdicts.js +44 -3
  316. package/dist/coordination/handlers/coverage-handlers.js +121 -120
  317. package/dist/coordination/handlers/coverage-runner.d.ts +121 -0
  318. package/dist/coordination/handlers/coverage-runner.js +367 -0
  319. package/dist/coordination/handlers/coverage-target.d.ts +144 -0
  320. package/dist/coordination/handlers/coverage-target.js +311 -0
  321. package/dist/coordination/handlers/handler-utils.d.ts +9 -0
  322. package/dist/coordination/handlers/handler-utils.js +44 -1
  323. package/dist/coordination/handlers/quality-handlers.js +101 -15
  324. package/dist/coordination/result-saver.js +17 -3
  325. package/dist/coordination/task-executor.d.ts +5 -0
  326. package/dist/coordination/task-executor.js +7 -0
  327. package/dist/domains/code-intelligence/coordinator.d.ts +2 -1
  328. package/dist/domains/code-intelligence/coordinator.js +10 -32
  329. package/dist/domains/code-intelligence/interfaces.d.ts +5 -0
  330. package/dist/domains/code-intelligence/plugin.js +1 -0
  331. package/dist/domains/code-intelligence/project-root-resolver.d.ts +50 -0
  332. package/dist/domains/code-intelligence/project-root-resolver.js +121 -0
  333. package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.d.ts +3 -0
  334. package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.js +57 -0
  335. package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +124 -36
  336. package/dist/domains/coverage-analysis/coordinator.js +4 -1
  337. package/dist/domains/coverage-analysis/interfaces.d.ts +15 -0
  338. package/dist/domains/coverage-analysis/plugin.js +7 -1
  339. package/dist/domains/coverage-analysis/services/coverage-analyzer.d.ts +7 -0
  340. package/dist/domains/coverage-analysis/services/coverage-analyzer.js +29 -9
  341. package/dist/domains/quality-assessment/coordinator-claim-verifier.js +2 -1
  342. package/dist/domains/quality-assessment/coordinator.js +8 -8
  343. package/dist/domains/quality-assessment/coverage-report-event.d.ts +25 -0
  344. package/dist/domains/quality-assessment/coverage-report-event.js +36 -0
  345. package/dist/domains/quality-assessment/evidence-sufficiency.d.ts +57 -0
  346. package/dist/domains/quality-assessment/evidence-sufficiency.js +97 -0
  347. package/dist/domains/quality-assessment/index.d.ts +1 -1
  348. package/dist/domains/quality-assessment/index.js +1 -1
  349. package/dist/domains/quality-assessment/plugin.js +8 -8
  350. package/dist/domains/quality-assessment/quality-evidence.d.ts +50 -2
  351. package/dist/domains/quality-assessment/quality-evidence.js +90 -8
  352. package/dist/domains/quality-assessment/services/quality-analyzer.js +13 -9
  353. package/dist/mcp/bundle.js +457 -453
  354. package/dist/mcp/handlers/domain-handler-configs.d.ts +60 -1
  355. package/dist/mcp/handlers/domain-handler-configs.js +42 -4
  356. package/dist/mcp/handlers/handler-factory.js +3 -0
  357. package/dist/mcp/handlers/wrapped-domain-handlers.js +7 -1
  358. package/dist/mcp/protocol-server.js +3 -2
  359. package/dist/mcp/services/session-store.js +11 -1
  360. package/dist/mcp/tools/coverage-analysis/index.js +1 -0
  361. package/dist/mcp/types.d.ts +24 -0
  362. package/dist/memory/crdt/convergence-tracker.js +14 -24
  363. package/dist/memory/crdt/crdt-store.js +15 -0
  364. package/dist/memory/crdt/lww-register.js +3 -3
  365. package/dist/memory/crdt/or-set.js +18 -0
  366. package/dist/planning/goap-planner.js +18 -10
  367. package/dist/shared/embeddings/embedding-cache.d.ts +3 -3
  368. package/dist/shared/embeddings/embedding-cache.js +8 -8
  369. package/dist/shared/embeddings/nomic-embedder.js +9 -6
  370. package/dist/shared/events/domain-events.d.ts +2 -0
  371. package/dist/shared/llm/cache.js +1 -1
  372. package/package.json +1 -1
  373. package/dist/cli/chunks/adapter-WQSFQES5.js +0 -2
  374. package/dist/cli/chunks/aqe-learning-engine-TDHBBADE.js +0 -2
  375. package/dist/cli/chunks/base-CZSB27VO.js +0 -2
  376. package/dist/cli/chunks/browser-workflow-AEMIS6PA.js +0 -2
  377. package/dist/cli/chunks/chunk-7IJVCDDC.js +0 -96
  378. package/dist/cli/chunks/chunk-INVDDFJC.js +0 -2
  379. package/dist/cli/chunks/chunk-K65X6CQA.js +0 -4
  380. package/dist/cli/chunks/chunk-MZDUBFLP.js +0 -2
  381. package/dist/cli/chunks/chunk-QDQLL2QB.js +0 -3
  382. package/dist/cli/chunks/chunk-QZBFMXO5.js +0 -742
  383. package/dist/cli/chunks/ci-JPISJ25U.js +0 -82
  384. package/dist/cli/chunks/client-BS7I637W.js +0 -2
  385. package/dist/cli/chunks/core-handlers-UG7RMTK5.js +0 -2
  386. package/dist/cli/chunks/coverage-SMFQEGKE.js +0 -27
  387. package/dist/cli/chunks/cross-domain-router-NX7F6TOF.js +0 -2
  388. package/dist/cli/chunks/dream-GYEH57FW.js +0 -2
  389. package/dist/cli/chunks/heartbeat-scheduler-4TJ3T7LR.js +0 -2
  390. package/dist/cli/chunks/hnsw-adapter-PHFK4EAP.js +0 -2
  391. package/dist/cli/chunks/hnsw-index-434XDDBH.js +0 -2
  392. package/dist/cli/chunks/hybrid-backend-DYVJQENQ.js +0 -2
  393. package/dist/cli/chunks/impact-analyzer-CBAST6M2.js +0 -2
  394. package/dist/cli/chunks/init-wizard-DWIJW7HY.js +0 -2
  395. package/dist/cli/chunks/kernel-AQGCS4X2.js +0 -2
  396. package/dist/cli/chunks/knowledge-graph-2ICXFUUV.js +0 -2
  397. package/dist/cli/chunks/llm-router-service-C47RGTH6.js +0 -2
  398. package/dist/cli/chunks/load-test-LRDAW3N6.js +0 -2
  399. package/dist/cli/chunks/memory-backend-UFBAYPQ6.js +0 -2
  400. package/dist/cli/chunks/memory-handlers-OGLJHAAJ.js +0 -2
  401. package/dist/cli/chunks/pattern-null-store-27FCITT3.js +0 -2
  402. package/dist/cli/chunks/protocol-executor-XWXXTMEW.js +0 -2
  403. package/dist/cli/chunks/qe-reasoning-bank-3RMYXENE.js +0 -2
  404. package/dist/cli/chunks/quality-LPVDZC7U.js +0 -7
  405. package/dist/cli/chunks/queen-coordinator-AS6DZ7UJ.js +0 -2
  406. package/dist/cli/chunks/router-OVNLNGHO.js +0 -2
  407. package/dist/cli/chunks/routing-feedback-TBOWEB6H.js +0 -2
  408. package/dist/cli/chunks/rvf-dual-writer-YJYRCYGT.js +0 -2
  409. package/dist/cli/chunks/rvf-migration-adapter-VMRQ2SFO.js +0 -2
  410. package/dist/cli/chunks/rvf-native-adapter-B75L3ALW.js +0 -2
  411. package/dist/cli/chunks/safe-db-CRQHMCV6.js +0 -2
  412. package/dist/cli/chunks/schedule-L3DKJRXU.js +0 -2
  413. package/dist/cli/chunks/scheduler-VRHYUGY5.js +0 -2
  414. package/dist/cli/chunks/sqlite-persistence-JVAZETTL.js +0 -2
  415. package/dist/cli/chunks/unified-memory-WOOCCIUM.js +0 -2
  416. package/dist/cli/chunks/unified-memory-hnsw-PDDHFLUB.js +0 -2
  417. package/dist/cli/chunks/unified-persistence-6ETD3JSC.js +0 -2
  418. package/dist/cli/chunks/visual-security-O4OT2YPY.js +0 -2
  419. package/dist/cli/chunks/witness-chain-67JHPDCN.js +0 -2
  420. package/dist/cli/chunks/workflow-orchestrator-ZVFSNRYZ.js +0 -2
@@ -11,7 +11,8 @@ import { TestGenerateParams, TestGenerateResult, TestExecuteParams, CoverageAnal
11
11
  import type { SecurityScanEvidence } from '../../domains/security-compliance/scan-evidence.js';
12
12
  import type { SecurityCoverage } from '../../domains/security-compliance/interfaces.js';
13
13
  import { type RiskDecision } from '../../contracts/verdicts.js';
14
- import type { EvaluatedQualityCheck } from '../../domains/quality-assessment/quality-evidence.js';
14
+ import { type EvaluatedQualityCheck } from '../../domains/quality-assessment/quality-evidence.js';
15
+ import { type MeasuredFailure } from '../../domains/quality-assessment/evidence-sufficiency.js';
15
16
  export interface TestExecuteResult {
16
17
  taskId: string;
17
18
  status: string;
@@ -26,6 +27,10 @@ export interface TestExecuteResult {
26
27
  summary?: Record<string, unknown>;
27
28
  learning?: Record<string, unknown>;
28
29
  savedFiles?: string[];
30
+ /** #933: true when result files were written; see savedFiles for their paths. */
31
+ resultsSaved?: boolean;
32
+ /** #933: plain statement of what was (or was not) written to disk. */
33
+ resultsNote?: string;
29
34
  }
30
35
  export interface QualityAssessResult {
31
36
  taskId: string;
@@ -39,8 +44,28 @@ export interface QualityAssessResult {
39
44
  recommendations: string[];
40
45
  duration: number;
41
46
  savedFiles?: string[];
47
+ /** #933: true when result files were written; see savedFiles for their paths. */
48
+ resultsSaved?: boolean;
49
+ /** #933: plain statement of what was (or was not) written to disk. */
50
+ resultsNote?: string;
42
51
  /** ADR-103: versioned, schema-validated gate verdict (additive) */
43
52
  riskDecision?: RiskDecision;
53
+ /**
54
+ * #996 (additive): 'measured' when every requested metric had data;
55
+ * 'insufficient-evidence' when any did not — `passed` is then false and
56
+ * `status` is 'insufficient-evidence'.
57
+ */
58
+ evidenceStatus?: 'measured' | 'insufficient-evidence';
59
+ /** #996: requested metrics with no measured data (reported as -1 in `metrics`). */
60
+ unmeasured?: string[];
61
+ /** #996: measured metrics that fail their own limit; any entry blocks. */
62
+ measuredFailures?: MeasuredFailure[];
63
+ /** #996: false for static analysis (runGate omitted/false) — no quality gate ran. */
64
+ gateEvaluated?: boolean;
65
+ /** #996: share of requested metrics that were measured, in [0, 1]. */
66
+ confidence?: number;
67
+ /** #996: plain statement of what was (and was not) evaluated. */
68
+ note?: string;
44
69
  }
45
70
  export interface SecurityScanResult {
46
71
  taskId: string;
@@ -55,6 +80,10 @@ export interface SecurityScanResult {
55
80
  recommendations: string[];
56
81
  duration: number;
57
82
  savedFiles?: string[];
83
+ /** #933: true when result files were written; see savedFiles for their paths. */
84
+ resultsSaved?: boolean;
85
+ /** #933: plain statement of what was (or was not) written to disk. */
86
+ resultsNote?: string;
58
87
  informational?: number;
59
88
  evidence?: SecurityScanEvidence;
60
89
  limitations?: readonly string[];
@@ -78,6 +107,10 @@ export interface ContractValidateResult {
78
107
  warnings: string[];
79
108
  duration: number;
80
109
  savedFiles?: string[];
110
+ /** #933: true when result files were written; see savedFiles for their paths. */
111
+ resultsSaved?: boolean;
112
+ /** #933: plain statement of what was (or was not) written to disk. */
113
+ resultsNote?: string;
81
114
  }
82
115
  export interface AccessibilityTestResult {
83
116
  taskId: string;
@@ -88,6 +121,10 @@ export interface AccessibilityTestResult {
88
121
  warnings: unknown[];
89
122
  duration: number;
90
123
  savedFiles?: string[];
124
+ /** #933: true when result files were written; see savedFiles for their paths. */
125
+ resultsSaved?: boolean;
126
+ /** #933: plain statement of what was (or was not) written to disk. */
127
+ resultsNote?: string;
91
128
  }
92
129
  export interface ChaosTestResult {
93
130
  taskId: string;
@@ -100,11 +137,17 @@ export interface ChaosTestResult {
100
137
  };
101
138
  duration: number;
102
139
  savedFiles?: string[];
140
+ /** #933: true when result files were written; see savedFiles for their paths. */
141
+ resultsSaved?: boolean;
142
+ /** #933: plain statement of what was (or was not) written to disk. */
143
+ resultsNote?: string;
103
144
  }
104
145
  export interface DefectPredictParams {
105
146
  target?: string;
106
147
  lookback?: number;
107
148
  minConfidence?: number;
149
+ /** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
150
+ saveResults?: boolean;
108
151
  }
109
152
  export interface DefectPredictResult {
110
153
  taskId: string;
@@ -118,11 +161,17 @@ export interface DefectPredictResult {
118
161
  recommendations: string[];
119
162
  duration: number;
120
163
  savedFiles?: string[];
164
+ /** #933: true when result files were written; see savedFiles for their paths. */
165
+ resultsSaved?: boolean;
166
+ /** #933: plain statement of what was (or was not) written to disk. */
167
+ resultsNote?: string;
121
168
  }
122
169
  export interface RequirementsValidateParams {
123
170
  requirementsPath?: string;
124
171
  testPath?: string;
125
172
  generateBDD?: boolean;
173
+ /** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
174
+ saveResults?: boolean;
126
175
  }
127
176
  export interface RequirementsValidateResult {
128
177
  taskId: string;
@@ -133,11 +182,17 @@ export interface RequirementsValidateResult {
133
182
  bddScenarios: string[];
134
183
  duration: number;
135
184
  savedFiles?: string[];
185
+ /** #933: true when result files were written; see savedFiles for their paths. */
186
+ resultsSaved?: boolean;
187
+ /** #933: plain statement of what was (or was not) written to disk. */
188
+ resultsNote?: string;
136
189
  }
137
190
  export interface CodeIndexParams {
138
191
  target?: string;
139
192
  incremental?: boolean;
140
193
  gitSince?: string;
194
+ /** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
195
+ saveResults?: boolean;
141
196
  }
142
197
  export interface CodeIndexResult {
143
198
  taskId: string;
@@ -147,6 +202,10 @@ export interface CodeIndexResult {
147
202
  relationsFound: number;
148
203
  duration: number;
149
204
  savedFiles?: string[];
205
+ /** #933: true when result files were written; see savedFiles for their paths. */
206
+ resultsSaved?: boolean;
207
+ /** #933: plain statement of what was (or was not) written to disk. */
208
+ resultsNote?: string;
150
209
  }
151
210
  export declare const testGenerateConfig: DomainHandlerConfig<TestGenerateParams, TestGenerateResult>;
152
211
  export declare const testExecuteConfig: DomainHandlerConfig<TestExecuteParams, TestExecuteResult>;
@@ -11,6 +11,8 @@ import { describeSavedResults } from './save-results-option.js';
11
11
  import { MetricsCollector } from '../metrics/index.js';
12
12
  import { DEFAULT_FRAMEWORKS, FRAMEWORK_TO_LANGUAGE, } from '../../shared/types/test-frameworks.js';
13
13
  import { buildRiskDecisionFromQualityGate, validateRiskDecision, } from '../../contracts/verdicts.js';
14
+ import { INSUFFICIENT_EVIDENCE, } from '../../domains/quality-assessment/quality-evidence.js';
15
+ import { validateRequestedMetrics, } from '../../domains/quality-assessment/evidence-sufficiency.js';
14
16
  import { validateBehaviorExamples } from '../../domains/test-generation/services/behavior-example-validation.js';
15
17
  const SUPPORTED_LANGUAGES = Object.keys(DEFAULT_FRAMEWORKS);
16
18
  /**
@@ -403,6 +405,8 @@ export const coverageAnalyzeConfig = {
403
405
  coverageMethod: data.coverageMethod ?? 'unknown',
404
406
  branchDataCollected,
405
407
  functionDataCollected,
408
+ // #995: the target has no measurement at all — distinct from a measured 0%.
409
+ ...(data.unmeasured === true ? { unmeasured: true } : {}),
406
410
  ...(data.warning ? { warning: data.warning } : {}),
407
411
  };
408
412
  },
@@ -420,32 +424,66 @@ export const qualityAssessConfig = {
420
424
  if (params.runGate !== undefined && typeof params.runGate !== 'boolean') {
421
425
  throw new Error('runGate must be a boolean.');
422
426
  }
427
+ // #996 (N3): a string or unknown name is a caller error, not a metric list.
428
+ const metrics = params.metrics === undefined
429
+ ? ['coverage', 'complexity', 'maintainability']
430
+ : validateRequestedMetrics(params.metrics);
423
431
  return {
424
432
  runGate: params.runGate ?? false,
425
433
  threshold: params.threshold || 80,
426
- metrics: params.metrics || ['coverage', 'complexity', 'maintainability'],
434
+ // #996: only a caller-supplied threshold overrides the configured/default
435
+ // per-metric limits; the 80 fallback above must not.
436
+ thresholdSource: params.threshold === undefined ? 'default' : 'request',
437
+ metrics,
427
438
  routingTier: routingResult?.decision.tier,
428
439
  useAgentBooster: routingResult?.useAgentBooster,
429
440
  compiledContext: routingResult?.compiledContext,
430
441
  };
431
442
  },
432
443
  mapToResult: (taskId, data, duration, savedFiles) => {
444
+ // #996: never approve on missing data. Any unmeasured requested metric
445
+ // forces passed=false and an explicit insufficient-evidence status.
446
+ const unmeasured = Array.isArray(data.unmeasured)
447
+ ? data.unmeasured.filter((m) => typeof m === 'string')
448
+ : undefined;
449
+ const insufficient = (unmeasured?.length ?? 0) > 0 || data.evidenceStatus === INSUFFICIENT_EVIDENCE;
450
+ const gateEvaluated = typeof data.gateEvaluated === 'boolean' ? data.gateEvaluated : undefined;
451
+ const confidence = typeof data.confidence === 'number' ? data.confidence : undefined;
452
+ const measuredFailures = Array.isArray(data.measuredFailures)
453
+ ? data.measuredFailures
454
+ : undefined;
455
+ const failedMetrics = (measuredFailures ?? []).map((f) => f.metric);
456
+ const passed = !insufficient && failedMetrics.length === 0 && data.passed === true;
433
457
  // ADR-103: attach a schema-validated RiskDecision envelope at the MCP
434
458
  // boundary (additive — existing fields unchanged). Omit rather than
435
459
  // emit an invalid envelope.
436
460
  const riskDecision = buildRiskDecisionFromQualityGate({
437
- passed: typeof data.passed === 'boolean' ? data.passed : undefined,
461
+ passed: insufficient || failedMetrics.length > 0
462
+ ? false
463
+ : typeof data.passed === 'boolean' ? data.passed : undefined,
438
464
  qualityScore: data.qualityScore,
439
465
  recommendations: data.recommendations || [],
466
+ unmeasured: insufficient ? (unmeasured?.length ? unmeasured : ['unknown']) : [],
467
+ failedMetrics,
468
+ evidenceConfidence: confidence,
469
+ gateEvaluated,
440
470
  });
441
471
  return {
442
472
  taskId,
443
- status: 'completed',
473
+ status: insufficient ? INSUFFICIENT_EVIDENCE : 'completed',
444
474
  ...(typeof data.qualityScore === 'number' ? { qualityScore: data.qualityScore } : {}),
445
475
  ...(Array.isArray(data.checks) ? { checks: data.checks } : {}),
446
- passed: data.passed || false,
476
+ passed,
447
477
  metrics: data.metrics || {},
448
478
  recommendations: data.recommendations || [],
479
+ ...(data.evidenceStatus === 'measured' || insufficient
480
+ ? { evidenceStatus: insufficient ? INSUFFICIENT_EVIDENCE : 'measured' }
481
+ : {}),
482
+ ...(unmeasured ? { unmeasured } : {}),
483
+ ...(measuredFailures ? { measuredFailures } : {}),
484
+ ...(gateEvaluated !== undefined ? { gateEvaluated } : {}),
485
+ ...(confidence !== undefined ? { confidence } : {}),
486
+ ...(typeof data.note === 'string' ? { note: data.note } : {}),
449
487
  duration,
450
488
  savedFiles,
451
489
  ...(validateRiskDecision(riskDecision).valid ? { riskDecision } : {}),
@@ -636,6 +636,9 @@ export function createDomainHandler(config) {
636
636
  return {
637
637
  success: false,
638
638
  error: result.error || 'Task execution failed',
639
+ // #996: structured failure context (e.g. status + unmeasured metrics),
640
+ // only when the failing handler provided it. success stays false.
641
+ ...(result.errorDetails ? { data: result.errorDetails } : {}),
639
642
  };
640
643
  }
641
644
  // Step 5: Map result
@@ -53,7 +53,13 @@ function createWrappedHandler(handler, domain, agent) {
53
53
  if (result.success) {
54
54
  return { success: true, data: result.data };
55
55
  }
56
- return { success: false, error: result.error || 'Unknown error' };
56
+ // #996: keep structured failure context (e.g. insufficient-evidence details)
57
+ // when the domain handler provided it; success stays false.
58
+ return {
59
+ success: false,
60
+ error: result.error || 'Unknown error',
61
+ ...(result.data !== undefined ? { data: result.data } : {}),
62
+ };
57
63
  };
58
64
  }
59
65
  // ============================================================================
@@ -899,11 +899,12 @@ export class MCPProtocolServer {
899
899
  this.registerTool({
900
900
  definition: {
901
901
  name: 'quality_assess',
902
- description: `Assess code quality metrics and optionally run a pass/fail quality gate. ${SAVE_RESULTS_HINT} Example: quality_assess({ runGate: true })`,
902
+ description: `Assess code quality metrics and optionally run a pass/fail quality gate. Unmeasured metrics never pass. ${SAVE_RESULTS_HINT} Example: quality_assess({ runGate: true })`,
903
903
  category: 'domain',
904
904
  isConcurrencySafe: true,
905
905
  parameters: [
906
- { name: 'runGate', type: 'boolean', description: 'Evaluate all seven canonical measured quality checks; requires complete, valid evidence from the last 24 hours. Returns individual checks, not a static aggregate score.', default: false },
906
+ { name: 'runGate', type: 'boolean', description: 'Evaluate all seven canonical measured quality checks; requires complete, valid evidence from the last 24 hours. Returns individual checks, not a static aggregate score. Missing, stale or malformed evidence fails with status "insufficient-evidence" and lists the metrics in unmeasured. When false, only static analysis runs (gateEvaluated: false).', default: false },
907
+ { name: 'metrics', type: 'array', description: 'Static-analysis metrics to assess (default coverage, complexity, maintainability). Known: coverage, complexity, maintainability, duplication, testability, security. Any requested metric without measured data gives status "insufficient-evidence", passed: false, and lists it in unmeasured; a measured metric failing its threshold blocks.', items: { type: 'string' } },
907
908
  saveResultsParameter('quality_assess'),
908
909
  ],
909
910
  },
@@ -235,7 +235,17 @@ export class SessionStore {
235
235
  if (this.flushTimer === null) {
236
236
  this.flushTimer = setTimeout(() => {
237
237
  this.flushTimer = null;
238
- this.flush();
238
+ try {
239
+ this.flush();
240
+ }
241
+ catch {
242
+ // #983: a throw here has no caller and reaches 'uncaughtException',
243
+ // which the MCP entry logs as "[AQE] FATAL" on every tick while the
244
+ // disk stays full. The unwritten entries stay buffered for the next
245
+ // append or flush(), and the buffer's one-time WARN reports a
246
+ // persistent failure once it reaches its cap. An explicit flush() or
247
+ // close() still throws to its caller.
248
+ }
239
249
  }, BATCH_FLUSH_MS);
240
250
  }
241
251
  }
@@ -143,6 +143,7 @@ export class CoverageAnalyzeTool extends MCPToolBase {
143
143
  coverageData: { files: domainFiles, summary: calculateSummary(domainFiles) },
144
144
  threshold: thresholds.lines || 80,
145
145
  includeFileDetails: true,
146
+ measured: true, // parsed from a real report (no estimation fallback here)
146
147
  });
147
148
  if (!analyzeResult.success) {
148
149
  return {
@@ -199,6 +199,8 @@ export interface TestExecuteParams {
199
199
  timeout?: number;
200
200
  collectCoverage?: boolean;
201
201
  reportFormat?: 'json' | 'junit' | 'html' | 'markdown';
202
+ /** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
203
+ saveResults?: boolean;
202
204
  }
203
205
  /**
204
206
  * Coverage analysis parameters
@@ -209,6 +211,8 @@ export interface CoverageAnalyzeParams {
209
211
  detectGaps?: boolean;
210
212
  mlPowered?: boolean;
211
213
  prioritization?: 'complexity' | 'criticality' | 'change-frequency' | 'ml-confidence';
214
+ /** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
215
+ saveResults?: boolean;
212
216
  }
213
217
  /**
214
218
  * Quality assessment parameters
@@ -217,6 +221,8 @@ export interface QualityAssessParams {
217
221
  runGate?: boolean;
218
222
  threshold?: number;
219
223
  metrics?: string[];
224
+ /** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
225
+ saveResults?: boolean;
220
226
  }
221
227
  /**
222
228
  * Security scan parameters
@@ -228,6 +234,8 @@ export interface SecurityScanParams {
228
234
  target?: string;
229
235
  /** URL for explicitly requested dynamic scanning. */
230
236
  targetUrl?: string;
237
+ /** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
238
+ saveResults?: boolean;
231
239
  }
232
240
  /**
233
241
  * Contract validation parameters
@@ -237,6 +245,8 @@ export interface ContractValidateParams {
237
245
  providerUrl?: string;
238
246
  consumerName?: string;
239
247
  checkBreakingChanges?: boolean;
248
+ /** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
249
+ saveResults?: boolean;
240
250
  }
241
251
  /**
242
252
  * Accessibility test parameters
@@ -245,6 +255,8 @@ export interface AccessibilityTestParams {
245
255
  url?: string;
246
256
  standard?: 'wcag21-aa' | 'wcag21-aaa' | 'wcag22-aa' | 'section508';
247
257
  includeScreenReader?: boolean;
258
+ /** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
259
+ saveResults?: boolean;
248
260
  }
249
261
  /**
250
262
  * Chaos test parameters
@@ -255,6 +267,8 @@ export interface ChaosTestParams {
255
267
  duration?: number;
256
268
  intensity?: number;
257
269
  dryRun?: boolean;
270
+ /** #933: write result files under .agentic-qe/results/ (default true). false skips them. */
271
+ saveResults?: boolean;
258
272
  }
259
273
  /**
260
274
  * Protocol execute parameters
@@ -528,6 +542,10 @@ export interface CoverageAnalyzeResult {
528
542
  gaps?: CoverageGap[];
529
543
  riskScore?: number;
530
544
  savedFiles?: string[];
545
+ /** #933: true when result files were written; see savedFiles for their paths. */
546
+ resultsSaved?: boolean;
547
+ /** #933: plain statement of what was (or was not) written to disk. */
548
+ resultsNote?: string;
531
549
  /** #569: `null` when no figure was produced — see `lineCoverage`. */
532
550
  statementCoverage?: number | null;
533
551
  totalFiles?: number;
@@ -550,6 +568,12 @@ export interface CoverageAnalyzeResult {
550
568
  branchDataCollected?: boolean;
551
569
  /** Whether function-level data was actually collected. */
552
570
  functionDataCollected?: boolean;
571
+ /**
572
+ * #995: true when coverage data exists for the project but none of it covers
573
+ * the requested target (or the run executed no code). The figures are null —
574
+ * this is "no measurement", never 0%.
575
+ */
576
+ unmeasured?: boolean;
553
577
  /** Caveats the caller should surface (e.g. "no instrumentation ran"). */
554
578
  warning?: string;
555
579
  }
@@ -7,6 +7,7 @@
7
7
  *
8
8
  * @module memory/crdt/convergence-tracker
9
9
  */
10
+ import { createHash } from 'node:crypto';
10
11
  // =============================================================================
11
12
  // Default Configuration
12
13
  // =============================================================================
@@ -23,7 +24,7 @@ const DEFAULT_CONFIG = {
23
24
  * not the internal representations, so that stores with equivalent data produce
24
25
  * the same hash regardless of how they arrived at that state.
25
26
  *
26
- * Not cryptographic - just for detecting differences.
27
+ * Fingerprints structured semantic entries; this is not authentication.
27
28
  */
28
29
  function hashState(state) {
29
30
  const parts = [];
@@ -31,7 +32,7 @@ function hashState(state) {
31
32
  // compare the result - if both have same winner, they have same value)
32
33
  for (const [key, reg] of Object.entries(state.registers)) {
33
34
  // Include value, timestamp, and nodeId - these together determine the LWW winner
34
- parts.push(`r:${key}:${JSON.stringify(reg.value)}:${reg.timestamp}:${reg.nodeId}`);
35
+ parts.push(JSON.stringify(['r', key, JSON.stringify(reg.value), reg.timestamp, reg.nodeId]));
35
36
  }
36
37
  // Hash G-Counters by their TOTAL value (not per-node breakdown)
37
38
  // Two stores are converged if they produce the same sum, even if the internal
@@ -41,10 +42,9 @@ function hashState(state) {
41
42
  // Also include non-zero counts to detect semantic differences
42
43
  const nonZeroCounts = Object.entries(counter.counts)
43
44
  .filter(([_, count]) => count > 0)
44
- .sort(([a], [b]) => a.localeCompare(b))
45
- .map(([nodeId, count]) => `${nodeId}=${count}`)
46
- .join(',');
47
- parts.push(`g:${key}:${total}:{${nonZeroCounts}}`);
45
+ .sort(([a], [b]) => a === b ? 0 : a < b ? -1 : 1)
46
+ .map(([nodeId, count]) => [nodeId, count]);
47
+ parts.push(JSON.stringify(['g', key, total, nonZeroCounts]));
48
48
  }
49
49
  // Hash PN-Counters by their NET value (positive - negative)
50
50
  // Two stores are converged if they evaluate to the same number
@@ -55,15 +55,13 @@ function hashState(state) {
55
55
  // Include non-zero contributions for semantic comparison
56
56
  const nonZeroPos = Object.entries(counter.positive.counts)
57
57
  .filter(([_, count]) => count > 0)
58
- .sort(([a], [b]) => a.localeCompare(b))
59
- .map(([nodeId, count]) => `${nodeId}=+${count}`)
60
- .join(',');
58
+ .sort(([a], [b]) => a === b ? 0 : a < b ? -1 : 1)
59
+ .map(([nodeId, count]) => [nodeId, count]);
61
60
  const nonZeroNeg = Object.entries(counter.negative.counts)
62
61
  .filter(([_, count]) => count > 0)
63
- .sort(([a], [b]) => a.localeCompare(b))
64
- .map(([nodeId, count]) => `${nodeId}=-${count}`)
65
- .join(',');
66
- parts.push(`p:${key}:${netValue}:{${nonZeroPos}|${nonZeroNeg}}`);
62
+ .sort(([a], [b]) => a === b ? 0 : a < b ? -1 : 1)
63
+ .map(([nodeId, count]) => [nodeId, count]);
64
+ parts.push(JSON.stringify(['p', key, netValue, nonZeroPos, nonZeroNeg]));
67
65
  }
68
66
  // Hash OR-Sets by their active elements (elements with at least one non-tombstoned tag)
69
67
  for (const [key, set] of Object.entries(state.sets)) {
@@ -77,20 +75,12 @@ function hashState(state) {
77
75
  }
78
76
  }
79
77
  activeElements.sort();
80
- parts.push(`s:${key}:[${activeElements.join(',')}]`);
78
+ parts.push(JSON.stringify(['s', key, activeElements]));
81
79
  }
82
80
  // Sort for consistency
83
81
  parts.sort();
84
- // Simple hash: join and get a fingerprint
85
- const joined = parts.join('|');
86
- let hash = 0;
87
- for (let i = 0; i < joined.length; i++) {
88
- const char = joined.charCodeAt(i);
89
- hash = ((hash << 5) - hash) + char;
90
- hash = hash & hash; // Convert to 32-bit integer
91
- }
92
- // Return hash without version - version is per-node and shouldn't affect convergence check
93
- return hash.toString(16);
82
+ // Version is per-node and does not affect semantic convergence.
83
+ return createHash('sha256').update(JSON.stringify(parts)).digest('hex');
94
84
  }
95
85
  // =============================================================================
96
86
  // Convergence Tracker Implementation
@@ -365,6 +365,21 @@ export function createCRDTStore(config) {
365
365
  // For initial state, need full state - caller should use getState instead
366
366
  return null;
367
367
  }
368
+ // A retained suffix cannot cover an older checkpoint. Send complete CRDT
369
+ // state (including OR-set tombstones) through the existing delta merge API.
370
+ if (sinceVersion < deltaHistory[0].fromVersion) {
371
+ const snapshot = store.getState();
372
+ return {
373
+ fromVersion: sinceVersion,
374
+ toVersion: version,
375
+ timestamp: Date.now(),
376
+ nodeId,
377
+ registers: snapshot.registers,
378
+ gCounters: snapshot.gCounters,
379
+ pnCounters: snapshot.pnCounters,
380
+ sets: snapshot.sets,
381
+ };
382
+ }
368
383
  // Find deltas that contain changes after the requested version
369
384
  // A delta is relevant if its toVersion > sinceVersion
370
385
  const relevantDeltas = deltaHistory.filter((d) => d.toVersion > sinceVersion);
@@ -43,7 +43,7 @@ export function createLWWRegister(nodeId, initialValue, initialTimestamp) {
43
43
  return timestampA - timestampB;
44
44
  }
45
45
  // Tiebreaker: lexicographic comparison of node IDs
46
- return nodeIdA.localeCompare(nodeIdB);
46
+ return nodeIdA === nodeIdB ? 0 : nodeIdA > nodeIdB ? 1 : -1;
47
47
  }
48
48
  return {
49
49
  get() {
@@ -52,7 +52,7 @@ export function createLWWRegister(nodeId, initialValue, initialTimestamp) {
52
52
  set(value, timestamp) {
53
53
  const ts = timestamp ?? Date.now();
54
54
  // Only update if new timestamp wins
55
- if (state.timestamp === 0 ||
55
+ if (state.version === 0 ||
56
56
  compareTimestamps(ts, nodeId, state.timestamp, state.nodeId) > 0) {
57
57
  state = {
58
58
  value,
@@ -79,7 +79,7 @@ export function createLWWRegister(nodeId, initialValue, initialTimestamp) {
79
79
  },
80
80
  applyState(incoming) {
81
81
  // Only update if incoming timestamp wins
82
- if (state.timestamp === 0 ||
82
+ if (state.version === 0 ||
83
83
  compareTimestamps(incoming.timestamp, incoming.nodeId, state.timestamp, state.nodeId) > 0) {
84
84
  state = {
85
85
  value: incoming.value,
@@ -83,6 +83,22 @@ export function createORSet(nodeId) {
83
83
  let version = 0;
84
84
  let lastUpdated = Date.now();
85
85
  let tagCounter = 0;
86
+ /** Continue this owner's allocation sequence after importing a checkpoint. */
87
+ function observeOwnedTag(tag) {
88
+ const prefix = `${nodeId}:`;
89
+ if (!tag.startsWith(prefix))
90
+ return;
91
+ const suffix = tag.slice(prefix.length);
92
+ const match = /^(-?\d+):(\d+)$/.exec(suffix);
93
+ if (!match)
94
+ return;
95
+ const timestamp = Number(match[1]);
96
+ const counter = Number(match[2]);
97
+ if (Number.isSafeInteger(timestamp) && Number.isSafeInteger(counter) &&
98
+ counter < Number.MAX_SAFE_INTEGER) {
99
+ tagCounter = Math.max(tagCounter, counter + 1);
100
+ }
101
+ }
86
102
  /**
87
103
  * Check if an element has any active (non-tombstoned) tags
88
104
  */
@@ -202,6 +218,7 @@ export function createORSet(nodeId) {
202
218
  }
203
219
  const localTags = elements.get(serialized);
204
220
  for (const tag of incomingTags) {
221
+ observeOwnedTag(tag);
205
222
  if (!localTags.has(tag)) {
206
223
  localTags.add(tag);
207
224
  changed = true;
@@ -215,6 +232,7 @@ export function createORSet(nodeId) {
215
232
  }
216
233
  const localTombstones = tombstones.get(serialized);
217
234
  for (const tag of incomingTombstones) {
235
+ observeOwnedTag(tag);
218
236
  if (!localTombstones.has(tag)) {
219
237
  localTombstones.add(tag);
220
238
  changed = true;
@@ -16,6 +16,8 @@ import { safeJsonParse } from '../shared/safe-json.js';
16
16
  import { getUnifiedPersistence } from '../kernel/unified-persistence.js';
17
17
  import { DEFAULT_MAX_PLAN_STEPS, validateMaxSteps } from './types.js';
18
18
  import { getAllQEActions, QE_GOALS } from './actions/qe-action-library.js';
19
+ /** Conservative budget fallback for actions without a declared estimate. */
20
+ const DEFAULT_ACTION_DURATION_MS = 1000;
19
21
  // ============================================================================
20
22
  // MinHeap for A* Open Set (O(log n) insert/extract vs O(n log n) sort+shift)
21
23
  // ============================================================================
@@ -215,18 +217,24 @@ export class GOAPPlanner {
215
217
  }
216
218
  /** Restore missing estimates only for unchanged legacy library definitions. */
217
219
  backfillActionDurationEstimates() {
218
- const update = this.ensureDb().prepare(`
220
+ const db = this.ensureDb();
221
+ const missing = db.prepare('SELECT 1 FROM goap_actions WHERE estimated_duration_ms IS NULL LIMIT 1').get();
222
+ if (!missing)
223
+ return;
224
+ const update = db.prepare(`
219
225
  UPDATE goap_actions SET estimated_duration_ms = ?
220
226
  WHERE estimated_duration_ms IS NULL AND name = ?
221
227
  AND agent_type IS ? AND category = ? AND qe_domain IS ?
222
228
  AND preconditions = ? AND effects = ?
223
229
  AND method IS ? AND params IS ? AND implemented = ?
224
230
  `);
225
- for (const action of getAllQEActions()) {
226
- if (action.estimatedDurationMs === undefined)
227
- continue;
228
- update.run(action.estimatedDurationMs, action.name, action.agentType ?? null, action.category, action.qeDomain ?? null, JSON.stringify(action.preconditions), JSON.stringify(action.effects), action.method ?? null, action.params ? JSON.stringify(action.params) : null, action.implemented ? 1 : 0);
229
- }
231
+ db.transaction(() => {
232
+ for (const action of getAllQEActions()) {
233
+ if (action.estimatedDurationMs === undefined)
234
+ continue;
235
+ update.run(action.estimatedDurationMs, action.name, action.agentType ?? null, action.category, action.qeDomain ?? null, JSON.stringify(action.preconditions), JSON.stringify(action.effects), action.method ?? null, action.params ? JSON.stringify(action.params) : null, action.implemented ? 1 : 0);
236
+ }
237
+ })();
230
238
  }
231
239
  // ==========================================================================
232
240
  // Core Planning - A* Search
@@ -258,7 +266,7 @@ export class GOAPPlanner {
258
266
  this.recordPlanReuse(reusedPlan.id, true);
259
267
  const clonedPlan = {
260
268
  ...reusedPlan,
261
- estimatedDurationMs: reusedPlan.actions.reduce((sum, action) => sum + (action.estimatedDurationMs ?? 0), 0),
269
+ estimatedDurationMs: reusedPlan.actions.reduce((sum, action) => sum + (action.estimatedDurationMs ?? DEFAULT_ACTION_DURATION_MS), 0),
262
270
  id: `plan-${Date.now()}-${randomUUID().slice(0, 8)}`,
263
271
  initialState: this.cloneState(currentState),
264
272
  reusedFrom: reusedPlan.id,
@@ -285,7 +293,7 @@ export class GOAPPlanner {
285
293
  goalState: goal,
286
294
  actions: actionSequence,
287
295
  totalCost: actionSequence.reduce((sum, a) => sum + a.cost, 0),
288
- estimatedDurationMs: actionSequence.reduce((sum, a) => sum + (a.estimatedDurationMs ?? 0), 0),
296
+ estimatedDurationMs: actionSequence.reduce((sum, a) => sum + (a.estimatedDurationMs ?? DEFAULT_ACTION_DURATION_MS), 0),
289
297
  status: 'pending',
290
298
  };
291
299
  // A14: persist the plan itself (not just its reuse signature) so
@@ -404,7 +412,7 @@ export class GOAPPlanner {
404
412
  continue;
405
413
  }
406
414
  // Check duration constraints
407
- const estimatedDuration = current.estimatedDurationMs + (action.estimatedDurationMs ?? 0);
415
+ const estimatedDuration = current.estimatedDurationMs + (action.estimatedDurationMs ?? DEFAULT_ACTION_DURATION_MS);
408
416
  if (estimatedDuration > maxDuration) {
409
417
  continue;
410
418
  }
@@ -1040,7 +1048,7 @@ export class GOAPPlanner {
1040
1048
  if (plan.actions.length > maxSteps)
1041
1049
  return false;
1042
1050
  if (constraints?.maxDurationMs !== undefined &&
1043
- plan.actions.reduce((sum, action) => sum + (action.estimatedDurationMs ?? 0), 0)
1051
+ plan.actions.reduce((sum, action) => sum + (action.estimatedDurationMs ?? DEFAULT_ACTION_DURATION_MS), 0)
1044
1052
  > constraints.maxDurationMs) {
1045
1053
  return false;
1046
1054
  }