agentic-qe 3.15.17 → 3.15.18

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 (495) hide show
  1. package/.claude/helpers/brain-checkpoint.cjs +107 -10
  2. package/.claude/skills/agentic-quality-engineering/SKILL.md +67 -44
  3. package/.claude/skills/brutal-honesty-review/SKILL.md +12 -7
  4. package/.claude/skills/brutal-honesty-review/evals/brutal-honesty-review.yaml +120 -0
  5. package/.claude/skills/brutal-honesty-review/schemas/output.json +9 -3
  6. package/.claude/skills/code-review-quality/SKILL.md +2 -2
  7. package/.claude/skills/holistic-testing-pact/SKILL.md +11 -11
  8. package/.claude/skills/sherlock-review/SKILL.md +4 -2
  9. package/.claude/skills/sherlock-review/evals/sherlock-review.yaml +124 -0
  10. package/.claude/skills/skills-manifest.json +1 -1
  11. package/.claude/skills/technical-writing/SKILL.md +12 -6
  12. package/.claude/skills/technical-writing/evals/technical-writing.yaml +96 -0
  13. package/.opencode/skills/qe-agentic-quality-engineering.yaml +2 -2
  14. package/.opencode/skills/qe-holistic-testing-pact.yaml +2 -2
  15. package/CHANGELOG.md +123 -0
  16. package/assets/skills/agentic-quality-engineering/SKILL.md +67 -44
  17. package/assets/skills/brutal-honesty-review/SKILL.md +12 -8
  18. package/assets/skills/brutal-honesty-review/evals/brutal-honesty-review.yaml +120 -0
  19. package/assets/skills/brutal-honesty-review/schemas/output.json +9 -3
  20. package/assets/skills/code-review-quality/SKILL.md +2 -2
  21. package/assets/skills/holistic-testing-pact/SKILL.md +11 -11
  22. package/assets/skills/sherlock-review/SKILL.md +4 -3
  23. package/assets/skills/sherlock-review/evals/sherlock-review.yaml +124 -0
  24. package/assets/skills/skills-manifest.json +1 -1
  25. package/assets/skills/technical-writing/SKILL.md +12 -6
  26. package/assets/skills/technical-writing/evals/technical-writing.yaml +96 -0
  27. package/dist/cli/brain-commands.d.ts +5 -0
  28. package/dist/cli/brain-commands.js +4 -0
  29. package/dist/cli/bundle.js +6 -6
  30. package/dist/cli/chunks/adapter-WRSDXLOT.js +2 -0
  31. package/dist/cli/chunks/{agent-booster-wasm-6BUOFQZA.js → agent-booster-wasm-UFNJNF3M.js} +2 -2
  32. package/dist/cli/chunks/{agent-handler-HPDK3JI3.js → agent-handler-EAYVRJXN.js} +2 -2
  33. package/dist/cli/chunks/{agent-memory-branch-5QKUTWK5.js → agent-memory-branch-M65C6WAQ.js} +2 -2
  34. package/dist/cli/chunks/aqe-learning-engine-O6NJBCCM.js +2 -0
  35. package/dist/cli/chunks/{arena-HZ35LESR.js → arena-2GDICP6R.js} +4 -4
  36. package/dist/cli/chunks/{arena-7OKPMNHD.js → arena-CG3X67OE.js} +2 -2
  37. package/dist/cli/chunks/{audit-XI575SVK.js → audit-F4FSPJPL.js} +3 -3
  38. package/dist/cli/chunks/base-J2FXOE77.js +2 -0
  39. package/dist/cli/chunks/{better-sqlite3-YO5X7ZJS.js → better-sqlite3-2MCFXW4J.js} +2 -2
  40. package/dist/cli/chunks/brain-handler-WGTJNYNB.js +95 -0
  41. package/dist/cli/chunks/{branch-enumerator-N6G44UU2.js → branch-enumerator-KL7C535H.js} +2 -2
  42. package/dist/cli/chunks/{browser-EVKPTLOI.js → browser-SJEXDVHS.js} +2 -2
  43. package/dist/cli/chunks/browser-workflow-LXGER6ZD.js +2 -0
  44. package/dist/cli/chunks/{chunk-VLTDW7XJ.js → chunk-244RKAEP.js} +2 -2
  45. package/dist/cli/chunks/{chunk-CVPXHDQU.js → chunk-27TUMXPD.js} +1 -1
  46. package/dist/cli/chunks/{chunk-FBBPRVNF.js → chunk-2MBYDPCP.js} +2 -2
  47. package/dist/cli/chunks/{chunk-P3D7SEHW.js → chunk-2Q6DTBMT.js} +1 -1
  48. package/dist/cli/chunks/{chunk-NE3LRUNC.js → chunk-355MI7RV.js} +13 -13
  49. package/dist/cli/chunks/{chunk-YCVLKU6H.js → chunk-3LX5OKBD.js} +2 -2
  50. package/dist/cli/chunks/{chunk-74MDUIAZ.js → chunk-3RPDKJGV.js} +1 -1
  51. package/dist/cli/chunks/{chunk-OWIQR6N2.js → chunk-3YMIT73A.js} +2 -2
  52. package/dist/cli/chunks/{chunk-VKREKVFI.js → chunk-43KUVBSU.js} +2 -2
  53. package/dist/cli/chunks/chunk-477FKXSS.js +2 -0
  54. package/dist/cli/chunks/{chunk-XPTCQKVE.js → chunk-4BIMTRRX.js} +1 -1
  55. package/dist/cli/chunks/{chunk-HD6W6PHV.js → chunk-4CVNVBX5.js} +2 -2
  56. package/dist/cli/chunks/{chunk-CQER6IJ5.js → chunk-4HL3SD4A.js} +1 -1
  57. package/dist/cli/chunks/{chunk-ZNXM6WVL.js → chunk-4PEG4DU2.js} +2 -2
  58. package/dist/cli/chunks/{chunk-BSIWI4ES.js → chunk-4QSQKFED.js} +2 -2
  59. package/dist/cli/chunks/chunk-53ZBETYR.js +16 -0
  60. package/dist/cli/chunks/{chunk-BHQ2DLJU.js → chunk-544KDWL4.js} +1 -1
  61. package/dist/cli/chunks/chunk-54RCGMLB.js +8 -0
  62. package/dist/cli/chunks/{chunk-TDZ6N43D.js → chunk-5AGXIZQ5.js} +2 -2
  63. package/dist/cli/chunks/{chunk-RKCN4B26.js → chunk-5M24X6W7.js} +2 -2
  64. package/dist/cli/chunks/{chunk-GG7PMTHD.js → chunk-5O5T4LEU.js} +1 -1
  65. package/dist/cli/chunks/{chunk-OWIZBZLN.js → chunk-5RFXX4IF.js} +2 -2
  66. package/dist/cli/chunks/{chunk-VQFV2IPV.js → chunk-62MLAQRJ.js} +1 -1
  67. package/dist/cli/chunks/{chunk-PCL5JRKN.js → chunk-6D6TGL2E.js} +2 -2
  68. package/dist/cli/chunks/{chunk-WBDWHHKP.js → chunk-6IHZDSDL.js} +2 -2
  69. package/dist/cli/chunks/{chunk-UOVCTK5L.js → chunk-6P3Y45QL.js} +2 -2
  70. package/dist/cli/chunks/{chunk-45223KK6.js → chunk-6TEVM3X3.js} +10 -10
  71. package/dist/cli/chunks/{chunk-K7WAI662.js → chunk-7XTUKKRA.js} +1 -1
  72. package/dist/cli/chunks/chunk-A3GDX6UF.js +2 -0
  73. package/dist/cli/chunks/{chunk-GN6OE3JT.js → chunk-A5YTKKNA.js} +1 -1
  74. package/dist/cli/chunks/{chunk-KR2TAAF6.js → chunk-ADNGZAT2.js} +1 -1
  75. package/dist/cli/chunks/{chunk-J7Q5TXFZ.js → chunk-AWQAE3SW.js} +2 -2
  76. package/dist/cli/chunks/{chunk-ZN35XSKF.js → chunk-AXDBQFR4.js} +2 -2
  77. package/dist/cli/chunks/{chunk-ND72UDVH.js → chunk-AXVD7O3F.js} +2 -2
  78. package/dist/cli/chunks/{chunk-SAEECT23.js → chunk-B52ULNYO.js} +2 -2
  79. package/dist/cli/chunks/chunk-B6S4FC7M.js +3 -0
  80. package/dist/cli/chunks/{chunk-Z7SKUC6P.js → chunk-BDVFSMOQ.js} +1 -1
  81. package/dist/cli/chunks/{chunk-CXCMATZ6.js → chunk-BGXXMX3Y.js} +2 -2
  82. package/dist/cli/chunks/{chunk-R3KBOQ3O.js → chunk-BKMQQY5T.js} +2 -2
  83. package/dist/cli/chunks/{chunk-SAZ4PJBR.js → chunk-BN2FROBQ.js} +2 -2
  84. package/dist/cli/chunks/{chunk-G2X3OLMN.js → chunk-BO6EQNOC.js} +2 -2
  85. package/dist/cli/chunks/{chunk-776K4ZLE.js → chunk-BOVAKCDC.js} +2 -2
  86. package/dist/cli/chunks/{chunk-QSQNXBD2.js → chunk-BSXKZDKO.js} +2 -2
  87. package/dist/cli/chunks/{chunk-MGZ6XZHU.js → chunk-C5QVJ5XQ.js} +1 -1
  88. package/dist/cli/chunks/{chunk-LOLSZG5J.js → chunk-CFQLLF3D.js} +2 -2
  89. package/dist/cli/chunks/{chunk-J6QRNQJF.js → chunk-DUCVLT3F.js} +7 -7
  90. package/dist/cli/chunks/{chunk-QTQDX4TZ.js → chunk-E4RMJCGA.js} +3 -3
  91. package/dist/cli/chunks/{chunk-MLMD3I75.js → chunk-EONDCWY4.js} +1 -1
  92. package/dist/cli/chunks/{chunk-7BSOO3CY.js → chunk-F4AGNKL2.js} +2 -2
  93. package/dist/cli/chunks/{chunk-IKB3M7OF.js → chunk-F6YD3BOW.js} +1 -1
  94. package/dist/cli/chunks/{chunk-LIF6UWHV.js → chunk-FQRS7WVA.js} +2 -2
  95. package/dist/cli/chunks/{chunk-QJSSUBO3.js → chunk-FT24SSDG.js} +2 -2
  96. package/dist/cli/chunks/chunk-FV4YNSAJ.js +5 -0
  97. package/dist/cli/chunks/{chunk-VITV7AEC.js → chunk-FVDM3X42.js} +2 -2
  98. package/dist/cli/chunks/{chunk-LN7NKE3N.js → chunk-FVH7TXWU.js} +2 -2
  99. package/dist/cli/chunks/{chunk-FBSBXCZS.js → chunk-FWR5QY37.js} +2 -2
  100. package/dist/cli/chunks/{chunk-X2DWHGCC.js → chunk-FYINK2B7.js} +2 -2
  101. package/dist/cli/chunks/{chunk-ECKHDHR2.js → chunk-GGISVPOZ.js} +2 -2
  102. package/dist/cli/chunks/{chunk-SRBCBVSI.js → chunk-GPIJIZJQ.js} +2 -2
  103. package/dist/cli/chunks/{chunk-YR5QBUHZ.js → chunk-GXEVOT5F.js} +2 -2
  104. package/dist/cli/chunks/{chunk-ZTP3DQ5M.js → chunk-GZ4VB5RI.js} +1 -1
  105. package/dist/cli/chunks/{chunk-HWQPMUSN.js → chunk-HBDSCYSK.js} +2 -2
  106. package/dist/cli/chunks/{chunk-XBTGEYED.js → chunk-HGG4HR7C.js} +2 -2
  107. package/dist/cli/chunks/{chunk-YD2C6EPN.js → chunk-HSCKWWO2.js} +2 -2
  108. package/dist/cli/chunks/{chunk-LOMT4UC2.js → chunk-HSQ3GUYJ.js} +2 -2
  109. package/dist/cli/chunks/{chunk-ZC3KDNJW.js → chunk-HZQBW5EM.js} +3 -3
  110. package/dist/cli/chunks/{chunk-SUAZ5Z47.js → chunk-IGIYANVT.js} +2 -2
  111. package/dist/cli/chunks/{chunk-IHQGNDMX.js → chunk-IPWMSXBF.js} +2 -2
  112. package/dist/cli/chunks/{chunk-6V6BD6PH.js → chunk-IWVNC7VY.js} +1 -1
  113. package/dist/cli/chunks/{chunk-M2YI5YUR.js → chunk-IZODXKZD.js} +2 -2
  114. package/dist/cli/chunks/{chunk-LG5PPJT7.js → chunk-J2MT2OJV.js} +1 -1
  115. package/dist/cli/chunks/{chunk-6LSZCEW2.js → chunk-JKIJVVSP.js} +1 -1
  116. package/dist/cli/chunks/{chunk-REY52O7J.js → chunk-JMRDT2XK.js} +1 -1
  117. package/dist/cli/chunks/{chunk-XEYFZLIT.js → chunk-JR2UMTKG.js} +1 -1
  118. package/dist/cli/chunks/{chunk-DJDVD6RM.js → chunk-K6CH4CFF.js} +2 -2
  119. package/dist/cli/chunks/{chunk-2PCEMDIX.js → chunk-K7KW5QB5.js} +78 -87
  120. package/dist/cli/chunks/{chunk-EPVPXHL7.js → chunk-KFCQP434.js} +2 -2
  121. package/dist/cli/chunks/{chunk-TWBZONKT.js → chunk-KH4T6STG.js} +2 -2
  122. package/dist/cli/chunks/{chunk-JI33PMPZ.js → chunk-KJBYZO57.js} +1 -1
  123. package/dist/cli/chunks/{chunk-PK34KJH7.js → chunk-KP4OKOKV.js} +2 -2
  124. package/dist/cli/chunks/chunk-L2MBKVSE.js +2 -0
  125. package/dist/cli/chunks/{chunk-JVWZAE2H.js → chunk-L3IPUIT3.js} +2 -2
  126. package/dist/cli/chunks/{chunk-KT2QCXO6.js → chunk-L7PSU2YN.js} +2 -2
  127. package/dist/cli/chunks/{chunk-HAQJFUAQ.js → chunk-LA3JPGQA.js} +2 -2
  128. package/dist/cli/chunks/{chunk-LV7UIK4Q.js → chunk-LC2QRN7V.js} +14 -13
  129. package/dist/cli/chunks/{chunk-KTORRIX3.js → chunk-LHY7TMTM.js} +2 -2
  130. package/dist/cli/chunks/{chunk-IJSROBM6.js → chunk-LLQ2UMF6.js} +3 -3
  131. package/dist/cli/chunks/{chunk-NKUHMA4T.js → chunk-LOJ7OO6W.js} +2 -2
  132. package/dist/cli/chunks/{chunk-OJIUIEI4.js → chunk-LPUSH3VF.js} +1 -1
  133. package/dist/cli/chunks/{chunk-WAOEQA3W.js → chunk-LSEC2BU7.js} +2 -2
  134. package/dist/cli/chunks/{chunk-YMUY3TES.js → chunk-LTGB7OIU.js} +2 -2
  135. package/dist/cli/chunks/{chunk-CVYPMGUM.js → chunk-LUG7YNVZ.js} +2 -2
  136. package/dist/cli/chunks/{chunk-YAJOBZE5.js → chunk-LWAFRYKE.js} +2 -2
  137. package/dist/cli/chunks/{chunk-ZP5AWQRO.js → chunk-M24ZAZ4U.js} +2 -2
  138. package/dist/cli/chunks/{chunk-HFZD5KLR.js → chunk-MKRKRXTX.js} +1 -1
  139. package/dist/cli/chunks/{chunk-4YM45Z5B.js → chunk-MNNLONAD.js} +1 -1
  140. package/dist/cli/chunks/{chunk-CMN7PU2H.js → chunk-MQM37KAR.js} +2 -2
  141. package/dist/cli/chunks/{chunk-COTQ44YO.js → chunk-MSX2OHYT.js} +2 -2
  142. package/dist/cli/chunks/{chunk-4UKTIQDT.js → chunk-MVYQRVLP.js} +2 -2
  143. package/dist/cli/chunks/{chunk-HRUHHHVR.js → chunk-MZC5WM2P.js} +2 -2
  144. package/dist/cli/chunks/{chunk-YKRLUTK7.js → chunk-MZRBNBB3.js} +2 -2
  145. package/dist/cli/chunks/{chunk-XEMCHGAJ.js → chunk-N3KQU4UC.js} +2 -2
  146. package/dist/cli/chunks/{chunk-DS5IFRY6.js → chunk-NKU3FFM4.js} +2 -2
  147. package/dist/cli/chunks/chunk-O5EWFR76.js +2 -0
  148. package/dist/cli/chunks/{chunk-J3QFJI2Y.js → chunk-O5RDHD5T.js} +2 -2
  149. package/dist/cli/chunks/chunk-O6UWIXME.js +3 -0
  150. package/dist/cli/chunks/{chunk-Q6F3DYZN.js → chunk-OA4EQDC4.js} +2 -2
  151. package/dist/cli/chunks/{chunk-NQFDJ6BT.js → chunk-OBCXCRXK.js} +1 -1
  152. package/dist/cli/chunks/{chunk-S3TBOKAZ.js → chunk-OHU5P25N.js} +4 -4
  153. package/dist/cli/chunks/{chunk-DNVRTJKB.js → chunk-OOSV2RIA.js} +2 -2
  154. package/dist/cli/chunks/{chunk-NZJVDOUN.js → chunk-OW23N2Y5.js} +2 -2
  155. package/dist/cli/chunks/{chunk-ZWUF27P4.js → chunk-OXOO3YDL.js} +2 -2
  156. package/dist/cli/chunks/{chunk-4L6WX5KC.js → chunk-OYGKSSSI.js} +1 -1
  157. package/dist/cli/chunks/{chunk-DCDSN67A.js → chunk-PGO46IIW.js} +1 -1
  158. package/dist/cli/chunks/{chunk-C7QLLMYI.js → chunk-PZOYQHWS.js} +1 -1
  159. package/dist/cli/chunks/{chunk-BKHEQIRZ.js → chunk-Q2BZSG7Z.js} +2 -2
  160. package/dist/cli/chunks/{chunk-5FSPELOG.js → chunk-Q7V722K5.js} +2 -2
  161. package/dist/cli/chunks/{chunk-2EQK7B5L.js → chunk-QZU6M5IO.js} +2 -2
  162. package/dist/cli/chunks/{chunk-HVT7RMGV.js → chunk-R55Y76SJ.js} +1 -1
  163. package/dist/cli/chunks/{chunk-POPSZDI2.js → chunk-RMEQYJPU.js} +4 -4
  164. package/dist/cli/chunks/{chunk-H2LHWZRE.js → chunk-RTYXFXTI.js} +2 -2
  165. package/dist/cli/chunks/{chunk-QN7HP2UW.js → chunk-SJF3O4FX.js} +236 -236
  166. package/dist/cli/chunks/{chunk-2YWYW7NU.js → chunk-SOUS7Z2H.js} +2 -2
  167. package/dist/cli/chunks/{chunk-U5SMBJ6F.js → chunk-SRVNR3R3.js} +2 -2
  168. package/dist/cli/chunks/{chunk-ZAQMRFBB.js → chunk-SU3SXMVG.js} +2 -2
  169. package/dist/cli/chunks/chunk-SWGPLXWW.js +32 -0
  170. package/dist/cli/chunks/{chunk-S3DT5TPR.js → chunk-TRB3EVH3.js} +2 -2
  171. package/dist/cli/chunks/{chunk-IJZFJPHS.js → chunk-TVBDUMKT.js} +2 -2
  172. package/dist/cli/chunks/{chunk-7SNSI4VY.js → chunk-TWTXPSFU.js} +1 -1
  173. package/dist/cli/chunks/{chunk-ORQ2YBRR.js → chunk-ULYUVUL2.js} +2 -2
  174. package/dist/cli/chunks/{chunk-MVVVGQJ6.js → chunk-UNTBVJ5X.js} +2 -2
  175. package/dist/cli/chunks/{chunk-5WATBVU6.js → chunk-UQAA4PHU.js} +2 -2
  176. package/dist/cli/chunks/{chunk-5WYZVSL2.js → chunk-UWSJVKTE.js} +1 -1
  177. package/dist/cli/chunks/{chunk-JHKKIJT2.js → chunk-V2LJ54KP.js} +2 -2
  178. package/dist/cli/chunks/{chunk-2UUZCQSD.js → chunk-VCCTTKP3.js} +2 -2
  179. package/dist/cli/chunks/{chunk-P4OB6WDJ.js → chunk-VEGUYUVS.js} +1 -1
  180. package/dist/cli/chunks/{chunk-WX4PO65Q.js → chunk-VUQPVWNK.js} +2 -2
  181. package/dist/cli/chunks/{chunk-IQL6XRF5.js → chunk-VVGUE2T2.js} +2 -2
  182. package/dist/cli/chunks/{chunk-HZ5O7G2P.js → chunk-W5ASDHJQ.js} +1 -1
  183. package/dist/cli/chunks/{chunk-U4S74IIZ.js → chunk-WGXT5NWQ.js} +1 -1
  184. package/dist/cli/chunks/chunk-WJN3V7QB.js +7 -0
  185. package/dist/cli/chunks/chunk-WPCRQIIF.js +29 -0
  186. package/dist/cli/chunks/{chunk-AGCS5GSO.js → chunk-WQNLXUWA.js} +6 -6
  187. package/dist/cli/chunks/{chunk-LRY6UIRI.js → chunk-WZVRMKG2.js} +2 -2
  188. package/dist/cli/chunks/{chunk-KPIPVSIP.js → chunk-X27IUWTD.js} +2 -2
  189. package/dist/cli/chunks/{chunk-VDEKVIP5.js → chunk-X4B345B6.js} +2 -2
  190. package/dist/cli/chunks/{chunk-ERYADKMZ.js → chunk-X5I2Y4VO.js} +2 -2
  191. package/dist/cli/chunks/{chunk-EUWG2JG4.js → chunk-X7IQIFTS.js} +2 -2
  192. package/dist/cli/chunks/chunk-XJN3RKUD.js +3 -0
  193. package/dist/cli/chunks/{chunk-JRIJM4LE.js → chunk-XQMGXTHJ.js} +3 -3
  194. package/dist/cli/chunks/{chunk-VYPVU3JF.js → chunk-XTSAMB2Q.js} +2 -2
  195. package/dist/cli/chunks/{chunk-4NKZU2JZ.js → chunk-XZLIF4O2.js} +2 -2
  196. package/dist/cli/chunks/{chunk-XFTX3KLE.js → chunk-Y4LSEOZ3.js} +1 -1
  197. package/dist/cli/chunks/{chunk-ZVMSSCTH.js → chunk-Y4YN2RXR.js} +2 -2
  198. package/dist/cli/chunks/{chunk-X5QD76IU.js → chunk-YDI56L35.js} +2 -2
  199. package/dist/cli/chunks/{chunk-LRKLATSH.js → chunk-YFILS5D5.js} +2 -2
  200. package/dist/cli/chunks/{chunk-AVHYJ3XP.js → chunk-YISDX6WB.js} +2 -2
  201. package/dist/cli/chunks/{chunk-GPPTRKEM.js → chunk-YP2GHQSV.js} +2 -2
  202. package/dist/cli/chunks/{chunk-OO2M2QUV.js → chunk-YSX756AM.js} +4 -4
  203. package/dist/cli/chunks/{chunk-E7XIMOKW.js → chunk-YWANOASW.js} +2 -2
  204. package/dist/cli/chunks/{chunk-UHJVZEQA.js → chunk-YYIJLG7S.js} +2 -2
  205. package/dist/cli/chunks/{chunk-LCWEQRZI.js → chunk-Z7SD7LXM.js} +2 -2
  206. package/dist/cli/chunks/{chunk-TM75GAXG.js → chunk-ZDWD73UF.js} +2 -2
  207. package/dist/cli/chunks/{chunk-IRHXGCQR.js → chunk-ZFT3RLA4.js} +2 -2
  208. package/dist/cli/chunks/{chunk-ZGV7L4MW.js → chunk-ZNTHX5G3.js} +1 -1
  209. package/dist/cli/chunks/{chunk-D75GLKEL.js → chunk-ZS27R7VL.js} +2 -2
  210. package/dist/cli/chunks/{chunk-INI3Q4CN.js → chunk-ZXHHHR7K.js} +1 -1
  211. package/dist/cli/chunks/{ci-3RTTTS2D.js → ci-N5MOMNXH.js} +2 -2
  212. package/dist/cli/chunks/{ci-config-XRUR3I4K.js → ci-config-6L2ROQCW.js} +2 -2
  213. package/dist/cli/chunks/{ci-output-E5IAMU2U.js → ci-output-DSRBYEIK.js} +2 -2
  214. package/dist/cli/chunks/{circuit-breaker-SHR2P44P.js → circuit-breaker-VRPTNBL7.js} +2 -2
  215. package/dist/cli/chunks/{claude-flow-setup-ZDDILFMF.js → claude-flow-setup-4YFG3FU5.js} +2 -2
  216. package/dist/cli/chunks/client-I3L6BKRQ.js +2 -0
  217. package/dist/cli/chunks/{cline-installer-BGYVUM6G.js → cline-installer-7RGYJWGN.js} +2 -2
  218. package/dist/cli/chunks/{code-PJ4MC3MC.js → code-ISC6NW2K.js} +3 -3
  219. package/dist/cli/chunks/{code-index-extractor-IW2P22YG.js → code-index-extractor-2FID75YV.js} +2 -2
  220. package/dist/cli/chunks/{codex-installer-A7WZ6OGL.js → codex-installer-DZ7OG6KM.js} +2 -2
  221. package/dist/cli/chunks/{completions-KS23WD5J.js → completions-SM3LICWK.js} +2 -2
  222. package/dist/cli/chunks/{complexity-analyzer-Q7GLSR2E.js → complexity-analyzer-ZWD2CTAD.js} +2 -2
  223. package/dist/cli/chunks/{continuedev-installer-SK55BFW2.js → continuedev-installer-AGASOA26.js} +2 -2
  224. package/dist/cli/chunks/{copilot-installer-3N5J3WTM.js → copilot-installer-CLPZYTQC.js} +2 -2
  225. package/dist/cli/chunks/core-handlers-5EFOJ37H.js +2 -0
  226. package/dist/cli/chunks/{cost-tracker-NENVSO4A.js → cost-tracker-7PIGQYDV.js} +2 -2
  227. package/dist/cli/chunks/{coverage-5L7UQWDH.js → coverage-T2GEBTYS.js} +9 -9
  228. package/dist/cli/chunks/cross-domain-router-65WJAKVD.js +2 -0
  229. package/dist/cli/chunks/{cursor-installer-XXBO2ZE6.js → cursor-installer-KXBID4MB.js} +2 -2
  230. package/dist/cli/chunks/daemon-43MXIVH3.js +18 -0
  231. package/dist/cli/chunks/{daemon-CDCQU3LR.js → daemon-VAMJLQJ5.js} +3 -3
  232. package/dist/cli/chunks/{dag-attention-scheduler-HOMMF7FA.js → dag-attention-scheduler-UBP4VHTA.js} +2 -2
  233. package/dist/cli/chunks/{detect-FXCOUG6X.js → detect-QWFIQRKI.js} +2 -2
  234. package/dist/cli/chunks/{dist-node-GXQ7FMTY.js → dist-node-I2GICS3W.js} +2 -2
  235. package/dist/cli/chunks/{domain-handler-TI3JBAPC.js → domain-handler-Z66ISB2A.js} +2 -2
  236. package/dist/cli/chunks/{domain-plugins-R7LTUM32.js → domain-plugins-KHMD3FKT.js} +2 -2
  237. package/dist/cli/chunks/{domain-transfer-LBIAFHIQ.js → domain-transfer-JWGNNA6K.js} +2 -2
  238. package/dist/cli/chunks/dream-VQ2PZCVR.js +2 -0
  239. package/dist/cli/chunks/embed-and-insert-pattern-F5P5B6JX.js +3 -0
  240. package/dist/cli/chunks/{embedding-space-HHLWTBF5.js → embedding-space-KHG6TITM.js} +2 -2
  241. package/dist/cli/chunks/{eval-KDOZMAXJ.js → eval-43OHU7EI.js} +2 -2
  242. package/dist/cli/chunks/{experience-capture-middleware-X45PECQN.js → experience-capture-middleware-KXD47H6P.js} +3 -3
  243. package/dist/cli/chunks/{fast-paths-462V6UUB.js → fast-paths-6D75D5KD.js} +2 -2
  244. package/dist/cli/chunks/{feature-flags-NIRQ4YDM.js → feature-flags-IE35Y55N.js} +2 -2
  245. package/dist/cli/chunks/{feature-flags-G66OT3AS.js → feature-flags-OYYHY7LS.js} +2 -2
  246. package/dist/cli/chunks/file-discovery-LGBTY3ID.js +2 -0
  247. package/dist/cli/chunks/{fleet-PXWGB7CU.js → fleet-AGVJMFGD.js} +16 -16
  248. package/dist/cli/chunks/{gnn-wrapper-7MUW3M5M.js → gnn-wrapper-5L66A7LW.js} +2 -2
  249. package/dist/cli/chunks/{heartbeat-handler-5237PB35.js → heartbeat-handler-2BY6YYOT.js} +5 -5
  250. package/dist/cli/chunks/heartbeat-scheduler-3DU3M5AT.js +2 -0
  251. package/dist/cli/chunks/hnsw-adapter-N2IMSRPV.js +2 -0
  252. package/dist/cli/chunks/hnsw-index-DVU7TTJE.js +2 -0
  253. package/dist/cli/chunks/{hnsw-legacy-bridge-OSQPW7JP.js → hnsw-legacy-bridge-RYMWFNAH.js} +2 -2
  254. package/dist/cli/chunks/{hnswlib-node-GX6WG2GB.js → hnswlib-node-GG47HP2P.js} +2 -2
  255. package/dist/cli/chunks/{hooks-GUWHL7VC.js → hooks-FQNACS24.js} +10 -10
  256. package/dist/cli/chunks/hybrid-backend-AS2PNHOD.js +2 -0
  257. package/dist/cli/chunks/{hypergraph-engine-SRWLLCU3.js → hypergraph-engine-6BYNJQEP.js} +2 -2
  258. package/dist/cli/chunks/{hypergraph-handler-AVOPRHHO.js → hypergraph-handler-CYTAXZKJ.js} +3 -3
  259. package/dist/cli/chunks/impact-analyzer-Y4OONLFP.js +2 -0
  260. package/dist/cli/chunks/{init-guard-P4N6EVZS.js → init-guard-METTAV5O.js} +2 -2
  261. package/dist/cli/chunks/{init-handler-LRGWOJMD.js → init-handler-GFT74U5Y.js} +6 -6
  262. package/dist/cli/chunks/init-wizard-HLNUBJQN.js +2 -0
  263. package/dist/cli/chunks/kernel-XKFWCL7Y.js +2 -0
  264. package/dist/cli/chunks/{kilocode-installer-7R2EPOQ6.js → kilocode-installer-GZV2D3FF.js} +2 -2
  265. package/dist/cli/chunks/{kiro-installer-QNM7DPOB.js → kiro-installer-Q4ZXUFC7.js} +2 -2
  266. package/dist/cli/chunks/knowledge-graph-CNL77CSZ.js +2 -0
  267. package/dist/cli/chunks/{learning-7OIZBPXZ.js → learning-WA2QEYL7.js} +35 -34
  268. package/dist/cli/chunks/{llm-router-SIDXES23.js → llm-router-GRTCHWH7.js} +4 -4
  269. package/dist/cli/chunks/llm-router-service-UIYTYKP6.js +2 -0
  270. package/dist/cli/chunks/{load-EI2E2C3S.js → load-WXN3Q7Y5.js} +2 -2
  271. package/dist/cli/chunks/load-test-PXLW4A5B.js +2 -0
  272. package/dist/cli/chunks/{mcp-IOE5WOCS.js → mcp-LIQCPSJN.js} +2 -2
  273. package/dist/cli/chunks/{memory-DLYGJAP7.js → memory-OP6CHRFH.js} +5 -5
  274. package/dist/cli/chunks/memory-backend-XYOSO73Q.js +2 -0
  275. package/dist/cli/chunks/memory-handlers-PQFYVNVG.js +2 -0
  276. package/dist/cli/chunks/{multi-model-executor-WHH4YCHM.js → multi-model-executor-H54DEVRZ.js} +2 -2
  277. package/dist/cli/chunks/{opencode-installer-63FDZAMS.js → opencode-installer-BSQV6UAT.js} +2 -2
  278. package/dist/cli/chunks/{orchestrator-3LA776KK.js → orchestrator-TJDPQ4VL.js} +122 -35
  279. package/dist/cli/chunks/pattern-null-store-BKGTQFNF.js +2 -0
  280. package/dist/cli/chunks/{pattern-usage-recorder-NW54QUGI.js → pattern-usage-recorder-FOVS4M5L.js} +2 -2
  281. package/dist/cli/chunks/{pipeline-P3TYX6J6.js → pipeline-4AY2ZIC6.js} +2 -2
  282. package/dist/cli/chunks/{platform-FNA2WLI6.js → platform-FCSITYMR.js} +2 -2
  283. package/dist/cli/chunks/{plugin-NJS7BC2S.js → plugin-E56TV5S2.js} +2 -2
  284. package/dist/cli/chunks/{prime-radiant-advanced-wasm-NIAVL2OT.js → prime-radiant-advanced-wasm-ACOPC533.js} +2 -2
  285. package/dist/cli/chunks/project-root-MPX7CN2C.js +2 -0
  286. package/dist/cli/chunks/protocol-executor-CRQOCC4A.js +2 -0
  287. package/dist/cli/chunks/{protocol-handler-JU5C4JHY.js → protocol-handler-KRVXF4LS.js} +2 -2
  288. package/dist/cli/chunks/{prove-35VOSLYP.js → prove-KMFPSKGD.js} +2 -2
  289. package/dist/cli/chunks/qe-reasoning-bank-UEGQ3O7F.js +2 -0
  290. package/dist/cli/chunks/{quality-ET74X7HN.js → quality-6DBI3HLB.js} +2 -2
  291. package/dist/cli/chunks/{quality-gate-FEDQISNB.js → quality-gate-3ROZMEIL.js} +3 -3
  292. package/dist/cli/chunks/queen-coordinator-32574XSG.js +2 -0
  293. package/dist/cli/chunks/real-embeddings-MIGZNKK3.js +2 -0
  294. package/dist/cli/chunks/{ref-validation-DTBPYCEB.js → ref-validation-EYIP7DHW.js} +2 -2
  295. package/dist/cli/chunks/{roocode-installer-LYQEMR4J.js → roocode-installer-IGGZHR2Y.js} +2 -2
  296. package/dist/cli/chunks/router-CZJY5WX6.js +2 -0
  297. package/dist/cli/chunks/routing-feedback-RC3UBNFX.js +2 -0
  298. package/dist/cli/chunks/{routing-handler-DJOJFPII.js → routing-handler-BWNHBYDC.js} +2 -2
  299. package/dist/cli/chunks/{ruvector-commands-VXYGJDPW.js → ruvector-commands-PXIHF432.js} +2 -2
  300. package/dist/cli/chunks/rvf-dual-writer-OG7OV2AK.js +2 -0
  301. package/dist/cli/chunks/rvf-migration-adapter-THYMW7ZO.js +2 -0
  302. package/dist/cli/chunks/rvf-migration-coordinator-3H6CLFU7.js +2 -0
  303. package/dist/cli/chunks/rvf-native-adapter-6JQJIKKW.js +2 -0
  304. package/dist/cli/chunks/{rvf-store-integrity-GA2ZYOEG.js → rvf-store-integrity-CVB3NMSL.js} +2 -2
  305. package/dist/cli/chunks/safe-db-QFKCVTIJ.js +2 -0
  306. package/dist/cli/chunks/schedule-6JLVMMYB.js +2 -0
  307. package/dist/cli/chunks/scheduler-3MPZRMJD.js +2 -0
  308. package/dist/cli/chunks/{security-MM6YOECX.js → security-DCRGOTWU.js} +3 -3
  309. package/dist/cli/chunks/{shared-rvf-adapter-6AHPA3V5.js → shared-rvf-adapter-GKD74QUB.js} +2 -2
  310. package/dist/cli/chunks/{shared-rvf-dual-writer-EYAVY2GZ.js → shared-rvf-dual-writer-HVAAVEOH.js} +2 -2
  311. package/dist/cli/chunks/sqlite-persistence-LGTIKAEX.js +2 -0
  312. package/dist/cli/chunks/{standalone-memory-A3PLB4CZ.js → standalone-memory-O7O2U5N4.js} +2 -2
  313. package/dist/cli/chunks/{status-handler-OSSFAP4Z.js → status-handler-BQTPJJTL.js} +2 -2
  314. package/dist/cli/chunks/{structural-health-PGY5XUNO.js → structural-health-4H6J4OHK.js} +2 -2
  315. package/dist/cli/chunks/sync-DJ4TF6QX.js +2 -0
  316. package/dist/cli/chunks/{sync-CWEHYGNN.js → sync-WW5TAVYW.js} +2 -2
  317. package/dist/cli/chunks/{task-handler-LHMQ75W4.js → task-handler-HEM4IEOW.js} +2 -2
  318. package/dist/cli/chunks/{task-handlers-S2TX5FTR.js → task-handlers-JRA3NXIR.js} +3 -3
  319. package/dist/cli/chunks/{test-4EGZZ6NJ.js → test-772ZXVG2.js} +4 -4
  320. package/dist/cli/chunks/test-runner-process-XGF2U3NG.js +2 -0
  321. package/dist/cli/chunks/{test-scheduling-YJQHH3XE.js → test-scheduling-4TRB7LZ7.js} +3 -3
  322. package/dist/cli/chunks/token-bootstrap-CICBIJ7T.js +2 -0
  323. package/dist/cli/chunks/{token-usage-WPNOJR6H.js → token-usage-B7PEKE2G.js} +2 -2
  324. package/dist/cli/chunks/{transformers-4MRPXCPU.js → transformers-V7X7BDZX.js} +2 -2
  325. package/dist/cli/chunks/tree-sitter-wasm-parser-OXPFKFZS.js +2 -0
  326. package/dist/cli/chunks/{types-6P5FB4EB.js → types-AHHTUY3I.js} +2 -2
  327. package/dist/cli/chunks/unified-memory-GUR3IUI6.js +2 -0
  328. package/dist/cli/chunks/unified-memory-hnsw-NJP2F2RY.js +2 -0
  329. package/dist/cli/chunks/unified-persistence-NILBWXDP.js +2 -0
  330. package/dist/cli/chunks/{upgrade-4ICTN63Y.js → upgrade-DZ4DLUQ5.js} +2 -2
  331. package/dist/cli/chunks/{validate-HQF5GZ7L.js → validate-4DTLIDJE.js} +2 -2
  332. package/dist/cli/chunks/{validate-swarm-45JYG7VW.js → validate-swarm-A26UFVIS.js} +2 -2
  333. package/dist/cli/chunks/visual-security-YECYZ27X.js +2 -0
  334. package/dist/cli/chunks/{web-tree-sitter-UOTWZLNH.js → web-tree-sitter-F2C7QRYT.js} +2 -2
  335. package/dist/cli/chunks/{windsurf-installer-WDWSBXGN.js → windsurf-installer-OOBTDA6W.js} +2 -2
  336. package/dist/cli/chunks/{witness-chain-DOYMNPC7.js → witness-chain-KGFZJP32.js} +2 -2
  337. package/dist/cli/chunks/witness-chain-LYBXFLJB.js +2 -0
  338. package/dist/cli/chunks/witness-chain-repair-CNTXOGPN.js +2 -0
  339. package/dist/cli/chunks/{witness-chain-verifier-JB42X62J.js → witness-chain-verifier-OB7ZZOI3.js} +2 -2
  340. package/dist/cli/chunks/{witness-key-manager-LXXO6L2G.js → witness-key-manager-YCKGKGQI.js} +2 -2
  341. package/dist/cli/chunks/{workflow-6ARK47NF.js → workflow-PRERHWKY.js} +4 -4
  342. package/dist/cli/chunks/workflow-orchestrator-UIBGWCU3.js +2 -0
  343. package/dist/cli/chunks/wrappers-L4UY4V63.js +2 -0
  344. package/dist/cli/commands/coverage.js +4 -1
  345. package/dist/cli/commands/learning-prune.js +9 -1
  346. package/dist/cli/handlers/brain-handler.js +32 -2
  347. package/dist/cli/handlers/heartbeat-handler.js +3 -1
  348. package/dist/cli/utils/coverage-data.js +5 -1
  349. package/dist/cli/utils/coverage-verdict.d.ts +10 -2
  350. package/dist/cli/utils/coverage-verdict.js +23 -8
  351. package/dist/cli/utils/fleet-operation.js +9 -3
  352. package/dist/coordination/handlers/code-intelligence-handlers.js +17 -3
  353. package/dist/coordination/handlers/coverage-handlers.js +22 -9
  354. package/dist/coordination/handlers/coverage-target.d.ts +22 -2
  355. package/dist/coordination/handlers/coverage-target.js +45 -9
  356. package/dist/coordination/handlers/handler-utils.d.ts +19 -0
  357. package/dist/coordination/handlers/handler-utils.js +22 -8
  358. package/dist/coordination/protocols/code-intelligence-index.js +6 -3
  359. package/dist/coordination/protocols/learning-consolidation-archive.d.ts +6 -3
  360. package/dist/coordination/protocols/learning-consolidation-archive.js +4 -3
  361. package/dist/coordination/workflow-builtin.js +1 -0
  362. package/dist/domains/defect-intelligence/interfaces.d.ts +2 -0
  363. package/dist/domains/defect-intelligence/prediction-history.d.ts +15 -1
  364. package/dist/domains/defect-intelligence/prediction-history.js +63 -7
  365. package/dist/domains/defect-intelligence/services/defect-predictor.d.ts +1 -0
  366. package/dist/domains/defect-intelligence/services/defect-predictor.js +33 -13
  367. package/dist/domains/learning-optimization/coordinator.js +17 -10
  368. package/dist/domains/learning-optimization/domain-ranking.d.ts +26 -0
  369. package/dist/domains/learning-optimization/domain-ranking.js +28 -0
  370. package/dist/domains/learning-optimization/interfaces.d.ts +5 -0
  371. package/dist/domains/learning-optimization/pattern-archive.d.ts +55 -8
  372. package/dist/domains/learning-optimization/pattern-archive.js +90 -17
  373. package/dist/domains/learning-optimization/pattern-consolidation.js +18 -2
  374. package/dist/domains/learning-optimization/pattern-merge.d.ts +26 -0
  375. package/dist/domains/learning-optimization/pattern-merge.js +127 -0
  376. package/dist/domains/learning-optimization/services/learning-coordinator.js +21 -35
  377. package/dist/domains/test-execution/services/test-executor.js +6 -2
  378. package/dist/init/init-wizard-steps.js +3 -1
  379. package/dist/init/phases/07-hooks.js +97 -10
  380. package/dist/integrations/embeddings/cache/EmbeddingCache.js +1 -1
  381. package/dist/integrations/ruvector/brain-rvf-exporter.d.ts +16 -1
  382. package/dist/integrations/ruvector/brain-rvf-exporter.js +18 -32
  383. package/dist/integrations/ruvector/brain-rvf-richness.d.ts +75 -0
  384. package/dist/integrations/ruvector/brain-rvf-richness.js +127 -0
  385. package/dist/kernel/unified-memory-migration.js +1 -1
  386. package/dist/learning/checkpoint-shrink-ack.d.ts +25 -0
  387. package/dist/learning/checkpoint-shrink-ack.js +57 -0
  388. package/dist/learning/dream/dream-engine.d.ts +44 -3
  389. package/dist/learning/dream/dream-engine.js +6 -2
  390. package/dist/learning/embedder-identity-store.js +3 -1
  391. package/dist/learning/embedding-space-legacy-adoption.d.ts +53 -0
  392. package/dist/learning/embedding-space-legacy-adoption.js +115 -0
  393. package/dist/learning/embedding-space-registry.d.ts +15 -0
  394. package/dist/learning/embedding-space-registry.js +50 -11
  395. package/dist/learning/experience-capture.d.ts +3 -1
  396. package/dist/learning/experience-capture.js +15 -5
  397. package/dist/learning/experience-space-verification.d.ts +2 -0
  398. package/dist/learning/experience-space-verification.js +3 -2
  399. package/dist/learning/learning-retention.js +4 -0
  400. package/dist/learning/pattern-promotion.d.ts +7 -0
  401. package/dist/learning/pattern-promotion.js +64 -12
  402. package/dist/learning/real-embeddings.js +31 -7
  403. package/dist/learning/rvf-pattern-store.js +6 -1
  404. package/dist/mcp/bundle.js +570 -558
  405. package/dist/mcp/handlers/domain-handler-configs.d.ts +3 -0
  406. package/dist/mcp/handlers/domain-handler-configs.js +1 -0
  407. package/dist/mcp/handlers/heartbeat-handlers.d.ts +4 -2
  408. package/dist/mcp/tools/learning-optimization/optimize.d.ts +6 -1
  409. package/dist/mcp/tools/learning-optimization/optimize.js +20 -11
  410. package/dist/planning/goap-planner.js +4 -0
  411. package/dist/planning/plan-executor.js +6 -2
  412. package/dist/shared/git/git-analyzer.d.ts +30 -11
  413. package/dist/shared/git/git-analyzer.js +95 -48
  414. package/dist/shared/io/confined-read.d.ts +32 -7
  415. package/dist/shared/io/confined-read.js +58 -25
  416. package/dist/shared/io/file-reader.js +4 -1
  417. package/dist/shared/safe-db.d.ts +1 -1
  418. package/dist/shared/safe-db.js +20 -5
  419. package/dist/shared/sqlite-journal-mode.d.ts +39 -0
  420. package/dist/shared/sqlite-journal-mode.js +53 -0
  421. package/dist/sync/claude-flow-bridge.js +1 -1
  422. package/dist/sync/readers/sqlite-reader.js +3 -4
  423. package/dist/sync/writers/sqlite-writer.js +1 -1
  424. package/dist/workers/interfaces.d.ts +2 -2
  425. package/dist/workers/quality-daemon/git-watcher.d.ts +8 -0
  426. package/dist/workers/quality-daemon/git-watcher.js +54 -12
  427. package/dist/workers/quality-daemon/index.js +1 -1
  428. package/dist/workers/quality-daemon/priority-queue.d.ts +2 -1
  429. package/dist/workers/workers/defect-predictor.d.ts +9 -4
  430. package/dist/workers/workers/defect-predictor.js +98 -37
  431. package/package.json +1 -1
  432. package/dist/cli/chunks/adapter-OMILP6KH.js +0 -2
  433. package/dist/cli/chunks/aqe-learning-engine-OXH5CCOS.js +0 -2
  434. package/dist/cli/chunks/base-MAK2BLTG.js +0 -2
  435. package/dist/cli/chunks/brain-handler-GCQZFZGQ.js +0 -95
  436. package/dist/cli/chunks/browser-workflow-IR3VF2TL.js +0 -2
  437. package/dist/cli/chunks/chunk-4EJLHNER.js +0 -12
  438. package/dist/cli/chunks/chunk-A4BVDYIL.js +0 -2
  439. package/dist/cli/chunks/chunk-BE7ZHM34.js +0 -3
  440. package/dist/cli/chunks/chunk-DHKSPOUQ.js +0 -16
  441. package/dist/cli/chunks/chunk-FAQ24UHB.js +0 -29
  442. package/dist/cli/chunks/chunk-IOWEBPXJ.js +0 -5
  443. package/dist/cli/chunks/chunk-KB34MTFZ.js +0 -3
  444. package/dist/cli/chunks/chunk-MCXW3DKE.js +0 -8
  445. package/dist/cli/chunks/chunk-O7VJ3VKD.js +0 -2
  446. package/dist/cli/chunks/chunk-PIWGKGWP.js +0 -3
  447. package/dist/cli/chunks/chunk-SFITYZLV.js +0 -7
  448. package/dist/cli/chunks/chunk-TIVKDIF7.js +0 -2
  449. package/dist/cli/chunks/client-NO5FOWT4.js +0 -2
  450. package/dist/cli/chunks/core-handlers-JNAZPXE2.js +0 -2
  451. package/dist/cli/chunks/cross-domain-router-HEBM767Z.js +0 -2
  452. package/dist/cli/chunks/daemon-JEBJGEUK.js +0 -18
  453. package/dist/cli/chunks/dream-GQDCEJMS.js +0 -2
  454. package/dist/cli/chunks/embed-and-insert-pattern-33KLHDD5.js +0 -3
  455. package/dist/cli/chunks/file-discovery-33USPLB5.js +0 -2
  456. package/dist/cli/chunks/heartbeat-scheduler-LIXLC5IH.js +0 -2
  457. package/dist/cli/chunks/hnsw-adapter-62D5UH27.js +0 -2
  458. package/dist/cli/chunks/hnsw-index-GSGUMQQC.js +0 -2
  459. package/dist/cli/chunks/hybrid-backend-FRWP4BOY.js +0 -2
  460. package/dist/cli/chunks/impact-analyzer-7KF3AQXV.js +0 -2
  461. package/dist/cli/chunks/init-wizard-XWWAXY25.js +0 -2
  462. package/dist/cli/chunks/kernel-ZEJPNDBW.js +0 -2
  463. package/dist/cli/chunks/knowledge-graph-RRZQS7KY.js +0 -2
  464. package/dist/cli/chunks/llm-router-service-3OSW67LC.js +0 -2
  465. package/dist/cli/chunks/load-test-7TRIH2WJ.js +0 -2
  466. package/dist/cli/chunks/memory-backend-G7ZW6Q2B.js +0 -2
  467. package/dist/cli/chunks/memory-handlers-TPF3KCO5.js +0 -2
  468. package/dist/cli/chunks/pattern-null-store-OU3ZC3NR.js +0 -2
  469. package/dist/cli/chunks/project-root-GMOFJEKD.js +0 -2
  470. package/dist/cli/chunks/protocol-executor-AD345XRO.js +0 -2
  471. package/dist/cli/chunks/qe-reasoning-bank-NLTP26RC.js +0 -2
  472. package/dist/cli/chunks/queen-coordinator-2TB4FWS6.js +0 -2
  473. package/dist/cli/chunks/real-embeddings-II6CXTCI.js +0 -2
  474. package/dist/cli/chunks/router-PLM3MWME.js +0 -2
  475. package/dist/cli/chunks/routing-feedback-I7VOX2HU.js +0 -2
  476. package/dist/cli/chunks/rvf-dual-writer-GQZHFWO2.js +0 -2
  477. package/dist/cli/chunks/rvf-migration-adapter-3TVKBCAM.js +0 -2
  478. package/dist/cli/chunks/rvf-migration-coordinator-XUHKLMT6.js +0 -2
  479. package/dist/cli/chunks/rvf-native-adapter-5GUTYOWS.js +0 -2
  480. package/dist/cli/chunks/safe-db-RZPQGLGQ.js +0 -2
  481. package/dist/cli/chunks/schedule-G7JMQDUX.js +0 -2
  482. package/dist/cli/chunks/scheduler-4SEGPCKD.js +0 -2
  483. package/dist/cli/chunks/sqlite-persistence-IVE4SQXR.js +0 -2
  484. package/dist/cli/chunks/sync-PM6D7EQF.js +0 -2
  485. package/dist/cli/chunks/test-runner-process-72YACW6M.js +0 -2
  486. package/dist/cli/chunks/token-bootstrap-DJNETMVW.js +0 -2
  487. package/dist/cli/chunks/tree-sitter-wasm-parser-UVWSDXFR.js +0 -2
  488. package/dist/cli/chunks/unified-memory-2VMGSGQL.js +0 -2
  489. package/dist/cli/chunks/unified-memory-hnsw-3KULVD3N.js +0 -2
  490. package/dist/cli/chunks/unified-persistence-QCSLU2SV.js +0 -2
  491. package/dist/cli/chunks/visual-security-ZYP2KPH7.js +0 -2
  492. package/dist/cli/chunks/witness-chain-5QRT7EMX.js +0 -2
  493. package/dist/cli/chunks/witness-chain-repair-CUF2AFQB.js +0 -2
  494. package/dist/cli/chunks/workflow-orchestrator-RYDDWIXN.js +0 -2
  495. package/dist/cli/chunks/wrappers-CYQBOMPL.js +0 -2
