@bugmole/cli 0.4.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 (308) hide show
  1. package/.bugmole.env.example +20 -0
  2. package/LICENSE +7 -0
  3. package/README.md +293 -0
  4. package/TESTING.md +117 -0
  5. package/bugmole.config.yaml +39 -0
  6. package/package.json +85 -0
  7. package/scripts/billing/paypal-setup.mjs +121 -0
  8. package/scripts/bugmole-continue.ts +318 -0
  9. package/scripts/bugmole-init.ts +188 -0
  10. package/scripts/bugmole.cjs +17 -0
  11. package/scripts/bugmole.test.ts +344 -0
  12. package/scripts/bugmole.ts +657 -0
  13. package/scripts/ensure-maestro.cjs +79 -0
  14. package/scripts/ios-tunnel-keeper.sh +45 -0
  15. package/scripts/ios-wda-keeper.sh +66 -0
  16. package/scripts/sync-plan-catalog.d.mts +3 -0
  17. package/scripts/sync-plan-catalog.mjs +16 -0
  18. package/scripts/ui-parity-diff.py +65 -0
  19. package/scripts/ui-parity-requirements.txt +1 -0
  20. package/scripts/verify-manage-to-plans.mts +194 -0
  21. package/spec/app-ui-audit.schema.json +176 -0
  22. package/spec/blockers.yaml +79 -0
  23. package/spec/bugs.index.json +42 -0
  24. package/spec/design-dna.schema.json +38 -0
  25. package/spec/domain_rules.yaml +24 -0
  26. package/spec/flows/flow_manage-to-plans-64c3c61b.yaml +8 -0
  27. package/spec/flows/flow_screen-to-evidence-6c3ab309.yaml +7 -0
  28. package/spec/journey_graph.yaml +126 -0
  29. package/spec/journeys.graph.json +2618 -0
  30. package/spec/plans/dashboard-smoke.flow.yaml +20 -0
  31. package/spec/plans/example.flow.yaml +99 -0
  32. package/spec/plans/flow_api-keys-to-logout-7396cd5d.flow.yaml +33 -0
  33. package/spec/plans/flow_api-keys-to-screen-157e10a6.flow.yaml +33 -0
  34. package/spec/plans/flow_manage-to-audits-176c1eb8.flow.yaml +33 -0
  35. package/spec/plans/flow_manage-to-blockers-633282c8.flow.yaml +112 -0
  36. package/spec/plans/flow_manage-to-devices-ad57e202.flow.yaml +33 -0
  37. package/spec/plans/flow_manage-to-logout-86c54656.flow.yaml +33 -0
  38. package/spec/plans/flow_manage-to-manage-resource-action-6325f99a.flow.yaml +185 -0
  39. package/spec/plans/flow_manage-to-parity-issues-01fa2579.flow.yaml +34 -0
  40. package/spec/plans/flow_manage-to-plans-64c3c61b.flow.yaml +123 -0
  41. package/spec/plans/flow_manage-to-screen-6857f915.flow.yaml +106 -0
  42. package/spec/plans/flow_manage-to-tasks-c5791c95.flow.yaml +33 -0
  43. package/spec/plans/flow_profile-to-screen-6045aa3d.flow.yaml +33 -0
  44. package/spec/plans/flow_register-to-api-auth-login-460a9cc8.flow.yaml +34 -0
  45. package/spec/plans/flow_screen-to-audits-07666356.flow.yaml +33 -0
  46. package/spec/plans/flow_screen-to-blockers-091d258b.flow.yaml +33 -0
  47. package/spec/plans/flow_screen-to-devices-cad72f75.flow.yaml +33 -0
  48. package/spec/plans/flow_screen-to-evidence-6c3ab309.flow.yaml +126 -0
  49. package/spec/plans/flow_screen-to-parity-issues-2218e3ad.flow.yaml +34 -0
  50. package/spec/plans/flow_screen-to-plans-8232a94f.flow.yaml +33 -0
  51. package/spec/plans/flow_screen-to-tasks-540671d1.flow.yaml +33 -0
  52. package/spec/plans/login.flow.yaml +22 -0
  53. package/spec/plans/owner-operations.flow.yaml +20 -0
  54. package/spec/project_config.yaml +55 -0
  55. package/spec/roles.yaml +30 -0
  56. package/spec/schema.md +394 -0
  57. package/spec/test-case-results.schema.json +62 -0
  58. package/spec/test-cases.schema.json +85 -0
  59. package/spec/ui-parity-audit.schema.json +194 -0
  60. package/spec/ui-reverse-engineering.schema.json +94 -0
  61. package/src/billing/plan-catalog.test.ts +46 -0
  62. package/src/billing/plan-catalog.ts +199 -0
  63. package/src/integrations/aws-sigv4.test.ts +42 -0
  64. package/src/integrations/aws-sigv4.ts +72 -0
  65. package/src/integrations/device-farm.ts +155 -0
  66. package/src/integrations/github-app.test.ts +57 -0
  67. package/src/integrations/github-app.ts +143 -0
  68. package/src/integrations/gitlab.ts +81 -0
  69. package/src/integrations/temp-email.test.ts +123 -0
  70. package/src/integrations/temp-email.ts +175 -0
  71. package/src/integrations/testflight-feedback.test.ts +51 -0
  72. package/src/integrations/testflight-feedback.ts +173 -0
  73. package/src/integrations/webdriver-client.ts +131 -0
  74. package/src/mcp/server.test.ts +1220 -0
  75. package/src/mcp/server.ts +3064 -0
  76. package/src/mcp/write-test-cases.test.ts +287 -0
  77. package/src/registry/api-key-client.ts +39 -0
  78. package/src/registry/control-plane-client.ts +212 -0
  79. package/src/registry/migrations/0001_registry.sql +47 -0
  80. package/src/registry/migrations/0002_device_authorizations.sql +23 -0
  81. package/src/registry/migrations/0003_project_environments.sql +25 -0
  82. package/src/registry/migrations/0004_device_authorization_email.sql +1 -0
  83. package/src/registry/migrations/0005_testing_control_plane.sql +55 -0
  84. package/src/registry/migrations/0006_workspaces.sql +36 -0
  85. package/src/registry/migrations/0007_project_apps.sql +26 -0
  86. package/src/registry/migrations/0008_agent_tasks.sql +30 -0
  87. package/src/registry/migrations/0009_journey_revisions.sql +17 -0
  88. package/src/registry/migrations/0010_agent_task_journey.sql +2 -0
  89. package/src/registry/migrations/0011_run_journey_revision.sql +1 -0
  90. package/src/registry/migrations/0012_canonical_flow_execution.sql +10 -0
  91. package/src/registry/migrations/0013_device_sessions.sql +22 -0
  92. package/src/registry/migrations/0014_agent_task_step.sql +1 -0
  93. package/src/registry/migrations/0015_agent_task_attempts.sql +6 -0
  94. package/src/registry/migrations/0016_github_issue_tracker.sql +54 -0
  95. package/src/registry/migrations/0017_run_targets.sql +7 -0
  96. package/src/registry/migrations/0018_run_fix_from.sql +4 -0
  97. package/src/registry/migrations/0019_workspace_flags.sql +9 -0
  98. package/src/registry/migrations/0020_orgs.sql +40 -0
  99. package/src/registry/migrations/0021_billing_core.sql +58 -0
  100. package/src/registry/migrations/0022_cloud_runners.sql +19 -0
  101. package/src/registry/migrations/0023_signup.sql +4 -0
  102. package/src/registry/migrations/0024_billing.sql +67 -0
  103. package/src/registry/migrations/0025_notifications.sql +47 -0
  104. package/src/registry/migrations/0026_repo_bindings.sql +28 -0
  105. package/src/registry/migrations/0027_feedback.sql +29 -0
  106. package/src/registry/migrations/0028_devices.sql +48 -0
  107. package/src/registry/migrations/0029_sso.sql +31 -0
  108. package/src/registry/migrations/0030_workspace_domains.sql +18 -0
  109. package/src/registry/migrations/0031_gitlab_and_teams.sql +45 -0
  110. package/src/registry/migrations/0032_personas.sql +15 -0
  111. package/src/registry/migrations/0033_bugmole_rename.sql +11 -0
  112. package/src/registry/task-scheduling.test.ts +100 -0
  113. package/src/registry/task-scheduling.ts +80 -0
  114. package/src/registry-worker/ai/platform-model.ts +77 -0
  115. package/src/registry-worker/ai/routes.test.ts +88 -0
  116. package/src/registry-worker/ai/routes.ts +90 -0
  117. package/src/registry-worker/artifacts.test.ts +98 -0
  118. package/src/registry-worker/artifacts.ts +85 -0
  119. package/src/registry-worker/billing/billing-core.test.ts +175 -0
  120. package/src/registry-worker/billing/checkout-routes.ts +209 -0
  121. package/src/registry-worker/billing/enforcement.ts +69 -0
  122. package/src/registry-worker/billing/entitlements.ts +108 -0
  123. package/src/registry-worker/billing/ledger.ts +186 -0
  124. package/src/registry-worker/billing/paypal/api.ts +259 -0
  125. package/src/registry-worker/billing/paypal/client.ts +91 -0
  126. package/src/registry-worker/billing/paypal/provider.ts +143 -0
  127. package/src/registry-worker/billing/paypal.test.ts +466 -0
  128. package/src/registry-worker/billing/provider.ts +114 -0
  129. package/src/registry-worker/billing/routes.ts +66 -0
  130. package/src/registry-worker/billing/subscriptions.ts +780 -0
  131. package/src/registry-worker/billing/thresholds.ts +107 -0
  132. package/src/registry-worker/core.ts +308 -0
  133. package/src/registry-worker/devices/devices.test.ts +185 -0
  134. package/src/registry-worker/devices/policy.ts +71 -0
  135. package/src/registry-worker/devices/routes.ts +453 -0
  136. package/src/registry-worker/domains/domains.test.ts +210 -0
  137. package/src/registry-worker/domains/routes.ts +139 -0
  138. package/src/registry-worker/domains.ts +88 -0
  139. package/src/registry-worker/email/sender.ts +75 -0
  140. package/src/registry-worker/env.d.ts +14716 -0
  141. package/src/registry-worker/features.ts +20 -0
  142. package/src/registry-worker/feedback/feedback.test.ts +230 -0
  143. package/src/registry-worker/feedback/format.ts +148 -0
  144. package/src/registry-worker/feedback/routes.ts +386 -0
  145. package/src/registry-worker/flags.ts +39 -0
  146. package/src/registry-worker/github/checks.test.ts +177 -0
  147. package/src/registry-worker/github/checks.ts +374 -0
  148. package/src/registry-worker/gitlab/checks.test.ts +141 -0
  149. package/src/registry-worker/gitlab/checks.ts +349 -0
  150. package/src/registry-worker/hooks.ts +54 -0
  151. package/src/registry-worker/index.ts +2077 -0
  152. package/src/registry-worker/jobs/index.ts +29 -0
  153. package/src/registry-worker/jobs/retention.ts +68 -0
  154. package/src/registry-worker/mcp/mcp.test.ts +355 -0
  155. package/src/registry-worker/mcp/routes.ts +215 -0
  156. package/src/registry-worker/mcp/token.ts +126 -0
  157. package/src/registry-worker/mcp/tools.ts +563 -0
  158. package/src/registry-worker/notifications/alerts.ts +212 -0
  159. package/src/registry-worker/notifications/notifications.test.ts +298 -0
  160. package/src/registry-worker/notifications/outbox.ts +83 -0
  161. package/src/registry-worker/notifications/routes.ts +280 -0
  162. package/src/registry-worker/notifications/secrets.ts +49 -0
  163. package/src/registry-worker/notifications/slack.ts +96 -0
  164. package/src/registry-worker/notifications/teams.ts +46 -0
  165. package/src/registry-worker/org/audit.ts +116 -0
  166. package/src/registry-worker/org/routes.test.ts +163 -0
  167. package/src/registry-worker/org/routes.ts +302 -0
  168. package/src/registry-worker/personas/personas.test.ts +78 -0
  169. package/src/registry-worker/personas/routes.ts +100 -0
  170. package/src/registry-worker/repo-triggers.ts +20 -0
  171. package/src/registry-worker/routes/index.ts +74 -0
  172. package/src/registry-worker/run-events.ts +24 -0
  173. package/src/registry-worker/runner/dispatch.ts +219 -0
  174. package/src/registry-worker/runner/jobs.ts +43 -0
  175. package/src/registry-worker/runner/metering.ts +82 -0
  176. package/src/registry-worker/runner/policy.ts +59 -0
  177. package/src/registry-worker/runner/routes.ts +171 -0
  178. package/src/registry-worker/runner/runner.test.ts +358 -0
  179. package/src/registry-worker/runner/tokens.ts +93 -0
  180. package/src/registry-worker/runs.test.ts +60 -0
  181. package/src/registry-worker/signup/policy.ts +57 -0
  182. package/src/registry-worker/signup/routes.ts +106 -0
  183. package/src/registry-worker/signup/signup.test.ts +81 -0
  184. package/src/registry-worker/sso/aegis.ts +141 -0
  185. package/src/registry-worker/sso/membership.ts +157 -0
  186. package/src/registry-worker/sso/routes.ts +458 -0
  187. package/src/registry-worker/sso/sso.test.ts +344 -0
  188. package/src/registry-worker/testing/d1-shim.ts +180 -0
  189. package/src/registry-worker/testing/harness.ts +137 -0
  190. package/src/runner-worker/index.ts +108 -0
  191. package/src/runtime/ai-analysis.ts +97 -0
  192. package/src/runtime/ai-exploration.test.ts +32 -0
  193. package/src/runtime/ai-exploration.ts +69 -0
  194. package/src/runtime/ai-repair.ts +74 -0
  195. package/src/runtime/ai-work.test.ts +99 -0
  196. package/src/runtime/android-screen-record.test.ts +75 -0
  197. package/src/runtime/android-screen-record.ts +192 -0
  198. package/src/runtime/app-understanding.test.ts +123 -0
  199. package/src/runtime/app-understanding.ts +201 -0
  200. package/src/runtime/appium-driver.test.ts +179 -0
  201. package/src/runtime/appium-driver.ts +295 -0
  202. package/src/runtime/blocker-resolution.test.ts +113 -0
  203. package/src/runtime/blocker-resolution.ts +111 -0
  204. package/src/runtime/browser-matrix.integration.test.ts +212 -0
  205. package/src/runtime/browser-matrix.test.ts +143 -0
  206. package/src/runtime/browser-matrix.ts +200 -0
  207. package/src/runtime/canonical-flow.test.ts +52 -0
  208. package/src/runtime/config-validate.ts +185 -0
  209. package/src/runtime/continuous-execution.ts +291 -0
  210. package/src/runtime/cursor-applescript.ts +573 -0
  211. package/src/runtime/cursor-cli-driver.test.ts +78 -0
  212. package/src/runtime/cursor-cli-driver.ts +156 -0
  213. package/src/runtime/cursor-driver-example.ts +117 -0
  214. package/src/runtime/cursor-driver-index.ts +65 -0
  215. package/src/runtime/cursor-driver-init.ts +277 -0
  216. package/src/runtime/cursor-driver-run.test.ts +15 -0
  217. package/src/runtime/cursor-driver-run.ts +323 -0
  218. package/src/runtime/cursor-driver.ts +332 -0
  219. package/src/runtime/cursor-llm-example.ts +90 -0
  220. package/src/runtime/cursor-llm.ts +206 -0
  221. package/src/runtime/cursor-mcp-monitor.ts +386 -0
  222. package/src/runtime/device-clouds/browserstack.ts +73 -0
  223. package/src/runtime/device-clouds/device-farm.ts +52 -0
  224. package/src/runtime/device-clouds/index.ts +92 -0
  225. package/src/runtime/device-clouds/kobiton.ts +70 -0
  226. package/src/runtime/device-clouds/targets.ts +44 -0
  227. package/src/runtime/device-clouds/types.ts +62 -0
  228. package/src/runtime/diff-proposal.ts +84 -0
  229. package/src/runtime/discovery-task.test.ts +29 -0
  230. package/src/runtime/discovery-task.ts +284 -0
  231. package/src/runtime/driver-recovery.ts +69 -0
  232. package/src/runtime/driver.ts +79 -0
  233. package/src/runtime/environment.test.ts +104 -0
  234. package/src/runtime/environment.ts +137 -0
  235. package/src/runtime/executor.test.ts +509 -0
  236. package/src/runtime/executor.ts +921 -0
  237. package/src/runtime/explorer.test.ts +101 -0
  238. package/src/runtime/explorer.ts +1013 -0
  239. package/src/runtime/failure-analysis.test.ts +111 -0
  240. package/src/runtime/failure-analysis.ts +272 -0
  241. package/src/runtime/fixtures/fake-maestro.sh +36 -0
  242. package/src/runtime/flow-language.test.ts +268 -0
  243. package/src/runtime/flow-language.ts +414 -0
  244. package/src/runtime/init-wizard.ts +354 -0
  245. package/src/runtime/ios-screen-record.test.ts +68 -0
  246. package/src/runtime/ios-screen-record.ts +155 -0
  247. package/src/runtime/journey-editor.ts +452 -0
  248. package/src/runtime/journey-evidence.test.ts +161 -0
  249. package/src/runtime/journey-evidence.ts +180 -0
  250. package/src/runtime/journey-graph.test.ts +257 -0
  251. package/src/runtime/journey-graph.ts +170 -0
  252. package/src/runtime/legacy-names.ts +32 -0
  253. package/src/runtime/llm-example.ts +105 -0
  254. package/src/runtime/llm.ts +527 -0
  255. package/src/runtime/local-browser.test.ts +45 -0
  256. package/src/runtime/local-browser.ts +48 -0
  257. package/src/runtime/local-registry-stub.test.ts +325 -0
  258. package/src/runtime/local-registry-stub.ts +803 -0
  259. package/src/runtime/maestro-driver.test.ts +84 -0
  260. package/src/runtime/maestro-driver.ts +209 -0
  261. package/src/runtime/mole-voice.ts +21 -0
  262. package/src/runtime/nav-crawl.test.ts +100 -0
  263. package/src/runtime/nav-crawl.ts +153 -0
  264. package/src/runtime/pipeline.test.ts +405 -0
  265. package/src/runtime/pipeline.ts +833 -0
  266. package/src/runtime/planner.test.ts +37 -0
  267. package/src/runtime/planner.ts +274 -0
  268. package/src/runtime/platform-ai.ts +76 -0
  269. package/src/runtime/playwright-driver.test.ts +93 -0
  270. package/src/runtime/playwright-driver.ts +620 -0
  271. package/src/runtime/project-spec.ts +140 -0
  272. package/src/runtime/record-run-verdicts.ts +68 -0
  273. package/src/runtime/reporter.test.ts +56 -0
  274. package/src/runtime/reporter.ts +158 -0
  275. package/src/runtime/reset.test.ts +44 -0
  276. package/src/runtime/reset.ts +61 -0
  277. package/src/runtime/reviewer.test.ts +73 -0
  278. package/src/runtime/reviewer.ts +158 -0
  279. package/src/runtime/run-job.ts +136 -0
  280. package/src/runtime/run-once.test.ts +207 -0
  281. package/src/runtime/run-once.ts +168 -0
  282. package/src/runtime/run.ts +132 -0
  283. package/src/runtime/screen-recording.ts +34 -0
  284. package/src/runtime/serve-gateway.test.ts +74 -0
  285. package/src/runtime/serve-gateway.ts +164 -0
  286. package/src/runtime/serve-worker.test.ts +23 -0
  287. package/src/runtime/serve-worker.ts +278 -0
  288. package/src/runtime/site-discovery.test.ts +168 -0
  289. package/src/runtime/site-discovery.ts +308 -0
  290. package/src/runtime/target-runner.ts +144 -0
  291. package/src/runtime/test-case-verdicts.test.ts +94 -0
  292. package/src/runtime/test-case-verdicts.ts +120 -0
  293. package/src/runtime/ui-reverse-engineering/coordinator.test.ts +59 -0
  294. package/src/runtime/ui-reverse-engineering/coordinator.ts +391 -0
  295. package/src/runtime/ui-reverse-engineering/types.ts +197 -0
  296. package/src/runtime/web-suite.test.ts +97 -0
  297. package/src/runtime/web-suite.ts +176 -0
  298. package/src/storage/create-object-store.ts +144 -0
  299. package/src/storage/keys.ts +34 -0
  300. package/src/storage/local-artifact-server.test.ts +314 -0
  301. package/src/storage/local-artifact-server.ts +357 -0
  302. package/src/storage/object-store.test.ts +28 -0
  303. package/src/storage/object-store.ts +101 -0
  304. package/src/storage/registry-object-store.ts +88 -0
  305. package/src/storage/remote-object-store.ts +104 -0
  306. package/src/storage/storage-directory.test.ts +43 -0
  307. package/src/storage/storage-directory.ts +24 -0
  308. package/tsconfig.json +24 -0
