{
  "ursId": "URS-036",
  "title": "Mobile device support",
  "timestamp": "2026-08-03T23:03:36.090Z",
  "durationMs": 156242,
  "config": {
    "inboxUrl": "http://localhost:38375",
    "dbHost": "localhost",
    "dbPort": 43939,
    "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-08-03T23-03-36-089Z/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-08-03T23:03:41.284Z",
      "finishedAt": "2026-08-03T23:03:41.284Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-08-03T23-03-36-089Z/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-08-03T23-03-36-089Z/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-08-03T23:03:42.875Z",
      "finishedAt": "2026-08-03T23:03:42.875Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:03:45.101Z",
      "finishedAt": "2026-08-03T23:03:45.101Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:03:50.760Z",
      "finishedAt": "2026-08-03T23:03:50.760Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-08-03T23-03-36-089Z/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-08-03T23-03-36-089Z/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-08-03T23:03:53.691Z",
      "finishedAt": "2026-08-03T23:03:53.691Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:03:59.651Z",
      "finishedAt": "2026-08-03T23:03:59.651Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-08-03T23-03-36-089Z/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-08-03T23-03-36-089Z/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-08-03T23:04:00.516Z",
      "finishedAt": "2026-08-03T23:04:00.516Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:04:06.843Z",
      "finishedAt": "2026-08-03T23:04:06.843Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-08-03T23-03-36-089Z/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-08-03T23-03-36-089Z/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-08-03T23:04:09.040Z",
      "finishedAt": "2026-08-03T23:04:09.040Z"
    },
    {
      "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-08-03T23-03-36-089Z/screenshots/step-05-iphone-12-billing-filter-all-datefrom-2020-01-01-dateto-2035-12-31.png"
      ],
      "startedAt": "2026-08-03T23:04:46.118Z",
      "finishedAt": "2026-08-03T23:04:46.118Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-08-03T23-03-36-089Z/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-08-03T23-03-36-089Z/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-08-03T23:04:48.714Z",
      "finishedAt": "2026-08-03T23:04:48.714Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-08-03T23-03-36-089Z/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-08-03T23-03-36-089Z/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-08-03T23:04:51.721Z",
      "finishedAt": "2026-08-03T23:04:51.721Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-08-03T23-03-36-089Z/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-08-03T23-03-36-089Z/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-08-03T23:04:54.792Z",
      "finishedAt": "2026-08-03T23:04:54.792Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-08-03T23-03-36-089Z/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-08-03T23-03-36-089Z/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-08-03T23:04:57.467Z",
      "finishedAt": "2026-08-03T23:04:57.467Z"
    },
    {
      "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-08-03T23-03-36-089Z/screenshots/step-05-iphone-se-billing-filter-all-datefrom-2020-01-01-dateto-2035-12-31.png"
      ],
      "startedAt": "2026-08-03T23:05:03.086Z",
      "finishedAt": "2026-08-03T23:05:03.086Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:05:05.706Z",
      "finishedAt": "2026-08-03T23:05:05.706Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:05:08.133Z",
      "finishedAt": "2026-08-03T23:05:08.133Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:05:10.627Z",
      "finishedAt": "2026-08-03T23:05:10.627Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:05:13.180Z",
      "finishedAt": "2026-08-03T23:05:13.180Z"
    },
    {
      "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-08-03T23-03-36-089Z/screenshots/step-05-pixel-5-billing-filter-all-datefrom-2020-01-01-dateto-2035-12-31.png"
      ],
      "startedAt": "2026-08-03T23:05:19.102Z",
      "finishedAt": "2026-08-03T23:05:19.102Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:05:21.842Z",
      "finishedAt": "2026-08-03T23:05:21.842Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:05:24.708Z",
      "finishedAt": "2026-08-03T23:05:24.708Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:05:27.208Z",
      "finishedAt": "2026-08-03T23:05:27.208Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:05:29.730Z",
      "finishedAt": "2026-08-03T23:05:29.730Z"
    },
    {
      "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-08-03T23-03-36-089Z/screenshots/step-05-galaxy-s21-billing-filter-all-datefrom-2020-01-01-dateto-2035-12-31.png"
      ],
      "startedAt": "2026-08-03T23:05:36.074Z",
      "finishedAt": "2026-08-03T23:05:36.074Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:05:38.619Z",
      "finishedAt": "2026-08-03T23:05:38.619Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:05:41.485Z",
      "finishedAt": "2026-08-03T23:05:41.485Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:05:44.005Z",
      "finishedAt": "2026-08-03T23:05:44.005Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:05:46.486Z",
      "finishedAt": "2026-08-03T23:05:46.486Z"
    },
    {
      "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-08-03T23-03-36-089Z/screenshots/step-06-touch-targets-billing-filter-all-datefrom-2020-01-01-dateto-2035-12-31.png"
      ],
      "startedAt": "2026-08-03T23:05:52.196Z",
      "finishedAt": "2026-08-03T23:05:52.196Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-08-03T23-03-36-089Z/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-08-03T23-03-36-089Z/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-08-03T23:05:54.893Z",
      "finishedAt": "2026-08-03T23:05:54.893Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:05:57.376Z",
      "finishedAt": "2026-08-03T23:05:57.376Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:05:59.863Z",
      "finishedAt": "2026-08-03T23:05:59.863Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:06:02.323Z",
      "finishedAt": "2026-08-03T23:06:02.323Z"
    },
    {
      "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-08-03T23-03-36-089Z/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-08-03T23:06:09.481Z",
      "finishedAt": "2026-08-03T23:06:09.481Z",
      "videoPath": "/home/runner/_work/code/code/validation_test_results/urs-036-mobile-device-support/2026-08-03T23-03-36-089Z/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-08-03T23-03-36-089Z/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-08-03T23:06:10.828Z",
      "finishedAt": "2026-08-03T23:06:10.828Z"
    }
  ],
  "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-08-03T23-03-36-089Z",
  "auditStartTime": "2026-08-03T23:03:34.202Z",
  "auditEventEvidence": [
    {
      "createdAt": "2026-08-03T23:03:35.083Z",
      "eventType": "checklist",
      "action": "checklists.create",
      "userEmail": null,
      "userId": null,
      "organizationName": "Corveta Surgical Group",
      "organizationId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "objectId": "019fc9de-45ac-7ec4-8146-bc79e0adb446",
      "secondaryObjectId": null,
      "payload": {
        "title": "Lot expiration review (1 location need attention)",
        "source": {
          "type": "lot_expiration",
          "organizationId": "b2c3d4e5-f6a7-8901-bcde-f12345678901"
        }
      },
      "route": null,
      "traceId": null
    },
    {
      "createdAt": "2026-08-03T23:03:35.129Z",
      "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",
        "performed": true,
        "entityType": "organization"
      },
      "route": null,
      "traceId": null
    },
    {
      "createdAt": "2026-08-03T23:03:44.859Z",
      "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-08-03T23:03:46.834Z",
      "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-08-03T23:03:56.721Z",
      "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-08-03T23:04:03.579Z",
      "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-08-03T23:04:43.157Z",
      "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-08-03T23:05:00.387Z",
      "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-08-03T23:05:16.355Z",
      "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-08-03T23:05:33.078Z",
      "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-08-03T23:05:49.441Z",
      "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-08-03T23:06:08.066Z",
      "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": []
}