@futdevpro/dynamo-e2e 1.17.1 → 1.18.1

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 (313) hide show
  1. package/.dynamo/logs/cicd-pipeline/status.json +33 -32
  2. package/.dynamo/pipeline.cicd.config.json +10 -3
  3. package/CHANGELOG.md +98 -0
  4. package/bin/dye2e.js +170 -0
  5. package/build/_modules/generators/_collections/form-level-emission.util.d.ts.map +1 -1
  6. package/build/_modules/generators/_collections/form-level-emission.util.js +3 -1
  7. package/build/_modules/generators/_collections/form-level-emission.util.js.map +1 -1
  8. package/build/_modules/generators/_collections/test-case-filter.util.d.ts.map +1 -1
  9. package/build/_modules/generators/_collections/test-case-filter.util.js +24 -0
  10. package/build/_modules/generators/_collections/test-case-filter.util.js.map +1 -1
  11. package/build/_modules/generators/_models/form-settings-shape.interface.d.ts +7 -0
  12. package/build/_modules/generators/_models/form-settings-shape.interface.d.ts.map +1 -1
  13. package/build/_modules/generators/form-suite.generator.spec.js +14 -0
  14. package/build/_modules/generators/form-suite.generator.spec.js.map +1 -1
  15. package/build/_modules/generators/test-case-filter-edge.spec.js +37 -4
  16. package/build/_modules/generators/test-case-filter-edge.spec.js.map +1 -1
  17. package/build/_modules/vqa/_collections/constants/anti-flake-css.const.d.ts +8 -0
  18. package/build/_modules/vqa/_collections/constants/anti-flake-css.const.d.ts.map +1 -0
  19. package/build/_modules/vqa/_collections/constants/anti-flake-css.const.js +21 -0
  20. package/build/_modules/vqa/_collections/constants/anti-flake-css.const.js.map +1 -0
  21. package/build/_modules/vqa/_collections/constants/axe-page-script.const.d.ts +21 -0
  22. package/build/_modules/vqa/_collections/constants/axe-page-script.const.d.ts.map +1 -0
  23. package/build/_modules/vqa/_collections/constants/axe-page-script.const.js +57 -0
  24. package/build/_modules/vqa/_collections/constants/axe-page-script.const.js.map +1 -0
  25. package/build/_modules/vqa/_collections/constants/dom-evidence-page-scripts.const.d.ts +13 -0
  26. package/build/_modules/vqa/_collections/constants/dom-evidence-page-scripts.const.d.ts.map +1 -0
  27. package/build/_modules/vqa/_collections/constants/dom-evidence-page-scripts.const.js +318 -0
  28. package/build/_modules/vqa/_collections/constants/dom-evidence-page-scripts.const.js.map +1 -0
  29. package/build/_modules/vqa/_collections/constants/vqa-standard-viewports.const.d.ts +14 -0
  30. package/build/_modules/vqa/_collections/constants/vqa-standard-viewports.const.d.ts.map +1 -0
  31. package/build/_modules/vqa/_collections/constants/vqa-standard-viewports.const.js +82 -0
  32. package/build/_modules/vqa/_collections/constants/vqa-standard-viewports.const.js.map +1 -0
  33. package/build/_modules/vqa/_collections/constants/vqa-tailwind-viewports.const.d.ts +23 -0
  34. package/build/_modules/vqa/_collections/constants/vqa-tailwind-viewports.const.d.ts.map +1 -0
  35. package/build/_modules/vqa/_collections/constants/vqa-tailwind-viewports.const.js +37 -0
  36. package/build/_modules/vqa/_collections/constants/vqa-tailwind-viewports.const.js.map +1 -0
  37. package/build/_modules/vqa/_collections/index.d.ts +10 -0
  38. package/build/_modules/vqa/_collections/index.d.ts.map +1 -0
  39. package/build/_modules/vqa/_collections/index.js +26 -0
  40. package/build/_modules/vqa/_collections/index.js.map +1 -0
  41. package/build/_modules/vqa/_collections/utils/deterministic-finding.util.d.ts +23 -0
  42. package/build/_modules/vqa/_collections/utils/deterministic-finding.util.d.ts.map +1 -0
  43. package/build/_modules/vqa/_collections/utils/deterministic-finding.util.js +112 -0
  44. package/build/_modules/vqa/_collections/utils/deterministic-finding.util.js.map +1 -0
  45. package/build/_modules/vqa/_collections/utils/finding-id.util.d.ts +18 -0
  46. package/build/_modules/vqa/_collections/utils/finding-id.util.d.ts.map +1 -0
  47. package/build/_modules/vqa/_collections/utils/finding-id.util.js +42 -0
  48. package/build/_modules/vqa/_collections/utils/finding-id.util.js.map +1 -0
  49. package/build/_modules/vqa/_collections/utils/finding-validator.util.d.ts +21 -0
  50. package/build/_modules/vqa/_collections/utils/finding-validator.util.d.ts.map +1 -0
  51. package/build/_modules/vqa/_collections/utils/finding-validator.util.js +114 -0
  52. package/build/_modules/vqa/_collections/utils/finding-validator.util.js.map +1 -0
  53. package/build/_modules/vqa/_collections/utils/manifest-validator.util.d.ts +27 -0
  54. package/build/_modules/vqa/_collections/utils/manifest-validator.util.d.ts.map +1 -0
  55. package/build/_modules/vqa/_collections/utils/manifest-validator.util.js +148 -0
  56. package/build/_modules/vqa/_collections/utils/manifest-validator.util.js.map +1 -0
  57. package/build/_modules/vqa/_collections/utils/risk-score.util.d.ts +48 -0
  58. package/build/_modules/vqa/_collections/utils/risk-score.util.d.ts.map +1 -0
  59. package/build/_modules/vqa/_collections/utils/risk-score.util.js +77 -0
  60. package/build/_modules/vqa/_collections/utils/risk-score.util.js.map +1 -0
  61. package/build/_modules/vqa/_enums/dom-evidence-detector.enum.d.ts +44 -0
  62. package/build/_modules/vqa/_enums/dom-evidence-detector.enum.d.ts.map +1 -0
  63. package/build/_modules/vqa/_enums/dom-evidence-detector.enum.js +48 -0
  64. package/build/_modules/vqa/_enums/dom-evidence-detector.enum.js.map +1 -0
  65. package/build/_modules/vqa/_enums/finding-severity.enum.d.ts +17 -0
  66. package/build/_modules/vqa/_enums/finding-severity.enum.d.ts.map +1 -0
  67. package/build/_modules/vqa/_enums/finding-severity.enum.js +21 -0
  68. package/build/_modules/vqa/_enums/finding-severity.enum.js.map +1 -0
  69. package/build/_modules/vqa/_enums/finding-status.enum.d.ts +23 -0
  70. package/build/_modules/vqa/_enums/finding-status.enum.d.ts.map +1 -0
  71. package/build/_modules/vqa/_enums/finding-status.enum.js +27 -0
  72. package/build/_modules/vqa/_enums/finding-status.enum.js.map +1 -0
  73. package/build/_modules/vqa/_enums/index.d.ts +5 -0
  74. package/build/_modules/vqa/_enums/index.d.ts.map +1 -0
  75. package/build/_modules/vqa/_enums/index.js +21 -0
  76. package/build/_modules/vqa/_enums/index.js.map +1 -0
  77. package/build/_modules/vqa/_enums/visual-state-type.enum.d.ts +38 -0
  78. package/build/_modules/vqa/_enums/visual-state-type.enum.d.ts.map +1 -0
  79. package/build/_modules/vqa/_enums/visual-state-type.enum.js +49 -0
  80. package/build/_modules/vqa/_enums/visual-state-type.enum.js.map +1 -0
  81. package/build/_modules/vqa/_models/interfaces/critical-element.interface.d.ts +22 -0
  82. package/build/_modules/vqa/_models/interfaces/critical-element.interface.d.ts.map +1 -0
  83. package/build/_modules/vqa/_models/interfaces/critical-element.interface.js +3 -0
  84. package/build/_modules/vqa/_models/interfaces/critical-element.interface.js.map +1 -0
  85. package/build/_modules/vqa/_models/interfaces/dom-evidence.interface.d.ts +21 -0
  86. package/build/_modules/vqa/_models/interfaces/dom-evidence.interface.d.ts.map +1 -0
  87. package/build/_modules/vqa/_models/interfaces/dom-evidence.interface.js +3 -0
  88. package/build/_modules/vqa/_models/interfaces/dom-evidence.interface.js.map +1 -0
  89. package/build/_modules/vqa/_models/interfaces/expected-feedback.interface.d.ts +16 -0
  90. package/build/_modules/vqa/_models/interfaces/expected-feedback.interface.d.ts.map +1 -0
  91. package/build/_modules/vqa/_models/interfaces/expected-feedback.interface.js +3 -0
  92. package/build/_modules/vqa/_models/interfaces/expected-feedback.interface.js.map +1 -0
  93. package/build/_modules/vqa/_models/interfaces/feature-manifest.interface.d.ts +56 -0
  94. package/build/_modules/vqa/_models/interfaces/feature-manifest.interface.d.ts.map +1 -0
  95. package/build/_modules/vqa/_models/interfaces/feature-manifest.interface.js +3 -0
  96. package/build/_modules/vqa/_models/interfaces/feature-manifest.interface.js.map +1 -0
  97. package/build/_modules/vqa/_models/interfaces/finding.interface.d.ts +58 -0
  98. package/build/_modules/vqa/_models/interfaces/finding.interface.d.ts.map +1 -0
  99. package/build/_modules/vqa/_models/interfaces/finding.interface.js +3 -0
  100. package/build/_modules/vqa/_models/interfaces/finding.interface.js.map +1 -0
  101. package/build/_modules/vqa/_models/interfaces/flow-step.interface.d.ts +32 -0
  102. package/build/_modules/vqa/_models/interfaces/flow-step.interface.d.ts.map +1 -0
  103. package/build/_modules/vqa/_models/interfaces/flow-step.interface.js +3 -0
  104. package/build/_modules/vqa/_models/interfaces/flow-step.interface.js.map +1 -0
  105. package/build/_modules/vqa/_models/interfaces/index.d.ts +8 -0
  106. package/build/_modules/vqa/_models/interfaces/index.d.ts.map +1 -0
  107. package/build/_modules/vqa/_models/interfaces/index.js +24 -0
  108. package/build/_modules/vqa/_models/interfaces/index.js.map +1 -0
  109. package/build/_modules/vqa/_models/interfaces/visual-state.interface.d.ts +34 -0
  110. package/build/_modules/vqa/_models/interfaces/visual-state.interface.d.ts.map +1 -0
  111. package/build/_modules/vqa/_models/interfaces/visual-state.interface.js +3 -0
  112. package/build/_modules/vqa/_models/interfaces/visual-state.interface.js.map +1 -0
  113. package/build/_modules/vqa/capture-spec.generator.spec.d.ts +2 -0
  114. package/build/_modules/vqa/capture-spec.generator.spec.d.ts.map +1 -0
  115. package/build/_modules/vqa/capture-spec.generator.spec.js +126 -0
  116. package/build/_modules/vqa/capture-spec.generator.spec.js.map +1 -0
  117. package/build/_modules/vqa/comparison-bundle.generator.spec.d.ts +2 -0
  118. package/build/_modules/vqa/comparison-bundle.generator.spec.d.ts.map +1 -0
  119. package/build/_modules/vqa/comparison-bundle.generator.spec.js +130 -0
  120. package/build/_modules/vqa/comparison-bundle.generator.spec.js.map +1 -0
  121. package/build/_modules/vqa/finding-validator.spec.d.ts +2 -0
  122. package/build/_modules/vqa/finding-validator.spec.d.ts.map +1 -0
  123. package/build/_modules/vqa/finding-validator.spec.js +136 -0
  124. package/build/_modules/vqa/finding-validator.spec.js.map +1 -0
  125. package/build/_modules/vqa/generators/ai-agent-readme.template.d.ts +19 -0
  126. package/build/_modules/vqa/generators/ai-agent-readme.template.d.ts.map +1 -0
  127. package/build/_modules/vqa/generators/ai-agent-readme.template.js +179 -0
  128. package/build/_modules/vqa/generators/ai-agent-readme.template.js.map +1 -0
  129. package/build/_modules/vqa/generators/bundle-summary.template.d.ts +9 -0
  130. package/build/_modules/vqa/generators/bundle-summary.template.d.ts.map +1 -0
  131. package/build/_modules/vqa/generators/bundle-summary.template.js +73 -0
  132. package/build/_modules/vqa/generators/bundle-summary.template.js.map +1 -0
  133. package/build/_modules/vqa/generators/capture-spec.generator.d.ts +33 -0
  134. package/build/_modules/vqa/generators/capture-spec.generator.d.ts.map +1 -0
  135. package/build/_modules/vqa/generators/capture-spec.generator.js +194 -0
  136. package/build/_modules/vqa/generators/capture-spec.generator.js.map +1 -0
  137. package/build/_modules/vqa/generators/comparison-bundle.generator.d.ts +37 -0
  138. package/build/_modules/vqa/generators/comparison-bundle.generator.d.ts.map +1 -0
  139. package/build/_modules/vqa/generators/comparison-bundle.generator.js +238 -0
  140. package/build/_modules/vqa/generators/comparison-bundle.generator.js.map +1 -0
  141. package/build/_modules/vqa/generators/index.d.ts +6 -0
  142. package/build/_modules/vqa/generators/index.d.ts.map +1 -0
  143. package/build/_modules/vqa/generators/index.js +22 -0
  144. package/build/_modules/vqa/generators/index.js.map +1 -0
  145. package/build/_modules/vqa/generators/review-bundle.generator.d.ts +49 -0
  146. package/build/_modules/vqa/generators/review-bundle.generator.d.ts.map +1 -0
  147. package/build/_modules/vqa/generators/review-bundle.generator.js +127 -0
  148. package/build/_modules/vqa/generators/review-bundle.generator.js.map +1 -0
  149. package/build/_modules/vqa/index.d.ts +6 -0
  150. package/build/_modules/vqa/index.d.ts.map +1 -0
  151. package/build/_modules/vqa/index.js +25 -0
  152. package/build/_modules/vqa/index.js.map +1 -0
  153. package/build/_modules/vqa/manifest-validator.spec.d.ts +2 -0
  154. package/build/_modules/vqa/manifest-validator.spec.d.ts.map +1 -0
  155. package/build/_modules/vqa/manifest-validator.spec.js +125 -0
  156. package/build/_modules/vqa/manifest-validator.spec.js.map +1 -0
  157. package/build/_modules/vqa/review-bundle.generator.spec.d.ts +2 -0
  158. package/build/_modules/vqa/review-bundle.generator.spec.d.ts.map +1 -0
  159. package/build/_modules/vqa/review-bundle.generator.spec.js +166 -0
  160. package/build/_modules/vqa/review-bundle.generator.spec.js.map +1 -0
  161. package/build/_modules/vqa/wave-7.spec.d.ts +2 -0
  162. package/build/_modules/vqa/wave-7.spec.d.ts.map +1 -0
  163. package/build/_modules/vqa/wave-7.spec.js +203 -0
  164. package/build/_modules/vqa/wave-7.spec.js.map +1 -0
  165. package/build/index.d.ts +1 -0
  166. package/build/index.d.ts.map +1 -1
  167. package/build/index.js +1 -0
  168. package/build/index.js.map +1 -1
  169. package/coverage/contracts/_collections/index.html +1 -1
  170. package/coverage/contracts/_collections/index.ts.html +1 -1
  171. package/coverage/contracts/_collections/utils/index.html +1 -1
  172. package/coverage/contracts/_collections/utils/test-id.util.ts.html +10 -10
  173. package/coverage/contracts/_enums/cwv-metric-type.enum.ts.html +1 -1
  174. package/coverage/contracts/_enums/field-test-case-type.enum.ts.html +1 -1
  175. package/coverage/contracts/_enums/index.html +1 -1
  176. package/coverage/contracts/_enums/index.ts.html +1 -1
  177. package/coverage/contracts/_enums/standard-viewport.enum.ts.html +1 -1
  178. package/coverage/contracts/_enums/test-expectation-type.enum.ts.html +1 -1
  179. package/coverage/contracts/_enums/test-run-mode-type.enum.ts.html +1 -1
  180. package/coverage/contracts/index.html +1 -1
  181. package/coverage/contracts/index.ts.html +1 -1
  182. package/coverage/cwv/_collections/cwv-aggregator.util.ts.html +1 -1
  183. package/coverage/cwv/_collections/cwv-comparison.util.ts.html +1 -1
  184. package/coverage/cwv/_collections/cwv-diagnose.util.ts.html +1 -1
  185. package/coverage/cwv/_collections/cwv-emission.util.ts.html +1 -1
  186. package/coverage/cwv/_collections/cwv-summarize.util.ts.html +1 -1
  187. package/coverage/cwv/_collections/index.html +1 -1
  188. package/coverage/cwv/_collections/inp-interaction-script.const.ts.html +1 -1
  189. package/coverage/cwv/_collections/web-vitals-page-script.const.ts.html +1 -1
  190. package/coverage/cwv/cwv-suite.generator.ts.html +1 -1
  191. package/coverage/cwv/index.html +1 -1
  192. package/coverage/generators/_collections/cli-runner.util.ts.html +1 -1
  193. package/coverage/generators/_collections/config-validator.util.ts.html +1 -1
  194. package/coverage/generators/_collections/field-emission.util.ts.html +86 -86
  195. package/coverage/generators/_collections/form-level-emission.util.ts.html +39 -33
  196. package/coverage/generators/_collections/index.html +17 -17
  197. package/coverage/generators/_collections/json-schema.util.ts.html +1 -1
  198. package/coverage/generators/_collections/preset-configs.const.ts.html +1 -1
  199. package/coverage/generators/_collections/spec-emission.util.ts.html +35 -35
  200. package/coverage/generators/_collections/test-case-filter.util.ts.html +153 -51
  201. package/coverage/generators/_collections/viewport-emission.util.ts.html +1 -1
  202. package/coverage/generators/form-suite.generator.ts.html +78 -78
  203. package/coverage/generators/index.html +1 -1
  204. package/coverage/generators/viewport-suite.generator.ts.html +1 -1
  205. package/coverage/index.html +61 -16
  206. package/coverage/lcov-report/contracts/_collections/index.html +1 -1
  207. package/coverage/lcov-report/contracts/_collections/index.ts.html +1 -1
  208. package/coverage/lcov-report/contracts/_collections/utils/index.html +1 -1
  209. package/coverage/lcov-report/contracts/_collections/utils/test-id.util.ts.html +10 -10
  210. package/coverage/lcov-report/contracts/_enums/cwv-metric-type.enum.ts.html +1 -1
  211. package/coverage/lcov-report/contracts/_enums/field-test-case-type.enum.ts.html +1 -1
  212. package/coverage/lcov-report/contracts/_enums/index.html +1 -1
  213. package/coverage/lcov-report/contracts/_enums/index.ts.html +1 -1
  214. package/coverage/lcov-report/contracts/_enums/standard-viewport.enum.ts.html +1 -1
  215. package/coverage/lcov-report/contracts/_enums/test-expectation-type.enum.ts.html +1 -1
  216. package/coverage/lcov-report/contracts/_enums/test-run-mode-type.enum.ts.html +1 -1
  217. package/coverage/lcov-report/contracts/index.html +1 -1
  218. package/coverage/lcov-report/contracts/index.ts.html +1 -1
  219. package/coverage/lcov-report/cwv/_collections/cwv-aggregator.util.ts.html +1 -1
  220. package/coverage/lcov-report/cwv/_collections/cwv-comparison.util.ts.html +1 -1
  221. package/coverage/lcov-report/cwv/_collections/cwv-diagnose.util.ts.html +1 -1
  222. package/coverage/lcov-report/cwv/_collections/cwv-emission.util.ts.html +1 -1
  223. package/coverage/lcov-report/cwv/_collections/cwv-summarize.util.ts.html +1 -1
  224. package/coverage/lcov-report/cwv/_collections/index.html +1 -1
  225. package/coverage/lcov-report/cwv/_collections/inp-interaction-script.const.ts.html +1 -1
  226. package/coverage/lcov-report/cwv/_collections/web-vitals-page-script.const.ts.html +1 -1
  227. package/coverage/lcov-report/cwv/cwv-suite.generator.ts.html +1 -1
  228. package/coverage/lcov-report/cwv/index.html +1 -1
  229. package/coverage/lcov-report/generators/_collections/cli-runner.util.ts.html +1 -1
  230. package/coverage/lcov-report/generators/_collections/config-validator.util.ts.html +1 -1
  231. package/coverage/lcov-report/generators/_collections/field-emission.util.ts.html +86 -86
  232. package/coverage/lcov-report/generators/_collections/form-level-emission.util.ts.html +39 -33
  233. package/coverage/lcov-report/generators/_collections/index.html +17 -17
  234. package/coverage/lcov-report/generators/_collections/json-schema.util.ts.html +1 -1
  235. package/coverage/lcov-report/generators/_collections/preset-configs.const.ts.html +1 -1
  236. package/coverage/lcov-report/generators/_collections/spec-emission.util.ts.html +35 -35
  237. package/coverage/lcov-report/generators/_collections/test-case-filter.util.ts.html +153 -51
  238. package/coverage/lcov-report/generators/_collections/viewport-emission.util.ts.html +1 -1
  239. package/coverage/lcov-report/generators/form-suite.generator.ts.html +78 -78
  240. package/coverage/lcov-report/generators/index.html +1 -1
  241. package/coverage/lcov-report/generators/viewport-suite.generator.ts.html +1 -1
  242. package/coverage/lcov-report/index.html +61 -16
  243. package/coverage/lcov-report/runtime/_collections/assertion-helpers.util.ts.html +1 -1
  244. package/coverage/lcov-report/runtime/_collections/index.html +1 -1
  245. package/coverage/lcov-report/runtime/_collections/unique-generator.util.ts.html +1 -1
  246. package/coverage/lcov-report/runtime/_collections/wait-helpers.util.ts.html +1 -1
  247. package/coverage/lcov-report/runtime/_services/dialog-page-object.ts.html +1 -1
  248. package/coverage/lcov-report/runtime/_services/field-page-object.ts.html +1 -1
  249. package/coverage/lcov-report/runtime/_services/form-page-object.ts.html +1 -1
  250. package/coverage/lcov-report/runtime/_services/index.html +1 -1
  251. package/coverage/lcov-report/runtime/_services/loader-page-object.ts.html +1 -1
  252. package/coverage/lcov-report/runtime/_services/logger.service.ts.html +1 -1
  253. package/coverage/lcov-report/runtime/_services/login-flow-helper.base.ts.html +1 -1
  254. package/coverage/lcov-report/runtime/_services/nav-page-object.ts.html +1 -1
  255. package/coverage/lcov-report/runtime/_services/toast-page-object.ts.html +1 -1
  256. package/coverage/lcov-report/runtime/_services/wave-2b-page-objects.ts.html +1 -1
  257. package/coverage/lcov-report/runtime/index.html +1 -1
  258. package/coverage/lcov-report/runtime/index.ts.html +1 -1
  259. package/coverage/lcov-report/vqa/_collections/utils/deterministic-finding.util.ts.html +481 -0
  260. package/coverage/lcov-report/vqa/_collections/utils/finding-id.util.ts.html +214 -0
  261. package/coverage/lcov-report/vqa/_collections/utils/finding-validator.util.ts.html +463 -0
  262. package/coverage/lcov-report/vqa/_collections/utils/index.html +176 -0
  263. package/coverage/lcov-report/vqa/_collections/utils/manifest-validator.util.ts.html +652 -0
  264. package/coverage/lcov-report/vqa/_collections/utils/risk-score.util.ts.html +424 -0
  265. package/coverage/lcov-report/vqa/_enums/dom-evidence-detector.enum.ts.html +214 -0
  266. package/coverage/lcov-report/vqa/_enums/finding-severity.enum.ts.html +133 -0
  267. package/coverage/lcov-report/vqa/_enums/finding-status.enum.ts.html +151 -0
  268. package/coverage/lcov-report/vqa/_enums/index.html +161 -0
  269. package/coverage/lcov-report/vqa/_enums/visual-state-type.enum.ts.html +235 -0
  270. package/coverage/lcov-report/vqa/generators/ai-agent-readme.template.ts.html +643 -0
  271. package/coverage/lcov-report/vqa/generators/bundle-summary.template.ts.html +316 -0
  272. package/coverage/lcov-report/vqa/generators/capture-spec.generator.ts.html +835 -0
  273. package/coverage/lcov-report/vqa/generators/comparison-bundle.generator.ts.html +898 -0
  274. package/coverage/lcov-report/vqa/generators/index.html +176 -0
  275. package/coverage/lcov-report/vqa/generators/review-bundle.generator.ts.html +559 -0
  276. package/coverage/lcov.info +2680 -466
  277. package/coverage/runtime/_collections/assertion-helpers.util.ts.html +1 -1
  278. package/coverage/runtime/_collections/index.html +1 -1
  279. package/coverage/runtime/_collections/unique-generator.util.ts.html +1 -1
  280. package/coverage/runtime/_collections/wait-helpers.util.ts.html +1 -1
  281. package/coverage/runtime/_services/dialog-page-object.ts.html +1 -1
  282. package/coverage/runtime/_services/field-page-object.ts.html +1 -1
  283. package/coverage/runtime/_services/form-page-object.ts.html +1 -1
  284. package/coverage/runtime/_services/index.html +1 -1
  285. package/coverage/runtime/_services/loader-page-object.ts.html +1 -1
  286. package/coverage/runtime/_services/logger.service.ts.html +1 -1
  287. package/coverage/runtime/_services/login-flow-helper.base.ts.html +1 -1
  288. package/coverage/runtime/_services/nav-page-object.ts.html +1 -1
  289. package/coverage/runtime/_services/toast-page-object.ts.html +1 -1
  290. package/coverage/runtime/_services/wave-2b-page-objects.ts.html +1 -1
  291. package/coverage/runtime/index.html +1 -1
  292. package/coverage/runtime/index.ts.html +1 -1
  293. package/coverage/tmp/coverage-10807-1781369478510-0.json +1 -0
  294. package/coverage/tmp/{coverage-11671-1781126947590-0.json → coverage-10812-1781369476958-0.json} +1 -1
  295. package/coverage/vqa/_collections/utils/deterministic-finding.util.ts.html +481 -0
  296. package/coverage/vqa/_collections/utils/finding-id.util.ts.html +214 -0
  297. package/coverage/vqa/_collections/utils/finding-validator.util.ts.html +463 -0
  298. package/coverage/vqa/_collections/utils/index.html +176 -0
  299. package/coverage/vqa/_collections/utils/manifest-validator.util.ts.html +652 -0
  300. package/coverage/vqa/_collections/utils/risk-score.util.ts.html +424 -0
  301. package/coverage/vqa/_enums/dom-evidence-detector.enum.ts.html +214 -0
  302. package/coverage/vqa/_enums/finding-severity.enum.ts.html +133 -0
  303. package/coverage/vqa/_enums/finding-status.enum.ts.html +151 -0
  304. package/coverage/vqa/_enums/index.html +161 -0
  305. package/coverage/vqa/_enums/visual-state-type.enum.ts.html +235 -0
  306. package/coverage/vqa/generators/ai-agent-readme.template.ts.html +643 -0
  307. package/coverage/vqa/generators/bundle-summary.template.ts.html +316 -0
  308. package/coverage/vqa/generators/capture-spec.generator.ts.html +835 -0
  309. package/coverage/vqa/generators/comparison-bundle.generator.ts.html +898 -0
  310. package/coverage/vqa/generators/index.html +176 -0
  311. package/coverage/vqa/generators/review-bundle.generator.ts.html +559 -0
  312. package/package.json +7 -1
  313. package/coverage/tmp/coverage-11666-1781126948871-0.json +0 -1
