@crvouga/atlas 0.0.0-stage → 0.2.0

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 (606) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +649 -2
  4. package/dist/bun/src/driver.d.ts +67 -0
  5. package/dist/bun/src/driver.js +90 -0
  6. package/dist/bun/src/index.d.ts +2 -0
  7. package/dist/bun/src/index.js +2 -0
  8. package/dist/core/src/cli.d.ts +1 -0
  9. package/dist/core/src/cli.js +177 -0
  10. package/dist/core/src/config.d.ts +477 -0
  11. package/dist/core/src/config.js +100 -0
  12. package/dist/core/src/events/cloudevents.d.ts +56 -0
  13. package/dist/core/src/events/cloudevents.js +152 -0
  14. package/dist/core/src/graph.d.ts +113 -0
  15. package/dist/core/src/graph.js +221 -0
  16. package/dist/core/src/index.d.ts +17 -0
  17. package/dist/core/src/index.js +17 -0
  18. package/dist/core/src/lint.d.ts +53 -0
  19. package/dist/core/src/lint.js +138 -0
  20. package/dist/core/src/plan.d.ts +109 -0
  21. package/dist/core/src/plan.js +324 -0
  22. package/dist/core/src/privacy.d.ts +8 -0
  23. package/dist/core/src/privacy.js +42 -0
  24. package/dist/core/src/report/formats.d.ts +69 -0
  25. package/dist/core/src/report/formats.js +109 -0
  26. package/dist/core/src/report/markdown.d.ts +8 -0
  27. package/dist/core/src/report/markdown.js +140 -0
  28. package/dist/core/src/run/clients.d.ts +42 -0
  29. package/dist/core/src/run/clients.js +250 -0
  30. package/dist/core/src/run/execute.d.ts +854 -0
  31. package/dist/core/src/run/execute.js +877 -0
  32. package/dist/core/src/run/frames.d.ts +16 -0
  33. package/dist/core/src/run/frames.js +52 -0
  34. package/dist/core/src/run/http.d.ts +41 -0
  35. package/dist/core/src/run/http.js +71 -0
  36. package/dist/core/src/run/types.d.ts +248 -0
  37. package/dist/core/src/run/types.js +39 -0
  38. package/dist/core/src/signals.d.ts +110 -0
  39. package/dist/core/src/signals.js +121 -0
  40. package/dist/core/src/spec/compose.d.ts +28 -0
  41. package/dist/core/src/spec/compose.js +71 -0
  42. package/dist/core/src/spec/index.d.ts +5 -0
  43. package/dist/core/src/spec/index.js +5 -0
  44. package/dist/core/src/spec/load.d.ts +8 -0
  45. package/dist/core/src/spec/load.js +46 -0
  46. package/dist/core/src/spec/parse.d.ts +5 -0
  47. package/dist/core/src/spec/parse.js +32 -0
  48. package/dist/core/src/spec/scxml.d.ts +19 -0
  49. package/dist/core/src/spec/scxml.js +239 -0
  50. package/dist/core/src/spec/types.d.ts +96 -0
  51. package/dist/core/src/spec/types.js +25 -0
  52. package/dist/detox/src/index.d.ts +75 -0
  53. package/dist/detox/src/index.js +110 -0
  54. package/dist/playwright/src/driver.d.ts +44 -0
  55. package/dist/playwright/src/driver.js +82 -0
  56. package/dist/playwright/src/index.d.ts +3 -0
  57. package/dist/playwright/src/index.js +3 -0
  58. package/dist/playwright/src/media.d.ts +68 -0
  59. package/dist/playwright/src/media.js +283 -0
  60. package/dist/playwright/src/signals.d.ts +34 -0
  61. package/dist/playwright/src/signals.js +56 -0
  62. package/dist/reports/src/browser-navigation.d.ts +2 -0
  63. package/dist/reports/src/browser-navigation.js +28 -0
  64. package/dist/reports/src/bundle.d.ts +24 -0
  65. package/dist/reports/src/bundle.js +114 -0
  66. package/dist/reports/src/catalog.d.ts +37 -0
  67. package/dist/reports/src/catalog.js +127 -0
  68. package/dist/reports/src/clock.d.ts +14 -0
  69. package/dist/reports/src/clock.js +4 -0
  70. package/dist/reports/src/completion-order.d.ts +10 -0
  71. package/dist/reports/src/completion-order.js +76 -0
  72. package/dist/reports/src/evidence-live.d.ts +40 -0
  73. package/dist/reports/src/evidence-live.js +118 -0
  74. package/dist/reports/src/evidence-types.d.ts +90 -0
  75. package/dist/reports/src/evidence-types.js +15 -0
  76. package/dist/reports/src/evidence-view.d.ts +68 -0
  77. package/dist/reports/src/evidence-view.js +113 -0
  78. package/dist/reports/src/explorer-types.d.ts +56 -0
  79. package/dist/reports/src/explorer-types.js +0 -0
  80. package/dist/reports/src/explorer-versions.d.ts +4 -0
  81. package/dist/reports/src/explorer-versions.js +21 -0
  82. package/dist/reports/src/export-evidence.d.ts +11 -0
  83. package/dist/reports/src/export-evidence.js +94 -0
  84. package/dist/reports/src/fetcher.d.ts +50 -0
  85. package/dist/reports/src/fetcher.js +205 -0
  86. package/dist/reports/src/format-date.d.ts +1 -0
  87. package/dist/reports/src/format-date.js +10 -0
  88. package/dist/reports/src/format.d.ts +16 -0
  89. package/dist/reports/src/format.js +71 -0
  90. package/dist/reports/src/frames.d.ts +46 -0
  91. package/dist/reports/src/frames.js +245 -0
  92. package/dist/reports/src/hash.d.ts +17 -0
  93. package/dist/reports/src/hash.js +43 -0
  94. package/dist/reports/src/html-frame.d.ts +13 -0
  95. package/dist/reports/src/html-frame.js +63 -0
  96. package/dist/reports/src/http.d.ts +3 -0
  97. package/dist/reports/src/http.js +0 -0
  98. package/dist/reports/src/junit.d.ts +23 -0
  99. package/dist/reports/src/junit.js +119 -0
  100. package/dist/reports/src/keyboard.d.ts +16 -0
  101. package/dist/reports/src/keyboard.js +135 -0
  102. package/dist/reports/src/keys.d.ts +53 -0
  103. package/dist/reports/src/keys.js +122 -0
  104. package/dist/reports/src/layer-catalog.d.ts +5 -0
  105. package/dist/reports/src/layer-catalog.js +39 -0
  106. package/dist/reports/src/layer-merge.d.ts +43 -0
  107. package/dist/reports/src/layer-merge.js +154 -0
  108. package/dist/reports/src/layer-source.d.ts +6 -0
  109. package/dist/reports/src/layer-source.js +32 -0
  110. package/dist/reports/src/layer-store.d.ts +10 -0
  111. package/dist/reports/src/layer-store.js +36 -0
  112. package/dist/reports/src/layer-types.d.ts +32 -0
  113. package/dist/reports/src/layer-types.js +0 -0
  114. package/dist/reports/src/layers-route.d.ts +20 -0
  115. package/dist/reports/src/layers-route.js +259 -0
  116. package/dist/reports/src/namespace-guard.d.ts +11 -0
  117. package/dist/reports/src/namespace-guard.js +40 -0
  118. package/dist/reports/src/navigation.d.ts +8 -0
  119. package/dist/reports/src/navigation.js +0 -0
  120. package/dist/reports/src/object-io.d.ts +9 -0
  121. package/dist/reports/src/object-io.js +41 -0
  122. package/dist/reports/src/object-store.d.ts +67 -0
  123. package/dist/reports/src/object-store.js +32 -0
  124. package/dist/reports/src/performance-part.d.ts +9 -0
  125. package/dist/reports/src/performance-part.js +42 -0
  126. package/dist/reports/src/performance.d.ts +13 -0
  127. package/dist/reports/src/performance.js +45 -0
  128. package/dist/reports/src/persist.d.ts +10 -0
  129. package/dist/reports/src/persist.js +38 -0
  130. package/dist/reports/src/phone.d.ts +5 -0
  131. package/dist/reports/src/phone.js +18 -0
  132. package/dist/reports/src/protocol.d.ts +78 -0
  133. package/dist/reports/src/protocol.js +36 -0
  134. package/dist/reports/src/publication.d.ts +4 -0
  135. package/dist/reports/src/publication.js +35 -0
  136. package/dist/reports/src/publish.d.ts +52 -0
  137. package/dist/reports/src/publish.js +189 -0
  138. package/dist/reports/src/read.d.ts +62 -0
  139. package/dist/reports/src/read.js +214 -0
  140. package/dist/reports/src/recording-bundle.d.ts +22 -0
  141. package/dist/reports/src/recording-bundle.js +4 -0
  142. package/dist/reports/src/recording-keys.d.ts +9 -0
  143. package/dist/reports/src/recording-keys.js +50 -0
  144. package/dist/reports/src/remote-report.d.ts +39 -0
  145. package/dist/reports/src/remote-report.js +304 -0
  146. package/dist/reports/src/report-loader.d.ts +22 -0
  147. package/dist/reports/src/report-loader.js +0 -0
  148. package/dist/reports/src/report-parts.d.ts +10 -0
  149. package/dist/reports/src/report-parts.js +112 -0
  150. package/dist/reports/src/report-types.d.ts +194 -0
  151. package/dist/reports/src/report-types.js +29 -0
  152. package/dist/reports/src/reports-explorer-route.d.ts +90 -0
  153. package/dist/reports/src/reports-explorer-route.js +65 -0
  154. package/dist/reports/src/reports-list-route.d.ts +23 -0
  155. package/dist/reports/src/reports-list-route.js +55 -0
  156. package/dist/reports/src/reports-route.d.ts +267 -0
  157. package/dist/reports/src/reports-route.js +204 -0
  158. package/dist/reports/src/reports-store.d.ts +11 -0
  159. package/dist/reports/src/reports-store.js +28 -0
  160. package/dist/reports/src/resilient-cache.d.ts +3 -0
  161. package/dist/reports/src/resilient-cache.js +33 -0
  162. package/dist/reports/src/retention.d.ts +9 -0
  163. package/dist/reports/src/retention.js +16 -0
  164. package/dist/reports/src/scenario.d.ts +15 -0
  165. package/dist/reports/src/scenario.js +35 -0
  166. package/dist/reports/src/snapshot-bundle.d.ts +18 -0
  167. package/dist/reports/src/snapshot-bundle.js +94 -0
  168. package/dist/reports/src/snapshot-surface.d.ts +29 -0
  169. package/dist/reports/src/snapshot-surface.js +339 -0
  170. package/dist/reports/src/source-content.d.ts +30 -0
  171. package/dist/reports/src/source-content.js +63 -0
  172. package/dist/reports/src/source-entries.d.ts +4 -0
  173. package/dist/reports/src/source-entries.js +34 -0
  174. package/dist/reports/src/source-part.d.ts +4 -0
  175. package/dist/reports/src/source-part.js +66 -0
  176. package/dist/reports/src/source-reader.d.ts +6 -0
  177. package/dist/reports/src/source-reader.js +17 -0
  178. package/dist/reports/src/spec-evidence.d.ts +6 -0
  179. package/dist/reports/src/spec-evidence.js +20 -0
  180. package/dist/reports/src/spec-inventory.d.ts +14 -0
  181. package/dist/reports/src/spec-inventory.js +75 -0
  182. package/dist/reports/src/status.d.ts +4 -0
  183. package/dist/reports/src/status.js +8 -0
  184. package/dist/reports/src/store-prefix.d.ts +21 -0
  185. package/dist/reports/src/store-prefix.js +53 -0
  186. package/dist/reports/src/test-catalog-entity.d.ts +3 -0
  187. package/dist/reports/src/test-catalog-entity.js +34 -0
  188. package/dist/reports/src/types.d.ts +5 -0
  189. package/dist/reports/src/types.js +0 -0
  190. package/dist/reports/src/use-report-nav.d.ts +25 -0
  191. package/dist/reports/src/use-report-nav.js +181 -0
  192. package/dist/schema/src/common.d.ts +57 -0
  193. package/dist/schema/src/common.js +32 -0
  194. package/dist/schema/src/index.d.ts +5 -0
  195. package/dist/schema/src/index.js +5 -0
  196. package/dist/schema/src/manifest.d.ts +457 -0
  197. package/dist/schema/src/manifest.js +247 -0
  198. package/dist/schema/src/report-sources.d.ts +68 -0
  199. package/dist/schema/src/report-sources.js +53 -0
  200. package/dist/schema/src/runs-index.d.ts +52 -0
  201. package/dist/schema/src/runs-index.js +24 -0
  202. package/dist/schema/src/spec.d.ts +245 -0
  203. package/dist/schema/src/spec.js +133 -0
  204. package/dist/vitest/src/index.d.ts +22 -0
  205. package/dist/vitest/src/index.js +33 -0
  206. package/dist/webdriver/src/driver.d.ts +69 -0
  207. package/dist/webdriver/src/driver.js +230 -0
  208. package/dist/webdriver/src/index.d.ts +11 -0
  209. package/dist/webdriver/src/index.js +10 -0
  210. package/dist/webdriver/src/protocol.d.ts +60 -0
  211. package/dist/webdriver/src/protocol.js +146 -0
  212. package/package.json +181 -4
  213. package/packages/bun/README.md +69 -0
  214. package/packages/core/README.md +78 -0
  215. package/packages/core/bin/atlas.mjs +8 -0
  216. package/packages/detox/README.md +73 -0
  217. package/packages/playwright/README.md +77 -0
  218. package/packages/reports/README.md +47 -0
  219. package/packages/reports/STORAGE.md +73 -0
  220. package/packages/schema/README.md +23 -0
  221. package/packages/schema/schemas/atlas-change.schema.json +34 -0
  222. package/packages/schema/schemas/atlas.schema.json +32 -0
  223. package/packages/schema/schemas/cloud-event.schema.json +40 -0
  224. package/packages/schema/schemas/journeys.schema.json +17 -0
  225. package/packages/schema/schemas/manifest.schema.json +160 -0
  226. package/packages/schema/schemas/path-record.schema.json +151 -0
  227. package/packages/schema/schemas/report-sources.schema.json +95 -0
  228. package/packages/schema/schemas/run-info.schema.json +176 -0
  229. package/packages/schema/schemas/run-summary.schema.json +206 -0
  230. package/packages/schema/schemas/runs-index.schema.json +23 -0
  231. package/packages/schema/schemas/state-node.schema.json +238 -0
  232. package/packages/schema/schemas/state-record.schema.json +354 -0
  233. package/packages/schema/schemas/timeline-entry.schema.json +124 -0
  234. package/packages/schema/schemas/transition-record.schema.json +125 -0
  235. package/packages/visualizer/README.md +154 -0
  236. package/packages/visualizer/bin/atlas-visualizer.mjs +176 -0
  237. package/packages/visualizer/example/specs/coffee/ordering/checkout.scxml +82 -0
  238. package/packages/visualizer/example/specs/coffee/ordering/journeys.yaml +129 -0
  239. package/packages/visualizer/example/specs/coffee/ordering/known-issues.md +14 -0
  240. package/packages/visualizer/example/specs/coffee/ordering/machine.yaml +158 -0
  241. package/packages/visualizer/example/specs/coffee/ordering/open-questions.md +25 -0
  242. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/chart.mmd +67 -0
  243. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/ctrf.json +245 -0
  244. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/junit.xml +12 -0
  245. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/manifest.json +2003 -0
  246. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/001.vtt +9 -0
  247. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/002.vtt +9 -0
  248. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/003.vtt +9 -0
  249. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/004.vtt +9 -0
  250. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/005.vtt +17 -0
  251. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/006.vtt +9 -0
  252. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/007.vtt +17 -0
  253. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/008.vtt +17 -0
  254. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/009.vtt +13 -0
  255. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/010.vtt +9 -0
  256. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/011.vtt +9 -0
  257. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/012.vtt +9 -0
  258. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/013.vtt +9 -0
  259. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/01.mp4 +0 -0
  260. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/01.poster.webp +0 -0
  261. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/02.mp4 +0 -0
  262. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/02.poster.webp +0 -0
  263. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/03.mp4 +0 -0
  264. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/03.poster.webp +0 -0
  265. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/04.mp4 +0 -0
  266. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/04.poster.webp +0 -0
  267. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/01.png +0 -0
  268. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/01.webp +0 -0
  269. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/02.png +0 -0
  270. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/02.webp +0 -0
  271. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/03.png +0 -0
  272. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/03.webp +0 -0
  273. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/04.png +0 -0
  274. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/04.webp +0 -0
  275. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/05.png +0 -0
  276. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/05.webp +0 -0
  277. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-2/01.png +0 -0
  278. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-2/01.webp +0 -0
  279. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-3/failed-01.png +0 -0
  280. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-3/failed-01.webp +0 -0
  281. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-4/01.png +0 -0
  282. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-4/01.webp +0 -0
  283. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-5/01.png +0 -0
  284. package/packages/visualizer/fixtures/failures/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-5/01.webp +0 -0
  285. package/packages/visualizer/fixtures/failures/specs/coffee/ordering/checkout.scxml +82 -0
  286. package/packages/visualizer/fixtures/failures/specs/coffee/ordering/journeys.yaml +129 -0
  287. package/packages/visualizer/fixtures/failures/specs/coffee/ordering/known-issues.md +14 -0
  288. package/packages/visualizer/fixtures/failures/specs/coffee/ordering/machine.yaml +158 -0
  289. package/packages/visualizer/fixtures/failures/specs/coffee/ordering/open-questions.md +25 -0
  290. package/packages/visualizer/fixtures/full/runs/2026-10-02T09-10-00-000Z-fast/chart.mmd +67 -0
  291. package/packages/visualizer/fixtures/full/runs/2026-10-02T09-10-00-000Z-fast/ctrf.json +247 -0
  292. package/packages/visualizer/fixtures/full/runs/2026-10-02T09-10-00-000Z-fast/junit.xml +12 -0
  293. package/packages/visualizer/fixtures/full/runs/2026-10-02T09-10-00-000Z-fast/manifest.json +1875 -0
  294. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/chart.mmd +67 -0
  295. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/ctrf.json +244 -0
  296. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/junit.xml +12 -0
  297. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/manifest.json +1977 -0
  298. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/captions/001.vtt +9 -0
  299. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/captions/002.vtt +9 -0
  300. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/captions/003.vtt +9 -0
  301. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/captions/004.vtt +9 -0
  302. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/captions/005.vtt +17 -0
  303. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/captions/006.vtt +9 -0
  304. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/clips/journey-1/01.mp4 +0 -0
  305. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/clips/journey-1/01.poster.webp +0 -0
  306. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/clips/journey-1/02.mp4 +0 -0
  307. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/clips/journey-1/02.poster.webp +0 -0
  308. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/paths/journey-1/01.png +0 -0
  309. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/paths/journey-1/01.webp +0 -0
  310. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/paths/journey-1/02.png +0 -0
  311. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/paths/journey-1/02.webp +0 -0
  312. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/paths/journey-1/03.png +0 -0
  313. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/paths/journey-1/03.webp +0 -0
  314. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/paths/journey-2/01.png +0 -0
  315. package/packages/visualizer/fixtures/full/runs/2026-10-04T16-20-00-000Z-showcase/media/paths/journey-2/01.webp +0 -0
  316. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/chart.mmd +67 -0
  317. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/ctrf.json +472 -0
  318. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/junit.xml +16 -0
  319. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/manifest.json +3701 -0
  320. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/001.vtt +9 -0
  321. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/002.vtt +9 -0
  322. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/003.vtt +9 -0
  323. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/004.vtt +9 -0
  324. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/005.vtt +9 -0
  325. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/006.vtt +13 -0
  326. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/007.vtt +9 -0
  327. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/008.vtt +13 -0
  328. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/009.vtt +17 -0
  329. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/010.vtt +9 -0
  330. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/011.vtt +13 -0
  331. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/012.vtt +9 -0
  332. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/013.vtt +9 -0
  333. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/014.vtt +9 -0
  334. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/015.vtt +9 -0
  335. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/016.vtt +9 -0
  336. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/017.vtt +9 -0
  337. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/018.vtt +17 -0
  338. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/019.vtt +9 -0
  339. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/020.vtt +9 -0
  340. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/021.vtt +9 -0
  341. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/022.vtt +17 -0
  342. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/023.vtt +17 -0
  343. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/024.vtt +13 -0
  344. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/025.vtt +9 -0
  345. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/026.vtt +9 -0
  346. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/027.vtt +9 -0
  347. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/028.vtt +9 -0
  348. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/01.mp4 +0 -0
  349. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/01.poster.webp +0 -0
  350. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/02.mp4 +0 -0
  351. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/02.poster.webp +0 -0
  352. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/03.mp4 +0 -0
  353. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/03.poster.webp +0 -0
  354. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/04.mp4 +0 -0
  355. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/04.poster.webp +0 -0
  356. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/01.png +0 -0
  357. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/01.webp +0 -0
  358. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/02.png +0 -0
  359. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/02.webp +0 -0
  360. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/03.png +0 -0
  361. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/03.webp +0 -0
  362. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/04.png +0 -0
  363. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/04.webp +0 -0
  364. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/05.png +0 -0
  365. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/05.webp +0 -0
  366. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/06.png +0 -0
  367. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/06.webp +0 -0
  368. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/07.png +0 -0
  369. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/07.webp +0 -0
  370. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/08.png +0 -0
  371. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/08.webp +0 -0
  372. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/09.png +0 -0
  373. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/09.webp +0 -0
  374. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/10.png +0 -0
  375. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/10.webp +0 -0
  376. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/11.png +0 -0
  377. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/11.webp +0 -0
  378. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/12.png +0 -0
  379. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/12.webp +0 -0
  380. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/13.png +0 -0
  381. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/13.webp +0 -0
  382. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/14.png +0 -0
  383. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/14.webp +0 -0
  384. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-2/01.png +0 -0
  385. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-2/01.webp +0 -0
  386. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-3/01.png +0 -0
  387. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-3/01.webp +0 -0
  388. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-4/01.png +0 -0
  389. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-4/01.webp +0 -0
  390. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-5/01.png +0 -0
  391. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-5/01.webp +0 -0
  392. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-6/01.png +0 -0
  393. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-6/01.webp +0 -0
  394. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-7/01.png +0 -0
  395. package/packages/visualizer/fixtures/full/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-7/01.webp +0 -0
  396. package/packages/visualizer/fixtures/full/specs/coffee/ordering/checkout.scxml +82 -0
  397. package/packages/visualizer/fixtures/full/specs/coffee/ordering/journeys.yaml +129 -0
  398. package/packages/visualizer/fixtures/full/specs/coffee/ordering/known-issues.md +14 -0
  399. package/packages/visualizer/fixtures/full/specs/coffee/ordering/machine.yaml +158 -0
  400. package/packages/visualizer/fixtures/full/specs/coffee/ordering/open-questions.md +25 -0
  401. package/packages/visualizer/fixtures/large/runs/2026-10-06T14-40-00-000Z-fast/ctrf.json +1280 -0
  402. package/packages/visualizer/fixtures/large/runs/2026-10-06T14-40-00-000Z-fast/junit.xml +26 -0
  403. package/packages/visualizer/fixtures/large/runs/2026-10-06T14-40-00-000Z-fast/manifest.json +28393 -0
  404. package/packages/visualizer/fixtures/large/specs/accounts/sign-up/identity-check.machine.yaml +397 -0
  405. package/packages/visualizer/fixtures/large/specs/accounts/sign-up/journeys.yaml +129 -0
  406. package/packages/visualizer/fixtures/large/specs/accounts/sign-up/machine.yaml +830 -0
  407. package/packages/visualizer/fixtures/large/specs/atlas.yaml +65 -0
  408. package/packages/visualizer/fixtures/large/specs/billing/invoices/journeys.yaml +132 -0
  409. package/packages/visualizer/fixtures/large/specs/billing/invoices/machine.yaml +830 -0
  410. package/packages/visualizer/fixtures/large/specs/billing/invoices/refund-handling.scxml +288 -0
  411. package/packages/visualizer/fixtures/large/specs/catalog/browsing/journeys.yaml +126 -0
  412. package/packages/visualizer/fixtures/large/specs/catalog/browsing/machine.yaml +831 -0
  413. package/packages/visualizer/fixtures/large/specs/catalog/browsing/product-comparison.machine.yaml +395 -0
  414. package/packages/visualizer/fixtures/large/specs/orders/checkout/journeys.yaml +120 -0
  415. package/packages/visualizer/fixtures/large/specs/orders/checkout/machine.yaml +724 -0
  416. package/packages/visualizer/fixtures/large/specs/orders/checkout/open-questions.md +16 -0
  417. package/packages/visualizer/fixtures/large/specs/orders/checkout/payment.scxml +288 -0
  418. package/packages/visualizer/fixtures/large/specs/shipping/deliveries/delivery-scheduling.machine.yaml +397 -0
  419. package/packages/visualizer/fixtures/large/specs/shipping/deliveries/journeys.yaml +132 -0
  420. package/packages/visualizer/fixtures/large/specs/shipping/deliveries/known-issues.md +13 -0
  421. package/packages/visualizer/fixtures/large/specs/shipping/deliveries/machine.yaml +830 -0
  422. package/packages/visualizer/fixtures/large/specs/support/tickets/escalation.machine.yaml +395 -0
  423. package/packages/visualizer/fixtures/large/specs/support/tickets/journeys.yaml +123 -0
  424. package/packages/visualizer/fixtures/large/specs/support/tickets/machine.yaml +720 -0
  425. package/packages/visualizer/fixtures/malformed/runs/2026-10-06T10-00-00-000Z-showcase/manifest.json +68 -0
  426. package/packages/visualizer/fixtures/malformed/runs/2026-10-06T11-00-00-000Z-showcase/ctrf.json +50 -0
  427. package/packages/visualizer/fixtures/malformed/runs/2026-10-06T11-00-00-000Z-showcase/junit.xml +6 -0
  428. package/packages/visualizer/fixtures/malformed/runs/2026-10-06T11-00-00-000Z-showcase/manifest.json +1281 -0
  429. package/packages/visualizer/fixtures/malformed/runs/2026-10-06T12-00-00-000Z-showcase/ctrf.json +50 -0
  430. package/packages/visualizer/fixtures/malformed/runs/2026-10-06T12-00-00-000Z-showcase/junit.xml +6 -0
  431. package/packages/visualizer/fixtures/malformed/runs/2026-10-06T12-00-00-000Z-showcase/manifest.json +1232 -0
  432. package/packages/visualizer/fixtures/malformed/runs/2026-10-06T13-00-00-000Z-showcase/manifest.json +1244 -0
  433. package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/checkout.scxml +82 -0
  434. package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/journeys.yaml +134 -0
  435. package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/known-issues.md +14 -0
  436. package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/loyalty.scxml +4 -0
  437. package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/machine.yaml +156 -0
  438. package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/open-questions.md +25 -0
  439. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/chart.mmd +67 -0
  440. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/ctrf.json +149 -0
  441. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/junit.xml +9 -0
  442. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/manifest.json +1718 -0
  443. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/001.vtt +9 -0
  444. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/002.vtt +17 -0
  445. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/003.vtt +17 -0
  446. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/004.vtt +9 -0
  447. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/005.vtt +9 -0
  448. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/01.mp4 +0 -0
  449. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/01.poster.webp +0 -0
  450. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/02.mp4 +0 -0
  451. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/02.poster.webp +0 -0
  452. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/03.mp4 +0 -0
  453. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/03.poster.webp +0 -0
  454. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/01.png +0 -0
  455. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/01.webp +0 -0
  456. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/02.png +0 -0
  457. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/02.webp +0 -0
  458. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/03.png +0 -0
  459. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/03.webp +0 -0
  460. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/05.png +0 -0
  461. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/05.webp +0 -0
  462. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-3/01.png +0 -0
  463. package/packages/visualizer/fixtures/partial/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-3/01.webp +0 -0
  464. package/packages/visualizer/fixtures/partial/runs/2026-10-06T15-05-00-000Z-showcase/media/paths/journey-1/00-start-01.png +0 -0
  465. package/packages/visualizer/fixtures/partial/runs/2026-10-06T15-05-00-000Z-showcase/media/paths/journey-1/00-start-01.webp +0 -0
  466. package/packages/visualizer/fixtures/partial/runs/2026-10-06T15-05-00-000Z-showcase/media/paths/journey-1/02.png +0 -0
  467. package/packages/visualizer/fixtures/partial/runs/2026-10-06T15-05-00-000Z-showcase/media/paths/journey-1/02.webp +0 -0
  468. package/packages/visualizer/fixtures/partial/specs/coffee/ordering/checkout.scxml +82 -0
  469. package/packages/visualizer/fixtures/partial/specs/coffee/ordering/journeys.yaml +129 -0
  470. package/packages/visualizer/fixtures/partial/specs/coffee/ordering/known-issues.md +14 -0
  471. package/packages/visualizer/fixtures/partial/specs/coffee/ordering/machine.yaml +158 -0
  472. package/packages/visualizer/fixtures/partial/specs/coffee/ordering/open-questions.md +25 -0
  473. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/ctrf.json +79 -0
  474. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/junit.xml +7 -0
  475. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/manifest.json +1504 -0
  476. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/001.vtt +9 -0
  477. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/002.vtt +9 -0
  478. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/003.vtt +9 -0
  479. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/captions/004.vtt +17 -0
  480. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/01.mp4 +0 -0
  481. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/01.poster.webp +0 -0
  482. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/02.mp4 +0 -0
  483. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/clips/journey-1/02.poster.webp +0 -0
  484. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/01.png +0 -0
  485. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/01.webp +0 -0
  486. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/02.png +0 -0
  487. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/02.webp +0 -0
  488. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/03.png +0 -0
  489. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/03.webp +0 -0
  490. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/04.png +0 -0
  491. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-1/04.webp +0 -0
  492. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-2/01.png +0 -0
  493. package/packages/visualizer/fixtures/removed/runs/2026-10-06T14-40-00-000Z-showcase/media/paths/journey-2/01.webp +0 -0
  494. package/packages/visualizer/fixtures/removed/specs/coffee/ordering/checkout.scxml +82 -0
  495. package/packages/visualizer/fixtures/removed/specs/coffee/ordering/journeys.yaml +129 -0
  496. package/packages/visualizer/fixtures/removed/specs/coffee/ordering/known-issues.md +14 -0
  497. package/packages/visualizer/fixtures/removed/specs/coffee/ordering/machine.yaml +158 -0
  498. package/packages/visualizer/fixtures/removed/specs/coffee/ordering/open-questions.md +25 -0
  499. package/packages/visualizer/fixtures/spec-only/runs/.gitkeep +0 -0
  500. package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/checkout.scxml +82 -0
  501. package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/journeys.yaml +129 -0
  502. package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/known-issues.md +14 -0
  503. package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/machine.yaml +158 -0
  504. package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/open-questions.md +25 -0
  505. package/packages/visualizer/index.html +13 -0
  506. package/packages/visualizer/scripts/make-fixtures.ts +1490 -0
  507. package/packages/visualizer/scripts/publish-data.ts +22 -0
  508. package/packages/visualizer/src/app/AppShell.tsx +56 -0
  509. package/packages/visualizer/src/app/atlas-context.tsx +23 -0
  510. package/packages/visualizer/src/app/gazetteer.module.css +97 -0
  511. package/packages/visualizer/src/app/gazetteer.tsx +105 -0
  512. package/packages/visualizer/src/app/report-sources.tsx +122 -0
  513. package/packages/visualizer/src/app/router.tsx +69 -0
  514. package/packages/visualizer/src/app/search-query.tsx +14 -0
  515. package/packages/visualizer/src/components/DataIssues.module.css +136 -0
  516. package/packages/visualizer/src/components/DataIssues.tsx +70 -0
  517. package/packages/visualizer/src/components/Header.module.css +189 -0
  518. package/packages/visualizer/src/components/Header.tsx +127 -0
  519. package/packages/visualizer/src/components/Legend.module.css +84 -0
  520. package/packages/visualizer/src/components/Legend.tsx +50 -0
  521. package/packages/visualizer/src/components/Screen.module.css +312 -0
  522. package/packages/visualizer/src/components/Screen.tsx +141 -0
  523. package/packages/visualizer/src/components/Status.module.css +116 -0
  524. package/packages/visualizer/src/components/Status.tsx +60 -0
  525. package/packages/visualizer/src/components/icons.tsx +156 -0
  526. package/packages/visualizer/src/components/labels.tsx +22 -0
  527. package/packages/visualizer/src/data/adapters/adapter.ts +112 -0
  528. package/packages/visualizer/src/data/adapters/context.tsx +11 -0
  529. package/packages/visualizer/src/data/adapters/index.ts +29 -0
  530. package/packages/visualizer/src/data/adapters/report-backend.test.ts +96 -0
  531. package/packages/visualizer/src/data/adapters/report-backend.ts +42 -0
  532. package/packages/visualizer/src/data/fixtures.test.ts +407 -0
  533. package/packages/visualizer/src/data/model/build.ts +418 -0
  534. package/packages/visualizer/src/data/model/event-kind.test.ts +59 -0
  535. package/packages/visualizer/src/data/model/event-kind.ts +54 -0
  536. package/packages/visualizer/src/data/model/index.ts +3 -0
  537. package/packages/visualizer/src/data/model/journeys.test.ts +159 -0
  538. package/packages/visualizer/src/data/model/journeys.ts +29 -0
  539. package/packages/visualizer/src/data/model/simulation.test.ts +115 -0
  540. package/packages/visualizer/src/data/model/simulation.ts +187 -0
  541. package/packages/visualizer/src/data/model/status.test.ts +34 -0
  542. package/packages/visualizer/src/data/model/status.ts +43 -0
  543. package/packages/visualizer/src/data/model/types.ts +280 -0
  544. package/packages/visualizer/src/data/parse/issues.test.ts +82 -0
  545. package/packages/visualizer/src/data/parse/issues.ts +114 -0
  546. package/packages/visualizer/src/data/parse/manifest.ts +173 -0
  547. package/packages/visualizer/src/data/parse/markdown.test.ts +119 -0
  548. package/packages/visualizer/src/data/parse/markdown.ts +133 -0
  549. package/packages/visualizer/src/data/parse/spec.test.ts +106 -0
  550. package/packages/visualizer/src/data/parse/spec.ts +557 -0
  551. package/packages/visualizer/src/data/parse/structured.ts +44 -0
  552. package/packages/visualizer/src/data/queries.ts +369 -0
  553. package/packages/visualizer/src/data/testing/load-fixture.ts +63 -0
  554. package/packages/visualizer/src/evidence/api.ts +41 -0
  555. package/packages/visualizer/src/evidence/check-detail.tsx +257 -0
  556. package/packages/visualizer/src/evidence/decision-table.tsx +68 -0
  557. package/packages/visualizer/src/evidence/document-page.tsx +40 -0
  558. package/packages/visualizer/src/evidence/evidence-context.tsx +159 -0
  559. package/packages/visualizer/src/evidence/evidence.module.css +877 -0
  560. package/packages/visualizer/src/evidence/feature-page.tsx +88 -0
  561. package/packages/visualizer/src/evidence/format.ts +56 -0
  562. package/packages/visualizer/src/evidence/gherkin.ts +98 -0
  563. package/packages/visualizer/src/evidence/marks.tsx +118 -0
  564. package/packages/visualizer/src/evidence/model-page.tsx +60 -0
  565. package/packages/visualizer/src/evidence/model-trace.tsx +57 -0
  566. package/packages/visualizer/src/evidence/overview.tsx +134 -0
  567. package/packages/visualizer/src/evidence/quint.ts +45 -0
  568. package/packages/visualizer/src/evidence/recording-page.tsx +69 -0
  569. package/packages/visualizer/src/evidence/recording.module.css +464 -0
  570. package/packages/visualizer/src/evidence/recording.tsx +197 -0
  571. package/packages/visualizer/src/evidence/snapshot.tsx +108 -0
  572. package/packages/visualizer/src/evidence/sources-panel.tsx +134 -0
  573. package/packages/visualizer/src/evidence/sources.module.css +168 -0
  574. package/packages/visualizer/src/evidence/spec-header.tsx +64 -0
  575. package/packages/visualizer/src/evidence/spec-index.tsx +82 -0
  576. package/packages/visualizer/src/evidence/spec-page.tsx +92 -0
  577. package/packages/visualizer/src/evidence/spec-snapshot.tsx +26 -0
  578. package/packages/visualizer/src/layout/graph.test.ts +113 -0
  579. package/packages/visualizer/src/layout/graph.ts +324 -0
  580. package/packages/visualizer/src/layout/layout.ts +237 -0
  581. package/packages/visualizer/src/layout/use-chart-layout.ts +18 -0
  582. package/packages/visualizer/src/main.tsx +31 -0
  583. package/packages/visualizer/src/map/ChartMap.tsx +252 -0
  584. package/packages/visualizer/src/map/EventEdge.tsx +138 -0
  585. package/packages/visualizer/src/map/map.module.css +546 -0
  586. package/packages/visualizer/src/map/nodes.tsx +145 -0
  587. package/packages/visualizer/src/map/path.ts +24 -0
  588. package/packages/visualizer/src/reachable.test.ts +54 -0
  589. package/packages/visualizer/src/spec-kind.test.ts +27 -0
  590. package/packages/visualizer/src/spec-kind.ts +56 -0
  591. package/packages/visualizer/src/state/ui-store.ts +44 -0
  592. package/packages/visualizer/src/styles/global.css +105 -0
  593. package/packages/visualizer/src/styles/tokens.css +80 -0
  594. package/packages/visualizer/src/views/ChartPage.tsx +52 -0
  595. package/packages/visualizer/src/views/ProductPage.tsx +35 -0
  596. package/packages/visualizer/src/views/SidePanel.tsx +339 -0
  597. package/packages/visualizer/src/views/views.module.css +546 -0
  598. package/packages/visualizer/vite/atlas-dev-plugin.ts +169 -0
  599. package/packages/visualizer/vite/atlas-files.test.ts +119 -0
  600. package/packages/visualizer/vite/atlas-files.ts +199 -0
  601. package/packages/visualizer/vite/publish.test.ts +52 -0
  602. package/packages/visualizer/vite/publish.ts +99 -0
  603. package/packages/visualizer/vite/reports-dev-plugin.ts +82 -0
  604. package/packages/visualizer/vite.config.ts +13 -0
  605. package/packages/vitest/README.md +58 -0
  606. package/packages/webdriver/README.md +77 -0
