{
  "config": {
    "configFile": "/var/www/360lm/playwright.config.js",
    "rootDir": "/var/www/360lm/tests",
    "forbidOnly": false,
    "fullyParallel": false,
    "globalSetup": null,
    "globalTeardown": null,
    "globalTimeout": 0,
    "grep": {},
    "grepInvert": null,
    "maxFailures": 0,
    "metadata": {
      "actualWorkers": 1
    },
    "preserveOutput": "always",
    "projects": [
      {
        "outputDir": "/var/www/360lm/test-results",
        "repeatEach": 1,
        "retries": 1,
        "metadata": {
          "actualWorkers": 1
        },
        "id": "android-chrome",
        "name": "android-chrome",
        "testDir": "/var/www/360lm/tests",
        "testIgnore": [],
        "testMatch": [
          "**/*.@(spec|test).?(c|m)[jt]s?(x)"
        ],
        "timeout": 30000
      },
      {
        "outputDir": "/var/www/360lm/test-results",
        "repeatEach": 1,
        "retries": 1,
        "metadata": {
          "actualWorkers": 1
        },
        "id": "desktop-chrome",
        "name": "desktop-chrome",
        "testDir": "/var/www/360lm/tests",
        "testIgnore": [],
        "testMatch": [
          "**/*.@(spec|test).?(c|m)[jt]s?(x)"
        ],
        "timeout": 30000
      }
    ],
    "quiet": false,
    "reporter": [
      [
        "json"
      ]
    ],
    "reportSlowTests": {
      "max": 5,
      "threshold": 300000
    },
    "shard": null,
    "tags": [],
    "updateSnapshots": "missing",
    "updateSourceMethod": "patch",
    "version": "1.60.0",
    "workers": 1,
    "webServer": null
  },
  "suites": [
    {
      "title": "vehicle.spec.js",
      "file": "vehicle.spec.js",
      "column": 0,
      "line": 0,
      "specs": [],
      "suites": [
        {
          "title": "Vehicle Log — Smoke",
          "file": "vehicle.spec.js",
          "line": 9,
          "column": 6,
          "specs": [
            {
              "title": "page or hub loads",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 2967,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:05.516Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-c69be7604bfc5bd3eecf",
              "file": "vehicle.spec.js",
              "line": 10,
              "column": 3
            },
            {
              "title": "manifest.json returns 200",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 302,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:09.772Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-0af762c479f72f5c2368",
              "file": "vehicle.spec.js",
              "line": 17,
              "column": 3
            },
            {
              "title": "sw.js contains vehicle-v25",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 577,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"vehicle-v25\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'vehicle-v27';\u001b[39m\n\u001b[31mconst ASSETS = ['/vehicle/', '/vehicle/index.html', '/vehicle/manifest.json'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS)));\u001b[39m\n\u001b[31m  self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.keys().then(keys =>\u001b[39m\n\u001b[31m    Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))\u001b[39m\n\u001b[31m  ));\u001b[39m\n\u001b[31m  self.clients.claim();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db') || url.pathname.startsWith('/rpc')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"vehicle-v25\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'vehicle-v27';\u001b[39m\n\u001b[31mconst ASSETS = ['/vehicle/', '/vehicle/index.html', '/vehicle/manifest.json'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS)));\u001b[39m\n\u001b[31m  self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.keys().then(keys =>\u001b[39m\n\u001b[31m    Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))\u001b[39m\n\u001b[31m  ));\u001b[39m\n\u001b[31m  self.clients.claim();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db') || url.pathname.startsWith('/rpc')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vehicle.spec.js:25:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vehicle.spec.js",
                          "column": 18,
                          "line": 25
                        },
                        "snippet": "  23 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  24 |     const text = await resp?.text() || '';\n> 25 |     expect(text).toContain('vehicle-v25');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vehicle.spec.js",
                            "column": 18,
                            "line": 25
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"vehicle-v25\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'vehicle-v27';\u001b[39m\n\u001b[31mconst ASSETS = ['/vehicle/', '/vehicle/index.html', '/vehicle/manifest.json'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS)));\u001b[39m\n\u001b[31m  self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.keys().then(keys =>\u001b[39m\n\u001b[31m    Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))\u001b[39m\n\u001b[31m  ));\u001b[39m\n\u001b[31m  self.clients.claim();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db') || url.pathname.startsWith('/rpc')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  23 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  24 |     const text = await resp?.text() || '';\n> 25 |     expect(text).toContain('vehicle-v25');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |\n    at /var/www/360lm/tests/vehicle.spec.js:25:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:10.105Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/vehicle-Vehicle-Log-—-Smoke-sw-js-contains-vehicle-v25-android-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vehicle-Vehicle-Log-—-Smoke-sw-js-contains-vehicle-v25-android-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vehicle.spec.js",
                        "column": 18,
                        "line": 25
                      }
                    },
                    {
                      "workerIndex": 1,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 449,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"vehicle-v25\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'vehicle-v27';\u001b[39m\n\u001b[31mconst ASSETS = ['/vehicle/', '/vehicle/index.html', '/vehicle/manifest.json'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS)));\u001b[39m\n\u001b[31m  self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.keys().then(keys =>\u001b[39m\n\u001b[31m    Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))\u001b[39m\n\u001b[31m  ));\u001b[39m\n\u001b[31m  self.clients.claim();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db') || url.pathname.startsWith('/rpc')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"vehicle-v25\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'vehicle-v27';\u001b[39m\n\u001b[31mconst ASSETS = ['/vehicle/', '/vehicle/index.html', '/vehicle/manifest.json'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS)));\u001b[39m\n\u001b[31m  self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.keys().then(keys =>\u001b[39m\n\u001b[31m    Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))\u001b[39m\n\u001b[31m  ));\u001b[39m\n\u001b[31m  self.clients.claim();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db') || url.pathname.startsWith('/rpc')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vehicle.spec.js:25:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vehicle.spec.js",
                          "column": 18,
                          "line": 25
                        },
                        "snippet": "  23 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  24 |     const text = await resp?.text() || '';\n> 25 |     expect(text).toContain('vehicle-v25');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vehicle.spec.js",
                            "column": 18,
                            "line": 25
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"vehicle-v25\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'vehicle-v27';\u001b[39m\n\u001b[31mconst ASSETS = ['/vehicle/', '/vehicle/index.html', '/vehicle/manifest.json'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS)));\u001b[39m\n\u001b[31m  self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.keys().then(keys =>\u001b[39m\n\u001b[31m    Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))\u001b[39m\n\u001b[31m  ));\u001b[39m\n\u001b[31m  self.clients.claim();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db') || url.pathname.startsWith('/rpc')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  23 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  24 |     const text = await resp?.text() || '';\n> 25 |     expect(text).toContain('vehicle-v25');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |\n    at /var/www/360lm/tests/vehicle.spec.js:25:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-06-15T07:49:12.648Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/vehicle-Vehicle-Log-—-Smoke-sw-js-contains-vehicle-v25-android-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vehicle-Vehicle-Log-—-Smoke-sw-js-contains-vehicle-v25-android-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vehicle.spec.js",
                        "column": 18,
                        "line": 25
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "084e7535606ab6e45f08-c66dd1d38569804590db",
              "file": "vehicle.spec.js",
              "line": 22,
              "column": 3
            },
            {
              "title": "page or hub loads",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 3,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 1623,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:17.094Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-f19cecc0003599b5d468",
              "file": "vehicle.spec.js",
              "line": 10,
              "column": 3
            },
            {
              "title": "manifest.json returns 200",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 3,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 464,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:19.025Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-6d3329d2335f2eb6f7a3",
              "file": "vehicle.spec.js",
              "line": 17,
              "column": 3
            },
            {
              "title": "sw.js contains vehicle-v25",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 3,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 417,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"vehicle-v25\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'vehicle-v27';\u001b[39m\n\u001b[31mconst ASSETS = ['/vehicle/', '/vehicle/index.html', '/vehicle/manifest.json'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS)));\u001b[39m\n\u001b[31m  self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.keys().then(keys =>\u001b[39m\n\u001b[31m    Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))\u001b[39m\n\u001b[31m  ));\u001b[39m\n\u001b[31m  self.clients.claim();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db') || url.pathname.startsWith('/rpc')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"vehicle-v25\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'vehicle-v27';\u001b[39m\n\u001b[31mconst ASSETS = ['/vehicle/', '/vehicle/index.html', '/vehicle/manifest.json'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS)));\u001b[39m\n\u001b[31m  self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.keys().then(keys =>\u001b[39m\n\u001b[31m    Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))\u001b[39m\n\u001b[31m  ));\u001b[39m\n\u001b[31m  self.clients.claim();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db') || url.pathname.startsWith('/rpc')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vehicle.spec.js:25:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vehicle.spec.js",
                          "column": 18,
                          "line": 25
                        },
                        "snippet": "  23 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  24 |     const text = await resp?.text() || '';\n> 25 |     expect(text).toContain('vehicle-v25');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vehicle.spec.js",
                            "column": 18,
                            "line": 25
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"vehicle-v25\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'vehicle-v27';\u001b[39m\n\u001b[31mconst ASSETS = ['/vehicle/', '/vehicle/index.html', '/vehicle/manifest.json'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS)));\u001b[39m\n\u001b[31m  self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.keys().then(keys =>\u001b[39m\n\u001b[31m    Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))\u001b[39m\n\u001b[31m  ));\u001b[39m\n\u001b[31m  self.clients.claim();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db') || url.pathname.startsWith('/rpc')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  23 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  24 |     const text = await resp?.text() || '';\n> 25 |     expect(text).toContain('vehicle-v25');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |\n    at /var/www/360lm/tests/vehicle.spec.js:25:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:19.552Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/vehicle-Vehicle-Log-—-Smoke-sw-js-contains-vehicle-v25-desktop-chrome/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vehicle-Vehicle-Log-—-Smoke-sw-js-contains-vehicle-v25-desktop-chrome/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vehicle.spec.js",
                        "column": 18,
                        "line": 25
                      }
                    },
                    {
                      "workerIndex": 4,
                      "parallelIndex": 0,
                      "status": "failed",
                      "duration": 496,
                      "error": {
                        "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"vehicle-v25\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'vehicle-v27';\u001b[39m\n\u001b[31mconst ASSETS = ['/vehicle/', '/vehicle/index.html', '/vehicle/manifest.json'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS)));\u001b[39m\n\u001b[31m  self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.keys().then(keys =>\u001b[39m\n\u001b[31m    Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))\u001b[39m\n\u001b[31m  ));\u001b[39m\n\u001b[31m  self.clients.claim();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db') || url.pathname.startsWith('/rpc')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m",
                        "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"vehicle-v25\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'vehicle-v27';\u001b[39m\n\u001b[31mconst ASSETS = ['/vehicle/', '/vehicle/index.html', '/vehicle/manifest.json'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS)));\u001b[39m\n\u001b[31m  self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.keys().then(keys =>\u001b[39m\n\u001b[31m    Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))\u001b[39m\n\u001b[31m  ));\u001b[39m\n\u001b[31m  self.clients.claim();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db') || url.pathname.startsWith('/rpc')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n    at /var/www/360lm/tests/vehicle.spec.js:25:18",
                        "location": {
                          "file": "/var/www/360lm/tests/vehicle.spec.js",
                          "column": 18,
                          "line": 25
                        },
                        "snippet": "  23 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  24 |     const text = await resp?.text() || '';\n> 25 |     expect(text).toContain('vehicle-v25');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |"
                      },
                      "errors": [
                        {
                          "location": {
                            "file": "/var/www/360lm/tests/vehicle.spec.js",
                            "column": 18,
                            "line": 25
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoContain\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // indexOf\u001b[22m\n\nExpected substring: \u001b[32m\"vehicle-v25\"\u001b[39m\nReceived string:    \u001b[31m\"const CACHE = 'vehicle-v27';\u001b[39m\n\u001b[31mconst ASSETS = ['/vehicle/', '/vehicle/index.html', '/vehicle/manifest.json'];·\u001b[39m\n\u001b[31mself.addEventListener('install', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS)));\u001b[39m\n\u001b[31m  self.skipWaiting();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('activate', e => {\u001b[39m\n\u001b[31m  e.waitUntil(caches.keys().then(keys =>\u001b[39m\n\u001b[31m    Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))\u001b[39m\n\u001b[31m  ));\u001b[39m\n\u001b[31m  self.clients.claim();\u001b[39m\n\u001b[31m});·\u001b[39m\n\u001b[31mself.addEventListener('fetch', e => {\u001b[39m\n\u001b[31m  const url = new URL(e.request.url);\u001b[39m\n\u001b[31m  if (url.pathname.startsWith('/db') || url.pathname.startsWith('/rpc')) return;\u001b[39m\n\u001b[31m  e.respondWith(\u001b[39m\n\u001b[31m    caches.match(e.request).then(cached => cached || fetch(e.request))\u001b[39m\n\u001b[31m  );\u001b[39m\n\u001b[31m});\u001b[39m\n\u001b[31m\"\u001b[39m\n\n  23 |     const resp = await page.goto(BASE_URL + 'sw.js');\n  24 |     const text = await resp?.text() || '';\n> 25 |     expect(text).toContain('vehicle-v25');\n     |                  ^\n  26 |   });\n  27 | });\n  28 |\n    at /var/www/360lm/tests/vehicle.spec.js:25:18"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-06-15T07:49:21.374Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/var/www/360lm/test-results/vehicle-Vehicle-Log-—-Smoke-sw-js-contains-vehicle-v25-desktop-chrome-retry1/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/var/www/360lm/test-results/vehicle-Vehicle-Log-—-Smoke-sw-js-contains-vehicle-v25-desktop-chrome-retry1/error-context.md"
                        }
                      ],
                      "errorLocation": {
                        "file": "/var/www/360lm/tests/vehicle.spec.js",
                        "column": 18,
                        "line": 25
                      }
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "084e7535606ab6e45f08-4854e54166236de68495",
              "file": "vehicle.spec.js",
              "line": 22,
              "column": 3
            }
          ]
        },
        {
          "title": "Vehicle Log — HTML Structure (v18)",
          "file": "vehicle.spec.js",
          "line": 29,
          "column": 6,
          "specs": [
            {
              "title": "edit+delegate modals and edit-log screen present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 224,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:14.961Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-61ff6582f0f0b6314fd2",
              "file": "vehicle.spec.js",
              "line": 30,
              "column": 3
            },
            {
              "title": "canBypassPhoto and canEditEntry functions present in JS",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 54,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:15.324Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-e3848d43d66a83c9c8de",
              "file": "vehicle.spec.js",
              "line": 50,
              "column": 3
            },
            {
              "title": "photo bypass guards present (4 locations)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 25,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:15.438Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-9b6dda5ff14592fbe0ed",
              "file": "vehicle.spec.js",
              "line": 64,
              "column": 3
            },
            {
              "title": "edit+delegate modals and edit-log screen present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 173,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:23.714Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-eecfce8c5bbdcfc30b12",
              "file": "vehicle.spec.js",
              "line": 30,
              "column": 3
            },
            {
              "title": "canBypassPhoto and canEditEntry functions present in JS",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 97,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:23.972Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-1da678b2208dbba484d5",
              "file": "vehicle.spec.js",
              "line": 50,
              "column": 3
            },
            {
              "title": "photo bypass guards present (4 locations)",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 50,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:24.101Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-d807e8ea32c68934afb9",
              "file": "vehicle.spec.js",
              "line": 64,
              "column": 3
            }
          ]
        },
        {
          "title": "Vehicle Log — HTML Structure (v22)",
          "file": "vehicle.spec.js",
          "line": 76,
          "column": 6,
          "specs": [
            {
              "title": "mileage segment functions and retro-switch present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 59,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:15.507Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-e81fe7704c34b9bba4d8",
              "file": "vehicle.spec.js",
              "line": 77,
              "column": 3
            },
            {
              "title": "mileage segment functions and retro-switch present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 39,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:24.220Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-4ad5358a0f338a97379f",
              "file": "vehicle.spec.js",
              "line": 77,
              "column": 3
            }
          ]
        },
        {
          "title": "Vehicle Log — HTML Structure (v25)",
          "file": "vehicle.spec.js",
          "line": 93,
          "column": 6,
          "specs": [
            {
              "title": "fuel bill photo and CC slip photo elements present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 53,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:15.593Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-4ccd65b60ead57af1fd6",
              "file": "vehicle.spec.js",
              "line": 94,
              "column": 3
            },
            {
              "title": "fuel bill and CC slip handler functions present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "android-chrome",
                  "projectName": "android-chrome",
                  "results": [
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 34,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:15.672Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-6be3e9e521885024edcc",
              "file": "vehicle.spec.js",
              "line": 108,
              "column": 3
            },
            {
              "title": "fuel bill photo and CC slip photo elements present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 51,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:24.343Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-ce93d65c65ac5105f143",
              "file": "vehicle.spec.js",
              "line": 94,
              "column": 3
            },
            {
              "title": "fuel bill and CC slip handler functions present",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "desktop-chrome",
                  "projectName": "desktop-chrome",
                  "results": [
                    {
                      "workerIndex": 5,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 32,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-06-15T07:49:24.435Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "084e7535606ab6e45f08-c8df628ad737ecf34fd7",
              "file": "vehicle.spec.js",
              "line": 108,
              "column": 3
            }
          ]
        }
      ]
    }
  ],
  "errors": [],
  "stats": {
    "startTime": "2026-06-15T07:49:03.768Z",
    "duration": 20788.986999999997,
    "expected": 16,
    "skipped": 0,
    "unexpected": 2,
    "flaky": 0
  }
}
