{
  "ursId": "URS-036",
  "title": "Mobile device support",
  "timestamp": "2026-09-29T02:24:58.680Z",
  "durationMs": 187069,
  "config": {
    "inboxUrl": "http://localhost:43879",
    "dbHost": "localhost",
    "dbPort": 43399,
    "dbName": "cc_repinbox_dev"
  },
  "setup": {
    "status": "pass"
  },
  "scenarios": [
    {
      "name": "Step 1: Login form on iPhone 12 (empty)",
      "status": "pass",
      "description": "Step 1: Login form on iPhone 12 (empty)",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-01-iphone-12-login-empty.png"
      ],
      "explanation": "Confirms the login form is rendered and accessible on an iPhone 12 viewport (390×844 px) before credentials are entered. Verifies the form fields are visible and that no horizontal scroll occurs at the phone viewport width.",
      "startedAt": "2026-09-29T02:25:21.170Z",
      "finishedAt": "2026-09-29T02:25:21.170Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/videos/step-01-iphone-12-login.webm"
    },
    {
      "name": "Step 1: Login form on iPhone 12 (filled)",
      "status": "pass",
      "description": "Step 1: Login form on iPhone 12 (filled)",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-01-iphone-12-login-filled.png"
      ],
      "explanation": "Shows the login form with credentials filled in, immediately before the submit button is tapped. Confirms all fields are reachable and readable on a mobile viewport.",
      "startedAt": "2026-09-29T02:25:22.952Z",
      "finishedAt": "2026-09-29T02:25:22.952Z"
    },
    {
      "name": "Step 1: Home page on iPhone 12 after login",
      "status": "pass",
      "description": "Step 1: Home page on iPhone 12 after login",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-01-iphone-12-home.png"
      ],
      "explanation": "Confirms a successful login redirected the browser away from /login and that the post-login home page renders without horizontal overflow on the iPhone 12 viewport.",
      "startedAt": "2026-09-29T02:25:25.934Z",
      "finishedAt": "2026-09-29T02:25:25.934Z"
    },
    {
      "name": "Step 2: Navigation drawer open on iPhone 12",
      "status": "pass",
      "description": "Step 2: Navigation drawer open on iPhone 12",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-02-drawer-open-iphone-12.png"
      ],
      "explanation": "Taps the hamburger menu button to open the mobile navigation drawer, then captures the full open state. Proves the primary navigation destinations are reachable by touch on a 390×844 px phone viewport.",
      "startedAt": "2026-09-29T02:25:35.869Z",
      "finishedAt": "2026-09-29T02:25:35.869Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/videos/step-02-nav-drawer.webm"
    },
    {
      "name": "Step 2: Billing page after drawer navigation",
      "status": "pass",
      "description": "Step 2: Billing page after drawer navigation",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-02-billing-after-nav.png"
      ],
      "explanation": "Taps the Bill-Only nav link inside the open drawer and confirms the app routes to /billing. Also confirms the drawer auto-closes after navigation, matching the NavigationSidebar setOpenMobile(false) behavior.",
      "startedAt": "2026-09-29T02:25:38.560Z",
      "finishedAt": "2026-09-29T02:25:38.560Z"
    },
    {
      "name": "Step 3: Accounts cards on iPhone 12",
      "status": "pass",
      "description": "Step 3: Accounts cards on iPhone 12",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-03-accounts-cards-iphone-12.png"
      ],
      "explanation": "Confirms the /sales-accounts page renders a vertical card list (not a table) on the iPhone 12 viewport. Asserts the three seeded Vantis account names appear inside the mobile-only card container and that no horizontal scroll is present.",
      "startedAt": "2026-09-29T02:25:47.391Z",
      "finishedAt": "2026-09-29T02:25:47.391Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/videos/step-03-accounts-mobile-cards.webm"
    },
    {
      "name": "Step 3: Account detail on iPhone 12",
      "status": "pass",
      "description": "Step 3: Account detail on iPhone 12",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-03-account-detail-iphone-12.png"
      ],
      "explanation": "Taps a mobile card link and confirms the app navigates to the account detail page. Verifies the detail page loads without horizontal overflow on a phone viewport.",
      "startedAt": "2026-09-29T02:25:48.494Z",
      "finishedAt": "2026-09-29T02:25:48.494Z"
    },
    {
      "name": "Step 4: Billing cards on iPhone 12",
      "status": "pass",
      "description": "Step 4: Billing cards on iPhone 12",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-04-billing-cards-iphone-12.png"
      ],
      "explanation": "Confirms the /billing page renders all four seeded Bill-Only Orders as tappable links on the iPhone 12 viewport, and that no horizontal scroll is present.",
      "startedAt": "2026-09-29T02:26:35.967Z",
      "finishedAt": "2026-09-29T02:26:35.967Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/videos/step-04-billing-mobile-cards.webm"
    },
    {
      "name": "Step 4: Billing detail on iPhone 12",
      "status": "pass",
      "description": "Step 4: Billing detail on iPhone 12",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-04-billing-detail-iphone-12.png"
      ],
      "explanation": "Taps a billing card link and confirms the app navigates to the order detail page. Verifies the detail page loads without horizontal overflow on a phone viewport.",
      "startedAt": "2026-09-29T02:26:38.345Z",
      "finishedAt": "2026-09-29T02:26:38.345Z"
    },
    {
      "name": "Step 5: iPhone 12 /billing?filter=all&dateFrom=2020-01-01&dateTo=2035-12-31",
      "status": "pass",
      "description": "Step 5: iPhone 12 /billing?filter=all&dateFrom=2020-01-01&dateTo=2035-12-31",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-iphone-12-billing-filter-all-datefrom-2020-01-01-dateto-2035-12-31.png"
      ],
      "startedAt": "2026-09-29T02:26:45.351Z",
      "finishedAt": "2026-09-29T02:26:45.351Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/videos/step-05-galaxy-s21-no-hscroll.webm"
    },
    {
      "name": "Step 5: iPhone 12 /sales-accounts",
      "status": "pass",
      "description": "Step 5: iPhone 12 /sales-accounts",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-iphone-12-sales-accounts.png"
      ],
      "explanation": "Verifies the /sales-accounts page renders without horizontal overflow on iPhone 12 (390×844 px). Part of the full-matrix no-horizontal-scroll sweep.",
      "startedAt": "2026-09-29T02:26:47.818Z",
      "finishedAt": "2026-09-29T02:26:47.818Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/videos/step-05-iphone-12-no-hscroll.webm"
    },
    {
      "name": "Step 5: iPhone 12 /orders/requests",
      "status": "pass",
      "description": "Step 5: iPhone 12 /orders/requests",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-iphone-12-orders-requests.png"
      ],
      "explanation": "Verifies the /orders/requests page renders without horizontal overflow on iPhone 12 (390×844 px). Covers the order-request queue a field rep reaches from the mobile drawer.",
      "startedAt": "2026-09-29T02:26:50.598Z",
      "finishedAt": "2026-09-29T02:26:50.598Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/videos/step-05-iphone-se-no-hscroll.webm"
    },
    {
      "name": "Step 5: iPhone 12 /packages",
      "status": "pass",
      "description": "Step 5: iPhone 12 /packages",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-iphone-12-packages.png"
      ],
      "explanation": "Verifies the /packages page renders without horizontal overflow on iPhone 12 (390×844 px). Uses the DataTable mobile-row layout below the md breakpoint.",
      "startedAt": "2026-09-29T02:26:53.152Z",
      "finishedAt": "2026-09-29T02:26:53.152Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/videos/step-05-pixel-5-no-hscroll.webm"
    },
    {
      "name": "Step 5: iPhone 12 /inventory",
      "status": "pass",
      "description": "Step 5: iPhone 12 /inventory",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-iphone-12-inventory.png"
      ],
      "explanation": "Verifies the /inventory page renders without horizontal overflow on iPhone 12 (390×844 px). Uses the DataTable mobile-row layout below the md breakpoint.",
      "startedAt": "2026-09-29T02:26:55.652Z",
      "finishedAt": "2026-09-29T02:26:55.652Z"
    },
    {
      "name": "Step 5: iPhone SE /billing?filter=all&dateFrom=2020-01-01&dateTo=2035-12-31",
      "status": "pass",
      "description": "Step 5: iPhone SE /billing?filter=all&dateFrom=2020-01-01&dateTo=2035-12-31",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-iphone-se-billing-filter-all-datefrom-2020-01-01-dateto-2035-12-31.png"
      ],
      "startedAt": "2026-09-29T02:27:01.246Z",
      "finishedAt": "2026-09-29T02:27:01.246Z"
    },
    {
      "name": "Step 5: iPhone SE /sales-accounts",
      "status": "pass",
      "description": "Step 5: iPhone SE /sales-accounts",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-iphone-se-sales-accounts.png"
      ],
      "explanation": "Verifies the /sales-accounts page renders without horizontal overflow on iPhone SE (375×667 px), the narrowest iOS viewport in the test matrix.",
      "startedAt": "2026-09-29T02:27:03.757Z",
      "finishedAt": "2026-09-29T02:27:03.757Z"
    },
    {
      "name": "Step 5: iPhone SE /orders/requests",
      "status": "pass",
      "description": "Step 5: iPhone SE /orders/requests",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-iphone-se-orders-requests.png"
      ],
      "explanation": "Verifies the /orders/requests page renders without horizontal overflow on iPhone SE (375×667 px), the narrowest iOS viewport in the test matrix.",
      "startedAt": "2026-09-29T02:27:06.086Z",
      "finishedAt": "2026-09-29T02:27:06.086Z"
    },
    {
      "name": "Step 5: iPhone SE /packages",
      "status": "pass",
      "description": "Step 5: iPhone SE /packages",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-iphone-se-packages.png"
      ],
      "explanation": "Verifies the /packages page renders without horizontal overflow on iPhone SE (375×667 px), the narrowest iOS viewport in the test matrix.",
      "startedAt": "2026-09-29T02:27:08.441Z",
      "finishedAt": "2026-09-29T02:27:08.441Z"
    },
    {
      "name": "Step 5: iPhone SE /inventory",
      "status": "pass",
      "description": "Step 5: iPhone SE /inventory",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-iphone-se-inventory.png"
      ],
      "explanation": "Verifies the /inventory page renders without horizontal overflow on iPhone SE (375×667 px), the narrowest iOS viewport in the test matrix.",
      "startedAt": "2026-09-29T02:27:10.758Z",
      "finishedAt": "2026-09-29T02:27:10.758Z"
    },
    {
      "name": "Step 5: Android Pixel 5 /billing?filter=all&dateFrom=2020-01-01&dateTo=2035-12-31",
      "status": "pass",
      "description": "Step 5: Android Pixel 5 /billing?filter=all&dateFrom=2020-01-01&dateTo=2035-12-31",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-pixel-5-billing-filter-all-datefrom-2020-01-01-dateto-2035-12-31.png"
      ],
      "startedAt": "2026-09-29T02:27:16.308Z",
      "finishedAt": "2026-09-29T02:27:16.308Z"
    },
    {
      "name": "Step 5: Android Pixel 5 /sales-accounts",
      "status": "pass",
      "description": "Step 5: Android Pixel 5 /sales-accounts",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-pixel-5-sales-accounts.png"
      ],
      "explanation": "Verifies the /sales-accounts page renders without horizontal overflow on Android Pixel 5 (432×864 px). Tests responsive layout on an Android Chrome user agent.",
      "startedAt": "2026-09-29T02:27:18.851Z",
      "finishedAt": "2026-09-29T02:27:18.851Z"
    },
    {
      "name": "Step 5: Android Pixel 5 /orders/requests",
      "status": "pass",
      "description": "Step 5: Android Pixel 5 /orders/requests",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-pixel-5-orders-requests.png"
      ],
      "explanation": "Verifies the /orders/requests page renders without horizontal overflow on Android Pixel 5 (432×864 px). Tests responsive layout on an Android Chrome user agent.",
      "startedAt": "2026-09-29T02:27:21.211Z",
      "finishedAt": "2026-09-29T02:27:21.211Z"
    },
    {
      "name": "Step 5: Android Pixel 5 /packages",
      "status": "pass",
      "description": "Step 5: Android Pixel 5 /packages",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-pixel-5-packages.png"
      ],
      "explanation": "Verifies the /packages page renders without horizontal overflow on Android Pixel 5 (432×864 px). Tests responsive layout on an Android Chrome user agent.",
      "startedAt": "2026-09-29T02:27:23.580Z",
      "finishedAt": "2026-09-29T02:27:23.580Z"
    },
    {
      "name": "Step 5: Android Pixel 5 /inventory",
      "status": "pass",
      "description": "Step 5: Android Pixel 5 /inventory",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-pixel-5-inventory.png"
      ],
      "explanation": "Verifies the /inventory page renders without horizontal overflow on Android Pixel 5 (432×864 px). Tests responsive layout on an Android Chrome user agent.",
      "startedAt": "2026-09-29T02:27:25.950Z",
      "finishedAt": "2026-09-29T02:27:25.950Z"
    },
    {
      "name": "Step 5: Android Galaxy S21 /billing?filter=all&dateFrom=2020-01-01&dateTo=2035-12-31",
      "status": "pass",
      "description": "Step 5: Android Galaxy S21 /billing?filter=all&dateFrom=2020-01-01&dateTo=2035-12-31",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-galaxy-s21-billing-filter-all-datefrom-2020-01-01-dateto-2035-12-31.png"
      ],
      "startedAt": "2026-09-29T02:27:31.447Z",
      "finishedAt": "2026-09-29T02:27:31.447Z"
    },
    {
      "name": "Step 5: Android Galaxy S21 /sales-accounts",
      "status": "pass",
      "description": "Step 5: Android Galaxy S21 /sales-accounts",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-galaxy-s21-sales-accounts.png"
      ],
      "explanation": "Verifies the /sales-accounts page renders without horizontal overflow on Android Galaxy S21 (360×800 px), the narrowest viewport in the full mobile matrix.",
      "startedAt": "2026-09-29T02:27:33.958Z",
      "finishedAt": "2026-09-29T02:27:33.958Z"
    },
    {
      "name": "Step 5: Android Galaxy S21 /orders/requests",
      "status": "pass",
      "description": "Step 5: Android Galaxy S21 /orders/requests",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-galaxy-s21-orders-requests.png"
      ],
      "explanation": "Verifies the /orders/requests page renders without horizontal overflow on Android Galaxy S21 (360×800 px), the narrowest viewport in the full mobile matrix.",
      "startedAt": "2026-09-29T02:27:36.306Z",
      "finishedAt": "2026-09-29T02:27:36.306Z"
    },
    {
      "name": "Step 5: Android Galaxy S21 /packages",
      "status": "pass",
      "description": "Step 5: Android Galaxy S21 /packages",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-galaxy-s21-packages.png"
      ],
      "explanation": "Verifies the /packages page renders without horizontal overflow on Android Galaxy S21 (360×800 px), the narrowest viewport in the full mobile matrix.",
      "startedAt": "2026-09-29T02:27:38.675Z",
      "finishedAt": "2026-09-29T02:27:38.675Z"
    },
    {
      "name": "Step 5: Android Galaxy S21 /inventory",
      "status": "pass",
      "description": "Step 5: Android Galaxy S21 /inventory",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-05-galaxy-s21-inventory.png"
      ],
      "explanation": "Verifies the /inventory page renders without horizontal overflow on Android Galaxy S21 (360×800 px), the narrowest viewport in the full mobile matrix.",
      "startedAt": "2026-09-29T02:27:41.061Z",
      "finishedAt": "2026-09-29T02:27:41.061Z"
    },
    {
      "name": "Step 6: Touch targets on /billing?filter=all&dateFrom=2020-01-01&dateTo=2035-12-31",
      "status": "pass",
      "description": "Step 6: Touch targets on /billing?filter=all&dateFrom=2020-01-01&dateTo=2035-12-31",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-06-touch-targets-billing-filter-all-datefrom-2020-01-01-dateto-2035-12-31.png"
      ],
      "startedAt": "2026-09-29T02:27:46.533Z",
      "finishedAt": "2026-09-29T02:27:46.533Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/videos/step-06-touch-targets.webm"
    },
    {
      "name": "Step 6: Touch targets on /sales-accounts",
      "status": "pass",
      "description": "Step 6: Touch targets on /sales-accounts",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-06-touch-targets-sales-accounts.png"
      ],
      "explanation": "Measures every visible interactive element inside <main> on /sales-accounts on the iPhone 12 viewport. Fails if any element falls below the 24 px WCAG 2.5.8 hard minimum on both axes.",
      "startedAt": "2026-09-29T02:27:49.103Z",
      "finishedAt": "2026-09-29T02:27:49.103Z"
    },
    {
      "name": "Step 6: Touch targets on /orders/requests",
      "status": "pass",
      "description": "Step 6: Touch targets on /orders/requests",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-06-touch-targets-orders-requests.png"
      ],
      "explanation": "Measures every visible interactive element inside <main> on /orders/requests on the iPhone 12 viewport. Fails if any element falls below the 24 px WCAG 2.5.8 hard minimum on both axes.",
      "startedAt": "2026-09-29T02:27:51.459Z",
      "finishedAt": "2026-09-29T02:27:51.459Z"
    },
    {
      "name": "Step 6: Touch targets on /packages",
      "status": "pass",
      "description": "Step 6: Touch targets on /packages",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-06-touch-targets-packages.png"
      ],
      "explanation": "Measures every visible interactive element inside <main> on /packages on the iPhone 12 viewport. Fails if any element falls below the 24 px WCAG 2.5.8 hard minimum on both axes.",
      "startedAt": "2026-09-29T02:27:53.831Z",
      "finishedAt": "2026-09-29T02:27:53.831Z"
    },
    {
      "name": "Step 6: Touch targets on /inventory",
      "status": "pass",
      "description": "Step 6: Touch targets on /inventory",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-06-touch-targets-inventory.png"
      ],
      "explanation": "Measures every visible interactive element inside <main> on /inventory on the iPhone 12 viewport. Fails if any element falls below the 24 px WCAG 2.5.8 hard minimum on both axes.",
      "startedAt": "2026-09-29T02:27:56.229Z",
      "finishedAt": "2026-09-29T02:27:56.229Z"
    },
    {
      "name": "Step 7: Pixel 5 billing",
      "status": "pass",
      "description": "Step 7: Pixel 5 billing",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-07-pixel-5-billing.png"
      ],
      "explanation": "Smoke test on Android Pixel 5: navigates to /billing after login and confirms the first seeded order is visible without horizontal overflow. Console errors are captured and fail the step if any are found.",
      "startedAt": "2026-09-29T02:28:03.186Z",
      "finishedAt": "2026-09-29T02:28:03.186Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/videos/step-07-pixel-5-smoke.webm"
    },
    {
      "name": "Step 7: Pixel 5 accounts",
      "status": "pass",
      "description": "Step 7: Pixel 5 accounts",
      "screenshots": [
        "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z/screenshots/step-07-pixel-5-accounts.png"
      ],
      "explanation": "Smoke test on Android Pixel 5: navigates to /sales-accounts and confirms the ROSS account card is visible inside the mobile-only wrapper without horizontal overflow.",
      "startedAt": "2026-09-29T02:28:04.248Z",
      "finishedAt": "2026-09-29T02:28:04.248Z"
    }
  ],
  "dbValidations": [
    {
      "name": "Login user alex.admin@vantismedical.com exists",
      "query": "\n    SELECT id, email, name\n      FROM users\n     WHERE id = $1",
      "status": "pass",
      "rows": [
        {
          "id": "f6a7b8c9-d0e1-2345-f123-456789012345",
          "email": "alex.admin@vantismedical.com",
          "name": "Alex Admin"
        }
      ],
      "assertion": "Exactly one user with id=alexAdmin should be seeded"
    },
    {
      "name": "At least 4 seeded billing orders exist",
      "query": "\n    SELECT order_number, status\n      FROM billing_orders\n     WHERE order_number = ANY($1)\n     ORDER BY order_number",
      "status": "pass",
      "rows": [
        {
          "order_number": "VBO-2025-001",
          "status": "draft"
        },
        {
          "order_number": "VBO-2025-002",
          "status": "submitted"
        },
        {
          "order_number": "VBO-2025-003",
          "status": "invoice_sent"
        },
        {
          "order_number": "VBO-2025-004",
          "status": "invoice_voided"
        }
      ],
      "assertion": ">= 4 VBO-2025-* orders should be seeded by vantisDemo"
    },
    {
      "name": "At least 3 active Vantis sales accounts exist",
      "query": "\n    SELECT id, name, status\n      FROM sales_accounts\n     WHERE manufacturer_organization_id = $1 AND status = 'active'\n     ORDER BY name",
      "status": "pass",
      "rows": [
        {
          "id": "1fb8c9d0-e1f2-3456-1234-567890123456",
          "name": "Cedar Crest Hospital Account Request",
          "status": "active"
        },
        {
          "id": "2ac9d0e1-f2a3-4567-2345-678901234567",
          "name": "Lakeside Ortho Account Request",
          "status": "active"
        },
        {
          "id": "fea7b8c9-d0e1-2345-0123-456789012345",
          "name": "ROSS Surgical Account Request",
          "status": "active"
        }
      ],
      "assertion": ">= 3 active sales_accounts rows for Vantis"
    },
    {
      "name": "At least 8 Vantis products exist",
      "query": "\n    SELECT count(*)::int AS product_count\n      FROM org_products\n     WHERE organization_id = $1",
      "status": "pass",
      "rows": [
        {
          "product_count": 13
        }
      ],
      "assertion": ">= 8 products rows for Vantis"
    }
  ],
  "overallStatus": "pass",
  "outputDir": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-09-29T02-24-58-679Z",
  "auditStartTime": "2026-09-29T02:24:57.566Z",
  "auditEventEvidence": [
    {
      "createdAt": "2026-09-29T02:24:57.881Z",
      "eventType": "decision",
      "action": "ensure_lot_expiration_cycle_counter_assignment",
      "userEmail": null,
      "userId": null,
      "organizationName": "Corveta Surgical Group",
      "organizationId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "objectId": "b7f8a9b0-c1d2-3456-1234-567890123456",
      "secondaryObjectId": null,
      "payload": {
        "reason": "no_latest_cycle_counter",
        "performed": false,
        "entityType": "real_world_location"
      },
      "route": null,
      "traceId": null
    },
    {
      "createdAt": "2026-09-29T02:24:58.015Z",
      "eventType": "checklist",
      "action": "checklists.create",
      "userEmail": null,
      "userId": null,
      "organizationName": "Corveta Surgical Group",
      "organizationId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "objectId": "01a0eafa-c4b9-7899-a54b-7a1fdc7a9873",
      "secondaryObjectId": null,
      "payload": {
        "title": "Lot expiration review (1 location needs attention)",
        "source": {
          "type": "lot_expiration",
          "organizationId": "b2c3d4e5-f6a7-8901-bcde-f12345678901"
        }
      },
      "route": null,
      "traceId": null
    },
    {
      "createdAt": "2026-09-29T02:24:59.818Z",
      "eventType": "decision",
      "action": "upgrade_lot_expiration_checklist_priority",
      "userEmail": null,
      "userId": null,
      "organizationName": "Corveta Surgical Group",
      "organizationId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "objectId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "secondaryObjectId": null,
      "payload": {
        "reason": "no_open_checklists_below_high",
        "performed": false,
        "entityType": "organization"
      },
      "route": null,
      "traceId": null
    },
    {
      "createdAt": "2026-09-29T02:25:00.289Z",
      "eventType": "decision",
      "action": "ensure_lot_expiration_checklist",
      "userEmail": null,
      "userId": null,
      "organizationName": "Corveta Surgical Group",
      "organizationId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "objectId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "secondaryObjectId": null,
      "payload": {
        "reason": "created_1_reopened_0_already_open_1_refreshed_1",
        "performed": true,
        "entityType": "organization"
      },
      "route": null,
      "traceId": null
    },
    {
      "createdAt": "2026-09-29T02:25:25.415Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@vantismedical.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "Vantis",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@vantismedical.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    },
    {
      "createdAt": "2026-09-29T02:25:30.623Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@vantismedical.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "Vantis",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@vantismedical.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    },
    {
      "createdAt": "2026-09-29T02:25:43.237Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@vantismedical.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "Vantis",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@vantismedical.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    },
    {
      "createdAt": "2026-09-29T02:25:52.904Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@vantismedical.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "Vantis",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@vantismedical.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    },
    {
      "createdAt": "2026-09-29T02:26:42.364Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@vantismedical.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "Vantis",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@vantismedical.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    },
    {
      "createdAt": "2026-09-29T02:26:58.642Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@vantismedical.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "Vantis",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@vantismedical.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    },
    {
      "createdAt": "2026-09-29T02:27:13.644Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@vantismedical.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "Vantis",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@vantismedical.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    },
    {
      "createdAt": "2026-09-29T02:27:28.820Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@vantismedical.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "Vantis",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@vantismedical.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    },
    {
      "createdAt": "2026-09-29T02:27:43.874Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@vantismedical.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "Vantis",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@vantismedical.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    },
    {
      "createdAt": "2026-09-29T02:28:01.872Z",
      "eventType": "user_log",
      "action": "user:login",
      "userEmail": "alex.admin@vantismedical.com",
      "userId": "f6a7b8c9-d0e1-2345-f123-456789012345",
      "organizationName": "Vantis",
      "organizationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "objectId": null,
      "secondaryObjectId": null,
      "payload": {
        "email": "alex.admin@vantismedical.com"
      },
      "route": "/login",
      "traceId": "00000000000000000000000000000000"
    }
  ],
  "auditQuery": "SELECT\n    ae.created_at,\n    ae.event_type,\n    ae.action,\n    ae.user_id,\n    u.email AS user_email,\n    ae.organization_id,\n    o.name AS organization_name,\n    ae.object_id,\n    ae.secondary_object_id,\n    ae.payload,\n    ae.route,\n    ae.trace_id\n  FROM audit_events ae\n  LEFT JOIN users u ON u.id = ae.user_id\n  LEFT JOIN organizations o ON o.id = ae.organization_id\n  WHERE ae.created_at >= $1\n    AND ae.organization_id = ANY($2::uuid[])\n  ORDER BY ae.created_at ASC",
  "auditAssertions": [],
  "emailAssertions": []
}