@@ -0,0 +1,2003 @@
1
+ {
2
+ "$schema": "https://github.com/crvouga/atlas/schemas/manifest.schema.json",
3
+ "schemaVersion": 1,
4
+ "run": {
5
+ "id": "2026-10-06T14-40-00-000Z-showcase",
6
+ "startedAt": "2026-10-06T14:40:00.000Z",
7
+ "finishedAt": "2026-10-06T14:47:35.000Z",
8
+ "durationMs": 455000,
9
+ "commit": "571dc134d087dde25bfff6177c4fdafe794c3a4a",
10
+ "branch": "main",
11
+ "environment": {
12
+ "driver": "playwright",
13
+ "baseUrl": "http://localhost:3000",
14
+ "viewport": {
15
+ "width": 390,
16
+ "height": 844
17
+ },
18
+ "deviceScaleFactor": 3
19
+ },
20
+ "mode": "showcase",
21
+ "specVersion": "f7ef440c67ed",
22
+ "specDirectory": "specs",
23
+ "approvals": [],
24
+ "scope": {
25
+ "chart": "Checkout",
26
+ "start": "A customer with a drink in the cart"
27
+ }
28
+ },
29
+ "charts": [
30
+ {
31
+ "id": "Coffee order",
32
+ "file": "coffee/ordering/machine.yaml",
33
+ "description": "A customer picks a drink, pays for it, and picks it up when it is ready.",
34
+ "parentState": null,
35
+ "handOffs": {}
36
+ },
37
+ {
38
+ "id": "Checkout",
39
+ "file": "coffee/ordering/checkout.scxml",
40
+ "description": "Paying for the order, by card or with a wallet.",
41
+ "parentState": "Checking out",
42
+ "handOffs": {
43
+ "Paid": "Payment goes through",
44
+ "Checkout abandoned": "Leaves checkout"
45
+ }
46
+ }
47
+ ],
48
+ "map": {
49
+ "nodes": [
50
+ {
51
+ "id": "Browsing the menu",
52
+ "parent": null,
53
+ "chart": "Coffee order",
54
+ "type": "atomic",
55
+ "initial": null,
56
+ "inScope": false
57
+ },
58
+ {
59
+ "id": "Customizing the drink",
60
+ "parent": null,
61
+ "chart": "Coffee order",
62
+ "type": "compound",
63
+ "initial": "Choosing a size",
64
+ "inScope": false
65
+ },
66
+ {
67
+ "id": "Choosing a size",
68
+ "parent": "Customizing the drink",
69
+ "chart": "Coffee order",
70
+ "type": "atomic",
71
+ "initial": null,
72
+ "inScope": false
73
+ },
74
+ {
75
+ "id": "Choosing the milk",
76
+ "parent": "Customizing the drink",
77
+ "chart": "Coffee order",
78
+ "type": "atomic",
79
+ "initial": null,
80
+ "inScope": false
81
+ },
82
+ {
83
+ "id": "Ready to add the drink",
84
+ "parent": "Customizing the drink",
85
+ "chart": "Coffee order",
86
+ "type": "atomic",
87
+ "initial": null,
88
+ "inScope": false
89
+ },
90
+ {
91
+ "id": "Reviewing the cart",
92
+ "parent": null,
93
+ "chart": "Coffee order",
94
+ "type": "atomic",
95
+ "initial": null,
96
+ "inScope": true
97
+ },
98
+ {
99
+ "id": "Checking out",
100
+ "parent": null,
101
+ "chart": "Coffee order",
102
+ "type": "atomic",
103
+ "initial": null,
104
+ "inScope": true
105
+ },
106
+ {
107
+ "id": "Order in progress",
108
+ "parent": null,
109
+ "chart": "Coffee order",
110
+ "type": "parallel",
111
+ "initial": null,
112
+ "inScope": true
113
+ },
114
+ {
115
+ "id": "Drink",
116
+ "parent": "Order in progress",
117
+ "chart": "Coffee order",
118
+ "type": "compound",
119
+ "initial": "Paid, waiting for the barista",
120
+ "inScope": false
121
+ },
122
+ {
123
+ "id": "Paid, waiting for the barista",
124
+ "parent": "Drink",
125
+ "chart": "Coffee order",
126
+ "type": "atomic",
127
+ "initial": null,
128
+ "inScope": false
129
+ },
130
+ {
131
+ "id": "Drink being made",
132
+ "parent": "Drink",
133
+ "chart": "Coffee order",
134
+ "type": "atomic",
135
+ "initial": null,
136
+ "inScope": false
137
+ },
138
+ {
139
+ "id": "Drink ready for pickup",
140
+ "parent": "Drink",
141
+ "chart": "Coffee order",
142
+ "type": "atomic",
143
+ "initial": null,
144
+ "inScope": false
145
+ },
146
+ {
147
+ "id": "Updates",
148
+ "parent": "Order in progress",
149
+ "chart": "Coffee order",
150
+ "type": "compound",
151
+ "initial": "Updates on",
152
+ "inScope": false
153
+ },
154
+ {
155
+ "id": "Updates on",
156
+ "parent": "Updates",
157
+ "chart": "Coffee order",
158
+ "type": "atomic",
159
+ "initial": null,
160
+ "inScope": false
161
+ },
162
+ {
163
+ "id": "Updates off",
164
+ "parent": "Updates",
165
+ "chart": "Coffee order",
166
+ "type": "atomic",
167
+ "initial": null,
168
+ "inScope": false
169
+ },
170
+ {
171
+ "id": "Told the drink was thrown away",
172
+ "parent": null,
173
+ "chart": "Coffee order",
174
+ "type": "atomic",
175
+ "initial": null,
176
+ "inScope": false
177
+ },
178
+ {
179
+ "id": "Order complete",
180
+ "parent": null,
181
+ "chart": "Coffee order",
182
+ "type": "final",
183
+ "initial": null,
184
+ "inScope": false
185
+ },
186
+ {
187
+ "id": "Choosing how to pay",
188
+ "parent": null,
189
+ "chart": "Checkout",
190
+ "type": "atomic",
191
+ "initial": null,
192
+ "inScope": true
193
+ },
194
+ {
195
+ "id": "Entering card details",
196
+ "parent": null,
197
+ "chart": "Checkout",
198
+ "type": "atomic",
199
+ "initial": null,
200
+ "inScope": true
201
+ },
202
+ {
203
+ "id": "Confirming with the wallet",
204
+ "parent": null,
205
+ "chart": "Checkout",
206
+ "type": "atomic",
207
+ "initial": null,
208
+ "inScope": true
209
+ },
210
+ {
211
+ "id": "Waiting for the payment",
212
+ "parent": null,
213
+ "chart": "Checkout",
214
+ "type": "atomic",
215
+ "initial": null,
216
+ "inScope": true
217
+ },
218
+ {
219
+ "id": "Told the payment is slow",
220
+ "parent": null,
221
+ "chart": "Checkout",
222
+ "type": "atomic",
223
+ "initial": null,
224
+ "inScope": true
225
+ },
226
+ {
227
+ "id": "Told the payment was declined",
228
+ "parent": null,
229
+ "chart": "Checkout",
230
+ "type": "atomic",
231
+ "initial": null,
232
+ "inScope": true
233
+ },
234
+ {
235
+ "id": "Paid",
236
+ "parent": null,
237
+ "chart": "Checkout",
238
+ "type": "final",
239
+ "initial": null,
240
+ "inScope": true
241
+ },
242
+ {
243
+ "id": "Checkout abandoned",
244
+ "parent": null,
245
+ "chart": "Checkout",
246
+ "type": "final",
247
+ "initial": null,
248
+ "inScope": true
249
+ }
250
+ ],
251
+ "edges": [
252
+ {
253
+ "id": "Browsing the menu :: Picks a drink",
254
+ "source": "Browsing the menu",
255
+ "target": "Customizing the drink",
256
+ "event": "Picks a drink",
257
+ "kind": "user",
258
+ "inScope": false
259
+ },
260
+ {
261
+ "id": "Choosing a size :: Picks a size",
262
+ "source": "Choosing a size",
263
+ "target": "Choosing the milk",
264
+ "event": "Picks a size",
265
+ "kind": "user",
266
+ "inScope": false
267
+ },
268
+ {
269
+ "id": "Choosing the milk :: Picks a milk",
270
+ "source": "Choosing the milk",
271
+ "target": "Ready to add the drink",
272
+ "event": "Picks a milk",
273
+ "kind": "user",
274
+ "inScope": false
275
+ },
276
+ {
277
+ "id": "Ready to add the drink :: Adds the drink to the cart",
278
+ "source": "Ready to add the drink",
279
+ "target": "Reviewing the cart",
280
+ "event": "Adds the drink to the cart",
281
+ "kind": "user",
282
+ "inScope": false
283
+ },
284
+ {
285
+ "id": "Customizing the drink :: Goes back to the menu",
286
+ "source": "Customizing the drink",
287
+ "target": "Browsing the menu",
288
+ "event": "Goes back to the menu",
289
+ "kind": "user",
290
+ "inScope": false
291
+ },
292
+ {
293
+ "id": "Reviewing the cart :: Removes the last drink",
294
+ "source": "Reviewing the cart",
295
+ "target": "Browsing the menu",
296
+ "event": "Removes the last drink",
297
+ "kind": "user",
298
+ "inScope": false
299
+ },
300
+ {
301
+ "id": "Reviewing the cart :: Starts checkout",
302
+ "source": "Reviewing the cart",
303
+ "target": "Checking out",
304
+ "event": "Starts checkout",
305
+ "kind": "user",
306
+ "inScope": true
307
+ },
308
+ {
309
+ "id": "Paid, waiting for the barista :: Barista starts the drink",
310
+ "source": "Paid, waiting for the barista",
311
+ "target": "Drink being made",
312
+ "event": "Barista starts the drink",
313
+ "kind": "system",
314
+ "inScope": false
315
+ },
316
+ {
317
+ "id": "Drink being made :: Barista finishes the drink",
318
+ "source": "Drink being made",
319
+ "target": "Drink ready for pickup",
320
+ "event": "Barista finishes the drink",
321
+ "kind": "system",
322
+ "inScope": false
323
+ },
324
+ {
325
+ "id": "Drink ready for pickup :: Picks up the drink",
326
+ "source": "Drink ready for pickup",
327
+ "target": "Order complete",
328
+ "event": "Picks up the drink",
329
+ "kind": "user",
330
+ "inScope": false
331
+ },
332
+ {
333
+ "id": "Drink ready for pickup :: Drink sits ready for ten minutes",
334
+ "source": "Drink ready for pickup",
335
+ "target": "Told the drink was thrown away",
336
+ "event": "Drink sits ready for ten minutes",
337
+ "kind": "time",
338
+ "inScope": false
339
+ },
340
+ {
341
+ "id": "Updates on :: Turns off updates",
342
+ "source": "Updates on",
343
+ "target": "Updates off",
344
+ "event": "Turns off updates",
345
+ "kind": "user",
346
+ "inScope": false
347
+ },
348
+ {
349
+ "id": "Updates off :: Turns on updates",
350
+ "source": "Updates off",
351
+ "target": "Updates on",
352
+ "event": "Turns on updates",
353
+ "kind": "user",
354
+ "inScope": false
355
+ },
356
+ {
357
+ "id": "Told the drink was thrown away :: Orders again",
358
+ "source": "Told the drink was thrown away",
359
+ "target": "Browsing the menu",
360
+ "event": "Orders again",
361
+ "kind": "user",
362
+ "inScope": false
363
+ },
364
+ {
365
+ "id": "Choosing how to pay :: Picks card",
366
+ "source": "Choosing how to pay",
367
+ "target": "Entering card details",
368
+ "event": "Picks card",
369
+ "kind": "user",
370
+ "inScope": true
371
+ },
372
+ {
373
+ "id": "Choosing how to pay :: Picks wallet",
374
+ "source": "Choosing how to pay",
375
+ "target": "Confirming with the wallet",
376
+ "event": "Picks wallet",
377
+ "kind": "user",
378
+ "inScope": true
379
+ },
380
+ {
381
+ "id": "Choosing how to pay :: Closes checkout",
382
+ "source": "Choosing how to pay",
383
+ "target": "Checkout abandoned",
384
+ "event": "Closes checkout",
385
+ "kind": "user",
386
+ "inScope": true
387
+ },
388
+ {
389
+ "id": "Entering card details :: Submits the card",
390
+ "source": "Entering card details",
391
+ "target": "Waiting for the payment",
392
+ "event": "Submits the card",
393
+ "kind": "user",
394
+ "inScope": true
395
+ },
396
+ {
397
+ "id": "Entering card details :: Goes back to the payment options",
398
+ "source": "Entering card details",
399
+ "target": "Choosing how to pay",
400
+ "event": "Goes back to the payment options",
401
+ "kind": "user",
402
+ "inScope": true
403
+ },
404
+ {
405
+ "id": "Confirming with the wallet :: Confirms with the wallet",
406
+ "source": "Confirming with the wallet",
407
+ "target": "Waiting for the payment",
408
+ "event": "Confirms with the wallet",
409
+ "kind": "user",
410
+ "inScope": true
411
+ },
412
+ {
413
+ "id": "Confirming with the wallet :: Cancels the wallet",
414
+ "source": "Confirming with the wallet",
415
+ "target": "Choosing how to pay",
416
+ "event": "Cancels the wallet",
417
+ "kind": "user",
418
+ "inScope": true
419
+ },
420
+ {
421
+ "id": "Waiting for the payment :: Payment provider approves the payment",
422
+ "source": "Waiting for the payment",
423
+ "target": "Paid",
424
+ "event": "Payment provider approves the payment",
425
+ "kind": "system",
426
+ "inScope": true
427
+ },
428
+ {
429
+ "id": "Waiting for the payment :: Payment provider declines the payment",
430
+ "source": "Waiting for the payment",
431
+ "target": "Told the payment was declined",
432
+ "event": "Payment provider declines the payment",
433
+ "kind": "system",
434
+ "inScope": true
435
+ },
436
+ {
437
+ "id": "Waiting for the payment :: Payment takes longer than a minute",
438
+ "source": "Waiting for the payment",
439
+ "target": "Told the payment is slow",
440
+ "event": "Payment takes longer than a minute",
441
+ "kind": "time",
442
+ "inScope": true
443
+ },
444
+ {
445
+ "id": "Told the payment is slow :: Checks the payment again",
446
+ "source": "Told the payment is slow",
447
+ "target": "Waiting for the payment",
448
+ "event": "Checks the payment again",
449
+ "kind": "user",
450
+ "inScope": true
451
+ },
452
+ {
453
+ "id": "Told the payment was declined :: Tries another way to pay",
454
+ "source": "Told the payment was declined",
455
+ "target": "Choosing how to pay",
456
+ "event": "Tries another way to pay",
457
+ "kind": "user",
458
+ "inScope": true
459
+ },
460
+ {
461
+ "id": "Paid :: Payment goes through",
462
+ "source": "Paid",
463
+ "target": "Order in progress",
464
+ "event": "Payment goes through",
465
+ "kind": "hand-off",
466
+ "inScope": true
467
+ },
468
+ {
469
+ "id": "Checkout abandoned :: Leaves checkout",
470
+ "source": "Checkout abandoned",
471
+ "target": "Reviewing the cart",
472
+ "event": "Leaves checkout",
473
+ "kind": "hand-off",
474
+ "inScope": true
475
+ }
476
+ ]
477
+ },
478
+ "states": {
479
+ "Reviewing the cart": {
480
+ "name": "Reviewing the cart",
481
+ "chart": "Coffee order",
482
+ "description": "The drinks in the cart, the total, and a checkout button.",
483
+ "snapshot": "cart",
484
+ "confidence": "confirmed",
485
+ "source": [],
486
+ "expectedEvents": [],
487
+ "status": "passed",
488
+ "screenshot": {
489
+ "png": "media/paths/journey-1/01.png",
490
+ "webp": "media/paths/journey-1/01.webp"
491
+ },
492
+ "screenshotsByPath": {
493
+ "journey-1": {
494
+ "png": "media/paths/journey-1/01.png",
495
+ "webp": "media/paths/journey-1/01.webp"
496
+ }
497
+ },
498
+ "recognizer": {
499
+ "matched": true,
500
+ "signals": [
501
+ {
502
+ "signal": "test ID \"cart\"",
503
+ "expected": "visible",
504
+ "visible": true
505
+ }
506
+ ]
507
+ },
508
+ "looksLike": [],
509
+ "businessEvents": null,
510
+ "checks": [
511
+ {
512
+ "check": "The screen shows \"Reviewing the cart\"",
513
+ "passed": true,
514
+ "expected": "test ID \"cart\" visible",
515
+ "actual": "visible"
516
+ }
517
+ ],
518
+ "reachedBy": [
519
+ "journey-1",
520
+ "journey-2",
521
+ "journey-3",
522
+ "journey-4",
523
+ "journey-5",
524
+ "journey-6",
525
+ "journey-7"
526
+ ],
527
+ "notes": []
528
+ },
529
+ "Checking out": {
530
+ "name": "Checking out",
531
+ "chart": "Coffee order",
532
+ "description": "Checkout runs as its own chart.",
533
+ "snapshot": "checking-out",
534
+ "confidence": "confirmed",
535
+ "source": [],
536
+ "expectedEvents": [],
537
+ "status": "passed",
538
+ "screenshot": null,
539
+ "screenshotsByPath": {},
540
+ "recognizer": {
541
+ "matched": true,
542
+ "signals": [
543
+ {
544
+ "signal": "test ID \"checking-out\"",
545
+ "expected": "visible",
546
+ "visible": true
547
+ }
548
+ ]
549
+ },
550
+ "looksLike": [],
551
+ "businessEvents": null,
552
+ "checks": [],
553
+ "reachedBy": [
554
+ "journey-1",
555
+ "journey-2",
556
+ "journey-3",
557
+ "journey-4",
558
+ "journey-5",
559
+ "journey-6",
560
+ "journey-7"
561
+ ],
562
+ "notes": []
563
+ },
564
+ "Order in progress": {
565
+ "name": "Order in progress",
566
+ "chart": "Coffee order",
567
+ "description": "The drink is made while the customer chooses how to hear about it.",
568
+ "snapshot": "order-in-progress",
569
+ "confidence": "confirmed",
570
+ "source": [],
571
+ "expectedEvents": [],
572
+ "status": "passed",
573
+ "screenshot": null,
574
+ "screenshotsByPath": {},
575
+ "recognizer": {
576
+ "matched": true,
577
+ "signals": [
578
+ {
579
+ "signal": "test ID \"order-in-progress\"",
580
+ "expected": "visible",
581
+ "visible": true
582
+ }
583
+ ]
584
+ },
585
+ "looksLike": [],
586
+ "businessEvents": null,
587
+ "checks": [],
588
+ "reachedBy": [
589
+ "journey-1",
590
+ "journey-2",
591
+ "journey-4",
592
+ "journey-6",
593
+ "journey-7"
594
+ ],
595
+ "notes": []
596
+ },
597
+ "Choosing how to pay": {
598
+ "name": "Choosing how to pay",
599
+ "chart": "Checkout",
600
+ "description": "Card and wallet buttons, and the order total.",
601
+ "snapshot": "pay-options",
602
+ "confidence": "confirmed",
603
+ "source": [],
604
+ "expectedEvents": [],
605
+ "status": "passed",
606
+ "screenshot": {
607
+ "png": "media/paths/journey-1/02.png",
608
+ "webp": "media/paths/journey-1/02.webp"
609
+ },
610
+ "screenshotsByPath": {
611
+ "journey-1": {
612
+ "png": "media/paths/journey-1/02.png",
613
+ "webp": "media/paths/journey-1/02.webp"
614
+ }
615
+ },
616
+ "recognizer": {
617
+ "matched": true,
618
+ "signals": [
619
+ {
620
+ "signal": "test ID \"pay-options\"",
621
+ "expected": "visible",
622
+ "visible": true
623
+ }
624
+ ]
625
+ },
626
+ "looksLike": [],
627
+ "businessEvents": null,
628
+ "checks": [
629
+ {
630
+ "check": "The screen shows \"Choosing how to pay\"",
631
+ "passed": true,
632
+ "expected": "test ID \"pay-options\" visible",
633
+ "actual": "visible"
634
+ }
635
+ ],
636
+ "reachedBy": [
637
+ "journey-1",
638
+ "journey-2",
639
+ "journey-3",
640
+ "journey-4",
641
+ "journey-5",
642
+ "journey-6",
643
+ "journey-7"
644
+ ],
645
+ "notes": []
646
+ },
647
+ "Entering card details": {
648
+ "name": "Entering card details",
649
+ "chart": "Checkout",
650
+ "description": "A form for the card number, expiry and code.",
651
+ "snapshot": "card-form",
652
+ "confidence": "confirmed",
653
+ "source": [],
654
+ "expectedEvents": [],
655
+ "status": "passed",
656
+ "screenshot": {
657
+ "png": "media/paths/journey-1/03.png",
658
+ "webp": "media/paths/journey-1/03.webp"
659
+ },
660
+ "screenshotsByPath": {
661
+ "journey-1": {
662
+ "png": "media/paths/journey-1/03.png",
663
+ "webp": "media/paths/journey-1/03.webp"
664
+ }
665
+ },
666
+ "recognizer": {
667
+ "matched": true,
668
+ "signals": [
669
+ {
670
+ "signal": "test ID \"card-form\"",
671
+ "expected": "visible",
672
+ "visible": true
673
+ }
674
+ ]
675
+ },
676
+ "looksLike": [],
677
+ "businessEvents": null,
678
+ "checks": [
679
+ {
680
+ "check": "The screen shows \"Entering card details\"",
681
+ "passed": true,
682
+ "expected": "test ID \"card-form\" visible",
683
+ "actual": "visible"
684
+ }
685
+ ],
686
+ "reachedBy": [
687
+ "journey-1",
688
+ "journey-3",
689
+ "journey-4",
690
+ "journey-6"
691
+ ],
692
+ "notes": []
693
+ },
694
+ "Confirming with the wallet": {
695
+ "name": "Confirming with the wallet",
696
+ "chart": "Checkout",
697
+ "description": "The wallet sheet asks the customer to confirm the payment.",
698
+ "snapshot": "wallet-sheet",
699
+ "confidence": "confirmed",
700
+ "source": [],
701
+ "expectedEvents": [],
702
+ "status": "passed",
703
+ "screenshot": {
704
+ "png": "media/paths/journey-2/01.png",
705
+ "webp": "media/paths/journey-2/01.webp"
706
+ },
707
+ "screenshotsByPath": {
708
+ "journey-2": {
709
+ "png": "media/paths/journey-2/01.png",
710
+ "webp": "media/paths/journey-2/01.webp"
711
+ }
712
+ },
713
+ "recognizer": {
714
+ "matched": true,
715
+ "signals": [
716
+ {
717
+ "signal": "test ID \"wallet-sheet\"",
718
+ "expected": "visible",
719
+ "visible": true
720
+ }
721
+ ]
722
+ },
723
+ "looksLike": [],
724
+ "businessEvents": null,
725
+ "checks": [
726
+ {
727
+ "check": "The screen shows \"Confirming with the wallet\"",
728
+ "passed": true,
729
+ "expected": "test ID \"wallet-sheet\" visible",
730
+ "actual": "visible"
731
+ }
732
+ ],
733
+ "reachedBy": [
734
+ "journey-2",
735
+ "journey-7"
736
+ ],
737
+ "notes": []
738
+ },
739
+ "Waiting for the payment": {
740
+ "name": "Waiting for the payment",
741
+ "chart": "Checkout",
742
+ "description": "A spinner while the payment provider answers.",
743
+ "snapshot": "paying",
744
+ "confidence": "confirmed",
745
+ "source": [],
746
+ "expectedEvents": [
747
+ "Payment requested"
748
+ ],
749
+ "status": "passed",
750
+ "screenshot": {
751
+ "png": "media/paths/journey-1/04.png",
752
+ "webp": "media/paths/journey-1/04.webp"
753
+ },
754
+ "screenshotsByPath": {
755
+ "journey-1": {
756
+ "png": "media/paths/journey-1/04.png",
757
+ "webp": "media/paths/journey-1/04.webp"
758
+ }
759
+ },
760
+ "recognizer": {
761
+ "matched": true,
762
+ "signals": [
763
+ {
764
+ "signal": "test ID \"paying\"",
765
+ "expected": "visible",
766
+ "visible": true
767
+ }
768
+ ]
769
+ },
770
+ "looksLike": [],
771
+ "businessEvents": {
772
+ "expected": [
773
+ "Payment requested"
774
+ ],
775
+ "observed": [],
776
+ "missing": [
777
+ "Payment requested"
778
+ ],
779
+ "noSignal": [],
780
+ "events": []
781
+ },
782
+ "checks": [
783
+ {
784
+ "check": "The screen shows \"Waiting for the payment\"",
785
+ "passed": true,
786
+ "expected": "test ID \"paying\" visible",
787
+ "actual": "visible"
788
+ }
789
+ ],
790
+ "reachedBy": [
791
+ "journey-1",
792
+ "journey-2",
793
+ "journey-3",
794
+ "journey-4",
795
+ "journey-6",
796
+ "journey-7"
797
+ ],
798
+ "notes": []
799
+ },
800
+ "Told the payment is slow": {
801
+ "name": "Told the payment is slow",
802
+ "chart": "Checkout",
803
+ "description": "A message says the payment is taking longer than usual, with \"Check again\".",
804
+ "snapshot": "paying-slow",
805
+ "confidence": "assumed",
806
+ "source": [],
807
+ "expectedEvents": [],
808
+ "status": "flaky",
809
+ "screenshot": {
810
+ "png": "media/paths/journey-4/01.png",
811
+ "webp": "media/paths/journey-4/01.webp"
812
+ },
813
+ "screenshotsByPath": {
814
+ "journey-4": {
815
+ "png": "media/paths/journey-4/01.png",
816
+ "webp": "media/paths/journey-4/01.webp"
817
+ }
818
+ },
819
+ "recognizer": {
820
+ "matched": true,
821
+ "signals": [
822
+ {
823
+ "signal": "test ID \"paying-slow\"",
824
+ "expected": "visible",
825
+ "visible": true
826
+ }
827
+ ]
828
+ },
829
+ "looksLike": [],
830
+ "businessEvents": null,
831
+ "checks": [
832
+ {
833
+ "check": "The screen shows \"Told the payment is slow\"",
834
+ "passed": true,
835
+ "expected": "test ID \"paying-slow\" visible",
836
+ "actual": "visible"
837
+ }
838
+ ],
839
+ "reachedBy": [
840
+ "journey-4"
841
+ ],
842
+ "notes": [
843
+ "Passed on the second attempt: the first attempt saw the spinner still running."
844
+ ]
845
+ },
846
+ "Told the payment was declined": {
847
+ "name": "Told the payment was declined",
848
+ "chart": "Checkout",
849
+ "description": "A message says the payment was declined, with \"Try another way\".",
850
+ "snapshot": "payment-declined",
851
+ "confidence": "confirmed",
852
+ "source": [],
853
+ "expectedEvents": [
854
+ "Payment declined"
855
+ ],
856
+ "status": "failed",
857
+ "screenshot": null,
858
+ "screenshotsByPath": {
859
+ "journey-3 (failed)": {
860
+ "png": "media/paths/journey-3/failed-01.png",
861
+ "webp": "media/paths/journey-3/failed-01.webp"
862
+ }
863
+ },
864
+ "recognizer": {
865
+ "matched": false,
866
+ "signals": [
867
+ {
868
+ "signal": "test ID \"payment-declined\"",
869
+ "expected": "visible",
870
+ "visible": false
871
+ }
872
+ ]
873
+ },
874
+ "looksLike": [],
875
+ "businessEvents": null,
876
+ "checks": [
877
+ {
878
+ "check": "The screen shows \"Told the payment was declined\"",
879
+ "passed": false,
880
+ "expected": "test ID \"payment-declined\" visible",
881
+ "actual": "hidden; the app looks like none of the known screens"
882
+ }
883
+ ],
884
+ "reachedBy": [],
885
+ "notes": []
886
+ },
887
+ "Paid": {
888
+ "name": "Paid",
889
+ "chart": "Checkout",
890
+ "description": "A check mark confirms the payment.",
891
+ "snapshot": "paid",
892
+ "confidence": "confirmed",
893
+ "source": [],
894
+ "expectedEvents": [
895
+ "Payment captured"
896
+ ],
897
+ "status": "failed",
898
+ "screenshot": {
899
+ "png": "media/paths/journey-1/05.png",
900
+ "webp": "media/paths/journey-1/05.webp"
901
+ },
902
+ "screenshotsByPath": {
903
+ "journey-1": {
904
+ "png": "media/paths/journey-1/05.png",
905
+ "webp": "media/paths/journey-1/05.webp"
906
+ }
907
+ },
908
+ "recognizer": {
909
+ "matched": true,
910
+ "signals": [
911
+ {
912
+ "signal": "test ID \"paid\"",
913
+ "expected": "visible",
914
+ "visible": true
915
+ }
916
+ ]
917
+ },
918
+ "looksLike": [],
919
+ "businessEvents": {
920
+ "expected": [
921
+ "Payment captured",
922
+ "Customer notified"
923
+ ],
924
+ "observed": [
925
+ "Payment captured"
926
+ ],
927
+ "missing": [
928
+ "Customer notified"
929
+ ],
930
+ "noSignal": [],
931
+ "events": [
932
+ {
933
+ "specversion": "1.0",
934
+ "id": "0bbca02b645e86457bc8",
935
+ "source": "/fixture/orders",
936
+ "type": "com.example.payment.captured",
937
+ "time": "2026-10-06T14:45:00.000Z",
938
+ "subject": "order-fixture-failures",
939
+ "datacontenttype": "application/json",
940
+ "data": {
941
+ "name": "Payment captured"
942
+ }
943
+ }
944
+ ]
945
+ },
946
+ "checks": [
947
+ {
948
+ "check": "The screen shows \"Paid\"",
949
+ "passed": true,
950
+ "expected": "test ID \"paid\" visible",
951
+ "actual": "visible"
952
+ },
953
+ {
954
+ "check": "Business event \"Customer notified\" is recorded",
955
+ "passed": false,
956
+ "expected": "recorded within 10 seconds",
957
+ "actual": "not recorded"
958
+ }
959
+ ],
960
+ "reachedBy": [
961
+ "journey-1",
962
+ "journey-2",
963
+ "journey-4",
964
+ "journey-6",
965
+ "journey-7"
966
+ ],
967
+ "notes": []
968
+ },
969
+ "Checkout abandoned": {
970
+ "name": "Checkout abandoned",
971
+ "chart": "Checkout",
972
+ "description": "Checkout closes and the cart is kept.",
973
+ "snapshot": "checkout-closed",
974
+ "confidence": "confirmed",
975
+ "source": [],
976
+ "expectedEvents": [],
977
+ "status": "passed",
978
+ "screenshot": {
979
+ "png": "media/paths/journey-5/01.png",
980
+ "webp": "media/paths/journey-5/01.webp"
981
+ },
982
+ "screenshotsByPath": {
983
+ "journey-5": {
984
+ "png": "media/paths/journey-5/01.png",
985
+ "webp": "media/paths/journey-5/01.webp"
986
+ }
987
+ },
988
+ "recognizer": {
989
+ "matched": true,
990
+ "signals": [
991
+ {
992
+ "signal": "test ID \"checkout-closed\"",
993
+ "expected": "visible",
994
+ "visible": true
995
+ }
996
+ ]
997
+ },
998
+ "looksLike": [],
999
+ "businessEvents": null,
1000
+ "checks": [
1001
+ {
1002
+ "check": "The screen shows \"Checkout abandoned\"",
1003
+ "passed": true,
1004
+ "expected": "test ID \"checkout-closed\" visible",
1005
+ "actual": "visible"
1006
+ }
1007
+ ],
1008
+ "reachedBy": [
1009
+ "journey-5"
1010
+ ],
1011
+ "notes": []
1012
+ }
1013
+ },
1014
+ "transitions": {
1015
+ "Reviewing the cart :: Starts checkout": {
1016
+ "id": "Reviewing the cart :: Starts checkout",
1017
+ "source": "Reviewing the cart",
1018
+ "target": "Checking out",
1019
+ "event": "Starts checkout",
1020
+ "kind": "user",
1021
+ "how": "The user starts checkout in the app.",
1022
+ "status": "passed",
1023
+ "clip": {
1024
+ "video": "media/clips/journey-1/01.mp4",
1025
+ "poster": "media/clips/journey-1/01.poster.webp",
1026
+ "durationMs": 2500,
1027
+ "captions": "media/captions/001.vtt"
1028
+ },
1029
+ "timeline": [
1030
+ {
1031
+ "atMs": 700,
1032
+ "kind": "tap",
1033
+ "label": "Start checkout",
1034
+ "x": 57,
1035
+ "y": 738
1036
+ },
1037
+ {
1038
+ "atMs": 2100,
1039
+ "kind": "screen",
1040
+ "label": "Now: Checking out"
1041
+ }
1042
+ ],
1043
+ "reason": null,
1044
+ "reachedBy": [
1045
+ "journey-1",
1046
+ "journey-2",
1047
+ "journey-3",
1048
+ "journey-4",
1049
+ "journey-5",
1050
+ "journey-6",
1051
+ "journey-7"
1052
+ ]
1053
+ },
1054
+ "Choosing how to pay :: Picks card": {
1055
+ "id": "Choosing how to pay :: Picks card",
1056
+ "source": "Choosing how to pay",
1057
+ "target": "Entering card details",
1058
+ "event": "Picks card",
1059
+ "kind": "user",
1060
+ "how": "The user picks card in the app.",
1061
+ "status": "passed",
1062
+ "clip": {
1063
+ "video": "media/clips/journey-1/01.mp4",
1064
+ "poster": "media/clips/journey-1/01.poster.webp",
1065
+ "durationMs": 2500,
1066
+ "captions": "media/captions/002.vtt"
1067
+ },
1068
+ "timeline": [
1069
+ {
1070
+ "atMs": 700,
1071
+ "kind": "tap",
1072
+ "label": "Pick card",
1073
+ "x": 331,
1074
+ "y": 749
1075
+ },
1076
+ {
1077
+ "atMs": 2100,
1078
+ "kind": "screen",
1079
+ "label": "Now: Entering card details"
1080
+ }
1081
+ ],
1082
+ "reason": null,
1083
+ "reachedBy": [
1084
+ "journey-1",
1085
+ "journey-3",
1086
+ "journey-4",
1087
+ "journey-6"
1088
+ ]
1089
+ },
1090
+ "Choosing how to pay :: Picks wallet": {
1091
+ "id": "Choosing how to pay :: Picks wallet",
1092
+ "source": "Choosing how to pay",
1093
+ "target": "Confirming with the wallet",
1094
+ "event": "Picks wallet",
1095
+ "kind": "user",
1096
+ "how": "The user picks wallet in the app.",
1097
+ "status": "flaky",
1098
+ "clip": {
1099
+ "video": "media/clips/journey-1/01.mp4",
1100
+ "poster": "media/clips/journey-1/01.poster.webp",
1101
+ "durationMs": 2500,
1102
+ "captions": "media/captions/003.vtt"
1103
+ },
1104
+ "timeline": [
1105
+ {
1106
+ "atMs": 700,
1107
+ "kind": "tap",
1108
+ "label": "Pick wallet",
1109
+ "x": 82,
1110
+ "y": 568
1111
+ },
1112
+ {
1113
+ "atMs": 2100,
1114
+ "kind": "screen",
1115
+ "label": "Now: Confirming with the wallet"
1116
+ }
1117
+ ],
1118
+ "reason": "Timed out waiting for \"Confirming with the wallet\" on the first attempt",
1119
+ "reachedBy": [
1120
+ "journey-2",
1121
+ "journey-7"
1122
+ ]
1123
+ },
1124
+ "Choosing how to pay :: Closes checkout": {
1125
+ "id": "Choosing how to pay :: Closes checkout",
1126
+ "source": "Choosing how to pay",
1127
+ "target": "Checkout abandoned",
1128
+ "event": "Closes checkout",
1129
+ "kind": "user",
1130
+ "how": "The user closes checkout in the app.",
1131
+ "status": "passed",
1132
+ "clip": {
1133
+ "video": "media/clips/journey-1/01.mp4",
1134
+ "poster": "media/clips/journey-1/01.poster.webp",
1135
+ "durationMs": 2500,
1136
+ "captions": "media/captions/004.vtt"
1137
+ },
1138
+ "timeline": [
1139
+ {
1140
+ "atMs": 700,
1141
+ "kind": "tap",
1142
+ "label": "Close checkout",
1143
+ "x": 325,
1144
+ "y": 570
1145
+ },
1146
+ {
1147
+ "atMs": 2100,
1148
+ "kind": "screen",
1149
+ "label": "Now: Checkout abandoned"
1150
+ }
1151
+ ],
1152
+ "reason": null,
1153
+ "reachedBy": [
1154
+ "journey-5"
1155
+ ]
1156
+ },
1157
+ "Entering card details :: Submits the card": {
1158
+ "id": "Entering card details :: Submits the card",
1159
+ "source": "Entering card details",
1160
+ "target": "Waiting for the payment",
1161
+ "event": "Submits the card",
1162
+ "kind": "user",
1163
+ "how": "The user submits the card in the app.",
1164
+ "status": "passed",
1165
+ "clip": {
1166
+ "video": "media/clips/journey-1/02.mp4",
1167
+ "poster": "media/clips/journey-1/02.poster.webp",
1168
+ "durationMs": 2500,
1169
+ "captions": "media/captions/005.vtt"
1170
+ },
1171
+ "timeline": [
1172
+ {
1173
+ "atMs": 300,
1174
+ "kind": "tap",
1175
+ "label": "Card number",
1176
+ "x": 195,
1177
+ "y": 308
1178
+ },
1179
+ {
1180
+ "atMs": 650,
1181
+ "kind": "type",
1182
+ "label": "Card number",
1183
+ "text": "4242 4242 4242 4242"
1184
+ },
1185
+ {
1186
+ "atMs": 1500,
1187
+ "kind": "tap",
1188
+ "label": "Submit the card",
1189
+ "x": 59,
1190
+ "y": 631
1191
+ },
1192
+ {
1193
+ "atMs": 2100,
1194
+ "kind": "screen",
1195
+ "label": "Now: Waiting for the payment"
1196
+ }
1197
+ ],
1198
+ "reason": null,
1199
+ "reachedBy": [
1200
+ "journey-1",
1201
+ "journey-3",
1202
+ "journey-4",
1203
+ "journey-6"
1204
+ ]
1205
+ },
1206
+ "Entering card details :: Goes back to the payment options": {
1207
+ "id": "Entering card details :: Goes back to the payment options",
1208
+ "source": "Entering card details",
1209
+ "target": "Choosing how to pay",
1210
+ "event": "Goes back to the payment options",
1211
+ "kind": "user",
1212
+ "how": null,
1213
+ "status": "not-reached",
1214
+ "clip": null,
1215
+ "timeline": [],
1216
+ "reason": "No journey goes back from the card form, and generated paths are off in this run.",
1217
+ "reachedBy": []
1218
+ },
1219
+ "Confirming with the wallet :: Confirms with the wallet": {
1220
+ "id": "Confirming with the wallet :: Confirms with the wallet",
1221
+ "source": "Confirming with the wallet",
1222
+ "target": "Waiting for the payment",
1223
+ "event": "Confirms with the wallet",
1224
+ "kind": "user",
1225
+ "how": "The user confirms with the wallet in the app.",
1226
+ "status": "flaky",
1227
+ "clip": {
1228
+ "video": "media/clips/journey-1/01.mp4",
1229
+ "poster": "media/clips/journey-1/01.poster.webp",
1230
+ "durationMs": 2500,
1231
+ "captions": "media/captions/013.vtt"
1232
+ },
1233
+ "timeline": [
1234
+ {
1235
+ "atMs": 700,
1236
+ "kind": "tap",
1237
+ "label": "Confirm with the wallet",
1238
+ "x": 179,
1239
+ "y": 586
1240
+ },
1241
+ {
1242
+ "atMs": 2100,
1243
+ "kind": "screen",
1244
+ "label": "Now: Waiting for the payment"
1245
+ }
1246
+ ],
1247
+ "reason": "The wallet sheet answered slowly once; passed on retry.",
1248
+ "reachedBy": [
1249
+ "journey-2",
1250
+ "journey-7"
1251
+ ]
1252
+ },
1253
+ "Confirming with the wallet :: Cancels the wallet": {
1254
+ "id": "Confirming with the wallet :: Cancels the wallet",
1255
+ "source": "Confirming with the wallet",
1256
+ "target": "Choosing how to pay",
1257
+ "event": "Cancels the wallet",
1258
+ "kind": "user",
1259
+ "how": null,
1260
+ "status": "not-reached",
1261
+ "clip": null,
1262
+ "timeline": [],
1263
+ "reason": "The wallet stand-in cannot be cancelled yet.",
1264
+ "reachedBy": []
1265
+ },
1266
+ "Waiting for the payment :: Payment provider approves the payment": {
1267
+ "id": "Waiting for the payment :: Payment provider approves the payment",
1268
+ "source": "Waiting for the payment",
1269
+ "target": "Paid",
1270
+ "event": "Payment provider approves the payment",
1271
+ "kind": "system",
1272
+ "how": "The fixture sends POST /webhooks/payments as Payment provider webhook.",
1273
+ "status": "passed",
1274
+ "clip": {
1275
+ "video": "media/clips/journey-1/03.mp4",
1276
+ "poster": "media/clips/journey-1/03.poster.webp",
1277
+ "durationMs": 2500,
1278
+ "captions": "media/captions/007.vtt"
1279
+ },
1280
+ "timeline": [
1281
+ {
1282
+ "atMs": 400,
1283
+ "kind": "note",
1284
+ "label": "The user waits on this screen"
1285
+ },
1286
+ {
1287
+ "atMs": 900,
1288
+ "kind": "system",
1289
+ "label": "Payment provider approves the payment",
1290
+ "system": {
1291
+ "source": "Payment provider webhook",
1292
+ "endpoint": "POST /webhooks/payments",
1293
+ "eventType": "payment.approved",
1294
+ "payload": {
1295
+ "type": "payment.approved",
1296
+ "data": {
1297
+ "paymentId": "pay_fixture_0007",
1298
+ "status": "approved"
1299
+ }
1300
+ },
1301
+ "responseStatus": 200
1302
+ }
1303
+ },
1304
+ {
1305
+ "atMs": 1300,
1306
+ "kind": "notification",
1307
+ "label": "Approved",
1308
+ "notification": {
1309
+ "channel": "push",
1310
+ "title": "Approved",
1311
+ "body": "Next: paid."
1312
+ }
1313
+ },
1314
+ {
1315
+ "atMs": 1900,
1316
+ "kind": "screen",
1317
+ "label": "Now: Paid"
1318
+ }
1319
+ ],
1320
+ "reason": null,
1321
+ "reachedBy": [
1322
+ "journey-1",
1323
+ "journey-2",
1324
+ "journey-4",
1325
+ "journey-6",
1326
+ "journey-7"
1327
+ ]
1328
+ },
1329
+ "Waiting for the payment :: Payment provider declines the payment": {
1330
+ "id": "Waiting for the payment :: Payment provider declines the payment",
1331
+ "source": "Waiting for the payment",
1332
+ "target": "Told the payment was declined",
1333
+ "event": "Payment provider declines the payment",
1334
+ "kind": "system",
1335
+ "how": "The fixture sends POST /webhooks/payments as Payment provider webhook.",
1336
+ "status": "failed",
1337
+ "clip": {
1338
+ "video": "media/clips/journey-1/03.mp4",
1339
+ "poster": "media/clips/journey-1/03.poster.webp",
1340
+ "durationMs": 2500,
1341
+ "captions": "media/captions/008.vtt"
1342
+ },
1343
+ "timeline": [
1344
+ {
1345
+ "atMs": 400,
1346
+ "kind": "note",
1347
+ "label": "The user waits on this screen"
1348
+ },
1349
+ {
1350
+ "atMs": 900,
1351
+ "kind": "system",
1352
+ "label": "Payment provider declines the payment",
1353
+ "system": {
1354
+ "source": "Payment provider webhook",
1355
+ "endpoint": "POST /webhooks/payments",
1356
+ "eventType": "payment.declined",
1357
+ "payload": {
1358
+ "type": "payment.declined",
1359
+ "data": {
1360
+ "paymentId": "pay_fixture_0008",
1361
+ "status": "declined"
1362
+ }
1363
+ },
1364
+ "responseStatus": 200
1365
+ }
1366
+ },
1367
+ {
1368
+ "atMs": 1300,
1369
+ "kind": "notification",
1370
+ "label": "Payment declined",
1371
+ "notification": {
1372
+ "channel": "in-app",
1373
+ "title": "Payment declined",
1374
+ "body": "Try another way to pay."
1375
+ }
1376
+ },
1377
+ {
1378
+ "atMs": 1900,
1379
+ "kind": "screen",
1380
+ "label": "Now: Told the payment was declined"
1381
+ }
1382
+ ],
1383
+ "reason": "Expected \"Told the payment was declined\", the app looks like none of the known screens",
1384
+ "reachedBy": [
1385
+ "journey-3"
1386
+ ]
1387
+ },
1388
+ "Waiting for the payment :: Payment takes longer than a minute": {
1389
+ "id": "Waiting for the payment :: Payment takes longer than a minute",
1390
+ "source": "Waiting for the payment",
1391
+ "target": "Told the payment is slow",
1392
+ "event": "Payment takes longer than a minute",
1393
+ "kind": "time",
1394
+ "how": "The test clock jumps forward; nothing in the app is touched.",
1395
+ "status": "flaky",
1396
+ "clip": {
1397
+ "video": "media/clips/journey-1/04.mp4",
1398
+ "poster": "media/clips/journey-1/04.poster.webp",
1399
+ "durationMs": 2500,
1400
+ "captions": "media/captions/009.vtt"
1401
+ },
1402
+ "timeline": [
1403
+ {
1404
+ "atMs": 300,
1405
+ "kind": "time",
1406
+ "label": "Payment takes longer than a minute",
1407
+ "time": {
1408
+ "from": "2026-10-06T22:40:00.000Z",
1409
+ "to": "2026-10-06T22:41:10.000Z",
1410
+ "fired": [
1411
+ {
1412
+ "at": "2026-10-06T22:41:10.000Z",
1413
+ "label": "Payment status check runs"
1414
+ }
1415
+ ]
1416
+ }
1417
+ },
1418
+ {
1419
+ "atMs": 1100,
1420
+ "kind": "notification",
1421
+ "label": "Still waiting on your payment",
1422
+ "notification": {
1423
+ "channel": "in-app",
1424
+ "title": "Still waiting on your payment",
1425
+ "body": "This can take a little longer."
1426
+ }
1427
+ },
1428
+ {
1429
+ "atMs": 1900,
1430
+ "kind": "screen",
1431
+ "label": "Now: Told the payment is slow"
1432
+ }
1433
+ ],
1434
+ "reason": "The clock jump landed before the payment check started; passed on retry",
1435
+ "reachedBy": [
1436
+ "journey-4"
1437
+ ]
1438
+ },
1439
+ "Told the payment is slow :: Checks the payment again": {
1440
+ "id": "Told the payment is slow :: Checks the payment again",
1441
+ "source": "Told the payment is slow",
1442
+ "target": "Waiting for the payment",
1443
+ "event": "Checks the payment again",
1444
+ "kind": "user",
1445
+ "how": "The user checks the payment again in the app.",
1446
+ "status": "passed",
1447
+ "clip": {
1448
+ "video": "media/clips/journey-1/01.mp4",
1449
+ "poster": "media/clips/journey-1/01.poster.webp",
1450
+ "durationMs": 2500,
1451
+ "captions": "media/captions/010.vtt"
1452
+ },
1453
+ "timeline": [
1454
+ {
1455
+ "atMs": 700,
1456
+ "kind": "tap",
1457
+ "label": "Check the payment again",
1458
+ "x": 244,
1459
+ "y": 621
1460
+ },
1461
+ {
1462
+ "atMs": 2100,
1463
+ "kind": "screen",
1464
+ "label": "Now: Waiting for the payment"
1465
+ }
1466
+ ],
1467
+ "reason": null,
1468
+ "reachedBy": [
1469
+ "journey-4"
1470
+ ]
1471
+ },
1472
+ "Told the payment was declined :: Tries another way to pay": {
1473
+ "id": "Told the payment was declined :: Tries another way to pay",
1474
+ "source": "Told the payment was declined",
1475
+ "target": "Choosing how to pay",
1476
+ "event": "Tries another way to pay",
1477
+ "kind": "user",
1478
+ "how": null,
1479
+ "status": "not-reached",
1480
+ "clip": null,
1481
+ "timeline": [],
1482
+ "reason": "No path reached it.",
1483
+ "reachedBy": []
1484
+ },
1485
+ "Paid :: Payment goes through": {
1486
+ "id": "Paid :: Payment goes through",
1487
+ "source": "Paid",
1488
+ "target": "Order in progress",
1489
+ "event": "Payment goes through",
1490
+ "kind": "hand-off",
1491
+ "how": "The child chart reached an end, so the parent chart moves on.",
1492
+ "status": "passed",
1493
+ "clip": {
1494
+ "video": "media/clips/journey-1/03.mp4",
1495
+ "poster": "media/clips/journey-1/03.poster.webp",
1496
+ "durationMs": 2500,
1497
+ "captions": "media/captions/011.vtt"
1498
+ },
1499
+ "timeline": [
1500
+ {
1501
+ "atMs": 200,
1502
+ "kind": "note",
1503
+ "label": "Checkout is done and hands back with \"Payment goes through\""
1504
+ },
1505
+ {
1506
+ "atMs": 700,
1507
+ "kind": "screen",
1508
+ "label": "Now: Order in progress"
1509
+ }
1510
+ ],
1511
+ "reason": null,
1512
+ "reachedBy": [
1513
+ "journey-1",
1514
+ "journey-2",
1515
+ "journey-4",
1516
+ "journey-6",
1517
+ "journey-7"
1518
+ ]
1519
+ },
1520
+ "Checkout abandoned :: Leaves checkout": {
1521
+ "id": "Checkout abandoned :: Leaves checkout",
1522
+ "source": "Checkout abandoned",
1523
+ "target": "Reviewing the cart",
1524
+ "event": "Leaves checkout",
1525
+ "kind": "hand-off",
1526
+ "how": "The child chart reached an end, so the parent chart moves on.",
1527
+ "status": "passed",
1528
+ "clip": {
1529
+ "video": "media/clips/journey-1/03.mp4",
1530
+ "poster": "media/clips/journey-1/03.poster.webp",
1531
+ "durationMs": 2500,
1532
+ "captions": "media/captions/012.vtt"
1533
+ },
1534
+ "timeline": [
1535
+ {
1536
+ "atMs": 200,
1537
+ "kind": "note",
1538
+ "label": "Checkout is done and hands back with \"Leaves checkout\""
1539
+ },
1540
+ {
1541
+ "atMs": 700,
1542
+ "kind": "screen",
1543
+ "label": "Now: Reviewing the cart"
1544
+ }
1545
+ ],
1546
+ "reason": null,
1547
+ "reachedBy": [
1548
+ "journey-5"
1549
+ ]
1550
+ }
1551
+ },
1552
+ "paths": [
1553
+ {
1554
+ "id": "journey-1",
1555
+ "name": "Orders a drink and pays by card",
1556
+ "kind": "journey",
1557
+ "description": "The everyday order, from the menu to picking the drink up.",
1558
+ "status": "passed",
1559
+ "attempts": [
1560
+ {
1561
+ "status": "passed",
1562
+ "error": null,
1563
+ "stoppedAt": null,
1564
+ "trace": null
1565
+ }
1566
+ ],
1567
+ "steps": [
1568
+ {
1569
+ "transition": "Reviewing the cart :: Starts checkout",
1570
+ "event": "Starts checkout",
1571
+ "status": "passed",
1572
+ "reason": null
1573
+ },
1574
+ {
1575
+ "transition": "Choosing how to pay :: Picks card",
1576
+ "event": "Picks card",
1577
+ "status": "passed",
1578
+ "reason": null
1579
+ },
1580
+ {
1581
+ "transition": "Entering card details :: Submits the card",
1582
+ "event": "Submits the card",
1583
+ "status": "passed",
1584
+ "reason": null
1585
+ },
1586
+ {
1587
+ "transition": "Waiting for the payment :: Payment provider approves the payment",
1588
+ "event": "Payment provider approves the payment",
1589
+ "status": "passed",
1590
+ "reason": null
1591
+ },
1592
+ {
1593
+ "transition": "Paid :: Payment goes through",
1594
+ "event": "Payment goes through",
1595
+ "status": "passed",
1596
+ "reason": null
1597
+ }
1598
+ ],
1599
+ "stoppedAt": null
1600
+ },
1601
+ {
1602
+ "id": "journey-2",
1603
+ "name": "Pays with a wallet",
1604
+ "kind": "journey",
1605
+ "description": "The wallet confirms the payment instead of a card.",
1606
+ "status": "flaky",
1607
+ "attempts": [
1608
+ {
1609
+ "status": "failed",
1610
+ "error": "Timed out waiting for \"Confirming with the wallet\" on the first attempt",
1611
+ "stoppedAt": null,
1612
+ "trace": null
1613
+ },
1614
+ {
1615
+ "status": "passed",
1616
+ "error": null,
1617
+ "stoppedAt": null,
1618
+ "trace": null
1619
+ }
1620
+ ],
1621
+ "steps": [
1622
+ {
1623
+ "transition": "Reviewing the cart :: Starts checkout",
1624
+ "event": "Starts checkout",
1625
+ "status": "passed",
1626
+ "reason": null
1627
+ },
1628
+ {
1629
+ "transition": "Choosing how to pay :: Picks wallet",
1630
+ "event": "Picks wallet",
1631
+ "status": "flaky",
1632
+ "reason": "Timed out waiting for \"Confirming with the wallet\" on the first attempt"
1633
+ },
1634
+ {
1635
+ "transition": "Confirming with the wallet :: Confirms with the wallet",
1636
+ "event": "Confirms with the wallet",
1637
+ "status": "passed",
1638
+ "reason": null
1639
+ },
1640
+ {
1641
+ "transition": "Waiting for the payment :: Payment provider approves the payment",
1642
+ "event": "Payment provider approves the payment",
1643
+ "status": "passed",
1644
+ "reason": null
1645
+ },
1646
+ {
1647
+ "transition": "Paid :: Payment goes through",
1648
+ "event": "Payment goes through",
1649
+ "status": "passed",
1650
+ "reason": null
1651
+ }
1652
+ ],
1653
+ "stoppedAt": null
1654
+ },
1655
+ {
1656
+ "id": "journey-3",
1657
+ "name": "Card declined, then a wallet works",
1658
+ "kind": "journey",
1659
+ "description": "The card is declined and the wallet goes through.",
1660
+ "status": "failed",
1661
+ "attempts": [
1662
+ {
1663
+ "status": "failed",
1664
+ "error": "Expected \"Told the payment was declined\", the app looks like none of the known screens",
1665
+ "stoppedAt": "Told the payment was declined",
1666
+ "trace": null
1667
+ },
1668
+ {
1669
+ "status": "failed",
1670
+ "error": "Expected \"Told the payment was declined\", the app looks like none of the known screens",
1671
+ "stoppedAt": "Told the payment was declined",
1672
+ "trace": null
1673
+ }
1674
+ ],
1675
+ "steps": [
1676
+ {
1677
+ "transition": "Reviewing the cart :: Starts checkout",
1678
+ "event": "Starts checkout",
1679
+ "status": "passed",
1680
+ "reason": null
1681
+ },
1682
+ {
1683
+ "transition": "Choosing how to pay :: Picks card",
1684
+ "event": "Picks card",
1685
+ "status": "passed",
1686
+ "reason": null
1687
+ },
1688
+ {
1689
+ "transition": "Entering card details :: Submits the card",
1690
+ "event": "Submits the card",
1691
+ "status": "passed",
1692
+ "reason": null
1693
+ },
1694
+ {
1695
+ "transition": "Waiting for the payment :: Payment provider declines the payment",
1696
+ "event": "Payment provider declines the payment",
1697
+ "status": "failed",
1698
+ "reason": "Expected \"Told the payment was declined\", the app looks like none of the known screens"
1699
+ },
1700
+ {
1701
+ "transition": "Told the payment was declined :: Tries another way to pay",
1702
+ "event": "Tries another way to pay",
1703
+ "status": "not-reached",
1704
+ "reason": "Not reached: the path stopped at \"Told the payment was declined\"."
1705
+ },
1706
+ {
1707
+ "transition": "Choosing how to pay :: Picks wallet",
1708
+ "event": "Picks wallet",
1709
+ "status": "not-reached",
1710
+ "reason": "Not reached: the path stopped at \"Told the payment was declined\"."
1711
+ },
1712
+ {
1713
+ "transition": "Confirming with the wallet :: Confirms with the wallet",
1714
+ "event": "Confirms with the wallet",
1715
+ "status": "not-reached",
1716
+ "reason": "Not reached: the path stopped at \"Told the payment was declined\"."
1717
+ },
1718
+ {
1719
+ "transition": "Waiting for the payment :: Payment provider approves the payment",
1720
+ "event": "Payment provider approves the payment",
1721
+ "status": "not-reached",
1722
+ "reason": "Not reached: the path stopped at \"Told the payment was declined\"."
1723
+ },
1724
+ {
1725
+ "transition": "Paid :: Payment goes through",
1726
+ "event": "Payment goes through",
1727
+ "status": "not-reached",
1728
+ "reason": "Not reached: the path stopped at \"Told the payment was declined\"."
1729
+ }
1730
+ ],
1731
+ "stoppedAt": "Told the payment was declined"
1732
+ },
1733
+ {
1734
+ "id": "journey-4",
1735
+ "name": "Slow payment",
1736
+ "kind": "journey",
1737
+ "description": "The payment provider takes more than a minute to answer.",
1738
+ "status": "flaky",
1739
+ "attempts": [
1740
+ {
1741
+ "status": "failed",
1742
+ "error": "The clock jump landed before the payment check started; passed on retry",
1743
+ "stoppedAt": null,
1744
+ "trace": null
1745
+ },
1746
+ {
1747
+ "status": "passed",
1748
+ "error": null,
1749
+ "stoppedAt": null,
1750
+ "trace": null
1751
+ }
1752
+ ],
1753
+ "steps": [
1754
+ {
1755
+ "transition": "Reviewing the cart :: Starts checkout",
1756
+ "event": "Starts checkout",
1757
+ "status": "passed",
1758
+ "reason": null
1759
+ },
1760
+ {
1761
+ "transition": "Choosing how to pay :: Picks card",
1762
+ "event": "Picks card",
1763
+ "status": "passed",
1764
+ "reason": null
1765
+ },
1766
+ {
1767
+ "transition": "Entering card details :: Submits the card",
1768
+ "event": "Submits the card",
1769
+ "status": "passed",
1770
+ "reason": null
1771
+ },
1772
+ {
1773
+ "transition": "Waiting for the payment :: Payment takes longer than a minute",
1774
+ "event": "Payment takes longer than a minute",
1775
+ "status": "flaky",
1776
+ "reason": "The clock jump landed before the payment check started; passed on retry"
1777
+ },
1778
+ {
1779
+ "transition": "Told the payment is slow :: Checks the payment again",
1780
+ "event": "Checks the payment again",
1781
+ "status": "passed",
1782
+ "reason": null
1783
+ },
1784
+ {
1785
+ "transition": "Waiting for the payment :: Payment provider approves the payment",
1786
+ "event": "Payment provider approves the payment",
1787
+ "status": "passed",
1788
+ "reason": null
1789
+ },
1790
+ {
1791
+ "transition": "Paid :: Payment goes through",
1792
+ "event": "Payment goes through",
1793
+ "status": "passed",
1794
+ "reason": null
1795
+ }
1796
+ ],
1797
+ "stoppedAt": null
1798
+ },
1799
+ {
1800
+ "id": "journey-5",
1801
+ "name": "Leaves checkout and comes back",
1802
+ "kind": "journey",
1803
+ "description": "The customer closes checkout, then starts it again.",
1804
+ "status": "passed",
1805
+ "attempts": [
1806
+ {
1807
+ "status": "passed",
1808
+ "error": null,
1809
+ "stoppedAt": null,
1810
+ "trace": null
1811
+ }
1812
+ ],
1813
+ "steps": [
1814
+ {
1815
+ "transition": "Reviewing the cart :: Starts checkout",
1816
+ "event": "Starts checkout",
1817
+ "status": "passed",
1818
+ "reason": null
1819
+ },
1820
+ {
1821
+ "transition": "Choosing how to pay :: Closes checkout",
1822
+ "event": "Closes checkout",
1823
+ "status": "passed",
1824
+ "reason": null
1825
+ },
1826
+ {
1827
+ "transition": "Checkout abandoned :: Leaves checkout",
1828
+ "event": "Leaves checkout",
1829
+ "status": "passed",
1830
+ "reason": null
1831
+ },
1832
+ {
1833
+ "transition": "Reviewing the cart :: Starts checkout",
1834
+ "event": "Starts checkout",
1835
+ "status": "passed",
1836
+ "reason": null
1837
+ }
1838
+ ],
1839
+ "stoppedAt": null
1840
+ },
1841
+ {
1842
+ "id": "journey-6",
1843
+ "name": "Drink left too long",
1844
+ "kind": "journey",
1845
+ "description": "Nobody picks the drink up, so it is thrown away and refunded.",
1846
+ "status": "passed",
1847
+ "attempts": [
1848
+ {
1849
+ "status": "passed",
1850
+ "error": null,
1851
+ "stoppedAt": null,
1852
+ "trace": null
1853
+ }
1854
+ ],
1855
+ "steps": [
1856
+ {
1857
+ "transition": "Reviewing the cart :: Starts checkout",
1858
+ "event": "Starts checkout",
1859
+ "status": "passed",
1860
+ "reason": null
1861
+ },
1862
+ {
1863
+ "transition": "Choosing how to pay :: Picks card",
1864
+ "event": "Picks card",
1865
+ "status": "passed",
1866
+ "reason": null
1867
+ },
1868
+ {
1869
+ "transition": "Entering card details :: Submits the card",
1870
+ "event": "Submits the card",
1871
+ "status": "passed",
1872
+ "reason": null
1873
+ },
1874
+ {
1875
+ "transition": "Waiting for the payment :: Payment provider approves the payment",
1876
+ "event": "Payment provider approves the payment",
1877
+ "status": "passed",
1878
+ "reason": null
1879
+ },
1880
+ {
1881
+ "transition": "Paid :: Payment goes through",
1882
+ "event": "Payment goes through",
1883
+ "status": "passed",
1884
+ "reason": null
1885
+ }
1886
+ ],
1887
+ "stoppedAt": null
1888
+ },
1889
+ {
1890
+ "id": "journey-7",
1891
+ "name": "Turns off updates while waiting",
1892
+ "kind": "journey",
1893
+ "description": "Updates go off while the drink is in the queue; the drink is still made.",
1894
+ "status": "flaky",
1895
+ "attempts": [
1896
+ {
1897
+ "status": "failed",
1898
+ "error": "Timed out waiting for \"Confirming with the wallet\" on the first attempt",
1899
+ "stoppedAt": null,
1900
+ "trace": null
1901
+ },
1902
+ {
1903
+ "status": "passed",
1904
+ "error": null,
1905
+ "stoppedAt": null,
1906
+ "trace": null
1907
+ }
1908
+ ],
1909
+ "steps": [
1910
+ {
1911
+ "transition": "Reviewing the cart :: Starts checkout",
1912
+ "event": "Starts checkout",
1913
+ "status": "passed",
1914
+ "reason": null
1915
+ },
1916
+ {
1917
+ "transition": "Choosing how to pay :: Picks wallet",
1918
+ "event": "Picks wallet",
1919
+ "status": "flaky",
1920
+ "reason": "Timed out waiting for \"Confirming with the wallet\" on the first attempt"
1921
+ },
1922
+ {
1923
+ "transition": "Confirming with the wallet :: Confirms with the wallet",
1924
+ "event": "Confirms with the wallet",
1925
+ "status": "passed",
1926
+ "reason": null
1927
+ },
1928
+ {
1929
+ "transition": "Waiting for the payment :: Payment provider approves the payment",
1930
+ "event": "Payment provider approves the payment",
1931
+ "status": "passed",
1932
+ "reason": null
1933
+ },
1934
+ {
1935
+ "transition": "Paid :: Payment goes through",
1936
+ "event": "Payment goes through",
1937
+ "status": "passed",
1938
+ "reason": null
1939
+ }
1940
+ ],
1941
+ "stoppedAt": null
1942
+ }
1943
+ ],
1944
+ "coverage": {
1945
+ "Coffee order": {
1946
+ "states": {
1947
+ "total": 3,
1948
+ "passed": 3,
1949
+ "failed": 0,
1950
+ "flaky": 0,
1951
+ "notReached": 0
1952
+ },
1953
+ "transitions": {
1954
+ "total": 1,
1955
+ "passed": 1,
1956
+ "failed": 0,
1957
+ "flaky": 0,
1958
+ "notReached": 0
1959
+ }
1960
+ },
1961
+ "Checkout": {
1962
+ "states": {
1963
+ "total": 8,
1964
+ "passed": 7,
1965
+ "failed": 1,
1966
+ "flaky": 0,
1967
+ "notReached": 0
1968
+ },
1969
+ "transitions": {
1970
+ "total": 14,
1971
+ "passed": 8,
1972
+ "failed": 1,
1973
+ "flaky": 2,
1974
+ "notReached": 3
1975
+ }
1976
+ },
1977
+ "overall": {
1978
+ "states": {
1979
+ "total": 11,
1980
+ "passed": 10,
1981
+ "failed": 1,
1982
+ "flaky": 0,
1983
+ "notReached": 0
1984
+ },
1985
+ "transitions": {
1986
+ "total": 15,
1987
+ "passed": 9,
1988
+ "failed": 1,
1989
+ "flaky": 2,
1990
+ "notReached": 3
1991
+ }
1992
+ }
1993
+ },
1994
+ "privacy": {
1995
+ "passed": true,
1996
+ "findings": []
1997
+ },
1998
+ "reports": {
1999
+ "junit": "junit.xml",
2000
+ "ctrf": "ctrf.json",
2001
+ "mermaid": "chart.mmd"
2002
+ }
2003
+ }