@@ -8,7 +8,7 @@ import { ok, err } from '../../shared/types/index.js';
8
8
  import { toError } from '../../shared/error-utils.js';
9
9
  import { requirePayloadPath } from '../../shared/io/payload-path-guard.js';
10
10
  import { buildEstimatedCoverage, collectRustCoverage, findCargoRoot, isCoverageExecDisabled, isRustProject, } from './coverage-collection.js';
11
- import { describeNoData, evaluateCoverageForTarget, isUnmeasured, packageFilterForTarget, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
11
+ import { describeNoData, describeRefusedReports, evaluateCoverageForTarget, isUnmeasured, packageFilterForTarget, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
12
12
  import { describeEvidence, describeExcludedEntries } from './coverage-evidence.js';
13
13
  import { randomUUID } from 'crypto';
14
14
  import * as path from 'path';
@@ -56,7 +56,10 @@ function instrumented(files) {
56
56
  function fromEvaluation(evaluation, ranTests, projectRoot) {
57
57
  return evaluation.status === 'measured'
58
58
  ? { collected: instrumented(evaluation.files), ranTests, projectRoot, evidence: evaluation.evidence }
59
- : { collected: null, ranTests, noData: evaluation.reason, projectRoot };
59
+ : {
60
+ collected: null, ranTests, noData: evaluation.reason, projectRoot,
61
+ ...(evaluation.refused ? { refused: evaluation.refused } : {}),
62
+ };
60
63
  }
61
64
  /**
62
65
  * Collect coverage for a target, preferring real measurement over estimation
@@ -83,8 +86,13 @@ async function collectCoverage(targetPath) {
83
86
  if (existing.status === 'evaluated') {
84
87
  return fromEvaluation(existing.evaluation, false, existing.projectRoot);
85
88
  }
86
- const { target } = existing;
87
- let projectRoot = existing.projectRoot;
89
+ // #1186: a report that exists but was refused is named in the result,
90
+ // whatever the run or estimate below produces.
91
+ const result = await collectWithoutReport(existing.target, existing.projectRoot);
92
+ return existing.refused.length > 0 ? { ...result, refused: existing.refused } : result;
93
+ }
94
+ /** Steps 2-3 of the cascade: no usable report exists at the project root. */
95
+ async function collectWithoutReport(target, projectRoot) {
88
96
  // #569 work item 1: delegate to real instrumentation where available.
89
97
  if (isRustProject(target)) {
90
98
  const rust = await collectRustCoverage(target);
@@ -171,9 +179,9 @@ async function collectCoverage(targetPath) {
171
179
  };
172
180
  }
173
181
  /** Caller-facing explanation for a result with no coverage figures. */
174
- function noDataWarning(reason, ranTests, targetPath, projectRoot) {
182
+ function noDataWarning(reason, ranTests, targetPath, projectRoot, refused = []) {
175
183
  if (reason)
176
- return describeNoData(reason, targetPath, projectRoot);
184
+ return describeNoData(reason, targetPath, projectRoot, refused);
177
185
  return ranTests
178
186
  ? 'Tests ran but no coverage output was generated. Ensure a coverage provider is configured (e.g., @vitest/coverage-v8, istanbul).'
179
187
  : 'No coverage data found and could not run tests automatically. ' + estimationGuidance(targetPath);
@@ -213,7 +221,9 @@ export function registerCoverageHandlers(ctx) {
213
221
  }
214
222
  const analyzer = ctx.getCoverageAnalyzer();
215
223
  const threshold = payload.threshold || 80;
216
- const { collected, ranTests, noData, projectRoot, notes, runStatus, testRun, evidence } = await collectCoverage(targetPath);
224
+ const { collected, ranTests, noData, projectRoot, notes, runStatus, testRun, evidence, refused } = await collectCoverage(targetPath);
225
+ // #1186: a refused report is named, never reported as a missing one.
226
+ const refusedNote = refused?.length && noData !== 'refused-report' ? [describeRefusedReports(refused)] : [];
217
227
  // #995 review N5: say so plainly instead of "no coverage data found".
218
228
  if (noData === 'target-missing') {
219
229
  return err(new Error(describeNoData('target-missing', targetPath, null)));
@@ -234,7 +244,10 @@ export function registerCoverageHandlers(ctx) {
234
244
  // #995(d): "no measurement exists for this target", distinct from 0%.
235
245
  ...(unmeasured ? { unmeasured: true } : {}),
236
246
  algorithm: 'sublinear-O(log n)',
237
- warning: notes?.length ? notes.join(' ') : noDataWarning(noData, ranTests, targetPath, projectRoot),
247
+ warning: [
248
+ ...refusedNote,
249
+ notes?.length ? notes.join(' ') : noDataWarning(noData, ranTests, targetPath, projectRoot, refused),
250
+ ].join(' '),
238
251
  });
239
252
  }
240
253
  const { data: coverageData, provenance } = collected;
@@ -283,7 +296,7 @@ export function registerCoverageHandlers(ctx) {
283
296
  // sources, leave the evidence insufficient: the figures stand for the
284
297
  // measured files only, and the threshold is not met on them.
285
298
  const evidenceReasons = describeEvidence(evidence, projectRoot ?? targetPath);
286
- const warnings = [...provenance.notes, ...(notes ?? [])];
299
+ const warnings = [...refusedNote, ...provenance.notes, ...(notes ?? [])];
287
300
  if (provenance.estimated)
288
301
  warnings.push(estimationGuidance(targetPath));
289
302
  if (evidenceReasons.length > 0) {
@@ -19,6 +19,7 @@
19
19
  * and the CLI `coverage` command can share it.
20
20
  */
21
21
  import type { CoverageData, FileCoverage } from '../../domains/coverage-analysis/interfaces';
22
+ import { type RefusedCoverageReport } from './handler-utils';
22
23
  import { type CoverageEvidence } from './coverage-evidence';
23
24
  /**
24
25
  * Walk up from a target to the nearest directory that holds a project marker.
@@ -52,6 +53,14 @@ export declare function isCoverageReportFile(filePath: string): boolean;
52
53
  * can't be parsed, or lists no files.
53
54
  */
54
55
  export declare function loadCoverageReportFile(filePath: string): Promise<CoverageData | null>;
56
+ /**
57
+ * `loadCoverageReportFile`, plus why the report was refused unread when it
58
+ * was (#1186), so a refused report is not described as an unparseable one.
59
+ */
60
+ export declare function readCoverageReportFile(filePath: string): Promise<{
61
+ data: CoverageData | null;
62
+ refused?: RefusedCoverageReport;
63
+ }>;
55
64
  /**
56
65
  * Keep only the report entries that lie under `target`.
57
66
  *
@@ -67,6 +76,8 @@ export type NoDataReason =
67
76
  'target-missing'
68
77
  /** A coverage report was given but cannot be parsed (malformed, raw V8, empty). */
69
78
  | 'unreadable-report'
79
+ /** A coverage report exists but was refused unread (#1186): see `refused`. */
80
+ | 'refused-report'
70
81
  /** The report lists only test files. */
71
82
  | 'test-only-report'
72
83
  /** The report has no entries under the target — it did not measure it. */
@@ -80,6 +91,7 @@ export type CoverageEvaluation = {
80
91
  } | {
81
92
  status: 'no-data';
82
93
  reason: NoDataReason;
94
+ refused?: RefusedCoverageReport[];
83
95
  };
84
96
  /**
85
97
  * Decide what a report says about `target`. Shared by the MCP handler and the
@@ -104,10 +116,13 @@ export declare function evaluateCoverageForTarget(report: CoverageData, projectR
104
116
  export type ExistingCoverage = {
105
117
  status: 'target-missing';
106
118
  target: string;
107
- } | {
119
+ }
120
+ /** `refused`: reports that exist but were not read (#1186); empty when none exists. */
121
+ | {
108
122
  status: 'no-report';
109
123
  target: string;
110
124
  projectRoot: string;
125
+ refused: RefusedCoverageReport[];
111
126
  } | {
112
127
  status: 'evaluated';
113
128
  target: string;
@@ -159,6 +174,11 @@ export declare function reconcileRecommendations(recommendations: string[], verd
159
174
  }): string[];
160
175
  /** Is this verdict "no measurement exists" (as opposed to an error or test-only report)? */
161
176
  export declare function isUnmeasured(reason: NoDataReason): boolean;
177
+ /**
178
+ * Why existing coverage reports were not used (#1186). A refused report is
179
+ * named with its reason, never described as a missing one. Shared by MCP and CLI.
180
+ */
181
+ export declare function describeRefusedReports(refused: readonly RefusedCoverageReport[]): string;
162
182
  /** Caller-facing explanation of a no-data verdict. Shared by MCP and CLI. */
163
- export declare function describeNoData(reason: NoDataReason, target: string, projectRoot: string | null): string;
183
+ export declare function describeNoData(reason: NoDataReason, target: string, projectRoot: string | null, refused?: readonly RefusedCoverageReport[]): string;
164
184
  //# sourceMappingURL=coverage-target.d.ts.map
@@ -19,10 +19,10 @@
19
19
  * and the CLI `coverage` command can share it.
20
20
  */
21
21
  import * as fs from 'fs';
22
- import { readConfinedText, readConfinedTextSync } from '../../shared/io/confined-read.js';
22
+ import { ConfinedReadError, readConfinedText, readConfinedTextSync } from '../../shared/io/confined-read.js';
23
23
  import * as os from 'os';
24
24
  import * as path from 'path';
25
- import { loadCoverageReport, parseCoberturaXml, parseCoverageJson, parseCoverageSummaryJson, parseLcovInfo, } from './handler-utils.js';
25
+ import { findCoverageReport, parseCoberturaXml, parseCoverageJson, parseCoverageSummaryJson, parseLcovInfo, } from './handler-utils.js';
26
26
  import { isTestPath } from './coverage-collection.js';
27
27
  import { assessCoverageEvidence } from './coverage-evidence.js';
28
28
  import { findProjectRoot } from '../../kernel/project-root.js';
@@ -327,15 +327,28 @@ export function isCoverageReportFile(filePath) {
327
327
  * can't be parsed, or lists no files.
328
328
  */
329
329
  export async function loadCoverageReportFile(filePath) {
330
+ return (await readCoverageReportFile(filePath)).data;
331
+ }
332
+ /**
333
+ * `loadCoverageReportFile`, plus why the report was refused unread when it
334
+ * was (#1186), so a refused report is not described as an unparseable one.
335
+ */
336
+ export async function readCoverageReportFile(filePath) {
330
337
  let content;
331
338
  try {
332
339
  // #1161: read from the validated descriptor, not the name checked earlier;
333
340
  // a report linked out of the project, or to a device, is not read.
334
341
  content = await readConfinedText(filePath, { outsideRoot: 'allow' });
335
342
  }
336
- catch {
337
- return null;
343
+ catch (error) {
344
+ if (error instanceof ConfinedReadError && error.reason !== 'not-found') {
345
+ return { data: null, refused: { path: filePath, reason: error.reason } };
346
+ }
347
+ return { data: null };
338
348
  }
349
+ return { data: parseCoverageReportContent(filePath, content) };
350
+ }
351
+ function parseCoverageReportContent(filePath, content) {
339
352
  if (content.trim().length === 0)
340
353
  return null;
341
354
  try {
@@ -469,17 +482,19 @@ export async function resolveExistingCoverage(targetPath) {
469
482
  const reportDir = path.dirname(target);
470
483
  const projectRoot = findCoverageProjectRoot(reportDir)
471
484
  ?? (path.basename(reportDir) === 'coverage' ? path.dirname(reportDir) : reportDir);
472
- const report = await loadCoverageReportFile(target);
485
+ const { data: report, refused } = await readCoverageReportFile(target);
473
486
  // The report itself is the target: judged whole, but still checked for staleness.
474
487
  const evaluation = report
475
488
  ? evaluateCoverageForTarget(report, projectRoot, projectRoot, { reportPath: target, checkCompleteness: false })
476
- : { status: 'no-data', reason: 'unreadable-report' };
489
+ : refused
490
+ ? { status: 'no-data', reason: 'refused-report', refused: [refused] }
491
+ : { status: 'no-data', reason: 'unreadable-report' };
477
492
  return { status: 'evaluated', target, projectRoot, source: 'report-file', evaluation };
478
493
  }
479
494
  const projectRoot = findCoverageProjectRoot(target) ?? (stat.isDirectory() ? target : path.dirname(target));
480
- const existing = await loadCoverageReport(projectRoot);
495
+ const { report: existing, refused } = await findCoverageReport(projectRoot);
481
496
  if (!existing)
482
- return { status: 'no-report', target, projectRoot };
497
+ return { status: 'no-report', target, projectRoot, refused };
483
498
  return {
484
499
  status: 'evaluated', target, projectRoot, source: 'project-report',
485
500
  evaluation: evaluateCoverageForTarget(existing.data, projectRoot, target, { reportPath: existing.path }),
@@ -526,11 +541,32 @@ export function reconcileRecommendations(recommendations, verdict, threshold, co
526
541
  export function isUnmeasured(reason) {
527
542
  return reason === 'target-not-covered' || reason === 'no-tests-ran';
528
543
  }
544
+ const REFUSAL_EXPLANATIONS = {
545
+ 'outside-project-root': 'it resolves outside the project (a symlink pointing out of it)',
546
+ 'not-a-file': 'it is not a regular file (a FIFO, device or directory)',
547
+ 'too-large': 'it is over the read size limit',
548
+ 'changed-during-read': 'it was replaced or removed while it was being read',
549
+ 'hardlinked': 'it has more than one hardlink',
550
+ 'unreadable': 'it could not be opened (permissions)',
551
+ };
552
+ /**
553
+ * Why existing coverage reports were not used (#1186). A refused report is
554
+ * named with its reason, never described as a missing one. Shared by MCP and CLI.
555
+ */
556
+ export function describeRefusedReports(refused) {
557
+ const items = refused.map(r => `${r.path} (${r.reason}: ${Object.hasOwn(REFUSAL_EXPLANATIONS, r.reason) ? REFUSAL_EXPLANATIONS[r.reason] : r.reason})`);
558
+ return `Coverage report refused and not read: ${items.join('; ')}. ` +
559
+ 'Write the report as a regular file inside the project, or pass a report file inside the project as the target.';
560
+ }
529
561
  /** Caller-facing explanation of a no-data verdict. Shared by MCP and CLI. */
530
- export function describeNoData(reason, target, projectRoot) {
562
+ export function describeNoData(reason, target, projectRoot, refused = []) {
531
563
  switch (reason) {
532
564
  case 'target-missing':
533
565
  return `Target does not exist: ${target}`;
566
+ case 'refused-report':
567
+ return refused.length > 0
568
+ ? describeRefusedReports(refused)
569
+ : `Coverage report refused and not read: ${target}.`;
534
570
  case 'unreadable-report':
535
571
  return `Unreadable coverage report: ${target}. It could not be parsed or lists no files. ` +
536
572
  'Supported: lcov.info, istanbul coverage-final.json / coverage-summary.json, Cobertura XML. ' +
@@ -4,6 +4,7 @@
4
4
  * These were originally module-level helpers in task-executor.ts and are
5
5
  * now co-located with the handlers that use them.
6
6
  */
7
+ import { type ConfinedReadReason } from '../../shared/io/confined-read.js';
7
8
  import type { CoverageData } from '../../domains/coverage-analysis';
8
9
  /**
9
10
  * Istanbul/nyc coverage-final.json file data structure
@@ -79,6 +80,24 @@ export declare function loadCoverageReport(targetPath: string): Promise<{
79
80
  data: CoverageData;
80
81
  path: string;
81
82
  } | null>;
83
+ /** A coverage report that exists but was refused unread (#1186). */
84
+ export interface RefusedCoverageReport {
85
+ path: string;
86
+ reason: ConfinedReadReason;
87
+ }
88
+ /**
89
+ * `loadCoverageReport` plus the reports that were refused unread (#1186): a
90
+ * report linked out of the project, a FIFO or device, or one over the size
91
+ * limit is not a missing report, and the caller must be able to say why it
92
+ * was not used.
93
+ */
94
+ export declare function findCoverageReport(targetPath: string): Promise<{
95
+ report: {
96
+ data: CoverageData;
97
+ path: string;
98
+ } | null;
99
+ refused: RefusedCoverageReport[];
100
+ }>;
82
101
  /**
83
102
  * Per-line hit counts of one istanbul file entry, computed the way istanbul's
84
103
  * own `FileCoverage#getLineCoverage` (and therefore coverage-summary.json
@@ -5,7 +5,7 @@
5
5
  * now co-located with the handlers that use them.
6
6
  */
7
7
  import * as fs from 'fs/promises';
8
- import { readConfinedText } from '../../shared/io/confined-read.js';
8
+ import { ConfinedReadError, readConfinedText } from '../../shared/io/confined-read.js';
9
9
  import * as path from 'path';
10
10
  import { isAqeManagedDir } from '../../shared/aqe-managed-dirs.js';
11
11
  import { safeJsonParse } from '../../shared/safe-json.js';
@@ -20,6 +20,16 @@ export async function loadCoverageData(targetPath) {
20
20
  }
21
21
  /** `loadCoverageData` plus the path of the report it read (#1154: staleness needs it). */
22
22
  export async function loadCoverageReport(targetPath) {
23
+ return (await findCoverageReport(targetPath)).report;
24
+ }
25
+ /**
26
+ * `loadCoverageReport` plus the reports that were refused unread (#1186): a
27
+ * report linked out of the project, a FIFO or device, or one over the size
28
+ * limit is not a missing report, and the caller must be able to say why it
29
+ * was not used.
30
+ */
31
+ export async function findCoverageReport(targetPath) {
32
+ const refused = [];
23
33
  // Try various coverage file locations (JS, Python, Java, etc.)
24
34
  const coverageLocations = [
25
35
  // JavaScript/TypeScript (Istanbul/nyc/vitest)
@@ -40,23 +50,27 @@ export async function loadCoverageReport(targetPath) {
40
50
  // #1161: a report linked out of the project, or to a device, is not read.
41
51
  const content = await readConfinedText(coveragePath, { outsideRoot: 'allow' });
42
52
  if (coveragePath.endsWith('coverage-summary.json')) {
43
- return { data: parseCoverageSummaryJson(content), path: coveragePath };
53
+ return { report: { data: parseCoverageSummaryJson(content), path: coveragePath }, refused };
44
54
  }
45
55
  else if (coveragePath.endsWith('.json')) {
46
- return { data: parseCoverageJson(content), path: coveragePath };
56
+ return { report: { data: parseCoverageJson(content), path: coveragePath }, refused };
47
57
  }
48
58
  else if (coveragePath.endsWith('.info')) {
49
- return { data: parseLcovInfo(content), path: coveragePath };
59
+ return { report: { data: parseLcovInfo(content), path: coveragePath }, refused };
50
60
  }
51
61
  else if (coveragePath.endsWith('.xml')) {
52
- return { data: parseCoberturaXml(content), path: coveragePath };
62
+ return { report: { data: parseCoberturaXml(content), path: coveragePath }, refused };
53
63
  }
54
64
  }
55
- catch {
56
- // File not found, try next
65
+ catch (error) {
66
+ // Not found (or unparseable): try the next location. A refused report
67
+ // is recorded so it is not reported as a missing one.
68
+ if (error instanceof ConfinedReadError && error.reason !== 'not-found') {
69
+ refused.push({ path: coveragePath, reason: error.reason });
70
+ }
57
71
  }
58
72
  }
59
- return null;
73
+ return { report: null, refused };
60
74
  }
61
75
  /**
62
76
  * Per-line hit counts of one istanbul file entry, computed the way istanbul's
@@ -217,11 +217,14 @@ export class CodeIntelligenceIndexProtocol {
217
217
  if (uncommittedFiles.length > 0) {
218
218
  changedFiles.push(...uncommittedFiles);
219
219
  }
220
- // Then, get committed changes since last index
220
+ // Then, get committed changes since last index. #1165: a git failure or
221
+ // timeout fails the detection; indexing without the committed changes
222
+ // would record a new last-index time and skip them for good.
221
223
  const gitChanges = await this.detectGitChanges(lastIndexTime);
222
- if (gitChanges.success) {
223
- changedFiles.push(...gitChanges.value);
224
+ if (!gitChanges.success) {
225
+ return gitChanges;
224
226
  }
227
+ changedFiles.push(...gitChanges.value);
225
228
  // Deduplicate
226
229
  const uniqueFiles = [...new Set(changedFiles)];
227
230
  return ok(uniqueFiles);
@@ -12,8 +12,9 @@
12
12
  * - The active record must still be the selected pattern (same id, and the
13
13
  * same scores and last use) when the archive runs, or nothing is written or
14
14
  * deleted. A pattern used or re-scored since it was selected is left active.
15
- * - The archive copy is read back before the active key is deleted, so a
16
- * failed write never loses the pattern.
15
+ * - The archive copy is read back and compared in full before the active
16
+ * key is deleted, so a failed write never loses the pattern; the delete is
17
+ * a compare-and-delete against that copy (#1149).
17
18
  * The move is implemented in domains/learning-optimization/pattern-archive.ts.
18
19
  */
19
20
  import type { LearnedPattern } from '../../domains/learning-optimization/interfaces.js';
@@ -24,8 +25,10 @@ export interface ArchiveCounts {
24
25
  selected: number;
25
26
  /** Selected patterns moved to `:archived:` and removed from the active set. */
26
27
  archived: number;
27
- /** Selected patterns whose active record was gone or changed; left alone. */
28
+ /** Selected patterns whose active record was gone; nothing written. */
28
29
  missing: number;
30
+ /** Selected patterns changed since selection or during the move; left active (#1149). */
31
+ changed: number;
29
32
  /** Selected patterns whose archive copy could not be verified; left active. */
30
33
  failed: number;
31
34
  }
@@ -12,15 +12,16 @@
12
12
  * - The active record must still be the selected pattern (same id, and the
13
13
  * same scores and last use) when the archive runs, or nothing is written or
14
14
  * deleted. A pattern used or re-scored since it was selected is left active.
15
- * - The archive copy is read back before the active key is deleted, so a
16
- * failed write never loses the pattern.
15
+ * - The archive copy is read back and compared in full before the active
16
+ * key is deleted, so a failed write never loses the pattern; the delete is
17
+ * a compare-and-delete against that copy (#1149).
17
18
  * The move is implemented in domains/learning-optimization/pattern-archive.ts.
18
19
  */
19
20
  // The move itself lives with the patterns, so the merge path in
20
21
  // LearningCoordinatorService uses the same read-back rule (#1106).
21
22
  export { archiveSelectedPattern } from '../../domains/learning-optimization/pattern-archive.js';
22
23
  export function emptyArchiveCounts() {
23
- return { selected: 0, archived: 0, missing: 0, failed: 0 };
24
+ return { selected: 0, archived: 0, missing: 0, changed: 0, failed: 0 };
24
25
  }
25
26
  /** True when the pattern was created less than `graceDays` days ago. */
26
27
  export function isWithinRetentionGrace(pattern, graceDays, now = Date.now()) {
@@ -304,6 +304,7 @@ function continuousLearningWorkflow() {
304
304
  outputMapping: {
305
305
  transferSuccessRate: 'transfer.successRate',
306
306
  newPatternsCreated: 'transfer.newPatterns',
307
+ mergeFailures: 'transfer.mergeFailures',
307
308
  },
308
309
  },
309
310
  {
@@ -30,6 +30,8 @@ export interface PredictionResult {
30
30
  factors: string[];
31
31
  /** ADR-051: LLM-enhanced analysis when enabled */
32
32
  llmAnalysis?: LLMDefectAnalysis;
33
+ /** #1137: the run was stored, but pruning older runs failed. */
34
+ retention?: 'failed';
33
35
  }
34
36
  /**
35
37
  * ADR-051: LLM-enhanced defect analysis result
@@ -1,5 +1,7 @@
1
1
  import type { MemoryBackend } from '../../kernel/interfaces.js';
2
2
  export declare const MAX_PREDICTION_HISTORY = 32;
3
+ /** Longest `target` a prediction run may name (Linux PATH_MAX) (#1137). */
4
+ export declare const MAX_PREDICTION_TARGET_LENGTH = 4096;
3
5
  type RiskLevel = 'critical' | 'high' | 'medium' | 'low' | 'info';
4
6
  /** One file prediction as the defect-intelligence predictor recorded it. */
5
7
  export interface DomainFilePrediction {
@@ -12,16 +14,28 @@ export interface DomainFilePrediction {
12
14
  }[];
13
15
  recommendations: string[];
14
16
  }
17
+ /**
18
+ * #1137: the target a run for an explicit file list covers. A list too long
19
+ * to store as a target is identified by its digest.
20
+ */
21
+ export declare function predictionTargetForFiles(files: readonly string[]): string;
15
22
  /** A recorded prediction run, or `null` when the record is not a usable one. */
16
23
  export declare function parsePredictionRecord(raw: unknown, now: number): {
17
24
  id: string;
18
25
  timestamp: string;
19
26
  predictions: DomainFilePrediction[];
27
+ /** What the run covered; '' for runs recorded before #1137. */
28
+ target: string;
20
29
  predictionMethod?: 'static-code-indicators';
21
30
  estimated?: true;
22
31
  filesSkipped?: number;
23
32
  } | null;
24
- /** Keep 32 usable immutable UUID runs, preserving tied-latest ambiguity. */
33
+ /**
34
+ * Bound the stored prediction runs: delete runs older than 7 days and usable
35
+ * runs beyond the cap. A row this version cannot parse (stamped ahead by
36
+ * another host's clock, or a riskLevel from a newer release) is left to its
37
+ * TTL rather than deleted on this version's schema (#1137).
38
+ */
25
39
  export declare function prunePredictionHistory(memory: Pick<MemoryBackend, 'search' | 'get' | 'delete'>, modelNamespace?: string): Promise<void>;
26
40
  export {};
27
41
  //# sourceMappingURL=prediction-history.d.ts.map
@@ -1,4 +1,7 @@
1
+ import { createHash } from 'node:crypto';
1
2
  export const MAX_PREDICTION_HISTORY = 32;
3
+ /** Longest `target` a prediction run may name (Linux PATH_MAX) (#1137). */
4
+ export const MAX_PREDICTION_TARGET_LENGTH = 4096;
2
5
  const MAX_PREDICTION_AGE_MS = 7 * 24 * 60 * 60 * 1000;
3
6
  const NAMESPACE = 'defect-intelligence';
4
7
  const RISK_LEVELS = ['critical', 'high', 'medium', 'low', 'info'];
@@ -21,6 +24,16 @@ function parseFilePrediction(raw) {
21
24
  : [];
22
25
  return { file, probability, riskLevel: riskLevel, factors, recommendations };
23
26
  }
27
+ /**
28
+ * #1137: the target a run for an explicit file list covers. A list too long
29
+ * to store as a target is identified by its digest.
30
+ */
31
+ export function predictionTargetForFiles(files) {
32
+ const target = `files:${[...new Set(files)].sort().join(',')}`;
33
+ return target.length <= MAX_PREDICTION_TARGET_LENGTH
34
+ ? target
35
+ : `files-sha256:${createHash('sha256').update(target).digest('hex')}`;
36
+ }
24
37
  /** A recorded prediction run, or `null` when the record is not a usable one. */
25
38
  export function parsePredictionRecord(raw, now) {
26
39
  if (!isRecord(raw) || typeof raw.id !== 'string' || typeof raw.timestamp !== 'string')
@@ -28,6 +41,8 @@ export function parsePredictionRecord(raw, now) {
28
41
  const t = Date.parse(raw.timestamp);
29
42
  if (!Number.isFinite(t) || t > now + 60_000 || now - t > MAX_PREDICTION_AGE_MS)
30
43
  return null;
44
+ if (raw.target !== undefined && (typeof raw.target !== 'string' || raw.target.length > MAX_PREDICTION_TARGET_LENGTH))
45
+ return null;
31
46
  if (!Array.isArray(raw.predictions) || raw.predictions.length === 0)
32
47
  return null;
33
48
  const predictions = raw.predictions.map(parseFilePrediction);
@@ -35,6 +50,7 @@ export function parsePredictionRecord(raw, now) {
35
50
  return null;
36
51
  return {
37
52
  id: raw.id, timestamp: raw.timestamp, predictions: predictions,
53
+ target: raw.target ?? '',
38
54
  ...(raw.predictionMethod === 'static-code-indicators' ? {
39
55
  predictionMethod: 'static-code-indicators', estimated: true,
40
56
  filesSkipped: typeof raw.filesSkipped === 'number' && Number.isSafeInteger(raw.filesSkipped) && raw.filesSkipped >= 0
@@ -42,26 +58,66 @@ export function parsePredictionRecord(raw, now) {
42
58
  } : {}),
43
59
  };
44
60
  }
45
- /** Keep 32 usable immutable UUID runs, preserving tied-latest ambiguity. */
61
+ /** Milliseconds since the epoch the record claims, or `null` when it names no parseable time. */
62
+ function recordTime(raw) {
63
+ if (!isRecord(raw) || typeof raw.timestamp !== 'string')
64
+ return null;
65
+ const t = Date.parse(raw.timestamp);
66
+ return Number.isFinite(t) ? t : null;
67
+ }
68
+ /**
69
+ * #1137: the latest run of every target stays (with any run tied with it, so
70
+ * the worker still sees the ambiguity), most recently predicted targets first;
71
+ * the newest other runs fill what is left. Never more than the cap in total.
72
+ */
73
+ function selectRetained(newestFirst) {
74
+ const latestAt = new Map();
75
+ const latest = [];
76
+ for (const run of newestFirst) {
77
+ const at = latestAt.get(run.target);
78
+ if (at === undefined)
79
+ latestAt.set(run.target, run.timestamp);
80
+ if (at === undefined || at === run.timestamp)
81
+ latest.push(run);
82
+ }
83
+ const keep = new Set(latest.slice(0, MAX_PREDICTION_HISTORY).map((run) => run.key));
84
+ for (const run of newestFirst) {
85
+ if (keep.size >= MAX_PREDICTION_HISTORY)
86
+ break;
87
+ keep.add(run.key);
88
+ }
89
+ return keep;
90
+ }
91
+ /**
92
+ * Bound the stored prediction runs: delete runs older than 7 days and usable
93
+ * runs beyond the cap. A row this version cannot parse (stamped ahead by
94
+ * another host's clock, or a riskLevel from a newer release) is left to its
95
+ * TTL rather than deleted on this version's schema (#1137).
96
+ */
46
97
  export async function prunePredictionHistory(memory, modelNamespace = 'defect-intelligence:predictor') {
47
98
  const prefix = `${modelNamespace}:prediction:`;
48
99
  const keys = await memory.search(`${prefix}*`, Number.MAX_SAFE_INTEGER, { namespace: NAMESPACE });
49
100
  const now = Date.now();
50
101
  const records = [];
51
- const invalid = [];
102
+ const expired = [];
52
103
  for (const found of keys) {
53
104
  const key = found.startsWith(`${NAMESPACE}:${prefix}`) ? found.slice(NAMESPACE.length + 1) : found;
54
105
  if (!key.startsWith(prefix))
55
106
  continue;
56
- const parsed = parsePredictionRecord(await memory.get(key, { namespace: NAMESPACE }), now);
107
+ const raw = await memory.get(key, { namespace: NAMESPACE });
108
+ const t = recordTime(raw);
109
+ if (t !== null && now - t > MAX_PREDICTION_AGE_MS) {
110
+ expired.push(key);
111
+ continue;
112
+ }
113
+ const parsed = parsePredictionRecord(raw, now);
57
114
  if (parsed)
58
- records.push({ key, timestamp: Date.parse(parsed.timestamp), id: parsed.id });
59
- else
60
- invalid.push(key);
115
+ records.push({ key, timestamp: Date.parse(parsed.timestamp), id: parsed.id, target: parsed.target });
61
116
  }
62
117
  records.sort((a, b) => b.timestamp - a.timestamp || (a.id === b.id ? (a.key === b.key ? 0 : a.key > b.key ? -1 : 1) : a.id > b.id ? -1 : 1));
118
+ const keep = selectRetained(records);
63
119
  // Only observed immutable keys are candidates; concurrent new runs are untouched.
64
- for (const key of [...invalid, ...records.slice(MAX_PREDICTION_HISTORY).map(record => record.key)]) {
120
+ for (const key of [...expired, ...records.filter((record) => !keep.has(record.key)).map((record) => record.key)]) {
65
121
  await memory.delete(key, { namespace: NAMESPACE });
66
122
  }
67
123
  }
@@ -188,6 +188,7 @@ export declare class DefectPredictorService implements IDefectPredictorService {
188
188
  private generateTestRecommendations;
189
189
  private calculateModelConfidence;
190
190
  private calculateVariance;
191
+ /** Records the run; `false` when it was stored but older runs could not be pruned (#1137). */
191
192
  private storePrediction;
192
193
  private recalculateMetrics;
193
194
  }