@@ -0,0 +1,2618 @@
1
+ {
2
+ "version": 2,
3
+ "projectId": "bugmole",
4
+ "journeys": [
5
+ {
6
+ "id": "flow:screen-to-audits-07666356",
7
+ "name": "Open the app → Open Audits",
8
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
9
+ "actor": "user",
10
+ "startNodeId": "screen:/",
11
+ "nodeIds": [
12
+ "screen:/",
13
+ "screen:/audits"
14
+ ],
15
+ "edgeIds": [
16
+ "screen:/->screen:/audits:dom-4"
17
+ ],
18
+ "revision": 1,
19
+ "status": "draft",
20
+ "metadata": {
21
+ "generatedBy": "source-exploration",
22
+ "evidenceStatus": "source-transition",
23
+ "flowScope": "path",
24
+ "verificationStatus": "unverified",
25
+ "verifiedNodeIds": [],
26
+ "verifiedEdgeIds": [],
27
+ "verifiedControlIds": [],
28
+ "goalNodeId": "screen:/audits",
29
+ "entrance": {
30
+ "route": "/"
31
+ },
32
+ "goal": {
33
+ "route": "/audits",
34
+ "nodeId": "screen:/audits"
35
+ },
36
+ "lastReviewedAt": "2026-08-28T17:22:11.111Z",
37
+ "reviewStatus": "preserved"
38
+ },
39
+ "sourceOfTruth": "canonical_flow",
40
+ "stability": "stable",
41
+ "linkedToGraph": true
42
+ },
43
+ {
44
+ "id": "flow:screen-to-devices-cad72f75",
45
+ "name": "Open the app → Open Devices",
46
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
47
+ "actor": "user",
48
+ "startNodeId": "screen:/",
49
+ "nodeIds": [
50
+ "screen:/",
51
+ "screen:/devices"
52
+ ],
53
+ "edgeIds": [
54
+ "screen:/->screen:/devices:dom-3"
55
+ ],
56
+ "revision": 2,
57
+ "status": "draft",
58
+ "sourceOfTruth": "canonical_flow",
59
+ "stability": "stable",
60
+ "linkedToGraph": true,
61
+ "metadata": {
62
+ "generatedBy": "source-exploration",
63
+ "evidenceStatus": "source-transition",
64
+ "flowScope": "path",
65
+ "verificationStatus": "completed",
66
+ "verifiedNodeIds": [
67
+ "screen:/",
68
+ "screen:/devices"
69
+ ],
70
+ "verifiedEdgeIds": [
71
+ "screen:/->screen:/devices:dom-3"
72
+ ],
73
+ "verifiedControlIds": [
74
+ "nav-devices",
75
+ "nav-overview"
76
+ ],
77
+ "goalNodeId": "screen:/devices",
78
+ "entrance": {
79
+ "route": "/"
80
+ },
81
+ "goal": {
82
+ "route": "/devices",
83
+ "nodeId": "screen:/devices"
84
+ },
85
+ "completedGoalIds": [
86
+ "screen:/devices"
87
+ ],
88
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
89
+ "reviewStatus": "preserved"
90
+ }
91
+ },
92
+ {
93
+ "id": "flow:screen-to-evidence-6c3ab309",
94
+ "name": "Open the app → Open Evidence",
95
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
96
+ "actor": "user",
97
+ "startNodeId": "screen:/",
98
+ "nodeIds": [
99
+ "screen:/",
100
+ "screen:/audits",
101
+ "screen:/evidence"
102
+ ],
103
+ "edgeIds": [
104
+ "screen:/->screen:/audits:dom-4",
105
+ "screen:/audits->screen:/evidence:dom-7"
106
+ ],
107
+ "revision": 2,
108
+ "status": "draft",
109
+ "sourceOfTruth": "canonical_flow",
110
+ "stability": "stable",
111
+ "linkedToGraph": true,
112
+ "metadata": {
113
+ "generatedBy": "source-exploration",
114
+ "evidenceStatus": "source-transition",
115
+ "flowScope": "path",
116
+ "verificationStatus": "completed",
117
+ "verifiedNodeIds": [
118
+ "screen:/",
119
+ "screen:/audits",
120
+ "screen:/evidence"
121
+ ],
122
+ "verifiedEdgeIds": [
123
+ "screen:/->screen:/audits:dom-4",
124
+ "screen:/audits->screen:/evidence:dom-7"
125
+ ],
126
+ "verifiedControlIds": [
127
+ "nav-app-audit",
128
+ "overview-open-app-audit",
129
+ "audits-open-screenshot-evidence"
130
+ ],
131
+ "goalNodeId": "screen:/evidence",
132
+ "entrance": {
133
+ "route": "/"
134
+ },
135
+ "goal": {
136
+ "route": "/evidence",
137
+ "nodeId": "screen:/evidence"
138
+ },
139
+ "completedGoalIds": [
140
+ "screen:/evidence"
141
+ ],
142
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
143
+ "reviewStatus": "preserved"
144
+ }
145
+ },
146
+ {
147
+ "id": "flow:manage-to-blockers-633282c8",
148
+ "name": "Open Manage → Open Blockers",
149
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
150
+ "actor": "user",
151
+ "startNodeId": "screen:/manage",
152
+ "nodeIds": [
153
+ "screen:/manage",
154
+ "screen:/blockers"
155
+ ],
156
+ "edgeIds": [
157
+ "screen:/manage->screen:/blockers:dom-6"
158
+ ],
159
+ "revision": 1,
160
+ "status": "draft",
161
+ "metadata": {
162
+ "generatedBy": "source-exploration",
163
+ "evidenceStatus": "source-transition",
164
+ "flowScope": "path",
165
+ "verificationStatus": "unverified",
166
+ "verifiedNodeIds": [],
167
+ "verifiedEdgeIds": [],
168
+ "verifiedControlIds": [],
169
+ "goalNodeId": "screen:/blockers",
170
+ "entrance": {
171
+ "route": "/manage"
172
+ },
173
+ "goal": {
174
+ "route": "/blockers",
175
+ "nodeId": "screen:/blockers"
176
+ },
177
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
178
+ "reviewStatus": "preserved"
179
+ },
180
+ "sourceOfTruth": "canonical_flow",
181
+ "stability": "stable",
182
+ "linkedToGraph": true
183
+ },
184
+ {
185
+ "id": "flow:manage-to-screen-6857f915",
186
+ "name": "Open Manage → Open the app",
187
+ "description": "Authenticated user opens the resource management hub at /manage and returns to the dashboard home via the back link.",
188
+ "actor": "user",
189
+ "startNodeId": "screen:/manage",
190
+ "nodeIds": [
191
+ "screen:/manage",
192
+ "screen:/"
193
+ ],
194
+ "edgeIds": [
195
+ "screen:/manage->screen:/:0"
196
+ ],
197
+ "revision": 7,
198
+ "status": "draft",
199
+ "sourceOfTruth": "canonical_flow",
200
+ "stability": "stable",
201
+ "linkedToGraph": true,
202
+ "metadata": {
203
+ "entrance": {
204
+ "route": "/manage"
205
+ },
206
+ "evidenceStatus": "source-transition",
207
+ "flowScope": "path",
208
+ "generatedBy": "source-exploration",
209
+ "goal": {
210
+ "nodeId": "screen:/",
211
+ "route": "/"
212
+ },
213
+ "goalNodeId": "screen:/",
214
+ "verificationStatus": "completed",
215
+ "verifiedControlIds": [
216
+ "control:screen:/manage:10",
217
+ "control:screen:/manage:15",
218
+ "control:screen:/manage:18",
219
+ "control:screen:/manage:20",
220
+ "control:screen:/manage:apps",
221
+ "control:screen:/manage:logout"
222
+ ],
223
+ "verifiedEdgeIds": [
224
+ "screen:/manage->screen:/:0"
225
+ ],
226
+ "verifiedNodeIds": [
227
+ "screen:/manage",
228
+ "screen:/"
229
+ ],
230
+ "completedGoalIds": [
231
+ "screen:/",
232
+ "screen:/manage"
233
+ ],
234
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
235
+ "reviewStatus": "preserved"
236
+ }
237
+ },
238
+ {
239
+ "id": "flow:screen-to-tasks-540671d1",
240
+ "name": "Open the app → Open Tasks",
241
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
242
+ "actor": "user",
243
+ "startNodeId": "screen:/",
244
+ "nodeIds": [
245
+ "screen:/",
246
+ "screen:/tasks"
247
+ ],
248
+ "edgeIds": [
249
+ "screen:/->screen:/tasks:dom-2"
250
+ ],
251
+ "revision": 2,
252
+ "status": "draft",
253
+ "sourceOfTruth": "canonical_flow",
254
+ "stability": "stable",
255
+ "linkedToGraph": true,
256
+ "metadata": {
257
+ "generatedBy": "source-exploration",
258
+ "evidenceStatus": "source-transition",
259
+ "flowScope": "path",
260
+ "verificationStatus": "completed",
261
+ "verifiedNodeIds": [
262
+ "screen:/",
263
+ "screen:/tasks"
264
+ ],
265
+ "verifiedEdgeIds": [
266
+ "screen:/->screen:/tasks:dom-2"
267
+ ],
268
+ "verifiedControlIds": [
269
+ "screen:/:nav-tasks"
270
+ ],
271
+ "goalNodeId": "screen:/tasks",
272
+ "entrance": {
273
+ "route": "/"
274
+ },
275
+ "goal": {
276
+ "route": "/tasks",
277
+ "nodeId": "screen:/tasks"
278
+ },
279
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
280
+ "reviewStatus": "preserved",
281
+ "completedGoalIds": [
282
+ "screen:/tasks"
283
+ ]
284
+ }
285
+ },
286
+ {
287
+ "id": "flow:manage-to-manage-resource-action-6325f99a",
288
+ "name": "Open Manage → Open resource management",
289
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
290
+ "actor": "user",
291
+ "startNodeId": "screen:/manage",
292
+ "nodeIds": [
293
+ "screen:/manage",
294
+ "screen:/manage/:resource/:[...action]"
295
+ ],
296
+ "edgeIds": [
297
+ "screen:/manage->screen:/manage/:resource/:[...action]:1",
298
+ "screen:/manage->screen:/manage/:resource/:[...action]:2",
299
+ "screen:/manage->screen:/manage/:resource/:[...action]:3",
300
+ "screen:/manage->screen:/manage/:resource/:[...action]:4",
301
+ "screen:/manage->screen:/manage/:resource/:[...action]:navigate:/manage/workspaces",
302
+ "screen:/manage->screen:/manage/:resource/:[...action]:navigate:/manage/projects",
303
+ "screen:/manage->screen:/manage/:resource/:[...action]:navigate:/manage/apps",
304
+ "screen:/manage->screen:/manage/:resource/:[...action]:navigate:/manage/environments"
305
+ ],
306
+ "revision": 3,
307
+ "status": "draft",
308
+ "sourceOfTruth": "canonical_flow",
309
+ "stability": "stable",
310
+ "linkedToGraph": true,
311
+ "metadata": {
312
+ "generatedBy": "source-exploration",
313
+ "evidenceStatus": "source-transition",
314
+ "flowScope": "path",
315
+ "verificationStatus": "completed",
316
+ "verifiedNodeIds": [
317
+ "screen:/manage/:resource/:[...action]",
318
+ "screen:/manage"
319
+ ],
320
+ "verifiedEdgeIds": [
321
+ "screen:/manage->screen:/manage/:resource/:[...action]:1",
322
+ "screen:/manage->screen:/manage/:resource/:[...action]:2",
323
+ "screen:/manage->screen:/manage/:resource/:[...action]:3",
324
+ "screen:/manage->screen:/manage/:resource/:[...action]:4",
325
+ "screen:/manage->screen:/manage/:resource/:[...action]:navigate:/manage/workspaces",
326
+ "screen:/manage->screen:/manage/:resource/:[...action]:navigate:/manage/projects",
327
+ "screen:/manage->screen:/manage/:resource/:[...action]:navigate:/manage/apps",
328
+ "screen:/manage->screen:/manage/:resource/:[...action]:navigate:/manage/environments"
329
+ ],
330
+ "verifiedControlIds": [
331
+ "control:screen:/manage:15",
332
+ "control:screen:/manage:18",
333
+ "control:screen:/manage:20",
334
+ "control:screen:/manage:apps"
335
+ ],
336
+ "goalNodeId": "screen:/manage/:resource/:[...action]",
337
+ "entrance": {
338
+ "route": "/manage"
339
+ },
340
+ "goal": {
341
+ "route": "/manage/:resource/:[...action]",
342
+ "nodeId": "screen:/manage/:resource/:[...action]"
343
+ },
344
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
345
+ "reviewStatus": "preserved",
346
+ "completedGoalIds": [
347
+ "screen:/manage/:resource/:[...action]"
348
+ ]
349
+ }
350
+ },
351
+ {
352
+ "id": "flow:register-to-api-auth-login-460a9cc8",
353
+ "name": "Open Register → Open Api Auth Login",
354
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
355
+ "actor": "user",
356
+ "startNodeId": "screen:/register",
357
+ "nodeIds": [
358
+ "screen:/register",
359
+ "screen:/api/auth/login"
360
+ ],
361
+ "edgeIds": [
362
+ "screen:/register->screen:/api/auth/login:dom-0"
363
+ ],
364
+ "revision": 3,
365
+ "status": "draft",
366
+ "sourceOfTruth": "canonical_flow",
367
+ "stability": "stable",
368
+ "linkedToGraph": true,
369
+ "metadata": {
370
+ "generatedBy": "source-exploration",
371
+ "evidenceStatus": "source-transition",
372
+ "flowScope": "path",
373
+ "verificationStatus": "in-progress",
374
+ "verifiedNodeIds": [],
375
+ "verifiedEdgeIds": [
376
+ "screen:/register->screen:/api/auth/login:dom-0"
377
+ ],
378
+ "verifiedControlIds": [
379
+ "control:screen:/register:119",
380
+ "control:screen:/register:113"
381
+ ],
382
+ "goalNodeId": "screen:/api/auth/login",
383
+ "entrance": {
384
+ "route": "/register"
385
+ },
386
+ "goal": {
387
+ "route": "/api/auth/login",
388
+ "nodeId": "screen:/api/auth/login"
389
+ },
390
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
391
+ "reviewStatus": "preserved",
392
+ "completedGoalIds": [
393
+ "screen:/api/auth/login"
394
+ ]
395
+ }
396
+ },
397
+ {
398
+ "id": "flow:screen-to-parity-issues-2218e3ad",
399
+ "name": "Open the app → Open Parity Issues",
400
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
401
+ "actor": "user",
402
+ "startNodeId": "screen:/",
403
+ "nodeIds": [
404
+ "screen:/",
405
+ "screen:/parity/issues"
406
+ ],
407
+ "edgeIds": [
408
+ "screen:/->screen:/parity/issues:dom-5"
409
+ ],
410
+ "revision": 2,
411
+ "status": "draft",
412
+ "sourceOfTruth": "canonical_flow",
413
+ "stability": "stable",
414
+ "linkedToGraph": true,
415
+ "metadata": {
416
+ "generatedBy": "source-exploration",
417
+ "evidenceStatus": "source-transition",
418
+ "flowScope": "path",
419
+ "verificationStatus": "completed",
420
+ "verifiedNodeIds": [
421
+ "screen:/",
422
+ "screen:/parity/issues"
423
+ ],
424
+ "verifiedEdgeIds": [
425
+ "screen:/->screen:/parity/issues:dom-5"
426
+ ],
427
+ "verifiedControlIds": [
428
+ "nav-parity-issues",
429
+ "nav-overview"
430
+ ],
431
+ "goalNodeId": "screen:/parity/issues",
432
+ "entrance": {
433
+ "route": "/"
434
+ },
435
+ "goal": {
436
+ "route": "/parity/issues",
437
+ "nodeId": "screen:/parity/issues"
438
+ },
439
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
440
+ "reviewStatus": "preserved",
441
+ "completedGoalIds": [
442
+ "screen:/parity/issues"
443
+ ]
444
+ }
445
+ },
446
+ {
447
+ "id": "flow:profile-to-screen-6045aa3d",
448
+ "name": "Open my profile → Open the app",
449
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
450
+ "actor": "user",
451
+ "startNodeId": "screen:/profile",
452
+ "nodeIds": [
453
+ "screen:/profile",
454
+ "screen:/"
455
+ ],
456
+ "edgeIds": [
457
+ "screen:/profile->screen:/:0"
458
+ ],
459
+ "revision": 2,
460
+ "status": "draft",
461
+ "sourceOfTruth": "canonical_flow",
462
+ "stability": "stable",
463
+ "linkedToGraph": true,
464
+ "metadata": {
465
+ "generatedBy": "source-exploration",
466
+ "evidenceStatus": "source-transition",
467
+ "flowScope": "path",
468
+ "verificationStatus": "completed",
469
+ "verifiedNodeIds": [
470
+ "screen:/profile",
471
+ "screen:/"
472
+ ],
473
+ "verifiedEdgeIds": [
474
+ "screen:/profile->screen:/:0"
475
+ ],
476
+ "verifiedControlIds": [
477
+ "control:screen:/profile:14"
478
+ ],
479
+ "goalNodeId": "screen:/",
480
+ "entrance": {
481
+ "route": "/profile"
482
+ },
483
+ "goal": {
484
+ "route": "/",
485
+ "nodeId": "screen:/"
486
+ },
487
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
488
+ "reviewStatus": "preserved",
489
+ "completedGoalIds": [
490
+ "screen:/",
491
+ "screen:/profile"
492
+ ]
493
+ }
494
+ },
495
+ {
496
+ "id": "flow:manage-to-tasks-c5791c95",
497
+ "name": "Open Manage → Open Tasks",
498
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
499
+ "actor": "user",
500
+ "startNodeId": "screen:/manage",
501
+ "nodeIds": [
502
+ "screen:/manage",
503
+ "screen:/tasks"
504
+ ],
505
+ "edgeIds": [
506
+ "screen:/manage->screen:/tasks:dom-2"
507
+ ],
508
+ "revision": 2,
509
+ "status": "draft",
510
+ "sourceOfTruth": "canonical_flow",
511
+ "stability": "stable",
512
+ "linkedToGraph": true,
513
+ "metadata": {
514
+ "generatedBy": "source-exploration",
515
+ "evidenceStatus": "source-transition",
516
+ "flowScope": "path",
517
+ "verificationStatus": "completed",
518
+ "verifiedNodeIds": [
519
+ "screen:/manage",
520
+ "screen:/tasks"
521
+ ],
522
+ "verifiedEdgeIds": [
523
+ "screen:/manage->screen:/tasks:dom-2"
524
+ ],
525
+ "verifiedControlIds": [
526
+ "screen:/manage:nav-tasks"
527
+ ],
528
+ "goalNodeId": "screen:/tasks",
529
+ "entrance": {
530
+ "route": "/manage"
531
+ },
532
+ "goal": {
533
+ "route": "/tasks",
534
+ "nodeId": "screen:/tasks"
535
+ },
536
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
537
+ "reviewStatus": "preserved",
538
+ "completedGoalIds": [
539
+ "screen:/tasks"
540
+ ]
541
+ }
542
+ },
543
+ {
544
+ "id": "flow:manage-to-devices-ad57e202",
545
+ "name": "Open Manage → Open Devices",
546
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
547
+ "actor": "user",
548
+ "startNodeId": "screen:/manage",
549
+ "nodeIds": [
550
+ "screen:/manage",
551
+ "screen:/devices"
552
+ ],
553
+ "edgeIds": [
554
+ "screen:/manage->screen:/devices:dom-3"
555
+ ],
556
+ "revision": 2,
557
+ "status": "draft",
558
+ "sourceOfTruth": "canonical_flow",
559
+ "stability": "stable",
560
+ "linkedToGraph": true,
561
+ "metadata": {
562
+ "generatedBy": "source-exploration",
563
+ "evidenceStatus": "source-transition",
564
+ "flowScope": "path",
565
+ "verificationStatus": "completed",
566
+ "verifiedNodeIds": [
567
+ "screen:/manage",
568
+ "screen:/devices"
569
+ ],
570
+ "verifiedEdgeIds": [
571
+ "screen:/manage->screen:/devices:dom-3"
572
+ ],
573
+ "verifiedControlIds": [
574
+ "screen:/manage:nav-devices",
575
+ "screen:/devices:nav-devices"
576
+ ],
577
+ "goalNodeId": "screen:/devices",
578
+ "entrance": {
579
+ "route": "/manage"
580
+ },
581
+ "goal": {
582
+ "route": "/devices",
583
+ "nodeId": "screen:/devices"
584
+ },
585
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
586
+ "reviewStatus": "preserved",
587
+ "completedGoalIds": [
588
+ "screen:/devices"
589
+ ]
590
+ }
591
+ },
592
+ {
593
+ "id": "flow:manage-to-audits-176c1eb8",
594
+ "name": "Open Manage → Open Audits",
595
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
596
+ "actor": "user",
597
+ "startNodeId": "screen:/manage",
598
+ "nodeIds": [
599
+ "screen:/manage",
600
+ "screen:/audits"
601
+ ],
602
+ "edgeIds": [
603
+ "screen:/manage->screen:/audits:dom-4"
604
+ ],
605
+ "revision": 2,
606
+ "status": "draft",
607
+ "sourceOfTruth": "canonical_flow",
608
+ "stability": "stable",
609
+ "linkedToGraph": true,
610
+ "metadata": {
611
+ "generatedBy": "source-exploration",
612
+ "evidenceStatus": "source-transition",
613
+ "flowScope": "path",
614
+ "verificationStatus": "completed",
615
+ "verifiedNodeIds": [
616
+ "screen:/manage",
617
+ "screen:/audits"
618
+ ],
619
+ "verifiedEdgeIds": [
620
+ "screen:/manage->screen:/audits:dom-4"
621
+ ],
622
+ "verifiedControlIds": [
623
+ "screen:/manage:nav-audits"
624
+ ],
625
+ "goalNodeId": "screen:/audits",
626
+ "entrance": {
627
+ "route": "/manage"
628
+ },
629
+ "goal": {
630
+ "route": "/audits",
631
+ "nodeId": "screen:/audits"
632
+ },
633
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
634
+ "reviewStatus": "preserved",
635
+ "completedGoalIds": [
636
+ "screen:/audits"
637
+ ]
638
+ }
639
+ },
640
+ {
641
+ "id": "flow:manage-to-parity-issues-01fa2579",
642
+ "name": "Open Manage → Open Parity Issues",
643
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
644
+ "actor": "user",
645
+ "startNodeId": "screen:/manage",
646
+ "nodeIds": [
647
+ "screen:/manage",
648
+ "screen:/parity/issues"
649
+ ],
650
+ "edgeIds": [
651
+ "screen:/manage->screen:/parity/issues:dom-5"
652
+ ],
653
+ "revision": 2,
654
+ "status": "draft",
655
+ "sourceOfTruth": "canonical_flow",
656
+ "stability": "stable",
657
+ "linkedToGraph": true,
658
+ "metadata": {
659
+ "generatedBy": "source-exploration",
660
+ "evidenceStatus": "source-transition",
661
+ "flowScope": "path",
662
+ "verificationStatus": "completed",
663
+ "verifiedNodeIds": [
664
+ "screen:/manage",
665
+ "screen:/parity/issues"
666
+ ],
667
+ "verifiedEdgeIds": [
668
+ "screen:/manage->screen:/parity/issues:dom-5"
669
+ ],
670
+ "verifiedControlIds": [
671
+ "screen:/manage:nav-parity-issues",
672
+ "nav-parity-issues"
673
+ ],
674
+ "goalNodeId": "screen:/parity/issues",
675
+ "entrance": {
676
+ "route": "/manage"
677
+ },
678
+ "goal": {
679
+ "route": "/parity/issues",
680
+ "nodeId": "screen:/parity/issues"
681
+ },
682
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
683
+ "reviewStatus": "preserved",
684
+ "completedGoalIds": [
685
+ "screen:/parity/issues"
686
+ ]
687
+ }
688
+ },
689
+ {
690
+ "id": "flow:manage-to-plans-64c3c61b",
691
+ "name": "Open Manage → Open Plans",
692
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
693
+ "actor": "user",
694
+ "startNodeId": "screen:/manage",
695
+ "nodeIds": [
696
+ "screen:/manage",
697
+ "screen:/plans"
698
+ ],
699
+ "edgeIds": [
700
+ "screen:/manage->screen:/plans:dom-1"
701
+ ],
702
+ "revision": 3,
703
+ "status": "draft",
704
+ "sourceOfTruth": "canonical_flow",
705
+ "stability": "stable",
706
+ "linkedToGraph": true,
707
+ "metadata": {
708
+ "generatedBy": "source-exploration",
709
+ "evidenceStatus": "source-transition",
710
+ "flowScope": "path",
711
+ "verificationStatus": "completed",
712
+ "verifiedNodeIds": [
713
+ "screen:/manage",
714
+ "screen:/plans"
715
+ ],
716
+ "verifiedEdgeIds": [
717
+ "screen:/manage->screen:/plans:dom-1"
718
+ ],
719
+ "verifiedControlIds": [
720
+ "control:screen:/manage:nav-plans",
721
+ "screen:/manage->screen:/plans:dom-1"
722
+ ],
723
+ "goalNodeId": "screen:/plans",
724
+ "entrance": {
725
+ "route": "/manage"
726
+ },
727
+ "goal": {
728
+ "route": "/plans",
729
+ "nodeId": "screen:/plans"
730
+ },
731
+ "completedGoalIds": [
732
+ "screen:/plans"
733
+ ],
734
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
735
+ "reviewStatus": "preserved"
736
+ }
737
+ },
738
+ {
739
+ "id": "flow:screen-to-blockers-091d258b",
740
+ "name": "Open the app → Open Blockers",
741
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
742
+ "actor": "user",
743
+ "startNodeId": "screen:/",
744
+ "nodeIds": [
745
+ "screen:/",
746
+ "screen:/blockers"
747
+ ],
748
+ "edgeIds": [
749
+ "screen:/->screen:/blockers:dom-6"
750
+ ],
751
+ "revision": 2,
752
+ "status": "draft",
753
+ "sourceOfTruth": "canonical_flow",
754
+ "stability": "stable",
755
+ "linkedToGraph": true,
756
+ "metadata": {
757
+ "generatedBy": "source-exploration",
758
+ "evidenceStatus": "source-transition",
759
+ "flowScope": "path",
760
+ "verificationStatus": "completed",
761
+ "verifiedNodeIds": [
762
+ "screen:/",
763
+ "screen:/blockers"
764
+ ],
765
+ "verifiedEdgeIds": [
766
+ "screen:/->screen:/blockers:dom-6"
767
+ ],
768
+ "verifiedControlIds": [
769
+ "screen:/:nav-blockers",
770
+ "nav-overview"
771
+ ],
772
+ "goalNodeId": "screen:/blockers",
773
+ "entrance": {
774
+ "route": "/"
775
+ },
776
+ "goal": {
777
+ "route": "/blockers",
778
+ "nodeId": "screen:/blockers"
779
+ },
780
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
781
+ "reviewStatus": "preserved",
782
+ "completedGoalIds": [
783
+ "screen:/blockers"
784
+ ]
785
+ }
786
+ },
787
+ {
788
+ "id": "flow:screen-to-plans-8232a94f",
789
+ "name": "Open the app → Open Plans",
790
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
791
+ "actor": "user",
792
+ "startNodeId": "screen:/",
793
+ "nodeIds": [
794
+ "screen:/",
795
+ "screen:/plans"
796
+ ],
797
+ "edgeIds": [
798
+ "screen:/->screen:/plans:dom-1"
799
+ ],
800
+ "revision": 3,
801
+ "status": "draft",
802
+ "sourceOfTruth": "canonical_flow",
803
+ "stability": "stable",
804
+ "linkedToGraph": true,
805
+ "metadata": {
806
+ "generatedBy": "source-exploration",
807
+ "evidenceStatus": "source-transition",
808
+ "flowScope": "path",
809
+ "verificationStatus": "completed",
810
+ "verifiedNodeIds": [
811
+ "screen:/",
812
+ "screen:/plans"
813
+ ],
814
+ "verifiedEdgeIds": [
815
+ "screen:/->screen:/plans:dom-1"
816
+ ],
817
+ "verifiedControlIds": [
818
+ "nav:test-plans",
819
+ "nav:overview",
820
+ "plans:plan-row",
821
+ "plans:start-selected",
822
+ "overview:link-plans"
823
+ ],
824
+ "goalNodeId": "screen:/plans",
825
+ "entrance": {
826
+ "route": "/"
827
+ },
828
+ "goal": {
829
+ "route": "/plans",
830
+ "nodeId": "screen:/plans"
831
+ },
832
+ "completedGoalIds": [
833
+ "screen:/plans"
834
+ ],
835
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
836
+ "reviewStatus": "preserved"
837
+ }
838
+ },
839
+ {
840
+ "id": "flow:api-keys-to-screen-157e10a6",
841
+ "name": "Open Api Keys → Open the app",
842
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
843
+ "actor": "user",
844
+ "startNodeId": "screen:/api-keys",
845
+ "nodeIds": [
846
+ "screen:/api-keys",
847
+ "screen:/"
848
+ ],
849
+ "edgeIds": [
850
+ "screen:/api-keys->screen:/:0"
851
+ ],
852
+ "revision": 3,
853
+ "status": "draft",
854
+ "sourceOfTruth": "canonical_flow",
855
+ "stability": "stable",
856
+ "linkedToGraph": true,
857
+ "metadata": {
858
+ "generatedBy": "source-exploration",
859
+ "evidenceStatus": "source-transition",
860
+ "flowScope": "path",
861
+ "verificationStatus": "completed",
862
+ "verifiedNodeIds": [
863
+ "screen:/api-keys",
864
+ "screen:/"
865
+ ],
866
+ "verifiedEdgeIds": [
867
+ "screen:/api-keys->screen:/:0"
868
+ ],
869
+ "verifiedControlIds": [
870
+ "control:screen:/api-keys:92",
871
+ "control:screen:/api-keys:103",
872
+ "control:screen:/api-keys:119",
873
+ "control:screen:/api-keys:123"
874
+ ],
875
+ "goalNodeId": "screen:/",
876
+ "entrance": {
877
+ "route": "/api-keys"
878
+ },
879
+ "goal": {
880
+ "route": "/",
881
+ "nodeId": "screen:/"
882
+ },
883
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
884
+ "reviewStatus": "preserved",
885
+ "completedGoalIds": [
886
+ "screen:/"
887
+ ]
888
+ }
889
+ },
890
+ {
891
+ "id": "flow:api-keys-to-logout-7396cd5d",
892
+ "name": "Open Api Keys → Open Logout",
893
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
894
+ "actor": "user",
895
+ "startNodeId": "screen:/api-keys",
896
+ "nodeIds": [
897
+ "screen:/api-keys",
898
+ "screen:/logout"
899
+ ],
900
+ "edgeIds": [
901
+ "screen:/api-keys->screen:/logout:1"
902
+ ],
903
+ "revision": 2,
904
+ "status": "draft",
905
+ "sourceOfTruth": "canonical_flow",
906
+ "stability": "stable",
907
+ "linkedToGraph": true,
908
+ "metadata": {
909
+ "generatedBy": "source-exploration",
910
+ "evidenceStatus": "source-transition",
911
+ "flowScope": "path",
912
+ "verificationStatus": "completed",
913
+ "verifiedNodeIds": [
914
+ "screen:/api-keys",
915
+ "screen:/logout"
916
+ ],
917
+ "verifiedEdgeIds": [
918
+ "screen:/api-keys->screen:/logout:1"
919
+ ],
920
+ "verifiedControlIds": [
921
+ "control:screen:/api-keys:123"
922
+ ],
923
+ "goalNodeId": "screen:/logout",
924
+ "entrance": {
925
+ "route": "/api-keys"
926
+ },
927
+ "goal": {
928
+ "route": "/logout",
929
+ "nodeId": "screen:/logout"
930
+ },
931
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
932
+ "reviewStatus": "preserved",
933
+ "completedGoalIds": [
934
+ "screen:/logout"
935
+ ]
936
+ }
937
+ },
938
+ {
939
+ "id": "flow:manage-to-logout-86c54656",
940
+ "name": "Open Manage → Open Logout",
941
+ "description": "User journey generated from source-discovered entry, transitions, and goal screen.",
942
+ "actor": "user",
943
+ "startNodeId": "screen:/manage",
944
+ "nodeIds": [
945
+ "screen:/manage",
946
+ "screen:/logout"
947
+ ],
948
+ "edgeIds": [
949
+ "screen:/manage->screen:/logout:5"
950
+ ],
951
+ "revision": 2,
952
+ "status": "draft",
953
+ "sourceOfTruth": "canonical_flow",
954
+ "stability": "stable",
955
+ "linkedToGraph": true,
956
+ "metadata": {
957
+ "generatedBy": "source-exploration",
958
+ "evidenceStatus": "source-transition",
959
+ "flowScope": "path",
960
+ "verificationStatus": "completed",
961
+ "verifiedNodeIds": [
962
+ "screen:/manage",
963
+ "screen:/logout"
964
+ ],
965
+ "verifiedEdgeIds": [
966
+ "screen:/manage->screen:/logout:5"
967
+ ],
968
+ "verifiedControlIds": [
969
+ "screen:/manage:sign-out"
970
+ ],
971
+ "goalNodeId": "screen:/logout",
972
+ "entrance": {
973
+ "route": "/manage"
974
+ },
975
+ "goal": {
976
+ "route": "/logout",
977
+ "nodeId": "screen:/logout"
978
+ },
979
+ "lastReviewedAt": "2026-08-28T17:22:11.112Z",
980
+ "reviewStatus": "preserved",
981
+ "completedGoalIds": [
982
+ "screen:/logout"
983
+ ]
984
+ }
985
+ }
986
+ ],
987
+ "nodes": [
988
+ {
989
+ "id": "screen:/api/api-keys/:keyId",
990
+ "title": "Open Api Api Keys :KeyId",
991
+ "kind": "screen",
992
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/api-keys/:keyId",
993
+ "route": "/api/api-keys/:keyId",
994
+ "source": "src/app/api/api-keys/[keyId]/route.ts",
995
+ "sourcePaths": [
996
+ "src/app/api/api-keys/[keyId]/route.ts"
997
+ ],
998
+ "componentPaths": [
999
+ "src/lib/aegis-auth.ts"
1000
+ ],
1001
+ "runtimeProbe": {
1002
+ "status": "unreachable",
1003
+ "httpStatus": 405,
1004
+ "reason": "HTTP 405"
1005
+ },
1006
+ "screenshot": {
1007
+ "source": "reference",
1008
+ "status": "captured",
1009
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_api-keys_keyId.png",
1010
+ "contentType": "image/png",
1011
+ "capturedAt": "2026-08-28T17:22:16.193Z",
1012
+ "referenceId": "input_67fadae419bc",
1013
+ "confidence": "high"
1014
+ }
1015
+ },
1016
+ {
1017
+ "id": "screen:/api/api-keys",
1018
+ "title": "Open Api Api Keys",
1019
+ "kind": "screen",
1020
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/api-keys",
1021
+ "route": "/api/api-keys",
1022
+ "source": "src/app/api/api-keys/route.ts",
1023
+ "sourcePaths": [
1024
+ "src/app/api/api-keys/route.ts"
1025
+ ],
1026
+ "componentPaths": [
1027
+ "src/lib/aegis-auth.ts"
1028
+ ],
1029
+ "runtimeProbe": {
1030
+ "status": "unreachable",
1031
+ "httpStatus": 404,
1032
+ "reason": "HTTP 404"
1033
+ },
1034
+ "screenshot": {
1035
+ "source": "reference",
1036
+ "status": "captured",
1037
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_api-keys.png",
1038
+ "contentType": "image/png",
1039
+ "capturedAt": "2026-08-28T17:22:15.763Z",
1040
+ "referenceId": "input_67fadae419bc",
1041
+ "confidence": "high"
1042
+ }
1043
+ },
1044
+ {
1045
+ "id": "screen:/api/auth/callback",
1046
+ "title": "Open Api Auth Callback",
1047
+ "kind": "screen",
1048
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/auth/callback",
1049
+ "route": "/api/auth/callback",
1050
+ "source": "src/app/api/auth/callback/route.ts",
1051
+ "sourcePaths": [
1052
+ "src/app/api/auth/callback/route.ts"
1053
+ ],
1054
+ "componentPaths": [
1055
+ "src/lib/aegis-device-binding.ts",
1056
+ "src/lib/aegis-session.ts",
1057
+ "src/lib/oauth-config.ts"
1058
+ ],
1059
+ "runtimeProbe": {
1060
+ "status": "unreachable",
1061
+ "httpStatus": 400,
1062
+ "reason": "HTTP 400"
1063
+ },
1064
+ "screenshot": {
1065
+ "source": "reference",
1066
+ "status": "captured",
1067
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_auth_callback.png",
1068
+ "contentType": "image/png",
1069
+ "capturedAt": "2026-08-28T17:22:15.744Z",
1070
+ "referenceId": "input_67fadae419bc",
1071
+ "confidence": "high"
1072
+ }
1073
+ },
1074
+ {
1075
+ "id": "screen:/api/auth/login",
1076
+ "title": "Open Api Auth Login",
1077
+ "kind": "screen",
1078
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/auth/login",
1079
+ "route": "/api/auth/login",
1080
+ "source": "src/app/api/auth/login/route.ts",
1081
+ "sourcePaths": [
1082
+ "src/app/api/auth/login/route.ts"
1083
+ ],
1084
+ "componentPaths": [
1085
+ "src/lib/aegis-authorization.ts",
1086
+ "src/lib/oauth-config.ts"
1087
+ ],
1088
+ "runtimeProbe": {
1089
+ "status": "reachable",
1090
+ "httpStatus": 302
1091
+ },
1092
+ "screenshot": {
1093
+ "source": "reference",
1094
+ "status": "captured",
1095
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_auth_login.png",
1096
+ "contentType": "image/png",
1097
+ "capturedAt": "2026-08-28T17:22:18.860Z",
1098
+ "referenceId": "input_67fadae419bc",
1099
+ "confidence": "high"
1100
+ }
1101
+ },
1102
+ {
1103
+ "id": "screen:/api/auth/session",
1104
+ "title": "Open Api Auth Session",
1105
+ "kind": "screen",
1106
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/auth/session",
1107
+ "route": "/api/auth/session",
1108
+ "source": "src/app/api/auth/session/route.ts",
1109
+ "sourcePaths": [
1110
+ "src/app/api/auth/session/route.ts"
1111
+ ],
1112
+ "componentPaths": [
1113
+ "src/lib/aegis-session.ts"
1114
+ ],
1115
+ "runtimeProbe": {
1116
+ "status": "reachable",
1117
+ "httpStatus": 200
1118
+ },
1119
+ "screenshot": {
1120
+ "source": "reference",
1121
+ "status": "captured",
1122
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_auth_session.png",
1123
+ "contentType": "image/png",
1124
+ "capturedAt": "2026-08-28T17:22:18.927Z",
1125
+ "referenceId": "input_67fadae419bc",
1126
+ "confidence": "high"
1127
+ }
1128
+ },
1129
+ {
1130
+ "id": "screen:/api/device-sessions",
1131
+ "title": "Open Api Device Sessions",
1132
+ "kind": "screen",
1133
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/device-sessions",
1134
+ "route": "/api/device-sessions",
1135
+ "source": "src/app/api/device-sessions/route.ts",
1136
+ "sourcePaths": [
1137
+ "src/app/api/device-sessions/route.ts"
1138
+ ],
1139
+ "componentPaths": [
1140
+ "src/lib/device-auth.ts",
1141
+ "src/lib/device-sessions-registry.ts"
1142
+ ],
1143
+ "runtimeProbe": {
1144
+ "status": "reachable",
1145
+ "httpStatus": 200
1146
+ },
1147
+ "screenshot": {
1148
+ "source": "reference",
1149
+ "status": "captured",
1150
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_device-sessions.png",
1151
+ "contentType": "image/png",
1152
+ "capturedAt": "2026-08-28T17:22:18.996Z",
1153
+ "referenceId": "input_67fadae419bc",
1154
+ "confidence": "high"
1155
+ }
1156
+ },
1157
+ {
1158
+ "id": "screen:/api/devices/:deviceId",
1159
+ "title": "Open Api Devices :DeviceId",
1160
+ "kind": "screen",
1161
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/devices/:deviceId",
1162
+ "route": "/api/devices/:deviceId",
1163
+ "source": "src/app/api/devices/[deviceId]/route.ts",
1164
+ "sourcePaths": [
1165
+ "src/app/api/devices/[deviceId]/route.ts"
1166
+ ],
1167
+ "componentPaths": [
1168
+ "src/lib/device-auth.ts",
1169
+ "src/lib/realm-connect/index.ts"
1170
+ ],
1171
+ "runtimeProbe": {
1172
+ "status": "unreachable",
1173
+ "httpStatus": 404,
1174
+ "reason": "HTTP 404"
1175
+ },
1176
+ "screenshot": {
1177
+ "source": "reference",
1178
+ "status": "captured",
1179
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_devices_deviceId.png",
1180
+ "contentType": "image/png",
1181
+ "capturedAt": "2026-08-28T17:22:22.400Z",
1182
+ "referenceId": "input_67fadae419bc",
1183
+ "confidence": "high"
1184
+ }
1185
+ },
1186
+ {
1187
+ "id": "screen:/api/devices",
1188
+ "title": "Open Api Devices",
1189
+ "kind": "screen",
1190
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/devices",
1191
+ "route": "/api/devices",
1192
+ "source": "src/app/api/devices/route.ts",
1193
+ "sourcePaths": [
1194
+ "src/app/api/devices/route.ts"
1195
+ ],
1196
+ "componentPaths": [
1197
+ "src/lib/device-pricing.ts",
1198
+ "src/lib/device-auth.ts",
1199
+ "src/lib/device-sessions-registry.ts",
1200
+ "src/lib/realm-connect/index.ts"
1201
+ ],
1202
+ "runtimeProbe": {
1203
+ "status": "reachable",
1204
+ "httpStatus": 200
1205
+ },
1206
+ "screenshot": {
1207
+ "source": "reference",
1208
+ "status": "captured",
1209
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_devices.png",
1210
+ "contentType": "image/png",
1211
+ "capturedAt": "2026-08-28T17:22:22.516Z",
1212
+ "referenceId": "input_67fadae419bc",
1213
+ "confidence": "high"
1214
+ }
1215
+ },
1216
+ {
1217
+ "id": "screen:/api/onboarding/claim",
1218
+ "title": "Open Api Onboarding Claim",
1219
+ "kind": "screen",
1220
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/onboarding/claim",
1221
+ "route": "/api/onboarding/claim",
1222
+ "source": "src/app/api/onboarding/claim/route.ts",
1223
+ "sourcePaths": [
1224
+ "src/app/api/onboarding/claim/route.ts"
1225
+ ],
1226
+ "componentPaths": [
1227
+ "src/lib/aegis-auth.ts"
1228
+ ],
1229
+ "runtimeProbe": {
1230
+ "status": "unreachable",
1231
+ "httpStatus": 405,
1232
+ "reason": "HTTP 405"
1233
+ },
1234
+ "screenshot": {
1235
+ "source": "reference",
1236
+ "status": "captured",
1237
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_onboarding_claim.png",
1238
+ "contentType": "image/png",
1239
+ "capturedAt": "2026-08-28T17:22:22.482Z",
1240
+ "referenceId": "input_67fadae419bc",
1241
+ "confidence": "high"
1242
+ }
1243
+ },
1244
+ {
1245
+ "id": "screen:/api/projects/:projectId",
1246
+ "title": "Open Api Projects :ProjectId",
1247
+ "kind": "screen",
1248
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/projects/:projectId",
1249
+ "route": "/api/projects/:projectId",
1250
+ "source": "src/app/api/projects/[projectId]/route.ts",
1251
+ "sourcePaths": [
1252
+ "src/app/api/projects/[projectId]/route.ts"
1253
+ ],
1254
+ "componentPaths": [
1255
+ "src/lib/aegis-auth.ts"
1256
+ ],
1257
+ "runtimeProbe": {
1258
+ "status": "unreachable",
1259
+ "httpStatus": 405,
1260
+ "reason": "HTTP 405"
1261
+ },
1262
+ "screenshot": {
1263
+ "source": "reference",
1264
+ "status": "captured",
1265
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_projects_projectId.png",
1266
+ "contentType": "image/png",
1267
+ "capturedAt": "2026-08-28T17:22:26.473Z",
1268
+ "referenceId": "input_67fadae419bc",
1269
+ "confidence": "high"
1270
+ }
1271
+ },
1272
+ {
1273
+ "id": "screen:/api/projects/register",
1274
+ "title": "Open Api Projects Register",
1275
+ "kind": "screen",
1276
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/projects/register",
1277
+ "route": "/api/projects/register",
1278
+ "source": "src/app/api/projects/register/route.ts",
1279
+ "sourcePaths": [
1280
+ "src/app/api/projects/register/route.ts"
1281
+ ],
1282
+ "componentPaths": [
1283
+ "src/lib/aegis-auth.ts"
1284
+ ],
1285
+ "runtimeProbe": {
1286
+ "status": "unreachable",
1287
+ "httpStatus": 405,
1288
+ "reason": "HTTP 405"
1289
+ },
1290
+ "screenshot": {
1291
+ "source": "reference",
1292
+ "status": "captured",
1293
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_projects_register.png",
1294
+ "contentType": "image/png",
1295
+ "capturedAt": "2026-08-28T17:22:26.522Z",
1296
+ "referenceId": "input_67fadae419bc",
1297
+ "confidence": "high"
1298
+ }
1299
+ },
1300
+ {
1301
+ "id": "screen:/api/projects",
1302
+ "title": "Open Api Projects",
1303
+ "kind": "screen",
1304
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/projects",
1305
+ "route": "/api/projects",
1306
+ "source": "src/app/api/projects/route.ts",
1307
+ "sourcePaths": [
1308
+ "src/app/api/projects/route.ts"
1309
+ ],
1310
+ "componentPaths": [
1311
+ "src/lib/aegis-auth.ts"
1312
+ ],
1313
+ "runtimeProbe": {
1314
+ "status": "reachable",
1315
+ "httpStatus": 200
1316
+ },
1317
+ "screenshot": {
1318
+ "source": "reference",
1319
+ "status": "captured",
1320
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_projects.png",
1321
+ "contentType": "image/png",
1322
+ "capturedAt": "2026-08-28T17:22:26.497Z",
1323
+ "referenceId": "input_67fadae419bc",
1324
+ "confidence": "high"
1325
+ }
1326
+ },
1327
+ {
1328
+ "id": "screen:/api/runs/:runId",
1329
+ "title": "Open Api Runs :RunId",
1330
+ "kind": "screen",
1331
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/runs/:runId",
1332
+ "route": "/api/runs/:runId",
1333
+ "source": "src/app/api/runs/[runId]/route.ts",
1334
+ "sourcePaths": [
1335
+ "src/app/api/runs/[runId]/route.ts"
1336
+ ],
1337
+ "componentPaths": [
1338
+ "src/lib/aegis-auth.ts"
1339
+ ],
1340
+ "runtimeProbe": {
1341
+ "status": "unreachable",
1342
+ "httpStatus": 404,
1343
+ "reason": "HTTP 404"
1344
+ },
1345
+ "screenshot": {
1346
+ "source": "reference",
1347
+ "status": "captured",
1348
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_runs_runId.png",
1349
+ "contentType": "image/png",
1350
+ "capturedAt": "2026-08-28T17:22:30.507Z",
1351
+ "referenceId": "input_67fadae419bc",
1352
+ "confidence": "high"
1353
+ }
1354
+ },
1355
+ {
1356
+ "id": "screen:/api/tasks/:taskId",
1357
+ "title": "Open Api Tasks :TaskId",
1358
+ "kind": "screen",
1359
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/tasks/:taskId",
1360
+ "route": "/api/tasks/:taskId",
1361
+ "source": "src/app/api/tasks/[taskId]/route.ts",
1362
+ "sourcePaths": [
1363
+ "src/app/api/tasks/[taskId]/route.ts"
1364
+ ],
1365
+ "componentPaths": [
1366
+ "src/lib/aegis-auth.ts"
1367
+ ],
1368
+ "runtimeProbe": {
1369
+ "status": "unreachable",
1370
+ "httpStatus": 405,
1371
+ "reason": "HTTP 405"
1372
+ },
1373
+ "screenshot": {
1374
+ "source": "reference",
1375
+ "status": "captured",
1376
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_tasks_taskId.png",
1377
+ "contentType": "image/png",
1378
+ "capturedAt": "2026-08-28T17:22:30.507Z",
1379
+ "referenceId": "input_67fadae419bc",
1380
+ "confidence": "high"
1381
+ }
1382
+ },
1383
+ {
1384
+ "id": "screen:/api/workspaces/:workspaceId",
1385
+ "title": "Open Api Workspaces :WorkspaceId",
1386
+ "kind": "screen",
1387
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/workspaces/:workspaceId",
1388
+ "route": "/api/workspaces/:workspaceId",
1389
+ "source": "src/app/api/workspaces/[workspaceId]/route.ts",
1390
+ "sourcePaths": [
1391
+ "src/app/api/workspaces/[workspaceId]/route.ts"
1392
+ ],
1393
+ "componentPaths": [
1394
+ "src/lib/aegis-auth.ts"
1395
+ ],
1396
+ "runtimeProbe": {
1397
+ "status": "unreachable",
1398
+ "httpStatus": 405,
1399
+ "reason": "HTTP 405"
1400
+ },
1401
+ "screenshot": {
1402
+ "source": "reference",
1403
+ "status": "captured",
1404
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_workspaces_workspaceId.png",
1405
+ "contentType": "image/png",
1406
+ "capturedAt": "2026-08-28T17:22:30.507Z",
1407
+ "referenceId": "input_67fadae419bc",
1408
+ "confidence": "high"
1409
+ }
1410
+ },
1411
+ {
1412
+ "id": "screen:/api/workspaces",
1413
+ "title": "Open Api Workspaces",
1414
+ "kind": "screen",
1415
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/api/workspaces",
1416
+ "route": "/api/workspaces",
1417
+ "source": "src/app/api/workspaces/route.ts",
1418
+ "sourcePaths": [
1419
+ "src/app/api/workspaces/route.ts"
1420
+ ],
1421
+ "componentPaths": [
1422
+ "src/lib/aegis-auth.ts"
1423
+ ],
1424
+ "runtimeProbe": {
1425
+ "status": "unreachable",
1426
+ "httpStatus": 404,
1427
+ "reason": "HTTP 404"
1428
+ },
1429
+ "screenshot": {
1430
+ "source": "reference",
1431
+ "status": "captured",
1432
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_api_workspaces.png",
1433
+ "contentType": "image/png",
1434
+ "capturedAt": "2026-08-28T17:22:34.380Z",
1435
+ "referenceId": "input_67fadae419bc",
1436
+ "confidence": "high"
1437
+ }
1438
+ },
1439
+ {
1440
+ "id": "screen:/api-keys",
1441
+ "route": "/api-keys",
1442
+ "title": "API keys",
1443
+ "signature": "runtime-verified@route:/api-keys"
1444
+ },
1445
+ {
1446
+ "id": "screen:/audits",
1447
+ "route": "/audits",
1448
+ "title": "Open Audits",
1449
+ "signature": "runtime-verified@route:/audits"
1450
+ },
1451
+ {
1452
+ "id": "screen:/blockers",
1453
+ "route": "/blockers",
1454
+ "signature": "Blockers hard stops and setup states"
1455
+ },
1456
+ {
1457
+ "id": "screen:/coordinator",
1458
+ "title": "Open Coordinator",
1459
+ "kind": "screen",
1460
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/coordinator",
1461
+ "route": "/coordinator",
1462
+ "source": "src/app/coordinator/page.tsx",
1463
+ "sourcePaths": [
1464
+ "src/app/coordinator/page.tsx"
1465
+ ],
1466
+ "componentPaths": [
1467
+ "src/app/dashboard-route.tsx"
1468
+ ],
1469
+ "runtimeProbe": {
1470
+ "status": "reachable",
1471
+ "httpStatus": 200
1472
+ },
1473
+ "screenshot": {
1474
+ "source": "reference",
1475
+ "status": "captured",
1476
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_coordinator.png",
1477
+ "contentType": "image/png",
1478
+ "capturedAt": "2026-08-28T17:22:38.283Z",
1479
+ "referenceId": "input_67fadae419bc",
1480
+ "confidence": "high"
1481
+ }
1482
+ },
1483
+ {
1484
+ "id": "screen:/devices",
1485
+ "route": "/devices",
1486
+ "runtimeProbe": {
1487
+ "httpStatus": 200,
1488
+ "status": "reachable"
1489
+ },
1490
+ "signature": "runtime-probe@route:/devices",
1491
+ "title": "Devices"
1492
+ },
1493
+ {
1494
+ "id": "screen:/evidence",
1495
+ "title": "Open Evidence",
1496
+ "kind": "screen",
1497
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/evidence",
1498
+ "route": "/evidence",
1499
+ "source": "src/app/evidence/page.tsx",
1500
+ "sourcePaths": [
1501
+ "src/app/evidence/page.tsx"
1502
+ ],
1503
+ "componentPaths": [
1504
+ "src/app/dashboard-route.tsx"
1505
+ ],
1506
+ "runtimeProbe": {
1507
+ "status": "reachable",
1508
+ "httpStatus": 200
1509
+ },
1510
+ "screenshot": {
1511
+ "source": "reference",
1512
+ "status": "captured",
1513
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_evidence.png",
1514
+ "contentType": "image/png",
1515
+ "capturedAt": "2026-08-28T17:22:41.293Z",
1516
+ "referenceId": "input_67fadae419bc",
1517
+ "confidence": "high"
1518
+ }
1519
+ },
1520
+ {
1521
+ "id": "screen:/journeys",
1522
+ "title": "Open Journeys",
1523
+ "kind": "screen",
1524
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/journeys",
1525
+ "route": "/journeys",
1526
+ "source": "src/app/journeys/page.tsx",
1527
+ "sourcePaths": [
1528
+ "src/app/journeys/page.tsx"
1529
+ ],
1530
+ "componentPaths": [
1531
+ "src/app/dashboard-route.tsx"
1532
+ ],
1533
+ "runtimeProbe": {
1534
+ "status": "reachable",
1535
+ "httpStatus": 200
1536
+ },
1537
+ "screenshot": {
1538
+ "source": "reference",
1539
+ "status": "captured",
1540
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_journeys.png",
1541
+ "contentType": "image/png",
1542
+ "capturedAt": "2026-08-28T17:22:41.349Z",
1543
+ "referenceId": "input_67fadae419bc",
1544
+ "confidence": "high"
1545
+ }
1546
+ },
1547
+ {
1548
+ "id": "screen:/login",
1549
+ "title": "Open Login",
1550
+ "kind": "screen",
1551
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/login",
1552
+ "route": "/login",
1553
+ "source": "src/app/login/page.tsx",
1554
+ "sourcePaths": [
1555
+ "src/app/login/page.tsx"
1556
+ ],
1557
+ "componentPaths": [
1558
+ "src/lib/email-validation.ts"
1559
+ ],
1560
+ "metadata": {
1561
+ "interactiveControls": [
1562
+ {
1563
+ "id": "control:screen:/login:101",
1564
+ "label": "Interactive control at src/app/login/page.tsx:101",
1565
+ "kind": "action",
1566
+ "source": "src/app/login/page.tsx",
1567
+ "line": 101,
1568
+ "evidenceStatus": "source-discovered"
1569
+ },
1570
+ {
1571
+ "id": "control:screen:/login:102",
1572
+ "label": "Interactive control at src/app/login/page.tsx:102",
1573
+ "kind": "action",
1574
+ "source": "src/app/login/page.tsx",
1575
+ "line": 102,
1576
+ "evidenceStatus": "source-discovered"
1577
+ }
1578
+ ]
1579
+ },
1580
+ "runtimeProbe": {
1581
+ "status": "reachable",
1582
+ "httpStatus": 200
1583
+ },
1584
+ "screenshot": {
1585
+ "source": "reference",
1586
+ "status": "captured",
1587
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_login.png",
1588
+ "contentType": "image/png",
1589
+ "capturedAt": "2026-08-28T17:22:42.011Z",
1590
+ "referenceId": "input_67fadae419bc",
1591
+ "confidence": "high"
1592
+ }
1593
+ },
1594
+ {
1595
+ "id": "screen:/logout",
1596
+ "route": "/logout",
1597
+ "title": "Open Logout",
1598
+ "signature": "runtime-verified@route:/logout:307→/login?logged_out=1"
1599
+ },
1600
+ {
1601
+ "id": "screen:/manage/:resource/:[...action]",
1602
+ "route": "/manage/:resource/:[...action]",
1603
+ "signature": "runtime-probe@route:/manage/:resource/:[...action]"
1604
+ },
1605
+ {
1606
+ "id": "screen:/manage",
1607
+ "route": "/manage",
1608
+ "title": "Manage Bugmole",
1609
+ "signature": "runtime-verified@route:/manage"
1610
+ },
1611
+ {
1612
+ "id": "screen:/oauth/callback",
1613
+ "title": "Open Oauth Callback",
1614
+ "kind": "screen",
1615
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/oauth/callback",
1616
+ "route": "/oauth/callback",
1617
+ "source": "src/app/oauth/callback/page.tsx",
1618
+ "sourcePaths": [
1619
+ "src/app/oauth/callback/page.tsx"
1620
+ ],
1621
+ "componentPaths": [],
1622
+ "runtimeProbe": {
1623
+ "status": "reachable",
1624
+ "httpStatus": 200
1625
+ },
1626
+ "screenshot": {
1627
+ "source": "reference",
1628
+ "status": "captured",
1629
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_oauth_callback.png",
1630
+ "contentType": "image/png",
1631
+ "capturedAt": "2026-08-28T17:22:48.635Z",
1632
+ "referenceId": "input_67fadae419bc",
1633
+ "confidence": "high"
1634
+ }
1635
+ },
1636
+ {
1637
+ "id": "screen:/",
1638
+ "route": "/",
1639
+ "signature": "runtime-verified@route:/ dashboard overview with workspace selectors",
1640
+ "title": "Overview"
1641
+ },
1642
+ {
1643
+ "id": "screen:/parity/issues",
1644
+ "route": "/parity/issues",
1645
+ "title": "Open Parity Issues",
1646
+ "signature": "runtime-verified@route:/parity/issues"
1647
+ },
1648
+ {
1649
+ "id": "screen:/parity",
1650
+ "title": "Open Parity",
1651
+ "kind": "screen",
1652
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/parity",
1653
+ "route": "/parity",
1654
+ "source": "src/app/parity/page.tsx",
1655
+ "sourcePaths": [
1656
+ "src/app/parity/page.tsx"
1657
+ ],
1658
+ "componentPaths": [
1659
+ "src/app/dashboard-route.tsx"
1660
+ ],
1661
+ "runtimeProbe": {
1662
+ "status": "reachable",
1663
+ "httpStatus": 200
1664
+ },
1665
+ "screenshot": {
1666
+ "source": "reference",
1667
+ "status": "captured",
1668
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_parity.png",
1669
+ "contentType": "image/png",
1670
+ "capturedAt": "2026-08-28T17:22:52.556Z",
1671
+ "referenceId": "input_67fadae419bc",
1672
+ "confidence": "high"
1673
+ }
1674
+ },
1675
+ {
1676
+ "id": "screen:/plans",
1677
+ "route": "/plans",
1678
+ "title": "Test plans",
1679
+ "signature": "runtime-verified@route:/plans"
1680
+ },
1681
+ {
1682
+ "id": "screen:/profile",
1683
+ "route": "/profile",
1684
+ "signature": "Profile settings with ← Back to dashboard link",
1685
+ "title": "Open my profile"
1686
+ },
1687
+ {
1688
+ "id": "screen:/qa-evidence/:fileName",
1689
+ "title": "Open Qa Evidence :FileName",
1690
+ "kind": "screen",
1691
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/qa-evidence/:fileName",
1692
+ "route": "/qa-evidence/:fileName",
1693
+ "source": "src/app/qa-evidence/[fileName]/route.ts",
1694
+ "sourcePaths": [
1695
+ "src/app/qa-evidence/[fileName]/route.ts"
1696
+ ],
1697
+ "componentPaths": [],
1698
+ "runtimeProbe": {
1699
+ "status": "unreachable",
1700
+ "httpStatus": 404,
1701
+ "reason": "HTTP 404"
1702
+ },
1703
+ "screenshot": {
1704
+ "source": "reference",
1705
+ "status": "captured",
1706
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_qa-evidence_fileName.png",
1707
+ "contentType": "image/png",
1708
+ "capturedAt": "2026-08-28T17:22:56.288Z",
1709
+ "referenceId": "input_67fadae419bc",
1710
+ "confidence": "high"
1711
+ }
1712
+ },
1713
+ {
1714
+ "id": "screen:/register",
1715
+ "title": "Open Register",
1716
+ "kind": "screen",
1717
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/register",
1718
+ "route": "/register",
1719
+ "source": "src/app/register/page.tsx",
1720
+ "sourcePaths": [
1721
+ "src/app/register/page.tsx"
1722
+ ],
1723
+ "componentPaths": [],
1724
+ "metadata": {
1725
+ "interactiveControls": [
1726
+ {
1727
+ "id": "control:screen:/register:113",
1728
+ "label": "Interactive control at src/app/register/page.tsx:113",
1729
+ "kind": "action",
1730
+ "source": "src/app/register/page.tsx",
1731
+ "line": 113,
1732
+ "evidenceStatus": "source-discovered"
1733
+ },
1734
+ {
1735
+ "id": "control:screen:/register:119",
1736
+ "label": "Interactive control at src/app/register/page.tsx:119",
1737
+ "kind": "action",
1738
+ "source": "src/app/register/page.tsx",
1739
+ "line": 119,
1740
+ "evidenceStatus": "source-discovered"
1741
+ }
1742
+ ]
1743
+ },
1744
+ "runtimeProbe": {
1745
+ "status": "reachable",
1746
+ "httpStatus": 200
1747
+ },
1748
+ "screenshot": {
1749
+ "source": "reference",
1750
+ "status": "captured",
1751
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_register.png",
1752
+ "contentType": "image/png",
1753
+ "capturedAt": "2026-08-28T17:22:56.245Z",
1754
+ "referenceId": "input_67fadae419bc",
1755
+ "confidence": "high"
1756
+ }
1757
+ },
1758
+ {
1759
+ "id": "screen:/runs",
1760
+ "title": "Open Runs",
1761
+ "kind": "screen",
1762
+ "signature": "/Users/stevetran/bugmole/apps/qa@route:/runs",
1763
+ "route": "/runs",
1764
+ "source": "src/app/runs/page.tsx",
1765
+ "sourcePaths": [
1766
+ "src/app/runs/page.tsx"
1767
+ ],
1768
+ "componentPaths": [
1769
+ "src/app/dashboard-route.tsx"
1770
+ ],
1771
+ "runtimeProbe": {
1772
+ "status": "reachable",
1773
+ "httpStatus": 200
1774
+ },
1775
+ "screenshot": {
1776
+ "source": "reference",
1777
+ "status": "captured",
1778
+ "artifactKey": "projects/bugmole/journeys/evidence/flow%3Ascreen-to-audits-07666356/screen_runs.png",
1779
+ "contentType": "image/png",
1780
+ "capturedAt": "2026-08-28T17:22:56.273Z",
1781
+ "referenceId": "input_67fadae419bc",
1782
+ "confidence": "high"
1783
+ }
1784
+ },
1785
+ {
1786
+ "id": "screen:/tasks",
1787
+ "route": "/tasks",
1788
+ "title": "Open Tasks",
1789
+ "signature": "runtime-probe@route:/tasks",
1790
+ "runtimeProbe": {
1791
+ "status": "reachable",
1792
+ "httpStatus": 200
1793
+ }
1794
+ }
1795
+ ],
1796
+ "edges": [
1797
+ {
1798
+ "id": "screen:/api-keys->screen:/:0",
1799
+ "from": "screen:/api-keys",
1800
+ "to": "screen:/",
1801
+ "action": "navigate:/",
1802
+ "source": "src/app/api-keys/page.tsx"
1803
+ },
1804
+ {
1805
+ "id": "screen:/api-keys->screen:/logout:1",
1806
+ "from": "screen:/api-keys",
1807
+ "to": "screen:/logout",
1808
+ "action": "navigate:/logout",
1809
+ "source": "src/app/api-keys/page.tsx"
1810
+ },
1811
+ {
1812
+ "id": "screen:/manage->screen:/:0",
1813
+ "from": "screen:/manage",
1814
+ "to": "screen:/",
1815
+ "action": "navigate:/",
1816
+ "source": "src/app/manage/page.tsx"
1817
+ },
1818
+ {
1819
+ "id": "screen:/manage->screen:/manage/:resource/:[...action]:1",
1820
+ "from": "screen:/manage",
1821
+ "to": "screen:/manage/:resource/:[...action]",
1822
+ "action": "navigate:/manage/workspaces",
1823
+ "source": "src/app/manage/page.tsx"
1824
+ },
1825
+ {
1826
+ "id": "screen:/manage->screen:/manage/:resource/:[...action]:2",
1827
+ "from": "screen:/manage",
1828
+ "to": "screen:/manage/:resource/:[...action]",
1829
+ "action": "navigate:/manage/projects",
1830
+ "source": "src/app/manage/page.tsx"
1831
+ },
1832
+ {
1833
+ "id": "screen:/manage->screen:/manage/:resource/:[...action]:3",
1834
+ "from": "screen:/manage",
1835
+ "to": "screen:/manage/:resource/:[...action]",
1836
+ "action": "navigate:/manage/apps",
1837
+ "source": "src/app/manage/page.tsx"
1838
+ },
1839
+ {
1840
+ "id": "screen:/manage->screen:/manage/:resource/:[...action]:4",
1841
+ "from": "screen:/manage",
1842
+ "to": "screen:/manage/:resource/:[...action]",
1843
+ "action": "navigate:/manage/environments",
1844
+ "source": "src/app/manage/page.tsx"
1845
+ },
1846
+ {
1847
+ "id": "screen:/manage->screen:/logout:5",
1848
+ "from": "screen:/manage",
1849
+ "to": "screen:/logout",
1850
+ "action": "navigate:/logout",
1851
+ "source": "src/app/manage/page.tsx"
1852
+ },
1853
+ {
1854
+ "action": "navigate:/",
1855
+ "from": "screen:/profile",
1856
+ "id": "screen:/profile->screen:/:0",
1857
+ "to": "screen:/"
1858
+ },
1859
+ {
1860
+ "id": "screen:/manage->screen:/plans:dom-1",
1861
+ "from": "screen:/manage",
1862
+ "to": "screen:/plans",
1863
+ "action": "navigate:Test plans",
1864
+ "label": "Test plans",
1865
+ "source": "runtime-verified"
1866
+ },
1867
+ {
1868
+ "id": "screen:/manage->screen:/tasks:dom-2",
1869
+ "from": "screen:/manage",
1870
+ "to": "screen:/tasks",
1871
+ "action": "navigate:Agent tasks",
1872
+ "label": "Agent tasks",
1873
+ "source": "rendered-dom",
1874
+ "proof": "curl GET http://localhost:3020/manage HTML includes href=\"/tasks\">Agent tasks; GET /tasks returns HTTP 200 TasksPage section=tasks"
1875
+ },
1876
+ {
1877
+ "action": "navigate:Devices",
1878
+ "from": "screen:/manage",
1879
+ "id": "screen:/manage->screen:/devices:dom-3",
1880
+ "label": "Devices",
1881
+ "proof": "curl GET http://localhost:3020/manage HTML includes href=\"/devices\">Devices; GET /devices?project=bugmole returns HTTP 200 with aria-current=\"page\" on Devices nav link",
1882
+ "source": "rendered-dom",
1883
+ "to": "screen:/devices"
1884
+ },
1885
+ {
1886
+ "id": "screen:/manage->screen:/audits:dom-4",
1887
+ "from": "screen:/manage",
1888
+ "to": "screen:/audits",
1889
+ "action": "navigate:App Audit",
1890
+ "label": "App Audit",
1891
+ "source": "runtime-verified"
1892
+ },
1893
+ {
1894
+ "id": "screen:/manage->screen:/parity/issues:dom-5",
1895
+ "from": "screen:/manage",
1896
+ "to": "screen:/parity/issues",
1897
+ "action": "navigate:Parity bugs",
1898
+ "label": "Parity bugs",
1899
+ "proof": "GET http://localhost:3020/manage contains sidebar link href=/parity/issues; GET http://localhost:3020/parity/issues HTTP 200",
1900
+ "source": "runtime-verified"
1901
+ },
1902
+ {
1903
+ "id": "screen:/manage->screen:/blockers:dom-6",
1904
+ "from": "screen:/manage",
1905
+ "to": "screen:/blockers",
1906
+ "action": "navigate:Blockers",
1907
+ "label": "Blockers",
1908
+ "source": "rendered-dom"
1909
+ },
1910
+ {
1911
+ "action": "navigate:Re-authenticate with Aegis for this project",
1912
+ "from": "screen:/register",
1913
+ "id": "screen:/register->screen:/api/auth/login:dom-0",
1914
+ "to": "screen:/api/auth/login"
1915
+ },
1916
+ {
1917
+ "from": "screen:/manage",
1918
+ "to": "screen:/manage/:resource/:[...action]",
1919
+ "action": "navigate:/manage/workspaces",
1920
+ "proof": "GET http://localhost:3020/manage/workspaces?project=bugmole HTTP 200",
1921
+ "id": "screen:/manage->screen:/manage/:resource/:[...action]:navigate:/manage/workspaces"
1922
+ },
1923
+ {
1924
+ "from": "screen:/manage",
1925
+ "to": "screen:/manage/:resource/:[...action]",
1926
+ "action": "navigate:/manage/projects",
1927
+ "proof": "GET http://localhost:3020/manage/projects?project=bugmole HTTP 200",
1928
+ "id": "screen:/manage->screen:/manage/:resource/:[...action]:navigate:/manage/projects"
1929
+ },
1930
+ {
1931
+ "from": "screen:/manage",
1932
+ "to": "screen:/manage/:resource/:[...action]",
1933
+ "action": "navigate:/manage/apps",
1934
+ "proof": "GET http://localhost:3020/manage/apps?project=bugmole HTTP 200",
1935
+ "id": "screen:/manage->screen:/manage/:resource/:[...action]:navigate:/manage/apps"
1936
+ },
1937
+ {
1938
+ "from": "screen:/manage",
1939
+ "to": "screen:/manage/:resource/:[...action]",
1940
+ "action": "navigate:/manage/environments",
1941
+ "proof": "GET http://localhost:3020/manage/environments?project=bugmole HTTP 200",
1942
+ "id": "screen:/manage->screen:/manage/:resource/:[...action]:navigate:/manage/environments"
1943
+ },
1944
+ {
1945
+ "id": "screen:/->screen:/plans:dom-1",
1946
+ "from": "screen:/",
1947
+ "to": "screen:/plans",
1948
+ "action": "navigate:Test plans",
1949
+ "label": "Test plans",
1950
+ "proof": "GET http://localhost:3020/plans?project=bugmole HTTP 200; href=/plans?project=bugmole&environment=all"
1951
+ },
1952
+ {
1953
+ "id": "screen:/->screen:/tasks:dom-2",
1954
+ "from": "screen:/",
1955
+ "to": "screen:/tasks",
1956
+ "action": "navigate:Agent tasks",
1957
+ "label": "Agent tasks",
1958
+ "proof": "GET http://localhost:3020/tasks?project=bugmole HTTP 200",
1959
+ "source": "runtime-verified"
1960
+ },
1961
+ {
1962
+ "id": "screen:/->screen:/devices:dom-3",
1963
+ "from": "screen:/",
1964
+ "to": "screen:/devices",
1965
+ "action": "navigate:Devices",
1966
+ "label": "Devices",
1967
+ "proof": "GET http://localhost:3020/devices?project=bugmole HTTP 200",
1968
+ "source": "runtime-verified"
1969
+ },
1970
+ {
1971
+ "id": "screen:/->screen:/audits:dom-4",
1972
+ "from": "screen:/",
1973
+ "to": "screen:/audits",
1974
+ "action": "navigate:App Audit",
1975
+ "label": "App Audit",
1976
+ "proof": "GET http://localhost:3020/audits?project=bugmole HTTP 200",
1977
+ "source": "runtime-verified"
1978
+ },
1979
+ {
1980
+ "id": "screen:/->screen:/parity/issues:dom-5",
1981
+ "from": "screen:/",
1982
+ "to": "screen:/parity/issues",
1983
+ "action": "navigate:Parity bugs",
1984
+ "label": "Parity bugs",
1985
+ "proof": "GET http://localhost:3020/parity/issues?project=bugmole HTTP 200",
1986
+ "source": "rendered-dom"
1987
+ },
1988
+ {
1989
+ "id": "screen:/->screen:/blockers:dom-6",
1990
+ "from": "screen:/",
1991
+ "to": "screen:/blockers",
1992
+ "action": "navigate:Blockers",
1993
+ "label": "Blockers",
1994
+ "proof": "GET http://localhost:3020/?project=bugmole contains sidebar link href=/blockers; GET http://localhost:3020/blockers?project=bugmole HTTP 200 with id=blockers and The run ends here",
1995
+ "source": "runtime-verified"
1996
+ },
1997
+ {
1998
+ "id": "screen:/audits->screen:/evidence:dom-7",
1999
+ "from": "screen:/audits",
2000
+ "to": "screen:/evidence",
2001
+ "action": "navigate:Open screenshot evidence",
2002
+ "label": "Open screenshot evidence",
2003
+ "proof": "GET http://localhost:3020/evidence?project=bugmole HTTP 200",
2004
+ "source": "runtime-verified"
2005
+ }
2006
+ ],
2007
+ "metadata": {
2008
+ "application": {
2009
+ "name": "@theaiinc/bugmole-dashboard",
2010
+ "description": "Standalone Bugmole dashboard UI for multiple projects and environments.",
2011
+ "sources": [
2012
+ "package.json"
2013
+ ]
2014
+ },
2015
+ "declaredFlows": {
2016
+ "adopted": [],
2017
+ "stale": [
2018
+ {
2019
+ "id": "marketing-entry",
2020
+ "name": "Marketing Entry",
2021
+ "source": "../../spec/journey_graph.yaml",
2022
+ "missingRoutes": [
2023
+ "/book"
2024
+ ]
2025
+ },
2026
+ {
2027
+ "id": "public-booking",
2028
+ "name": "Public Booking",
2029
+ "source": "../../spec/journey_graph.yaml",
2030
+ "missingRoutes": [
2031
+ "/book",
2032
+ "/book/[vehicleId]",
2033
+ "/book/requested",
2034
+ "/book/payments/[paymentId]"
2035
+ ]
2036
+ },
2037
+ {
2038
+ "id": "owner-operations",
2039
+ "name": "Owner Operations",
2040
+ "source": "../../spec/journey_graph.yaml",
2041
+ "missingRoutes": [
2042
+ "/owner"
2043
+ ]
2044
+ },
2045
+ {
2046
+ "id": "finance-reporting",
2047
+ "name": "Finance Reporting",
2048
+ "source": "../../spec/journey_graph.yaml",
2049
+ "missingRoutes": [
2050
+ "/owner/reports"
2051
+ ]
2052
+ },
2053
+ {
2054
+ "id": "webhooks",
2055
+ "name": "Webhook Contracts",
2056
+ "source": "../../spec/journey_graph.yaml",
2057
+ "missingRoutes": [
2058
+ "/api/payments/webhook",
2059
+ "/api/tracking/om"
2060
+ ]
2061
+ }
2062
+ ]
2063
+ },
2064
+ "navigationCrawl": {
2065
+ "visited": 29,
2066
+ "failed": 0,
2067
+ "failures": []
2068
+ },
2069
+ "journeyReview": {
2070
+ "mode": "review-and-add",
2071
+ "reviewed": [
2072
+ {
2073
+ "id": "flow:screen-to-audits-07666356",
2074
+ "revision": 1,
2075
+ "nodeCount": 2,
2076
+ "edgeCount": 1,
2077
+ "review": "preserved"
2078
+ },
2079
+ {
2080
+ "id": "flow:screen-to-parity-issues-2218e3ad",
2081
+ "revision": 1,
2082
+ "nodeCount": 2,
2083
+ "edgeCount": 1,
2084
+ "review": "preserved"
2085
+ },
2086
+ {
2087
+ "id": "flow:screen-to-blockers-091d258b",
2088
+ "revision": 1,
2089
+ "nodeCount": 2,
2090
+ "edgeCount": 1,
2091
+ "review": "preserved"
2092
+ },
2093
+ {
2094
+ "id": "flow:screen-to-plans-8232a94f",
2095
+ "revision": 2,
2096
+ "nodeCount": 2,
2097
+ "edgeCount": 1,
2098
+ "review": "preserved"
2099
+ },
2100
+ {
2101
+ "id": "flow:screen-to-devices-cad72f75",
2102
+ "revision": 2,
2103
+ "nodeCount": 2,
2104
+ "edgeCount": 1,
2105
+ "review": "preserved"
2106
+ },
2107
+ {
2108
+ "id": "flow:screen-to-evidence-6c3ab309",
2109
+ "revision": 2,
2110
+ "nodeCount": 3,
2111
+ "edgeCount": 2,
2112
+ "review": "preserved"
2113
+ },
2114
+ {
2115
+ "id": "flow:api-keys-to-screen-157e10a6",
2116
+ "revision": 1,
2117
+ "nodeCount": 2,
2118
+ "edgeCount": 1,
2119
+ "review": "preserved"
2120
+ },
2121
+ {
2122
+ "id": "flow:api-keys-to-logout-7396cd5d",
2123
+ "revision": 1,
2124
+ "nodeCount": 2,
2125
+ "edgeCount": 1,
2126
+ "review": "preserved"
2127
+ },
2128
+ {
2129
+ "id": "flow:manage-to-logout-86c54656",
2130
+ "revision": 1,
2131
+ "nodeCount": 2,
2132
+ "edgeCount": 1,
2133
+ "review": "preserved"
2134
+ },
2135
+ {
2136
+ "id": "flow:profile-to-screen-6045aa3d",
2137
+ "revision": 1,
2138
+ "nodeCount": 2,
2139
+ "edgeCount": 1,
2140
+ "review": "preserved"
2141
+ },
2142
+ {
2143
+ "id": "flow:manage-to-manage-resource-action-6325f99a",
2144
+ "revision": 2,
2145
+ "nodeCount": 2,
2146
+ "edgeCount": 4,
2147
+ "review": "preserved"
2148
+ },
2149
+ {
2150
+ "id": "flow:manage-to-tasks-c5791c95",
2151
+ "revision": 1,
2152
+ "nodeCount": 2,
2153
+ "edgeCount": 1,
2154
+ "review": "preserved"
2155
+ },
2156
+ {
2157
+ "id": "flow:manage-to-devices-ad57e202",
2158
+ "revision": 1,
2159
+ "nodeCount": 2,
2160
+ "edgeCount": 1,
2161
+ "review": "preserved"
2162
+ },
2163
+ {
2164
+ "id": "flow:manage-to-audits-176c1eb8",
2165
+ "revision": 1,
2166
+ "nodeCount": 2,
2167
+ "edgeCount": 1,
2168
+ "review": "preserved"
2169
+ },
2170
+ {
2171
+ "id": "flow:manage-to-parity-issues-01fa2579",
2172
+ "revision": 1,
2173
+ "nodeCount": 2,
2174
+ "edgeCount": 1,
2175
+ "review": "preserved"
2176
+ },
2177
+ {
2178
+ "id": "flow:manage-to-blockers-633282c8",
2179
+ "revision": 1,
2180
+ "nodeCount": 2,
2181
+ "edgeCount": 1,
2182
+ "review": "preserved"
2183
+ },
2184
+ {
2185
+ "id": "flow:manage-to-screen-6857f915",
2186
+ "revision": 7,
2187
+ "nodeCount": 2,
2188
+ "edgeCount": 1,
2189
+ "review": "preserved"
2190
+ },
2191
+ {
2192
+ "id": "flow:manage-to-plans-64c3c61b",
2193
+ "revision": 2,
2194
+ "nodeCount": 2,
2195
+ "edgeCount": 1,
2196
+ "review": "preserved"
2197
+ },
2198
+ {
2199
+ "id": "flow:screen-to-tasks-540671d1",
2200
+ "revision": 2,
2201
+ "nodeCount": 2,
2202
+ "edgeCount": 1,
2203
+ "review": "preserved"
2204
+ },
2205
+ {
2206
+ "id": "flow:register-to-api-auth-login-460a9cc8",
2207
+ "revision": 1,
2208
+ "nodeCount": 2,
2209
+ "edgeCount": 1,
2210
+ "review": "preserved"
2211
+ }
2212
+ ],
2213
+ "added": [],
2214
+ "retired": [],
2215
+ "candidateCount": 13,
2216
+ "trainingCheckpoints": [
2217
+ {
2218
+ "id": "checkpoint:api-api-keys-keyid",
2219
+ "nodeId": "screen:/api/api-keys/:keyId",
2220
+ "route": "/api/api-keys/:keyId"
2221
+ },
2222
+ {
2223
+ "id": "checkpoint:api-api-keys",
2224
+ "nodeId": "screen:/api/api-keys",
2225
+ "route": "/api/api-keys"
2226
+ },
2227
+ {
2228
+ "id": "checkpoint:api-auth-callback",
2229
+ "nodeId": "screen:/api/auth/callback",
2230
+ "route": "/api/auth/callback"
2231
+ },
2232
+ {
2233
+ "id": "checkpoint:api-auth-login",
2234
+ "nodeId": "screen:/api/auth/login",
2235
+ "route": "/api/auth/login"
2236
+ },
2237
+ {
2238
+ "id": "checkpoint:api-auth-session",
2239
+ "nodeId": "screen:/api/auth/session",
2240
+ "route": "/api/auth/session"
2241
+ },
2242
+ {
2243
+ "id": "checkpoint:api-device-sessions",
2244
+ "nodeId": "screen:/api/device-sessions",
2245
+ "route": "/api/device-sessions"
2246
+ },
2247
+ {
2248
+ "id": "checkpoint:api-devices-deviceid",
2249
+ "nodeId": "screen:/api/devices/:deviceId",
2250
+ "route": "/api/devices/:deviceId"
2251
+ },
2252
+ {
2253
+ "id": "checkpoint:api-devices",
2254
+ "nodeId": "screen:/api/devices",
2255
+ "route": "/api/devices"
2256
+ },
2257
+ {
2258
+ "id": "checkpoint:api-onboarding-claim",
2259
+ "nodeId": "screen:/api/onboarding/claim",
2260
+ "route": "/api/onboarding/claim"
2261
+ },
2262
+ {
2263
+ "id": "checkpoint:api-projects-projectid",
2264
+ "nodeId": "screen:/api/projects/:projectId",
2265
+ "route": "/api/projects/:projectId"
2266
+ },
2267
+ {
2268
+ "id": "checkpoint:api-projects-register",
2269
+ "nodeId": "screen:/api/projects/register",
2270
+ "route": "/api/projects/register"
2271
+ },
2272
+ {
2273
+ "id": "checkpoint:api-projects",
2274
+ "nodeId": "screen:/api/projects",
2275
+ "route": "/api/projects"
2276
+ },
2277
+ {
2278
+ "id": "checkpoint:api-runs-runid",
2279
+ "nodeId": "screen:/api/runs/:runId",
2280
+ "route": "/api/runs/:runId"
2281
+ },
2282
+ {
2283
+ "id": "checkpoint:api-tasks-taskid",
2284
+ "nodeId": "screen:/api/tasks/:taskId",
2285
+ "route": "/api/tasks/:taskId"
2286
+ },
2287
+ {
2288
+ "id": "checkpoint:api-workspaces-workspaceid",
2289
+ "nodeId": "screen:/api/workspaces/:workspaceId",
2290
+ "route": "/api/workspaces/:workspaceId"
2291
+ },
2292
+ {
2293
+ "id": "checkpoint:api-workspaces",
2294
+ "nodeId": "screen:/api/workspaces",
2295
+ "route": "/api/workspaces"
2296
+ },
2297
+ {
2298
+ "id": "checkpoint:api-keys",
2299
+ "nodeId": "screen:/api-keys",
2300
+ "route": "/api-keys"
2301
+ },
2302
+ {
2303
+ "id": "checkpoint:audits",
2304
+ "nodeId": "screen:/audits",
2305
+ "route": "/audits"
2306
+ },
2307
+ {
2308
+ "id": "checkpoint:blockers",
2309
+ "nodeId": "screen:/blockers",
2310
+ "route": "/blockers"
2311
+ },
2312
+ {
2313
+ "id": "checkpoint:coordinator",
2314
+ "nodeId": "screen:/coordinator",
2315
+ "route": "/coordinator"
2316
+ },
2317
+ {
2318
+ "id": "checkpoint:devices",
2319
+ "nodeId": "screen:/devices",
2320
+ "route": "/devices"
2321
+ },
2322
+ {
2323
+ "id": "checkpoint:evidence",
2324
+ "nodeId": "screen:/evidence",
2325
+ "route": "/evidence"
2326
+ },
2327
+ {
2328
+ "id": "checkpoint:journeys",
2329
+ "nodeId": "screen:/journeys",
2330
+ "route": "/journeys"
2331
+ },
2332
+ {
2333
+ "id": "checkpoint:login",
2334
+ "nodeId": "screen:/login",
2335
+ "route": "/login"
2336
+ },
2337
+ {
2338
+ "id": "checkpoint:logout",
2339
+ "nodeId": "screen:/logout",
2340
+ "route": "/logout"
2341
+ },
2342
+ {
2343
+ "id": "checkpoint:manage-resource-action",
2344
+ "nodeId": "screen:/manage/:resource/:[...action]",
2345
+ "route": "/manage/:resource/:[...action]"
2346
+ },
2347
+ {
2348
+ "id": "checkpoint:manage",
2349
+ "nodeId": "screen:/manage",
2350
+ "route": "/manage"
2351
+ },
2352
+ {
2353
+ "id": "checkpoint:oauth-callback",
2354
+ "nodeId": "screen:/oauth/callback",
2355
+ "route": "/oauth/callback"
2356
+ },
2357
+ {
2358
+ "id": "checkpoint:screen",
2359
+ "nodeId": "screen:/",
2360
+ "route": "/"
2361
+ },
2362
+ {
2363
+ "id": "checkpoint:parity-issues",
2364
+ "nodeId": "screen:/parity/issues",
2365
+ "route": "/parity/issues"
2366
+ },
2367
+ {
2368
+ "id": "checkpoint:parity",
2369
+ "nodeId": "screen:/parity",
2370
+ "route": "/parity"
2371
+ },
2372
+ {
2373
+ "id": "checkpoint:plans",
2374
+ "nodeId": "screen:/plans",
2375
+ "route": "/plans"
2376
+ },
2377
+ {
2378
+ "id": "checkpoint:profile",
2379
+ "nodeId": "screen:/profile",
2380
+ "route": "/profile"
2381
+ },
2382
+ {
2383
+ "id": "checkpoint:qa-evidence-filename",
2384
+ "nodeId": "screen:/qa-evidence/:fileName",
2385
+ "route": "/qa-evidence/:fileName"
2386
+ },
2387
+ {
2388
+ "id": "checkpoint:register",
2389
+ "nodeId": "screen:/register",
2390
+ "route": "/register"
2391
+ },
2392
+ {
2393
+ "id": "checkpoint:runs",
2394
+ "nodeId": "screen:/runs",
2395
+ "route": "/runs"
2396
+ },
2397
+ {
2398
+ "id": "checkpoint:tasks",
2399
+ "nodeId": "screen:/tasks",
2400
+ "route": "/tasks"
2401
+ }
2402
+ ],
2403
+ "entrances": [
2404
+ {
2405
+ "nodeId": "screen:/",
2406
+ "route": "/",
2407
+ "reason": "application root"
2408
+ },
2409
+ {
2410
+ "nodeId": "screen:/manage/:resource/:[...action]",
2411
+ "route": "/manage/:resource/:[...action]",
2412
+ "reason": "most linked-to screen (4 inbound)"
2413
+ },
2414
+ {
2415
+ "nodeId": "screen:/logout",
2416
+ "route": "/logout",
2417
+ "reason": "most linked-to screen (2 inbound)"
2418
+ },
2419
+ {
2420
+ "nodeId": "screen:/api/auth/login",
2421
+ "route": "/api/auth/login",
2422
+ "reason": "most linked-to screen (1 inbound)"
2423
+ },
2424
+ {
2425
+ "nodeId": "screen:/audits",
2426
+ "route": "/audits",
2427
+ "reason": "most linked-to screen (1 inbound)"
2428
+ }
2429
+ ]
2430
+ },
2431
+ "discoveredAt": "2026-08-28T17:22:11.935Z",
2432
+ "baseUrl": "http://localhost:3020",
2433
+ "projectRoot": "/Users/stevetran/bugmole/apps/qa",
2434
+ "sourceFiles": 101,
2435
+ "access": {
2436
+ "baseUrl": "http://localhost:3020",
2437
+ "method": "configured",
2438
+ "transport": "browser",
2439
+ "startCommand": "cd apps/qa && npx next dev -p 3020",
2440
+ "authState": "unknown",
2441
+ "lastVerifiedAt": "2026-08-28T17:22:11.935Z",
2442
+ "credentialPresent": false
2443
+ },
2444
+ "analysis": {
2445
+ "mode": "source-routing-plus-runtime-probes",
2446
+ "staticSourceEvidence": true,
2447
+ "runtimeRouteValidation": true,
2448
+ "unresolvedLinks": [],
2449
+ "routeProbes": {
2450
+ "/api/api-keys/:keyId": {
2451
+ "status": "unreachable",
2452
+ "httpStatus": 405,
2453
+ "reason": "HTTP 405"
2454
+ },
2455
+ "/api/api-keys": {
2456
+ "status": "unreachable",
2457
+ "httpStatus": 404,
2458
+ "reason": "HTTP 404"
2459
+ },
2460
+ "/api/auth/callback": {
2461
+ "status": "unreachable",
2462
+ "httpStatus": 400,
2463
+ "reason": "HTTP 400"
2464
+ },
2465
+ "/api/auth/login": {
2466
+ "status": "reachable",
2467
+ "httpStatus": 302
2468
+ },
2469
+ "/api/auth/session": {
2470
+ "status": "reachable",
2471
+ "httpStatus": 200
2472
+ },
2473
+ "/api/device-sessions": {
2474
+ "status": "reachable",
2475
+ "httpStatus": 200
2476
+ },
2477
+ "/api/devices/:deviceId": {
2478
+ "status": "unreachable",
2479
+ "httpStatus": 404,
2480
+ "reason": "HTTP 404"
2481
+ },
2482
+ "/api/devices": {
2483
+ "status": "reachable",
2484
+ "httpStatus": 200
2485
+ },
2486
+ "/api/onboarding/claim": {
2487
+ "status": "unreachable",
2488
+ "httpStatus": 405,
2489
+ "reason": "HTTP 405"
2490
+ },
2491
+ "/api/projects/:projectId": {
2492
+ "status": "unreachable",
2493
+ "httpStatus": 405,
2494
+ "reason": "HTTP 405"
2495
+ },
2496
+ "/api/projects/register": {
2497
+ "status": "unreachable",
2498
+ "httpStatus": 405,
2499
+ "reason": "HTTP 405"
2500
+ },
2501
+ "/api/projects": {
2502
+ "status": "reachable",
2503
+ "httpStatus": 200
2504
+ },
2505
+ "/api/runs/:runId": {
2506
+ "status": "unreachable",
2507
+ "httpStatus": 404,
2508
+ "reason": "HTTP 404"
2509
+ },
2510
+ "/api/tasks/:taskId": {
2511
+ "status": "unreachable",
2512
+ "httpStatus": 405,
2513
+ "reason": "HTTP 405"
2514
+ },
2515
+ "/api/workspaces/:workspaceId": {
2516
+ "status": "unreachable",
2517
+ "httpStatus": 405,
2518
+ "reason": "HTTP 405"
2519
+ },
2520
+ "/api/workspaces": {
2521
+ "status": "unreachable",
2522
+ "httpStatus": 404,
2523
+ "reason": "HTTP 404"
2524
+ },
2525
+ "/api-keys": {
2526
+ "status": "reachable",
2527
+ "httpStatus": 200
2528
+ },
2529
+ "/audits": {
2530
+ "status": "reachable",
2531
+ "httpStatus": 200
2532
+ },
2533
+ "/blockers": {
2534
+ "status": "reachable",
2535
+ "httpStatus": 200
2536
+ },
2537
+ "/coordinator": {
2538
+ "status": "reachable",
2539
+ "httpStatus": 200
2540
+ },
2541
+ "/devices": {
2542
+ "status": "reachable",
2543
+ "httpStatus": 200
2544
+ },
2545
+ "/evidence": {
2546
+ "status": "reachable",
2547
+ "httpStatus": 200
2548
+ },
2549
+ "/journeys": {
2550
+ "status": "reachable",
2551
+ "httpStatus": 200
2552
+ },
2553
+ "/login": {
2554
+ "status": "reachable",
2555
+ "httpStatus": 200
2556
+ },
2557
+ "/logout": {
2558
+ "status": "reachable",
2559
+ "httpStatus": 307
2560
+ },
2561
+ "/manage/:resource/:[...action]": {
2562
+ "status": "reachable",
2563
+ "httpStatus": 200
2564
+ },
2565
+ "/manage": {
2566
+ "status": "reachable",
2567
+ "httpStatus": 200
2568
+ },
2569
+ "/oauth/callback": {
2570
+ "status": "reachable",
2571
+ "httpStatus": 200
2572
+ },
2573
+ "/": {
2574
+ "status": "reachable",
2575
+ "httpStatus": 200
2576
+ },
2577
+ "/parity/issues": {
2578
+ "status": "reachable",
2579
+ "httpStatus": 200
2580
+ },
2581
+ "/parity": {
2582
+ "status": "reachable",
2583
+ "httpStatus": 200
2584
+ },
2585
+ "/plans": {
2586
+ "status": "reachable",
2587
+ "httpStatus": 200
2588
+ },
2589
+ "/profile": {
2590
+ "status": "reachable",
2591
+ "httpStatus": 200
2592
+ },
2593
+ "/qa-evidence/:fileName": {
2594
+ "status": "unreachable",
2595
+ "httpStatus": 404,
2596
+ "reason": "HTTP 404"
2597
+ },
2598
+ "/register": {
2599
+ "status": "reachable",
2600
+ "httpStatus": 200
2601
+ },
2602
+ "/runs": {
2603
+ "status": "reachable",
2604
+ "httpStatus": 200
2605
+ },
2606
+ "/tasks": {
2607
+ "status": "reachable",
2608
+ "httpStatus": 200
2609
+ }
2610
+ },
2611
+ "staleGraphEntriesRemoved": true,
2612
+ "semanticTitles": "route-derived"
2613
+ },
2614
+ "lastAuthenticatedDiscoveryAt": "2026-08-28T18:31:34.409Z",
2615
+ "authenticatedDiscovery": true
2616
+ },
2617
+ "appId": "dashboard"
2618
+ }