@@ -0,0 +1,898 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for vqa/generators/comparison-bundle.generator.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">vqa/generators</a> comparison-bundle.generator.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">95.2% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>258/271</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">72% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>36/50</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>7/7</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">95.2% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>258/271</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
338
+ <span class="cline-any cline-yes">1x</span>
339
+ <span class="cline-any cline-yes">1x</span>
340
+ <span class="cline-any cline-yes">1x</span>
341
+ <span class="cline-any cline-yes">1x</span>
342
+ <span class="cline-any cline-yes">1x</span>
343
+ <span class="cline-any cline-yes">1x</span>
344
+ <span class="cline-any cline-yes">1x</span>
345
+ <span class="cline-any cline-yes">1x</span>
346
+ <span class="cline-any cline-yes">1x</span>
347
+ <span class="cline-any cline-yes">1x</span>
348
+ <span class="cline-any cline-yes">1x</span>
349
+ <span class="cline-any cline-yes">1x</span>
350
+ <span class="cline-any cline-yes">1x</span>
351
+ <span class="cline-any cline-yes">1x</span>
352
+ <span class="cline-any cline-yes">1x</span>
353
+ <span class="cline-any cline-yes">1x</span>
354
+ <span class="cline-any cline-yes">1x</span>
355
+ <span class="cline-any cline-yes">1x</span>
356
+ <span class="cline-any cline-yes">1x</span>
357
+ <span class="cline-any cline-yes">1x</span>
358
+ <span class="cline-any cline-yes">1x</span>
359
+ <span class="cline-any cline-yes">1x</span>
360
+ <span class="cline-any cline-yes">1x</span>
361
+ <span class="cline-any cline-yes">1x</span>
362
+ <span class="cline-any cline-yes">1x</span>
363
+ <span class="cline-any cline-yes">1x</span>
364
+ <span class="cline-any cline-yes">1x</span>
365
+ <span class="cline-any cline-yes">1x</span>
366
+ <span class="cline-any cline-yes">1x</span>
367
+ <span class="cline-any cline-yes">1x</span>
368
+ <span class="cline-any cline-yes">1x</span>
369
+ <span class="cline-any cline-yes">1x</span>
370
+ <span class="cline-any cline-yes">1x</span>
371
+ <span class="cline-any cline-yes">5x</span>
372
+ <span class="cline-any cline-yes">5x</span>
373
+ <span class="cline-any cline-yes">5x</span>
374
+ <span class="cline-any cline-yes">5x</span>
375
+ <span class="cline-any cline-yes">5x</span>
376
+ <span class="cline-any cline-yes">5x</span>
377
+ <span class="cline-any cline-yes">5x</span>
378
+ <span class="cline-any cline-yes">5x</span>
379
+ <span class="cline-any cline-yes">5x</span>
380
+ <span class="cline-any cline-yes">5x</span>
381
+ <span class="cline-any cline-yes">5x</span>
382
+ <span class="cline-any cline-yes">5x</span>
383
+ <span class="cline-any cline-yes">5x</span>
384
+ <span class="cline-any cline-yes">5x</span>
385
+ <span class="cline-any cline-yes">5x</span>
386
+ <span class="cline-any cline-yes">5x</span>
387
+ <span class="cline-any cline-yes">5x</span>
388
+ <span class="cline-any cline-yes">5x</span>
389
+ <span class="cline-any cline-yes">5x</span>
390
+ <span class="cline-any cline-yes">5x</span>
391
+ <span class="cline-any cline-yes">5x</span>
392
+ <span class="cline-any cline-yes">5x</span>
393
+ <span class="cline-any cline-yes">5x</span>
394
+ <span class="cline-any cline-yes">5x</span>
395
+ <span class="cline-any cline-yes">5x</span>
396
+ <span class="cline-any cline-yes">5x</span>
397
+ <span class="cline-any cline-yes">5x</span>
398
+ <span class="cline-any cline-yes">5x</span>
399
+ <span class="cline-any cline-yes">5x</span>
400
+ <span class="cline-any cline-yes">5x</span>
401
+ <span class="cline-any cline-yes">5x</span>
402
+ <span class="cline-any cline-yes">5x</span>
403
+ <span class="cline-any cline-yes">5x</span>
404
+ <span class="cline-any cline-yes">5x</span>
405
+ <span class="cline-any cline-yes">5x</span>
406
+ <span class="cline-any cline-yes">5x</span>
407
+ <span class="cline-any cline-yes">5x</span>
408
+ <span class="cline-any cline-yes">5x</span>
409
+ <span class="cline-any cline-yes">5x</span>
410
+ <span class="cline-any cline-yes">5x</span>
411
+ <span class="cline-any cline-yes">5x</span>
412
+ <span class="cline-any cline-yes">5x</span>
413
+ <span class="cline-any cline-yes">5x</span>
414
+ <span class="cline-any cline-yes">5x</span>
415
+ <span class="cline-any cline-yes">5x</span>
416
+ <span class="cline-any cline-yes">5x</span>
417
+ <span class="cline-any cline-yes">5x</span>
418
+ <span class="cline-any cline-yes">5x</span>
419
+ <span class="cline-any cline-yes">5x</span>
420
+ <span class="cline-any cline-yes">5x</span>
421
+ <span class="cline-any cline-yes">5x</span>
422
+ <span class="cline-any cline-yes">5x</span>
423
+ <span class="cline-any cline-yes">5x</span>
424
+ <span class="cline-any cline-yes">5x</span>
425
+ <span class="cline-any cline-yes">5x</span>
426
+ <span class="cline-any cline-yes">5x</span>
427
+ <span class="cline-any cline-yes">5x</span>
428
+ <span class="cline-any cline-yes">5x</span>
429
+ <span class="cline-any cline-yes">5x</span>
430
+ <span class="cline-any cline-yes">5x</span>
431
+ <span class="cline-any cline-yes">5x</span>
432
+ <span class="cline-any cline-yes">5x</span>
433
+ <span class="cline-any cline-yes">5x</span>
434
+ <span class="cline-any cline-yes">5x</span>
435
+ <span class="cline-any cline-yes">5x</span>
436
+ <span class="cline-any cline-yes">5x</span>
437
+ <span class="cline-any cline-yes">5x</span>
438
+ <span class="cline-any cline-yes">5x</span>
439
+ <span class="cline-any cline-yes">5x</span>
440
+ <span class="cline-any cline-yes">5x</span>
441
+ <span class="cline-any cline-yes">5x</span>
442
+ <span class="cline-any cline-yes">5x</span>
443
+ <span class="cline-any cline-yes">5x</span>
444
+ <span class="cline-any cline-yes">5x</span>
445
+ <span class="cline-any cline-yes">5x</span>
446
+ <span class="cline-any cline-no">&nbsp;</span>
447
+ <span class="cline-any cline-no">&nbsp;</span>
448
+ <span class="cline-any cline-no">&nbsp;</span>
449
+ <span class="cline-any cline-no">&nbsp;</span>
450
+ <span class="cline-any cline-no">&nbsp;</span>
451
+ <span class="cline-any cline-yes">5x</span>
452
+ <span class="cline-any cline-yes">5x</span>
453
+ <span class="cline-any cline-yes">5x</span>
454
+ <span class="cline-any cline-yes">5x</span>
455
+ <span class="cline-any cline-yes">5x</span>
456
+ <span class="cline-any cline-yes">5x</span>
457
+ <span class="cline-any cline-yes">5x</span>
458
+ <span class="cline-any cline-yes">5x</span>
459
+ <span class="cline-any cline-yes">5x</span>
460
+ <span class="cline-any cline-yes">5x</span>
461
+ <span class="cline-any cline-yes">5x</span>
462
+ <span class="cline-any cline-yes">5x</span>
463
+ <span class="cline-any cline-yes">5x</span>
464
+ <span class="cline-any cline-yes">5x</span>
465
+ <span class="cline-any cline-yes">1x</span>
466
+ <span class="cline-any cline-yes">1x</span>
467
+ <span class="cline-any cline-yes">10x</span>
468
+ <span class="cline-any cline-yes">10x</span>
469
+ <span class="cline-any cline-yes">10x</span>
470
+ <span class="cline-any cline-yes">10x</span>
471
+ <span class="cline-any cline-no">&nbsp;</span>
472
+ <span class="cline-any cline-no">&nbsp;</span>
473
+ <span class="cline-any cline-yes">1x</span>
474
+ <span class="cline-any cline-yes">1x</span>
475
+ <span class="cline-any cline-yes">30x</span>
476
+ <span class="cline-any cline-yes">10x</span>
477
+ <span class="cline-any cline-yes">10x</span>
478
+ <span class="cline-any cline-yes">20x</span>
479
+ <span class="cline-any cline-yes">20x</span>
480
+ <span class="cline-any cline-yes">30x</span>
481
+ <span class="cline-any cline-no">&nbsp;</span>
482
+ <span class="cline-any cline-no">&nbsp;</span>
483
+ <span class="cline-any cline-yes">30x</span>
484
+ <span class="cline-any cline-yes">1x</span>
485
+ <span class="cline-any cline-yes">1x</span>
486
+ <span class="cline-any cline-yes">1x</span>
487
+ <span class="cline-any cline-yes">9x</span>
488
+ <span class="cline-any cline-yes">1x</span>
489
+ <span class="cline-any cline-yes">1x</span>
490
+ <span class="cline-any cline-yes">9x</span>
491
+ <span class="cline-any cline-yes">1x</span>
492
+ <span class="cline-any cline-yes">1x</span>
493
+ <span class="cline-any cline-yes">9x</span>
494
+ <span class="cline-any cline-no">&nbsp;</span>
495
+ <span class="cline-any cline-no">&nbsp;</span>
496
+ <span class="cline-any cline-yes">9x</span>
497
+ <span class="cline-any cline-yes">2x</span>
498
+ <span class="cline-any cline-yes">1x</span>
499
+ <span class="cline-any cline-yes">1x</span>
500
+ <span class="cline-any cline-yes">1x</span>
501
+ <span class="cline-any cline-yes">1x</span>
502
+ <span class="cline-any cline-yes">5x</span>
503
+ <span class="cline-any cline-yes">5x</span>
504
+ <span class="cline-any cline-yes">5x</span>
505
+ <span class="cline-any cline-yes">5x</span>
506
+ <span class="cline-any cline-yes">5x</span>
507
+ <span class="cline-any cline-yes">5x</span>
508
+ <span class="cline-any cline-yes">9x</span>
509
+ <span class="cline-any cline-yes">4x</span>
510
+ <span class="cline-any cline-yes">1x</span>
511
+ <span class="cline-any cline-yes">4x</span>
512
+ <span class="cline-any cline-no">&nbsp;</span>
513
+ <span class="cline-any cline-yes">3x</span>
514
+ <span class="cline-any cline-yes">2x</span>
515
+ <span class="cline-any cline-yes">2x</span>
516
+ <span class="cline-any cline-yes">4x</span>
517
+ <span class="cline-any cline-yes">5x</span>
518
+ <span class="cline-any cline-yes">9x</span>
519
+ <span class="cline-any cline-yes">9x</span>
520
+ <span class="cline-any cline-yes">9x</span>
521
+ <span class="cline-any cline-yes">9x</span>
522
+ <span class="cline-any cline-yes">9x</span>
523
+ <span class="cline-any cline-yes">1x</span>
524
+ <span class="cline-any cline-yes">1x</span>
525
+ <span class="cline-any cline-yes">1x</span>
526
+ <span class="cline-any cline-yes">5x</span>
527
+ <span class="cline-any cline-yes">10x</span>
528
+ <span class="cline-any cline-yes">10x</span>
529
+ <span class="cline-any cline-yes">10x</span>
530
+ <span class="cline-any cline-yes">6x</span>
531
+ <span class="cline-any cline-yes">6x</span>
532
+ <span class="cline-any cline-yes">6x</span>
533
+ <span class="cline-any cline-yes">6x</span>
534
+ <span class="cline-any cline-yes">6x</span>
535
+ <span class="cline-any cline-yes">10x</span>
536
+ <span class="cline-any cline-yes">10x</span>
537
+ <span class="cline-any cline-yes">5x</span>
538
+ <span class="cline-any cline-yes">5x</span>
539
+ <span class="cline-any cline-yes">5x</span>
540
+ <span class="cline-any cline-yes">5x</span>
541
+ <span class="cline-any cline-yes">5x</span>
542
+ <span class="cline-any cline-yes">5x</span>
543
+ <span class="cline-any cline-yes">3x</span>
544
+ <span class="cline-any cline-yes">3x</span>
545
+ <span class="cline-any cline-yes">3x</span>
546
+ <span class="cline-any cline-yes">2x</span>
547
+ <span class="cline-any cline-yes">2x</span>
548
+ <span class="cline-any cline-yes">2x</span>
549
+ <span class="cline-any cline-yes">2x</span>
550
+ <span class="cline-any cline-yes">2x</span>
551
+ <span class="cline-any cline-yes">3x</span>
552
+ <span class="cline-any cline-no">&nbsp;</span>
553
+ <span class="cline-any cline-yes">1x</span>
554
+ <span class="cline-any cline-yes">1x</span>
555
+ <span class="cline-any cline-yes">1x</span>
556
+ <span class="cline-any cline-yes">3x</span>
557
+ <span class="cline-any cline-yes">5x</span>
558
+ <span class="cline-any cline-yes">5x</span>
559
+ <span class="cline-any cline-yes">1x</span>
560
+ <span class="cline-any cline-yes">1x</span>
561
+ <span class="cline-any cline-yes">5x</span>
562
+ <span class="cline-any cline-yes">5x</span>
563
+ <span class="cline-any cline-yes">5x</span>
564
+ <span class="cline-any cline-yes">5x</span>
565
+ <span class="cline-any cline-yes">5x</span>
566
+ <span class="cline-any cline-yes">5x</span>
567
+ <span class="cline-any cline-yes">5x</span>
568
+ <span class="cline-any cline-yes">5x</span>
569
+ <span class="cline-any cline-yes">5x</span>
570
+ <span class="cline-any cline-yes">5x</span>
571
+ <span class="cline-any cline-yes">5x</span>
572
+ <span class="cline-any cline-yes">5x</span>
573
+ <span class="cline-any cline-yes">5x</span>
574
+ <span class="cline-any cline-yes">5x</span>
575
+ <span class="cline-any cline-yes">5x</span>
576
+ <span class="cline-any cline-yes">5x</span>
577
+ <span class="cline-any cline-yes">5x</span>
578
+ <span class="cline-any cline-yes">5x</span>
579
+ <span class="cline-any cline-yes">5x</span>
580
+ <span class="cline-any cline-yes">5x</span>
581
+ <span class="cline-any cline-yes">5x</span>
582
+ <span class="cline-any cline-yes">5x</span>
583
+ <span class="cline-any cline-yes">5x</span>
584
+ <span class="cline-any cline-yes">5x</span>
585
+ <span class="cline-any cline-yes">5x</span>
586
+ <span class="cline-any cline-yes">5x</span>
587
+ <span class="cline-any cline-yes">5x</span>
588
+ <span class="cline-any cline-yes">5x</span>
589
+ <span class="cline-any cline-yes">5x</span>
590
+ <span class="cline-any cline-yes">5x</span>
591
+ <span class="cline-any cline-yes">5x</span>
592
+ <span class="cline-any cline-yes">5x</span>
593
+ <span class="cline-any cline-yes">5x</span>
594
+ <span class="cline-any cline-yes">5x</span>
595
+ <span class="cline-any cline-yes">5x</span>
596
+ <span class="cline-any cline-yes">5x</span>
597
+ <span class="cline-any cline-yes">5x</span>
598
+ <span class="cline-any cline-yes">5x</span>
599
+ <span class="cline-any cline-yes">5x</span>
600
+ <span class="cline-any cline-yes">5x</span>
601
+ <span class="cline-any cline-yes">5x</span>
602
+ <span class="cline-any cline-yes">5x</span>
603
+ <span class="cline-any cline-yes">5x</span>
604
+ <span class="cline-any cline-yes">5x</span>
605
+ <span class="cline-any cline-yes">5x</span>
606
+ <span class="cline-any cline-yes">5x</span>
607
+ <span class="cline-any cline-yes">1x</span>
608
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import * as fs from 'fs';
609
+ import * as path from 'path';
610
+ import { DyE2E_VQA_FeatureManifest_Interface } from '../_models/interfaces/feature-manifest.interface';
611
+ &nbsp;
612
+ /**
613
+ * `DyE2E_VQA_ComparisonBundle_Generator` — MP-F: re-audit comparison-bundle (spec §15).
614
+ *
615
+ * Két korábbi run-folder-t kap inputként + a re-audit-elendő finding-ID-k listáját.
616
+ * Output: a `before` bundle-en BELÜLI `comparison/` mappa, ami az AI agentnek strukturált
617
+ * delta-t mutat:
618
+ * - `comparison/README.md` — review-instrukció (decide: verified / reopened / partial)
619
+ * - `comparison/before-run-id.txt`, `after-run-id.txt`
620
+ * - `comparison/finding-refs.json` — milyen finding-eket nézzünk
621
+ * - `comparison/dom-diff/&lt;state&gt;/&lt;viewport&gt;.json` — DOM-snapshot-delta
622
+ * - `comparison/evidence-diff/&lt;state&gt;/&lt;viewport&gt;.json` — detector verdict-delta
623
+ * - `comparison/a11y-diff/&lt;state&gt;/&lt;viewport&gt;.json` — axe-finding-delta
624
+ *
625
+ * **scope-LOCK**: NEM dönt. Az AI agent dönti el verified/reopened-et.
626
+ */
627
+ export interface DyE2E_VQA_ComparisonBundle_Options {
628
+ /** Bundle-relative output mappa-név (default: `comparison`). */
629
+ outputSubdir?: string;
630
+ }
631
+ &nbsp;
632
+ export interface DyE2E_VQA_ComparisonBundle_Result {
633
+ comparisonPath: string;
634
+ filesWritten: string[];
635
+ statesCompared: number;
636
+ viewportsCompared: number;
637
+ }
638
+ &nbsp;
639
+ export class DyE2E_VQA_ComparisonBundle_Generator {
640
+ &nbsp;
641
+ static generate(
642
+ beforeBundlePath: string,
643
+ afterBundlePath: string,
644
+ manifest: DyE2E_VQA_FeatureManifest_Interface,
645
+ findingRefs: string[],
646
+ options?: DyE2E_VQA_ComparisonBundle_Options,
647
+ ): DyE2E_VQA_ComparisonBundle_Result {
648
+ const subdir: string = options<span class="branch-0 cbranch-no" title="branch not covered" >?.outputSubdir </span>?? 'comparison';
649
+ const comparisonPath: string = path.join(afterBundlePath, subdir);
650
+ fs.mkdirSync(comparisonPath, { recursive: true });
651
+ &nbsp;
652
+ const orientations: ('portrait' | 'landscape')[] =
653
+ manifest.orientations<span class="branch-0 cbranch-no" title="branch not covered" > &amp;&amp; manifest.orientations.length &gt; 0</span>
654
+ <span class="branch-0 cbranch-no" title="branch not covered" > ? manifest.orientations</span>
655
+ : ['portrait'];
656
+ &nbsp;
657
+ const filesWritten: string[] = [];
658
+ &nbsp;
659
+ // run-id refs (read meta)
660
+ const beforeRunId: string = this.readMeta(beforeBundlePath, 'run-id.txt');
661
+ const afterRunId: string = this.readMeta(afterBundlePath, 'run-id.txt');
662
+ fs.writeFileSync(path.join(comparisonPath, 'before-run-id.txt'), beforeRunId);
663
+ fs.writeFileSync(path.join(comparisonPath, 'after-run-id.txt'), afterRunId);
664
+ filesWritten.push('before-run-id.txt', 'after-run-id.txt');
665
+ &nbsp;
666
+ // finding-refs.json
667
+ fs.writeFileSync(
668
+ path.join(comparisonPath, 'finding-refs.json'),
669
+ JSON.stringify({ findingRefs, beforeRunId, afterRunId }, null, 2),
670
+ );
671
+ filesWritten.push('finding-refs.json');
672
+ &nbsp;
673
+ // README.md — re-audit decision-instrukció
674
+ fs.writeFileSync(path.join(comparisonPath, 'README.md'), this.renderReadme(
675
+ manifest, findingRefs, beforeRunId, afterRunId,
676
+ ));
677
+ filesWritten.push('README.md');
678
+ &nbsp;
679
+ // Per (state × viewport × orientation) DOM-diff + evidence-diff + a11y-diff
680
+ let statesCompared: number = 0;
681
+ let viewportsCompared: number = 0;
682
+ for (const s of manifest.states) {
683
+ let stateHadFiles: boolean = false;
684
+ for (const v of manifest.viewports) {
685
+ for (const o of orientations) {
686
+ const subPath: string = path.join(s.stateId, `${v.key}-${o}`);
687
+ const beforeStateDir: string = path.join(beforeBundlePath, 'states', subPath);
688
+ const afterStateDir: string = path.join(afterBundlePath, 'states', subPath);
689
+ &nbsp;
690
+ // dom-diff
691
+ const beforeDom: unknown = this.tryReadJson(path.join(beforeStateDir, 'dom-snapshot.json'));
692
+ const afterDom: unknown = this.tryReadJson(path.join(afterStateDir, 'dom-snapshot.json'));
693
+ if (beforeDom !== null<span class="branch-0 cbranch-no" title="branch not covered" > || afterDom !== null)</span> {
694
+ const out: string = path.join(comparisonPath, 'dom-diff', subPath + '.json');
695
+ fs.mkdirSync(path.dirname(out), { recursive: true });
696
+ fs.writeFileSync(out, JSON.stringify(this.deepDiff(beforeDom, afterDom), null, 2));
697
+ filesWritten.push(`dom-diff/${subPath}.json`);
698
+ }
699
+ &nbsp;
700
+ // evidence-diff
701
+ const beforeEv: unknown = this.tryReadJson(path.join(beforeStateDir, 'evidence.json'));
702
+ const afterEv: unknown = this.tryReadJson(path.join(afterStateDir, 'evidence.json'));
703
+ if (beforeEv !== null<span class="branch-0 cbranch-no" title="branch not covered" > || afterEv !== null)</span> {
704
+ const out: string = path.join(comparisonPath, 'evidence-diff', subPath + '.json');
705
+ fs.mkdirSync(path.dirname(out), { recursive: true });
706
+ fs.writeFileSync(out, JSON.stringify(
707
+ this.diffEvidenceArrays(beforeEv, afterEv),
708
+ null, 2,
709
+ ));
710
+ filesWritten.push(`evidence-diff/${subPath}.json`);
711
+ }
712
+ &nbsp;
713
+ // a11y-diff (opcionális; ha valamelyik run-ban nincs, deeper-diff)
714
+ const beforeA11y: unknown = this.tryReadJson(path.join(beforeStateDir, 'a11y.json'));
715
+ const afterA11y: unknown = this.tryReadJson(path.join(afterStateDir, 'a11y.json'));
716
+ if (beforeA11y !== null || afterA11y !== null) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
717
+ <span class="cstat-no" title="statement not covered" > const out: string = path.join(comparisonPath, 'a11y-diff', subPath + '.json');</span>
718
+ <span class="cstat-no" title="statement not covered" > fs.mkdirSync(path.dirname(out), { recursive: true });</span>
719
+ <span class="cstat-no" title="statement not covered" > fs.writeFileSync(out, JSON.stringify(this.deepDiff(beforeA11y, afterA11y), null, 2));</span>
720
+ <span class="cstat-no" title="statement not covered" > filesWritten.push(`a11y-diff/${subPath}.json`);</span>
721
+ <span class="cstat-no" title="statement not covered" > }</span>
722
+ &nbsp;
723
+ if (afterStateDir &amp;&amp; fs.existsSync(afterStateDir)) {
724
+ viewportsCompared++;
725
+ stateHadFiles = true;
726
+ }
727
+ }
728
+ }
729
+ if (stateHadFiles) {
730
+ statesCompared++;
731
+ }
732
+ }
733
+ &nbsp;
734
+ return { comparisonPath, filesWritten, statesCompared, viewportsCompared };
735
+ }
736
+ &nbsp;
737
+ private static readMeta(bundlePath: string, fileName: string): string {
738
+ const p: string = path.join(bundlePath, 'meta', fileName);
739
+ if (fs.existsSync(p)) {
740
+ return fs.readFileSync(p, 'utf-8').trim();
741
+ }
742
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > return 'unknown';</span></span>
743
+ <span class="cstat-no" title="statement not covered" > }</span>
744
+ &nbsp;
745
+ private static tryReadJson(p: string): unknown {
746
+ if (!fs.existsSync(p)) {
747
+ return null;
748
+ }
749
+ try {
750
+ return JSON.parse(fs.readFileSync(p, 'utf-8'));
751
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch {</span>
752
+ <span class="cstat-no" title="statement not covered" > return null;</span>
753
+ <span class="cstat-no" title="statement not covered" > }</span>
754
+ }
755
+ &nbsp;
756
+ /** Egyszerű deep-diff: `{ added, removed, changed }` map (kulcs-szinten). */
757
+ static deepDiff(before: unknown, after: unknown): unknown {
758
+ if (before === null &amp;&amp; after === null) {
759
+ return { unchanged: true };
760
+ }
761
+ if (before === null) {
762
+ return { onlyAfter: after };
763
+ }
764
+ if (after === null) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
765
+ <span class="cstat-no" title="statement not covered" > return { onlyBefore: before };</span>
766
+ <span class="cstat-no" title="statement not covered" > }</span>
767
+ if (typeof before !== 'object' || typeof after !== 'object') {
768
+ if (before === after) {
769
+ return { unchanged: true, value: before };
770
+ }
771
+ return { before, after };
772
+ }
773
+ const bObj: Record&lt;string, unknown&gt; = before as Record&lt;string, unknown&gt;;
774
+ const aObj: Record&lt;string, unknown&gt; = after as Record&lt;string, unknown&gt;;
775
+ const allKeys: Set&lt;string&gt; = new Set([...Object.keys(bObj), ...Object.keys(aObj)]);
776
+ const added: Record&lt;string, unknown&gt; = {};
777
+ const removed: Record&lt;string, unknown&gt; = {};
778
+ const changed: Record&lt;string, unknown&gt; = {};
779
+ for (const k of allKeys) {
780
+ if (!(k in bObj)) {
781
+ added[k] = aObj[k];
782
+ } else if (!(k in aObj)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
783
+ <span class="cstat-no" title="statement not covered" > removed[k] = bObj[k];</span>
784
+ } else if (JSON.stringify(bObj[k]) !== JSON.stringify(aObj[k])) {
785
+ changed[k] = { before: bObj[k], after: aObj[k] };
786
+ }
787
+ }
788
+ return {
789
+ added: Object.keys(added).length &gt; 0 ? added : undefined,
790
+ removed: Object.keys(removed).length &gt; 0 <span class="branch-0 cbranch-no" title="branch not covered" >? removed </span>: undefined,
791
+ changed: Object.keys(changed).length &gt; 0 ? changed : undefined,
792
+ };
793
+ }
794
+ &nbsp;
795
+ /** Evidence-array specifikus diff: minden detektorra verdict-változás. */
796
+ static diffEvidenceArrays(before: unknown, after: unknown): unknown {
797
+ const toMap = (arr: unknown): Record&lt;string, unknown&gt; =&gt; {
798
+ const m: Record&lt;string, unknown&gt; = {};
799
+ if (Array.isArray(arr)) {
800
+ for (const e of arr) {
801
+ const d: { detector?: string } = e as { detector?: string };
802
+ if (d?.detector) {
803
+ m[d.detector] = e;
804
+ }
805
+ }
806
+ }
807
+ return m;
808
+ };
809
+ const bm: Record&lt;string, unknown&gt; = toMap(before);
810
+ const am: Record&lt;string, unknown&gt; = toMap(after);
811
+ const detectors: Set&lt;string&gt; = new Set([...Object.keys(bm), ...Object.keys(am)]);
812
+ const delta: Record&lt;string, unknown&gt; = {};
813
+ for (const d of detectors) {
814
+ const bDetected: boolean = (bm[d] as { detected?: boolean })?.detected === true;
815
+ const aDetected: boolean = (am[d] as { detected?: boolean })?.detected === true;
816
+ if (bDetected !== aDetected) {
817
+ delta[d] = {
818
+ verdictChanged: true,
819
+ before: bDetected ? 'detected' <span class="branch-0 cbranch-no" title="branch not covered" >: 'clean',</span>
820
+ after: aDetected <span class="branch-0 cbranch-no" title="branch not covered" >? 'detected' </span>: 'clean',
821
+ };
822
+ } else if (JSON.stringify(bm[d]) !== JSON.stringify(am[d])) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
823
+ <span class="cstat-no" title="statement not covered" > delta[d] = { verdictChanged: false, detailsChanged: true };</span>
824
+ } else {
825
+ delta[d] = { unchanged: true };
826
+ }
827
+ }
828
+ return delta;
829
+ }
830
+ &nbsp;
831
+ private static renderReadme(
832
+ manifest: DyE2E_VQA_FeatureManifest_Interface,
833
+ findingRefs: string[],
834
+ beforeRunId: string,
835
+ afterRunId: string,
836
+ ): string {
837
+ return `# Re-audit comparison-bundle — \`${manifest.featureName}\`
838
+ &nbsp;
839
+ &gt; **Mit kell tenned (AI agent):** olvasd át a finding-ek listáját, vesd össze a
840
+ &gt; before/after dom-diff + evidence-diff + a11y-diff fájlokat, és minden finding-re dönts:
841
+ &gt;
842
+ &gt; - **\`verified\`** — a probléma megszűnt (a re-audit ugyanabban az állapotban már nem találja)
843
+ &gt; - **\`reopened\`** — a probléma visszatért
844
+ &gt; - **\`in-progress\`** (partial) — a probléma részben maradt fenn
845
+ &nbsp;
846
+ - **Before run-id:** \`${beforeRunId}\`
847
+ - **After run-id:** \`${afterRunId}\`
848
+ - **Feature:** \`${manifest.featureId}\` — ${manifest.featureName}
849
+ - **Re-audited finding-count:** ${findingRefs.length}
850
+ &nbsp;
851
+ ## Re-audited finding-ek
852
+ &nbsp;
853
+ ${findingRefs.length &gt; 0 ? findingRefs.map((f) =&gt; `- \`${f}\``).join('\n') : '*Nincs explicit lista — minden finding-et nézz át.*'}
854
+ &nbsp;
855
+ ## Bundle-struktúra
856
+ &nbsp;
857
+ - \`dom-diff/&lt;stateId&gt;/&lt;viewport&gt;-&lt;orient&gt;.json\` — DOM-snapshot delta
858
+ - \`evidence-diff/&lt;stateId&gt;/&lt;viewport&gt;-&lt;orient&gt;.json\` — 16 detektor verdict-delta
859
+ - \`a11y-diff/&lt;stateId&gt;/&lt;viewport&gt;-&lt;orient&gt;.json\` — axe-finding delta (ha van)
860
+ &nbsp;
861
+ ## Decision-rubric
862
+ &nbsp;
863
+ 1. **Nyisd meg az adott finding state × viewport-jához tartozó \`evidence-diff\`-et**.
864
+ Ha a kapcsolódó detektor \`verdictChanged: true\` és \`after: 'clean'\` → erős jel \`verified\`-re.
865
+ 2. **Nyisd meg a \`dom-diff\`-et** ugyanarra a state-viewport-ra. Nézd meg, hogy a finding-re
866
+ vonatkozó DOM-metrika változott-e (pl. modal scrollHeight, body scrollHeight, primary CTA top).
867
+ 3. **Olvasd a screenshot-okat** a \`states/&lt;stateId&gt;/&lt;viewport&gt;-&lt;orient&gt;/full.png\` és \`fold.png\` után-bundle-jéből (after run-id).
868
+ 4. **Dönts** és írd a verdict-et a finding \`status\`-ába (\`verified\` | \`reopened\` | \`in-progress\`).
869
+ &nbsp;
870
+ A finding-státusz-FSM megengedett tranzícióit a \`DyE2E_VQA_FindingValidator_Util.canTransition\`
871
+ adja — \`readyForReAudit\` → \`verified\` vagy \`reopened\` a jellemző.
872
+ &nbsp;
873
+ ---
874
+ &nbsp;
875
+ *Comparison generated by \`@futdevpro/dynamo-e2e/vqa\` \`DyE2E_VQA_ComparisonBundle_Generator\`.*
876
+ `;
877
+ }
878
+ }
879
+ &nbsp;</pre></td></tr></table></pre>
880
+
881
+ <div class='push'></div><!-- for sticky footer -->
882
+ </div><!-- /wrapper -->
883
+ <div class='footer quiet pad2 space-top1 center small'>
884
+ Code coverage generated by
885
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
886
+ at 2026-06-13T16:51:18.882Z
887
+ </div>
888
+ <script src="../../prettify.js"></script>
889
+ <script>
890
+ window.onload = function () {
891
+ prettyPrint();
892
+ };
893
+ </script>
894
+ <script src="../../sorter.js"></script>
895
+ <script src="../../block-navigation.js"></script>
896
+ </body>
897
+ </html>
898
+